<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>81389</bug_id>
          
          <creation_ts>2012-03-16 12:23:25 -0700</creation_ts>
          <short_desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</short_desc>
          <delta_ts>2012-07-16 17:58:06 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Text</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>Windows 7</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>81326</dependson>
          <blocked>48459</blocked>
    
    <blocked>51450</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Koji Ishii">kojii</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>agl</cc>
    
    <cc>bashi</cc>
    
    <cc>hyatt</cc>
    
    <cc>mitz</cc>
    
    <cc>tony</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>580791</commentid>
    <comment_count>0</comment_count>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-16 12:23:25 -0700</bug_when>
    <thetext>Since bug 81326 is still too big, I&apos;m splitting code to handle vertical alternate glyph (GSUB) into this bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>580820</commentid>
    <comment_count>1</comment_count>
      <attachid>132354</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-16 12:47:56 -0700</bug_when>
    <thetext>Created attachment 132354
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

A patch split from bug 81326</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>581287</commentid>
    <comment_count>2</comment_count>
      <attachid>132453</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-17 00:51:01 -0700</bug_when>
    <thetext>Created attachment 132453
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Rebased new patch at 81326, the same name cleanup as 81326, and added ChangeLog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>581492</commentid>
    <comment_count>3</comment_count>
      <attachid>132502</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-18 14:44:49 -0700</bug_when>
    <thetext>Created attachment 132502
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Rebased to the new patch in bug 81326, and also updated to reflect review comments in the bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>590445</commentid>
    <comment_count>4</comment_count>
      <attachid>134404</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-28 14:35:53 -0700</bug_when>
    <thetext>Created attachment 134404
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Changes include:
* Rebased to the new patch for bug 81326.
* Removed OT prefixes to align with changes in bug 81326.
* Fixed one potential out-of-bounds reads.
* A little refactored to make the patch shorter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>591852</commentid>
    <comment_count>5</comment_count>
      <attachid>134718</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-29 20:53:57 -0700</bug_when>
    <thetext>Created attachment 134718
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Added ChangeLog. Also updated code a bit to remove begin/end pattern to array index to match better to coding style guidelines.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>591871</commentid>
    <comment_count>6</comment_count>
      <attachid>134722</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-29 22:02:09 -0700</bug_when>
    <thetext>Created attachment 134722
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Updated ChangeLog and a couple of oob reads fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>592902</commentid>
    <comment_count>7</comment_count>
      <attachid>134970</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-03-31 12:12:41 -0700</bug_when>
    <thetext>Created attachment 134970
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Since no one has looked into this yet, I&apos;m moving one line to avoid conflict with other patches working in parallel. No real code changes. I&apos;ll r? again after EWS is done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>603565</commentid>
    <comment_count>8</comment_count>
      <attachid>134970</attachid>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2012-04-16 16:44:43 -0700</bug_when>
    <thetext>Comment on attachment 134970
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

View in context: https://bugs.webkit.org/attachment.cgi?id=134970&amp;action=review

Drive-by comments. (I&apos;m not a reviewer)

&gt; Source/WebCore/ChangeLog:11
&gt; +        Reviewed by NOBODY (OOPS!).

nit: We usually put &quot;Reviewed by&quot; line before the description.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:65
&gt; +    template &lt;typename T&gt; static const T* validatedPtr(const void* p, const SharedBuffer&amp; buffer)

A template function named validatedPtr is already defined in the same file. Using the same name might confuse (The order of the arguments are also inconsistent between them).

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:68
&gt; +        if (!isValidEnd(&amp;casted[1], buffer))

Just checking whether the |p| is in the range of |buffer.data()| to |buffer.data() + buffer.size()| looks optimistic to me. How do you guarantee the casted pointer is valid? Since an attacker can send malformed font as webfont, we should be careful here. (Chromium uses font sanitizing library for webfonts, but not all port use such library).

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:181
&gt; +        uint16_t countSubTable = subTableCount;

Why do we need this substitution?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:186
&gt; +            for (int i = 0; i &lt; countSubTable; ++i) {

int -&gt; uint16_t?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:187
&gt; +                const SubstitutionSubTable* sub = validatedPtr&lt;SubstitutionSubTable&gt;(subTableOffsets[i], buffer);

Please don&apos;t use abbreviation variable names (The same applies hereafter).

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:190
&gt; +                const CoverageTable* coverage = sub-&gt;coverage(buffer);

This line looks essentially the same semantics of other cast such as L187 and L195. Why only this cast is defined as a function?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:234
&gt; +                    LOG_ERROR(&quot;SubstFormat %d not supported&quot;, sub-&gt;substFormat);

Is LOG_ERROR() appropriate here? Is it unlikely that most fonts have other formats(e.g. Single Substitution Format 1 and Multiple Substitution Format) here?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:240
&gt; +            LOG_ERROR(&quot;LookupType %d not supported&quot;, lookupType);

Is it unlikely that &quot;lookupType != 1&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>603794</commentid>
    <comment_count>9</comment_count>
      <attachid>134970</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-04-16 22:11:50 -0700</bug_when>
    <thetext>Comment on attachment 134970
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

View in context: https://bugs.webkit.org/attachment.cgi?id=134970&amp;action=review

I&apos;ll be uploading the revised patch once it passed the builds and tests. Thank you for the review and for your time!

&gt;&gt; Source/WebCore/ChangeLog:11
&gt;&gt; +        Reviewed by NOBODY (OOPS!).
&gt; 
&gt; nit: We usually put &quot;Reviewed by&quot; line before the description.

Ah, I missed that. Thank you, I&apos;ll fix it.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:65
&gt;&gt; +    template &lt;typename T&gt; static const T* validatedPtr(const void* p, const SharedBuffer&amp; buffer)
&gt; 
&gt; A template function named validatedPtr is already defined in the same file. Using the same name might confuse (The order of the arguments are also inconsistent between them).

Okay, I&apos;ll change them to: validateSize, validateOffset, and validatePtr, and will make the order consistent.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:68
&gt;&gt; +        if (!isValidEnd(&amp;casted[1], buffer))
&gt; 
&gt; Just checking whether the |p| is in the range of |buffer.data()| to |buffer.data() + buffer.size()| looks optimistic to me. How do you guarantee the casted pointer is valid? Since an attacker can send malformed font as webfont, we should be careful here. (Chromium uses font sanitizing library for webfonts, but not all port use such library).

I&apos;m trying to avoid out-of-bound reads here, so you&apos;re right that the data in the buffer is still broken, but at least we can avoid out-of-bound reads. Checking value validity is responsible for callers. Or are you saying that this check isn&apos;t enough to prevent out-of-bound reads?
What OpenTypeSanitizer does is, as far as I understand, to check directory structure, byte align, checksum etc. OTS needs to extract tables from WOFF stream, so that makes sense, but this library requests tables to platform, so analyzing and validating table directory structure is platform&apos;s responsibility. Does this sound reasonable?

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:181
&gt;&gt; +        uint16_t countSubTable = subTableCount;
&gt; 
&gt; Why do we need this substitution?

Because subTableCount is used multiple times, and although it looks a normal variable, it&apos;s actually a struct and converts big-Endian as we read the value. Storing to uint16_t saves converting Endians multiple times.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:186
&gt;&gt; +            for (int i = 0; i &lt; countSubTable; ++i) {
&gt; 
&gt; int -&gt; uint16_t?

Right, thank you for catching this.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:190
&gt;&gt; +                const CoverageTable* coverage = sub-&gt;coverage(buffer);
&gt; 
&gt; This line looks essentially the same semantics of other cast such as L187 and L195. Why only this cast is defined as a function?

I&apos;m trying to avoid reading offset-type values from other than this since offsets are the most dangerous value. L187/195 are reading fields of this while this line reads a field of sub. For that purpose, validating functions above are protected, not public, so I need a function to read offsets of non-this tables.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:234
&gt;&gt; +                    LOG_ERROR(&quot;SubstFormat %d not supported&quot;, sub-&gt;substFormat);
&gt; 
&gt; Is LOG_ERROR() appropriate here? Is it unlikely that most fonts have other formats(e.g. Single Substitution Format 1 and Multiple Substitution Format) here?

For the later question, as far as I know, yes. GSUB is general-purpose glyph substition talbe, and for purposes of &apos;vert&apos;, lookupType=1 and Single Substitution format is used. There&apos;s a chance where font designer chose Single Substitution Format 1, but I don&apos;t of know of any real examples.
For the former question, I&apos;m not sure. I&apos;d like to see WebKit logs something when it encountered such fonts without running debugger. It&apos;s not an error of font file but rather means &quot;we don&apos;t support this font.&quot; If LOG_ERROR isn&apos;t supposed to use for such purpose, I&apos;m ok to remove this line.

&gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:240
&gt;&gt; +            LOG_ERROR(&quot;LookupType %d not supported&quot;, lookupType);
&gt; 
&gt; Is it unlikely that &quot;lookupType != 1&quot;?

See above. Other lookupTypes are used for ligatures or for shapings. Theoretically font designers can use other lookup types, the OT spec does not prohibit it, but I don&apos;t see them in the real world.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>603927</commentid>
    <comment_count>10</comment_count>
      <attachid>137513</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-04-17 04:20:44 -0700</bug_when>
    <thetext>Created attachment 137513
Reflected changes from Kenichi&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>604407</commentid>
    <comment_count>11</comment_count>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2012-04-17 15:36:46 -0700</bug_when>
    <thetext>Thank you for revising the patch. There are still a lot of abbreviated variable names. Please not use such name. We dislike variable names such as &quot;s1&quot; or &quot;c1&quot;.

(In reply to comment #9)
&gt; &gt; Just checking whether the |p| is in the range of |buffer.data()| to |buffer.data() + buffer.size()| looks optimistic to me. How do you guarantee the casted pointer is valid? Since an attacker can send malformed font as webfont, we should be careful here. (Chromium uses font sanitizing library for webfonts, but not all port use such library).
&gt; 
&gt; I&apos;m trying to avoid out-of-bound reads here, so you&apos;re right that the data in the buffer is still broken, but at least we can avoid out-of-bound reads. Checking value validity is responsible for callers. Or are you saying that this check isn&apos;t enough to prevent out-of-bound reads?
&gt; What OpenTypeSanitizer does is, as far as I understand, to check directory structure, byte align, checksum etc. OTS needs to extract tables from WOFF stream, so that makes sense, but this library requests tables to platform, so analyzing and validating table directory structure is platform&apos;s responsibility. Does this sound reasonable?

That sounds all platform could have similar validation code. If we validate here, we can avoid such duplication. However, I&apos;m ok not validating here if you think checking OOB read is enough.

&gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:181
&gt; &gt;&gt; +        uint16_t countSubTable = subTableCount;
&gt; &gt; 
&gt; &gt; Why do we need this substitution?
&gt; 
&gt; Because subTableCount is used multiple times, and although it looks a normal variable, it&apos;s actually a struct and converts big-Endian as we read the value. Storing to uint16_t saves converting Endians multiple times.

You should add an comment then.

&gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:190
&gt; &gt;&gt; +                const CoverageTable* coverage = sub-&gt;coverage(buffer);
&gt; &gt; 
&gt; &gt; This line looks essentially the same semantics of other cast such as L187 and L195. Why only this cast is defined as a function?
&gt; 
&gt; I&apos;m trying to avoid reading offset-type values from other than this since offsets are the most dangerous value. L187/195 are reading fields of this while this line reads a field of sub. For that purpose, validating functions above are protected, not public, so I need a function to read offsets of non-this tables.
&gt; 

Then, don&apos;t we need functions for followings?

validatedPtr&lt;FeatureTable&gt;(features[index].featureOffset, buffer);
validatedPtr&lt;LangSysTable&gt;(langSysRecords[0].langSysOffset, buffer);
validatedPtr&lt;ScriptTable&gt;(scripts[i].scriptOffset, buffer);

&gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:234
&gt; &gt;&gt; +                    LOG_ERROR(&quot;SubstFormat %d not supported&quot;, sub-&gt;substFormat);
&gt; &gt; 
&gt; &gt; Is LOG_ERROR() appropriate here? Is it unlikely that most fonts have other formats(e.g. Single Substitution Format 1 and Multiple Substitution Format) here?
&gt; 
&gt; For the later question, as far as I know, yes. GSUB is general-purpose glyph substition talbe, and for purposes of &apos;vert&apos;, lookupType=1 and Single Substitution format is used. There&apos;s a chance where font designer chose Single Substitution Format 1, but I don&apos;t of know of any real examples.
&gt; For the former question, I&apos;m not sure. I&apos;d like to see WebKit logs something when it encountered such fonts without running debugger. It&apos;s not an error of font file but rather means &quot;we don&apos;t support this font.&quot; If LOG_ERROR isn&apos;t supposed to use for such purpose, I&apos;m ok to remove this line.

I see. Thank you for detailed explanation. LOG_ERROR() looks too strong to me, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>606056</commentid>
    <comment_count>12</comment_count>
      <attachid>134970</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-04-19 15:57:35 -0700</bug_when>
    <thetext>Comment on attachment 134970
Vertical alternate glyph (GSUB) support for OpenTypeVerticalData

Cleared review? from obsolete attachment 134970 so that this bug does not appear in http://webkit.org/pending-review.  If you would like this patch reviewed, please attach it to a new bug (or re-open this bug before marking it for review again).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>606134</commentid>
    <comment_count>13</comment_count>
      <attachid>137513</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-04-19 16:32:36 -0700</bug_when>
    <thetext>Comment on attachment 137513
Reflected changes from Kenichi&apos;s review

cancelled r? to work on Kenichi&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>606213</commentid>
    <comment_count>14</comment_count>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-04-19 17:14:57 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; Thank you for revising the patch. There are still a lot of abbreviated variable names. Please not use such name. We dislike variable names such as &quot;s1&quot; or &quot;c1&quot;.

Thank you, I&apos;m working on.

&gt; (In reply to comment #9)
&gt; &gt; &gt; Just checking whether the |p| is in the range of |buffer.data()| to |buffer.data() + buffer.size()| looks optimistic to me. How do you guarantee the casted pointer is valid? Since an attacker can send malformed font as webfont, we should be careful here. (Chromium uses font sanitizing library for webfonts, but not all port use such library).
&gt; &gt; 
&gt; &gt; I&apos;m trying to avoid out-of-bound reads here, so you&apos;re right that the data in the buffer is still broken, but at least we can avoid out-of-bound reads. Checking value validity is responsible for callers. Or are you saying that this check isn&apos;t enough to prevent out-of-bound reads?
&gt; &gt; What OpenTypeSanitizer does is, as far as I understand, to check directory structure, byte align, checksum etc. OTS needs to extract tables from WOFF stream, so that makes sense, but this library requests tables to platform, so analyzing and validating table directory structure is platform&apos;s responsibility. Does this sound reasonable?
&gt; 
&gt; That sounds all platform could have similar validation code. If we validate here, we can avoid such duplication. However, I&apos;m ok not validating here if you think checking OOB read is enough.

Yeah, I prefer doing it in a separate layer because some platforms (specifically Win32) provides table-level API for OpenType, so analyzing and checking directory structure is redundant. If there were more than one platform that doesn&apos;t support table-level API, it makes sense to have a common class that reads a raw OpenType file, check directory structure and check-sum, and extract tables as needed, but platforms should be able to choose whether to use the common class or not. Just like Mac doesn&apos;t need this class because it has even higher level APIs.

&gt; &gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:181
&gt; &gt; &gt;&gt; +        uint16_t countSubTable = subTableCount;
&gt; &gt; &gt; 
&gt; &gt; &gt; Why do we need this substitution?
&gt; &gt; 
&gt; &gt; Because subTableCount is used multiple times, and although it looks a normal variable, it&apos;s actually a struct and converts big-Endian as we read the value. Storing to uint16_t saves converting Endians multiple times.
&gt; 
&gt; You should add an comment then.

I started doing this, but then figured out that the comment appear all over the place because all fields in all OpenType tables are in big-endian and therefore conversion is implied. I guess we don&apos;t want the same comment appearing 20-30 times in a file, do we? Should I put one comment before &quot;TableBase&quot; struct?

&gt; &gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:190
&gt; &gt; &gt;&gt; +                const CoverageTable* coverage = sub-&gt;coverage(buffer);
&gt; &gt; &gt; 
&gt; &gt; &gt; This line looks essentially the same semantics of other cast such as L187 and L195. Why only this cast is defined as a function?
&gt; &gt; 
&gt; &gt; I&apos;m trying to avoid reading offset-type values from other than this since offsets are the most dangerous value. L187/195 are reading fields of this while this line reads a field of sub. For that purpose, validating functions above are protected, not public, so I need a function to read offsets of non-this tables.
&gt; &gt; 
&gt; 
&gt; Then, don&apos;t we need functions for followings?
&gt; 
&gt; validatedPtr&lt;FeatureTable&gt;(features[index].featureOffset, buffer);
&gt; validatedPtr&lt;LangSysTable&gt;(langSysRecords[0].langSysOffset, buffer);
&gt; validatedPtr&lt;ScriptTable&gt;(scripts[i].scriptOffset, buffer);

They&apos;re nested structs, so they don&apos;t ihnerit from TableBase where validateOffset is implemented, and I think they&apos;re local enough not to worry about. Does this sound reasonable?

&gt; &gt; &gt;&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:234
&gt; &gt; &gt;&gt; +                    LOG_ERROR(&quot;SubstFormat %d not supported&quot;, sub-&gt;substFormat);
&gt; &gt; &gt; 
&gt; &gt; &gt; Is LOG_ERROR() appropriate here? Is it unlikely that most fonts have other formats(e.g. Single Substitution Format 1 and Multiple Substitution Format) here?
&gt; &gt; 
&gt; &gt; For the later question, as far as I know, yes. GSUB is general-purpose glyph substition talbe, and for purposes of &apos;vert&apos;, lookupType=1 and Single Substitution format is used. There&apos;s a chance where font designer chose Single Substitution Format 1, but I don&apos;t of know of any real examples.
&gt; &gt; For the former question, I&apos;m not sure. I&apos;d like to see WebKit logs something when it encountered such fonts without running debugger. It&apos;s not an error of font file but rather means &quot;we don&apos;t support this font.&quot; If LOG_ERROR isn&apos;t supposed to use for such purpose, I&apos;m ok to remove this line.
&gt; 
&gt; I see. Thank you for detailed explanation. LOG_ERROR() looks too strong to me, though.

Okay, I&apos;ll remove them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>606430</commentid>
    <comment_count>15</comment_count>
      <attachid>138058</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-04-20 00:56:42 -0700</bug_when>
    <thetext>Created attachment 138058
Reflected changes from Kenichi&apos;s review

Changes from the last patch:
* Replaced short variable names to long ones
* Removed LOG_ERROR for fonts we do not support</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>665234</commentid>
    <comment_count>16</comment_count>
      <attachid>138058</attachid>
    <who name="Tony Chang">tony</who>
    <bug_when>2012-07-09 15:35:13 -0700</bug_when>
    <thetext>Comment on attachment 138058
Reflected changes from Kenichi&apos;s review

View in context: https://bugs.webkit.org/attachment.cgi?id=138058&amp;action=review

Is it possible to write a GTest style unittest for this code to verify that different malformed inputs are rejected?  For example, for a chromium build, you could add a test to Source/WebKit/chromium/tests/.

&gt; Source/WebCore/ChangeLog:9
&gt; +        This patch adds support for reading &apos;GSUB&apos; OpenType table to get
&gt; +        vertical alternate glyphs.

Can you include a link to the OpenType spec about this table?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:51
&gt; +enum {
&gt; +    DefaultScriptTag = OT_MAKE_TAG(&apos;D&apos;, &apos;F&apos;, &apos;L&apos;, &apos;T&apos;),
&gt; +};

This doesn&apos;t need to be an enum does it?  It could just be a uint32_t.  I&apos;m not sure why the tags above are in an enum either.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:55
&gt; +enum {
&gt; +    VertFeatureTag = OT_MAKE_TAG(&apos;v&apos;, &apos;e&apos;, &apos;r&apos;, &apos;t&apos;),
&gt; +};

Also doesn&apos;t need to be an enum.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:59
&gt; +    static bool isValidEnd(const SharedBuffer&amp; buffer, const void* p)

Please use a longer variable name than |p|.  position would be ok.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:61
&gt; +        size_t offset = reinterpret_cast&lt;const char*&gt;(p) - buffer.data();

Just to be safe should we verify that p &gt;= buffer.data()?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:65
&gt; +    template &lt;typename T&gt; static const T* validatePtr(const SharedBuffer&amp; buffer, const void* p)

Please use a longer variable name than |p|.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:75
&gt; +        return validatePtr&lt;T&gt;(buffer, reinterpret_cast&lt;const int8_t*&gt;(this) + offset);

Is it possible for this + offset to overflow?  I guess if we do the extra check mentioned above for line 61 it would be OK.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:185
&gt; +        switch (lookupType) {
&gt; +        case 1: // Single Substitution Subtable

Do you need a default: for this switch statement?  I think some compilers will complain if it&apos;s missing.  If we only care about case 1, maybe we should early return if lookupType != 1?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:194
&gt; +                switch (substitution-&gt;substFormat) {
&gt; +                case 2: { // Single Substitution Format 2

Maybe use an if statement here too?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:211
&gt; +                        break; }

Nit: Closing } goes on a new line and lines up with the left side of &apos;case&apos;.

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:219
&gt; +                        for (uint16_t i = 0, indexTo = 0; i &lt; countRange; i++) {

Nit: ++i

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:222
&gt; +                            if (indexTo +  (fromEnd - from) &gt; countTo)

Nit: accidental double space?

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:261
&gt; +        for (uint16_t i = 0; i &lt; count; i++) {

Nit: ++i

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:342
&gt; +        for (uint16_t i = 0; i &lt; count; i++) {

Nit: ++i

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:363
&gt; +        const ScriptTable* s = defaultScript(buffer);
&gt; +        if (!s)

Nit: Rename s to scriptTable

&gt; Source/WebCore/platform/graphics/opentype/OpenTypeVerticalData.cpp:400
&gt; +        const FeatureTable* vert = feature(OpenType::VertFeatureTag, buffer);
&gt; +        const LookupList* lookups = lookupList(buffer);
&gt; +        return vert &amp;&amp; lookups &amp;&amp; vert-&gt;getGlyphSubstitutions(lookups, map, buffer);

Nit: If vert is null, I would early return before calling lookupList.  Also, vert should be verticalFeatureTable or something rather than an abbreviation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>665235</commentid>
    <comment_count>17</comment_count>
    <who name="Tony Chang">tony</who>
    <bug_when>2012-07-09 15:36:19 -0700</bug_when>
    <thetext>agl may be able to provide an informal review as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669990</commentid>
    <comment_count>18</comment_count>
      <attachid>152462</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-07-15 10:31:31 -0700</bug_when>
    <thetext>Created attachment 152462
Reflected items from Tony&apos;s review

All items in the review are fixed.
Overflow is unlikely because the offset is uint16_t, but theoretically possible and fixed as advised.
Added gtest style unittest at WebKit/chromium/tests/OpenTypeVerticalDataTest.cpp for testing pointer validations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669991</commentid>
    <comment_count>19</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-15 10:34:56 -0700</bug_when>
    <thetext>Attachment 152462 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1
Source/WebKit/chromium/tests/OpenTypeVerticalDataTest.cpp:32:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670003</commentid>
    <comment_count>20</comment_count>
      <attachid>152463</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-07-15 11:43:21 -0700</bug_when>
    <thetext>Created attachment 152463
Reflected items from Tony&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670059</commentid>
    <comment_count>21</comment_count>
      <attachid>152463</attachid>
    <who name="Koji Ishii">kojii</who>
    <bug_when>2012-07-15 20:26:37 -0700</bug_when>
    <thetext>Comment on attachment 152463
Reflected items from Tony&apos;s review

* All items in the Tony&apos;s review are fixed.
* Overflow in TableBase::validateOffset is unlikely because the offset is uint16_t, but theoretically possible and fixed as advised.
* Added gtest style unittest at WebKit/chromium/tests/OpenTypeVerticalDataTest.cpp for testing pointer validations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670851</commentid>
    <comment_count>22</comment_count>
      <attachid>152463</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-16 17:57:59 -0700</bug_when>
    <thetext>Comment on attachment 152463
Reflected items from Tony&apos;s review

Clearing flags on attachment: 152463

Committed r122788: &lt;http://trac.webkit.org/changeset/122788&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670852</commentid>
    <comment_count>23</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-07-16 17:58:06 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>132354</attachid>
            <date>2012-03-16 12:47:56 -0700</date>
            <delta_ts>2012-03-17 00:51:01 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-1.patch</filename>
            <type>text/plain</type>
            <size>14481</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09w
ZW5UeXBlVmVydGljYWxEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcAppbmRleCBkMTNmYTZjLi5mN2UzY2Y5
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9P
cGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwCkBAIC0zNiw2ICszNiw3IEBA
IHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGVudW0geworICAg
IE9UVGFibGVUYWdHU1VCID0gT1RfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKSwKICAgICBP
VFRhYmxlVGFnSGhlYSA9IE9UX01BS0VfVEFHKCdoJywgJ2gnLCAnZScsICdhJyksCiAgICAgT1RU
YWJsZVRhZ0htdHggPSBPVF9NQUtFX1RBRygnaCcsICdtJywgJ3QnLCAneCcpLAogICAgIE9UVGFi
bGVUYWdWaGVhID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKQEAgLTQzLDYgKzQ0
LDE0IEBAIGVudW0gewogICAgIE9UVGFibGVUYWdWT1JHID0gT1RfTUFLRV9UQUcoJ1YnLCAnTycs
ICdSJywgJ0cnKSwKIH07CiAKK2VudW0geworICAgIE9UU2NyaXB0VGFnRGVmYXVsdCA9IE9UX01B
S0VfVEFHKCdEJywgJ0YnLCAnTCcsICdUJyksCit9OworCitlbnVtIHsKKyAgICBPVEZlYXR1cmVU
YWdWZXJ0ID0gT1RfTUFLRV9UQUcoJ3YnLCAnZScsICdyJywgJ3QnKSwKK307CisKIGNsYXNzIE9U
UHRyUmFuZ2UgewogcHVibGljOgogICAgIE9UUHRyUmFuZ2UoY29uc3Qgdm9pZCogcHRyLCBzaXpl
X3Qgc2l6ZSkKQEAgLTEzOSw2ICsxNDgsMjc3IEBAIHN0cnVjdCBPVFRhYmxlVk9SRyB7CiAgICAg
fSB2ZXJ0T3JpZ2luWU1ldHJpY3NbMV07CiB9OwogCitzdHJ1Y3QgT1RDb3ZlcmFnZVRhYmxlIDog
T1RUYWJsZSB7CisgICAgT1RVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9OworCitzdHJ1Y3QgT1RD
b3ZlcmFnZTFUYWJsZSA6IE9UQ292ZXJhZ2VUYWJsZSB7CisgICAgT1RVSW50MTYgZ2x5cGhDb3Vu
dDsKKyAgICBPVEdseXBoSUQgZ2x5cGhBcnJheVsxXTsKKworICAgIGNvbnN0IE9UR2x5cGhJRCog
Z2x5cGhCZWdpbigpIGNvbnN0IHsgcmV0dXJuICZnbHlwaEFycmF5WzBdOyB9CisgICAgY29uc3Qg
T1RHbHlwaElEKiBnbHlwaEVuZCgpIGNvbnN0IHsgcmV0dXJuICZnbHlwaEFycmF5W2dseXBoQ291
bnRdOyB9Cit9OworCitzdHJ1Y3QgT1RDb3ZlcmFnZTJUYWJsZSA6IE9UQ292ZXJhZ2VUYWJsZSB7
CisgICAgT1RVSW50MTYgcmFuZ2VDb3VudDsKKyAgICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAg
ICAgICBPVEdseXBoSUQgc3RhcnQ7CisgICAgICAgIE9UR2x5cGhJRCBlbmQ7CisgICAgICAgIE9U
VUludDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJhbmdlc1sxXTsKKworICAgIGNvbnN0
IFJhbmdlUmVjb3JkKiByYW5nZUJlZ2luKCkgY29uc3QgeyByZXR1cm4gJnJhbmdlc1swXTsgfQor
ICAgIGNvbnN0IFJhbmdlUmVjb3JkKiByYW5nZUVuZCgpIGNvbnN0IHsgcmV0dXJuICZyYW5nZXNb
cmFuZ2VDb3VudF07IH0KK307CisKK3N0cnVjdCBPVFN1YnN0aXR1dGlvblN1YlRhYmxlIDogT1RU
YWJsZSB7CisgICAgT1RVSW50MTYgc3Vic3RGb3JtYXQ7CisgICAgT1RPZmZzZXQgY292ZXJhZ2VP
ZmZzZXQ7Cit9OworCitzdHJ1Y3QgT1RTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUgOiBPVFN1
YnN0aXR1dGlvblN1YlRhYmxlIHsKKyAgICBPVFVJbnQxNiBnbHlwaENvdW50OworICAgIE9UR2x5
cGhJRCBzdWJzdGl0dXRlWzFdOworfTsKKworc3RydWN0IE9UTG9va3VwVGFibGUgOiBPVFRhYmxl
IHsKKyAgICBPVFVJbnQxNiBsb29rdXBUeXBlOworICAgIE9UVUludDE2IGxvb2t1cEZsYWc7Cisg
ICAgT1RVSW50MTYgc3ViVGFibGVDb3VudDsKKyAgICBPVE9mZnNldCBzdWJUYWJsZU9mZnNldHNb
MV07CisgICAgLy8gT1RVSW50MTYgbWFya0ZpbHRlcmluZ1NldDsgdGhpcyBmaWVsZCBjb21lcyBh
ZnRlciB2YXJpYWJsZSBsZW5ndGgsIHNvIG9mZnNldCBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5
LgorCisgICAgYm9vbCBnZXRTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFw
LCBjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICBzd2l0
Y2ggKGxvb2t1cFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBTaW5nbGUgU3Vic3RpdHV0aW9u
IFN1YnRhYmxlCisgICAgICAgICAgICBmb3IgKGludCBpID0gMCwgYyA9IHN1YlRhYmxlQ291bnQ7
IGkgPCBjOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBPVFN1YnN0aXR1dGlvblN1YlRh
YmxlKiBzdWIgPSBwdHI8T1RTdWJzdGl0dXRpb25TdWJUYWJsZT4oc3ViVGFibGVPZmZzZXRzW2ld
LCB2YWxpZGF0b3IpOworICAgICAgICAgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgT1RVSW50MTYqIGNvdmVy
YWdlID0gc3ViLT5wdHI8T1RVSW50MTY+KHN1Yi0+Y292ZXJhZ2VPZmZzZXQsIHZhbGlkYXRvcik7
CisgICAgICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViLT5zdWJzdEZvcm1hdCkgewor
ICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uIEZvcm1hdCAy
CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9UU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxl
KiBzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT1RTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFi
bGUqPihzdWIpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0
b3ItPmlzVmFsaWRFbmQoczIgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgT1RHbHlwaElEKiB0byA9ICZzMi0+c3Vi
c3RpdHV0ZVswXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRUbyA9IHMyLT5n
bHlwaENvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0
b3ItPmlzVmFsaWRFbmQodG8gKyBjb3VudFRvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgqY292ZXJhZ2UpIHsKKyAg
ICAgICAgICAgICAgICAgICAgY2FzZSAxOiB7IC8vIENvdmVyYWdlIEZvcm1hdCAxIChlLmcuLCBN
UyBHb3RoaWMpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPVENvdmVyYWdlMVRhYmxl
KiBjMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT1RDb3ZlcmFnZTFUYWJsZSo+KGNvdmVyYWdl
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsaWRhdG9yICYmICF2YWxpZGF0b3It
PmlzVmFsaWRFbmQoYzEgKyAxKSkgfHwgIU9UUHRyUmFuZ2U6OmFzc2VydElzVHJ1ZShjb3VudFRv
ID09IGMxLT5nbHlwaENvdW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPVEdseXBoSUQqIGZyb21FbmQg
PSBjMS0+Z2x5cGhFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0b3Ig
JiYgIXZhbGlkYXRvci0+aXNWYWxpZEVuZChmcm9tRW5kKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0
IE9UR2x5cGhJRCogZnJvbSA9IGMxLT5nbHlwaEJlZ2luKCk7IGZyb20gIT0gZnJvbUVuZDsgKytm
cm9tLCArK3RvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KCpmcm9tLCAq
dG8pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAg
ICAgY2FzZSAyOiB7IC8vIENvdmVyYWdlIEZvcm1hdCAyIChlLmcuLCBLb3p1a2EgR290aGljKQor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1RDb3ZlcmFnZTJUYWJsZSogYzIgPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IE9UQ292ZXJhZ2UyVGFibGUqPihjb3ZlcmFnZSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3ItPmlzVmFsaWRFbmQo
YzIgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBPVENvdmVyYWdlMlRhYmxlOjpSYW5nZVJlY29yZCog
cmFuZ2VFbmQgPSBjMi0+cmFuZ2VFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2
YWxpZGF0b3IgJiYgIXZhbGlkYXRvci0+aXNWYWxpZEVuZChyYW5nZUVuZCkpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yIChjb25zdCBPVENvdmVyYWdlMlRhYmxlOjpSYW5nZVJlY29yZCogcmFuZ2UgPSBjMi0+cmFu
Z2VCZWdpbigpOyByYW5nZSAhPSByYW5nZUVuZDsgKytyYW5nZSkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVpbnQxNl90IGZyb20gPSByYW5nZS0+c3RhcnQ7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdWludDE2X3QgZnJvbUVuZCA9IHJhbmdlLT5lbmQgKyAxOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50RnJvbSA9IGZyb21FbmQgLSBmcm9t
OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT1RQdHJSYW5nZTo6YXNzZXJ0SXNU
cnVlKGNvdW50RnJvbSA8PSBjb3VudFRvKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50VG8gLT0g
Y291bnRGcm9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBmcm9tICE9IGZy
b21FbmQ7ICsrZnJvbSwgKyt0bykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFw
LT5zZXQoZnJvbSwgKnRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICghT1RQdHJSYW5nZTo6YXNzZXJ0SXNUcnVlKCFjb3VudFRvKSkKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAg
ICAgICAgICBicmVhazsgfQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAg
ICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJDb3ZlcmFnZUZvcm1hdCAlZCBub3Qgc3VwcG9ydGVk
IiwgKmNvdmVyYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICAg
ICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTdWJzdEZvcm1hdCAl
ZCBub3Qgc3VwcG9ydGVkIiwgc3ViLT5zdWJzdEZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0VSUk9SKCJMb29rdXBUeXBl
ICVkIG5vdCBzdXBwb3J0ZWQiLCBsb29rdXBUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBPVExvb2t1
cExpc3QgOiBPVFRhYmxlIHsKKyAgICBPVFVJbnQxNiBsb29rdXBDb3VudDsKKyAgICBPVE9mZnNl
dCBsb29rdXBPZmZzZXRzWzFdOworCisgICAgY29uc3QgT1RMb29rdXBUYWJsZSogbG9va3VwVGFi
bGUodWludDE2X3QgaW5kZXgsIGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QKKyAg
ICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gbG9va3VwQ291bnQ7CisgICAgICAgIGlmICgh
T1RQdHJSYW5nZTo6YXNzZXJ0SXNUcnVlKGluZGV4IDwgY291bnQpIHx8ICh2YWxpZGF0b3IgJiYg
IXZhbGlkYXRvci0+aXNWYWxpZEVuZCgmbG9va3VwT2Zmc2V0c1tjb3VudF0pKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gcHRyPE9UTG9va3VwVGFibGU+KGxvb2t1cE9m
ZnNldHNbaW5kZXhdLCB2YWxpZGF0b3IpOworICAgIH0KK307CisKK3N0cnVjdCBPVEZlYXR1cmVU
YWJsZSB7CisgICAgT1RPZmZzZXQgZmVhdHVyZVBhcmFtczsKKyAgICBPVFVJbnQxNiBsb29rdXBD
b3VudDsKKyAgICBPVFVJbnQxNiBsb29rdXBMaXN0SW5kZXhbMV07CisKKyAgICBjb25zdCBPVFVJ
bnQxNiogbG9va3VwSW5kZXhCZWdpbigpIGNvbnN0IHsgcmV0dXJuICZsb29rdXBMaXN0SW5kZXhb
MF07IH0KKyAgICBjb25zdCBPVFVJbnQxNiogbG9va3VwSW5kZXhFbmQoKSBjb25zdCB7IHJldHVy
biAmbG9va3VwTGlzdEluZGV4W2xvb2t1cENvdW50XTsgfQorfTsKKworc3RydWN0IE9UTGFuZ1N5
c1RhYmxlIHsKKyAgICBPVE9mZnNldCBsb29rdXBPcmRlcjsKKyAgICBPVFVJbnQxNiByZXFGZWF0
dXJlSW5kZXg7CisgICAgT1RVSW50MTYgZmVhdHVyZUNvdW50OworICAgIE9UVUludDE2IGZlYXR1
cmVJbmRleFsxXTsKKworICAgIGNvbnN0IE9UVUludDE2KiBmZWF0dXJlSW5kZXhCZWdpbigpIGNv
bnN0IHsgcmV0dXJuICZmZWF0dXJlSW5kZXhbMF07IH0KKyAgICBjb25zdCBPVFVJbnQxNiogZmVh
dHVyZUluZGV4RW5kKCkgY29uc3QgeyByZXR1cm4gJmZlYXR1cmVJbmRleFtmZWF0dXJlQ291bnRd
OyB9Cit9OworCitzdHJ1Y3QgT1RGZWF0dXJlTGlzdCA6IE9UVGFibGUgeworICAgIE9UVUludDE2
IGZlYXR1cmVDb3VudDsKKyAgICBzdHJ1Y3QgRmVhdHVyZVJlY29yZCB7CisgICAgICAgIE9UVGFn
IGZlYXR1cmVUYWc7CisgICAgICAgIE9UT2Zmc2V0IGZlYXR1cmVPZmZzZXQ7CisgICAgfSBmZWF0
dXJlc1sxXTsKKworICAgIGNvbnN0IE9URmVhdHVyZUxpc3Q6OkZlYXR1cmVSZWNvcmQqIGZlYXR1
cmVSZWNvcmQodWludDE2X3QgaW5kZXgsIGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29u
c3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gZmVhdHVyZUNvdW50OworICAgICAg
ICBpZiAoIU9UUHRyUmFuZ2U6OmFzc2VydElzVHJ1ZShpbmRleCA8IGNvdW50KSB8fCAodmFsaWRh
dG9yICYmICF2YWxpZGF0b3ItPmlzVmFsaWRFbmQoJmZlYXR1cmVzW2NvdW50XSkpKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAmKGZlYXR1cmVzW2luZGV4XSk7CisgICAg
fQorCisgICAgY29uc3QgT1RGZWF0dXJlVGFibGUqIGZlYXR1cmVUYWJsZShPVFRhZyBmZWF0dXJl
VGFnLCBjb25zdCBPVExhbmdTeXNUYWJsZSogbGFuZ1N5c1RhYmxlLCBjb25zdCBPVFB0clJhbmdl
KiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBPVFVJbnQxNiogZW5kID0g
bGFuZ1N5c1RhYmxlLT5mZWF0dXJlSW5kZXhFbmQoKTsKKyAgICAgICAgaWYgKHZhbGlkYXRvciAm
JiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5kKGVuZCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgZm9yIChjb25zdCBPVFVJbnQxNiogaW5kZXggPSBsYW5nU3lzVGFibGUtPmZlYXR1cmVJ
bmRleEJlZ2luKCk7IGluZGV4ICE9IGVuZDsgKytpbmRleCkgeworICAgICAgICAgICAgY29uc3Qg
T1RGZWF0dXJlTGlzdDo6RmVhdHVyZVJlY29yZCogZnIgPSBmZWF0dXJlUmVjb3JkKCppbmRleCwg
dmFsaWRhdG9yKTsKKyAgICAgICAgICAgIGlmIChmciAmJiBmci0+ZmVhdHVyZVRhZyA9PSBmZWF0
dXJlVGFnKQorICAgICAgICAgICAgICAgIHJldHVybiBwdHI8T1RGZWF0dXJlVGFibGU+KGZyLT5m
ZWF0dXJlT2Zmc2V0LCB2YWxpZGF0b3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK307CisKK3N0cnVjdCBPVFNjcmlwdFRhYmxlIDogT1RUYWJsZSB7CisgICAgT1RPZmZz
ZXQgZGVmYXVsdExhbmdTeXNPZmZzZXQ7CisgICAgT1RVSW50MTYgbGFuZ1N5c0NvdW50OworICAg
IHN0cnVjdCBMYW5nU3lzUmVjb3JkIHsKKyAgICAgICAgT1RUYWcgbGFuZ1N5c1RhZzsKKyAgICAg
ICAgT1RPZmZzZXQgbGFuZ1N5c09mZnNldDsKKyAgICB9IGxhbmdTeXNSZWNvcmRzWzFdOworCisg
ICAgY29uc3QgT1RMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzVGFibGUoY29uc3QgT1RQdHJS
YW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3Qgb2Zmc2V0ID0g
ZGVmYXVsdExhbmdTeXNPZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICAgICBy
ZXR1cm4gcHRyPE9UTGFuZ1N5c1RhYmxlPihvZmZzZXQsIHZhbGlkYXRvcik7CisgICAgICAgIGlm
IChPVFB0clJhbmdlOjphc3NlcnRJc1RydWUobGFuZ1N5c0NvdW50KSkKKyAgICAgICAgICAgIHJl
dHVybiBwdHI8T1RMYW5nU3lzVGFibGU+KGxhbmdTeXNSZWNvcmRzWzBdLmxhbmdTeXNPZmZzZXQs
IHZhbGlkYXRvcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVjdCBPVFNj
cmlwdExpc3QgOiBPVFRhYmxlIHsKKyAgICBPVFVJbnQxNiBzY3JpcHRDb3VudDsKKyAgICBzdHJ1
Y3QgU2NyaXB0UmVjb3JkIHsKKyAgICAgICAgT1RUYWcgc2NyaXB0VGFnOworICAgICAgICBPVE9m
ZnNldCBzY3JpcHRPZmZzZXQ7CisgICAgfSBzY3JpcHRzWzFdOworCisgICAgY29uc3QgT1RTY3Jp
cHRUYWJsZSogc2NyaXB0VGFibGVGb3JUYWcoT1RUYWcgdGFnLCBjb25zdCBPVFB0clJhbmdlKiB2
YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRSZWNvcmQqIGVuZCA9
ICYoc2NyaXB0c1tzY3JpcHRDb3VudF0pOworICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2YWxp
ZGF0b3ItPmlzVmFsaWRFbmQoZW5kKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBm
b3IgKGNvbnN0IFNjcmlwdFJlY29yZCogc3IgPSBzY3JpcHRzOyBzciAhPSBlbmQ7ICsrc3IpCisg
ICAgICAgICAgICBpZiAoc3ItPnNjcmlwdFRhZyA9PSB0YWcpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHB0cjxPVFNjcmlwdFRhYmxlPihzci0+c2NyaXB0T2Zmc2V0LCB2YWxpZGF0b3IpOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBPVFNjcmlwdFRhYmxlKiBkZWZhdWx0
U2NyaXB0VGFibGUoY29uc3QgT1RQdHJSYW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAg
ICAgICAgY29uc3QgT1RTY3JpcHRUYWJsZSogdCA9IHNjcmlwdFRhYmxlRm9yVGFnKE9UU2NyaXB0
VGFnRGVmYXVsdCwgdmFsaWRhdG9yKTsKKyAgICAgICAgaWYgKCF0ICYmIHNjcmlwdENvdW50KQor
ICAgICAgICAgICAgdCA9IHB0cjxPVFNjcmlwdFRhYmxlPihzY3JpcHRzWzBdLnNjcmlwdE9mZnNl
dCwgdmFsaWRhdG9yKTsKKyAgICAgICAgcmV0dXJuIHQ7CisgICAgfQorCisgICAgY29uc3QgT1RM
YW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzVGFibGUoY29uc3QgT1RQdHJSYW5nZSogdmFsaWRh
dG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgT1RTY3JpcHRUYWJsZSogc2NyaXB0VGFi
bGUgPSBkZWZhdWx0U2NyaXB0VGFibGUodmFsaWRhdG9yKTsKKyAgICAgICAgaWYgKCFzY3JpcHRU
YWJsZSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gc2NyaXB0VGFibGUt
PmRlZmF1bHRMYW5nU3lzVGFibGUodmFsaWRhdG9yKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgT1RU
YWJsZUdTVUIgOiBPVFRhYmxlIHsKKyAgICBPVEZpeGVkIHZlcnNpb247CisgICAgT1RPZmZzZXQg
c2NyaXB0TGlzdE9mZnNldDsKKyAgICBPVE9mZnNldCBmZWF0dXJlTGlzdE9mZnNldDsKKyAgICBP
VE9mZnNldCBsb29rdXBMaXN0T2Zmc2V0OworCisgICAgY29uc3QgT1RTY3JpcHRMaXN0KiBzY3Jp
cHRMaXN0KGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QgeyByZXR1cm4gcHRyPE9U
U2NyaXB0TGlzdD4oc2NyaXB0TGlzdE9mZnNldCwgdmFsaWRhdG9yKTsgfQorICAgIGNvbnN0IE9U
RmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0KGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29u
c3QgeyByZXR1cm4gcHRyPE9URmVhdHVyZUxpc3Q+KGZlYXR1cmVMaXN0T2Zmc2V0LCB2YWxpZGF0
b3IpOyB9CisgICAgY29uc3QgT1RMb29rdXBMaXN0KiBsb29rdXBMaXN0KGNvbnN0IE9UUHRyUmFu
Z2UqIHZhbGlkYXRvcikgY29uc3QgeyByZXR1cm4gcHRyPE9UTG9va3VwTGlzdD4obG9va3VwTGlz
dE9mZnNldCwgdmFsaWRhdG9yKTsgfQorICAgIGNvbnN0IE9UTGFuZ1N5c1RhYmxlKiBkZWZhdWx0
TGFuZ1N5c1RhYmxlKGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QgeyByZXR1cm4g
c2NyaXB0TGlzdCh2YWxpZGF0b3IpLT5kZWZhdWx0TGFuZ1N5c1RhYmxlKHZhbGlkYXRvcik7IH0K
KworICAgIGNvbnN0IE9URmVhdHVyZVRhYmxlKiBmZWF0dXJlVGFibGUoT1RUYWcgZmVhdHVyZVRh
ZywgY29uc3QgT1RQdHJSYW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgY29u
c3QgT1RMYW5nU3lzVGFibGUqIGxhbmdTeXNUYWJsZSA9IGRlZmF1bHRMYW5nU3lzVGFibGUodmFs
aWRhdG9yKTsKKyAgICAgICAgaWYgKCFsYW5nU3lzVGFibGUpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgY29uc3QgT1RGZWF0dXJlTGlzdCogZmVhdHVyZXMgPSBmZWF0dXJlTGlzdCh2
YWxpZGF0b3IpOworICAgICAgICBpZiAoIWZlYXR1cmVzKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIHJldHVybiBmZWF0dXJlcy0+ZmVhdHVyZVRhYmxlKGZlYXR1cmVUYWcsIGxhbmdT
eXNUYWJsZSwgdmFsaWRhdG9yKTsKKyAgICB9CisKKyAgICBib29sIGdldEdseXBoU3Vic3RpdHV0
aW9ucyhjb25zdCBPVEZlYXR1cmVUYWJsZSogZmVhdHVyZSwgSGFzaE1hcDxHbHlwaCwgR2x5cGg+
KiBtYXAsIGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QKKyAgICB7CisgICAgICAg
IGNvbnN0IE9UTG9va3VwTGlzdCogbG9va3VwcyA9IGxvb2t1cExpc3QodmFsaWRhdG9yKTsKKyAg
ICAgICAgaWYgKCFsb29rdXBzKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBj
b25zdCBPVFVJbnQxNiogZW5kID0gZmVhdHVyZS0+bG9va3VwSW5kZXhFbmQoKTsKKyAgICAgICAg
aWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5kKGVuZCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgT1RVSW50MTYqIGluZGV4ID0gZmVh
dHVyZS0+bG9va3VwSW5kZXhCZWdpbigpOyBpbmRleCAhPSBlbmQ7ICsraW5kZXgpIHsKKyAgICAg
ICAgICAgIGNvbnN0IE9UTG9va3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1cHMtPmxvb2t1cFRhYmxl
KCppbmRleCwgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIGlmICghbG9va3VwIHx8ICFsb29rdXAt
PmdldFN1YnN0aXR1dGlvbnMobWFwLCB2YWxpZGF0b3IpKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBi
b29sIGdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiog
bWFwLCBjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICBj
b25zdCBPVEZlYXR1cmVUYWJsZSogZmVhdHVyZSA9IGZlYXR1cmVUYWJsZShPVEZlYXR1cmVUYWdW
ZXJ0LCB2YWxpZGF0b3IpOworICAgICAgICByZXR1cm4gZmVhdHVyZSAmJiBnZXRHbHlwaFN1YnN0
aXR1dGlvbnMoZmVhdHVyZSwgbWFwLCB2YWxpZGF0b3IpOworICAgIH0KK307CisKICNwcmFnbWEg
cGFjaygpCiAKIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0YShjb25z
dCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCkBAIC0yMTIsNiArNDkyLDE1IEBAIE9w
ZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0YShjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisK
KyAgICAvLyBMb2FkIHZlcnRpY2FsIGdseXBoIHN1YnN0aXR1dGlvbnMuCisgICAgc2l6ZV90IGdz
dWJTaXplOworICAgIE93blB0cjxPVFRhYmxlR1NVQj4gZ3N1YihwbGF0Zm9ybURhdGEub3BlblR5
cGVUYWJsZTxPVFRhYmxlR1NVQj4oT1RUYWJsZVRhZ0dTVUIsICZnc3ViU2l6ZSkpOworICAgIGlm
IChnc3ViKSB7CisgICAgICAgIE9UUHRyUmFuZ2UgZ3N1YlZhbGlkYXRvcihnc3ViLmdldCgpLCBn
c3ViU2l6ZSk7CisgICAgICAgIGdzdWItPmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKCZt
X3ZlcnRpY2FsR2x5cGhNYXAsICZnc3ViVmFsaWRhdG9yKTsKKyAgICAgICAgZ3N1Yi5jbGVhcigp
OworICAgIH0KIH0KIAogZmxvYXQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmFkdmFuY2VIZWlnaHQo
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIEdseXBoIGdseXBoKSBjb25zdApAQCAtMjcwLDQg
KzU1OSwyMSBAQCB2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpnZXRWZXJ0aWNhbFRyYW5zbGF0
aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YQogICAgIH0KIH0KIAordm9pZCBPcGVu
VHlwZVZlcnRpY2FsRGF0YTo6c3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBTaW1w
bGVGb250RGF0YSogZm9udCwgR2x5cGhQYWdlKiBnbHlwaFBhZ2UsIHVuc2lnbmVkIG9mZnNldCwg
dW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIGNvbnN0IEhhc2hNYXA8R2x5cGgsIEdseXBo
PiYgbWFwID0gbV92ZXJ0aWNhbEdseXBoTWFwOworICAgIGlmIChtYXAuaXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gb2Zmc2V0LCBlbmQgPSBv
ZmZzZXQgKyBsZW5ndGg7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7CisgICAgICAgIEdseXBoIGds
eXBoID0gZ2x5cGhQYWdlLT5nbHlwaEF0KGluZGV4KTsKKyAgICAgICAgaWYgKGdseXBoKSB7Cisg
ICAgICAgICAgICBBU1NFUlQoZ2x5cGhQYWdlLT5nbHlwaERhdGFGb3JJbmRleChpbmRleCkuZm9u
dERhdGEgPT0gZm9udCk7CisgICAgICAgICAgICBHbHlwaCB0byA9IG1hcC5nZXQoZ2x5cGgpOwor
ICAgICAgICAgICAgaWYgKHRvKQorICAgICAgICAgICAgICAgIGdseXBoUGFnZS0+c2V0R2x5cGhE
YXRhRm9ySW5kZXgoaW5kZXgsIHRvLCBmb250KTsKKyAgICAgICAgfQorICAgIH0KK30KKwogfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaCBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKaW5kZXgg
NzY3YjNlZi4uNzg2ODRjYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oCkBAIC00
NCw2ICs0NCw3IEBAIHB1YmxpYzoKICAgICBib29sIGhhc1ZlcnRpY2FsTWV0cmljcygpIGNvbnN0
IHsgcmV0dXJuICFtX2FkdmFuY2VIZWlnaHRzLmlzRW1wdHkoKTsgfQogICAgIGZsb2F0IGFkdmFu
Y2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqLCBHbHlwaCkgY29uc3Q7CiAgICAgdm9pZCBn
ZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YSosIGNv
bnN0IEdseXBoKiwgc2l6ZV90LCBmbG9hdCogb3V0WFlBcnJheSkgY29uc3Q7CisgICAgdm9pZCBz
dWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgR2x5cGhQ
YWdlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0OwogCiBwcml2YXRl
OgogICAgIGJvb2wgaGFzVk9SRygpIGNvbnN0IHsgcmV0dXJuICFtX3ZlcnRPcmlnaW5ZLmlzRW1w
dHkoKTsgfQpAQCAtNTQsNiArNTUsNyBAQCBwcml2YXRlOgogICAgIFZlY3RvcjxpbnQxNl90PiBt
X3RvcFNpZGVCZWFyaW5nczsKICAgICBpbnQxNl90IG1fZGVmYXVsdFZlcnRPcmlnaW5ZOwogICAg
IEhhc2hNYXA8R2x5cGgsIGludDE2X3Q+IG1fdmVydE9yaWdpblk7CisgICAgSGFzaE1hcDxHbHlw
aCwgR2x5cGg+IG1fdmVydGljYWxHbHlwaE1hcDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNv
cmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>132453</attachid>
            <date>2012-03-17 00:51:01 -0700</date>
            <delta_ts>2012-03-18 14:44:49 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-2.patch</filename>
            <type>text/plain</type>
            <size>18452</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxYjMxN2U0Li4xYjEyOTg2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjkg
QEAKKzIwMTItMDMtMTcgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAn
R1NVQicgT3BlblR5cGUgdGFibGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBn
bHlwaHMuCisKKyAgICAgICAgTGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkg
Y29kZSBwYXRoIHlldC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOgorICAgICAgICAoT1RQdHJSYW5nZSk6IEEgY2xhc3MgdG8gdmFsaWRhdGUgb2Zmc2V0
cyB3aXRoaW4gT3BlblR5cGUgdGFibGVzCisgICAgICAgIChXZWJDb3JlOjpPVFB0clJhbmdlOjpP
VFB0clJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9UUHRyUmFuZ2U6OmFzc2VydElzVHJ1ZSk6
CisgICAgICAgIChXZWJDb3JlOjpPVFB0clJhbmdlOjppc1ZhbGlkRW5kKToKKyAgICAgICAgKFdl
YkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T1RUYWJsZTo6cHRyKToKKyAgICAgICAgKE9UQ292
ZXJhZ2VUYWJsZSk6CisgICAgICAgIChPVENvdmVyYWdlMVRhYmxlKToKKyAgICAgICAgKFdlYkNv
cmU6Ok9UQ292ZXJhZ2UxVGFibGU6OmdseXBoQmVnaW4pOgorICAgICAgICAoV2ViQ29yZTo6T1RD
b3ZlcmFnZTFUYWJsZTo6Z2x5cGhFbmQpOgorICAgICAgICAoT1RDb3ZlcmFnZTJUYWJsZSk6Cisg
ICAgICAgIChSYW5nZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPVENvdmVyYWdlMlRhYmxl
OjpyYW5nZUJlZ2luKToKKyAgICAgICAgKFdlYkNvcmU6Ok9UQ292ZXJhZ2UyVGFibGU6OnJhbmdl
RW5kKToKKyAgICAgICAgKE9UU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoT1RTaW5n
bGVTdWJzdGl0dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoT1RMb29rdXBUYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpPVExvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25zKToKKyAgICAgICAg
KE9UTG9va3VwTGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpPVExvb2t1cExpc3Q6Omxvb2t1cFRh
YmxlKToKKyAgICAgICAgKE9URmVhdHVyZVRhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9URmVh
dHVyZVRhYmxlOjpsb29rdXBJbmRleEJlZ2luKToKKyAgICAgICAgKFdlYkNvcmU6Ok9URmVhdHVy
ZVRhYmxlOjpsb29rdXBJbmRleEVuZCk6CisgICAgICAgIChPVExhbmdTeXNUYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpPVExhbmdTeXNUYWJsZTo6ZmVhdHVyZUluZGV4QmVnaW4pOgorICAgICAg
ICAoV2ViQ29yZTo6T1RMYW5nU3lzVGFibGU6OmZlYXR1cmVJbmRleEVuZCk6CisgICAgICAgIChP
VEZlYXR1cmVMaXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29y
ZTo6T1RGZWF0dXJlTGlzdDo6ZmVhdHVyZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPVEZl
YXR1cmVMaXN0OjpmZWF0dXJlVGFibGUpOgorICAgICAgICAoT1RTY3JpcHRUYWJsZSk6CisgICAg
ICAgIChMYW5nU3lzUmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6Ok9UU2NyaXB0VGFibGU6OmRl
ZmF1bHRMYW5nU3lzVGFibGUpOgorICAgICAgICAoT1RTY3JpcHRMaXN0KToKKyAgICAgICAgKFNj
cmlwdFJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPVFNjcmlwdExpc3Q6OnNjcmlwdFRhYmxl
Rm9yVGFnKToKKyAgICAgICAgKFdlYkNvcmU6Ok9UU2NyaXB0TGlzdDo6ZGVmYXVsdFNjcmlwdFRh
YmxlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9UU2NyaXB0TGlzdDo6ZGVmYXVsdExhbmdTeXNUYWJs
ZSk6CisgICAgICAgIChPVEdTVUJUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPVEdTVUJUYWJs
ZTo6c2NyaXB0TGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpPVEdTVUJUYWJsZTo6ZmVhdHVyZUxp
c3QpOgorICAgICAgICAoV2ViQ29yZTo6T1RHU1VCVGFibGU6Omxvb2t1cExpc3QpOgorICAgICAg
ICAoV2ViQ29yZTo6T1RHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzVGFibGUpOgorICAgICAgICAo
V2ViQ29yZTo6T1RHU1VCVGFibGU6OmZlYXR1cmVUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpP
VEdTVUJUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6Ok9U
R1NVQlRhYmxlOjpnZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyk6CisgICAgICAgIChXZWJD
b3JlOjpPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEpOgorICAgICAg
ICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxH
bHlwaHMpOiBTdWJzdGl0dXRlIEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlw
aCBJRHMKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRp
Y2FsRGF0YS5oOgorICAgICAgICAoT3BlblR5cGVWZXJ0aWNhbERhdGEpOiBBZGQgbV92ZXJ0aWNh
bEdseXBoTWFwCisKIDIwMTItMDMtMTYgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+
CiAKICAgICAgICAgVmVydGljYWwgZmxvdyBzdXBwb3J0IGZvciBPcGVuVHlwZSBmb250cyB3aXRo
IHRoZSBsZWFzdCBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGlj
YWxEYXRhLmNwcAppbmRleCA4NDkxZGFmLi5jNTFhM2FjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVW
ZXJ0aWNhbERhdGEuY3BwCkBAIC0zNiw2ICszNiw3IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiBu
YW1lc3BhY2UgV2ViQ29yZSB7CiAKIGVudW0geworICAgIE9UR1NVQlRhZyA9IE9UX01BS0VfVEFH
KCdHJywgJ1MnLCAnVScsICdCJyksCiAgICAgT1RIaGVhVGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAn
aCcsICdlJywgJ2EnKSwKICAgICBPVEhtdHhUYWcgPSBPVF9NQUtFX1RBRygnaCcsICdtJywgJ3Qn
LCAneCcpLAogICAgIE9UVmhlYVRhZyA9IE9UX01BS0VfVEFHKCd2JywgJ2gnLCAnZScsICdhJyks
CkBAIC00Myw4ICs0NCw1MSBAQCBlbnVtIHsKICAgICBPVFZPUkdUYWcgPSBPVF9NQUtFX1RBRygn
VicsICdPJywgJ1InLCAnRycpLAogfTsKIAorZW51bSB7CisgICAgT1REZWZhdWx0U2NyaXB0VGFn
ID0gT1RfTUFLRV9UQUcoJ0QnLCAnRicsICdMJywgJ1QnKSwKK307CisKK2VudW0geworICAgIE9U
VmVydEZlYXR1cmVUYWcgPSBPVF9NQUtFX1RBRygndicsICdlJywgJ3InLCAndCcpLAorfTsKKwor
Y2xhc3MgT1RQdHJSYW5nZSB7CitwdWJsaWM6CisgICAgT1RQdHJSYW5nZShjb25zdCB2b2lkKiBw
dHIsIHNpemVfdCBzaXplKQorICAgICAgICA6IG1fcHRyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
dWludDhfdCo+KHB0cikpCisgICAgICAgICwgbV9zaXplKHNpemUpCisgICAgeworICAgIH0KKwor
ICAgIHN0YXRpYyBib29sIGFzc2VydElzVHJ1ZShib29sIHZhbHVlKQorICAgIHsKKyAgICAgICAg
QVNTRVJUX1dJVEhfTUVTU0FHRSh2YWx1ZSwgIkludmFsaWQgT3BlblR5cGUgZGF0YSBkZXRlY3Rl
ZCIpOworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgYm9vbCBpc1ZhbGlkRW5k
KGNvbnN0IHZvaWQqIHApIGNvbnN0CisgICAgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocCkgLSBtX3B0cjsKKyAgICAgICAgcmV0dXJu
IGFzc2VydElzVHJ1ZShvZmZzZXQgPD0gbV9zaXplKTsgLy8gIjw9IiBiZWNhdXNlIGVuZCBpcyBp
bmNsdWRlZCBhcyB2YWxpZAorICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB1aW50OF90KiBt
X3B0cjsKKyAgICBzaXplX3QgbV9zaXplOworfTsKKwogI3ByYWdtYSBwYWNrKDEpCiAKK3N0cnVj
dCBPVFRhYmxlIHsKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogcHRyKHVpbnQx
Nl90IG9mZnNldCwgY29uc3QgT1RQdHJSYW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAg
ICAgICAgY29uc3QgVCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4ocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBpbnQ4X3QqPih0aGlzKSArIG9mZnNldCk7CisgICAgICAgIGlmICh2YWxp
ZGF0b3IgJiYgIXZhbGlkYXRvci0+aXNWYWxpZEVuZChwdHIgKyAxKSkKKyAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICByZXR1cm4gcHRyOworICAgIH0KK307CisKIHN0cnVjdCBPVEhoZWFU
YWJsZSB7CiAgICAgT1RGaXhlZCB2ZXJzaW9uOwogICAgIE9USW50MTYgYXNjZW5kZXI7CkBAIC0x
MDQsNiArMTQ4LDI3NyBAQCBzdHJ1Y3QgT1RWT1JHVGFibGUgewogICAgIH0gdmVydE9yaWdpbllN
ZXRyaWNzWzFdOwogfTsKIAorc3RydWN0IE9UQ292ZXJhZ2VUYWJsZSA6IE9UVGFibGUgeworICAg
IE9UVUludDE2IGNvdmVyYWdlRm9ybWF0OworfTsKKworc3RydWN0IE9UQ292ZXJhZ2UxVGFibGUg
OiBPVENvdmVyYWdlVGFibGUgeworICAgIE9UVUludDE2IGdseXBoQ291bnQ7CisgICAgT1RHbHlw
aElEIGdseXBoQXJyYXlbMV07CisKKyAgICBjb25zdCBPVEdseXBoSUQqIGdseXBoQmVnaW4oKSBj
b25zdCB7IHJldHVybiAmZ2x5cGhBcnJheVswXTsgfQorICAgIGNvbnN0IE9UR2x5cGhJRCogZ2x5
cGhFbmQoKSBjb25zdCB7IHJldHVybiAmZ2x5cGhBcnJheVtnbHlwaENvdW50XTsgfQorfTsKKwor
c3RydWN0IE9UQ292ZXJhZ2UyVGFibGUgOiBPVENvdmVyYWdlVGFibGUgeworICAgIE9UVUludDE2
IHJhbmdlQ291bnQ7CisgICAgc3RydWN0IFJhbmdlUmVjb3JkIHsKKyAgICAgICAgT1RHbHlwaElE
IHN0YXJ0OworICAgICAgICBPVEdseXBoSUQgZW5kOworICAgICAgICBPVFVJbnQxNiBzdGFydENv
dmVyYWdlSW5kZXg7CisgICAgfSByYW5nZXNbMV07CisKKyAgICBjb25zdCBSYW5nZVJlY29yZCog
cmFuZ2VCZWdpbigpIGNvbnN0IHsgcmV0dXJuICZyYW5nZXNbMF07IH0KKyAgICBjb25zdCBSYW5n
ZVJlY29yZCogcmFuZ2VFbmQoKSBjb25zdCB7IHJldHVybiAmcmFuZ2VzW3JhbmdlQ291bnRdOyB9
Cit9OworCitzdHJ1Y3QgT1RTdWJzdGl0dXRpb25TdWJUYWJsZSA6IE9UVGFibGUgeworICAgIE9U
VUludDE2IHN1YnN0Rm9ybWF0OworICAgIE9UT2Zmc2V0IGNvdmVyYWdlT2Zmc2V0OworfTsKKwor
c3RydWN0IE9UU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlIDogT1RTdWJzdGl0dXRpb25TdWJU
YWJsZSB7CisgICAgT1RVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPVEdseXBoSUQgc3Vic3RpdHV0
ZVsxXTsKK307CisKK3N0cnVjdCBPVExvb2t1cFRhYmxlIDogT1RUYWJsZSB7CisgICAgT1RVSW50
MTYgbG9va3VwVHlwZTsKKyAgICBPVFVJbnQxNiBsb29rdXBGbGFnOworICAgIE9UVUludDE2IHN1
YlRhYmxlQ291bnQ7CisgICAgT1RPZmZzZXQgc3ViVGFibGVPZmZzZXRzWzFdOworICAgIC8vIE9U
VUludDE2IG1hcmtGaWx0ZXJpbmdTZXQ7IHRoaXMgZmllbGQgY29tZXMgYWZ0ZXIgdmFyaWFibGUg
bGVuZ3RoLCBzbyBvZmZzZXQgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseS4KKworICAgIGJvb2wg
Z2V0U3Vic3RpdHV0aW9ucyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgT1RQdHJS
YW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgc3dpdGNoIChsb29rdXBUeXBl
KSB7CisgICAgICAgIGNhc2UgMTogLy8gU2luZ2xlIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZQorICAg
ICAgICAgICAgZm9yIChpbnQgaSA9IDAsIGMgPSBzdWJUYWJsZUNvdW50OyBpIDwgYzsgKytpKSB7
CisgICAgICAgICAgICAgICAgY29uc3QgT1RTdWJzdGl0dXRpb25TdWJUYWJsZSogc3ViID0gcHRy
PE9UU3Vic3RpdHV0aW9uU3ViVGFibGU+KHN1YlRhYmxlT2Zmc2V0c1tpXSwgdmFsaWRhdG9yKTsK
KyAgICAgICAgICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIGNvbnN0IE9UVUludDE2KiBjb3ZlcmFnZSA9IHN1Yi0+cHRy
PE9UVUludDE2PihzdWItPmNvdmVyYWdlT2Zmc2V0LCB2YWxpZGF0b3IpOworICAgICAgICAgICAg
ICAgIGlmICghY292ZXJhZ2UpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgICAgICBzd2l0Y2ggKHN1Yi0+c3Vic3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAg
ICBjYXNlIDI6IHsgLy8gU2luZ2xlIFN1YnN0aXR1dGlvbiBGb3JtYXQgMgorICAgICAgICAgICAg
ICAgICAgICBjb25zdCBPVFNpbmdsZVN1YnN0aXR1dGlvbjJTdWJUYWJsZSogczIgPSByZWludGVy
cHJldF9jYXN0PGNvbnN0IE9UU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlKj4oc3ViKTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5k
KHMyICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IE9UR2x5cGhJRCogdG8gPSAmczItPnN1YnN0aXR1dGVbMF07Cisg
ICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50VG8gPSBzMi0+Z2x5cGhDb3VudDsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5k
KHRvICsgY291bnRUbykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoKmNvdmVyYWdlKSB7CisgICAgICAgICAgICAgICAg
ICAgIGNhc2UgMTogeyAvLyBDb3ZlcmFnZSBGb3JtYXQgMSAoZS5nLiwgTVMgR290aGljKQorICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1RDb3ZlcmFnZTFUYWJsZSogYzEgPSByZWludGVy
cHJldF9jYXN0PGNvbnN0IE9UQ292ZXJhZ2UxVGFibGUqPihjb3ZlcmFnZSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICBpZiAoKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5kKGMx
ICsgMSkpIHx8ICFPVFB0clJhbmdlOjphc3NlcnRJc1RydWUoY291bnRUbyA9PSBjMS0+Z2x5cGhD
b3VudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgT1RHbHlwaElEKiBmcm9tRW5kID0gYzEtPmdseXBoRW5k
KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2YWxpZGF0b3It
PmlzVmFsaWRFbmQoZnJvbUVuZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBPVEdseXBoSUQqIGZy
b20gPSBjMS0+Z2x5cGhCZWdpbigpOyBmcm9tICE9IGZyb21FbmQ7ICsrZnJvbSwgKyt0bykKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAtPnNldCgqZnJvbSwgKnRvKTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogeyAv
LyBDb3ZlcmFnZSBGb3JtYXQgMiAoZS5nLiwgS296dWthIEdvdGhpYykKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IE9UQ292ZXJhZ2UyVGFibGUqIGMyID0gcmVpbnRlcnByZXRfY2FzdDxj
b25zdCBPVENvdmVyYWdlMlRhYmxlKj4oY292ZXJhZ2UpOworICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlkRW5kKGMyICsgMSkpCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgT1RDb3ZlcmFnZTJUYWJsZTo6UmFuZ2VSZWNvcmQqIHJhbmdlRW5kID0gYzIt
PnJhbmdlRW5kKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdG9yICYmICF2
YWxpZGF0b3ItPmlzVmFsaWRFbmQocmFuZ2VFbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgT1RD
b3ZlcmFnZTJUYWJsZTo6UmFuZ2VSZWNvcmQqIHJhbmdlID0gYzItPnJhbmdlQmVnaW4oKTsgcmFu
Z2UgIT0gcmFuZ2VFbmQ7ICsrcmFuZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1
aW50MTZfdCBmcm9tID0gcmFuZ2UtPnN0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVpbnQxNl90IGZyb21FbmQgPSByYW5nZS0+ZW5kICsgMTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1aW50MTZfdCBjb3VudEZyb20gPSBmcm9tRW5kIC0gZnJvbTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIU9UUHRyUmFuZ2U6OmFzc2VydElzVHJ1ZShjb3VudEZyb20g
PD0gY291bnRUbykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudFRvIC09IGNvdW50RnJvbTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5kOyArK2Zyb20s
ICsrdG8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KGZyb20sICp0
byk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIU9UUHRyUmFuZ2U6OmFzc2VydElzVHJ1ZSghY291bnRUbykpCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7
IH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAg
IExPR19FUlJPUigiQ292ZXJhZ2VGb3JtYXQgJWQgbm90IHN1cHBvcnRlZCIsICpjb3ZlcmFnZSk7
CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICBicmVhazsgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6Cisg
ICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiU3Vic3RGb3JtYXQgJWQgbm90IHN1cHBvcnRl
ZCIsIHN1Yi0+c3Vic3RGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19FUlJPUigiTG9va3VwVHlwZSAlZCBub3Qgc3VwcG9y
dGVkIiwgbG9va3VwVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgT1RMb29rdXBMaXN0IDogT1RUYWJs
ZSB7CisgICAgT1RVSW50MTYgbG9va3VwQ291bnQ7CisgICAgT1RPZmZzZXQgbG9va3VwT2Zmc2V0
c1sxXTsKKworICAgIGNvbnN0IE9UTG9va3VwVGFibGUqIGxvb2t1cFRhYmxlKHVpbnQxNl90IGlu
ZGV4LCBjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICB1
aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50OworICAgICAgICBpZiAoIU9UUHRyUmFuZ2U6OmFz
c2VydElzVHJ1ZShpbmRleCA8IGNvdW50KSB8fCAodmFsaWRhdG9yICYmICF2YWxpZGF0b3ItPmlz
VmFsaWRFbmQoJmxvb2t1cE9mZnNldHNbY291bnRdKSkpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgcmV0dXJuIHB0cjxPVExvb2t1cFRhYmxlPihsb29rdXBPZmZzZXRzW2luZGV4XSwg
dmFsaWRhdG9yKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgT1RGZWF0dXJlVGFibGUgeworICAgIE9U
T2Zmc2V0IGZlYXR1cmVQYXJhbXM7CisgICAgT1RVSW50MTYgbG9va3VwQ291bnQ7CisgICAgT1RV
SW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAgY29uc3QgT1RVSW50MTYqIGxvb2t1cElu
ZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiAmbG9va3VwTGlzdEluZGV4WzBdOyB9CisgICAgY29u
c3QgT1RVSW50MTYqIGxvb2t1cEluZGV4RW5kKCkgY29uc3QgeyByZXR1cm4gJmxvb2t1cExpc3RJ
bmRleFtsb29rdXBDb3VudF07IH0KK307CisKK3N0cnVjdCBPVExhbmdTeXNUYWJsZSB7CisgICAg
T1RPZmZzZXQgbG9va3VwT3JkZXI7CisgICAgT1RVSW50MTYgcmVxRmVhdHVyZUluZGV4OworICAg
IE9UVUludDE2IGZlYXR1cmVDb3VudDsKKyAgICBPVFVJbnQxNiBmZWF0dXJlSW5kZXhbMV07CisK
KyAgICBjb25zdCBPVFVJbnQxNiogZmVhdHVyZUluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiAm
ZmVhdHVyZUluZGV4WzBdOyB9CisgICAgY29uc3QgT1RVSW50MTYqIGZlYXR1cmVJbmRleEVuZCgp
IGNvbnN0IHsgcmV0dXJuICZmZWF0dXJlSW5kZXhbZmVhdHVyZUNvdW50XTsgfQorfTsKKworc3Ry
dWN0IE9URmVhdHVyZUxpc3QgOiBPVFRhYmxlIHsKKyAgICBPVFVJbnQxNiBmZWF0dXJlQ291bnQ7
CisgICAgc3RydWN0IEZlYXR1cmVSZWNvcmQgeworICAgICAgICBPVFRhZyBmZWF0dXJlVGFnOwor
ICAgICAgICBPVE9mZnNldCBmZWF0dXJlT2Zmc2V0OworICAgIH0gZmVhdHVyZXNbMV07CisKKyAg
ICBjb25zdCBPVEZlYXR1cmVMaXN0OjpGZWF0dXJlUmVjb3JkKiBmZWF0dXJlUmVjb3JkKHVpbnQx
Nl90IGluZGV4LCBjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAg
ICAgICB1aW50MTZfdCBjb3VudCA9IGZlYXR1cmVDb3VudDsKKyAgICAgICAgaWYgKCFPVFB0clJh
bmdlOjphc3NlcnRJc1RydWUoaW5kZXggPCBjb3VudCkgfHwgKHZhbGlkYXRvciAmJiAhdmFsaWRh
dG9yLT5pc1ZhbGlkRW5kKCZmZWF0dXJlc1tjb3VudF0pKSkKKyAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICByZXR1cm4gJihmZWF0dXJlc1tpbmRleF0pOworICAgIH0KKworICAgIGNvbnN0
IE9URmVhdHVyZVRhYmxlKiBmZWF0dXJlVGFibGUoT1RUYWcgZmVhdHVyZVRhZywgY29uc3QgT1RM
YW5nU3lzVGFibGUqIGxhbmdTeXNUYWJsZSwgY29uc3QgT1RQdHJSYW5nZSogdmFsaWRhdG9yKSBj
b25zdAorICAgIHsKKyAgICAgICAgY29uc3QgT1RVSW50MTYqIGVuZCA9IGxhbmdTeXNUYWJsZS0+
ZmVhdHVyZUluZGV4RW5kKCk7CisgICAgICAgIGlmICh2YWxpZGF0b3IgJiYgIXZhbGlkYXRvci0+
aXNWYWxpZEVuZChlbmQpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvciAoY29u
c3QgT1RVSW50MTYqIGluZGV4ID0gbGFuZ1N5c1RhYmxlLT5mZWF0dXJlSW5kZXhCZWdpbigpOyBp
bmRleCAhPSBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IE9URmVhdHVyZUxpc3Q6
OkZlYXR1cmVSZWNvcmQqIGZyID0gZmVhdHVyZVJlY29yZCgqaW5kZXgsIHZhbGlkYXRvcik7Cisg
ICAgICAgICAgICBpZiAoZnIgJiYgZnItPmZlYXR1cmVUYWcgPT0gZmVhdHVyZVRhZykKKyAgICAg
ICAgICAgICAgICByZXR1cm4gcHRyPE9URmVhdHVyZVRhYmxlPihmci0+ZmVhdHVyZU9mZnNldCwg
dmFsaWRhdG9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCitz
dHJ1Y3QgT1RTY3JpcHRUYWJsZSA6IE9UVGFibGUgeworICAgIE9UT2Zmc2V0IGRlZmF1bHRMYW5n
U3lzT2Zmc2V0OworICAgIE9UVUludDE2IGxhbmdTeXNDb3VudDsKKyAgICBzdHJ1Y3QgTGFuZ1N5
c1JlY29yZCB7CisgICAgICAgIE9UVGFnIGxhbmdTeXNUYWc7CisgICAgICAgIE9UT2Zmc2V0IGxh
bmdTeXNPZmZzZXQ7CisgICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsKKworICAgIGNvbnN0IE9UTGFu
Z1N5c1RhYmxlKiBkZWZhdWx0TGFuZ1N5c1RhYmxlKGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRv
cikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IG9mZnNldCA9IGRlZmF1bHRMYW5nU3lz
T2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIHB0cjxPVExh
bmdTeXNUYWJsZT4ob2Zmc2V0LCB2YWxpZGF0b3IpOworICAgICAgICBpZiAoT1RQdHJSYW5nZTo6
YXNzZXJ0SXNUcnVlKGxhbmdTeXNDb3VudCkpCisgICAgICAgICAgICByZXR1cm4gcHRyPE9UTGFu
Z1N5c1RhYmxlPihsYW5nU3lzUmVjb3Jkc1swXS5sYW5nU3lzT2Zmc2V0LCB2YWxpZGF0b3IpOwor
ICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCitzdHJ1Y3QgT1RTY3JpcHRMaXN0IDogT1RU
YWJsZSB7CisgICAgT1RVSW50MTYgc2NyaXB0Q291bnQ7CisgICAgc3RydWN0IFNjcmlwdFJlY29y
ZCB7CisgICAgICAgIE9UVGFnIHNjcmlwdFRhZzsKKyAgICAgICAgT1RPZmZzZXQgc2NyaXB0T2Zm
c2V0OworICAgIH0gc2NyaXB0c1sxXTsKKworICAgIGNvbnN0IE9UU2NyaXB0VGFibGUqIHNjcmlw
dFRhYmxlRm9yVGFnKE9UVGFnIHRhZywgY29uc3QgT1RQdHJSYW5nZSogdmFsaWRhdG9yKSBjb25z
dAorICAgIHsKKyAgICAgICAgY29uc3QgU2NyaXB0UmVjb3JkKiBlbmQgPSAmKHNjcmlwdHNbc2Ny
aXB0Q291bnRdKTsKKyAgICAgICAgaWYgKHZhbGlkYXRvciAmJiAhdmFsaWRhdG9yLT5pc1ZhbGlk
RW5kKGVuZCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yIChjb25zdCBTY3Jp
cHRSZWNvcmQqIHNyID0gc2NyaXB0czsgc3IgIT0gZW5kOyArK3NyKQorICAgICAgICAgICAgaWYg
KHNyLT5zY3JpcHRUYWcgPT0gdGFnKQorICAgICAgICAgICAgICAgIHJldHVybiBwdHI8T1RTY3Jp
cHRUYWJsZT4oc3ItPnNjcmlwdE9mZnNldCwgdmFsaWRhdG9yKTsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorCisgICAgY29uc3QgT1RTY3JpcHRUYWJsZSogZGVmYXVsdFNjcmlwdFRhYmxlKGNv
bnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IE9U
U2NyaXB0VGFibGUqIHQgPSBzY3JpcHRUYWJsZUZvclRhZyhPVERlZmF1bHRTY3JpcHRUYWcsIHZh
bGlkYXRvcik7CisgICAgICAgIGlmICghdCAmJiBzY3JpcHRDb3VudCkKKyAgICAgICAgICAgIHQg
PSBwdHI8T1RTY3JpcHRUYWJsZT4oc2NyaXB0c1swXS5zY3JpcHRPZmZzZXQsIHZhbGlkYXRvcik7
CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIGNvbnN0IE9UTGFuZ1N5c1RhYmxlKiBk
ZWZhdWx0TGFuZ1N5c1RhYmxlKGNvbnN0IE9UUHRyUmFuZ2UqIHZhbGlkYXRvcikgY29uc3QKKyAg
ICB7CisgICAgICAgIGNvbnN0IE9UU2NyaXB0VGFibGUqIHNjcmlwdFRhYmxlID0gZGVmYXVsdFNj
cmlwdFRhYmxlKHZhbGlkYXRvcik7CisgICAgICAgIGlmICghc2NyaXB0VGFibGUpCisgICAgICAg
ICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHNjcmlwdFRhYmxlLT5kZWZhdWx0TGFuZ1N5
c1RhYmxlKHZhbGlkYXRvcik7CisgICAgfQorfTsKKworc3RydWN0IE9UR1NVQlRhYmxlIDogT1RU
YWJsZSB7CisgICAgT1RGaXhlZCB2ZXJzaW9uOworICAgIE9UT2Zmc2V0IHNjcmlwdExpc3RPZmZz
ZXQ7CisgICAgT1RPZmZzZXQgZmVhdHVyZUxpc3RPZmZzZXQ7CisgICAgT1RPZmZzZXQgbG9va3Vw
TGlzdE9mZnNldDsKKworICAgIGNvbnN0IE9UU2NyaXB0TGlzdCogc2NyaXB0TGlzdChjb25zdCBP
VFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0IHsgcmV0dXJuIHB0cjxPVFNjcmlwdExpc3Q+KHNj
cmlwdExpc3RPZmZzZXQsIHZhbGlkYXRvcik7IH0KKyAgICBjb25zdCBPVEZlYXR1cmVMaXN0KiBm
ZWF0dXJlTGlzdChjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0IHsgcmV0dXJuIHB0
cjxPVEZlYXR1cmVMaXN0PihmZWF0dXJlTGlzdE9mZnNldCwgdmFsaWRhdG9yKTsgfQorICAgIGNv
bnN0IE9UTG9va3VwTGlzdCogbG9va3VwTGlzdChjb25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3Ip
IGNvbnN0IHsgcmV0dXJuIHB0cjxPVExvb2t1cExpc3Q+KGxvb2t1cExpc3RPZmZzZXQsIHZhbGlk
YXRvcik7IH0KKyAgICBjb25zdCBPVExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXNUYWJsZShj
b25zdCBPVFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0IHsgcmV0dXJuIHNjcmlwdExpc3QodmFs
aWRhdG9yKS0+ZGVmYXVsdExhbmdTeXNUYWJsZSh2YWxpZGF0b3IpOyB9CisKKyAgICBjb25zdCBP
VEZlYXR1cmVUYWJsZSogZmVhdHVyZVRhYmxlKE9UVGFnIGZlYXR1cmVUYWcsIGNvbnN0IE9UUHRy
UmFuZ2UqIHZhbGlkYXRvcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IE9UTGFuZ1N5c1Rh
YmxlKiBsYW5nU3lzVGFibGUgPSBkZWZhdWx0TGFuZ1N5c1RhYmxlKHZhbGlkYXRvcik7CisgICAg
ICAgIGlmICghbGFuZ1N5c1RhYmxlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNv
bnN0IE9URmVhdHVyZUxpc3QqIGZlYXR1cmVzID0gZmVhdHVyZUxpc3QodmFsaWRhdG9yKTsKKyAg
ICAgICAgaWYgKCFmZWF0dXJlcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1
cm4gZmVhdHVyZXMtPmZlYXR1cmVUYWJsZShmZWF0dXJlVGFnLCBsYW5nU3lzVGFibGUsIHZhbGlk
YXRvcik7CisgICAgfQorCisgICAgYm9vbCBnZXRHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgT1RG
ZWF0dXJlVGFibGUqIGZlYXR1cmUsIEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBjb25zdCBP
VFB0clJhbmdlKiB2YWxpZGF0b3IpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBPVExvb2t1
cExpc3QqIGxvb2t1cHMgPSBsb29rdXBMaXN0KHZhbGlkYXRvcik7CisgICAgICAgIGlmICghbG9v
a3VwcykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29uc3QgT1RVSW50MTYq
IGVuZCA9IGZlYXR1cmUtPmxvb2t1cEluZGV4RW5kKCk7CisgICAgICAgIGlmICh2YWxpZGF0b3Ig
JiYgIXZhbGlkYXRvci0+aXNWYWxpZEVuZChlbmQpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBmb3IgKGNvbnN0IE9UVUludDE2KiBpbmRleCA9IGZlYXR1cmUtPmxvb2t1cElu
ZGV4QmVnaW4oKTsgaW5kZXggIT0gZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBP
VExvb2t1cFRhYmxlKiBsb29rdXAgPSBsb29rdXBzLT5sb29rdXBUYWJsZSgqaW5kZXgsIHZhbGlk
YXRvcik7CisgICAgICAgICAgICBpZiAoIWxvb2t1cCB8fCAhbG9va3VwLT5nZXRTdWJzdGl0dXRp
b25zKG1hcCwgdmFsaWRhdG9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBnZXRWZXJ0aWNh
bEdseXBoU3Vic3RpdHV0aW9ucyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgT1RQ
dHJSYW5nZSogdmFsaWRhdG9yKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgT1RGZWF0dXJl
VGFibGUqIGZlYXR1cmUgPSBmZWF0dXJlVGFibGUoT1RWZXJ0RmVhdHVyZVRhZywgdmFsaWRhdG9y
KTsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmUgJiYgZ2V0R2x5cGhTdWJzdGl0dXRpb25zKGZlYXR1
cmUsIG1hcCwgdmFsaWRhdG9yKTsKKyAgICB9Cit9OworCiAjcHJhZ21hIHBhY2soKQogCiBPcGVu
VHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3Jt
RGF0YSYgcGxhdGZvcm1EYXRhKQpAQCAtMTc3LDYgKzQ5MiwxNSBAQCBPcGVuVHlwZVZlcnRpY2Fs
RGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZv
cm1EYXRhKQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCisgICAgLy8gTG9hZCB2
ZXJ0aWNhbCBnbHlwaCBzdWJzdGl0dXRpb25zLgorICAgIHNpemVfdCBnc3ViU2l6ZTsKKyAgICBP
d25QdHI8T1RHU1VCVGFibGU+IGdzdWIocGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGU8T1RHU1VC
VGFibGU+KE9UR1NVQlRhZywgJmdzdWJTaXplKSk7CisgICAgaWYgKGdzdWIpIHsKKyAgICAgICAg
T1RQdHJSYW5nZSBnc3ViVmFsaWRhdG9yKGdzdWIuZ2V0KCksIGdzdWJTaXplKTsKKyAgICAgICAg
Z3N1Yi0+Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoJm1fdmVydGljYWxHbHlwaE1hcCwg
JmdzdWJWYWxpZGF0b3IpOworICAgICAgICBnc3ViLmNsZWFyKCk7CisgICAgfQogfQogCiBmbG9h
dCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6YWR2YW5jZUhlaWdodChjb25zdCBTaW1wbGVGb250RGF0
YSogZm9udCwgR2x5cGggZ2x5cGgpIGNvbnN0CkBAIC0yMzUsNCArNTU5LDIxIEBAIHZvaWQgT3Bl
blR5cGVWZXJ0aWNhbERhdGE6OmdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5cGhzKGNvbnN0
IFNpbXBsZUZvbnREYXRhCiAgICAgfQogfQogCit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpz
dWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBH
bHlwaFBhZ2UqIGdseXBoUGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNv
bnN0Cit7CisgICAgY29uc3QgSGFzaE1hcDxHbHlwaCwgR2x5cGg+JiBtYXAgPSBtX3ZlcnRpY2Fs
R2x5cGhNYXA7CisgICAgaWYgKG1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGZvciAodW5zaWduZWQgaW5kZXggPSBvZmZzZXQsIGVuZCA9IG9mZnNldCArIGxlbmd0aDsgaW5k
ZXggPCBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSBnbHlwaFBhZ2UtPmds
eXBoQXQoaW5kZXgpOworICAgICAgICBpZiAoZ2x5cGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChn
bHlwaFBhZ2UtPmdseXBoRGF0YUZvckluZGV4KGluZGV4KS5mb250RGF0YSA9PSBmb250KTsKKyAg
ICAgICAgICAgIEdseXBoIHRvID0gbWFwLmdldChnbHlwaCk7CisgICAgICAgICAgICBpZiAodG8p
CisgICAgICAgICAgICAgICAgZ2x5cGhQYWdlLT5zZXRHbHlwaERhdGFGb3JJbmRleChpbmRleCwg
dG8sIGZvbnQpOworICAgICAgICB9CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9P
cGVuVHlwZVZlcnRpY2FsRGF0YS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
b3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAppbmRleCA3NjdiM2VmLi43ODY4NGNjIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVu
VHlwZVZlcnRpY2FsRGF0YS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKQEAgLTQ0LDYgKzQ0LDcgQEAgcHVibGlj
OgogICAgIGJvb2wgaGFzVmVydGljYWxNZXRyaWNzKCkgY29uc3QgeyByZXR1cm4gIW1fYWR2YW5j
ZUhlaWdodHMuaXNFbXB0eSgpOyB9CiAgICAgZmxvYXQgYWR2YW5jZUhlaWdodChjb25zdCBTaW1w
bGVGb250RGF0YSosIEdseXBoKSBjb25zdDsKICAgICB2b2lkIGdldFZlcnRpY2FsVHJhbnNsYXRp
b25zRm9yR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgY29uc3QgR2x5cGgqLCBzaXplX3Qs
IGZsb2F0KiBvdXRYWUFycmF5KSBjb25zdDsKKyAgICB2b2lkIHN1YnN0aXR1dGVXaXRoVmVydGlj
YWxHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqLCBHbHlwaFBhZ2UqLCB1bnNpZ25lZCBvZmZz
ZXQsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgYm9vbCBoYXNWT1JH
KCkgY29uc3QgeyByZXR1cm4gIW1fdmVydE9yaWdpblkuaXNFbXB0eSgpOyB9CkBAIC01NCw2ICs1
NSw3IEBAIHByaXZhdGU6CiAgICAgVmVjdG9yPGludDE2X3Q+IG1fdG9wU2lkZUJlYXJpbmdzOwog
ICAgIGludDE2X3QgbV9kZWZhdWx0VmVydE9yaWdpblk7CiAgICAgSGFzaE1hcDxHbHlwaCwgaW50
MTZfdD4gbV92ZXJ0T3JpZ2luWTsKKyAgICBIYXNoTWFwPEdseXBoLCBHbHlwaD4gbV92ZXJ0aWNh
bEdseXBoTWFwOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>132502</attachid>
            <date>2012-03-18 14:44:49 -0700</date>
            <delta_ts>2012-03-28 14:35:53 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-3.patch</filename>
            <type>text/plain</type>
            <size>18936</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBiNTAxMDAxLi45ZGZiODBiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNzQg
QEAKIDIwMTItMDMtMTggIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CiAKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAn
R1NVQicgT3BlblR5cGUgdGFibGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBn
bHlwaHMuCisKKyAgICAgICAgTGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkg
Y29kZSBwYXRoIHlldC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOiBBZGRlZCBuZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoT1RUYWJs
ZSk6CisgICAgICAgIChPcGVuVHlwZTo6T1RUYWJsZTo6aXNWYWxpZCk6CisgICAgICAgIChPcGVu
VHlwZTo6T1RUYWJsZTo6aXNWYWxpZEVuZCk6CisgICAgICAgIChPcGVuVHlwZTo6T1RUYWJsZTo6
cHRyKToKKyAgICAgICAgKE9wZW5UeXBlKToKKyAgICAgICAgKE9UQ292ZXJhZ2VUYWJsZSk6Cisg
ICAgICAgIChPVENvdmVyYWdlMVRhYmxlKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVENvdmVyYWdl
MVRhYmxlOjpnbHlwaEJlZ2luKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVENvdmVyYWdlMVRhYmxl
OjpnbHlwaEVuZCk6CisgICAgICAgIChPVENvdmVyYWdlMlRhYmxlKToKKyAgICAgICAgKFJhbmdl
UmVjb3JkKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVENvdmVyYWdlMlRhYmxlOjpyYW5nZUJlZ2lu
KToKKyAgICAgICAgKE9wZW5UeXBlOjpPVENvdmVyYWdlMlRhYmxlOjpyYW5nZUVuZCk6CisgICAg
ICAgIChPVFN1YnN0aXR1dGlvblN1YlRhYmxlKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVFN1YnN0
aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZVRhYmxlKToKKyAgICAgICAgKE9UU2luZ2xlU3Vic3Rp
dHV0aW9uMlN1YlRhYmxlKToKKyAgICAgICAgKE9UTG9va3VwVGFibGUpOgorICAgICAgICAoT3Bl
blR5cGU6Ok9UTG9va3VwVGFibGU6OmdldFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoT1RMb29r
dXBMaXN0KToKKyAgICAgICAgKE9wZW5UeXBlOjpPVExvb2t1cExpc3Q6Omxvb2t1cFRhYmxlKToK
KyAgICAgICAgKE9URmVhdHVyZVRhYmxlKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVEZlYXR1cmVU
YWJsZTo6bG9va3VwSW5kZXhCZWdpbik6CisgICAgICAgIChPcGVuVHlwZTo6T1RGZWF0dXJlVGFi
bGU6Omxvb2t1cEluZGV4RW5kKToKKyAgICAgICAgKE9UTGFuZ1N5c1RhYmxlKToKKyAgICAgICAg
KE9wZW5UeXBlOjpPVExhbmdTeXNUYWJsZTo6ZmVhdHVyZUluZGV4QmVnaW4pOgorICAgICAgICAo
T3BlblR5cGU6Ok9UTGFuZ1N5c1RhYmxlOjpmZWF0dXJlSW5kZXhFbmQpOgorICAgICAgICAoT1RG
ZWF0dXJlTGlzdCk6CisgICAgICAgIChGZWF0dXJlUmVjb3JkKToKKyAgICAgICAgKE9wZW5UeXBl
OjpPVEZlYXR1cmVMaXN0OjpmZWF0dXJlUmVjb3JkKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVEZl
YXR1cmVMaXN0OjpmZWF0dXJlVGFibGUpOgorICAgICAgICAoT1RTY3JpcHRUYWJsZSk6CisgICAg
ICAgIChMYW5nU3lzUmVjb3JkKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVFNjcmlwdFRhYmxlOjpk
ZWZhdWx0TGFuZ1N5c1RhYmxlKToKKyAgICAgICAgKE9UU2NyaXB0TGlzdCk6CisgICAgICAgIChT
Y3JpcHRSZWNvcmQpOgorICAgICAgICAoT3BlblR5cGU6Ok9UU2NyaXB0TGlzdDo6c2NyaXB0VGFi
bGVGb3JUYWcpOgorICAgICAgICAoT3BlblR5cGU6Ok9UU2NyaXB0TGlzdDo6ZGVmYXVsdFNjcmlw
dFRhYmxlKToKKyAgICAgICAgKE9wZW5UeXBlOjpPVFNjcmlwdExpc3Q6OmRlZmF1bHRMYW5nU3lz
VGFibGUpOgorICAgICAgICAoT1RHU1VCVGFibGUpOgorICAgICAgICAoT3BlblR5cGU6Ok9UR1NV
QlRhYmxlOjpzY3JpcHRMaXN0KToKKyAgICAgICAgKE9wZW5UeXBlOjpPVEdTVUJUYWJsZTo6ZmVh
dHVyZUxpc3QpOgorICAgICAgICAoT3BlblR5cGU6Ok9UR1NVQlRhYmxlOjpsb29rdXBMaXN0KToK
KyAgICAgICAgKE9wZW5UeXBlOjpPVEdTVUJUYWJsZTo6ZGVmYXVsdExhbmdTeXNUYWJsZSk6Cisg
ICAgICAgIChPcGVuVHlwZTo6T1RHU1VCVGFibGU6OmZlYXR1cmVUYWJsZSk6CisgICAgICAgIChP
cGVuVHlwZTo6T1RHU1VCVGFibGU6OmdldEdseXBoU3Vic3RpdHV0aW9ucyk6CisgICAgICAgIChP
cGVuVHlwZTo6T1RHU1VCVGFibGU6OmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0
YSk6CisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlVmVydGlj
YWxEYXRhOjpsb2FkTWV0cmljcyk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZVZlcnRpY2Fs
RGF0YTo6bG9hZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wZW5UeXBlVmVydGljYWxEYXRhOjpzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKTogU3Vi
c3RpdHV0ZSBHbHlwaCBJRHMgd2l0aCB2ZXJ0aWNhbCBhbHRlcm5hdGUgR2x5cGggSURzLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmg6
CisgICAgICAgIChPcGVuVHlwZVZlcnRpY2FsRGF0YSk6IEFkZCBtX3ZlcnRpY2FsR2x5cGhNYXAu
CisKKzIwMTItMDMtMTggIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKICAgICAg
ICAgVmVydGljYWwgZmxvdyBzdXBwb3J0IGZvciBPcGVuVHlwZSBmb250cyB3aXRoIHRoZSBsZWFz
dCBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTgxMzI2CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcCBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNw
cAppbmRleCAxOWM5NDkyLi4zN2ZiZjkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwCkBAIC0zOSw2ICszOSw3IEBAIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwogbmFtZXNw
YWNlIE9wZW5UeXBlIHsKIAogZW51bSB7CisgICAgT1RHU1VCVGFnID0gT1RfTUFLRV9UQUcoJ0cn
LCAnUycsICdVJywgJ0InKSwKICAgICBPVEhoZWFUYWcgPSBPVF9NQUtFX1RBRygnaCcsICdoJywg
J2UnLCAnYScpLAogICAgIE9USG10eFRhZyA9IE9UX01BS0VfVEFHKCdoJywgJ20nLCAndCcsICd4
JyksCiAgICAgT1RWaGVhVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKQEAg
LTQ2LDYgKzQ3LDM4IEBAIGVudW0gewogICAgIE9UVk9SR1RhZyA9IE9UX01BS0VfVEFHKCdWJywg
J08nLCAnUicsICdHJyksCiB9OwogCitlbnVtIHsKKyAgICBPVERlZmF1bHRTY3JpcHRUYWcgPSBP
VF9NQUtFX1RBRygnRCcsICdGJywgJ0wnLCAnVCcpLAorfTsKKworZW51bSB7CisgICAgT1RWZXJ0
RmVhdHVyZVRhZyA9IE9UX01BS0VfVEFHKCd2JywgJ2UnLCAncicsICd0JyksCit9OworCitzdHJ1
Y3QgT1RUYWJsZSB7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChib29sIHZh
bHVlKQorICAgIHsKKyAgICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgICAgIExPR19FUlJPUigi
SW52YWxpZCBPcGVuVHlwZSBkYXRhIGRldGVjdGVkIik7CisgICAgICAgIHJldHVybiB2YWx1ZTsK
KyAgICB9CisKKyAgICBib29sIGlzVmFsaWRFbmQoY29uc3Qgdm9pZCogcCwgY29uc3QgU2hhcmVk
QnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVp
bnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocCkgLSBidWZmZXIuZGF0YSgpOworICAgICAgICBy
ZXR1cm4gaXNWYWxpZChvZmZzZXQgPD0gYnVmZmVyLnNpemUoKSk7IC8vICI8PSIgYmVjYXVzZSBl
bmQgaXMgaW5jbHVkZWQgYXMgdmFsaWQKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUg
VD4gY29uc3QgVCogcHRyKHVpbnQxNl90IG9mZnNldCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZm
ZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBUKiBwdHIgPSByZWludGVycHJldF9jYXN0
PGNvbnN0IFQqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+KHRoaXMpICsgb2Zmc2V0
KTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKHB0ciArIDEsIGJ1ZmZlcikpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9Cit9OworCiAjcHJhZ21hIHBh
Y2soMSkKIAogc3RydWN0IE9USGhlYVRhYmxlIHsKQEAgLTEwNyw2ICsxNDAsMjc5IEBAIHN0cnVj
dCBPVFZPUkdUYWJsZSB7CiAgICAgfSB2ZXJ0T3JpZ2luWU1ldHJpY3NbMV07CiB9OwogCitzdHJ1
Y3QgT1RDb3ZlcmFnZVRhYmxlIDogT1RUYWJsZSB7CisgICAgT1RVSW50MTYgY292ZXJhZ2VGb3Jt
YXQ7Cit9OworCitzdHJ1Y3QgT1RDb3ZlcmFnZTFUYWJsZSA6IE9UQ292ZXJhZ2VUYWJsZSB7Cisg
ICAgT1RVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPVEdseXBoSUQgZ2x5cGhBcnJheVsxXTsKKwor
ICAgIGNvbnN0IE9UR2x5cGhJRCogZ2x5cGhCZWdpbigpIGNvbnN0IHsgcmV0dXJuICZnbHlwaEFy
cmF5WzBdOyB9CisgICAgY29uc3QgT1RHbHlwaElEKiBnbHlwaEVuZCgpIGNvbnN0IHsgcmV0dXJu
ICZnbHlwaEFycmF5W2dseXBoQ291bnRdOyB9Cit9OworCitzdHJ1Y3QgT1RDb3ZlcmFnZTJUYWJs
ZSA6IE9UQ292ZXJhZ2VUYWJsZSB7CisgICAgT1RVSW50MTYgcmFuZ2VDb3VudDsKKyAgICBzdHJ1
Y3QgUmFuZ2VSZWNvcmQgeworICAgICAgICBPVEdseXBoSUQgc3RhcnQ7CisgICAgICAgIE9UR2x5
cGhJRCBlbmQ7CisgICAgICAgIE9UVUludDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJh
bmdlc1sxXTsKKworICAgIGNvbnN0IFJhbmdlUmVjb3JkKiByYW5nZUJlZ2luKCkgY29uc3QgeyBy
ZXR1cm4gJnJhbmdlc1swXTsgfQorICAgIGNvbnN0IFJhbmdlUmVjb3JkKiByYW5nZUVuZCgpIGNv
bnN0IHsgcmV0dXJuICZyYW5nZXNbcmFuZ2VDb3VudF07IH0KK307CisKK3N0cnVjdCBPVFN1YnN0
aXR1dGlvblN1YlRhYmxlIDogT1RUYWJsZSB7CisgICAgT1RVSW50MTYgc3Vic3RGb3JtYXQ7Cisg
ICAgT1RPZmZzZXQgY292ZXJhZ2VPZmZzZXQ7CisKKyAgICBjb25zdCBPVENvdmVyYWdlVGFibGUq
IGNvdmVyYWdlVGFibGUoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJu
IHB0cjxPVENvdmVyYWdlVGFibGU+KGNvdmVyYWdlT2Zmc2V0LCBidWZmZXIpOyB9Cit9OworCitz
dHJ1Y3QgT1RTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUgOiBPVFN1YnN0aXR1dGlvblN1YlRh
YmxlIHsKKyAgICBPVFVJbnQxNiBnbHlwaENvdW50OworICAgIE9UR2x5cGhJRCBzdWJzdGl0dXRl
WzFdOworfTsKKworc3RydWN0IE9UTG9va3VwVGFibGUgOiBPVFRhYmxlIHsKKyAgICBPVFVJbnQx
NiBsb29rdXBUeXBlOworICAgIE9UVUludDE2IGxvb2t1cEZsYWc7CisgICAgT1RVSW50MTYgc3Vi
VGFibGVDb3VudDsKKyAgICBPVE9mZnNldCBzdWJUYWJsZU9mZnNldHNbMV07CisgICAgLy8gT1RV
SW50MTYgbWFya0ZpbHRlcmluZ1NldDsgdGhpcyBmaWVsZCBjb21lcyBhZnRlciB2YXJpYWJsZSBs
ZW5ndGgsIHNvIG9mZnNldCBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5LgorCisgICAgYm9vbCBn
ZXRTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBjb25zdCBTaGFyZWRC
dWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHN3aXRjaCAobG9va3VwVHlwZSkg
eworICAgICAgICBjYXNlIDE6IC8vIFNpbmdsZSBTdWJzdGl0dXRpb24gU3VidGFibGUKKyAgICAg
ICAgICAgIGZvciAoaW50IGkgPSAwLCBjID0gc3ViVGFibGVDb3VudDsgaSA8IGM7ICsraSkgewor
ICAgICAgICAgICAgICAgIGNvbnN0IE9UU3Vic3RpdHV0aW9uU3ViVGFibGUqIHN1YiA9IHB0cjxP
VFN1YnN0aXR1dGlvblN1YlRhYmxlPihzdWJUYWJsZU9mZnNldHNbaV0sIGJ1ZmZlcik7CisgICAg
ICAgICAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgICAgICBjb25zdCBPVENvdmVyYWdlVGFibGUqIGNvdmVyYWdlID0gc3ViLT5j
b3ZlcmFnZVRhYmxlKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZSkKKyAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHN3aXRjaCAo
c3ViLT5zdWJzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBTaW5nbGUg
U3Vic3RpdHV0aW9uIEZvcm1hdCAyCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9UU2luZ2xl
U3Vic3RpdHV0aW9uMlN1YlRhYmxlKiBzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT1RTaW5n
bGVTdWJzdGl0dXRpb24yU3ViVGFibGUqPihzdWIpOworICAgICAgICAgICAgICAgICAgICBpZiAo
IWlzVmFsaWRFbmQoczIgKyAxLCBidWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb25zdCBPVEdseXBoSUQqIHRvID0gJnMy
LT5zdWJzdGl0dXRlWzBdOworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudFRvID0g
czItPmdseXBoQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEVuZCh0byAr
IGNvdW50VG8sIGJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY292ZXJhZ2UtPmNvdmVyYWdlRm9ybWF0KSB7
CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogeyAvLyBDb3ZlcmFnZSBGb3JtYXQgMSAoZS5n
LiwgTVMgR290aGljKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1RDb3ZlcmFnZTFU
YWJsZSogYzEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IE9UQ292ZXJhZ2UxVGFibGUqPihjb3Zl
cmFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYzEgKyAxLCBi
dWZmZXIpIHx8ICFpc1ZhbGlkKGNvdW50VG8gPT0gYzEtPmdseXBoQ291bnQpKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IE9UR2x5cGhJRCogZnJvbUVuZCA9IGMxLT5nbHlwaEVuZCgpOworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGZyb21FbmQsIGJ1ZmZlcikpCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAg
Zm9yIChjb25zdCBPVEdseXBoSUQqIGZyb20gPSBjMS0+Z2x5cGhCZWdpbigpOyBmcm9tICE9IGZy
b21FbmQ7ICsrZnJvbSwgKyt0bykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAtPnNl
dCgqZnJvbSwgKnRvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAg
ICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBDb3ZlcmFnZSBGb3JtYXQgMiAoZS5nLiwgS296dWth
IEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9UQ292ZXJhZ2UyVGFibGUq
IGMyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBPVENvdmVyYWdlMlRhYmxlKj4oY292ZXJhZ2Up
OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGMyICsgMSwgYnVmZmVy
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBPVENvdmVyYWdlMlRhYmxlOjpSYW5nZVJlY29yZCogcmFuZ2VF
bmQgPSBjMi0+cmFuZ2VFbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxp
ZEVuZChyYW5nZUVuZCwgYnVmZmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IE9UQ292ZXJhZ2Uy
VGFibGU6OlJhbmdlUmVjb3JkKiByYW5nZSA9IGMyLT5yYW5nZUJlZ2luKCk7IHJhbmdlICE9IHJh
bmdlRW5kOyArK3JhbmdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qg
ZnJvbSA9IHJhbmdlLT5zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZf
dCBmcm9tRW5kID0gcmFuZ2UtPmVuZCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dWludDE2X3QgY291bnRGcm9tID0gZnJvbUVuZCAtIGZyb207CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKCFpc1ZhbGlkKGNvdW50RnJvbSA8PSBjb3VudFRvKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvdW50VG8gLT0gY291bnRGcm9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGZvciAoOyBmcm9tICE9IGZyb21FbmQ7ICsrZnJvbSwgKyt0bykKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbWFwLT5zZXQoZnJvbSwgKnRvKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZCghY291bnRUbykpCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ292ZXJhZ2VGb3JtYXQgJWQgbm90IHN1cHBvcnRl
ZCIsIGNvdmVyYWdlLT5jb3ZlcmFnZUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsg
fQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJP
UigiU3Vic3RGb3JtYXQgJWQgbm90IHN1cHBvcnRlZCIsIHN1Yi0+c3Vic3RGb3JtYXQpOworICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19F
UlJPUigiTG9va3VwVHlwZSAlZCBub3Qgc3VwcG9ydGVkIiwgbG9va3VwVHlwZSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9Owor
CitzdHJ1Y3QgT1RMb29rdXBMaXN0IDogT1RUYWJsZSB7CisgICAgT1RVSW50MTYgbG9va3VwQ291
bnQ7CisgICAgT1RPZmZzZXQgbG9va3VwT2Zmc2V0c1sxXTsKKworICAgIGNvbnN0IE9UTG9va3Vw
VGFibGUqIGxvb2t1cFRhYmxlKHVpbnQxNl90IGluZGV4LCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1
ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gbG9va3VwQ291bnQ7
CisgICAgICAgIGlmICghaXNWYWxpZChpbmRleCA8IGNvdW50KSB8fCAhaXNWYWxpZEVuZCgmbG9v
a3VwT2Zmc2V0c1tjb3VudF0sIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgcmV0dXJuIHB0cjxPVExvb2t1cFRhYmxlPihsb29rdXBPZmZzZXRzW2luZGV4XSwgYnVmZmVy
KTsKKyAgICB9Cit9OworCitzdHJ1Y3QgT1RGZWF0dXJlVGFibGUgeworICAgIE9UT2Zmc2V0IGZl
YXR1cmVQYXJhbXM7CisgICAgT1RVSW50MTYgbG9va3VwQ291bnQ7CisgICAgT1RVSW50MTYgbG9v
a3VwTGlzdEluZGV4WzFdOworCisgICAgY29uc3QgT1RVSW50MTYqIGxvb2t1cEluZGV4QmVnaW4o
KSBjb25zdCB7IHJldHVybiAmbG9va3VwTGlzdEluZGV4WzBdOyB9CisgICAgY29uc3QgT1RVSW50
MTYqIGxvb2t1cEluZGV4RW5kKCkgY29uc3QgeyByZXR1cm4gJmxvb2t1cExpc3RJbmRleFtsb29r
dXBDb3VudF07IH0KK307CisKK3N0cnVjdCBPVExhbmdTeXNUYWJsZSB7CisgICAgT1RPZmZzZXQg
bG9va3VwT3JkZXI7CisgICAgT1RVSW50MTYgcmVxRmVhdHVyZUluZGV4OworICAgIE9UVUludDE2
IGZlYXR1cmVDb3VudDsKKyAgICBPVFVJbnQxNiBmZWF0dXJlSW5kZXhbMV07CisKKyAgICBjb25z
dCBPVFVJbnQxNiogZmVhdHVyZUluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiAmZmVhdHVyZUlu
ZGV4WzBdOyB9CisgICAgY29uc3QgT1RVSW50MTYqIGZlYXR1cmVJbmRleEVuZCgpIGNvbnN0IHsg
cmV0dXJuICZmZWF0dXJlSW5kZXhbZmVhdHVyZUNvdW50XTsgfQorfTsKKworc3RydWN0IE9URmVh
dHVyZUxpc3QgOiBPVFRhYmxlIHsKKyAgICBPVFVJbnQxNiBmZWF0dXJlQ291bnQ7CisgICAgc3Ry
dWN0IEZlYXR1cmVSZWNvcmQgeworICAgICAgICBPVFRhZyBmZWF0dXJlVGFnOworICAgICAgICBP
VE9mZnNldCBmZWF0dXJlT2Zmc2V0OworICAgIH0gZmVhdHVyZXNbMV07CisKKyAgICBjb25zdCBP
VEZlYXR1cmVMaXN0OjpGZWF0dXJlUmVjb3JkKiBmZWF0dXJlUmVjb3JkKHVpbnQxNl90IGluZGV4
LCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQx
Nl90IGNvdW50ID0gZmVhdHVyZUNvdW50OworICAgICAgICBpZiAoIWlzVmFsaWQoaW5kZXggPCBj
b3VudCkgfHwgIWlzVmFsaWRFbmQoJmZlYXR1cmVzW2NvdW50XSwgYnVmZmVyKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gJihmZWF0dXJlc1tpbmRleF0pOworICAgIH0K
KworICAgIGNvbnN0IE9URmVhdHVyZVRhYmxlKiBmZWF0dXJlVGFibGUoT1RUYWcgZmVhdHVyZVRh
ZywgY29uc3QgT1RMYW5nU3lzVGFibGUqIGxhbmdTeXNUYWJsZSwgY29uc3QgU2hhcmVkQnVmZmVy
JiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBPVFVJbnQxNiogZW5kID0gbGFu
Z1N5c1RhYmxlLT5mZWF0dXJlSW5kZXhFbmQoKTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGVu
ZCwgYnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKGNvbnN0IE9U
VUludDE2KiBpbmRleCA9IGxhbmdTeXNUYWJsZS0+ZmVhdHVyZUluZGV4QmVnaW4oKTsgaW5kZXgg
IT0gZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBPVEZlYXR1cmVMaXN0OjpGZWF0
dXJlUmVjb3JkKiBmciA9IGZlYXR1cmVSZWNvcmQoKmluZGV4LCBidWZmZXIpOworICAgICAgICAg
ICAgaWYgKGZyICYmIGZyLT5mZWF0dXJlVGFnID09IGZlYXR1cmVUYWcpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIHB0cjxPVEZlYXR1cmVUYWJsZT4oZnItPmZlYXR1cmVPZmZzZXQsIGJ1ZmZlcik7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IE9UU2Ny
aXB0VGFibGUgOiBPVFRhYmxlIHsKKyAgICBPVE9mZnNldCBkZWZhdWx0TGFuZ1N5c09mZnNldDsK
KyAgICBPVFVJbnQxNiBsYW5nU3lzQ291bnQ7CisgICAgc3RydWN0IExhbmdTeXNSZWNvcmQgewor
ICAgICAgICBPVFRhZyBsYW5nU3lzVGFnOworICAgICAgICBPVE9mZnNldCBsYW5nU3lzT2Zmc2V0
OworICAgIH0gbGFuZ1N5c1JlY29yZHNbMV07CisKKyAgICBjb25zdCBPVExhbmdTeXNUYWJsZSog
ZGVmYXVsdExhbmdTeXNUYWJsZShjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAg
ICB7CisgICAgICAgIHVpbnQxNl90IG9mZnNldCA9IGRlZmF1bHRMYW5nU3lzT2Zmc2V0OworICAg
ICAgICBpZiAob2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIHB0cjxPVExhbmdTeXNUYWJsZT4o
b2Zmc2V0LCBidWZmZXIpOworICAgICAgICBpZiAoaXNWYWxpZChsYW5nU3lzQ291bnQpKQorICAg
ICAgICAgICAgcmV0dXJuIHB0cjxPVExhbmdTeXNUYWJsZT4obGFuZ1N5c1JlY29yZHNbMF0ubGFu
Z1N5c09mZnNldCwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3Ry
dWN0IE9UU2NyaXB0TGlzdCA6IE9UVGFibGUgeworICAgIE9UVUludDE2IHNjcmlwdENvdW50Owor
ICAgIHN0cnVjdCBTY3JpcHRSZWNvcmQgeworICAgICAgICBPVFRhZyBzY3JpcHRUYWc7CisgICAg
ICAgIE9UT2Zmc2V0IHNjcmlwdE9mZnNldDsKKyAgICB9IHNjcmlwdHNbMV07CisKKyAgICBjb25z
dCBPVFNjcmlwdFRhYmxlKiBzY3JpcHRUYWJsZUZvclRhZyhPVFRhZyB0YWcsIGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgU2NyaXB0UmVjb3Jk
KiBlbmQgPSAmKHNjcmlwdHNbc2NyaXB0Q291bnRdKTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5k
KGVuZCwgYnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKGNvbnN0
IFNjcmlwdFJlY29yZCogc3IgPSBzY3JpcHRzOyBzciAhPSBlbmQ7ICsrc3IpCisgICAgICAgICAg
ICBpZiAoc3ItPnNjcmlwdFRhZyA9PSB0YWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0cjxP
VFNjcmlwdFRhYmxlPihzci0+c2NyaXB0T2Zmc2V0LCBidWZmZXIpOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9CisKKyAgICBjb25zdCBPVFNjcmlwdFRhYmxlKiBkZWZhdWx0U2NyaXB0VGFibGUo
Y29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBP
VFNjcmlwdFRhYmxlKiB0ID0gc2NyaXB0VGFibGVGb3JUYWcoT1REZWZhdWx0U2NyaXB0VGFnLCBi
dWZmZXIpOworICAgICAgICBpZiAoIXQgJiYgc2NyaXB0Q291bnQpCisgICAgICAgICAgICB0ID0g
cHRyPE9UU2NyaXB0VGFibGU+KHNjcmlwdHNbMF0uc2NyaXB0T2Zmc2V0LCBidWZmZXIpOworICAg
ICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICBjb25zdCBPVExhbmdTeXNUYWJsZSogZGVmYXVs
dExhbmdTeXNUYWJsZShjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7Cisg
ICAgICAgIGNvbnN0IE9UU2NyaXB0VGFibGUqIHNjcmlwdFRhYmxlID0gZGVmYXVsdFNjcmlwdFRh
YmxlKGJ1ZmZlcik7CisgICAgICAgIGlmICghc2NyaXB0VGFibGUpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgcmV0dXJuIHNjcmlwdFRhYmxlLT5kZWZhdWx0TGFuZ1N5c1RhYmxlKGJ1
ZmZlcik7CisgICAgfQorfTsKKworc3RydWN0IE9UR1NVQlRhYmxlIDogT1RUYWJsZSB7CisgICAg
T1RGaXhlZCB2ZXJzaW9uOworICAgIE9UT2Zmc2V0IHNjcmlwdExpc3RPZmZzZXQ7CisgICAgT1RP
ZmZzZXQgZmVhdHVyZUxpc3RPZmZzZXQ7CisgICAgT1RPZmZzZXQgbG9va3VwTGlzdE9mZnNldDsK
KworICAgIGNvbnN0IE9UU2NyaXB0TGlzdCogc2NyaXB0TGlzdChjb25zdCBTaGFyZWRCdWZmZXIm
IGJ1ZmZlcikgY29uc3QgeyByZXR1cm4gcHRyPE9UU2NyaXB0TGlzdD4oc2NyaXB0TGlzdE9mZnNl
dCwgYnVmZmVyKTsgfQorICAgIGNvbnN0IE9URmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0KGNvbnN0
IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiBwdHI8T1RGZWF0dXJlTGlzdD4o
ZmVhdHVyZUxpc3RPZmZzZXQsIGJ1ZmZlcik7IH0KKyAgICBjb25zdCBPVExvb2t1cExpc3QqIGxv
b2t1cExpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHB0cjxP
VExvb2t1cExpc3Q+KGxvb2t1cExpc3RPZmZzZXQsIGJ1ZmZlcik7IH0KKyAgICBjb25zdCBPVExh
bmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXNUYWJsZShjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZl
cikgY29uc3QgeyByZXR1cm4gc2NyaXB0TGlzdChidWZmZXIpLT5kZWZhdWx0TGFuZ1N5c1RhYmxl
KGJ1ZmZlcik7IH0KKworICAgIGNvbnN0IE9URmVhdHVyZVRhYmxlKiBmZWF0dXJlVGFibGUoT1RU
YWcgZmVhdHVyZVRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgewor
ICAgICAgICBjb25zdCBPVExhbmdTeXNUYWJsZSogbGFuZ1N5c1RhYmxlID0gZGVmYXVsdExhbmdT
eXNUYWJsZShidWZmZXIpOworICAgICAgICBpZiAoIWxhbmdTeXNUYWJsZSkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBjb25zdCBPVEZlYXR1cmVMaXN0KiBmZWF0dXJlcyA9IGZlYXR1
cmVMaXN0KGJ1ZmZlcik7CisgICAgICAgIGlmICghZmVhdHVyZXMpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgcmV0dXJuIGZlYXR1cmVzLT5mZWF0dXJlVGFibGUoZmVhdHVyZVRhZywg
bGFuZ1N5c1RhYmxlLCBidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZ2V0R2x5cGhTdWJzdGl0
dXRpb25zKGNvbnN0IE9URmVhdHVyZVRhYmxlKiBmZWF0dXJlLCBIYXNoTWFwPEdseXBoLCBHbHlw
aD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAg
ICBjb25zdCBPVExvb2t1cExpc3QqIGxvb2t1cHMgPSBsb29rdXBMaXN0KGJ1ZmZlcik7CisgICAg
ICAgIGlmICghbG9va3VwcykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29u
c3QgT1RVSW50MTYqIGVuZCA9IGZlYXR1cmUtPmxvb2t1cEluZGV4RW5kKCk7CisgICAgICAgIGlm
ICghaXNWYWxpZEVuZChlbmQsIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGZvciAoY29uc3QgT1RVSW50MTYqIGluZGV4ID0gZmVhdHVyZS0+bG9va3VwSW5kZXhC
ZWdpbigpOyBpbmRleCAhPSBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IE9UTG9v
a3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1cHMtPmxvb2t1cFRhYmxlKCppbmRleCwgYnVmZmVyKTsK
KyAgICAgICAgICAgIGlmICghbG9va3VwIHx8ICFsb29rdXAtPmdldFN1YnN0aXR1dGlvbnMobWFw
LCBidWZmZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIGdldFZlcnRpY2FsR2x5cGhTdWJz
dGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBjb25zdCBTaGFyZWRCdWZmZXIm
IGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IE9URmVhdHVyZVRhYmxlKiBmZWF0
dXJlID0gZmVhdHVyZVRhYmxlKE9UVmVydEZlYXR1cmVUYWcsIGJ1ZmZlcik7CisgICAgICAgIHJl
dHVybiBmZWF0dXJlICYmIGdldEdseXBoU3Vic3RpdHV0aW9ucyhmZWF0dXJlLCBtYXAsIGJ1ZmZl
cik7CisgICAgfQorfTsKKwogI3ByYWdtYSBwYWNrKCkKIAogfSAvLyBuYW1lc3BhY2UgT3BlblR5
cGUKQEAgLTExNiw2ICs0MjIsMTIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogT3BlblR5cGVWZXJ0
aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBs
YXRmb3JtRGF0YSkKICAgICA6IG1fZGVmYXVsdFZlcnRPcmlnaW5ZKDApCiB7CisgICAgbG9hZE1l
dHJpY3MocGxhdGZvcm1EYXRhKTsKKyAgICBsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMo
cGxhdGZvcm1EYXRhKTsKK30KKwordm9pZCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6bG9hZE1ldHJp
Y3MoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQorewogICAgIC8vIExvYWQg
aGhlYSBhbmQgaG10eCB0byBnZXQgeC1jb21wb25lbnQgb2YgdmVydGljYWwgb3JpZ2lucy4KICAg
ICAvLyBJZiB0aGVzZSB0YWJsZXMgYXJlIG1pc3NpbmcsIGl0J3Mgbm90IGFuIE9wZW5UeXBlIGZv
bnQuCiAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5U
eXBlVGFibGUoT1RIaGVhVGFnKTsKQEAgLTE5NSw2ICs1MDcsMTUgQEAgT3BlblR5cGVWZXJ0aWNh
bERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRm
b3JtRGF0YSkKICAgICB9CiB9CiAKK3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0
aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURh
dGEpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gcGxhdGZvcm1EYXRhLm9w
ZW5UeXBlVGFibGUoT1RHU1VCVGFnKTsKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPnNpemUo
KSA8IHNpemVvZihPVEdTVUJUYWJsZSkpCisgICAgICAgIHJldHVybjsKKyAgICBjb25zdCBPVEdT
VUJUYWJsZSogZ3N1YiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgT1RHU1VCVGFibGUqPihidWZm
ZXItPmRhdGEoKSk7CisgICAgZ3N1Yi0+Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoJm1f
dmVydGljYWxHbHlwaE1hcCwgKmJ1ZmZlci5nZXQoKSk7Cit9CisKIGZsb2F0IE9wZW5UeXBlVmVy
dGljYWxEYXRhOjphZHZhbmNlSGVpZ2h0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBHbHlw
aCBnbHlwaCkgY29uc3QKIHsKICAgICBzaXplX3QgY291bnRIZWlnaHRzID0gbV9hZHZhbmNlSGVp
Z2h0cy5zaXplKCk7CkBAIC0yNTEsNCArNTcyLDIxIEBAIHZvaWQgT3BlblR5cGVWZXJ0aWNhbERh
dGE6OmdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
CiAgICAgfQogfQogCit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpzdWJzdGl0dXRlV2l0aFZl
cnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBHbHlwaFBhZ2UqIGdseXBo
UGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgY29u
c3QgSGFzaE1hcDxHbHlwaCwgR2x5cGg+JiBtYXAgPSBtX3ZlcnRpY2FsR2x5cGhNYXA7CisgICAg
aWYgKG1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQg
aW5kZXggPSBvZmZzZXQsIGVuZCA9IG9mZnNldCArIGxlbmd0aDsgaW5kZXggPCBlbmQ7ICsraW5k
ZXgpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSBnbHlwaFBhZ2UtPmdseXBoQXQoaW5kZXgpOwor
ICAgICAgICBpZiAoZ2x5cGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChnbHlwaFBhZ2UtPmdseXBo
RGF0YUZvckluZGV4KGluZGV4KS5mb250RGF0YSA9PSBmb250KTsKKyAgICAgICAgICAgIEdseXBo
IHRvID0gbWFwLmdldChnbHlwaCk7CisgICAgICAgICAgICBpZiAodG8pCisgICAgICAgICAgICAg
ICAgZ2x5cGhQYWdlLT5zZXRHbHlwaERhdGFGb3JJbmRleChpbmRleCwgdG8sIGZvbnQpOworICAg
ICAgICB9CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2Fs
RGF0YS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5
cGVWZXJ0aWNhbERhdGEuaAppbmRleCA4NWU0ZWU3Li45ODVlYWFlIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0
YS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5U
eXBlVmVydGljYWxEYXRhLmgKQEAgLTQzLDggKzQzLDExIEBAIHB1YmxpYzoKICAgICBib29sIGhh
c1ZlcnRpY2FsTWV0cmljcygpIGNvbnN0IHsgcmV0dXJuICFtX2FkdmFuY2VIZWlnaHRzLmlzRW1w
dHkoKTsgfQogICAgIGZsb2F0IGFkdmFuY2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqLCBH
bHlwaCkgY29uc3Q7CiAgICAgdm9pZCBnZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhj
b25zdCBTaW1wbGVGb250RGF0YSosIGNvbnN0IEdseXBoKiwgc2l6ZV90LCBmbG9hdCogb3V0WFlB
cnJheSkgY29uc3Q7CisgICAgdm9pZCBzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0
IFNpbXBsZUZvbnREYXRhKiwgR2x5cGhQYWdlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBs
ZW5ndGgpIGNvbnN0OwogCiBwcml2YXRlOgorICAgIHZvaWQgbG9hZE1ldHJpY3MoY29uc3QgRm9u
dFBsYXRmb3JtRGF0YSYpOworICAgIHZvaWQgbG9hZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25z
KGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmKTsKICAgICBib29sIGhhc1ZPUkcoKSBjb25zdCB7IHJl
dHVybiAhbV92ZXJ0T3JpZ2luWS5pc0VtcHR5KCk7IH0KIAogICAgIFZlY3Rvcjx1aW50MTZfdD4g
bV9hZHZhbmNlV2lkdGhzOwpAQCAtNTIsNiArNTUsNyBAQCBwcml2YXRlOgogICAgIFZlY3Rvcjxp
bnQxNl90PiBtX3RvcFNpZGVCZWFyaW5nczsKICAgICBpbnQxNl90IG1fZGVmYXVsdFZlcnRPcmln
aW5ZOwogICAgIEhhc2hNYXA8R2x5cGgsIGludDE2X3Q+IG1fdmVydE9yaWdpblk7CisgICAgSGFz
aE1hcDxHbHlwaCwgR2x5cGg+IG1fdmVydGljYWxHbHlwaE1hcDsKIH07CiAKIH0gLy8gbmFtZXNw
YWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134404</attachid>
            <date>2012-03-28 14:35:53 -0700</date>
            <delta_ts>2012-03-29 20:53:57 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-4.patch</filename>
            <type>text/plain</type>
            <size>15397</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09w
ZW5UeXBlVmVydGljYWxEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcAppbmRleCA3OGViY2Y4Li5lMjk0ZmQz
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9P
cGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwCkBAIC0zOCw2ICszOCw3IEBA
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIG5hbWVzcGFjZSBPcGVuVHlwZSB7CiAKIGVudW0geworICAg
IEdTVUJUYWcgPSBPVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLAogICAgIEhoZWFUYWcg
PSBPVF9NQUtFX1RBRygnaCcsICdoJywgJ2UnLCAnYScpLAogICAgIEhtdHhUYWcgPSBPVF9NQUtF
X1RBRygnaCcsICdtJywgJ3QnLCAneCcpLAogICAgIFZoZWFUYWcgPSBPVF9NQUtFX1RBRygndics
ICdoJywgJ2UnLCAnYScpLApAQCAtNDUsNiArNDYsMzEgQEAgZW51bSB7CiAgICAgVk9SR1RhZyA9
IE9UX01BS0VfVEFHKCdWJywgJ08nLCAnUicsICdHJyksCiB9OwogCitlbnVtIHsKKyAgICBEZWZh
dWx0U2NyaXB0VGFnID0gT1RfTUFLRV9UQUcoJ0QnLCAnRicsICdMJywgJ1QnKSwKK307CisKK2Vu
dW0geworICAgIFZlcnRGZWF0dXJlVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnZScsICdyJywgJ3Qn
KSwKK307CisKK3N0cnVjdCBUYWJsZUJhc2UgeworcHJvdGVjdGVkOgorICAgIHN0YXRpYyBib29s
IGlzVmFsaWRFbmQoY29uc3Qgdm9pZCogcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpCisg
ICAgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFy
Kj4ocCkgLSBidWZmZXIuZGF0YSgpOworICAgICAgICByZXR1cm4gb2Zmc2V0IDw9IGJ1ZmZlci5z
aXplKCk7IC8vICI8PSIgYmVjYXVzZSBlbmQgaXMgaW5jbHVkZWQgYXMgdmFsaWQKKyAgICB9CisK
KyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogcHRyKHVpbnQxNl90IG9mZnNldCwg
Y29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBU
KiBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihyZWludGVycHJldF9jYXN0PGNvbnN0
IGludDhfdCo+KHRoaXMpICsgb2Zmc2V0KTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKHB0ciAr
IDEsIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHB0cjsK
KyAgICB9Cit9OworCiAjcHJhZ21hIHBhY2soMSkKIAogc3RydWN0IEhoZWFUYWJsZSB7CkBAIC0x
MDgsNiArMTM0LDI3OCBAQCBzdHJ1Y3QgVk9SR1RhYmxlIHsKICAgICBzaXplX3QgcmVxdWlyZWRT
aXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKCp0aGlzKSArIHNpemVvZihWZXJ0T3JpZ2luWU1l
dHJpY3MpICogKG51bVZlcnRPcmlnaW5ZTWV0cmljcyAtIDEpOyB9CiB9OwogCitzdHJ1Y3QgQ292
ZXJhZ2VUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBjb3ZlcmFnZUZv
cm1hdDsKK307CisKK3N0cnVjdCBDb3ZlcmFnZTFUYWJsZSA6IENvdmVyYWdlVGFibGUgeworICAg
IE9wZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPcGVuVHlwZTo6R2x5cGhJRCBnbHlw
aEFycmF5WzFdOworfTsKKworc3RydWN0IENvdmVyYWdlMlRhYmxlIDogQ292ZXJhZ2VUYWJsZSB7
CisgICAgT3BlblR5cGU6OlVJbnQxNiByYW5nZUNvdW50OworICAgIHN0cnVjdCBSYW5nZVJlY29y
ZCB7CisgICAgICAgIE9wZW5UeXBlOjpHbHlwaElEIHN0YXJ0OworICAgICAgICBPcGVuVHlwZTo6
R2x5cGhJRCBlbmQ7CisgICAgICAgIE9wZW5UeXBlOjpVSW50MTYgc3RhcnRDb3ZlcmFnZUluZGV4
OworICAgIH0gcmFuZ2VzWzFdOworfTsKKworc3RydWN0IFN1YnN0aXR1dGlvblN1YlRhYmxlIDog
VGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IHN1YnN0Rm9ybWF0OworICAgIE9wZW5U
eXBlOjpPZmZzZXQgY292ZXJhZ2VPZmZzZXQ7CisKKyAgICBjb25zdCBDb3ZlcmFnZVRhYmxlKiBj
b3ZlcmFnZShjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QgeyByZXR1cm4gcHRyPENv
dmVyYWdlVGFibGU+KGNvdmVyYWdlT2Zmc2V0LCBidWZmZXIpOyB9Cit9OworCitzdHJ1Y3QgU2lu
Z2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlIDogU3Vic3RpdHV0aW9uU3ViVGFibGUgeworICAgIE9w
ZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdWJzdGl0
dXRlWzFdOworfTsKKworc3RydWN0IExvb2t1cFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVu
VHlwZTo6VUludDE2IGxvb2t1cFR5cGU7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBGbGFn
OworICAgIE9wZW5UeXBlOjpVSW50MTYgc3ViVGFibGVDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zm
c2V0IHN1YlRhYmxlT2Zmc2V0c1sxXTsKKyAgICAvLyBPcGVuVHlwZTo6VUludDE2IG1hcmtGaWx0
ZXJpbmdTZXQ7IHRoaXMgZmllbGQgY29tZXMgYWZ0ZXIgdmFyaWFibGUgbGVuZ3RoLCBzbyBvZmZz
ZXQgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseS4KKworICAgIGJvb2wgZ2V0U3Vic3RpdHV0aW9u
cyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIp
IGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudFN1YlRhYmxlID0gc3ViVGFibGVD
b3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZzdWJUYWJsZU9mZnNldHNbY291bnRTdWJU
YWJsZV0sIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN3aXRj
aCAobG9va3VwVHlwZSkgeworICAgICAgICBjYXNlIDE6IC8vIFNpbmdsZSBTdWJzdGl0dXRpb24g
U3VidGFibGUKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnRTdWJUYWJsZTsg
KytpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3Vic3RpdHV0aW9uU3ViVGFibGUqIHN1YiA9
IHB0cjxTdWJzdGl0dXRpb25TdWJUYWJsZT4oc3ViVGFibGVPZmZzZXRzW2ldLCBidWZmZXIpOwor
ICAgICAgICAgICAgICAgIGlmICghc3ViKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UgPSBzdWIt
PmNvdmVyYWdlKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZSkKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3Vi
LT5zdWJzdEZvcm1hdCkgeworICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBTaW5nbGUgU3Vi
c3RpdHV0aW9uIEZvcm1hdCAyCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbmdsZVN1YnN0
aXR1dGlvbjJTdWJUYWJsZSogczIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNpbmdsZVN1YnN0
aXR1dGlvbjJTdWJUYWJsZSo+KHN1Yik7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxp
ZEVuZChzMiArIDEsIGJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wZW5UeXBlOjpHbHlwaElEKiB0byA9ICZz
Mi0+c3Vic3RpdHV0ZVswXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRUbyA9
IHMyLT5nbHlwaENvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQodG8g
KyBjb3VudFRvLCBidWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdmVyYWdlLT5jb3ZlcmFnZUZvcm1hdCkg
eworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsgLy8gQ292ZXJhZ2UgRm9ybWF0IDEgKGUu
Zy4sIE1TIEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlMVRh
YmxlKiBjMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ292ZXJhZ2UxVGFibGUqPihjb3ZlcmFn
ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYzEgKyAxLCBidWZm
ZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50RnJvbSA9IGMxLT5nbHlwaENvdW50OworICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BlblR5cGU6OkdseXBoSUQqIGZyb21FbmQgPSAm
YzEtPmdseXBoQXJyYXlbY291bnRGcm9tXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChj
b3VudFRvICE9IGNvdW50RnJvbSB8fCAhaXNWYWxpZEVuZChmcm9tRW5kLCBidWZmZXIpKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGZvciAoY29uc3QgT3BlblR5cGU6OkdseXBoSUQqIGZyb20gPSAmYzEtPmdseXBoQXJy
YXlbMF07IGZyb20gIT0gZnJvbUVuZDsgKytmcm9tLCArK3RvKQorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1hcC0+c2V0KCpmcm9tLCAqdG8pOworICAgICAgICAgICAgICAgICAgICAgICAg
YnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7IC8vIENvdmVyYWdlIEZvcm1h
dCAyIChlLmcuLCBLb3p1a2EgR290aGljKQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg
Q292ZXJhZ2UyVGFibGUqIGMyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb3ZlcmFnZTJUYWJs
ZSo+KGNvdmVyYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEVuZChj
MiArIDEsIGJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UyVGFibGU6OlJhbmdlUmVj
b3JkKiByYW5nZUVuZCA9ICZjMi0+cmFuZ2VzW2MyLT5yYW5nZUNvdW50XTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGlmICghaXNWYWxpZEVuZChyYW5nZUVuZCwgYnVmZmVyKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAg
ICBmb3IgKGNvbnN0IENvdmVyYWdlMlRhYmxlOjpSYW5nZVJlY29yZCogcmFuZ2UgPSAmYzItPnJh
bmdlc1swXTsgcmFuZ2UgIT0gcmFuZ2VFbmQ7ICsrcmFuZ2UpIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB1aW50MTZfdCBmcm9tID0gcmFuZ2UtPnN0YXJ0OworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVpbnQxNl90IGZyb21FbmQgPSByYW5nZS0+ZW5kICsgMTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudEZyb20gPSBmcm9tRW5kIC0gZnJvbTsK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRGcm9tID4gY291bnRUbykKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvdW50VG8gLT0gY291bnRGcm9tOworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGZvciAoOyBmcm9tICE9IGZyb21FbmQ7ICsrZnJvbSwgKyt0bykKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5zZXQoZnJvbSwgKnRvKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudFRvKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoIkNvdmVyYWdlRm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQi
LCBjb3ZlcmFnZS0+Y292ZXJhZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IH0K
KyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1Io
IlN1YnN0Rm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQiLCBzdWItPnN1YnN0Rm9ybWF0KTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfRVJS
T1IoIkxvb2t1cFR5cGUgJWQgbm90IHN1cHBvcnRlZCIsIGxvb2t1cFR5cGUpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKwor
c3RydWN0IExvb2t1cExpc3QgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9v
a3VwQ291bnQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBsb29rdXBPZmZzZXRzWzFdOworCisgICAg
Y29uc3QgTG9va3VwVGFibGUqIGxvb2t1cCh1aW50MTZfdCBpbmRleCwgY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1
cENvdW50OworICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRFbmQoJmxvb2t1
cE9mZnNldHNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAg
IHJldHVybiBwdHI8TG9va3VwVGFibGU+KGxvb2t1cE9mZnNldHNbaW5kZXhdLCBidWZmZXIpOwor
ICAgIH0KK307CisKK3N0cnVjdCBGZWF0dXJlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5U
eXBlOjpPZmZzZXQgZmVhdHVyZVBhcmFtczsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENv
dW50OworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAgYm9v
bCBnZXRHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgTG9va3VwTGlzdCogbG9va3VwcywgSGFzaE1h
cDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAor
ICAgIHsKKyAgICAgICAgY29uc3QgT3BlblR5cGU6OlVJbnQxNiogZW5kID0gJmxvb2t1cExpc3RJ
bmRleFtsb29rdXBDb3VudF07CisgICAgICAgIGlmICghaXNWYWxpZEVuZChlbmQsIGJ1ZmZlcikp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgT3BlblR5cGU6
OlVJbnQxNiogaW5kZXggPSAmbG9va3VwTGlzdEluZGV4WzBdOyBpbmRleCAhPSBlbmQ7ICsraW5k
ZXgpIHsKKyAgICAgICAgICAgIGNvbnN0IExvb2t1cFRhYmxlKiBsb29rdXAgPSBsb29rdXBzLT5s
b29rdXAoKmluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgaWYgKCFsb29rdXAgfHwgIWxvb2t1
cC0+Z2V0U3Vic3RpdHV0aW9ucyhtYXAsIGJ1ZmZlcikpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0
cnVjdCBGZWF0dXJlTGlzdCA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0
dXJlQ291bnQ7CisgICAgc3RydWN0IEZlYXR1cmVSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6
VGFnIGZlYXR1cmVUYWc7CisgICAgICAgIE9wZW5UeXBlOjpPZmZzZXQgZmVhdHVyZU9mZnNldDsK
KyAgICB9IGZlYXR1cmVzWzFdOworCisgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmZWF0dXJlKHVp
bnQxNl90IGluZGV4LCBPcGVuVHlwZTo6VGFnIGZlYXR1cmVUYWcsIGNvbnN0IFNoYXJlZEJ1ZmZl
ciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0dXJl
Q291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8fCAhaXNWYWxpZEVuZCgmZmVhdHVy
ZXNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNvbnN0
IEZlYXR1cmVMaXN0OjpGZWF0dXJlUmVjb3JkJiByID0gZmVhdHVyZXNbaW5kZXhdOworICAgICAg
ICBpZiAoci5mZWF0dXJlVGFnID09IGZlYXR1cmVUYWcpCisgICAgICAgICAgICByZXR1cm4gcHRy
PEZlYXR1cmVUYWJsZT4oci5mZWF0dXJlT2Zmc2V0LCBidWZmZXIpOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9Cit9OworCitzdHJ1Y3QgTGFuZ1N5c1RhYmxlIDogVGFibGVCYXNlIHsKKyAgICBP
cGVuVHlwZTo6T2Zmc2V0IGxvb2t1cE9yZGVyOworICAgIE9wZW5UeXBlOjpVSW50MTYgcmVxRmVh
dHVyZUluZGV4OworICAgIE9wZW5UeXBlOjpVSW50MTYgZmVhdHVyZUNvdW50OworICAgIE9wZW5U
eXBlOjpVSW50MTYgZmVhdHVyZUluZGV4WzFdOworCisgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBm
ZWF0dXJlKE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZywgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1
cmVzLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNv
bnN0IE9wZW5UeXBlOjpVSW50MTYqIGVuZCA9ICZmZWF0dXJlSW5kZXhbZmVhdHVyZUNvdW50XTsK
KyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGVuZCwgYnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBmb3IgKGNvbnN0IE9wZW5UeXBlOjpVSW50MTYqIGluZGV4ID0gJmZlYXR1
cmVJbmRleFswXTsgaW5kZXggIT0gZW5kOyArK2luZGV4KSB7CisgICAgICAgICAgICBjb25zdCBG
ZWF0dXJlVGFibGUqIGYgPSBmZWF0dXJlcy0+ZmVhdHVyZSgqaW5kZXgsIGZlYXR1cmVUYWcsIGJ1
ZmZlcik7CisgICAgICAgICAgICBpZiAoZikKKyAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCitzdHJ1Y3QgU2NyaXB0VGFi
bGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgZGVmYXVsdExhbmdTeXNPZmZz
ZXQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsYW5nU3lzQ291bnQ7CisgICAgc3RydWN0IExhbmdT
eXNSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6VGFnIGxhbmdTeXNUYWc7CisgICAgICAgIE9w
ZW5UeXBlOjpPZmZzZXQgbGFuZ1N5c09mZnNldDsKKyAgICB9IGxhbmdTeXNSZWNvcmRzWzFdOwor
CisgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBkZWZhdWx0TGFuZ1N5cyhjb25zdCBTaGFyZWRCdWZm
ZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IG9mZnNldCA9IGRlZmF1
bHRMYW5nU3lzT2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJu
IHB0cjxMYW5nU3lzVGFibGU+KG9mZnNldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKGxhbmdTeXND
b3VudCkKKyAgICAgICAgICAgIHJldHVybiBwdHI8TGFuZ1N5c1RhYmxlPihsYW5nU3lzUmVjb3Jk
c1swXS5sYW5nU3lzT2Zmc2V0LCBidWZmZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9
OworCitzdHJ1Y3QgU2NyaXB0TGlzdCA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQx
NiBzY3JpcHRDb3VudDsKKyAgICBzdHJ1Y3QgU2NyaXB0UmVjb3JkIHsKKyAgICAgICAgT3BlblR5
cGU6OlRhZyBzY3JpcHRUYWc7CisgICAgICAgIE9wZW5UeXBlOjpPZmZzZXQgc2NyaXB0T2Zmc2V0
OworICAgIH0gc2NyaXB0c1sxXTsKKworICAgIGNvbnN0IFNjcmlwdFRhYmxlKiBzY3JpcHQoT3Bl
blR5cGU6OlRhZyB0YWcsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgY29uc3QgU2NyaXB0UmVjb3JkKiBlbmQgPSAmc2NyaXB0c1tzY3JpcHRDb3VudF07
CisgICAgICAgIGlmICghaXNWYWxpZEVuZChlbmQsIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1
cm4gMDsKKyAgICAgICAgZm9yIChjb25zdCBTY3JpcHRSZWNvcmQqIHMgPSBzY3JpcHRzOyBzICE9
IGVuZDsgKytzKSB7CisgICAgICAgICAgICBpZiAocy0+c2NyaXB0VGFnID09IHRhZykKKyAgICAg
ICAgICAgICAgICByZXR1cm4gcHRyPFNjcmlwdFRhYmxlPihzLT5zY3JpcHRPZmZzZXQsIGJ1ZmZl
cik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3QgU2Ny
aXB0VGFibGUqIGRlZmF1bHRTY3JpcHQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0
CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSogcyA9IHNjcmlwdChPcGVuVHlwZTo6
RGVmYXVsdFNjcmlwdFRhZywgYnVmZmVyKTsKKyAgICAgICAgaWYgKCFzICYmIHNjcmlwdENvdW50
KQorICAgICAgICAgICAgcyA9IHB0cjxTY3JpcHRUYWJsZT4oc2NyaXB0c1swXS5zY3JpcHRPZmZz
ZXQsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIGNvbnN0IExhbmdT
eXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0
CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSogcyA9IGRlZmF1bHRTY3JpcHQoYnVm
ZmVyKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
dHVybiBzLT5kZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgIH0KK307CisKK3N0cnVjdCBHU1VC
VGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpGaXhlZCB2ZXJzaW9uOworICAgIE9w
ZW5UeXBlOjpPZmZzZXQgc2NyaXB0TGlzdE9mZnNldDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGZl
YXR1cmVMaXN0T2Zmc2V0OworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3VwTGlzdE9mZnNldDsK
KworICAgIGNvbnN0IFNjcmlwdExpc3QqIHNjcmlwdExpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBi
dWZmZXIpIGNvbnN0IHsgcmV0dXJuIHB0cjxTY3JpcHRMaXN0PihzY3JpcHRMaXN0T2Zmc2V0LCBi
dWZmZXIpOyB9CisgICAgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0KGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiBwdHI8RmVhdHVyZUxpc3Q+KGZlYXR1cmVM
aXN0T2Zmc2V0LCBidWZmZXIpOyB9CisgICAgY29uc3QgTG9va3VwTGlzdCogbG9va3VwTGlzdChj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QgeyByZXR1cm4gcHRyPExvb2t1cExpc3Q+
KGxvb2t1cExpc3RPZmZzZXQsIGJ1ZmZlcik7IH0KKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSog
ZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgewor
ICAgICAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRzID0gc2NyaXB0TGlzdChidWZmZXIpOwor
ICAgICAgICBpZiAoIXNjcmlwdHMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0
dXJuIHNjcmlwdHMtPmRlZmF1bHRMYW5nU3lzKGJ1ZmZlcik7CisgICAgfQorCisgICAgY29uc3Qg
RmVhdHVyZVRhYmxlKiBmZWF0dXJlKE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZywgY29uc3QgU2hh
cmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBMYW5nU3lzVGFi
bGUqIGxhbmdTeXMgPSBkZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgICAgICBjb25zdCBGZWF0
dXJlTGlzdCogZmVhdHVyZXMgPSBmZWF0dXJlTGlzdChidWZmZXIpOworICAgICAgICBpZiAoIWxh
bmdTeXMgfHwgIWZlYXR1cmVzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVy
biBsYW5nU3lzLT5mZWF0dXJlKGZlYXR1cmVUYWcsIGZlYXR1cmVzLCBidWZmZXIpOworICAgIH0K
KworICAgIGJvb2wgZ2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoSGFzaE1hcDxHbHlwaCwg
R2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmID0gZmVhdHVyZShPcGVuVHlwZTo6VmVydEZlYXR1
cmVUYWcsIGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IExvb2t1cExpc3QqIGxvb2t1cHMgPSBsb29r
dXBMaXN0KGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBmICYmIGxvb2t1cHMgJiYgZi0+Z2V0R2x5
cGhTdWJzdGl0dXRpb25zKGxvb2t1cHMsIG1hcCwgYnVmZmVyKTsKKyAgICB9Cit9OworCiAjcHJh
Z21hIHBhY2soKQogCiB9IC8vIG5hbWVzcGFjZSBPcGVuVHlwZQpAQCAtMTIyLDYgKzQyMCwxMiBA
QCB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVkUHRyKGNvbnN0IFJlZlB0
cjxTaGFyZWRCdWZmZXI+JiBidWZmZXIsCiBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVW
ZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogICAgIDog
bV9kZWZhdWx0VmVydE9yaWdpblkoMCkKIHsKKyAgICBsb2FkTWV0cmljcyhwbGF0Zm9ybURhdGEp
OworICAgIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhwbGF0Zm9ybURhdGEpOworfQor
Cit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkTWV0cmljcyhjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CiAgICAgLy8gTG9hZCBoaGVhIGFuZCBobXR4IHRvIGdl
dCB4LWNvbXBvbmVudCBvZiB2ZXJ0aWNhbCBvcmlnaW5zLgogICAgIC8vIElmIHRoZXNlIHRhYmxl
cyBhcmUgbWlzc2luZywgaXQncyBub3QgYW4gT3BlblR5cGUgZm9udC4KICAgICBSZWZQdHI8U2hh
cmVkQnVmZmVyPiBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6
SGhlYVRhZyk7CkBAIC0yMDUsNiArNTA5LDE0IEBAIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVu
VHlwZVZlcnRpY2FsRGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAg
ICAgfQogfQogCit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1
YnN0aXR1dGlvbnMoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQoreworICAg
IFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxl
KE9wZW5UeXBlOjpHU1VCVGFnKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6R1NVQlRhYmxlKiBnc3Vi
ID0gdmFsaWRhdGVkUHRyPE9wZW5UeXBlOjpHU1VCVGFibGU+KGJ1ZmZlcik7CisgICAgaWYgKGdz
dWIpCisgICAgICAgIGdzdWItPmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKCZtX3ZlcnRp
Y2FsR2x5cGhNYXAsICpidWZmZXIuZ2V0KCkpOworfQorCiBmbG9hdCBPcGVuVHlwZVZlcnRpY2Fs
RGF0YTo6YWR2YW5jZUhlaWdodChjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGggZ2x5
cGgpIGNvbnN0CiB7CiAgICAgc2l6ZV90IGNvdW50SGVpZ2h0cyA9IG1fYWR2YW5jZUhlaWdodHMu
c2l6ZSgpOwpAQCAtMjYxLDQgKzU3MywyMSBAQCB2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpn
ZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YQogICAg
IH0KIH0KIAordm9pZCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6c3Vic3RpdHV0ZVdpdGhWZXJ0aWNh
bEdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGhQYWdlKiBnbHlwaFBhZ2Us
IHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIGNvbnN0IEhh
c2hNYXA8R2x5cGgsIEdseXBoPiYgbWFwID0gbV92ZXJ0aWNhbEdseXBoTWFwOworICAgIGlmICht
YXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4
ID0gb2Zmc2V0LCBlbmQgPSBvZmZzZXQgKyBsZW5ndGg7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7
CisgICAgICAgIEdseXBoIGdseXBoID0gZ2x5cGhQYWdlLT5nbHlwaEF0KGluZGV4KTsKKyAgICAg
ICAgaWYgKGdseXBoKSB7CisgICAgICAgICAgICBBU1NFUlQoZ2x5cGhQYWdlLT5nbHlwaERhdGFG
b3JJbmRleChpbmRleCkuZm9udERhdGEgPT0gZm9udCk7CisgICAgICAgICAgICBHbHlwaCB0byA9
IG1hcC5nZXQoZ2x5cGgpOworICAgICAgICAgICAgaWYgKHRvKQorICAgICAgICAgICAgICAgIGds
eXBoUGFnZS0+c2V0R2x5cGhEYXRhRm9ySW5kZXgoaW5kZXgsIHRvLCBmb250KTsKKyAgICAgICAg
fQorICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVy
dGljYWxEYXRhLmgKaW5kZXggODVlNGVlNy4uOTg1ZWFhZSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZl
cnRpY2FsRGF0YS5oCkBAIC00Myw4ICs0MywxMSBAQCBwdWJsaWM6CiAgICAgYm9vbCBoYXNWZXJ0
aWNhbE1ldHJpY3MoKSBjb25zdCB7IHJldHVybiAhbV9hZHZhbmNlSGVpZ2h0cy5pc0VtcHR5KCk7
IH0KICAgICBmbG9hdCBhZHZhbmNlSGVpZ2h0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgR2x5cGgp
IGNvbnN0OwogICAgIHZvaWQgZ2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMoY29uc3Qg
U2ltcGxlRm9udERhdGEqLCBjb25zdCBHbHlwaCosIHNpemVfdCwgZmxvYXQqIG91dFhZQXJyYXkp
IGNvbnN0OworICAgIHZvaWQgc3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBTaW1w
bGVGb250RGF0YSosIEdseXBoUGFnZSosIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3Ro
KSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICB2b2lkIGxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmKTsKKyAgICB2b2lkIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25z
dCBGb250UGxhdGZvcm1EYXRhJik7CiAgICAgYm9vbCBoYXNWT1JHKCkgY29uc3QgeyByZXR1cm4g
IW1fdmVydE9yaWdpblkuaXNFbXB0eSgpOyB9CiAKICAgICBWZWN0b3I8dWludDE2X3Q+IG1fYWR2
YW5jZVdpZHRoczsKQEAgLTUyLDYgKzU1LDcgQEAgcHJpdmF0ZToKICAgICBWZWN0b3I8aW50MTZf
dD4gbV90b3BTaWRlQmVhcmluZ3M7CiAgICAgaW50MTZfdCBtX2RlZmF1bHRWZXJ0T3JpZ2luWTsK
ICAgICBIYXNoTWFwPEdseXBoLCBpbnQxNl90PiBtX3ZlcnRPcmlnaW5ZOworICAgIEhhc2hNYXA8
R2x5cGgsIEdseXBoPiBtX3ZlcnRpY2FsR2x5cGhNYXA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134718</attachid>
            <date>2012-03-29 20:53:57 -0700</date>
            <delta_ts>2012-03-29 22:02:09 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-5.patch</filename>
            <type>text/plain</type>
            <size>18019</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA2ZGY0YjdkLi5kYjE5NTA4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDUgKzEsNjUg
QEAKIDIwMTItMDMtMjggIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CiAKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAn
R1NVQicgT3BlblR5cGUgdGFibGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBn
bHlwaHMuCisKKyAgICAgICAgTGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkg
Y29kZSBwYXRoIHlldC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOiBBZGRlZCBuZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoVGFibGVC
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OmlzVmFsaWRFbmQp
OgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlRhYmxlQmFzZTo6dmFsaWRhdGVkUHRyKToK
KyAgICAgICAgKE9wZW5UeXBlKToKKyAgICAgICAgKENvdmVyYWdlVGFibGUpOgorICAgICAgICAo
Q292ZXJhZ2UxVGFibGUpOgorICAgICAgICAoQ292ZXJhZ2UyVGFibGUpOgorICAgICAgICAoUmFu
Z2VSZWNvcmQpOgorICAgICAgICAoU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OlN1YnN0aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZSk6CisgICAgICAg
IChTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoTG9va3VwVGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25z
KToKKyAgICAgICAgKExvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxv
b2t1cExpc3Q6Omxvb2t1cCk6CisgICAgICAgIChGZWF0dXJlVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OkZlYXR1cmVUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAg
ICAgICAgKEZlYXR1cmVMaXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkZlYXR1cmVMaXN0OjpmZWF0dXJlKToKKyAgICAgICAgKExhbmdT
eXNUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TGFuZ1N5c1RhYmxlOjpmZWF0
dXJlKToKKyAgICAgICAgKFNjcmlwdFRhYmxlKToKKyAgICAgICAgKExhbmdTeXNSZWNvcmQpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNjcmlwdFRhYmxlOjpkZWZhdWx0TGFuZ1N5cyk6
CisgICAgICAgIChTY3JpcHRMaXN0KToKKyAgICAgICAgKFNjcmlwdFJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6U2NyaXB0TGlzdDo6c2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0U2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChHU1VC
VGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6c2NyaXB0TGlz
dCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpmZWF0dXJlTGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpsb29rdXBMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlv
bnMpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVy
dGljYWxEYXRhKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBl
VmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlw
aHMpOiBTdWJzdGl0dXRlIEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBJ
RHMuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNh
bERhdGEuaDogQWRkZWQgbV92ZXJ0aWNhbEdseXBoTWFwLgorICAgICAgICAoT3BlblR5cGVWZXJ0
aWNhbERhdGEpOgorCisyMDEyLTAzLTI4ICBLb2ppIElzaGlpICA8a29qaWlzaGlAZ21haWwuY29t
PgorCiAKICAgICAgICAgVmVydGljYWwgZmxvdyBzdXBwb3J0IGZvciBPcGVuVHlwZSBmb250cyB3
aXRoIHRoZSBsZWFzdCBwbGF0Zm9ybSBkZXBlbmRlbmNpZXMKICAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTgxMzI2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRp
Y2FsRGF0YS5jcHAKaW5kZXggNzhlYmNmOC4uOGRkY2MxNyAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3Bw
CisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBl
VmVydGljYWxEYXRhLmNwcApAQCAtMzgsNiArMzgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBu
YW1lc3BhY2UgT3BlblR5cGUgewogCiBlbnVtIHsKKyAgICBHU1VCVGFnID0gT1RfTUFLRV9UQUco
J0cnLCAnUycsICdVJywgJ0InKSwKICAgICBIaGVhVGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnaCcs
ICdlJywgJ2EnKSwKICAgICBIbXR4VGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnbScsICd0JywgJ3gn
KSwKICAgICBWaGVhVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKQEAgLTQ1
LDYgKzQ2LDM2IEBAIGVudW0gewogICAgIFZPUkdUYWcgPSBPVF9NQUtFX1RBRygnVicsICdPJywg
J1InLCAnRycpLAogfTsKIAorZW51bSB7CisgICAgRGVmYXVsdFNjcmlwdFRhZyA9IE9UX01BS0Vf
VEFHKCdEJywgJ0YnLCAnTCcsICdUJyksCit9OworCitlbnVtIHsKKyAgICBWZXJ0RmVhdHVyZVRh
ZyA9IE9UX01BS0VfVEFHKCd2JywgJ2UnLCAncicsICd0JyksCit9OworCitzdHJ1Y3QgVGFibGVC
YXNlIHsKK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRW5kKGNvbnN0IHZvaWQq
IHAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG9m
ZnNldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHApIC0gYnVmZmVyLmRhdGEoKTsK
KyAgICAgICAgcmV0dXJuIG9mZnNldCA8PSBidWZmZXIuc2l6ZSgpOyAvLyAiPD0iIGJlY2F1c2Ug
ZW5kIGlzIGluY2x1ZGVkIGFzIHZhbGlkCisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQ+IHN0YXRpYyBjb25zdCBUKiB2YWxpZGF0ZWRQdHIoY29uc3Qgdm9pZCogcCwgY29uc3QgU2hh
cmVkQnVmZmVyJiBidWZmZXIpCisgICAgeworICAgICAgICBjb25zdCBUKiBjYXN0ZWQgPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IFQqPihwKTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZjYXN0
ZWRbMV0sIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGNh
c3RlZDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRh
dGVkUHRyKHVpbnQxNl90IG9mZnNldCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPFQ+KHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgaW50OF90Kj4odGhpcykgKyBvZmZzZXQsIGJ1ZmZlcik7CisgICAgfQorfTsKKwogI3By
YWdtYSBwYWNrKDEpCiAKIHN0cnVjdCBIaGVhVGFibGUgewpAQCAtMTA4LDYgKzEzOSwyNzEgQEAg
c3RydWN0IFZPUkdUYWJsZSB7CiAgICAgc2l6ZV90IHJlcXVpcmVkU2l6ZSgpIGNvbnN0IHsgcmV0
dXJuIHNpemVvZigqdGhpcykgKyBzaXplb2YoVmVydE9yaWdpbllNZXRyaWNzKSAqIChudW1WZXJ0
T3JpZ2luWU1ldHJpY3MgLSAxKTsgfQogfTsKIAorc3RydWN0IENvdmVyYWdlVGFibGUgOiBUYWJs
ZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9OworCitzdHJ1
Y3QgQ292ZXJhZ2UxVGFibGUgOiBDb3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2
IGdseXBoQ291bnQ7CisgICAgT3BlblR5cGU6OkdseXBoSUQgZ2x5cGhBcnJheVsxXTsKK307CisK
K3N0cnVjdCBDb3ZlcmFnZTJUYWJsZSA6IENvdmVyYWdlVGFibGUgeworICAgIE9wZW5UeXBlOjpV
SW50MTYgcmFuZ2VDb3VudDsKKyAgICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAgICAgICBPcGVu
VHlwZTo6R2x5cGhJRCBzdGFydDsKKyAgICAgICAgT3BlblR5cGU6OkdseXBoSUQgZW5kOworICAg
ICAgICBPcGVuVHlwZTo6VUludDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJhbmdlc1sx
XTsKK307CisKK3N0cnVjdCBTdWJzdGl0dXRpb25TdWJUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAg
T3BlblR5cGU6OlVJbnQxNiBzdWJzdEZvcm1hdDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGNvdmVy
YWdlT2Zmc2V0OworCisgICAgY29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UoY29uc3QgU2hh
cmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlZFB0cjxDb3ZlcmFnZVRh
YmxlPihjb3ZlcmFnZU9mZnNldCwgYnVmZmVyKTsgfQorfTsKKworc3RydWN0IFNpbmdsZVN1YnN0
aXR1dGlvbjJTdWJUYWJsZSA6IFN1YnN0aXR1dGlvblN1YlRhYmxlIHsKKyAgICBPcGVuVHlwZTo6
VUludDE2IGdseXBoQ291bnQ7CisgICAgT3BlblR5cGU6OkdseXBoSUQgc3Vic3RpdHV0ZVsxXTsK
K307CisKK3N0cnVjdCBMb29rdXBUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJ
bnQxNiBsb29rdXBUeXBlOworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwRmxhZzsKKyAgICBP
cGVuVHlwZTo6VUludDE2IHN1YlRhYmxlQ291bnQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBzdWJU
YWJsZU9mZnNldHNbMV07CisgICAgLy8gT3BlblR5cGU6OlVJbnQxNiBtYXJrRmlsdGVyaW5nU2V0
OyB0aGlzIGZpZWxkIGNvbWVzIGFmdGVyIHZhcmlhYmxlIGxlbmd0aCwgc28gb2Zmc2V0IGlzIGRl
dGVybWluZWQgZHluYW1pY2FsbHkuCisKKyAgICBib29sIGdldFN1YnN0aXR1dGlvbnMoSGFzaE1h
cDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAor
ICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnRTdWJUYWJsZSA9IHN1YlRhYmxlQ291bnQ7Cisg
ICAgICAgIGlmICghaXNWYWxpZEVuZCgmc3ViVGFibGVPZmZzZXRzW2NvdW50U3ViVGFibGVdLCBi
dWZmZXIpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKGxvb2t1
cFR5cGUpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uIFN1YnRhYmxl
CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50U3ViVGFibGU7ICsraSkgewor
ICAgICAgICAgICAgICAgIGNvbnN0IFN1YnN0aXR1dGlvblN1YlRhYmxlKiBzdWIgPSB2YWxpZGF0
ZWRQdHI8U3Vic3RpdHV0aW9uU3ViVGFibGU+KHN1YlRhYmxlT2Zmc2V0c1tpXSwgYnVmZmVyKTsK
KyAgICAgICAgICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlVGFibGUqIGNvdmVyYWdlID0gc3Vi
LT5jb3ZlcmFnZShidWZmZXIpOworICAgICAgICAgICAgICAgIGlmICghY292ZXJhZ2UpCisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1
Yi0+c3Vic3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHsgLy8gU2luZ2xlIFN1
YnN0aXR1dGlvbiBGb3JtYXQgMgorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW5nbGVTdWJz
dGl0dXRpb24yU3ViVGFibGUqIHMyID0gdmFsaWRhdGVkUHRyPFNpbmdsZVN1YnN0aXR1dGlvbjJT
dWJUYWJsZT4oc3ViLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMyKQorICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB1
aW50MTZfdCBjb3VudFRvID0gczItPmdseXBoQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghaXNWYWxpZEVuZCgmczItPnN1YnN0aXR1dGVbY291bnRUb10sIGJ1ZmZlcikpCisgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN3aXRj
aCAoY292ZXJhZ2UtPmNvdmVyYWdlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2Ug
MTogeyAvLyBDb3ZlcmFnZSBGb3JtYXQgMSAoZS5nLiwgTVMgR290aGljKQorICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UxVGFibGUqIGMxID0gdmFsaWRhdGVkUHRyPENvdmVy
YWdlMVRhYmxlPihjb3ZlcmFnZSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm
ICghYzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRGcm9tID0gYzEtPmdseXBoQ291bnQ7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoJmMxLT5nbHlwaEFycmF5W2Nv
dW50RnJvbV0sIGJ1ZmZlcikgfHwgY291bnRUbyAhPSBjb3VudEZyb20pCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9y
ICh1aW50MTZfdCBpID0gMDsgaSA8IGNvdW50VG87ICsraSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBtYXAtPnNldChjMS0+Z2x5cGhBcnJheVtpXSwgczItPnN1YnN0aXR1dGVbaV0pOwor
ICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2Fz
ZSAyOiB7IC8vIENvdmVyYWdlIEZvcm1hdCAyIChlLmcuLCBBZG9iZSBLb3p1a2EgR290aGljKQor
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UyVGFibGUqIGMyID0gdmFsaWRh
dGVkUHRyPENvdmVyYWdlMlRhYmxlPihjb3ZlcmFnZSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlmICghYzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRSYW5nZSA9IGMyLT5y
YW5nZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZjMi0+
cmFuZ2VzW2NvdW50UmFuZ2VdLCBidWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9
IDAsIGluZGV4VG8gPSAwOyBpIDwgY291bnRSYW5nZTsgaSsrKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdWludDE2X3QgZnJvbSA9IGMyLT5yYW5nZXNbaV0uc3RhcnQ7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJvbUVuZCA9IGMyLT5yYW5nZXNbaV0uZW5k
ICsgMTsgLy8gT3BlblR5cGUgImVuZCIgaXMgaW5jbHVzaXZlCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgaWYgKGluZGV4VG8gKyAgKGZyb21FbmQgLSBmcm9tKSA+IGNvdW50VG8pCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5kOyArK2Zyb20sICsraW5kZXhUbykK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5zZXQoZnJvbSwgczItPnN1YnN0
aXR1dGVbaW5kZXhUb10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAg
ICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigiQ292ZXJhZ2VGb3JtYXQgJWQgbm90IHN1cHBv
cnRlZCIsIGNvdmVyYWdlLT5jb3ZlcmFnZUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVh
azsgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19F
UlJPUigiU3Vic3RGb3JtYXQgJWQgbm90IHN1cHBvcnRlZCIsIHN1Yi0+c3Vic3RGb3JtYXQpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExP
R19FUlJPUigiTG9va3VwVHlwZSAlZCBub3Qgc3VwcG9ydGVkIiwgbG9va3VwVHlwZSk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9
OworCitzdHJ1Y3QgTG9va3VwTGlzdCA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQx
NiBsb29rdXBDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGxvb2t1cE9mZnNldHNbMV07CisK
KyAgICBjb25zdCBMb29rdXBUYWJsZSogbG9va3VwKHVpbnQxNl90IGluZGV4LCBjb25zdCBTaGFy
ZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0g
bG9va3VwQ291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8fCAhaXNWYWxpZEVuZCgm
bG9va3VwT2Zmc2V0c1tjb3VudF0sIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAg
ICAgICAgcmV0dXJuIHZhbGlkYXRlZFB0cjxMb29rdXBUYWJsZT4obG9va3VwT2Zmc2V0c1tpbmRl
eF0sIGJ1ZmZlcik7CisgICAgfQorfTsKKworc3RydWN0IEZlYXR1cmVUYWJsZSA6IFRhYmxlQmFz
ZSB7CisgICAgT3BlblR5cGU6Ok9mZnNldCBmZWF0dXJlUGFyYW1zOworICAgIE9wZW5UeXBlOjpV
SW50MTYgbG9va3VwQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBMaXN0SW5kZXhb
MV07CisKKyAgICBib29sIGdldEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBMb29rdXBMaXN0KiBs
b29rdXBzLCBIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBi
dWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50
OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoJmxvb2t1cExpc3RJbmRleFtjb3VudF0sIGJ1ZmZl
cikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9
IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBMb29rdXBUYWJsZSogbG9v
a3VwID0gbG9va3Vwcy0+bG9va3VwKGxvb2t1cExpc3RJbmRleFtpXSwgYnVmZmVyKTsKKyAgICAg
ICAgICAgIGlmICghbG9va3VwIHx8ICFsb29rdXAtPmdldFN1YnN0aXR1dGlvbnMobWFwLCBidWZm
ZXIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRmVhdHVyZUxpc3QgOiBUYWJsZUJhc2Ug
eworICAgIE9wZW5UeXBlOjpVSW50MTYgZmVhdHVyZUNvdW50OworICAgIHN0cnVjdCBGZWF0dXJl
UmVjb3JkIHsKKyAgICAgICAgT3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnOworICAgICAgICBPcGVu
VHlwZTo6T2Zmc2V0IGZlYXR1cmVPZmZzZXQ7CisgICAgfSBmZWF0dXJlc1sxXTsKKworICAgIGNv
bnN0IEZlYXR1cmVUYWJsZSogZmVhdHVyZSh1aW50MTZfdCBpbmRleCwgT3BlblR5cGU6OlRhZyB0
YWcsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWlu
dDE2X3QgY291bnQgPSBmZWF0dXJlQ291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8
fCAhaXNWYWxpZEVuZCgmZmVhdHVyZXNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIGlmIChmZWF0dXJlc1tpbmRleF0uZmVhdHVyZVRhZyA9PSB0YWcpCisg
ICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPEZlYXR1cmVUYWJsZT4oZmVhdHVyZXNbaW5k
ZXhdLmZlYXR1cmVPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307
CisKK3N0cnVjdCBMYW5nU3lzVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZz
ZXQgbG9va3VwT3JkZXI7CisgICAgT3BlblR5cGU6OlVJbnQxNiByZXFGZWF0dXJlSW5kZXg7Cisg
ICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJlQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBm
ZWF0dXJlSW5kZXhbMV07CisKKyAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUoT3BlblR5
cGU6OlRhZyBmZWF0dXJlVGFnLCBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVyZXMsIGNvbnN0IFNo
YXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQg
PSBmZWF0dXJlQ291bnQ7CisgICAgICAgIGlmICghaXNWYWxpZEVuZCgmZmVhdHVyZUluZGV4W2Nv
dW50XSwgYnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKHVpbnQx
Nl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgRmVhdHVyZVRh
YmxlKiBmID0gZmVhdHVyZXMtPmZlYXR1cmUoZmVhdHVyZUluZGV4W2ldLCBmZWF0dXJlVGFnLCBi
dWZmZXIpOworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGY7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdFRh
YmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGRlZmF1bHRMYW5nU3lzT2Zm
c2V0OworICAgIE9wZW5UeXBlOjpVSW50MTYgbGFuZ1N5c0NvdW50OworICAgIHN0cnVjdCBMYW5n
U3lzUmVjb3JkIHsKKyAgICAgICAgT3BlblR5cGU6OlRhZyBsYW5nU3lzVGFnOworICAgICAgICBP
cGVuVHlwZTo6T2Zmc2V0IGxhbmdTeXNPZmZzZXQ7CisgICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsK
KworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBvZmZzZXQgPSBkZWZh
dWx0TGFuZ1N5c09mZnNldDsKKyAgICAgICAgaWYgKG9mZnNldCkKKyAgICAgICAgICAgIHJldHVy
biB2YWxpZGF0ZWRQdHI8TGFuZ1N5c1RhYmxlPihvZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIGlm
IChsYW5nU3lzQ291bnQpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPExhbmdTeXNU
YWJsZT4obGFuZ1N5c1JlY29yZHNbMF0ubGFuZ1N5c09mZnNldCwgYnVmZmVyKTsKKyAgICAgICAg
cmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdExpc3QgOiBUYWJsZUJhc2Ugewor
ICAgIE9wZW5UeXBlOjpVSW50MTYgc2NyaXB0Q291bnQ7CisgICAgc3RydWN0IFNjcmlwdFJlY29y
ZCB7CisgICAgICAgIE9wZW5UeXBlOjpUYWcgc2NyaXB0VGFnOworICAgICAgICBPcGVuVHlwZTo6
T2Zmc2V0IHNjcmlwdE9mZnNldDsKKyAgICB9IHNjcmlwdHNbMV07CisKKyAgICBjb25zdCBTY3Jp
cHRUYWJsZSogc2NyaXB0KE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1
ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gc2NyaXB0Q291bnQ7
CisgICAgICAgIGlmICghaXNWYWxpZEVuZCgmc2NyaXB0c1tjb3VudF0sIGJ1ZmZlcikpCisgICAg
ICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IGNvdW50
OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzY3JpcHRzW2ldLnNjcmlwdFRhZyA9PSB0YWcpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFB0cjxTY3JpcHRUYWJsZT4oc2NyaXB0c1tp
XS5zY3JpcHRPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgfQorCisgICAgY29uc3QgU2NyaXB0VGFibGUqIGRlZmF1bHRTY3JpcHQoY29uc3QgU2hhcmVk
QnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSog
cyA9IHNjcmlwdChPcGVuVHlwZTo6RGVmYXVsdFNjcmlwdFRhZywgYnVmZmVyKTsKKyAgICAgICAg
aWYgKCFzICYmIHNjcmlwdENvdW50KQorICAgICAgICAgICAgcyA9IHZhbGlkYXRlZFB0cjxTY3Jp
cHRUYWJsZT4oc2NyaXB0c1swXS5zY3JpcHRPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIHJldHVy
biBzOworICAgIH0KKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29u
c3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBTY3Jp
cHRUYWJsZSogcyA9IGRlZmF1bHRTY3JpcHQoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFzKQorICAg
ICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzLT5kZWZhdWx0TGFuZ1N5cyhidWZm
ZXIpOworICAgIH0KK307CisKK3N0cnVjdCBHU1VCVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9w
ZW5UeXBlOjpGaXhlZCB2ZXJzaW9uOworICAgIE9wZW5UeXBlOjpPZmZzZXQgc2NyaXB0TGlzdE9m
ZnNldDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGZlYXR1cmVMaXN0T2Zmc2V0OworICAgIE9wZW5U
eXBlOjpPZmZzZXQgbG9va3VwTGlzdE9mZnNldDsKKworICAgIGNvbnN0IFNjcmlwdExpc3QqIHNj
cmlwdExpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlk
YXRlZFB0cjxTY3JpcHRMaXN0PihzY3JpcHRMaXN0T2Zmc2V0LCBidWZmZXIpOyB9CisgICAgY29u
c3QgRmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBj
b25zdCB7IHJldHVybiB2YWxpZGF0ZWRQdHI8RmVhdHVyZUxpc3Q+KGZlYXR1cmVMaXN0T2Zmc2V0
LCBidWZmZXIpOyB9CisgICAgY29uc3QgTG9va3VwTGlzdCogbG9va3VwTGlzdChjb25zdCBTaGFy
ZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QgeyByZXR1cm4gdmFsaWRhdGVkUHRyPExvb2t1cExpc3Q+
KGxvb2t1cExpc3RPZmZzZXQsIGJ1ZmZlcik7IH0KKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSog
ZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgewor
ICAgICAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRzID0gc2NyaXB0TGlzdChidWZmZXIpOwor
ICAgICAgICBpZiAoIXNjcmlwdHMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0
dXJuIHNjcmlwdHMtPmRlZmF1bHRMYW5nU3lzKGJ1ZmZlcik7CisgICAgfQorCisgICAgY29uc3Qg
RmVhdHVyZVRhYmxlKiBmZWF0dXJlKE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZywgY29uc3QgU2hh
cmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBMYW5nU3lzVGFi
bGUqIGxhbmdTeXMgPSBkZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgICAgICBjb25zdCBGZWF0
dXJlTGlzdCogZmVhdHVyZXMgPSBmZWF0dXJlTGlzdChidWZmZXIpOworICAgICAgICBpZiAoIWxh
bmdTeXMgfHwgIWZlYXR1cmVzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVy
biBsYW5nU3lzLT5mZWF0dXJlKGZlYXR1cmVUYWcsIGZlYXR1cmVzLCBidWZmZXIpOworICAgIH0K
KworICAgIGJvb2wgZ2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoSGFzaE1hcDxHbHlwaCwg
R2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmID0gZmVhdHVyZShPcGVuVHlwZTo6VmVydEZlYXR1
cmVUYWcsIGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IExvb2t1cExpc3QqIGxvb2t1cHMgPSBsb29r
dXBMaXN0KGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBmICYmIGxvb2t1cHMgJiYgZi0+Z2V0R2x5
cGhTdWJzdGl0dXRpb25zKGxvb2t1cHMsIG1hcCwgYnVmZmVyKTsKKyAgICB9Cit9OworCiAjcHJh
Z21hIHBhY2soKQogCiB9IC8vIG5hbWVzcGFjZSBPcGVuVHlwZQpAQCAtMTIyLDYgKzQxOCwxMiBA
QCB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVkUHRyKGNvbnN0IFJlZlB0
cjxTaGFyZWRCdWZmZXI+JiBidWZmZXIsCiBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVW
ZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogICAgIDog
bV9kZWZhdWx0VmVydE9yaWdpblkoMCkKIHsKKyAgICBsb2FkTWV0cmljcyhwbGF0Zm9ybURhdGEp
OworICAgIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhwbGF0Zm9ybURhdGEpOworfQor
Cit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkTWV0cmljcyhjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CiAgICAgLy8gTG9hZCBoaGVhIGFuZCBobXR4IHRvIGdl
dCB4LWNvbXBvbmVudCBvZiB2ZXJ0aWNhbCBvcmlnaW5zLgogICAgIC8vIElmIHRoZXNlIHRhYmxl
cyBhcmUgbWlzc2luZywgaXQncyBub3QgYW4gT3BlblR5cGUgZm9udC4KICAgICBSZWZQdHI8U2hh
cmVkQnVmZmVyPiBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6
SGhlYVRhZyk7CkBAIC0yMDUsNiArNTA3LDE0IEBAIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVu
VHlwZVZlcnRpY2FsRGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAg
ICAgfQogfQogCit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1
YnN0aXR1dGlvbnMoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQoreworICAg
IFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxl
KE9wZW5UeXBlOjpHU1VCVGFnKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6R1NVQlRhYmxlKiBnc3Vi
ID0gdmFsaWRhdGVkUHRyPE9wZW5UeXBlOjpHU1VCVGFibGU+KGJ1ZmZlcik7CisgICAgaWYgKGdz
dWIpCisgICAgICAgIGdzdWItPmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKCZtX3ZlcnRp
Y2FsR2x5cGhNYXAsICpidWZmZXIuZ2V0KCkpOworfQorCiBmbG9hdCBPcGVuVHlwZVZlcnRpY2Fs
RGF0YTo6YWR2YW5jZUhlaWdodChjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGggZ2x5
cGgpIGNvbnN0CiB7CiAgICAgc2l6ZV90IGNvdW50SGVpZ2h0cyA9IG1fYWR2YW5jZUhlaWdodHMu
c2l6ZSgpOwpAQCAtMjYxLDQgKzU3MSwyMSBAQCB2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpn
ZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YQogICAg
IH0KIH0KIAordm9pZCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6c3Vic3RpdHV0ZVdpdGhWZXJ0aWNh
bEdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGhQYWdlKiBnbHlwaFBhZ2Us
IHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIGNvbnN0IEhh
c2hNYXA8R2x5cGgsIEdseXBoPiYgbWFwID0gbV92ZXJ0aWNhbEdseXBoTWFwOworICAgIGlmICht
YXAuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4
ID0gb2Zmc2V0LCBlbmQgPSBvZmZzZXQgKyBsZW5ndGg7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7
CisgICAgICAgIEdseXBoIGdseXBoID0gZ2x5cGhQYWdlLT5nbHlwaEF0KGluZGV4KTsKKyAgICAg
ICAgaWYgKGdseXBoKSB7CisgICAgICAgICAgICBBU1NFUlQoZ2x5cGhQYWdlLT5nbHlwaERhdGFG
b3JJbmRleChpbmRleCkuZm9udERhdGEgPT0gZm9udCk7CisgICAgICAgICAgICBHbHlwaCB0byA9
IG1hcC5nZXQoZ2x5cGgpOworICAgICAgICAgICAgaWYgKHRvKQorICAgICAgICAgICAgICAgIGds
eXBoUGFnZS0+c2V0R2x5cGhEYXRhRm9ySW5kZXgoaW5kZXgsIHRvLCBmb250KTsKKyAgICAgICAg
fQorICAgIH0KK30KKwogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
aCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVy
dGljYWxEYXRhLmgKaW5kZXggODVlNGVlNy4uOTg1ZWFhZSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZl
cnRpY2FsRGF0YS5oCkBAIC00Myw4ICs0MywxMSBAQCBwdWJsaWM6CiAgICAgYm9vbCBoYXNWZXJ0
aWNhbE1ldHJpY3MoKSBjb25zdCB7IHJldHVybiAhbV9hZHZhbmNlSGVpZ2h0cy5pc0VtcHR5KCk7
IH0KICAgICBmbG9hdCBhZHZhbmNlSGVpZ2h0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgR2x5cGgp
IGNvbnN0OwogICAgIHZvaWQgZ2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMoY29uc3Qg
U2ltcGxlRm9udERhdGEqLCBjb25zdCBHbHlwaCosIHNpemVfdCwgZmxvYXQqIG91dFhZQXJyYXkp
IGNvbnN0OworICAgIHZvaWQgc3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBTaW1w
bGVGb250RGF0YSosIEdseXBoUGFnZSosIHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3Ro
KSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICB2b2lkIGxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmKTsKKyAgICB2b2lkIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25z
dCBGb250UGxhdGZvcm1EYXRhJik7CiAgICAgYm9vbCBoYXNWT1JHKCkgY29uc3QgeyByZXR1cm4g
IW1fdmVydE9yaWdpblkuaXNFbXB0eSgpOyB9CiAKICAgICBWZWN0b3I8dWludDE2X3Q+IG1fYWR2
YW5jZVdpZHRoczsKQEAgLTUyLDYgKzU1LDcgQEAgcHJpdmF0ZToKICAgICBWZWN0b3I8aW50MTZf
dD4gbV90b3BTaWRlQmVhcmluZ3M7CiAgICAgaW50MTZfdCBtX2RlZmF1bHRWZXJ0T3JpZ2luWTsK
ICAgICBIYXNoTWFwPEdseXBoLCBpbnQxNl90PiBtX3ZlcnRPcmlnaW5ZOworICAgIEhhc2hNYXA8
R2x5cGgsIEdseXBoPiBtX3ZlcnRpY2FsR2x5cGhNYXA7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134722</attachid>
            <date>2012-03-29 22:02:09 -0700</date>
            <delta_ts>2012-03-31 12:12:41 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-6.patch</filename>
            <type>text/plain</type>
            <size>18180</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA5MmE1NmRiLi4yZDU0NjA1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjMg
QEAKKzIwMTItMDMtMzAgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAn
R1NVQicgT3BlblR5cGUgdGFibGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBn
bHlwaHMuCisKKyAgICAgICAgTGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkg
Y29kZSBwYXRoIHlldC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOiBBZGRlZCBuZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoVGFibGVC
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OmlzVmFsaWRFbmQp
OgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlRhYmxlQmFzZTo6dmFsaWRhdGVkUHRyKToK
KyAgICAgICAgKE9wZW5UeXBlKToKKyAgICAgICAgKENvdmVyYWdlVGFibGUpOgorICAgICAgICAo
Q292ZXJhZ2UxVGFibGUpOgorICAgICAgICAoQ292ZXJhZ2UyVGFibGUpOgorICAgICAgICAoUmFu
Z2VSZWNvcmQpOgorICAgICAgICAoU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OlN1YnN0aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZSk6CisgICAgICAg
IChTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoTG9va3VwVGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25z
KToKKyAgICAgICAgKExvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxv
b2t1cExpc3Q6Omxvb2t1cCk6CisgICAgICAgIChGZWF0dXJlVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OkZlYXR1cmVUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAg
ICAgICAgKEZlYXR1cmVMaXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkZlYXR1cmVMaXN0OjpmZWF0dXJlKToKKyAgICAgICAgKExhbmdT
eXNUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TGFuZ1N5c1RhYmxlOjpmZWF0
dXJlKToKKyAgICAgICAgKFNjcmlwdFRhYmxlKToKKyAgICAgICAgKExhbmdTeXNSZWNvcmQpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNjcmlwdFRhYmxlOjpkZWZhdWx0TGFuZ1N5cyk6
CisgICAgICAgIChTY3JpcHRMaXN0KToKKyAgICAgICAgKFNjcmlwdFJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6U2NyaXB0TGlzdDo6c2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0U2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChHU1VC
VGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6c2NyaXB0TGlz
dCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpmZWF0dXJlTGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpsb29rdXBMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlv
bnMpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVy
dGljYWxEYXRhKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBl
VmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlw
aHMpOiBTdWJzdGl0dXRlIEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBJ
RHMuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNh
bERhdGEuaDogQWRkZWQgbV92ZXJ0aWNhbEdseXBoTWFwLgorICAgICAgICAoT3BlblR5cGVWZXJ0
aWNhbERhdGEpOgorCiAyMDEyLTAzLTI4ICBHYXZpbiBCYXJyYWNsb3VnaCAgPGJhcnJhY2xvdWdo
QGFwcGxlLmNvbT4KIAogICAgICAgICBZYXJyOiBpZiB3ZSdyZSBub3QgdXNpbmcgdGhlIG91dHB1
dCBhcnJheSwgZG9uJ3QgcG9wdWxhdGUgaXQhCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0
YS5jcHAKaW5kZXggNzhlYmNmOC4uNGUyY2U0MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwCisrKyBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGlj
YWxEYXRhLmNwcApAQCAtMzgsNiArMzgsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBuYW1lc3Bh
Y2UgT3BlblR5cGUgewogCiBlbnVtIHsKKyAgICBHU1VCVGFnID0gT1RfTUFLRV9UQUcoJ0cnLCAn
UycsICdVJywgJ0InKSwKICAgICBIaGVhVGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnaCcsICdlJywg
J2EnKSwKICAgICBIbXR4VGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnbScsICd0JywgJ3gnKSwKICAg
ICBWaGVhVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKQEAgLTQ1LDYgKzQ2
LDM2IEBAIGVudW0gewogICAgIFZPUkdUYWcgPSBPVF9NQUtFX1RBRygnVicsICdPJywgJ1InLCAn
RycpLAogfTsKIAorZW51bSB7CisgICAgRGVmYXVsdFNjcmlwdFRhZyA9IE9UX01BS0VfVEFHKCdE
JywgJ0YnLCAnTCcsICdUJyksCit9OworCitlbnVtIHsKKyAgICBWZXJ0RmVhdHVyZVRhZyA9IE9U
X01BS0VfVEFHKCd2JywgJ2UnLCAncicsICd0JyksCit9OworCitzdHJ1Y3QgVGFibGVCYXNlIHsK
K3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkRW5kKGNvbnN0IHZvaWQqIHAsIGNv
bnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9
IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHApIC0gYnVmZmVyLmRhdGEoKTsKKyAgICAg
ICAgcmV0dXJuIG9mZnNldCA8PSBidWZmZXIuc2l6ZSgpOyAvLyAiPD0iIGJlY2F1c2UgZW5kIGlz
IGluY2x1ZGVkIGFzIHZhbGlkCisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0
YXRpYyBjb25zdCBUKiB2YWxpZGF0ZWRQdHIoY29uc3Qgdm9pZCogcCwgY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpCisgICAgeworICAgICAgICBjb25zdCBUKiBjYXN0ZWQgPSByZWludGVycHJl
dF9jYXN0PGNvbnN0IFQqPihwKTsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZjYXN0ZWRbMV0s
IGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGNhc3RlZDsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVkUHRy
KHVpbnQxNl90IG9mZnNldCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPFQ+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qg
aW50OF90Kj4odGhpcykgKyBvZmZzZXQsIGJ1ZmZlcik7CisgICAgfQorfTsKKwogI3ByYWdtYSBw
YWNrKDEpCiAKIHN0cnVjdCBIaGVhVGFibGUgewpAQCAtMTA4LDYgKzEzOSwyNzcgQEAgc3RydWN0
IFZPUkdUYWJsZSB7CiAgICAgc2l6ZV90IHJlcXVpcmVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNp
emVvZigqdGhpcykgKyBzaXplb2YoVmVydE9yaWdpbllNZXRyaWNzKSAqIChudW1WZXJ0T3JpZ2lu
WU1ldHJpY3MgLSAxKTsgfQogfTsKIAorc3RydWN0IENvdmVyYWdlVGFibGUgOiBUYWJsZUJhc2Ug
eworICAgIE9wZW5UeXBlOjpVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9OworCitzdHJ1Y3QgQ292
ZXJhZ2UxVGFibGUgOiBDb3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGdseXBo
Q291bnQ7CisgICAgT3BlblR5cGU6OkdseXBoSUQgZ2x5cGhBcnJheVsxXTsKK307CisKK3N0cnVj
dCBDb3ZlcmFnZTJUYWJsZSA6IENvdmVyYWdlVGFibGUgeworICAgIE9wZW5UeXBlOjpVSW50MTYg
cmFuZ2VDb3VudDsKKyAgICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6
R2x5cGhJRCBzdGFydDsKKyAgICAgICAgT3BlblR5cGU6OkdseXBoSUQgZW5kOworICAgICAgICBP
cGVuVHlwZTo6VUludDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJhbmdlc1sxXTsKK307
CisKK3N0cnVjdCBTdWJzdGl0dXRpb25TdWJUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5
cGU6OlVJbnQxNiBzdWJzdEZvcm1hdDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGNvdmVyYWdlT2Zm
c2V0OworCisgICAgY29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UoY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlZFB0cjxDb3ZlcmFnZVRhYmxlPihj
b3ZlcmFnZU9mZnNldCwgYnVmZmVyKTsgfQorfTsKKworc3RydWN0IFNpbmdsZVN1YnN0aXR1dGlv
bjJTdWJUYWJsZSA6IFN1YnN0aXR1dGlvblN1YlRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2
IGdseXBoQ291bnQ7CisgICAgT3BlblR5cGU6OkdseXBoSUQgc3Vic3RpdHV0ZVsxXTsKK307CisK
K3N0cnVjdCBMb29rdXBUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBs
b29rdXBUeXBlOworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwRmxhZzsKKyAgICBPcGVuVHlw
ZTo6VUludDE2IHN1YlRhYmxlQ291bnQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBzdWJUYWJsZU9m
ZnNldHNbMV07CisgICAgLy8gT3BlblR5cGU6OlVJbnQxNiBtYXJrRmlsdGVyaW5nU2V0OyB0aGlz
IGZpZWxkIGNvbWVzIGFmdGVyIHZhcmlhYmxlIGxlbmd0aCwgc28gb2Zmc2V0IGlzIGRldGVybWlu
ZWQgZHluYW1pY2FsbHkuCisKKyAgICBib29sIGdldFN1YnN0aXR1dGlvbnMoSGFzaE1hcDxHbHlw
aCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgdWludDE2X3QgY291bnRTdWJUYWJsZSA9IHN1YlRhYmxlQ291bnQ7CisgICAgICAg
IGlmICghaXNWYWxpZEVuZCgmc3ViVGFibGVPZmZzZXRzW2NvdW50U3ViVGFibGVdLCBidWZmZXIp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBzd2l0Y2ggKGxvb2t1cFR5cGUp
IHsKKyAgICAgICAgY2FzZSAxOiAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uIFN1YnRhYmxlCisgICAg
ICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50U3ViVGFibGU7ICsraSkgeworICAgICAg
ICAgICAgICAgIGNvbnN0IFN1YnN0aXR1dGlvblN1YlRhYmxlKiBzdWIgPSB2YWxpZGF0ZWRQdHI8
U3Vic3RpdHV0aW9uU3ViVGFibGU+KHN1YlRhYmxlT2Zmc2V0c1tpXSwgYnVmZmVyKTsKKyAgICAg
ICAgICAgICAgICBpZiAoIXN1YikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlVGFibGUqIGNvdmVyYWdlID0gc3ViLT5jb3Zl
cmFnZShidWZmZXIpOworICAgICAgICAgICAgICAgIGlmICghY292ZXJhZ2UpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1Yi0+c3Vi
c3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHsgLy8gU2luZ2xlIFN1YnN0aXR1
dGlvbiBGb3JtYXQgMgorICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW5nbGVTdWJzdGl0dXRp
b24yU3ViVGFibGUqIHMyID0gdmFsaWRhdGVkUHRyPFNpbmdsZVN1YnN0aXR1dGlvbjJTdWJUYWJs
ZT4oc3ViLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMyKQorICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB1aW50MTZf
dCBjb3VudFRvID0gczItPmdseXBoQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNW
YWxpZEVuZCgmczItPnN1YnN0aXR1dGVbY291bnRUb10sIGJ1ZmZlcikpCisgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoY292
ZXJhZ2UtPmNvdmVyYWdlRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogeyAv
LyBDb3ZlcmFnZSBGb3JtYXQgMSAoZS5nLiwgTVMgR290aGljKQorICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgQ292ZXJhZ2UxVGFibGUqIGMxID0gdmFsaWRhdGVkUHRyPENvdmVyYWdlMVRh
YmxlPihjb3ZlcmFnZSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYzEp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAgICAgdWludDE2X3QgY291bnRGcm9tID0gYzEtPmdseXBoQ291bnQ7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoJmMxLT5nbHlwaEFycmF5W2NvdW50RnJv
bV0sIGJ1ZmZlcikgfHwgY291bnRUbyAhPSBjb3VudEZyb20pCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50
MTZfdCBpID0gMDsgaSA8IGNvdW50VG87ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBtYXAtPnNldChjMS0+Z2x5cGhBcnJheVtpXSwgczItPnN1YnN0aXR1dGVbaV0pOworICAgICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7
IC8vIENvdmVyYWdlIEZvcm1hdCAyIChlLmcuLCBBZG9iZSBLb3p1a2EgR290aGljKQorICAgICAg
ICAgICAgICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UyVGFibGUqIGMyID0gdmFsaWRhdGVkUHRy
PENvdmVyYWdlMlRhYmxlPihjb3ZlcmFnZSwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGlmICghYzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRSYW5nZSA9IGMyLT5yYW5nZUNv
dW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZjMi0+cmFuZ2Vz
W2NvdW50UmFuZ2VdLCBidWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDAsIGlu
ZGV4VG8gPSAwOyBpIDwgY291bnRSYW5nZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdWludDE2X3QgZnJvbSA9IGMyLT5yYW5nZXNbaV0uc3RhcnQ7CisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdWludDE2X3QgZnJvbUVuZCA9IGMyLT5yYW5nZXNbaV0uZW5kICsgMTsg
Ly8gT3BlblR5cGUgImVuZCIgaXMgaW5jbHVzaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgaWYgKGluZGV4VG8gKyAgKGZyb21FbmQgLSBmcm9tKSA+IGNvdW50VG8pCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5kOyArK2Zyb20sICsraW5kZXhUbykKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5zZXQoZnJvbSwgczItPnN1YnN0aXR1dGVb
aW5kZXhUb10pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7IH0KKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAg
ICAgICAgICAgICAgIExPR19FUlJPUigiQ292ZXJhZ2VGb3JtYXQgJWQgbm90IHN1cHBvcnRlZCIs
IGNvdmVyYWdlLT5jb3ZlcmFnZUZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgfQor
ICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigi
U3Vic3RGb3JtYXQgJWQgbm90IHN1cHBvcnRlZCIsIHN1Yi0+c3Vic3RGb3JtYXQpOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19FUlJP
UigiTG9va3VwVHlwZSAlZCBub3Qgc3VwcG9ydGVkIiwgbG9va3VwVHlwZSk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9OworCitz
dHJ1Y3QgTG9va3VwTGlzdCA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29r
dXBDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGxvb2t1cE9mZnNldHNbMV07CisKKyAgICBj
b25zdCBMb29rdXBUYWJsZSogbG9va3VwKHVpbnQxNl90IGluZGV4LCBjb25zdCBTaGFyZWRCdWZm
ZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gbG9va3Vw
Q291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8fCAhaXNWYWxpZEVuZCgmbG9va3Vw
T2Zmc2V0c1tjb3VudF0sIGJ1ZmZlcikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAg
cmV0dXJuIHZhbGlkYXRlZFB0cjxMb29rdXBUYWJsZT4obG9va3VwT2Zmc2V0c1tpbmRleF0sIGJ1
ZmZlcik7CisgICAgfQorfTsKKworc3RydWN0IEZlYXR1cmVUYWJsZSA6IFRhYmxlQmFzZSB7Cisg
ICAgT3BlblR5cGU6Ok9mZnNldCBmZWF0dXJlUGFyYW1zOworICAgIE9wZW5UeXBlOjpVSW50MTYg
bG9va3VwQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBMaXN0SW5kZXhbMV07CisK
KyAgICBib29sIGdldEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBMb29rdXBMaXN0KiBsb29rdXBz
LCBIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIp
IGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50OworICAg
ICAgICBpZiAoIWlzVmFsaWRFbmQoJmxvb2t1cExpc3RJbmRleFtjb3VudF0sIGJ1ZmZlcikpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkg
PCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBMb29rdXBUYWJsZSogbG9va3VwID0g
bG9va3Vwcy0+bG9va3VwKGxvb2t1cExpc3RJbmRleFtpXSwgYnVmZmVyKTsKKyAgICAgICAgICAg
IGlmICghbG9va3VwIHx8ICFsb29rdXAtPmdldFN1YnN0aXR1dGlvbnMobWFwLCBidWZmZXIpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9Cit9OworCitzdHJ1Y3QgRmVhdHVyZUxpc3QgOiBUYWJsZUJhc2UgeworICAg
IE9wZW5UeXBlOjpVSW50MTYgZmVhdHVyZUNvdW50OworICAgIHN0cnVjdCBGZWF0dXJlUmVjb3Jk
IHsKKyAgICAgICAgT3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnOworICAgICAgICBPcGVuVHlwZTo6
T2Zmc2V0IGZlYXR1cmVPZmZzZXQ7CisgICAgfSBmZWF0dXJlc1sxXTsKKworICAgIGNvbnN0IEZl
YXR1cmVUYWJsZSogZmVhdHVyZSh1aW50MTZfdCBpbmRleCwgT3BlblR5cGU6OlRhZyB0YWcsIGNv
bnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3Qg
Y291bnQgPSBmZWF0dXJlQ291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8fCAhaXNW
YWxpZEVuZCgmZmVhdHVyZXNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIGlmIChmZWF0dXJlc1tpbmRleF0uZmVhdHVyZVRhZyA9PSB0YWcpCisgICAgICAg
ICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPEZlYXR1cmVUYWJsZT4oZmVhdHVyZXNbaW5kZXhdLmZl
YXR1cmVPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0
cnVjdCBMYW5nU3lzVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9v
a3VwT3JkZXI7CisgICAgT3BlblR5cGU6OlVJbnQxNiByZXFGZWF0dXJlSW5kZXg7CisgICAgT3Bl
blR5cGU6OlVJbnQxNiBmZWF0dXJlQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJl
SW5kZXhbMV07CisKKyAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUoT3BlblR5cGU6OlRh
ZyBmZWF0dXJlVGFnLCBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVyZXMsIGNvbnN0IFNoYXJlZEJ1
ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0
dXJlQ291bnQ7CisgICAgICAgIGlmICghaXNWYWxpZEVuZCgmZmVhdHVyZUluZGV4W2NvdW50XSwg
YnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKHVpbnQxNl90IGkg
PSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBm
ID0gZmVhdHVyZXMtPmZlYXR1cmUoZmVhdHVyZUluZGV4W2ldLCBmZWF0dXJlVGFnLCBidWZmZXIp
OworICAgICAgICAgICAgaWYgKGYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdFRhYmxlIDog
VGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGRlZmF1bHRMYW5nU3lzT2Zmc2V0Owor
ICAgIE9wZW5UeXBlOjpVSW50MTYgbGFuZ1N5c0NvdW50OworICAgIHN0cnVjdCBMYW5nU3lzUmVj
b3JkIHsKKyAgICAgICAgT3BlblR5cGU6OlRhZyBsYW5nU3lzVGFnOworICAgICAgICBPcGVuVHlw
ZTo6T2Zmc2V0IGxhbmdTeXNPZmZzZXQ7CisgICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsKKworICAg
IGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBi
dWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxhbmdTeXNDb3Vu
dDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZsYW5nU3lzUmVjb3Jkc1tjb3VudF0sIGJ1ZmZl
cikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdWludDE2X3Qgb2Zmc2V0ID0gZGVm
YXVsdExhbmdTeXNPZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICAgICByZXR1
cm4gdmFsaWRhdGVkUHRyPExhbmdTeXNUYWJsZT4ob2Zmc2V0LCBidWZmZXIpOworICAgICAgICBp
ZiAoY291bnQpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVkUHRyPExhbmdTeXNUYWJsZT4o
bGFuZ1N5c1JlY29yZHNbMF0ubGFuZ1N5c09mZnNldCwgYnVmZmVyKTsKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdExpc3QgOiBUYWJsZUJhc2UgeworICAgIE9w
ZW5UeXBlOjpVSW50MTYgc2NyaXB0Q291bnQ7CisgICAgc3RydWN0IFNjcmlwdFJlY29yZCB7Cisg
ICAgICAgIE9wZW5UeXBlOjpUYWcgc2NyaXB0VGFnOworICAgICAgICBPcGVuVHlwZTo6T2Zmc2V0
IHNjcmlwdE9mZnNldDsKKyAgICB9IHNjcmlwdHNbMV07CisKKyAgICBjb25zdCBTY3JpcHRUYWJs
ZSogc2NyaXB0KE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikg
Y29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gc2NyaXB0Q291bnQ7CisgICAg
ICAgIGlmICghaXNWYWxpZEVuZCgmc2NyaXB0c1tjb3VudF0sIGJ1ZmZlcikpCisgICAgICAgICAg
ICByZXR1cm4gMDsKKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IGNvdW50OyBpKysp
IHsKKyAgICAgICAgICAgIGlmIChzY3JpcHRzW2ldLnNjcmlwdFRhZyA9PSB0YWcpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFB0cjxTY3JpcHRUYWJsZT4oc2NyaXB0c1tpXS5zY3Jp
cHRPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQor
CisgICAgY29uc3QgU2NyaXB0VGFibGUqIGRlZmF1bHRTY3JpcHQoY29uc3QgU2hhcmVkQnVmZmVy
JiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENv
dW50OworICAgICAgICBpZiAoIWNvdW50IHx8ICFpc1ZhbGlkRW5kKCZzY3JpcHRzW2NvdW50XSwg
YnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjb25zdCBTY3JpcHRUYWJs
ZSogcyA9IHNjcmlwdChPcGVuVHlwZTo6RGVmYXVsdFNjcmlwdFRhZywgYnVmZmVyKTsKKyAgICAg
ICAgaWYgKHMpCisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRl
ZFB0cjxTY3JpcHRUYWJsZT4oc2NyaXB0c1swXS5zY3JpcHRPZmZzZXQsIGJ1ZmZlcik7CisgICAg
fQorCisgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBkZWZhdWx0TGFuZ1N5cyhjb25zdCBTaGFyZWRC
dWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IFNjcmlwdFRhYmxlKiBz
ID0gZGVmYXVsdFNjcmlwdChidWZmZXIpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHMtPmRlZmF1bHRMYW5nU3lzKGJ1ZmZlcik7CisgICAg
fQorfTsKKworc3RydWN0IEdTVUJUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OkZp
eGVkIHZlcnNpb247CisgICAgT3BlblR5cGU6Ok9mZnNldCBzY3JpcHRMaXN0T2Zmc2V0OworICAg
IE9wZW5UeXBlOjpPZmZzZXQgZmVhdHVyZUxpc3RPZmZzZXQ7CisgICAgT3BlblR5cGU6Ok9mZnNl
dCBsb29rdXBMaXN0T2Zmc2V0OworCisgICAgY29uc3QgU2NyaXB0TGlzdCogc2NyaXB0TGlzdChj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QgeyByZXR1cm4gdmFsaWRhdGVkUHRyPFNj
cmlwdExpc3Q+KHNjcmlwdExpc3RPZmZzZXQsIGJ1ZmZlcik7IH0KKyAgICBjb25zdCBGZWF0dXJl
TGlzdCogZmVhdHVyZUxpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0
dXJuIHZhbGlkYXRlZFB0cjxGZWF0dXJlTGlzdD4oZmVhdHVyZUxpc3RPZmZzZXQsIGJ1ZmZlcik7
IH0KKyAgICBjb25zdCBMb29rdXBMaXN0KiBsb29rdXBMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYg
YnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZWRQdHI8TG9va3VwTGlzdD4obG9va3VwTGlz
dE9mZnNldCwgYnVmZmVyKTsgfQorCisgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBkZWZhdWx0TGFu
Z1N5cyhjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNv
bnN0IFNjcmlwdExpc3QqIHNjcmlwdHMgPSBzY3JpcHRMaXN0KGJ1ZmZlcik7CisgICAgICAgIGlm
ICghc2NyaXB0cykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gc2NyaXB0
cy0+ZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsKKyAgICB9CisKKyAgICBjb25zdCBGZWF0dXJlVGFi
bGUqIGZlYXR1cmUoT3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnLCBjb25zdCBTaGFyZWRCdWZmZXIm
IGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IExhbmdTeXNUYWJsZSogbGFuZ1N5
cyA9IGRlZmF1bHRMYW5nU3lzKGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IEZlYXR1cmVMaXN0KiBm
ZWF0dXJlcyA9IGZlYXR1cmVMaXN0KGJ1ZmZlcik7CisgICAgICAgIGlmICghbGFuZ1N5cyB8fCAh
ZmVhdHVyZXMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIGxhbmdTeXMt
PmZlYXR1cmUoZmVhdHVyZVRhZywgZmVhdHVyZXMsIGJ1ZmZlcik7CisgICAgfQorCisgICAgYm9v
bCBnZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1h
cCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25z
dCBGZWF0dXJlVGFibGUqIGYgPSBmZWF0dXJlKE9wZW5UeXBlOjpWZXJ0RmVhdHVyZVRhZywgYnVm
ZmVyKTsKKyAgICAgICAgY29uc3QgTG9va3VwTGlzdCogbG9va3VwcyA9IGxvb2t1cExpc3QoYnVm
ZmVyKTsKKyAgICAgICAgcmV0dXJuIGYgJiYgbG9va3VwcyAmJiBmLT5nZXRHbHlwaFN1YnN0aXR1
dGlvbnMobG9va3VwcywgbWFwLCBidWZmZXIpOworICAgIH0KK307CisKICNwcmFnbWEgcGFjaygp
CiAKIH0gLy8gbmFtZXNwYWNlIE9wZW5UeXBlCkBAIC0xMjIsNiArNDI0LDEyIEBAIHRlbXBsYXRl
IDx0eXBlbmFtZSBUPiBjb25zdCBUKiB2YWxpZGF0ZWRQdHIoY29uc3QgUmVmUHRyPFNoYXJlZEJ1
ZmZlcj4mIGJ1ZmZlciwKIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0
YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAgICAgOiBtX2RlZmF1bHRW
ZXJ0T3JpZ2luWSgwKQogeworICAgIGxvYWRNZXRyaWNzKHBsYXRmb3JtRGF0YSk7CisgICAgbG9h
ZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKHBsYXRmb3JtRGF0YSk7Cit9CisKK3ZvaWQgT3Bl
blR5cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBs
YXRmb3JtRGF0YSkKK3sKICAgICAvLyBMb2FkIGhoZWEgYW5kIGhtdHggdG8gZ2V0IHgtY29tcG9u
ZW50IG9mIHZlcnRpY2FsIG9yaWdpbnMuCiAgICAgLy8gSWYgdGhlc2UgdGFibGVzIGFyZSBtaXNz
aW5nLCBpdCdzIG5vdCBhbiBPcGVuVHlwZSBmb250LgogICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpIaGVhVGFnKTsK
QEAgLTIwNSw2ICs1MTMsMTQgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGlj
YWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKICAgICB9CiB9CiAK
K3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9u
cyhjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CisgICAgUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gYnVmZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6
OkdTVUJUYWcpOworICAgIGNvbnN0IE9wZW5UeXBlOjpHU1VCVGFibGUqIGdzdWIgPSB2YWxpZGF0
ZWRQdHI8T3BlblR5cGU6OkdTVUJUYWJsZT4oYnVmZmVyKTsKKyAgICBpZiAoZ3N1YikKKyAgICAg
ICAgZ3N1Yi0+Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoJm1fdmVydGljYWxHbHlwaE1h
cCwgKmJ1ZmZlci5nZXQoKSk7Cit9CisKIGZsb2F0IE9wZW5UeXBlVmVydGljYWxEYXRhOjphZHZh
bmNlSGVpZ2h0KGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBHbHlwaCBnbHlwaCkgY29uc3QK
IHsKICAgICBzaXplX3QgY291bnRIZWlnaHRzID0gbV9hZHZhbmNlSGVpZ2h0cy5zaXplKCk7CkBA
IC0yNjEsNCArNTc3LDIxIEBAIHZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmdldFZlcnRpY2Fs
VHJhbnNsYXRpb25zRm9yR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhCiAgICAgfQogfQogCit2
b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNv
bnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBHbHlwaFBhZ2UqIGdseXBoUGFnZSwgdW5zaWduZWQg
b2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Cit7CisgICAgY29uc3QgSGFzaE1hcDxHbHlw
aCwgR2x5cGg+JiBtYXAgPSBtX3ZlcnRpY2FsR2x5cGhNYXA7CisgICAgaWYgKG1hcC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAodW5zaWduZWQgaW5kZXggPSBvZmZzZXQs
IGVuZCA9IG9mZnNldCArIGxlbmd0aDsgaW5kZXggPCBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAg
R2x5cGggZ2x5cGggPSBnbHlwaFBhZ2UtPmdseXBoQXQoaW5kZXgpOworICAgICAgICBpZiAoZ2x5
cGgpIHsKKyAgICAgICAgICAgIEFTU0VSVChnbHlwaFBhZ2UtPmdseXBoRGF0YUZvckluZGV4KGlu
ZGV4KS5mb250RGF0YSA9PSBmb250KTsKKyAgICAgICAgICAgIEdseXBoIHRvID0gbWFwLmdldChn
bHlwaCk7CisgICAgICAgICAgICBpZiAodG8pCisgICAgICAgICAgICAgICAgZ2x5cGhQYWdlLT5z
ZXRHbHlwaERhdGFGb3JJbmRleChpbmRleCwgdG8sIGZvbnQpOworICAgICAgICB9CisgICAgfQor
fQorCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
aAppbmRleCA4NWU0ZWU3Li45ODVlYWFlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRh
LmgKQEAgLTQzLDggKzQzLDExIEBAIHB1YmxpYzoKICAgICBib29sIGhhc1ZlcnRpY2FsTWV0cmlj
cygpIGNvbnN0IHsgcmV0dXJuICFtX2FkdmFuY2VIZWlnaHRzLmlzRW1wdHkoKTsgfQogICAgIGZs
b2F0IGFkdmFuY2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqLCBHbHlwaCkgY29uc3Q7CiAg
ICAgdm9pZCBnZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250
RGF0YSosIGNvbnN0IEdseXBoKiwgc2l6ZV90LCBmbG9hdCogb3V0WFlBcnJheSkgY29uc3Q7Cisg
ICAgdm9pZCBzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
KiwgR2x5cGhQYWdlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Owog
CiBwcml2YXRlOgorICAgIHZvaWQgbG9hZE1ldHJpY3MoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYp
OworICAgIHZvaWQgbG9hZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmKTsKICAgICBib29sIGhhc1ZPUkcoKSBjb25zdCB7IHJldHVybiAhbV92ZXJ0T3Jp
Z2luWS5pc0VtcHR5KCk7IH0KIAogICAgIFZlY3Rvcjx1aW50MTZfdD4gbV9hZHZhbmNlV2lkdGhz
OwpAQCAtNTIsNiArNTUsNyBAQCBwcml2YXRlOgogICAgIFZlY3RvcjxpbnQxNl90PiBtX3RvcFNp
ZGVCZWFyaW5nczsKICAgICBpbnQxNl90IG1fZGVmYXVsdFZlcnRPcmlnaW5ZOwogICAgIEhhc2hN
YXA8R2x5cGgsIGludDE2X3Q+IG1fdmVydE9yaWdpblk7CisgICAgSGFzaE1hcDxHbHlwaCwgR2x5
cGg+IG1fdmVydGljYWxHbHlwaE1hcDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>134970</attachid>
            <date>2012-03-31 12:12:41 -0700</date>
            <delta_ts>2012-04-19 15:57:35 -0700</delta_ts>
            <desc>Vertical alternate glyph (GSUB) support for OpenTypeVerticalData</desc>
            <filename>81389-7.patch</filename>
            <type>text/plain</type>
            <size>18080</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCA4Mzc2MDU0Li5hMzM5ZmJiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjMg
QEAKKzIwMTItMDMtMzAgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAn
R1NVQicgT3BlblR5cGUgdGFibGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBn
bHlwaHMuCisKKyAgICAgICAgTGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkg
Y29kZSBwYXRoIHlldC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOiBBZGRlZCBuZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoVGFibGVC
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OmlzVmFsaWRFbmQp
OgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlRhYmxlQmFzZTo6dmFsaWRhdGVkUHRyKToK
KyAgICAgICAgKE9wZW5UeXBlKToKKyAgICAgICAgKENvdmVyYWdlVGFibGUpOgorICAgICAgICAo
Q292ZXJhZ2UxVGFibGUpOgorICAgICAgICAoQ292ZXJhZ2UyVGFibGUpOgorICAgICAgICAoUmFu
Z2VSZWNvcmQpOgorICAgICAgICAoU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OlN1YnN0aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZSk6CisgICAgICAg
IChTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoTG9va3VwVGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25z
KToKKyAgICAgICAgKExvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxv
b2t1cExpc3Q6Omxvb2t1cCk6CisgICAgICAgIChGZWF0dXJlVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OkZlYXR1cmVUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAg
ICAgICAgKEZlYXR1cmVMaXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkZlYXR1cmVMaXN0OjpmZWF0dXJlKToKKyAgICAgICAgKExhbmdT
eXNUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TGFuZ1N5c1RhYmxlOjpmZWF0
dXJlKToKKyAgICAgICAgKFNjcmlwdFRhYmxlKToKKyAgICAgICAgKExhbmdTeXNSZWNvcmQpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNjcmlwdFRhYmxlOjpkZWZhdWx0TGFuZ1N5cyk6
CisgICAgICAgIChTY3JpcHRMaXN0KToKKyAgICAgICAgKFNjcmlwdFJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6U2NyaXB0TGlzdDo6c2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0U2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChHU1VC
VGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6c2NyaXB0TGlz
dCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpmZWF0dXJlTGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpsb29rdXBMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlv
bnMpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVy
dGljYWxEYXRhKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBl
VmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlw
aHMpOiBTdWJzdGl0dXRlIEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBJ
RHMuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNh
bERhdGEuaDogQWRkZWQgbV92ZXJ0aWNhbEdseXBoTWFwLgorICAgICAgICAoT3BlblR5cGVWZXJ0
aWNhbERhdGEpOgorCiAyMDEyLTAzLTMwICBBZGFtIEJhcnRoICA8YWJhcnRoQHdlYmtpdC5vcmc+
CiAKICAgICAgICAgW0Nocm9taXVtXSBNb3ZlIFJlc291cmNlSGFuZGxlIHRvIFdlYkNvcmUvcGxh
dGZvcm0vbmV0d29yay9jaHJvbWl1bQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3Bw
CmluZGV4IDc4ZWJjZjguLjRlMmNlNDAgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0
YS5jcHAKQEAgLTM4LDYgKzM4LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogbmFtZXNwYWNlIE9w
ZW5UeXBlIHsKIAogZW51bSB7CisgICAgR1NVQlRhZyA9IE9UX01BS0VfVEFHKCdHJywgJ1MnLCAn
VScsICdCJyksCiAgICAgSGhlYVRhZyA9IE9UX01BS0VfVEFHKCdoJywgJ2gnLCAnZScsICdhJyks
CiAgICAgSG10eFRhZyA9IE9UX01BS0VfVEFHKCdoJywgJ20nLCAndCcsICd4JyksCiAgICAgVmhl
YVRhZyA9IE9UX01BS0VfVEFHKCd2JywgJ2gnLCAnZScsICdhJyksCkBAIC00NSw2ICs0NiwzNiBA
QCBlbnVtIHsKICAgICBWT1JHVGFnID0gT1RfTUFLRV9UQUcoJ1YnLCAnTycsICdSJywgJ0cnKSwK
IH07CiAKK2VudW0geworICAgIERlZmF1bHRTY3JpcHRUYWcgPSBPVF9NQUtFX1RBRygnRCcsICdG
JywgJ0wnLCAnVCcpLAorfTsKKworZW51bSB7CisgICAgVmVydEZlYXR1cmVUYWcgPSBPVF9NQUtF
X1RBRygndicsICdlJywgJ3InLCAndCcpLAorfTsKKworc3RydWN0IFRhYmxlQmFzZSB7Citwcm90
ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEVuZChjb25zdCB2b2lkKiBwLCBjb25zdCBT
aGFyZWRCdWZmZXImIGJ1ZmZlcikKKyAgICB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwKSAtIGJ1ZmZlci5kYXRhKCk7CisgICAgICAgIHJl
dHVybiBvZmZzZXQgPD0gYnVmZmVyLnNpemUoKTsgLy8gIjw9IiBiZWNhdXNlIGVuZCBpcyBpbmNs
dWRlZCBhcyB2YWxpZAorICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMg
Y29uc3QgVCogdmFsaWRhdGVkUHRyKGNvbnN0IHZvaWQqIHAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYg
YnVmZmVyKQorICAgIHsKKyAgICAgICAgY29uc3QgVCogY2FzdGVkID0gcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBUKj4ocCk7CisgICAgICAgIGlmICghaXNWYWxpZEVuZCgmY2FzdGVkWzFdLCBidWZm
ZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBjYXN0ZWQ7CisgICAg
fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlZFB0cih1aW50
MTZfdCBvZmZzZXQsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHZhbGlkYXRlZFB0cjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IGludDhf
dCo+KHRoaXMpICsgb2Zmc2V0LCBidWZmZXIpOworICAgIH0KK307CisKICNwcmFnbWEgcGFjaygx
KQogCiBzdHJ1Y3QgSGhlYVRhYmxlIHsKQEAgLTEwOCw2ICsxMzksMjc3IEBAIHN0cnVjdCBWT1JH
VGFibGUgewogICAgIHNpemVfdCByZXF1aXJlZFNpemUoKSBjb25zdCB7IHJldHVybiBzaXplb2Yo
KnRoaXMpICsgc2l6ZW9mKFZlcnRPcmlnaW5ZTWV0cmljcykgKiAobnVtVmVydE9yaWdpbllNZXRy
aWNzIC0gMSk7IH0KIH07CiAKK3N0cnVjdCBDb3ZlcmFnZVRhYmxlIDogVGFibGVCYXNlIHsKKyAg
ICBPcGVuVHlwZTo6VUludDE2IGNvdmVyYWdlRm9ybWF0OworfTsKKworc3RydWN0IENvdmVyYWdl
MVRhYmxlIDogQ292ZXJhZ2VUYWJsZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBnbHlwaENvdW50
OworICAgIE9wZW5UeXBlOjpHbHlwaElEIGdseXBoQXJyYXlbMV07Cit9OworCitzdHJ1Y3QgQ292
ZXJhZ2UyVGFibGUgOiBDb3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IHJhbmdl
Q291bnQ7CisgICAgc3RydWN0IFJhbmdlUmVjb3JkIHsKKyAgICAgICAgT3BlblR5cGU6OkdseXBo
SUQgc3RhcnQ7CisgICAgICAgIE9wZW5UeXBlOjpHbHlwaElEIGVuZDsKKyAgICAgICAgT3BlblR5
cGU6OlVJbnQxNiBzdGFydENvdmVyYWdlSW5kZXg7CisgICAgfSByYW5nZXNbMV07Cit9OworCitz
dHJ1Y3QgU3Vic3RpdHV0aW9uU3ViVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpV
SW50MTYgc3Vic3RGb3JtYXQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBjb3ZlcmFnZU9mZnNldDsK
KworICAgIGNvbnN0IENvdmVyYWdlVGFibGUqIGNvdmVyYWdlKGNvbnN0IFNoYXJlZEJ1ZmZlciYg
YnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZWRQdHI8Q292ZXJhZ2VUYWJsZT4oY292ZXJh
Z2VPZmZzZXQsIGJ1ZmZlcik7IH0KK307CisKK3N0cnVjdCBTaW5nbGVTdWJzdGl0dXRpb24yU3Vi
VGFibGUgOiBTdWJzdGl0dXRpb25TdWJUYWJsZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBnbHlw
aENvdW50OworICAgIE9wZW5UeXBlOjpHbHlwaElEIHN1YnN0aXR1dGVbMV07Cit9OworCitzdHJ1
Y3QgTG9va3VwVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3Vw
VHlwZTsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cEZsYWc7CisgICAgT3BlblR5cGU6OlVJ
bnQxNiBzdWJUYWJsZUNvdW50OworICAgIE9wZW5UeXBlOjpPZmZzZXQgc3ViVGFibGVPZmZzZXRz
WzFdOworICAgIC8vIE9wZW5UeXBlOjpVSW50MTYgbWFya0ZpbHRlcmluZ1NldDsgdGhpcyBmaWVs
ZCBjb21lcyBhZnRlciB2YXJpYWJsZSBsZW5ndGgsIHNvIG9mZnNldCBpcyBkZXRlcm1pbmVkIGR5
bmFtaWNhbGx5LgorCisgICAgYm9vbCBnZXRTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEds
eXBoPiogbWFwLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAg
ICAgIHVpbnQxNl90IGNvdW50U3ViVGFibGUgPSBzdWJUYWJsZUNvdW50OworICAgICAgICBpZiAo
IWlzVmFsaWRFbmQoJnN1YlRhYmxlT2Zmc2V0c1tjb3VudFN1YlRhYmxlXSwgYnVmZmVyKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChsb29rdXBUeXBlKSB7Cisg
ICAgICAgIGNhc2UgMTogLy8gU2luZ2xlIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZQorICAgICAgICAg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudFN1YlRhYmxlOyArK2kpIHsKKyAgICAgICAgICAg
ICAgICBjb25zdCBTdWJzdGl0dXRpb25TdWJUYWJsZSogc3ViID0gdmFsaWRhdGVkUHRyPFN1YnN0
aXR1dGlvblN1YlRhYmxlPihzdWJUYWJsZU9mZnNldHNbaV0sIGJ1ZmZlcik7CisgICAgICAgICAg
ICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICBjb25zdCBDb3ZlcmFnZVRhYmxlKiBjb3ZlcmFnZSA9IHN1Yi0+Y292ZXJhZ2Uo
YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvdmVyYWdlKQorICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdWItPnN1YnN0Rm9y
bWF0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAyOiB7IC8vIFNpbmdsZSBTdWJzdGl0dXRpb24g
Rm9ybWF0IDIKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU2luZ2xlU3Vic3RpdHV0aW9uMlN1
YlRhYmxlKiBzMiA9IHZhbGlkYXRlZFB0cjxTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGU+KHN1
YiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzMikKKyAgICAgICAgICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291
bnRUbyA9IHMyLT5nbHlwaENvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRF
bmQoJnMyLT5zdWJzdGl0dXRlW2NvdW50VG9dLCBidWZmZXIpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdmVyYWdl
LT5jb3ZlcmFnZUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsgLy8gQ292
ZXJhZ2UgRm9ybWF0IDEgKGUuZy4sIE1TIEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IENvdmVyYWdlMVRhYmxlKiBjMSA9IHZhbGlkYXRlZFB0cjxDb3ZlcmFnZTFUYWJsZT4o
Y292ZXJhZ2UsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMxKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHVpbnQxNl90IGNvdW50RnJvbSA9IGMxLT5nbHlwaENvdW50OworICAgICAgICAgICAg
ICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKCZjMS0+Z2x5cGhBcnJheVtjb3VudEZyb21dLCBi
dWZmZXIpIHx8IGNvdW50VG8gIT0gY291bnRGcm9tKQorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDE2X3Qg
aSA9IDA7IGkgPCBjb3VudFRvOyArK2kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFw
LT5zZXQoYzEtPmdseXBoQXJyYXlbaV0sIHMyLT5zdWJzdGl0dXRlW2ldKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBD
b3ZlcmFnZSBGb3JtYXQgMiAoZS5nLiwgQWRvYmUgS296dWthIEdvdGhpYykKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlMlRhYmxlKiBjMiA9IHZhbGlkYXRlZFB0cjxDb3Zl
cmFnZTJUYWJsZT4oY292ZXJhZ2UsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoIWMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50UmFuZ2UgPSBjMi0+cmFuZ2VDb3VudDsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZEVuZCgmYzItPnJhbmdlc1tjb3Vu
dFJhbmdlXSwgYnVmZmVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwLCBpbmRleFRv
ID0gMDsgaSA8IGNvdW50UmFuZ2U7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVpbnQxNl90IGZyb20gPSBjMi0+cmFuZ2VzW2ldLnN0YXJ0OworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVpbnQxNl90IGZyb21FbmQgPSBjMi0+cmFuZ2VzW2ldLmVuZCArIDE7IC8vIE9w
ZW5UeXBlICJlbmQiIGlzIGluY2x1c2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlm
IChpbmRleFRvICsgIChmcm9tRW5kIC0gZnJvbSkgPiBjb3VudFRvKQorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZm9yICg7IGZyb20gIT0gZnJvbUVuZDsgKytmcm9tLCArK2luZGV4VG8pCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KGZyb20sIHMyLT5zdWJzdGl0dXRlW2luZGV4
VG9dKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAg
ICAgICAgICBMT0dfRVJST1IoIkNvdmVyYWdlRm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQiLCBjb3Zl
cmFnZS0+Y292ZXJhZ2VGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7IH0KKyAgICAg
ICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoIlN1YnN0
Rm9ybWF0ICVkIG5vdCBzdXBwb3J0ZWQiLCBzdWItPnN1YnN0Rm9ybWF0KTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfRVJST1IoIkxv
b2t1cFR5cGUgJWQgbm90IHN1cHBvcnRlZCIsIGxvb2t1cFR5cGUpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKworc3RydWN0
IExvb2t1cExpc3QgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwQ291
bnQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBsb29rdXBPZmZzZXRzWzFdOworCisgICAgY29uc3Qg
TG9va3VwVGFibGUqIGxvb2t1cCh1aW50MTZfdCBpbmRleCwgY29uc3QgU2hhcmVkQnVmZmVyJiBi
dWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50
OworICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRFbmQoJmxvb2t1cE9mZnNl
dHNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVy
biB2YWxpZGF0ZWRQdHI8TG9va3VwVGFibGU+KGxvb2t1cE9mZnNldHNbaW5kZXhdLCBidWZmZXIp
OworICAgIH0KK307CisKK3N0cnVjdCBGZWF0dXJlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9w
ZW5UeXBlOjpPZmZzZXQgZmVhdHVyZVBhcmFtczsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1
cENvdW50OworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAg
Ym9vbCBnZXRHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgTG9va3VwTGlzdCogbG9va3VwcywgSGFz
aE1hcDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25z
dAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAg
aWYgKCFpc1ZhbGlkRW5kKCZsb29rdXBMaXN0SW5kZXhbY291bnRdLCBidWZmZXIpKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291
bnQ7IGkrKykgeworICAgICAgICAgICAgY29uc3QgTG9va3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1
cHMtPmxvb2t1cChsb29rdXBMaXN0SW5kZXhbaV0sIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAo
IWxvb2t1cCB8fCAhbG9va3VwLT5nZXRTdWJzdGl0dXRpb25zKG1hcCwgYnVmZmVyKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorfTsKKworc3RydWN0IEZlYXR1cmVMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVu
VHlwZTo6VUludDE2IGZlYXR1cmVDb3VudDsKKyAgICBzdHJ1Y3QgRmVhdHVyZVJlY29yZCB7Cisg
ICAgICAgIE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNl
dCBmZWF0dXJlT2Zmc2V0OworICAgIH0gZmVhdHVyZXNbMV07CisKKyAgICBjb25zdCBGZWF0dXJl
VGFibGUqIGZlYXR1cmUodWludDE2X3QgaW5kZXgsIE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBT
aGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50
ID0gZmVhdHVyZUNvdW50OworICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRF
bmQoJmZlYXR1cmVzW2NvdW50XSwgYnVmZmVyKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICBpZiAoZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmVUYWcgPT0gdGFnKQorICAgICAgICAgICAg
cmV0dXJuIHZhbGlkYXRlZFB0cjxGZWF0dXJlVGFibGU+KGZlYXR1cmVzW2luZGV4XS5mZWF0dXJl
T2Zmc2V0LCBidWZmZXIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9OworCitzdHJ1Y3Qg
TGFuZ1N5c1RhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGxvb2t1cE9y
ZGVyOworICAgIE9wZW5UeXBlOjpVSW50MTYgcmVxRmVhdHVyZUluZGV4OworICAgIE9wZW5UeXBl
OjpVSW50MTYgZmVhdHVyZUNvdW50OworICAgIE9wZW5UeXBlOjpVSW50MTYgZmVhdHVyZUluZGV4
WzFdOworCisgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmZWF0dXJlKE9wZW5UeXBlOjpUYWcgZmVh
dHVyZVRhZywgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1cmVzLCBjb25zdCBTaGFyZWRCdWZmZXIm
IGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gZmVhdHVyZUNv
dW50OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoJmZlYXR1cmVJbmRleFtjb3VudF0sIGJ1ZmZl
cikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsg
aSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEZlYXR1cmVUYWJsZSogZiA9IGZl
YXR1cmVzLT5mZWF0dXJlKGZlYXR1cmVJbmRleFtpXSwgZmVhdHVyZVRhZywgYnVmZmVyKTsKKyAg
ICAgICAgICAgIGlmIChmKQorICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVjdCBTY3JpcHRUYWJsZSA6IFRhYmxl
QmFzZSB7CisgICAgT3BlblR5cGU6Ok9mZnNldCBkZWZhdWx0TGFuZ1N5c09mZnNldDsKKyAgICBP
cGVuVHlwZTo6VUludDE2IGxhbmdTeXNDb3VudDsKKyAgICBzdHJ1Y3QgTGFuZ1N5c1JlY29yZCB7
CisgICAgICAgIE9wZW5UeXBlOjpUYWcgbGFuZ1N5c1RhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9m
ZnNldCBsYW5nU3lzT2Zmc2V0OworICAgIH0gbGFuZ1N5c1JlY29yZHNbMV07CisKKyAgICBjb25z
dCBMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzKGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVy
KSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBsYW5nU3lzQ291bnQ7Cisg
ICAgICAgIGlmICghaXNWYWxpZEVuZCgmbGFuZ1N5c1JlY29yZHNbY291bnRdLCBidWZmZXIpKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHVpbnQxNl90IG9mZnNldCA9IGRlZmF1bHRM
YW5nU3lzT2Zmc2V0OworICAgICAgICBpZiAob2Zmc2V0KQorICAgICAgICAgICAgcmV0dXJuIHZh
bGlkYXRlZFB0cjxMYW5nU3lzVGFibGU+KG9mZnNldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKGNv
dW50KQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlZFB0cjxMYW5nU3lzVGFibGU+KGxhbmdT
eXNSZWNvcmRzWzBdLmxhbmdTeXNPZmZzZXQsIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK307CisKK3N0cnVjdCBTY3JpcHRMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlw
ZTo6VUludDE2IHNjcmlwdENvdW50OworICAgIHN0cnVjdCBTY3JpcHRSZWNvcmQgeworICAgICAg
ICBPcGVuVHlwZTo6VGFnIHNjcmlwdFRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNldCBzY3Jp
cHRPZmZzZXQ7CisgICAgfSBzY3JpcHRzWzFdOworCisgICAgY29uc3QgU2NyaXB0VGFibGUqIHNj
cmlwdChPcGVuVHlwZTo6VGFnIHRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0
CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENvdW50OworICAgICAgICBp
ZiAoIWlzVmFsaWRFbmQoJnNjcmlwdHNbY291bnRdLCBidWZmZXIpKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cisg
ICAgICAgICAgICBpZiAoc2NyaXB0c1tpXS5zY3JpcHRUYWcgPT0gdGFnKQorICAgICAgICAgICAg
ICAgIHJldHVybiB2YWxpZGF0ZWRQdHI8U2NyaXB0VGFibGU+KHNjcmlwdHNbaV0uc2NyaXB0T2Zm
c2V0LCBidWZmZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAg
IGNvbnN0IFNjcmlwdFRhYmxlKiBkZWZhdWx0U2NyaXB0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVm
ZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBzY3JpcHRDb3VudDsK
KyAgICAgICAgaWYgKCFjb3VudCB8fCAhaXNWYWxpZEVuZCgmc2NyaXB0c1tjb3VudF0sIGJ1ZmZl
cikpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY29uc3QgU2NyaXB0VGFibGUqIHMg
PSBzY3JpcHQoT3BlblR5cGU6OkRlZmF1bHRTY3JpcHRUYWcsIGJ1ZmZlcik7CisgICAgICAgIGlm
IChzKQorICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIHJldHVybiB2YWxpZGF0ZWRQdHI8
U2NyaXB0VGFibGU+KHNjcmlwdHNbMF0uc2NyaXB0T2Zmc2V0LCBidWZmZXIpOworICAgIH0KKwor
ICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVy
JiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSogcyA9IGRl
ZmF1bHRTY3JpcHQoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIHJldHVybiBzLT5kZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgIH0KK307
CisKK3N0cnVjdCBHU1VCVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpGaXhlZCB2
ZXJzaW9uOworICAgIE9wZW5UeXBlOjpPZmZzZXQgc2NyaXB0TGlzdE9mZnNldDsKKyAgICBPcGVu
VHlwZTo6T2Zmc2V0IGZlYXR1cmVMaXN0T2Zmc2V0OworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9v
a3VwTGlzdE9mZnNldDsKKworICAgIGNvbnN0IFNjcmlwdExpc3QqIHNjcmlwdExpc3QoY29uc3Qg
U2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlZFB0cjxTY3JpcHRM
aXN0PihzY3JpcHRMaXN0T2Zmc2V0LCBidWZmZXIpOyB9CisgICAgY29uc3QgRmVhdHVyZUxpc3Qq
IGZlYXR1cmVMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2
YWxpZGF0ZWRQdHI8RmVhdHVyZUxpc3Q+KGZlYXR1cmVMaXN0T2Zmc2V0LCBidWZmZXIpOyB9Cisg
ICAgY29uc3QgTG9va3VwTGlzdCogbG9va3VwTGlzdChjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZl
cikgY29uc3QgeyByZXR1cm4gdmFsaWRhdGVkUHRyPExvb2t1cExpc3Q+KGxvb2t1cExpc3RPZmZz
ZXQsIGJ1ZmZlcik7IH0KKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMo
Y29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBT
Y3JpcHRMaXN0KiBzY3JpcHRzID0gc2NyaXB0TGlzdChidWZmZXIpOworICAgICAgICBpZiAoIXNj
cmlwdHMpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHNjcmlwdHMtPmRl
ZmF1bHRMYW5nU3lzKGJ1ZmZlcik7CisgICAgfQorCisgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBm
ZWF0dXJlKE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZm
ZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBMYW5nU3lzVGFibGUqIGxhbmdTeXMgPSBk
ZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgICAgICBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVy
ZXMgPSBmZWF0dXJlTGlzdChidWZmZXIpOworICAgICAgICBpZiAoIWxhbmdTeXMgfHwgIWZlYXR1
cmVzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBsYW5nU3lzLT5mZWF0
dXJlKGZlYXR1cmVUYWcsIGZlYXR1cmVzLCBidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZ2V0
VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoSGFzaE1hcDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNv
bnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgRmVh
dHVyZVRhYmxlKiBmID0gZmVhdHVyZShPcGVuVHlwZTo6VmVydEZlYXR1cmVUYWcsIGJ1ZmZlcik7
CisgICAgICAgIGNvbnN0IExvb2t1cExpc3QqIGxvb2t1cHMgPSBsb29rdXBMaXN0KGJ1ZmZlcik7
CisgICAgICAgIHJldHVybiBmICYmIGxvb2t1cHMgJiYgZi0+Z2V0R2x5cGhTdWJzdGl0dXRpb25z
KGxvb2t1cHMsIG1hcCwgYnVmZmVyKTsKKyAgICB9Cit9OworCiAjcHJhZ21hIHBhY2soKQogCiB9
IC8vIG5hbWVzcGFjZSBPcGVuVHlwZQpAQCAtMTIyLDYgKzQyNCwxMiBAQCB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVkUHRyKGNvbnN0IFJlZlB0cjxTaGFyZWRCdWZmZXI+
JiBidWZmZXIsCiBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29u
c3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogICAgIDogbV9kZWZhdWx0VmVydE9y
aWdpblkoMCkKIHsKKyAgICBsb2FkTWV0cmljcyhwbGF0Zm9ybURhdGEpOworICAgIGxvYWRWZXJ0
aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhwbGF0Zm9ybURhdGEpOworfQorCit2b2lkIE9wZW5UeXBl
VmVydGljYWxEYXRhOjpsb2FkTWV0cmljcyhjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9y
bURhdGEpCit7CiAgICAgLy8gTG9hZCBoaGVhIGFuZCBobXR4IHRvIGdldCB4LWNvbXBvbmVudCBv
ZiB2ZXJ0aWNhbCBvcmlnaW5zLgogICAgIC8vIElmIHRoZXNlIHRhYmxlcyBhcmUgbWlzc2luZywg
aXQncyBub3QgYW4gT3BlblR5cGUgZm9udC4KICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZm
ZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6SGhlYVRhZyk7CkBAIC0y
MDUsNiArNTEzLDE0IEBAIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0
YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAgICAgfQogfQogCit2b2lk
IE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoY29u
c3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQoreworICAgIFJlZlB0cjxTaGFyZWRC
dWZmZXI+IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpHU1VC
VGFnKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6R1NVQlRhYmxlKiBnc3ViID0gdmFsaWRhdGVkUHRy
PE9wZW5UeXBlOjpHU1VCVGFibGU+KGJ1ZmZlcik7CisgICAgaWYgKGdzdWIpCisgICAgICAgIGdz
dWItPmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKCZtX3ZlcnRpY2FsR2x5cGhNYXAsICpi
dWZmZXIuZ2V0KCkpOworfQorCiBmbG9hdCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6YWR2YW5jZUhl
aWdodChjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGggZ2x5cGgpIGNvbnN0CiB7CiAg
ICAgc2l6ZV90IGNvdW50SGVpZ2h0cyA9IG1fYWR2YW5jZUhlaWdodHMuc2l6ZSgpOwpAQCAtMjYx
LDQgKzU3NywyMSBAQCB2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpnZXRWZXJ0aWNhbFRyYW5z
bGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YQogICAgIH0KIH0KIAordm9pZCBP
cGVuVHlwZVZlcnRpY2FsRGF0YTo6c3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBT
aW1wbGVGb250RGF0YSogZm9udCwgR2x5cGhQYWdlKiBnbHlwaFBhZ2UsIHVuc2lnbmVkIG9mZnNl
dCwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIGNvbnN0IEhhc2hNYXA8R2x5cGgsIEds
eXBoPiYgbWFwID0gbV92ZXJ0aWNhbEdseXBoTWFwOworICAgIGlmIChtYXAuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gb2Zmc2V0LCBlbmQg
PSBvZmZzZXQgKyBsZW5ndGg7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7CisgICAgICAgIEdseXBo
IGdseXBoID0gZ2x5cGhQYWdlLT5nbHlwaEF0KGluZGV4KTsKKyAgICAgICAgaWYgKGdseXBoKSB7
CisgICAgICAgICAgICBBU1NFUlQoZ2x5cGhQYWdlLT5nbHlwaERhdGFGb3JJbmRleChpbmRleCku
Zm9udERhdGEgPT0gZm9udCk7CisgICAgICAgICAgICBHbHlwaCB0byA9IG1hcC5nZXQoZ2x5cGgp
OworICAgICAgICAgICAgaWYgKHRvKQorICAgICAgICAgICAgICAgIGdseXBoUGFnZS0+c2V0R2x5
cGhEYXRhRm9ySW5kZXgoaW5kZXgsIHRvLCBmb250KTsKKyAgICAgICAgfQorICAgIH0KK30KKwog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKaW5k
ZXggODVlNGVlNy4uZjA3Mzk1NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oCkBA
IC00MywxMCArNDMsMTQgQEAgcHVibGljOgogICAgIGJvb2wgaGFzVmVydGljYWxNZXRyaWNzKCkg
Y29uc3QgeyByZXR1cm4gIW1fYWR2YW5jZUhlaWdodHMuaXNFbXB0eSgpOyB9CiAgICAgZmxvYXQg
YWR2YW5jZUhlaWdodChjb25zdCBTaW1wbGVGb250RGF0YSosIEdseXBoKSBjb25zdDsKICAgICB2
b2lkIGdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
KiwgY29uc3QgR2x5cGgqLCBzaXplX3QsIGZsb2F0KiBvdXRYWUFycmF5KSBjb25zdDsKKyAgICB2
b2lkIHN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqLCBH
bHlwaFBhZ2UqLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7CiAKIHBy
aXZhdGU6CisgICAgdm9pZCBsb2FkTWV0cmljcyhjb25zdCBGb250UGxhdGZvcm1EYXRhJik7Cisg
ICAgdm9pZCBsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgRm9udFBsYXRmb3Jt
RGF0YSYpOwogICAgIGJvb2wgaGFzVk9SRygpIGNvbnN0IHsgcmV0dXJuICFtX3ZlcnRPcmlnaW5Z
LmlzRW1wdHkoKTsgfQogCisgICAgSGFzaE1hcDxHbHlwaCwgR2x5cGg+IG1fdmVydGljYWxHbHlw
aE1hcDsKICAgICBWZWN0b3I8dWludDE2X3Q+IG1fYWR2YW5jZVdpZHRoczsKICAgICBWZWN0b3I8
dWludDE2X3Q+IG1fYWR2YW5jZUhlaWdodHM7CiAgICAgVmVjdG9yPGludDE2X3Q+IG1fdG9wU2lk
ZUJlYXJpbmdzOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>137513</attachid>
            <date>2012-04-17 04:20:44 -0700</date>
            <delta_ts>2012-04-20 00:56:42 -0700</delta_ts>
            <desc>Reflected changes from Kenichi&apos;s review</desc>
            <filename>81389-8.patch</filename>
            <type>text/plain</type>
            <size>20702</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAxMDBkOThmLi43OWQ4Yjc4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjMg
QEAKKzIwMTItMDMtMzAgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAnR1NVQicgT3BlblR5cGUgdGFi
bGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBnbHlwaHMuCisKKyAgICAgICAg
TGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkgY29kZSBwYXRoIHlldC4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzLgor
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERh
dGEuY3BwOiBBZGRlZCBuZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoVGFibGVC
YXNlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OmlzVmFsaWRFbmQp
OgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlRhYmxlQmFzZTo6dmFsaWRhdGVkUHRyKToK
KyAgICAgICAgKE9wZW5UeXBlKToKKyAgICAgICAgKENvdmVyYWdlVGFibGUpOgorICAgICAgICAo
Q292ZXJhZ2UxVGFibGUpOgorICAgICAgICAoQ292ZXJhZ2UyVGFibGUpOgorICAgICAgICAoUmFu
Z2VSZWNvcmQpOgorICAgICAgICAoU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OlN1YnN0aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZSk6CisgICAgICAg
IChTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoTG9va3VwVGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25z
KToKKyAgICAgICAgKExvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxv
b2t1cExpc3Q6Omxvb2t1cCk6CisgICAgICAgIChGZWF0dXJlVGFibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OkZlYXR1cmVUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAg
ICAgICAgKEZlYXR1cmVMaXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkZlYXR1cmVMaXN0OjpmZWF0dXJlKToKKyAgICAgICAgKExhbmdT
eXNUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TGFuZ1N5c1RhYmxlOjpmZWF0
dXJlKToKKyAgICAgICAgKFNjcmlwdFRhYmxlKToKKyAgICAgICAgKExhbmdTeXNSZWNvcmQpOgor
ICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNjcmlwdFRhYmxlOjpkZWZhdWx0TGFuZ1N5cyk6
CisgICAgICAgIChTY3JpcHRMaXN0KToKKyAgICAgICAgKFNjcmlwdFJlY29yZCk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6U2NyaXB0TGlzdDo6c2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0U2NyaXB0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpTY3JpcHRMaXN0OjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChHU1VC
VGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6c2NyaXB0TGlz
dCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpmZWF0dXJlTGlzdCk6
CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpsb29rdXBMaXN0KToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAg
ICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlv
bnMpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVy
dGljYWxEYXRhKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBl
VmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlw
aHMpOiBTdWJzdGl0dXRlIEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBJ
RHMuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNh
bERhdGEuaDogQWRkZWQgbV92ZXJ0aWNhbEdseXBoTWFwLgorICAgICAgICAoT3BlblR5cGVWZXJ0
aWNhbERhdGEpOgorCiAyMDEyLTA0LTEzICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90
QGdtYWlsLmNvbT4KIAogICAgICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMTE0MTQwLgpk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3Bl
blR5cGVWZXJ0aWNhbERhdGEuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
b3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwCmluZGV4IDc4ZWJjZjguLmQzNTE1ZmMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09w
ZW5UeXBlVmVydGljYWxEYXRhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAKQEAgLTM4LDYgKzM4LDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogbmFtZXNwYWNlIE9wZW5UeXBlIHsKIAogZW51bSB7CisgICAg
R1NVQlRhZyA9IE9UX01BS0VfVEFHKCdHJywgJ1MnLCAnVScsICdCJyksCiAgICAgSGhlYVRhZyA9
IE9UX01BS0VfVEFHKCdoJywgJ2gnLCAnZScsICdhJyksCiAgICAgSG10eFRhZyA9IE9UX01BS0Vf
VEFHKCdoJywgJ20nLCAndCcsICd4JyksCiAgICAgVmhlYVRhZyA9IE9UX01BS0VfVEFHKCd2Jywg
J2gnLCAnZScsICdhJyksCkBAIC00NSw2ICs0NiwzNiBAQCBlbnVtIHsKICAgICBWT1JHVGFnID0g
T1RfTUFLRV9UQUcoJ1YnLCAnTycsICdSJywgJ0cnKSwKIH07CiAKK2VudW0geworICAgIERlZmF1
bHRTY3JpcHRUYWcgPSBPVF9NQUtFX1RBRygnRCcsICdGJywgJ0wnLCAnVCcpLAorfTsKKworZW51
bSB7CisgICAgVmVydEZlYXR1cmVUYWcgPSBPVF9NQUtFX1RBRygndicsICdlJywgJ3InLCAndCcp
LAorfTsKKworc3RydWN0IFRhYmxlQmFzZSB7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wg
aXNWYWxpZEVuZChjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlciwgY29uc3Qgdm9pZCogcCkKKyAg
ICB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIq
PihwKSAtIGJ1ZmZlci5kYXRhKCk7CisgICAgICAgIHJldHVybiBvZmZzZXQgPD0gYnVmZmVyLnNp
emUoKTsgLy8gIjw9IiBiZWNhdXNlIGVuZCBpcyBpbmNsdWRlZCBhcyB2YWxpZAorICAgIH0KKwor
ICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgY29uc3QgVCogdmFsaWRhdGVQdHIoY29u
c3QgU2hhcmVkQnVmZmVyJiBidWZmZXIsIGNvbnN0IHZvaWQqIHApCisgICAgeworICAgICAgICBj
b25zdCBUKiBjYXN0ZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihwKTsKKyAgICAgICAg
aWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmNhc3RlZFsxXSkpCisgICAgICAgICAgICByZXR1cm4g
MDsKKyAgICAgICAgcmV0dXJuIGNhc3RlZDsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5h
bWUgVD4gY29uc3QgVCogdmFsaWRhdGVPZmZzZXQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIs
IHVpbnQxNl90IG9mZnNldCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiB2YWxpZGF0ZVB0
cjxUPihidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50OF90Kj4odGhpcykgKyBvZmZz
ZXQpOworICAgIH0KK307CisKICNwcmFnbWEgcGFjaygxKQogCiBzdHJ1Y3QgSGhlYVRhYmxlIHsK
QEAgLTEwOCwxMSArMTM5LDI4MiBAQCBzdHJ1Y3QgVk9SR1RhYmxlIHsKICAgICBzaXplX3QgcmVx
dWlyZWRTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZW9mKCp0aGlzKSArIHNpemVvZihWZXJ0T3Jp
Z2luWU1ldHJpY3MpICogKG51bVZlcnRPcmlnaW5ZTWV0cmljcyAtIDEpOyB9CiB9OwogCitzdHJ1
Y3QgQ292ZXJhZ2VUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBjb3Zl
cmFnZUZvcm1hdDsKK307CisKK3N0cnVjdCBDb3ZlcmFnZTFUYWJsZSA6IENvdmVyYWdlVGFibGUg
eworICAgIE9wZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPcGVuVHlwZTo6R2x5cGhJ
RCBnbHlwaEFycmF5WzFdOworfTsKKworc3RydWN0IENvdmVyYWdlMlRhYmxlIDogQ292ZXJhZ2VU
YWJsZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiByYW5nZUNvdW50OworICAgIHN0cnVjdCBSYW5n
ZVJlY29yZCB7CisgICAgICAgIE9wZW5UeXBlOjpHbHlwaElEIHN0YXJ0OworICAgICAgICBPcGVu
VHlwZTo6R2x5cGhJRCBlbmQ7CisgICAgICAgIE9wZW5UeXBlOjpVSW50MTYgc3RhcnRDb3ZlcmFn
ZUluZGV4OworICAgIH0gcmFuZ2VzWzFdOworfTsKKworc3RydWN0IFN1YnN0aXR1dGlvblN1YlRh
YmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IHN1YnN0Rm9ybWF0OworICAg
IE9wZW5UeXBlOjpPZmZzZXQgY292ZXJhZ2VPZmZzZXQ7CisKKyAgICBjb25zdCBDb3ZlcmFnZVRh
YmxlKiBjb3ZlcmFnZShjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QgeyByZXR1cm4g
dmFsaWRhdGVPZmZzZXQ8Q292ZXJhZ2VUYWJsZT4oYnVmZmVyLCBjb3ZlcmFnZU9mZnNldCk7IH0K
K307CisKK3N0cnVjdCBTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUgOiBTdWJzdGl0dXRpb25T
dWJUYWJsZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBnbHlwaENvdW50OworICAgIE9wZW5UeXBl
OjpHbHlwaElEIHN1YnN0aXR1dGVbMV07Cit9OworCitzdHJ1Y3QgTG9va3VwVGFibGUgOiBUYWJs
ZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwVHlwZTsKKyAgICBPcGVuVHlwZTo6
VUludDE2IGxvb2t1cEZsYWc7CisgICAgT3BlblR5cGU6OlVJbnQxNiBzdWJUYWJsZUNvdW50Owor
ICAgIE9wZW5UeXBlOjpPZmZzZXQgc3ViVGFibGVPZmZzZXRzWzFdOworICAgIC8vIE9wZW5UeXBl
OjpVSW50MTYgbWFya0ZpbHRlcmluZ1NldDsgdGhpcyBmaWVsZCBjb21lcyBhZnRlciB2YXJpYWJs
ZSBsZW5ndGgsIHNvIG9mZnNldCBpcyBkZXRlcm1pbmVkIGR5bmFtaWNhbGx5LgorCisgICAgYm9v
bCBnZXRTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBjb25zdCBTaGFy
ZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50U3Vi
VGFibGUgPSBzdWJUYWJsZUNvdW50OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAm
c3ViVGFibGVPZmZzZXRzW2NvdW50U3ViVGFibGVdKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgc3dpdGNoIChsb29rdXBUeXBlKSB7CisgICAgICAgIGNhc2UgMTogLy8gU2lu
Z2xlIFN1YnN0aXR1dGlvbiBTdWJ0YWJsZQorICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0g
MDsgaSA8IGNvdW50U3ViVGFibGU7ICsraSkgeworICAgICAgICAgICAgICAgIGNvbnN0IFN1YnN0
aXR1dGlvblN1YlRhYmxlKiBzdWIgPSB2YWxpZGF0ZU9mZnNldDxTdWJzdGl0dXRpb25TdWJUYWJs
ZT4oYnVmZmVyLCBzdWJUYWJsZU9mZnNldHNbaV0pOworICAgICAgICAgICAgICAgIGlmICghc3Vi
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgY29u
c3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UgPSBzdWItPmNvdmVyYWdlKGJ1ZmZlcik7CisgICAg
ICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3ViLT5zdWJzdEZvcm1hdCkgeworICAgICAg
ICAgICAgICAgIGNhc2UgMjogeyAvLyBTaW5nbGUgU3Vic3RpdHV0aW9uIEZvcm1hdCAyCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IFNpbmdsZVN1YnN0aXR1dGlvbjJTdWJUYWJsZSogczIgPSB2
YWxpZGF0ZVB0cjxTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGU+KGJ1ZmZlciwgc3ViKTsKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKCFzMikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY291bnRUbyA9IHMyLT5nbHlw
aENvdW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAmczIt
PnN1YnN0aXR1dGVbY291bnRUb10pKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdmVyYWdlLT5jb3ZlcmFnZUZvcm1h
dCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsgLy8gQ292ZXJhZ2UgRm9ybWF0IDEg
KGUuZy4sIE1TIEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdl
MVRhYmxlKiBjMSA9IHZhbGlkYXRlUHRyPENvdmVyYWdlMVRhYmxlPihidWZmZXIsIGNvdmVyYWdl
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYzEpCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qg
Y291bnRGcm9tID0gYzEtPmdseXBoQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
IWlzVmFsaWRFbmQoYnVmZmVyLCAmYzEtPmdseXBoQXJyYXlbY291bnRGcm9tXSkgfHwgY291bnRU
byAhPSBjb3VudEZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IGNvdW50
VG87ICsraSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAtPnNldChjMS0+Z2x5cGhB
cnJheVtpXSwgczItPnN1YnN0aXR1dGVbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJl
YWs7IH0KKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiB7IC8vIENvdmVyYWdlIEZvcm1hdCAy
IChlLmcuLCBBZG9iZSBLb3p1a2EgR290aGljKQorICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgQ292ZXJhZ2UyVGFibGUqIGMyID0gdmFsaWRhdGVQdHI8Q292ZXJhZ2UyVGFibGU+KGJ1ZmZl
ciwgY292ZXJhZ2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjMikKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAg
ICB1aW50MTZfdCBjb3VudFJhbmdlID0gYzItPnJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAmYzItPnJhbmdlc1tjb3VudFJhbmdlXSkp
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAgICAgZm9yICh1aW50MTZfdCBpID0gMCwgaW5kZXhUbyA9IDA7IGkgPCBjb3VudFJh
bmdlOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcm9tID0g
YzItPnJhbmdlc1tpXS5zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZf
dCBmcm9tRW5kID0gYzItPnJhbmdlc1tpXS5lbmQgKyAxOyAvLyBPcGVuVHlwZSAiZW5kIiBpcyBp
bmNsdXNpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhUbyArICAoZnJv
bUVuZCAtIGZyb20pID4gY291bnRUbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoOyBmcm9tICE9
IGZyb21FbmQ7ICsrZnJvbSwgKytpbmRleFRvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtYXAtPnNldChmcm9tLCBzMi0+c3Vic3RpdHV0ZVtpbmRleFRvXSk7CisgICAgICAgICAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgfQorICAgICAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9S
KCJDb3ZlcmFnZUZvcm1hdCAlZCBub3Qgc3VwcG9ydGVkIiwgY292ZXJhZ2UtPmNvdmVyYWdlRm9y
bWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0VSUk9SKCJTdWJzdEZvcm1hdCAlZCBub3Qgc3Vw
cG9ydGVkIiwgc3ViLT5zdWJzdEZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0VSUk9SKCJMb29rdXBUeXBlICVkIG5vdCBz
dXBwb3J0ZWQiLCBsb29rdXBUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBMb29rdXBMaXN0IDogVGFi
bGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENvdW50OworICAgIE9wZW5UeXBl
OjpPZmZzZXQgbG9va3VwT2Zmc2V0c1sxXTsKKworICAgIGNvbnN0IExvb2t1cFRhYmxlKiBsb29r
dXAodWludDE2X3QgaW5kZXgsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAg
IHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAgaWYgKGlu
ZGV4ID49IGNvdW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmxvb2t1cE9mZnNldHNbY291bnRd
KSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8
TG9va3VwVGFibGU+KGJ1ZmZlciwgbG9va3VwT2Zmc2V0c1tpbmRleF0pOworICAgIH0KK307CisK
K3N0cnVjdCBGZWF0dXJlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQg
ZmVhdHVyZVBhcmFtczsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENvdW50OworICAgIE9w
ZW5UeXBlOjpVSW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAgYm9vbCBnZXRHbHlwaFN1
YnN0aXR1dGlvbnMoY29uc3QgTG9va3VwTGlzdCogbG9va3VwcywgSGFzaE1hcDxHbHlwaCwgR2x5
cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAg
ICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5k
KGJ1ZmZlciwgJmxvb2t1cExpc3RJbmRleFtjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAg
ICAgICAgICAgY29uc3QgTG9va3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1cHMtPmxvb2t1cChsb29r
dXBMaXN0SW5kZXhbaV0sIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoIWxvb2t1cCB8fCAhbG9v
a3VwLT5nZXRTdWJzdGl0dXRpb25zKG1hcCwgYnVmZmVyKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKwor
c3RydWN0IEZlYXR1cmVMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGZl
YXR1cmVDb3VudDsKKyAgICBzdHJ1Y3QgRmVhdHVyZVJlY29yZCB7CisgICAgICAgIE9wZW5UeXBl
OjpUYWcgZmVhdHVyZVRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNldCBmZWF0dXJlT2Zmc2V0
OworICAgIH0gZmVhdHVyZXNbMV07CisKKyAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUo
dWludDE2X3QgaW5kZXgsIE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1
ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gZmVhdHVyZUNvdW50
OworICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRFbmQoYnVmZmVyLCAmZmVh
dHVyZXNbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZmVhdHVy
ZXNbaW5kZXhdLmZlYXR1cmVUYWcgPT0gdGFnKQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRl
T2Zmc2V0PEZlYXR1cmVUYWJsZT4oYnVmZmVyLCBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZU9mZnNl
dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVjdCBMYW5nU3lzVGFibGUg
OiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3VwT3JkZXI7CisgICAgT3Bl
blR5cGU6OlVJbnQxNiByZXFGZWF0dXJlSW5kZXg7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0
dXJlQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJlSW5kZXhbMV07CisKKyAgICBj
b25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUoT3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnLCBjb25z
dCBGZWF0dXJlTGlzdCogZmVhdHVyZXMsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25z
dAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0dXJlQ291bnQ7CisgICAgICAg
IGlmICghaXNWYWxpZEVuZChidWZmZXIsICZmZWF0dXJlSW5kZXhbY291bnRdKSkKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291bnQ7IGkr
KykgeworICAgICAgICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmID0gZmVhdHVyZXMtPmZlYXR1
cmUoZmVhdHVyZUluZGV4W2ldLCBmZWF0dXJlVGFnLCBidWZmZXIpOworICAgICAgICAgICAgaWYg
KGYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBP
cGVuVHlwZTo6T2Zmc2V0IGRlZmF1bHRMYW5nU3lzT2Zmc2V0OworICAgIE9wZW5UeXBlOjpVSW50
MTYgbGFuZ1N5c0NvdW50OworICAgIHN0cnVjdCBMYW5nU3lzUmVjb3JkIHsKKyAgICAgICAgT3Bl
blR5cGU6OlRhZyBsYW5nU3lzVGFnOworICAgICAgICBPcGVuVHlwZTo6T2Zmc2V0IGxhbmdTeXNP
ZmZzZXQ7CisgICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsKKworICAgIGNvbnN0IExhbmdTeXNUYWJs
ZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAg
eworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxhbmdTeXNDb3VudDsKKyAgICAgICAgaWYgKCFp
c1ZhbGlkRW5kKGJ1ZmZlciwgJmxhbmdTeXNSZWNvcmRzW2NvdW50XSkpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgdWludDE2X3Qgb2Zmc2V0ID0gZGVmYXVsdExhbmdTeXNPZmZzZXQ7
CisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8
TGFuZ1N5c1RhYmxlPihidWZmZXIsIG9mZnNldCk7CisgICAgICAgIGlmIChjb3VudCkKKyAgICAg
ICAgICAgIHJldHVybiB2YWxpZGF0ZU9mZnNldDxMYW5nU3lzVGFibGU+KGJ1ZmZlciwgbGFuZ1N5
c1JlY29yZHNbMF0ubGFuZ1N5c09mZnNldCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307
CisKK3N0cnVjdCBTY3JpcHRMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2
IHNjcmlwdENvdW50OworICAgIHN0cnVjdCBTY3JpcHRSZWNvcmQgeworICAgICAgICBPcGVuVHlw
ZTo6VGFnIHNjcmlwdFRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNldCBzY3JpcHRPZmZzZXQ7
CisgICAgfSBzY3JpcHRzWzFdOworCisgICAgY29uc3QgU2NyaXB0VGFibGUqIHNjcmlwdChPcGVu
VHlwZTo6VGFnIHRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgewor
ICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENvdW50OworICAgICAgICBpZiAoIWlzVmFs
aWRFbmQoYnVmZmVyLCAmc2NyaXB0c1tjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAg
ICBpZiAoc2NyaXB0c1tpXS5zY3JpcHRUYWcgPT0gdGFnKQorICAgICAgICAgICAgICAgIHJldHVy
biB2YWxpZGF0ZU9mZnNldDxTY3JpcHRUYWJsZT4oYnVmZmVyLCBzY3JpcHRzW2ldLnNjcmlwdE9m
ZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3Qg
U2NyaXB0VGFibGUqIGRlZmF1bHRTY3JpcHQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNv
bnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENvdW50OworICAgICAg
ICBpZiAoIWNvdW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZlciwgJnNjcmlwdHNbY291bnRdKSkKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSogcyA9IHNjcmlw
dChPcGVuVHlwZTo6RGVmYXVsdFNjcmlwdFRhZywgYnVmZmVyKTsKKyAgICAgICAgaWYgKHMpCisg
ICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PFNjcmlw
dFRhYmxlPihidWZmZXIsIHNjcmlwdHNbMF0uc2NyaXB0T2Zmc2V0KTsKKyAgICB9CisKKyAgICBj
b25zdCBMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzKGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVm
ZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgU2NyaXB0VGFibGUqIHMgPSBkZWZhdWx0
U2NyaXB0KGJ1ZmZlcik7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgICAgICByZXR1cm4gcy0+ZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsKKyAgICB9Cit9OworCitz
dHJ1Y3QgR1NVQlRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6Rml4ZWQgdmVyc2lv
bjsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IHNjcmlwdExpc3RPZmZzZXQ7CisgICAgT3BlblR5cGU6
Ok9mZnNldCBmZWF0dXJlTGlzdE9mZnNldDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGxvb2t1cExp
c3RPZmZzZXQ7CisKKyAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRMaXN0KGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9mZnNldDxTY3JpcHRMaXN0
PihidWZmZXIsIHNjcmlwdExpc3RPZmZzZXQpOyB9CisgICAgY29uc3QgRmVhdHVyZUxpc3QqIGZl
YXR1cmVMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxp
ZGF0ZU9mZnNldDxGZWF0dXJlTGlzdD4oYnVmZmVyLCBmZWF0dXJlTGlzdE9mZnNldCk7IH0KKyAg
ICBjb25zdCBMb29rdXBMaXN0KiBsb29rdXBMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVy
KSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9mZnNldDxMb29rdXBMaXN0PihidWZmZXIsIGxvb2t1
cExpc3RPZmZzZXQpOyB9CisKKyAgICBjb25zdCBMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lz
KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3Qg
U2NyaXB0TGlzdCogc2NyaXB0cyA9IHNjcmlwdExpc3QoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFz
Y3JpcHRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzY3JpcHRzLT5k
ZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgIH0KKworICAgIGNvbnN0IEZlYXR1cmVUYWJsZSog
ZmVhdHVyZShPcGVuVHlwZTo6VGFnIGZlYXR1cmVUYWcsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVm
ZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBsYW5nU3lzID0g
ZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsKKyAgICAgICAgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1
cmVzID0gZmVhdHVyZUxpc3QoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFsYW5nU3lzIHx8ICFmZWF0
dXJlcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbGFuZ1N5cy0+ZmVh
dHVyZShmZWF0dXJlVGFnLCBmZWF0dXJlcywgYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGdl
dFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IEZl
YXR1cmVUYWJsZSogZiA9IGZlYXR1cmUoT3BlblR5cGU6OlZlcnRGZWF0dXJlVGFnLCBidWZmZXIp
OworICAgICAgICBjb25zdCBMb29rdXBMaXN0KiBsb29rdXBzID0gbG9va3VwTGlzdChidWZmZXIp
OworICAgICAgICByZXR1cm4gZiAmJiBsb29rdXBzICYmIGYtPmdldEdseXBoU3Vic3RpdHV0aW9u
cyhsb29rdXBzLCBtYXAsIGJ1ZmZlcik7CisgICAgfQorfTsKKwogI3ByYWdtYSBwYWNrKCkKIAog
fSAvLyBuYW1lc3BhY2UgT3BlblR5cGUKIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQq
IHZhbGlkYXRlZFB0cihjb25zdCBSZWZQdHI8U2hhcmVkQnVmZmVyPiYgYnVmZmVyLCBzaXplX3Qg
Y291bnQgPSAxKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlU2l6ZShj
b25zdCBSZWZQdHI8U2hhcmVkQnVmZmVyPiYgYnVmZmVyLCBzaXplX3QgY291bnQgPSAxKQogewog
ICAgIGlmICghYnVmZmVyIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgc2l6ZW9mKFQpICogY291bnQpCiAg
ICAgICAgIHJldHVybiAwOwpAQCAtMTIyLDEwICs0MjQsMTYgQEAgdGVtcGxhdGUgPHR5cGVuYW1l
IFQ+IGNvbnN0IFQqIHZhbGlkYXRlZFB0cihjb25zdCBSZWZQdHI8U2hhcmVkQnVmZmVyPiYgYnVm
ZmVyLAogT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZv
bnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKICAgICA6IG1fZGVmYXVsdFZlcnRPcmlnaW5Z
KDApCiB7CisgICAgbG9hZE1ldHJpY3MocGxhdGZvcm1EYXRhKTsKKyAgICBsb2FkVmVydGljYWxH
bHlwaFN1YnN0aXR1dGlvbnMocGxhdGZvcm1EYXRhKTsKK30KKwordm9pZCBPcGVuVHlwZVZlcnRp
Y2FsRGF0YTo6bG9hZE1ldHJpY3MoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRh
KQorewogICAgIC8vIExvYWQgaGhlYSBhbmQgaG10eCB0byBnZXQgeC1jb21wb25lbnQgb2YgdmVy
dGljYWwgb3JpZ2lucy4KICAgICAvLyBJZiB0aGVzZSB0YWJsZXMgYXJlIG1pc3NpbmcsIGl0J3Mg
bm90IGFuIE9wZW5UeXBlIGZvbnQuCiAgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0g
cGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6OkhoZWFUYWcpOwotICAgIGNvbnN0
IE9wZW5UeXBlOjpIaGVhVGFibGUqIGhoZWEgPSB2YWxpZGF0ZWRQdHI8T3BlblR5cGU6OkhoZWFU
YWJsZT4oYnVmZmVyKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6SGhlYVRhYmxlKiBoaGVhID0gdmFs
aWRhdGVTaXplPE9wZW5UeXBlOjpIaGVhVGFibGU+KGJ1ZmZlcik7CiAgICAgaWYgKCFoaGVhKQog
ICAgICAgICByZXR1cm47CiAgICAgdWludDE2X3QgY291bnRIbXR4RW50cmllcyA9IGhoZWEtPm51
bWJlck9mSE1ldHJpY3M7CkBAIC0xMzUsNyArNDQzLDcgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6
Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0
YSkKICAgICB9CiAKICAgICBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVu
VHlwZTo6SG10eFRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6OkhtdHhUYWJsZSogaG10eCA9IHZh
bGlkYXRlZFB0cjxPcGVuVHlwZTo6SG10eFRhYmxlPihidWZmZXIsIGNvdW50SG10eEVudHJpZXMp
OworICAgIGNvbnN0IE9wZW5UeXBlOjpIbXR4VGFibGUqIGhtdHggPSB2YWxpZGF0ZVNpemU8T3Bl
blR5cGU6OkhtdHhUYWJsZT4oYnVmZmVyLCBjb3VudEhtdHhFbnRyaWVzKTsKICAgICBpZiAoIWht
dHgpIHsKICAgICAgICAgTE9HX0VSUk9SKCJoaGVhIGV4aXN0cyBidXQgaG10eCBkb2VzIG5vdCAo
b3IgYnJva2VuKSIpOwogICAgICAgICByZXR1cm47CkBAIC0xNDYsNyArNDU0LDcgQEAgT3BlblR5
cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURh
dGEmIHBsYXRmb3JtRGF0YSkKIAogICAgIC8vIExvYWQgdmhlYSBmaXJzdC4gVGhpcyB0YWJsZSBp
cyByZXF1aXJlZCBmb3IgZm9udHMgdGhhdCBzdXBwb3J0IHZlcnRpY2FsIGZsb3cuCiAgICAgYnVm
ZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6OlZoZWFUYWcpOwotICAg
IGNvbnN0IE9wZW5UeXBlOjpWaGVhVGFibGUqIHZoZWEgPSB2YWxpZGF0ZWRQdHI8T3BlblR5cGU6
OlZoZWFUYWJsZT4oYnVmZmVyKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6VmhlYVRhYmxlKiB2aGVh
ID0gdmFsaWRhdGVTaXplPE9wZW5UeXBlOjpWaGVhVGFibGU+KGJ1ZmZlcik7CiAgICAgaWYgKCF2
aGVhKQogICAgICAgICByZXR1cm47CiAgICAgdWludDE2X3QgY291bnRWbXR4RW50cmllcyA9IHZo
ZWEtPm51bU9mTG9uZ1Zlck1ldHJpY3M7CkBAIC0xNTcsNyArNDY1LDcgQEAgT3BlblR5cGVWZXJ0
aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBs
YXRmb3JtRGF0YSkKIAogICAgIC8vIExvYWQgVk9SRy4gVGhpcyB0YWJsZSBpcyBvcHRpb25hbC4K
ICAgICBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6Vk9SR1Rh
Zyk7Ci0gICAgY29uc3QgT3BlblR5cGU6OlZPUkdUYWJsZSogdm9yZyA9IHZhbGlkYXRlZFB0cjxP
cGVuVHlwZTo6Vk9SR1RhYmxlPihidWZmZXIpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWT1JHVGFi
bGUqIHZvcmcgPSB2YWxpZGF0ZVNpemU8T3BlblR5cGU6OlZPUkdUYWJsZT4oYnVmZmVyKTsKICAg
ICBpZiAodm9yZyAmJiBidWZmZXItPnNpemUoKSA+PSB2b3JnLT5yZXF1aXJlZFNpemUoKSkgewog
ICAgICAgICBtX2RlZmF1bHRWZXJ0T3JpZ2luWSA9IHZvcmctPmRlZmF1bHRWZXJ0T3JpZ2luWTsK
ICAgICAgICAgdWludDE2X3QgY291bnRWZXJ0T3JpZ2luWU1ldHJpY3MgPSB2b3JnLT5udW1WZXJ0
T3JpZ2luWU1ldHJpY3M7CkBAIC0xNzQsNyArNDgyLDcgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6
Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0
YSkKIAogICAgIC8vIExvYWQgdm10eCB0aGVuLiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVkIGZvciBm
b250cyB0aGF0IHN1cHBvcnQgdmVydGljYWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0Zm9ybURh
dGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6Vm10eFRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6
OlZtdHhUYWJsZSogdm10eCA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6Vm10eFRhYmxlPihidWZm
ZXIsIGNvdW50Vm10eEVudHJpZXMpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWbXR4VGFibGUqIHZt
dHggPSB2YWxpZGF0ZVNpemU8T3BlblR5cGU6OlZtdHhUYWJsZT4oYnVmZmVyLCBjb3VudFZtdHhF
bnRyaWVzKTsKICAgICBpZiAoIXZtdHgpIHsKICAgICAgICAgTE9HX0VSUk9SKCJ2aGVhIGV4aXN0
cyBidXQgdm10eCBkb2VzIG5vdCAob3IgYnJva2VuKSIpOwogICAgICAgICByZXR1cm47CkBAIC0y
MDUsNiArNTEzLDE0IEBAIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0
YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAgICAgfQogfQogCit2b2lk
IE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoY29u
c3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQoreworICAgIFJlZlB0cjxTaGFyZWRC
dWZmZXI+IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpHU1VC
VGFnKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6R1NVQlRhYmxlKiBnc3ViID0gdmFsaWRhdGVTaXpl
PE9wZW5UeXBlOjpHU1VCVGFibGU+KGJ1ZmZlcik7CisgICAgaWYgKGdzdWIpCisgICAgICAgIGdz
dWItPmdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKCZtX3ZlcnRpY2FsR2x5cGhNYXAsICpi
dWZmZXIuZ2V0KCkpOworfQorCiBmbG9hdCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6YWR2YW5jZUhl
aWdodChjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgR2x5cGggZ2x5cGgpIGNvbnN0CiB7CiAg
ICAgc2l6ZV90IGNvdW50SGVpZ2h0cyA9IG1fYWR2YW5jZUhlaWdodHMuc2l6ZSgpOwpAQCAtMjYx
LDQgKzU3NywyMSBAQCB2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpnZXRWZXJ0aWNhbFRyYW5z
bGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YQogICAgIH0KIH0KIAordm9pZCBP
cGVuVHlwZVZlcnRpY2FsRGF0YTo6c3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBT
aW1wbGVGb250RGF0YSogZm9udCwgR2x5cGhQYWdlKiBnbHlwaFBhZ2UsIHVuc2lnbmVkIG9mZnNl
dCwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdAoreworICAgIGNvbnN0IEhhc2hNYXA8R2x5cGgsIEds
eXBoPiYgbWFwID0gbV92ZXJ0aWNhbEdseXBoTWFwOworICAgIGlmIChtYXAuaXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKHVuc2lnbmVkIGluZGV4ID0gb2Zmc2V0LCBlbmQg
PSBvZmZzZXQgKyBsZW5ndGg7IGluZGV4IDwgZW5kOyArK2luZGV4KSB7CisgICAgICAgIEdseXBo
IGdseXBoID0gZ2x5cGhQYWdlLT5nbHlwaEF0KGluZGV4KTsKKyAgICAgICAgaWYgKGdseXBoKSB7
CisgICAgICAgICAgICBBU1NFUlQoZ2x5cGhQYWdlLT5nbHlwaERhdGFGb3JJbmRleChpbmRleCku
Zm9udERhdGEgPT0gZm9udCk7CisgICAgICAgICAgICBHbHlwaCB0byA9IG1hcC5nZXQoZ2x5cGgp
OworICAgICAgICAgICAgaWYgKHRvKQorICAgICAgICAgICAgICAgIGdseXBoUGFnZS0+c2V0R2x5
cGhEYXRhRm9ySW5kZXgoaW5kZXgsIHRvLCBmb250KTsKKyAgICAgICAgfQorICAgIH0KK30KKwog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKaW5k
ZXggODVlNGVlNy4uZjA3Mzk1NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAorKysgYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oCkBA
IC00MywxMCArNDMsMTQgQEAgcHVibGljOgogICAgIGJvb2wgaGFzVmVydGljYWxNZXRyaWNzKCkg
Y29uc3QgeyByZXR1cm4gIW1fYWR2YW5jZUhlaWdodHMuaXNFbXB0eSgpOyB9CiAgICAgZmxvYXQg
YWR2YW5jZUhlaWdodChjb25zdCBTaW1wbGVGb250RGF0YSosIEdseXBoKSBjb25zdDsKICAgICB2
b2lkIGdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
KiwgY29uc3QgR2x5cGgqLCBzaXplX3QsIGZsb2F0KiBvdXRYWUFycmF5KSBjb25zdDsKKyAgICB2
b2lkIHN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqLCBH
bHlwaFBhZ2UqLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3Q7CiAKIHBy
aXZhdGU6CisgICAgdm9pZCBsb2FkTWV0cmljcyhjb25zdCBGb250UGxhdGZvcm1EYXRhJik7Cisg
ICAgdm9pZCBsb2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgRm9udFBsYXRmb3Jt
RGF0YSYpOwogICAgIGJvb2wgaGFzVk9SRygpIGNvbnN0IHsgcmV0dXJuICFtX3ZlcnRPcmlnaW5Z
LmlzRW1wdHkoKTsgfQogCisgICAgSGFzaE1hcDxHbHlwaCwgR2x5cGg+IG1fdmVydGljYWxHbHlw
aE1hcDsKICAgICBWZWN0b3I8dWludDE2X3Q+IG1fYWR2YW5jZVdpZHRoczsKICAgICBWZWN0b3I8
dWludDE2X3Q+IG1fYWR2YW5jZUhlaWdodHM7CiAgICAgVmVjdG9yPGludDE2X3Q+IG1fdG9wU2lk
ZUJlYXJpbmdzOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>138058</attachid>
            <date>2012-04-20 00:56:42 -0700</date>
            <delta_ts>2012-07-15 10:31:31 -0700</delta_ts>
            <desc>Reflected changes from Kenichi&apos;s review</desc>
            <filename>81389-9.patch</filename>
            <type>text/plain</type>
            <size>20689</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCBlNzg4MDhkLi4yYWMxODQwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjMg
QEAKKzIwMTItMDQtMjAgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAnR1NVQicgT3BlblR5cGUgdGFi
bGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBnbHlwaHMuCisKKyAgICAgICAg
TGlrZSBidWcgODEzMjYsIHRoaXMgY29kZSBpc24ndCBvbiBhbnkgY29kZSBwYXRoIHlldC4KKwor
ICAgICAgICBObyBuZXcgdGVzdHMgYXJlIHJlcXVpcmVkLiBObyBiZWhhdmlvciBjaGFuZ2VzIHVu
dGlsIDQ4NDU5IGNhbGxzIGZ1bmN0aW9ucyBpbiB0aGlzIHBhdGNoLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwOiBBZGRlZCBu
ZWNlc3NhcnkgT3BlblR5cGUgdGFibGVzLgorICAgICAgICAoVGFibGVCYXNlKToKKyAgICAgICAg
KFdlYkNvcmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OmlzVmFsaWRFbmQpOgorICAgICAgICAoV2Vi
Q29yZTo6T3BlblR5cGU6OlRhYmxlQmFzZTo6dmFsaWRhdGVkUHRyKToKKyAgICAgICAgKE9wZW5U
eXBlKToKKyAgICAgICAgKENvdmVyYWdlVGFibGUpOgorICAgICAgICAoQ292ZXJhZ2UxVGFibGUp
OgorICAgICAgICAoQ292ZXJhZ2UyVGFibGUpOgorICAgICAgICAoUmFuZ2VSZWNvcmQpOgorICAg
ICAgICAoU3Vic3RpdHV0aW9uU3ViVGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6
OlN1YnN0aXR1dGlvblN1YlRhYmxlOjpjb3ZlcmFnZSk6CisgICAgICAgIChTaW5nbGVTdWJzdGl0
dXRpb24yU3ViVGFibGUpOgorICAgICAgICAoTG9va3VwVGFibGUpOgorICAgICAgICAoV2ViQ29y
ZTo6T3BlblR5cGU6Okxvb2t1cFRhYmxlOjpnZXRTdWJzdGl0dXRpb25zKToKKyAgICAgICAgKExv
b2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6Okxvb2t1cExpc3Q6Omxvb2t1
cCk6CisgICAgICAgIChGZWF0dXJlVGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6
OkZlYXR1cmVUYWJsZTo6Z2V0R2x5cGhTdWJzdGl0dXRpb25zKToKKyAgICAgICAgKEZlYXR1cmVM
aXN0KToKKyAgICAgICAgKEZlYXR1cmVSZWNvcmQpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGU6OkZlYXR1cmVMaXN0OjpmZWF0dXJlKToKKyAgICAgICAgKExhbmdTeXNUYWJsZSk6CisgICAg
ICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TGFuZ1N5c1RhYmxlOjpmZWF0dXJlKToKKyAgICAgICAg
KFNjcmlwdFRhYmxlKToKKyAgICAgICAgKExhbmdTeXNSZWNvcmQpOgorICAgICAgICAoV2ViQ29y
ZTo6T3BlblR5cGU6OlNjcmlwdFRhYmxlOjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChTY3Jp
cHRMaXN0KToKKyAgICAgICAgKFNjcmlwdFJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVu
VHlwZTo6U2NyaXB0TGlzdDo6c2NyaXB0KToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpT
Y3JpcHRMaXN0OjpkZWZhdWx0U2NyaXB0KToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpT
Y3JpcHRMaXN0OjpkZWZhdWx0TGFuZ1N5cyk6CisgICAgICAgIChHU1VCVGFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6T3BlblR5cGU6OkdTVUJUYWJsZTo6c2NyaXB0TGlzdCk6CisgICAgICAgIChX
ZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpmZWF0dXJlTGlzdCk6CisgICAgICAgIChXZWJD
b3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpsb29rdXBMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGU6OkdTVUJUYWJsZTo6Z2V0VmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAo
V2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKToKKyAg
ICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6
OmxvYWRNZXRyaWNzKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlVmVydGljYWxEYXRhOjps
b2FkVmVydGljYWxHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlwaHMpOiBTdWJzdGl0dXRl
IEdseXBoIElEcyB3aXRoIHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBJRHMuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaDogQWRkZWQg
bV92ZXJ0aWNhbEdseXBoTWFwLgorICAgICAgICAoT3BlblR5cGVWZXJ0aWNhbERhdGEpOgorCiAy
MDEyLTA0LTE3ICBZdXJ5IFNlbWlraGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIFdlYiBJbnNwZWN0b3I6IG1vdmUgaGVhcCBzbmFwc2hvdCBkYXRhIGdyaWRzIGludG8gdGhl
aXIgb3duIGZpbGUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmNwcAppbmRleCA3OGVi
Y2Y4Li44NDA2NjdiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwCkBAIC0z
OCw2ICszOCw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIG5hbWVzcGFjZSBPcGVuVHlwZSB7CiAK
IGVudW0geworICAgIEdTVUJUYWcgPSBPVF9NQUtFX1RBRygnRycsICdTJywgJ1UnLCAnQicpLAog
ICAgIEhoZWFUYWcgPSBPVF9NQUtFX1RBRygnaCcsICdoJywgJ2UnLCAnYScpLAogICAgIEhtdHhU
YWcgPSBPVF9NQUtFX1RBRygnaCcsICdtJywgJ3QnLCAneCcpLAogICAgIFZoZWFUYWcgPSBPVF9N
QUtFX1RBRygndicsICdoJywgJ2UnLCAnYScpLApAQCAtNDUsNiArNDYsMzYgQEAgZW51bSB7CiAg
ICAgVk9SR1RhZyA9IE9UX01BS0VfVEFHKCdWJywgJ08nLCAnUicsICdHJyksCiB9OwogCitlbnVt
IHsKKyAgICBEZWZhdWx0U2NyaXB0VGFnID0gT1RfTUFLRV9UQUcoJ0QnLCAnRicsICdMJywgJ1Qn
KSwKK307CisKK2VudW0geworICAgIFZlcnRGZWF0dXJlVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAn
ZScsICdyJywgJ3QnKSwKK307CisKK3N0cnVjdCBUYWJsZUJhc2UgeworcHJvdGVjdGVkOgorICAg
IHN0YXRpYyBib29sIGlzVmFsaWRFbmQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIsIGNvbnN0
IHZvaWQqIHApCisgICAgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBjaGFyKj4ocCkgLSBidWZmZXIuZGF0YSgpOworICAgICAgICByZXR1cm4gb2Zmc2V0
IDw9IGJ1ZmZlci5zaXplKCk7IC8vICI8PSIgYmVjYXVzZSBlbmQgaXMgaW5jbHVkZWQgYXMgdmFs
aWQKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIGNvbnN0IFQqIHZh
bGlkYXRlUHRyKGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyLCBjb25zdCB2b2lkKiBwKQorICAg
IHsKKyAgICAgICAgY29uc3QgVCogY2FzdGVkID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4o
cCk7CisgICAgICAgIGlmICghaXNWYWxpZEVuZChidWZmZXIsICZjYXN0ZWRbMV0pKQorICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBjYXN0ZWQ7CisgICAgfQorCisgICAgdGVt
cGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlT2Zmc2V0KGNvbnN0IFNoYXJlZEJ1
ZmZlciYgYnVmZmVyLCB1aW50MTZfdCBvZmZzZXQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1
cm4gdmFsaWRhdGVQdHI8VD4oYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDhfdCo+
KHRoaXMpICsgb2Zmc2V0KTsKKyAgICB9Cit9OworCiAjcHJhZ21hIHBhY2soMSkKIAogc3RydWN0
IEhoZWFUYWJsZSB7CkBAIC0xMDgsMTEgKzEzOSwyNzMgQEAgc3RydWN0IFZPUkdUYWJsZSB7CiAg
ICAgc2l6ZV90IHJlcXVpcmVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZigqdGhpcykgKyBz
aXplb2YoVmVydE9yaWdpbllNZXRyaWNzKSAqIChudW1WZXJ0T3JpZ2luWU1ldHJpY3MgLSAxKTsg
fQogfTsKIAorc3RydWN0IENvdmVyYWdlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBl
OjpVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9OworCitzdHJ1Y3QgQ292ZXJhZ2UxVGFibGUgOiBD
b3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGdseXBoQ291bnQ7CisgICAgT3Bl
blR5cGU6OkdseXBoSUQgZ2x5cGhBcnJheVsxXTsKK307CisKK3N0cnVjdCBDb3ZlcmFnZTJUYWJs
ZSA6IENvdmVyYWdlVGFibGUgeworICAgIE9wZW5UeXBlOjpVSW50MTYgcmFuZ2VDb3VudDsKKyAg
ICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdGFydDsK
KyAgICAgICAgT3BlblR5cGU6OkdseXBoSUQgZW5kOworICAgICAgICBPcGVuVHlwZTo6VUludDE2
IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJhbmdlc1sxXTsKK307CisKK3N0cnVjdCBTdWJz
dGl0dXRpb25TdWJUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBzdWJz
dEZvcm1hdDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGNvdmVyYWdlT2Zmc2V0OworCisgICAgY29u
c3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNv
bnN0IHsgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PENvdmVyYWdlVGFibGU+KGJ1ZmZlciwgY292ZXJh
Z2VPZmZzZXQpOyB9Cit9OworCitzdHJ1Y3QgU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlIDog
U3Vic3RpdHV0aW9uU3ViVGFibGUgeworICAgIE9wZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3VudDsK
KyAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdWJzdGl0dXRlWzFdOworfTsKKworc3RydWN0IExvb2t1
cFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cFR5cGU7Cisg
ICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBGbGFnOworICAgIE9wZW5UeXBlOjpVSW50MTYgc3Vi
VGFibGVDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IHN1YlRhYmxlT2Zmc2V0c1sxXTsKKyAg
ICAvLyBPcGVuVHlwZTo6VUludDE2IG1hcmtGaWx0ZXJpbmdTZXQ7IHRoaXMgZmllbGQgY29tZXMg
YWZ0ZXIgdmFyaWFibGUgbGVuZ3RoLCBzbyBvZmZzZXQgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxs
eS4KKworICAgIGJvb2wgZ2V0U3Vic3RpdHV0aW9ucyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1h
cCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50
MTZfdCBjb3VudFN1YlRhYmxlID0gc3ViVGFibGVDb3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlk
RW5kKGJ1ZmZlciwgJnN1YlRhYmxlT2Zmc2V0c1tjb3VudFN1YlRhYmxlXSkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobG9va3VwVHlwZSkgeworICAgICAgICBj
YXNlIDE6IC8vIFNpbmdsZSBTdWJzdGl0dXRpb24gU3VidGFibGUKKyAgICAgICAgICAgIGZvciAo
dWludDE2X3QgaSA9IDA7IGkgPCBjb3VudFN1YlRhYmxlOyArK2kpIHsKKyAgICAgICAgICAgICAg
ICBjb25zdCBTdWJzdGl0dXRpb25TdWJUYWJsZSogc3Vic3RpdHV0aW9uID0gdmFsaWRhdGVPZmZz
ZXQ8U3Vic3RpdHV0aW9uU3ViVGFibGU+KGJ1ZmZlciwgc3ViVGFibGVPZmZzZXRzW2ldKTsKKyAg
ICAgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGlvbikKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlVGFibGUqIGNvdmVyYWdl
ID0gc3Vic3RpdHV0aW9uLT5jb3ZlcmFnZShidWZmZXIpOworICAgICAgICAgICAgICAgIGlmICgh
Y292ZXJhZ2UpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
ICAgICBzd2l0Y2ggKHN1YnN0aXR1dGlvbi0+c3Vic3RGb3JtYXQpIHsKKyAgICAgICAgICAgICAg
ICBjYXNlIDI6IHsgLy8gU2luZ2xlIFN1YnN0aXR1dGlvbiBGb3JtYXQgMgorICAgICAgICAgICAg
ICAgICAgICBjb25zdCBTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGUqIHNpbmdsZVN1YnN0aXR1
dGlvbjIgPSB2YWxpZGF0ZVB0cjxTaW5nbGVTdWJzdGl0dXRpb24yU3ViVGFibGU+KGJ1ZmZlciwg
c3Vic3RpdHV0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzaW5nbGVTdWJzdGl0dXRp
b24yKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICB1aW50MTZfdCBjb3VudFRvID0gc2luZ2xlU3Vic3RpdHV0aW9uMi0+Z2x5cGhDb3Vu
dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJnNpbmdsZVN1
YnN0aXR1dGlvbjItPnN1YnN0aXR1dGVbY291bnRUb10pKQorICAgICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvdmVyYWdlLT5j
b3ZlcmFnZUZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IHsgLy8gQ292ZXJh
Z2UgRm9ybWF0IDEgKGUuZy4sIE1TIEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IENvdmVyYWdlMVRhYmxlKiBjb3ZlcmFnZTEgPSB2YWxpZGF0ZVB0cjxDb3ZlcmFnZTFUYWJs
ZT4oYnVmZmVyLCBjb3ZlcmFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvdmVy
YWdlMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudEZyb20gPSBjb3ZlcmFnZTEtPmdseXBoQ291
bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAmY292
ZXJhZ2UxLT5nbHlwaEFycmF5W2NvdW50RnJvbV0pIHx8IGNvdW50VG8gIT0gY291bnRGcm9tKQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudFRvOyArK2kpCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbWFwLT5zZXQoY292ZXJhZ2UxLT5nbHlwaEFycmF5W2ldLCBz
aW5nbGVTdWJzdGl0dXRpb24yLT5zdWJzdGl0dXRlW2ldKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOyB9CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBDb3ZlcmFnZSBG
b3JtYXQgMiAoZS5nLiwgQWRvYmUgS296dWthIEdvdGhpYykKKyAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IENvdmVyYWdlMlRhYmxlKiBjb3ZlcmFnZTIgPSB2YWxpZGF0ZVB0cjxDb3ZlcmFn
ZTJUYWJsZT4oYnVmZmVyLCBjb3ZlcmFnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
IWNvdmVyYWdlMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudFJhbmdlID0gY292ZXJhZ2UyLT5y
YW5nZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZl
ciwgJmNvdmVyYWdlMi0+cmFuZ2VzW2NvdW50UmFuZ2VdKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQx
Nl90IGkgPSAwLCBpbmRleFRvID0gMDsgaSA8IGNvdW50UmFuZ2U7IGkrKykgeworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyb20gPSBjb3ZlcmFnZTItPnJhbmdlc1tpXS5z
dGFydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmcm9tRW5kID0gY292
ZXJhZ2UyLT5yYW5nZXNbaV0uZW5kICsgMTsgLy8gT3BlblR5cGUgImVuZCIgaXMgaW5jbHVzaXZl
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4VG8gKyAgKGZyb21FbmQgLSBm
cm9tKSA+IGNvdW50VG8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5k
OyArK2Zyb20sICsraW5kZXhUbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFw
LT5zZXQoZnJvbSwgc2luZ2xlU3Vic3RpdHV0aW9uMi0+c3Vic3RpdHV0ZVtpbmRleFRvXSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsg
fQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyB9Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKworc3RydWN0IExvb2t1cExp
c3QgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwQ291bnQ7CisgICAg
T3BlblR5cGU6Ok9mZnNldCBsb29rdXBPZmZzZXRzWzFdOworCisgICAgY29uc3QgTG9va3VwVGFi
bGUqIGxvb2t1cCh1aW50MTZfdCBpbmRleCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNv
bnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50OworICAgICAg
ICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRFbmQoYnVmZmVyLCAmbG9va3VwT2Zmc2V0
c1tjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiB2YWxpZGF0
ZU9mZnNldDxMb29rdXBUYWJsZT4oYnVmZmVyLCBsb29rdXBPZmZzZXRzW2luZGV4XSk7CisgICAg
fQorfTsKKworc3RydWN0IEZlYXR1cmVUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6
Ok9mZnNldCBmZWF0dXJlUGFyYW1zOworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwQ291bnQ7
CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBMaXN0SW5kZXhbMV07CisKKyAgICBib29sIGdl
dEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBMb29rdXBMaXN0KiBsb29rdXBzLCBIYXNoTWFwPEds
eXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAg
eworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxvb2t1cENvdW50OworICAgICAgICBpZiAoIWlz
VmFsaWRFbmQoYnVmZmVyLCAmbG9va3VwTGlzdEluZGV4W2NvdW50XSkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudDsgaSsr
KSB7CisgICAgICAgICAgICBjb25zdCBMb29rdXBUYWJsZSogbG9va3VwID0gbG9va3Vwcy0+bG9v
a3VwKGxvb2t1cExpc3RJbmRleFtpXSwgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmICghbG9va3Vw
IHx8ICFsb29rdXAtPmdldFN1YnN0aXR1dGlvbnMobWFwLCBidWZmZXIpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
Cit9OworCitzdHJ1Y3QgRmVhdHVyZUxpc3QgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpV
SW50MTYgZmVhdHVyZUNvdW50OworICAgIHN0cnVjdCBGZWF0dXJlUmVjb3JkIHsKKyAgICAgICAg
T3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnOworICAgICAgICBPcGVuVHlwZTo6T2Zmc2V0IGZlYXR1
cmVPZmZzZXQ7CisgICAgfSBmZWF0dXJlc1sxXTsKKworICAgIGNvbnN0IEZlYXR1cmVUYWJsZSog
ZmVhdHVyZSh1aW50MTZfdCBpbmRleCwgT3BlblR5cGU6OlRhZyB0YWcsIGNvbnN0IFNoYXJlZEJ1
ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0
dXJlQ291bnQ7CisgICAgICAgIGlmIChpbmRleCA+PSBjb3VudCB8fCAhaXNWYWxpZEVuZChidWZm
ZXIsICZmZWF0dXJlc1tjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlm
IChmZWF0dXJlc1tpbmRleF0uZmVhdHVyZVRhZyA9PSB0YWcpCisgICAgICAgICAgICByZXR1cm4g
dmFsaWRhdGVPZmZzZXQ8RmVhdHVyZVRhYmxlPihidWZmZXIsIGZlYXR1cmVzW2luZGV4XS5mZWF0
dXJlT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IExhbmdT
eXNUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6Ok9mZnNldCBsb29rdXBPcmRlcjsK
KyAgICBPcGVuVHlwZTo6VUludDE2IHJlcUZlYXR1cmVJbmRleDsKKyAgICBPcGVuVHlwZTo6VUlu
dDE2IGZlYXR1cmVDb3VudDsKKyAgICBPcGVuVHlwZTo6VUludDE2IGZlYXR1cmVJbmRleFsxXTsK
KworICAgIGNvbnN0IEZlYXR1cmVUYWJsZSogZmVhdHVyZShPcGVuVHlwZTo6VGFnIGZlYXR1cmVU
YWcsIGNvbnN0IEZlYXR1cmVMaXN0KiBmZWF0dXJlcywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZm
ZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGZlYXR1cmVDb3VudDsK
KyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmZlYXR1cmVJbmRleFtjb3VudF0pKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBj
b3VudDsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmVUYWJs
ZSA9IGZlYXR1cmVzLT5mZWF0dXJlKGZlYXR1cmVJbmRleFtpXSwgZmVhdHVyZVRhZywgYnVmZmVy
KTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlVGFibGUpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZlYXR1cmVUYWJsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9Owor
CitzdHJ1Y3QgU2NyaXB0VGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQg
ZGVmYXVsdExhbmdTeXNPZmZzZXQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsYW5nU3lzQ291bnQ7
CisgICAgc3RydWN0IExhbmdTeXNSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6VGFnIGxhbmdT
eXNUYWc7CisgICAgICAgIE9wZW5UeXBlOjpPZmZzZXQgbGFuZ1N5c09mZnNldDsKKyAgICB9IGxh
bmdTeXNSZWNvcmRzWzFdOworCisgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBkZWZhdWx0TGFuZ1N5
cyhjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQx
Nl90IGNvdW50ID0gbGFuZ1N5c0NvdW50OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVy
LCAmbGFuZ1N5c1JlY29yZHNbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAg
ICB1aW50MTZfdCBvZmZzZXQgPSBkZWZhdWx0TGFuZ1N5c09mZnNldDsKKyAgICAgICAgaWYgKG9m
ZnNldCkKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9mZnNldDxMYW5nU3lzVGFibGU+KGJ1
ZmZlciwgb2Zmc2V0KTsKKyAgICAgICAgaWYgKGNvdW50KQorICAgICAgICAgICAgcmV0dXJuIHZh
bGlkYXRlT2Zmc2V0PExhbmdTeXNUYWJsZT4oYnVmZmVyLCBsYW5nU3lzUmVjb3Jkc1swXS5sYW5n
U3lzT2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlw
dExpc3QgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgc2NyaXB0Q291bnQ7Cisg
ICAgc3RydWN0IFNjcmlwdFJlY29yZCB7CisgICAgICAgIE9wZW5UeXBlOjpUYWcgc2NyaXB0VGFn
OworICAgICAgICBPcGVuVHlwZTo6T2Zmc2V0IHNjcmlwdE9mZnNldDsKKyAgICB9IHNjcmlwdHNb
MV07CisKKyAgICBjb25zdCBTY3JpcHRUYWJsZSogc2NyaXB0KE9wZW5UeXBlOjpUYWcgdGFnLCBj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90
IGNvdW50ID0gc2NyaXB0Q291bnQ7CisgICAgICAgIGlmICghaXNWYWxpZEVuZChidWZmZXIsICZz
Y3JpcHRzW2NvdW50XSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yICh1aW50
MTZfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzY3JpcHRzW2ld
LnNjcmlwdFRhZyA9PSB0YWcpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0
PFNjcmlwdFRhYmxlPihidWZmZXIsIHNjcmlwdHNbaV0uc2NyaXB0T2Zmc2V0KTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjb25zdCBTY3JpcHRUYWJsZSogZGVm
YXVsdFNjcmlwdChjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAg
ICAgIHVpbnQxNl90IGNvdW50ID0gc2NyaXB0Q291bnQ7CisgICAgICAgIGlmICghY291bnQgfHwg
IWlzVmFsaWRFbmQoYnVmZmVyLCAmc2NyaXB0c1tjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIGNvbnN0IFNjcmlwdFRhYmxlKiBzY3JpcHRPZkRlZmF1bHRUYWcgPSBzY3Jp
cHQoT3BlblR5cGU6OkRlZmF1bHRTY3JpcHRUYWcsIGJ1ZmZlcik7CisgICAgICAgIGlmIChzY3Jp
cHRPZkRlZmF1bHRUYWcpCisgICAgICAgICAgICByZXR1cm4gc2NyaXB0T2ZEZWZhdWx0VGFnOwor
ICAgICAgICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8U2NyaXB0VGFibGU+KGJ1ZmZlciwgc2NyaXB0
c1swXS5zY3JpcHRPZmZzZXQpOworICAgIH0KKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVm
YXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAg
ICAgICBjb25zdCBTY3JpcHRUYWJsZSogcyA9IGRlZmF1bHRTY3JpcHQoYnVmZmVyKTsKKyAgICAg
ICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzLT5kZWZh
dWx0TGFuZ1N5cyhidWZmZXIpOworICAgIH0KK307CisKK3N0cnVjdCBHU1VCVGFibGUgOiBUYWJs
ZUJhc2UgeworICAgIE9wZW5UeXBlOjpGaXhlZCB2ZXJzaW9uOworICAgIE9wZW5UeXBlOjpPZmZz
ZXQgc2NyaXB0TGlzdE9mZnNldDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGZlYXR1cmVMaXN0T2Zm
c2V0OworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3VwTGlzdE9mZnNldDsKKworICAgIGNvbnN0
IFNjcmlwdExpc3QqIHNjcmlwdExpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0
IHsgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PFNjcmlwdExpc3Q+KGJ1ZmZlciwgc2NyaXB0TGlzdE9m
ZnNldCk7IH0KKyAgICBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVyZUxpc3QoY29uc3QgU2hhcmVk
QnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PEZlYXR1cmVMaXN0
PihidWZmZXIsIGZlYXR1cmVMaXN0T2Zmc2V0KTsgfQorICAgIGNvbnN0IExvb2t1cExpc3QqIGxv
b2t1cExpc3QoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlk
YXRlT2Zmc2V0PExvb2t1cExpc3Q+KGJ1ZmZlciwgbG9va3VwTGlzdE9mZnNldCk7IH0KKworICAg
IGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBi
dWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRzID0g
c2NyaXB0TGlzdChidWZmZXIpOworICAgICAgICBpZiAoIXNjcmlwdHMpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHNjcmlwdHMtPmRlZmF1bHRMYW5nU3lzKGJ1ZmZlcik7
CisgICAgfQorCisgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmZWF0dXJlKE9wZW5UeXBlOjpUYWcg
ZmVhdHVyZVRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAg
ICAgICBjb25zdCBMYW5nU3lzVGFibGUqIGxhbmdTeXMgPSBkZWZhdWx0TGFuZ1N5cyhidWZmZXIp
OworICAgICAgICBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVyZXMgPSBmZWF0dXJlTGlzdChidWZm
ZXIpOworICAgICAgICBpZiAoIWxhbmdTeXMgfHwgIWZlYXR1cmVzKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIHJldHVybiBsYW5nU3lzLT5mZWF0dXJlKGZlYXR1cmVUYWcsIGZlYXR1
cmVzLCBidWZmZXIpOworICAgIH0KKworICAgIGJvb2wgZ2V0VmVydGljYWxHbHlwaFN1YnN0aXR1
dGlvbnMoSGFzaE1hcDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVm
ZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiB2ZXJ0ID0gZmVh
dHVyZShPcGVuVHlwZTo6VmVydEZlYXR1cmVUYWcsIGJ1ZmZlcik7CisgICAgICAgIGNvbnN0IExv
b2t1cExpc3QqIGxvb2t1cHMgPSBsb29rdXBMaXN0KGJ1ZmZlcik7CisgICAgICAgIHJldHVybiB2
ZXJ0ICYmIGxvb2t1cHMgJiYgdmVydC0+Z2V0R2x5cGhTdWJzdGl0dXRpb25zKGxvb2t1cHMsIG1h
cCwgYnVmZmVyKTsKKyAgICB9Cit9OworCiAjcHJhZ21hIHBhY2soKQogCiB9IC8vIG5hbWVzcGFj
ZSBPcGVuVHlwZQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVkUHRy
KGNvbnN0IFJlZlB0cjxTaGFyZWRCdWZmZXI+JiBidWZmZXIsIHNpemVfdCBjb3VudCA9IDEpCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVTaXplKGNvbnN0IFJlZlB0cjxT
aGFyZWRCdWZmZXI+JiBidWZmZXIsIHNpemVfdCBjb3VudCA9IDEpCiB7CiAgICAgaWYgKCFidWZm
ZXIgfHwgYnVmZmVyLT5zaXplKCkgPCBzaXplb2YoVCkgKiBjb3VudCkKICAgICAgICAgcmV0dXJu
IDA7CkBAIC0xMjIsMTAgKzQxNSwxNiBAQCB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCog
dmFsaWRhdGVkUHRyKGNvbnN0IFJlZlB0cjxTaGFyZWRCdWZmZXI+JiBidWZmZXIsCiBPcGVuVHlw
ZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0
YSYgcGxhdGZvcm1EYXRhKQogICAgIDogbV9kZWZhdWx0VmVydE9yaWdpblkoMCkKIHsKKyAgICBs
b2FkTWV0cmljcyhwbGF0Zm9ybURhdGEpOworICAgIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0
aW9ucyhwbGF0Zm9ybURhdGEpOworfQorCit2b2lkIE9wZW5UeXBlVmVydGljYWxEYXRhOjpsb2Fk
TWV0cmljcyhjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CiAgICAgLy8g
TG9hZCBoaGVhIGFuZCBobXR4IHRvIGdldCB4LWNvbXBvbmVudCBvZiB2ZXJ0aWNhbCBvcmlnaW5z
LgogICAgIC8vIElmIHRoZXNlIHRhYmxlcyBhcmUgbWlzc2luZywgaXQncyBub3QgYW4gT3BlblR5
cGUgZm9udC4KICAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBwbGF0Zm9ybURhdGEu
b3BlblR5cGVUYWJsZShPcGVuVHlwZTo6SGhlYVRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6Okho
ZWFUYWJsZSogaGhlYSA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6SGhlYVRhYmxlPihidWZmZXIp
OworICAgIGNvbnN0IE9wZW5UeXBlOjpIaGVhVGFibGUqIGhoZWEgPSB2YWxpZGF0ZVNpemU8T3Bl
blR5cGU6OkhoZWFUYWJsZT4oYnVmZmVyKTsKICAgICBpZiAoIWhoZWEpCiAgICAgICAgIHJldHVy
bjsKICAgICB1aW50MTZfdCBjb3VudEhtdHhFbnRyaWVzID0gaGhlYS0+bnVtYmVyT2ZITWV0cmlj
czsKQEAgLTEzNSw3ICs0MzQsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0
aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogICAgIH0KIAog
ICAgIGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpIbXR4VGFn
KTsKLSAgICBjb25zdCBPcGVuVHlwZTo6SG10eFRhYmxlKiBobXR4ID0gdmFsaWRhdGVkUHRyPE9w
ZW5UeXBlOjpIbXR4VGFibGU+KGJ1ZmZlciwgY291bnRIbXR4RW50cmllcyk7CisgICAgY29uc3Qg
T3BlblR5cGU6OkhtdHhUYWJsZSogaG10eCA9IHZhbGlkYXRlU2l6ZTxPcGVuVHlwZTo6SG10eFRh
YmxlPihidWZmZXIsIGNvdW50SG10eEVudHJpZXMpOwogICAgIGlmICghaG10eCkgewogICAgICAg
ICBMT0dfRVJST1IoImhoZWEgZXhpc3RzIGJ1dCBobXR4IGRvZXMgbm90IChvciBicm9rZW4pIik7
CiAgICAgICAgIHJldHVybjsKQEAgLTE0Niw3ICs0NDUsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0
YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1E
YXRhKQogCiAgICAgLy8gTG9hZCB2aGVhIGZpcnN0LiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVkIGZv
ciBmb250cyB0aGF0IHN1cHBvcnQgdmVydGljYWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0Zm9y
bURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6VmhlYVRhZyk7Ci0gICAgY29uc3QgT3BlblR5
cGU6OlZoZWFUYWJsZSogdmhlYSA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6VmhlYVRhYmxlPihi
dWZmZXIpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWaGVhVGFibGUqIHZoZWEgPSB2YWxpZGF0ZVNp
emU8T3BlblR5cGU6OlZoZWFUYWJsZT4oYnVmZmVyKTsKICAgICBpZiAoIXZoZWEpCiAgICAgICAg
IHJldHVybjsKICAgICB1aW50MTZfdCBjb3VudFZtdHhFbnRyaWVzID0gdmhlYS0+bnVtT2ZMb25n
VmVyTWV0cmljczsKQEAgLTE1Nyw3ICs0NTYsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3Bl
blR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQog
CiAgICAgLy8gTG9hZCBWT1JHLiBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsLgogICAgIGJ1ZmZlciA9
IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpWT1JHVGFnKTsKLSAgICBjb25z
dCBPcGVuVHlwZTo6Vk9SR1RhYmxlKiB2b3JnID0gdmFsaWRhdGVkUHRyPE9wZW5UeXBlOjpWT1JH
VGFibGU+KGJ1ZmZlcik7CisgICAgY29uc3QgT3BlblR5cGU6OlZPUkdUYWJsZSogdm9yZyA9IHZh
bGlkYXRlU2l6ZTxPcGVuVHlwZTo6Vk9SR1RhYmxlPihidWZmZXIpOwogICAgIGlmICh2b3JnICYm
IGJ1ZmZlci0+c2l6ZSgpID49IHZvcmctPnJlcXVpcmVkU2l6ZSgpKSB7CiAgICAgICAgIG1fZGVm
YXVsdFZlcnRPcmlnaW5ZID0gdm9yZy0+ZGVmYXVsdFZlcnRPcmlnaW5ZOwogICAgICAgICB1aW50
MTZfdCBjb3VudFZlcnRPcmlnaW5ZTWV0cmljcyA9IHZvcmctPm51bVZlcnRPcmlnaW5ZTWV0cmlj
czsKQEAgLTE3NCw3ICs0NzMsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0
aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogCiAgICAgLy8g
TG9hZCB2bXR4IHRoZW4uIFRoaXMgdGFibGUgaXMgcmVxdWlyZWQgZm9yIGZvbnRzIHRoYXQgc3Vw
cG9ydCB2ZXJ0aWNhbCBmbG93LgogICAgIGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRh
YmxlKE9wZW5UeXBlOjpWbXR4VGFnKTsKLSAgICBjb25zdCBPcGVuVHlwZTo6Vm10eFRhYmxlKiB2
bXR4ID0gdmFsaWRhdGVkUHRyPE9wZW5UeXBlOjpWbXR4VGFibGU+KGJ1ZmZlciwgY291bnRWbXR4
RW50cmllcyk7CisgICAgY29uc3QgT3BlblR5cGU6OlZtdHhUYWJsZSogdm10eCA9IHZhbGlkYXRl
U2l6ZTxPcGVuVHlwZTo6Vm10eFRhYmxlPihidWZmZXIsIGNvdW50Vm10eEVudHJpZXMpOwogICAg
IGlmICghdm10eCkgewogICAgICAgICBMT0dfRVJST1IoInZoZWEgZXhpc3RzIGJ1dCB2bXR4IGRv
ZXMgbm90IChvciBicm9rZW4pIik7CiAgICAgICAgIHJldHVybjsKQEAgLTIwNSw2ICs1MDQsMTQg
QEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQ
bGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKICAgICB9CiB9CiAKK3ZvaWQgT3BlblR5cGVWZXJ0
aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBGb250UGxhdGZv
cm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVy
ID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6OkdTVUJUYWcpOworICAgIGNv
bnN0IE9wZW5UeXBlOjpHU1VCVGFibGUqIGdzdWIgPSB2YWxpZGF0ZVNpemU8T3BlblR5cGU6OkdT
VUJUYWJsZT4oYnVmZmVyKTsKKyAgICBpZiAoZ3N1YikKKyAgICAgICAgZ3N1Yi0+Z2V0VmVydGlj
YWxHbHlwaFN1YnN0aXR1dGlvbnMoJm1fdmVydGljYWxHbHlwaE1hcCwgKmJ1ZmZlci5nZXQoKSk7
Cit9CisKIGZsb2F0IE9wZW5UeXBlVmVydGljYWxEYXRhOjphZHZhbmNlSGVpZ2h0KGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBmb250LCBHbHlwaCBnbHlwaCkgY29uc3QKIHsKICAgICBzaXplX3QgY291
bnRIZWlnaHRzID0gbV9hZHZhbmNlSGVpZ2h0cy5zaXplKCk7CkBAIC0yNjEsNCArNTY4LDIxIEBA
IHZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5
cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRhCiAgICAgfQogfQogCit2b2lkIE9wZW5UeXBlVmVydGlj
YWxEYXRhOjpzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250LCBHbHlwaFBhZ2UqIGdseXBoUGFnZSwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBs
ZW5ndGgpIGNvbnN0Cit7CisgICAgY29uc3QgSGFzaE1hcDxHbHlwaCwgR2x5cGg+JiBtYXAgPSBt
X3ZlcnRpY2FsR2x5cGhNYXA7CisgICAgaWYgKG1hcC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGZvciAodW5zaWduZWQgaW5kZXggPSBvZmZzZXQsIGVuZCA9IG9mZnNldCArIGxl
bmd0aDsgaW5kZXggPCBlbmQ7ICsraW5kZXgpIHsKKyAgICAgICAgR2x5cGggZ2x5cGggPSBnbHlw
aFBhZ2UtPmdseXBoQXQoaW5kZXgpOworICAgICAgICBpZiAoZ2x5cGgpIHsKKyAgICAgICAgICAg
IEFTU0VSVChnbHlwaFBhZ2UtPmdseXBoRGF0YUZvckluZGV4KGluZGV4KS5mb250RGF0YSA9PSBm
b250KTsKKyAgICAgICAgICAgIEdseXBoIHRvID0gbWFwLmdldChnbHlwaCk7CisgICAgICAgICAg
ICBpZiAodG8pCisgICAgICAgICAgICAgICAgZ2x5cGhQYWdlLT5zZXRHbHlwaERhdGFGb3JJbmRl
eChpbmRleCwgdG8sIGZvbnQpOworICAgICAgICB9CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9v
cGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEuaAppbmRleCA4NWU0ZWU3Li5m
MDczOTU3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVu
dHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKQEAgLTQzLDEwICs0Mywx
NCBAQCBwdWJsaWM6CiAgICAgYm9vbCBoYXNWZXJ0aWNhbE1ldHJpY3MoKSBjb25zdCB7IHJldHVy
biAhbV9hZHZhbmNlSGVpZ2h0cy5pc0VtcHR5KCk7IH0KICAgICBmbG9hdCBhZHZhbmNlSGVpZ2h0
KGNvbnN0IFNpbXBsZUZvbnREYXRhKiwgR2x5cGgpIGNvbnN0OwogICAgIHZvaWQgZ2V0VmVydGlj
YWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqLCBjb25zdCBHbHlw
aCosIHNpemVfdCwgZmxvYXQqIG91dFhZQXJyYXkpIGNvbnN0OworICAgIHZvaWQgc3Vic3RpdHV0
ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBTaW1wbGVGb250RGF0YSosIEdseXBoUGFnZSosIHVu
c2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICB2
b2lkIGxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmKTsKKyAgICB2b2lkIGxvYWRW
ZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBGb250UGxhdGZvcm1EYXRhJik7CiAgICAg
Ym9vbCBoYXNWT1JHKCkgY29uc3QgeyByZXR1cm4gIW1fdmVydE9yaWdpblkuaXNFbXB0eSgpOyB9
CiAKKyAgICBIYXNoTWFwPEdseXBoLCBHbHlwaD4gbV92ZXJ0aWNhbEdseXBoTWFwOwogICAgIFZl
Y3Rvcjx1aW50MTZfdD4gbV9hZHZhbmNlV2lkdGhzOwogICAgIFZlY3Rvcjx1aW50MTZfdD4gbV9h
ZHZhbmNlSGVpZ2h0czsKICAgICBWZWN0b3I8aW50MTZfdD4gbV90b3BTaWRlQmVhcmluZ3M7Cg==
</data>
<flag name="review"
          id="143316"
          type_id="1"
          status="-"
          setter="tony"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152462</attachid>
            <date>2012-07-15 10:31:31 -0700</date>
            <delta_ts>2012-07-15 11:43:21 -0700</delta_ts>
            <desc>Reflected items from Tony&apos;s review</desc>
            <filename>81389-10.patch</filename>
            <type>text/plain</type>
            <size>27395</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAzYmY2NTBhLi42ZTA2MTFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjgg
QEAKKzIwMTItMDctMTUgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAnR1NVQicgT3BlblR5cGUgdGFi
bGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBnbHlwaHMuCisgICAgICAgIGh0
dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nc3ViLmh0bQorCisgICAg
ICAgIExpa2UgYnVnIDgxMzI2LCB0aGlzIGNvZGUgaXNuJ3Qgb24gYW55IGNvZGUgcGF0aCB5ZXQu
CisKKyAgICAgICAgVGVzdHM6IFdlYktpdC9jaHJvbWl1bS90ZXN0cy9PcGVuVHlwZVZlcnRpY2Fs
RGF0YVRlc3QuY3BwCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVu
VHlwZVR5cGVzLmg6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZSk6
IE1vdmVkIGZyb20gT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwIGZvciB1bml0IHRlc3RzLgorICAg
ICAgICAoT3BlblR5cGUpOgorICAgICAgICAoVGFibGVCYXNlKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpPcGVuVHlwZTo6VGFibGVCYXNlOjppc1ZhbGlkRW5kKToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OnZhbGlkYXRlUHRyKToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OnZhbGlkYXRlT2Zmc2V0KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHA6CisgICAgICAgIChP
cGVuVHlwZSk6IEFkZGVkIHNldmVyYWwgT3BlblR5cGUgdGFibGVzIHVzZWQgYnkgJ0dTVUInIHRh
YmxlLgorICAgICAgICAoQ292ZXJhZ2VUYWJsZSk6CisgICAgICAgIChDb3ZlcmFnZTFUYWJsZSk6
CisgICAgICAgIChDb3ZlcmFnZTJUYWJsZSk6CisgICAgICAgIChSYW5nZVJlY29yZCk6CisgICAg
ICAgIChTdWJzdGl0dXRpb25TdWJUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6
U3Vic3RpdHV0aW9uU3ViVGFibGU6OmNvdmVyYWdlKToKKyAgICAgICAgKFNpbmdsZVN1YnN0aXR1
dGlvbjJTdWJUYWJsZSk6CisgICAgICAgIChMb29rdXBUYWJsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpPcGVuVHlwZTo6TG9va3VwVGFibGU6OmdldFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoTG9v
a3VwTGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TG9va3VwTGlzdDo6bG9va3Vw
KToKKyAgICAgICAgKEZlYXR1cmVUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6
RmVhdHVyZVRhYmxlOjpnZXRHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoRmVhdHVyZUxp
c3QpOgorICAgICAgICAoRmVhdHVyZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlw
ZTo6RmVhdHVyZUxpc3Q6OmZlYXR1cmUpOgorICAgICAgICAoTGFuZ1N5c1RhYmxlKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpMYW5nU3lzVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
U2NyaXB0VGFibGUpOgorICAgICAgICAoTGFuZ1N5c1JlY29yZCk6CisgICAgICAgIChXZWJDb3Jl
OjpPcGVuVHlwZTo6U2NyaXB0VGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAgICAgICAgKFNjcmlw
dExpc3QpOgorICAgICAgICAoU2NyaXB0UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5U
eXBlOjpTY3JpcHRMaXN0OjpzY3JpcHQpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNj
cmlwdExpc3Q6OmRlZmF1bHRTY3JpcHQpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNj
cmlwdExpc3Q6OmRlZmF1bHRMYW5nU3lzKToKKyAgICAgICAgKEdTVUJUYWJsZSk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpzY3JpcHRMaXN0KToKKyAgICAgICAgKFdl
YkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmVMaXN0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6Omxvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6
T3BlblR5cGU6OkdTVUJUYWJsZTo6ZGVmYXVsdExhbmdTeXMpOgorICAgICAgICAoV2ViQ29yZTo6
T3BlblR5cGU6OkdTVUJUYWJsZTo6ZmVhdHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlw
ZTo6R1NVQlRhYmxlOjpnZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyk6CisgICAgICAgIChX
ZWJDb3JlOjpPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKTogU3BsaXQg
Y29kZSB0byBsb2FkIG1ldHJpY3MgZnJvbSBjdG9yLgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyk6IExvYWQgdGhl
IHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBzdWJzdGl0dXRpb24gdGFibGUuCisgICAgICAgIChX
ZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlVmVydGljYWxEYXRhOjpzdWJzdGl0
dXRlV2l0aFZlcnRpY2FsR2x5cGhzKTogU3Vic3RpdHV0ZSBHbHlwaCBJRHMgd2l0aCB2ZXJ0aWNh
bCBhbHRlcm5hdGUgR2x5cGggSURzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW50
eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmg6CisgICAgICAgIChPcGVuVHlwZVZlcnRpY2FsRGF0
YSk6IEFkZGVkIG1fdmVydGljYWxHbHlwaE1hcC4KKwogMjAxMi0wNy0xNCAgRXJpYyBDYXJsc29u
ICA8ZXJpYy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBFbmFibGUgQVZDRiBoYXJkd2Fy
ZSB2aWRlbyBkZWNvZGluZwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVUeXBlcy5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVUeXBlcy5oCmluZGV4IDlmYzc2NTkuLjJmMmQ1MWMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09w
ZW5UeXBlVHlwZXMuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVu
dHlwZS9PcGVuVHlwZVR5cGVzLmgKQEAgLTI1LDYgKzI1LDggQEAKICNpZm5kZWYgT3BlblR5cGVU
eXBlc19oCiAjZGVmaW5lIE9wZW5UeXBlVHlwZXNfaAogCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVy
LmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIG5hbWVzcGFjZSBPcGVuVHlwZSB7CiAKQEAgLTY3
LDYgKzY5LDM3IEBAIHR5cGVkZWYgVUludDE2IEdseXBoSUQ7CiB0eXBlZGVmIHVpbnQzMl90IFRh
ZzsKICNkZWZpbmUgT1RfTUFLRV9UQUcoY2gxLCBjaDIsIGNoMywgY2g0KSAoKCgodWludDMyX3Qp
KGNoNCkpIDw8IDI0KSB8ICgoKHVpbnQzMl90KShjaDMpKSA8PCAxNikgfCAoKCh1aW50MzJfdCko
Y2gyKSkgPDwgOCkgfCAoKHVpbnQzMl90KShjaDEpKSkKIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+
IHN0YXRpYyBjb25zdCBUKiB2YWxpZGF0ZVRhYmxlKGNvbnN0IFJlZlB0cjxTaGFyZWRCdWZmZXI+
JiBidWZmZXIsIHNpemVfdCBjb3VudCA9IDEpCit7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVy
LT5zaXplKCkgPCBzaXplb2YoVCkgKiBjb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGJ1ZmZlci0+ZGF0YSgpKTsKK30KKworc3Ry
dWN0IFRhYmxlQmFzZSB7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEVuZChj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlciwgY29uc3Qgdm9pZCogcG9zaXRpb24pCisgICAgewor
ICAgICAgICBpZiAocG9zaXRpb24gPCBidWZmZXIuZGF0YSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBj
aGFyKj4ocG9zaXRpb24pIC0gYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA8
PSBidWZmZXIuc2l6ZSgpOyAvLyAiPD0iIGJlY2F1c2UgZW5kIGlzIGluY2x1ZGVkIGFzIHZhbGlk
CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBjb25zdCBUKiB2YWxp
ZGF0ZVB0cihjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlciwgY29uc3Qgdm9pZCogcG9zaXRpb24p
CisgICAgeworICAgICAgICBjb25zdCBUKiBjYXN0ZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0
IFQqPihwb3NpdGlvbik7CisgICAgICAgIGlmICghaXNWYWxpZEVuZChidWZmZXIsICZjYXN0ZWRb
MV0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBjYXN0ZWQ7CisgICAg
fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlT2Zmc2V0KGNv
bnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyLCB1aW50MTZfdCBvZmZzZXQpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gdmFsaWRhdGVQdHI8VD4oYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNv
bnN0IGludDhfdCo+KHRoaXMpICsgb2Zmc2V0KTsKKyAgICB9Cit9OworCiB9IC8vIG5hbWVzcGFj
ZSBPcGVuVHlwZQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZl
cnRpY2FsRGF0YS5jcHAKaW5kZXggNzhlYmNmOC4uNWM4YTgxZSAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5U
eXBlVmVydGljYWxEYXRhLmNwcApAQCAtMzcsMTMgKzM3LDE2IEBAIHVzaW5nIG5hbWVzcGFjZSBz
dGQ7CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBuYW1lc3BhY2UgT3BlblR5cGUgewogCi1lbnVtIHsK
LSAgICBIaGVhVGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnaCcsICdlJywgJ2EnKSwKLSAgICBIbXR4
VGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnbScsICd0JywgJ3gnKSwKLSAgICBWaGVhVGFnID0gT1Rf
TUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKLSAgICBWbXR4VGFnID0gT1RfTUFLRV9UQUco
J3YnLCAnbScsICd0JywgJ3gnKSwKLSAgICBWT1JHVGFnID0gT1RfTUFLRV9UQUcoJ1YnLCAnTycs
ICdSJywgJ0cnKSwKLX07Citjb25zdCB1aW50MzJfdCBHU1VCVGFnID0gT1RfTUFLRV9UQUcoJ0cn
LCAnUycsICdVJywgJ0InKTsKK2NvbnN0IHVpbnQzMl90IEhoZWFUYWcgPSBPVF9NQUtFX1RBRygn
aCcsICdoJywgJ2UnLCAnYScpOworY29uc3QgdWludDMyX3QgSG10eFRhZyA9IE9UX01BS0VfVEFH
KCdoJywgJ20nLCAndCcsICd4Jyk7Citjb25zdCB1aW50MzJfdCBWaGVhVGFnID0gT1RfTUFLRV9U
QUcoJ3YnLCAnaCcsICdlJywgJ2EnKTsKK2NvbnN0IHVpbnQzMl90IFZtdHhUYWcgPSBPVF9NQUtF
X1RBRygndicsICdtJywgJ3QnLCAneCcpOworY29uc3QgdWludDMyX3QgVk9SR1RhZyA9IE9UX01B
S0VfVEFHKCdWJywgJ08nLCAnUicsICdHJyk7CisKK2NvbnN0IHVpbnQzMl90IERlZmF1bHRTY3Jp
cHRUYWcgPSBPVF9NQUtFX1RBRygnRCcsICdGJywgJ0wnLCAnVCcpOworCitjb25zdCB1aW50MzJf
dCBWZXJ0RmVhdHVyZVRhZyA9IE9UX01BS0VfVEFHKCd2JywgJ2UnLCAncicsICd0Jyk7CiAKICNw
cmFnbWEgcGFjaygxKQogCkBAIC0xMDgsMjQgKzExMSwyODcgQEAgc3RydWN0IFZPUkdUYWJsZSB7
CiAgICAgc2l6ZV90IHJlcXVpcmVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVvZigqdGhpcykg
KyBzaXplb2YoVmVydE9yaWdpbllNZXRyaWNzKSAqIChudW1WZXJ0T3JpZ2luWU1ldHJpY3MgLSAx
KTsgfQogfTsKIAorc3RydWN0IENvdmVyYWdlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5U
eXBlOjpVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9OworCitzdHJ1Y3QgQ292ZXJhZ2UxVGFibGUg
OiBDb3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGdseXBoQ291bnQ7CisgICAg
T3BlblR5cGU6OkdseXBoSUQgZ2x5cGhBcnJheVsxXTsKK307CisKK3N0cnVjdCBDb3ZlcmFnZTJU
YWJsZSA6IENvdmVyYWdlVGFibGUgeworICAgIE9wZW5UeXBlOjpVSW50MTYgcmFuZ2VDb3VudDsK
KyAgICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdGFy
dDsKKyAgICAgICAgT3BlblR5cGU6OkdseXBoSUQgZW5kOworICAgICAgICBPcGVuVHlwZTo6VUlu
dDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJhbmdlc1sxXTsKK307CisKK3N0cnVjdCBT
dWJzdGl0dXRpb25TdWJUYWJsZSA6IFRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OlVJbnQxNiBz
dWJzdEZvcm1hdDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGNvdmVyYWdlT2Zmc2V0OworCisgICAg
Y29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIp
IGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PENvdmVyYWdlVGFibGU+KGJ1ZmZlciwgY292
ZXJhZ2VPZmZzZXQpOyB9Cit9OworCitzdHJ1Y3QgU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxl
IDogU3Vic3RpdHV0aW9uU3ViVGFibGUgeworICAgIE9wZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3Vu
dDsKKyAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdWJzdGl0dXRlWzFdOworfTsKKworc3RydWN0IExv
b2t1cFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cFR5cGU7
CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBGbGFnOworICAgIE9wZW5UeXBlOjpVSW50MTYg
c3ViVGFibGVDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IHN1YlRhYmxlT2Zmc2V0c1sxXTsK
KyAgICAvLyBPcGVuVHlwZTo6VUludDE2IG1hcmtGaWx0ZXJpbmdTZXQ7IHRoaXMgZmllbGQgY29t
ZXMgYWZ0ZXIgdmFyaWFibGUgbGVuZ3RoLCBzbyBvZmZzZXQgaXMgZGV0ZXJtaW5lZCBkeW5hbWlj
YWxseS4KKworICAgIGJvb2wgZ2V0U3Vic3RpdHV0aW9ucyhIYXNoTWFwPEdseXBoLCBHbHlwaD4q
IG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1
aW50MTZfdCBjb3VudFN1YlRhYmxlID0gc3ViVGFibGVDb3VudDsKKyAgICAgICAgaWYgKCFpc1Zh
bGlkRW5kKGJ1ZmZlciwgJnN1YlRhYmxlT2Zmc2V0c1tjb3VudFN1YlRhYmxlXSkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChsb29rdXBUeXBlICE9IDEpIC8vICJTaW5n
bGUgU3Vic3RpdHV0aW9uIFN1YnRhYmxlIiBpcyBhbGwgd2hhdCB3ZSBzdXBwb3J0CisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3Vu
dFN1YlRhYmxlOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IFN1YnN0aXR1dGlvblN1YlRhYmxl
KiBzdWJzdGl0dXRpb24gPSB2YWxpZGF0ZU9mZnNldDxTdWJzdGl0dXRpb25TdWJUYWJsZT4oYnVm
ZmVyLCBzdWJUYWJsZU9mZnNldHNbaV0pOworICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRpb24p
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY29uc3QgQ292ZXJh
Z2VUYWJsZSogY292ZXJhZ2UgPSBzdWJzdGl0dXRpb24tPmNvdmVyYWdlKGJ1ZmZlcik7CisgICAg
ICAgICAgICBpZiAoIWNvdmVyYWdlKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgICAgIGlmIChzdWJzdGl0dXRpb24tPnN1YnN0Rm9ybWF0ICE9IDIpIC8vICJTaW5nbGUg
U3Vic3RpdHV0aW9uIEZvcm1hdCAyIiBpcyBhbGwgd2hhdCB3ZSBzdXBwb3J0CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgY29uc3QgU2luZ2xlU3Vic3RpdHV0aW9u
MlN1YlRhYmxlKiBzaW5nbGVTdWJzdGl0dXRpb24yID0gdmFsaWRhdGVQdHI8U2luZ2xlU3Vic3Rp
dHV0aW9uMlN1YlRhYmxlPihidWZmZXIsIHN1YnN0aXR1dGlvbik7CisgICAgICAgICAgICBpZiAo
IXNpbmdsZVN1YnN0aXR1dGlvbjIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgdWludDE2X3QgY291bnRUbyA9IHNpbmdsZVN1YnN0aXR1dGlvbjItPmdseXBoQ291
bnQ7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAmc2luZ2xlU3Vic3RpdHV0
aW9uMi0+c3Vic3RpdHV0ZVtjb3VudFRvXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgc3dpdGNoIChjb3ZlcmFnZS0+Y292ZXJhZ2VGb3JtYXQpIHsKKyAgICAg
ICAgICAgIGNhc2UgMTogeyAvLyBDb3ZlcmFnZSBGb3JtYXQgMSAoZS5nLiwgTVMgR290aGljKQor
ICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlMVRhYmxlKiBjb3ZlcmFnZTEgPSB2YWxpZGF0
ZVB0cjxDb3ZlcmFnZTFUYWJsZT4oYnVmZmVyLCBjb3ZlcmFnZSk7CisgICAgICAgICAgICAgICAg
aWYgKCFjb3ZlcmFnZTEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgICAgICAgICB1aW50MTZfdCBjb3VudEZyb20gPSBjb3ZlcmFnZTEtPmdseXBoQ291bnQ7Cisg
ICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmNvdmVyYWdlMS0+Z2x5cGhB
cnJheVtjb3VudEZyb21dKSB8fCBjb3VudFRvICE9IGNvdW50RnJvbSkKKyAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7
IGkgPCBjb3VudFRvOyArK2kpCisgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KGNvdmVyYWdl
MS0+Z2x5cGhBcnJheVtpXSwgc2luZ2xlU3Vic3RpdHV0aW9uMi0+c3Vic3RpdHV0ZVtpXSk7Cisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIDI6
IHsgLy8gQ292ZXJhZ2UgRm9ybWF0IDIgKGUuZy4sIEFkb2JlIEtvenVrYSBHb3RoaWMpCisgICAg
ICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UyVGFibGUqIGNvdmVyYWdlMiA9IHZhbGlkYXRlUHRy
PENvdmVyYWdlMlRhYmxlPihidWZmZXIsIGNvdmVyYWdlKTsKKyAgICAgICAgICAgICAgICBpZiAo
IWNvdmVyYWdlMikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIHVpbnQxNl90IGNvdW50UmFuZ2UgPSBjb3ZlcmFnZTItPnJhbmdlQ291bnQ7CisgICAg
ICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmNvdmVyYWdlMi0+cmFuZ2VzW2Nv
dW50UmFuZ2VdKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgIGZvciAodWludDE2X3QgaSA9IDAsIGluZGV4VG8gPSAwOyBpIDwgY291bnRSYW5nZTsg
KytpKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGZyb20gPSBjb3ZlcmFnZTItPnJh
bmdlc1tpXS5zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZnJvbUVuZCA9IGNv
dmVyYWdlMi0+cmFuZ2VzW2ldLmVuZCArIDE7IC8vIE9wZW5UeXBlICJlbmQiIGlzIGluY2x1c2l2
ZQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhUbyArIChmcm9tRW5kIC0gZnJvbSkgPiBj
b3VudFRvKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5kOyArK2Zyb20sICsraW5kZXhUbykKKyAg
ICAgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KGZyb20sIHNpbmdsZVN1YnN0aXR1dGlvbjIt
PnN1YnN0aXR1dGVbaW5kZXhUb10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBMb29rdXBMaXN0IDogVGFibGVCYXNlIHsK
KyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENvdW50OworICAgIE9wZW5UeXBlOjpPZmZzZXQg
bG9va3VwT2Zmc2V0c1sxXTsKKworICAgIGNvbnN0IExvb2t1cFRhYmxlKiBsb29rdXAodWludDE2
X3QgaW5kZXgsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAg
ICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAgaWYgKGluZGV4ID49IGNv
dW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmxvb2t1cE9mZnNldHNbY291bnRdKSkKKyAgICAg
ICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8TG9va3VwVGFi
bGU+KGJ1ZmZlciwgbG9va3VwT2Zmc2V0c1tpbmRleF0pOworICAgIH0KK307CisKK3N0cnVjdCBG
ZWF0dXJlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgZmVhdHVyZVBh
cmFtczsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENvdW50OworICAgIE9wZW5UeXBlOjpV
SW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAgYm9vbCBnZXRHbHlwaFN1YnN0aXR1dGlv
bnMoY29uc3QgTG9va3VwTGlzdCogbG9va3VwcywgSGFzaE1hcDxHbHlwaCwgR2x5cGg+KiBtYXAs
IGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2
X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwg
Jmxvb2t1cExpc3RJbmRleFtjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAg
Y29uc3QgTG9va3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1cHMtPmxvb2t1cChsb29rdXBMaXN0SW5k
ZXhbaV0sIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoIWxvb2t1cCB8fCAhbG9va3VwLT5nZXRT
dWJzdGl0dXRpb25zKG1hcCwgYnVmZmVyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKworc3RydWN0IEZl
YXR1cmVMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGZlYXR1cmVDb3Vu
dDsKKyAgICBzdHJ1Y3QgRmVhdHVyZVJlY29yZCB7CisgICAgICAgIE9wZW5UeXBlOjpUYWcgZmVh
dHVyZVRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNldCBmZWF0dXJlT2Zmc2V0OworICAgIH0g
ZmVhdHVyZXNbMV07CisKKyAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUodWludDE2X3Qg
aW5kZXgsIE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29u
c3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50ID0gZmVhdHVyZUNvdW50OworICAgICAg
ICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRFbmQoYnVmZmVyLCAmZmVhdHVyZXNbY291
bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoZmVhdHVyZXNbaW5kZXhd
LmZlYXR1cmVUYWcgPT0gdGFnKQorICAgICAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PEZl
YXR1cmVUYWJsZT4oYnVmZmVyLCBmZWF0dXJlc1tpbmRleF0uZmVhdHVyZU9mZnNldCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVjdCBMYW5nU3lzVGFibGUgOiBUYWJsZUJh
c2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3VwT3JkZXI7CisgICAgT3BlblR5cGU6OlVJ
bnQxNiByZXFGZWF0dXJlSW5kZXg7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJlQ291bnQ7
CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJlSW5kZXhbMV07CisKKyAgICBjb25zdCBGZWF0
dXJlVGFibGUqIGZlYXR1cmUoT3BlblR5cGU6OlRhZyBmZWF0dXJlVGFnLCBjb25zdCBGZWF0dXJl
TGlzdCogZmVhdHVyZXMsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0dXJlQ291bnQ7CisgICAgICAgIGlmICghaXNW
YWxpZEVuZChidWZmZXIsICZmZWF0dXJlSW5kZXhbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVy
biAwOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAg
ICAgICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmZWF0dXJlVGFibGUgPSBmZWF0dXJlcy0+ZmVh
dHVyZShmZWF0dXJlSW5kZXhbaV0sIGZlYXR1cmVUYWcsIGJ1ZmZlcik7CisgICAgICAgICAgICBp
ZiAoZmVhdHVyZVRhYmxlKQorICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVGFibGU7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfTsKKworc3RydWN0IFNjcmlwdFRh
YmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGRlZmF1bHRMYW5nU3lzT2Zm
c2V0OworICAgIE9wZW5UeXBlOjpVSW50MTYgbGFuZ1N5c0NvdW50OworICAgIHN0cnVjdCBMYW5n
U3lzUmVjb3JkIHsKKyAgICAgICAgT3BlblR5cGU6OlRhZyBsYW5nU3lzVGFnOworICAgICAgICBP
cGVuVHlwZTo6T2Zmc2V0IGxhbmdTeXNPZmZzZXQ7CisgICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsK
KworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVsdExhbmdTeXMoY29uc3QgU2hhcmVkQnVm
ZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IGxhbmdT
eXNDb3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmxhbmdTeXNSZWNvcmRz
W2NvdW50XSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdWludDE2X3Qgb2Zmc2V0
ID0gZGVmYXVsdExhbmdTeXNPZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQpCisgICAgICAgICAg
ICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8TGFuZ1N5c1RhYmxlPihidWZmZXIsIG9mZnNldCk7Cisg
ICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9mZnNldDxMYW5n
U3lzVGFibGU+KGJ1ZmZlciwgbGFuZ1N5c1JlY29yZHNbMF0ubGFuZ1N5c09mZnNldCk7CisgICAg
ICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVjdCBTY3JpcHRMaXN0IDogVGFibGVCYXNl
IHsKKyAgICBPcGVuVHlwZTo6VUludDE2IHNjcmlwdENvdW50OworICAgIHN0cnVjdCBTY3JpcHRS
ZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6VGFnIHNjcmlwdFRhZzsKKyAgICAgICAgT3BlblR5
cGU6Ok9mZnNldCBzY3JpcHRPZmZzZXQ7CisgICAgfSBzY3JpcHRzWzFdOworCisgICAgY29uc3Qg
U2NyaXB0VGFibGUqIHNjcmlwdChPcGVuVHlwZTo6VGFnIHRhZywgY29uc3QgU2hhcmVkQnVmZmVy
JiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENv
dW50OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVmZmVyLCAmc2NyaXB0c1tjb3VudF0pKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBj
b3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoc2NyaXB0c1tpXS5zY3JpcHRUYWcgPT0gdGFn
KQorICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU9mZnNldDxTY3JpcHRUYWJsZT4oYnVm
ZmVyLCBzY3JpcHRzW2ldLnNjcmlwdE9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IDA7CisgICAgfQorCisgICAgY29uc3QgU2NyaXB0VGFibGUqIGRlZmF1bHRTY3JpcHQoY29uc3Qg
U2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3Vu
dCA9IHNjcmlwdENvdW50OworICAgICAgICBpZiAoIWNvdW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZl
ciwgJnNjcmlwdHNbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjb25z
dCBTY3JpcHRUYWJsZSogc2NyaXB0T2ZEZWZhdWx0VGFnID0gc2NyaXB0KE9wZW5UeXBlOjpEZWZh
dWx0U2NyaXB0VGFnLCBidWZmZXIpOworICAgICAgICBpZiAoc2NyaXB0T2ZEZWZhdWx0VGFnKQor
ICAgICAgICAgICAgcmV0dXJuIHNjcmlwdE9mRGVmYXVsdFRhZzsKKyAgICAgICAgcmV0dXJuIHZh
bGlkYXRlT2Zmc2V0PFNjcmlwdFRhYmxlPihidWZmZXIsIHNjcmlwdHNbMF0uc2NyaXB0T2Zmc2V0
KTsKKyAgICB9CisKKyAgICBjb25zdCBMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzKGNvbnN0
IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgU2NyaXB0
VGFibGUqIHNjcmlwdFRhYmxlID0gZGVmYXVsdFNjcmlwdChidWZmZXIpOworICAgICAgICBpZiAo
IXNjcmlwdFRhYmxlKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzY3Jp
cHRUYWJsZS0+ZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgR1NV
QlRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6Rml4ZWQgdmVyc2lvbjsKKyAgICBP
cGVuVHlwZTo6T2Zmc2V0IHNjcmlwdExpc3RPZmZzZXQ7CisgICAgT3BlblR5cGU6Ok9mZnNldCBm
ZWF0dXJlTGlzdE9mZnNldDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IGxvb2t1cExpc3RPZmZzZXQ7
CisKKyAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYg
YnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9mZnNldDxTY3JpcHRMaXN0PihidWZmZXIs
IHNjcmlwdExpc3RPZmZzZXQpOyB9CisgICAgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0
KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9mZnNl
dDxGZWF0dXJlTGlzdD4oYnVmZmVyLCBmZWF0dXJlTGlzdE9mZnNldCk7IH0KKyAgICBjb25zdCBM
b29rdXBMaXN0KiBsb29rdXBMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7
IHJldHVybiB2YWxpZGF0ZU9mZnNldDxMb29rdXBMaXN0PihidWZmZXIsIGxvb2t1cExpc3RPZmZz
ZXQpOyB9CisKKyAgICBjb25zdCBMYW5nU3lzVGFibGUqIGRlZmF1bHRMYW5nU3lzKGNvbnN0IFNo
YXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgU2NyaXB0TGlz
dCogc2NyaXB0cyA9IHNjcmlwdExpc3QoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFzY3JpcHRzKQor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBzY3JpcHRzLT5kZWZhdWx0TGFu
Z1N5cyhidWZmZXIpOworICAgIH0KKworICAgIGNvbnN0IEZlYXR1cmVUYWJsZSogZmVhdHVyZShP
cGVuVHlwZTo6VGFnIGZlYXR1cmVUYWcsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25z
dAorICAgIHsKKyAgICAgICAgY29uc3QgTGFuZ1N5c1RhYmxlKiBsYW5nU3lzID0gZGVmYXVsdExh
bmdTeXMoYnVmZmVyKTsKKyAgICAgICAgY29uc3QgRmVhdHVyZUxpc3QqIGZlYXR1cmVzID0gZmVh
dHVyZUxpc3QoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFsYW5nU3lzIHx8ICFmZWF0dXJlcykKKyAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gbGFuZ1N5cy0+ZmVhdHVyZShmZWF0
dXJlVGFnLCBmZWF0dXJlcywgYnVmZmVyKTsKKyAgICB9CisKKyAgICBib29sIGdldFZlcnRpY2Fs
R2x5cGhTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgsIEdseXBoPiogbWFwLCBjb25zdCBTaGFy
ZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIGNvbnN0IEZlYXR1cmVUYWJs
ZSogdmVydGljYWxGZWF0dXJlVGFibGUgPSBmZWF0dXJlKE9wZW5UeXBlOjpWZXJ0RmVhdHVyZVRh
ZywgYnVmZmVyKTsKKyAgICAgICAgaWYgKCF2ZXJ0aWNhbEZlYXR1cmVUYWJsZSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29uc3QgTG9va3VwTGlzdCogbG9va3VwcyA9IGxv
b2t1cExpc3QoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIGxvb2t1cHMgJiYgdmVydGljYWxGZWF0
dXJlVGFibGUtPmdldEdseXBoU3Vic3RpdHV0aW9ucyhsb29rdXBzLCBtYXAsIGJ1ZmZlcik7Cisg
ICAgfQorfTsKKwogI3ByYWdtYSBwYWNrKCkKIAogfSAvLyBuYW1lc3BhY2UgT3BlblR5cGUKIAot
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlZFB0cihjb25zdCBSZWZQdHI8
U2hhcmVkQnVmZmVyPiYgYnVmZmVyLCBzaXplX3QgY291bnQgPSAxKQorT3BlblR5cGVWZXJ0aWNh
bERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRm
b3JtRGF0YSkKKyAgICA6IG1fZGVmYXVsdFZlcnRPcmlnaW5ZKDApCiB7Ci0gICAgaWYgKCFidWZm
ZXIgfHwgYnVmZmVyLT5zaXplKCkgPCBzaXplb2YoVCkgKiBjb3VudCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGJ1ZmZlci0+ZGF0YSgp
KTsKKyAgICBsb2FkTWV0cmljcyhwbGF0Zm9ybURhdGEpOworICAgIGxvYWRWZXJ0aWNhbEdseXBo
U3Vic3RpdHV0aW9ucyhwbGF0Zm9ybURhdGEpOwogfQogCi1PcGVuVHlwZVZlcnRpY2FsRGF0YTo6
T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRh
KQotICAgIDogbV9kZWZhdWx0VmVydE9yaWdpblkoMCkKK3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERh
dGE6OmxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKIHsK
ICAgICAvLyBMb2FkIGhoZWEgYW5kIGhtdHggdG8gZ2V0IHgtY29tcG9uZW50IG9mIHZlcnRpY2Fs
IG9yaWdpbnMuCiAgICAgLy8gSWYgdGhlc2UgdGFibGVzIGFyZSBtaXNzaW5nLCBpdCdzIG5vdCBh
biBPcGVuVHlwZSBmb250LgogICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IHBsYXRm
b3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpIaGVhVGFnKTsKLSAgICBjb25zdCBPcGVu
VHlwZTo6SGhlYVRhYmxlKiBoaGVhID0gdmFsaWRhdGVkUHRyPE9wZW5UeXBlOjpIaGVhVGFibGU+
KGJ1ZmZlcik7CisgICAgY29uc3QgT3BlblR5cGU6OkhoZWFUYWJsZSogaGhlYSA9IE9wZW5UeXBl
Ojp2YWxpZGF0ZVRhYmxlPE9wZW5UeXBlOjpIaGVhVGFibGU+KGJ1ZmZlcik7CiAgICAgaWYgKCFo
aGVhKQogICAgICAgICByZXR1cm47CiAgICAgdWludDE2X3QgY291bnRIbXR4RW50cmllcyA9IGho
ZWEtPm51bWJlck9mSE1ldHJpY3M7CkBAIC0xMzUsNyArNDAxLDcgQEAgT3BlblR5cGVWZXJ0aWNh
bERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRm
b3JtRGF0YSkKICAgICB9CiAKICAgICBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJs
ZShPcGVuVHlwZTo6SG10eFRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6OkhtdHhUYWJsZSogaG10
eCA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6SG10eFRhYmxlPihidWZmZXIsIGNvdW50SG10eEVu
dHJpZXMpOworICAgIGNvbnN0IE9wZW5UeXBlOjpIbXR4VGFibGUqIGhtdHggPSBPcGVuVHlwZTo6
dmFsaWRhdGVUYWJsZTxPcGVuVHlwZTo6SG10eFRhYmxlPihidWZmZXIsIGNvdW50SG10eEVudHJp
ZXMpOwogICAgIGlmICghaG10eCkgewogICAgICAgICBMT0dfRVJST1IoImhoZWEgZXhpc3RzIGJ1
dCBobXR4IGRvZXMgbm90IChvciBicm9rZW4pIik7CiAgICAgICAgIHJldHVybjsKQEAgLTE0Niw3
ICs0MTIsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29u
c3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQogCiAgICAgLy8gTG9hZCB2aGVhIGZp
cnN0LiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVkIGZvciBmb250cyB0aGF0IHN1cHBvcnQgdmVydGlj
YWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlw
ZTo6VmhlYVRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6OlZoZWFUYWJsZSogdmhlYSA9IHZhbGlk
YXRlZFB0cjxPcGVuVHlwZTo6VmhlYVRhYmxlPihidWZmZXIpOworICAgIGNvbnN0IE9wZW5UeXBl
OjpWaGVhVGFibGUqIHZoZWEgPSBPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZTxPcGVuVHlwZTo6Vmhl
YVRhYmxlPihidWZmZXIpOwogICAgIGlmICghdmhlYSkKICAgICAgICAgcmV0dXJuOwogICAgIHVp
bnQxNl90IGNvdW50Vm10eEVudHJpZXMgPSB2aGVhLT5udW1PZkxvbmdWZXJNZXRyaWNzOwpAQCAt
MTU3LDcgKzQyMyw3IEBAIE9wZW5UeXBlVmVydGljYWxEYXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0
YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCiAKICAgICAvLyBMb2FkIFZP
UkcuIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwuCiAgICAgYnVmZmVyID0gcGxhdGZvcm1EYXRhLm9w
ZW5UeXBlVGFibGUoT3BlblR5cGU6OlZPUkdUYWcpOwotICAgIGNvbnN0IE9wZW5UeXBlOjpWT1JH
VGFibGUqIHZvcmcgPSB2YWxpZGF0ZWRQdHI8T3BlblR5cGU6OlZPUkdUYWJsZT4oYnVmZmVyKTsK
KyAgICBjb25zdCBPcGVuVHlwZTo6Vk9SR1RhYmxlKiB2b3JnID0gT3BlblR5cGU6OnZhbGlkYXRl
VGFibGU8T3BlblR5cGU6OlZPUkdUYWJsZT4oYnVmZmVyKTsKICAgICBpZiAodm9yZyAmJiBidWZm
ZXItPnNpemUoKSA+PSB2b3JnLT5yZXF1aXJlZFNpemUoKSkgewogICAgICAgICBtX2RlZmF1bHRW
ZXJ0T3JpZ2luWSA9IHZvcmctPmRlZmF1bHRWZXJ0T3JpZ2luWTsKICAgICAgICAgdWludDE2X3Qg
Y291bnRWZXJ0T3JpZ2luWU1ldHJpY3MgPSB2b3JnLT5udW1WZXJ0T3JpZ2luWU1ldHJpY3M7CkBA
IC0xNzQsNyArNDQwLDcgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxE
YXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKIAogICAgIC8vIExvYWQg
dm10eCB0aGVuLiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVkIGZvciBmb250cyB0aGF0IHN1cHBvcnQg
dmVydGljYWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShP
cGVuVHlwZTo6Vm10eFRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6OlZtdHhUYWJsZSogdm10eCA9
IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6Vm10eFRhYmxlPihidWZmZXIsIGNvdW50Vm10eEVudHJp
ZXMpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWbXR4VGFibGUqIHZtdHggPSBPcGVuVHlwZTo6dmFs
aWRhdGVUYWJsZTxPcGVuVHlwZTo6Vm10eFRhYmxlPihidWZmZXIsIGNvdW50Vm10eEVudHJpZXMp
OwogICAgIGlmICghdm10eCkgewogICAgICAgICBMT0dfRVJST1IoInZoZWEgZXhpc3RzIGJ1dCB2
bXR4IGRvZXMgbm90IChvciBicm9rZW4pIik7CiAgICAgICAgIHJldHVybjsKQEAgLTIwNSw2ICs0
NzEsMTQgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKICAgICB9CiB9CiAKK3ZvaWQgT3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhjb25zdCBGb250
UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4g
YnVmZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6OkdTVUJUYWcpOwor
ICAgIGNvbnN0IE9wZW5UeXBlOjpHU1VCVGFibGUqIGdzdWIgPSBPcGVuVHlwZTo6dmFsaWRhdGVU
YWJsZTxPcGVuVHlwZTo6R1NVQlRhYmxlPihidWZmZXIpOworICAgIGlmIChnc3ViKQorICAgICAg
ICBnc3ViLT5nZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucygmbV92ZXJ0aWNhbEdseXBoTWFw
LCAqYnVmZmVyLmdldCgpKTsKK30KKwogZmxvYXQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmFkdmFu
Y2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIEdseXBoIGdseXBoKSBjb25zdAog
ewogICAgIHNpemVfdCBjb3VudEhlaWdodHMgPSBtX2FkdmFuY2VIZWlnaHRzLnNpemUoKTsKQEAg
LTI2MSw0ICs1MzUsMjEgQEAgdm9pZCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6Z2V0VmVydGljYWxU
cmFuc2xhdGlvbnNGb3JHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEKICAgICB9CiB9CiAKK3Zv
aWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlwaHMoY29u
c3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIEdseXBoUGFnZSogZ2x5cGhQYWdlLCB1bnNpZ25lZCBv
ZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKK3sKKyAgICBjb25zdCBIYXNoTWFwPEdseXBo
LCBHbHlwaD4mIG1hcCA9IG1fdmVydGljYWxHbHlwaE1hcDsKKyAgICBpZiAobWFwLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh1bnNpZ25lZCBpbmRleCA9IG9mZnNldCwg
ZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOyBpbmRleCA8IGVuZDsgKytpbmRleCkgeworICAgICAgICBH
bHlwaCBnbHlwaCA9IGdseXBoUGFnZS0+Z2x5cGhBdChpbmRleCk7CisgICAgICAgIGlmIChnbHlw
aCkgeworICAgICAgICAgICAgQVNTRVJUKGdseXBoUGFnZS0+Z2x5cGhEYXRhRm9ySW5kZXgoaW5k
ZXgpLmZvbnREYXRhID09IGZvbnQpOworICAgICAgICAgICAgR2x5cGggdG8gPSBtYXAuZ2V0KGds
eXBoKTsKKyAgICAgICAgICAgIGlmICh0bykKKyAgICAgICAgICAgICAgICBnbHlwaFBhZ2UtPnNl
dEdseXBoRGF0YUZvckluZGV4KGluZGV4LCB0bywgZm9udCk7CisgICAgICAgIH0KKyAgICB9Cit9
CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmggYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5o
CmluZGV4IDg1ZTRlZTcuLmYwNzM5NTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
aApAQCAtNDMsMTAgKzQzLDE0IEBAIHB1YmxpYzoKICAgICBib29sIGhhc1ZlcnRpY2FsTWV0cmlj
cygpIGNvbnN0IHsgcmV0dXJuICFtX2FkdmFuY2VIZWlnaHRzLmlzRW1wdHkoKTsgfQogICAgIGZs
b2F0IGFkdmFuY2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqLCBHbHlwaCkgY29uc3Q7CiAg
ICAgdm9pZCBnZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1wbGVGb250
RGF0YSosIGNvbnN0IEdseXBoKiwgc2l6ZV90LCBmbG9hdCogb3V0WFlBcnJheSkgY29uc3Q7Cisg
ICAgdm9pZCBzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZvbnREYXRh
KiwgR2x5cGhQYWdlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNvbnN0Owog
CiBwcml2YXRlOgorICAgIHZvaWQgbG9hZE1ldHJpY3MoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYp
OworICAgIHZvaWQgbG9hZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKGNvbnN0IEZvbnRQbGF0
Zm9ybURhdGEmKTsKICAgICBib29sIGhhc1ZPUkcoKSBjb25zdCB7IHJldHVybiAhbV92ZXJ0T3Jp
Z2luWS5pc0VtcHR5KCk7IH0KIAorICAgIEhhc2hNYXA8R2x5cGgsIEdseXBoPiBtX3ZlcnRpY2Fs
R2x5cGhNYXA7CiAgICAgVmVjdG9yPHVpbnQxNl90PiBtX2FkdmFuY2VXaWR0aHM7CiAgICAgVmVj
dG9yPHVpbnQxNl90PiBtX2FkdmFuY2VIZWlnaHRzOwogICAgIFZlY3RvcjxpbnQxNl90PiBtX3Rv
cFNpZGVCZWFyaW5nczsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXggY2EwMDQ5MS4uNThk
ZGY4NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKKysrIGIv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAorMjAxMi0w
Ny0xNSAgS29qaSBJc2hpaSAgPGtvamlpc2hpQGdtYWlsLmNvbT4KKworICAgICAgICBWZXJ0aWNh
bCBhbHRlcm5hdGUgZ2x5cGggKEdTVUIpIHN1cHBvcnQgZm9yIE9wZW5UeXBlVmVydGljYWxEYXRh
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04MTM4OQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRlc3RzIGZv
ciBwb2ludGVyIHZhbGlkYXRpb25zIGZvciBPcGVuVHlwZSB0YWJsZXMuCisKKyAgICAgICAgKiBX
ZWJLaXQuZ3lwaToKKyAgICAgICAgKiB0ZXN0cy9PcGVuVHlwZVZlcnRpY2FsRGF0YVRlc3QuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGVzdFRhYmxlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlRlc3RUYWJsZTo6dmFsaWRhdGVPZmZzZXQpOgorICAgICAgICAoV2ViQ29y
ZTo6VEVTVCk6CisKIDIwMTItMDctMTMgIEVyaWMgUGVubmVyICA8ZXBlbm5lckBnb29nbGUuY29t
PgogCiAgICAgICAgIFtjaHJvbWl1bV0gQWRkICdzZWxmLW1hbmFnZWQnIG9wdGlvbiB0byBDQ1By
aW9yaXRpemVkVGV4dHVyZSB0byBlbmFibGUgcmVuZGVyLXN1cmZhY2UgYW5kIGNhbnZhcyB1c2Ug
Y2FzZXMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpIGIv
U291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQppbmRleCA1OWMwMDc5Li40MGIyM2Jl
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCisrKyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkKQEAgLTEyNiw2ICsxMjYsNyBAQAogICAg
ICAgICAgICAgJ3Rlc3RzL0xvY2FsaXplZE51bWJlcklDVVRlc3QuY3BwJywKICAgICAgICAgICAg
ICd0ZXN0cy9Nb2NrQ0NRdWFkQ3VsbGVyLmgnLAogICAgICAgICAgICAgJ3Rlc3RzL09wYXF1ZVJl
Y3RUcmFja2luZ0NvbnRlbnRMYXllckRlbGVnYXRlVGVzdC5jcHAnLAorICAgICAgICAgICAgJ3Rl
c3RzL09wZW5UeXBlVmVydGljYWxEYXRhVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rlc3RzL1Bh
aW50QWdncmVnYXRvclRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9QbGF0Zm9ybUdlc3R1
cmVDdXJ2ZVRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9QbGF0Zm9ybUNvbnRleHRTa2lh
VGVzdC5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9PcGVu
VHlwZVZlcnRpY2FsRGF0YVRlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9P
cGVuVHlwZVZlcnRpY2FsRGF0YVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjRiZmJlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3Rlc3RzL09wZW5UeXBlVmVydGljYWxEYXRhVGVzdC5jcHAKQEAgLTAsMCArMSw4NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMiBLb2ppIElzaGlpIDxrb2ppaXNoaUBnbWFpbC5jb20+Cisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoT1BFTlRZUEVfVkVS
VElDQUwpCisKKyNpbmNsdWRlICJPcGVuVHlwZVR5cGVzLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVm
ZmVyLmgiCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3Qu
aD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBU
ZXN0VGFibGUgOiBPcGVuVHlwZTo6VGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6Rml4ZWQgdmVy
c2lvbjsKKyAgICBPcGVuVHlwZTo6SW50MTYgYXNjZW5kZXI7CisKKyAgICB0ZW1wbGF0ZSA8dHlw
ZW5hbWUgVD4gY29uc3QgVCogdmFsaWRhdGVPZmZzZXQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZm
ZXIsIHVpbnQxNl90IG9mZnNldCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBUYWJsZUJh
c2U6OnZhbGlkYXRlT2Zmc2V0PFQ+KGJ1ZmZlciwgb2Zmc2V0KTsKKyAgICB9Cit9OworCitURVNU
KE9wZW5UeXBlVmVydGljYWxEYXRhVGVzdCwgVmFsaWRhdGVUYWJsZVRlc3QpCit7CisgICAgUmVm
UHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoc2l6ZW9mKFRl
c3RUYWJsZSkpOworICAgIGNvbnN0IFRlc3RUYWJsZSogdGFibGUgPSBPcGVuVHlwZTo6dmFsaWRh
dGVUYWJsZTxUZXN0VGFibGU+KGJ1ZmZlcik7CisgICAgRVhQRUNUX1RSVUUodGFibGUpOworCisg
ICAgYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUoc2l6ZW9mKFRlc3RUYWJsZSkgLSAxKTsK
KyAgICB0YWJsZSA9IE9wZW5UeXBlOjp2YWxpZGF0ZVRhYmxlPFRlc3RUYWJsZT4oYnVmZmVyKTsK
KyAgICBFWFBFQ1RfRkFMU0UodGFibGUpOworCisgICAgYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpj
cmVhdGUoc2l6ZW9mKFRlc3RUYWJsZSkgKyAxKTsKKyAgICB0YWJsZSA9IE9wZW5UeXBlOjp2YWxp
ZGF0ZVRhYmxlPFRlc3RUYWJsZT4oYnVmZmVyKTsKKyAgICBFWFBFQ1RfVFJVRSh0YWJsZSk7Cit9
CisKK1RFU1QoT3BlblR5cGVWZXJ0aWNhbERhdGFUZXN0LCBWYWxpZGF0ZU9mZnNldFRlc3QpCit7
CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gU2hhcmVkQnVmZmVyOjpjcmVhdGUo
c2l6ZW9mKFRlc3RUYWJsZSkpOworICAgIGNvbnN0IFRlc3RUYWJsZSogdGFibGUgPSBPcGVuVHlw
ZTo6dmFsaWRhdGVUYWJsZTxUZXN0VGFibGU+KGJ1ZmZlcik7CisgICAgQVNTRVJUX1RSVUUodGFi
bGUpOworCisgICAgLy8gVGVzdCBvdmVyZmxvdworICAgIEVYUEVDVF9GQUxTRSh0YWJsZS0+dmFs
aWRhdGVPZmZzZXQ8dWludDhfdD4oKmJ1ZmZlciwgLTEpKTsKKworICAgIC8vIHVpbnQ4X3QgaXMg
dmFsaWQgZm9yIGFsbCBvZmZzZXRzCisgICAgZm9yICh1aW50MTZfdCBvZmZzZXQgPSAwOyBvZmZz
ZXQgPCBzaXplb2YoVGVzdFRhYmxlKTsgb2Zmc2V0KyspCisgICAgICAgIEVYUEVDVF9UUlVFKHRh
YmxlLT52YWxpZGF0ZU9mZnNldDx1aW50OF90PigqYnVmZmVyLCBvZmZzZXQpKTsKKyAgICBFWFBF
Q1RfRkFMU0UodGFibGUtPnZhbGlkYXRlT2Zmc2V0PHVpbnQ4X3Q+KCpidWZmZXIsIHNpemVvZihU
ZXN0VGFibGUpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHRhYmxlLT52YWxpZGF0ZU9mZnNldDx1aW50
OF90PigqYnVmZmVyLCBzaXplb2YoVGVzdFRhYmxlKSArIDEpKTsKKworICAgIC8vIEZvciB1aW50
MTZfdCwgdGhlIGxhc3QgYnl0ZSBpcyBpbnZhbGlkCisgICAgZm9yICh1aW50MTZfdCBvZmZzZXQg
PSAwOyBvZmZzZXQgPCBzaXplb2YoVGVzdFRhYmxlKSAtIDE7IG9mZnNldCsrKQorICAgICAgICBF
WFBFQ1RfVFJVRSh0YWJsZS0+dmFsaWRhdGVPZmZzZXQ8dWludDE2X3Q+KCpidWZmZXIsIG9mZnNl
dCkpOworICAgIEVYUEVDVF9GQUxTRSh0YWJsZS0+dmFsaWRhdGVPZmZzZXQ8dWludDE2X3Q+KCpi
dWZmZXIsIHNpemVvZihUZXN0VGFibGUpIC0gMSkpOworfQorCit9IC8vIG5hbWVzcGFjZQorCisj
ZW5kaWYgLy8gRU5BQkxFKE9QRU5UWVBFX1ZFUlRJQ0FMKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152463</attachid>
            <date>2012-07-15 11:43:21 -0700</date>
            <delta_ts>2012-07-16 17:57:58 -0700</delta_ts>
            <desc>Reflected items from Tony&apos;s review</desc>
            <filename>81389-11.patch</filename>
            <type>text/plain</type>
            <size>27570</size>
            <attacher name="Koji Ishii">kojii</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZwppbmRleCAzYmY2NTBhLi42ZTA2MTFmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsNjgg
QEAKKzIwMTItMDctMTUgIEtvamkgSXNoaWkgIDxrb2ppaXNoaUBnbWFpbC5jb20+CisKKyAgICAg
ICAgVmVydGljYWwgYWx0ZXJuYXRlIGdseXBoIChHU1VCKSBzdXBwb3J0IGZvciBPcGVuVHlwZVZl
cnRpY2FsRGF0YQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9ODEzODkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBUaGlzIHBhdGNoIGFkZHMgc3VwcG9ydCBmb3IgcmVhZGluZyAnR1NVQicgT3BlblR5cGUgdGFi
bGUgdG8gZ2V0CisgICAgICAgIHZlcnRpY2FsIGFsdGVybmF0ZSBnbHlwaHMuCisgICAgICAgIGh0
dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9nc3ViLmh0bQorCisgICAg
ICAgIExpa2UgYnVnIDgxMzI2LCB0aGlzIGNvZGUgaXNuJ3Qgb24gYW55IGNvZGUgcGF0aCB5ZXQu
CisKKyAgICAgICAgVGVzdHM6IFdlYktpdC9jaHJvbWl1bS90ZXN0cy9PcGVuVHlwZVZlcnRpY2Fs
RGF0YVRlc3QuY3BwCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVu
VHlwZVR5cGVzLmg6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZSk6
IE1vdmVkIGZyb20gT3BlblR5cGVWZXJ0aWNhbERhdGEuY3BwIGZvciB1bml0IHRlc3RzLgorICAg
ICAgICAoT3BlblR5cGUpOgorICAgICAgICAoVGFibGVCYXNlKTogRGl0dG8uCisgICAgICAgIChX
ZWJDb3JlOjpPcGVuVHlwZTo6VGFibGVCYXNlOjppc1ZhbGlkRW5kKToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OnZhbGlkYXRlUHRyKToKKyAgICAgICAgKFdlYkNvcmU6
Ok9wZW5UeXBlOjpUYWJsZUJhc2U6OnZhbGlkYXRlT2Zmc2V0KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5jcHA6CisgICAgICAgIChP
cGVuVHlwZSk6IEFkZGVkIHNldmVyYWwgT3BlblR5cGUgdGFibGVzIHVzZWQgYnkgJ0dTVUInIHRh
YmxlLgorICAgICAgICAoQ292ZXJhZ2VUYWJsZSk6CisgICAgICAgIChDb3ZlcmFnZTFUYWJsZSk6
CisgICAgICAgIChDb3ZlcmFnZTJUYWJsZSk6CisgICAgICAgIChSYW5nZVJlY29yZCk6CisgICAg
ICAgIChTdWJzdGl0dXRpb25TdWJUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6
U3Vic3RpdHV0aW9uU3ViVGFibGU6OmNvdmVyYWdlKToKKyAgICAgICAgKFNpbmdsZVN1YnN0aXR1
dGlvbjJTdWJUYWJsZSk6CisgICAgICAgIChMb29rdXBUYWJsZSk6CisgICAgICAgIChXZWJDb3Jl
OjpPcGVuVHlwZTo6TG9va3VwVGFibGU6OmdldFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoTG9v
a3VwTGlzdCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6TG9va3VwTGlzdDo6bG9va3Vw
KToKKyAgICAgICAgKEZlYXR1cmVUYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlwZTo6
RmVhdHVyZVRhYmxlOjpnZXRHbHlwaFN1YnN0aXR1dGlvbnMpOgorICAgICAgICAoRmVhdHVyZUxp
c3QpOgorICAgICAgICAoRmVhdHVyZVJlY29yZCk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlw
ZTo6RmVhdHVyZUxpc3Q6OmZlYXR1cmUpOgorICAgICAgICAoTGFuZ1N5c1RhYmxlKToKKyAgICAg
ICAgKFdlYkNvcmU6Ok9wZW5UeXBlOjpMYW5nU3lzVGFibGU6OmZlYXR1cmUpOgorICAgICAgICAo
U2NyaXB0VGFibGUpOgorICAgICAgICAoTGFuZ1N5c1JlY29yZCk6CisgICAgICAgIChXZWJDb3Jl
OjpPcGVuVHlwZTo6U2NyaXB0VGFibGU6OmRlZmF1bHRMYW5nU3lzKToKKyAgICAgICAgKFNjcmlw
dExpc3QpOgorICAgICAgICAoU2NyaXB0UmVjb3JkKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5U
eXBlOjpTY3JpcHRMaXN0OjpzY3JpcHQpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNj
cmlwdExpc3Q6OmRlZmF1bHRTY3JpcHQpOgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5cGU6OlNj
cmlwdExpc3Q6OmRlZmF1bHRMYW5nU3lzKToKKyAgICAgICAgKEdTVUJUYWJsZSk6CisgICAgICAg
IChXZWJDb3JlOjpPcGVuVHlwZTo6R1NVQlRhYmxlOjpzY3JpcHRMaXN0KToKKyAgICAgICAgKFdl
YkNvcmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6OmZlYXR1cmVMaXN0KToKKyAgICAgICAgKFdlYkNv
cmU6Ok9wZW5UeXBlOjpHU1VCVGFibGU6Omxvb2t1cExpc3QpOgorICAgICAgICAoV2ViQ29yZTo6
T3BlblR5cGU6OkdTVUJUYWJsZTo6ZGVmYXVsdExhbmdTeXMpOgorICAgICAgICAoV2ViQ29yZTo6
T3BlblR5cGU6OkdTVUJUYWJsZTo6ZmVhdHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpPcGVuVHlw
ZTo6R1NVQlRhYmxlOjpnZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyk6CisgICAgICAgIChX
ZWJDb3JlOjpPcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6T3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKTogU3BsaXQg
Y29kZSB0byBsb2FkIG1ldHJpY3MgZnJvbSBjdG9yLgorICAgICAgICAoV2ViQ29yZTo6T3BlblR5
cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyk6IExvYWQgdGhl
IHZlcnRpY2FsIGFsdGVybmF0ZSBHbHlwaCBzdWJzdGl0dXRpb24gdGFibGUuCisgICAgICAgIChX
ZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6Ok9wZW5UeXBlVmVydGljYWxEYXRhOjpzdWJzdGl0
dXRlV2l0aFZlcnRpY2FsR2x5cGhzKTogU3Vic3RpdHV0ZSBHbHlwaCBJRHMgd2l0aCB2ZXJ0aWNh
bCBhbHRlcm5hdGUgR2x5cGggSURzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL29wZW50
eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmg6CisgICAgICAgIChPcGVuVHlwZVZlcnRpY2FsRGF0
YSk6IEFkZGVkIG1fdmVydGljYWxHbHlwaE1hcC4KKwogMjAxMi0wNy0xNCAgRXJpYyBDYXJsc29u
ICA8ZXJpYy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBFbmFibGUgQVZDRiBoYXJkd2Fy
ZSB2aWRlbyBkZWNvZGluZwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVUeXBlcy5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVUeXBlcy5oCmluZGV4IDlmYzc2NTkuLjJmMmQ1MWMg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09w
ZW5UeXBlVHlwZXMuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVu
dHlwZS9PcGVuVHlwZVR5cGVzLmgKQEAgLTI1LDYgKzI1LDggQEAKICNpZm5kZWYgT3BlblR5cGVU
eXBlc19oCiAjZGVmaW5lIE9wZW5UeXBlVHlwZXNfaAogCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVy
LmgiCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIG5hbWVzcGFjZSBPcGVuVHlwZSB7CiAKQEAgLTY3
LDYgKzY5LDM3IEBAIHR5cGVkZWYgVUludDE2IEdseXBoSUQ7CiB0eXBlZGVmIHVpbnQzMl90IFRh
ZzsKICNkZWZpbmUgT1RfTUFLRV9UQUcoY2gxLCBjaDIsIGNoMywgY2g0KSAoKCgodWludDMyX3Qp
KGNoNCkpIDw8IDI0KSB8ICgoKHVpbnQzMl90KShjaDMpKSA8PCAxNikgfCAoKCh1aW50MzJfdCko
Y2gyKSkgPDwgOCkgfCAoKHVpbnQzMl90KShjaDEpKSkKIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+
IHN0YXRpYyBjb25zdCBUKiB2YWxpZGF0ZVRhYmxlKGNvbnN0IFJlZlB0cjxTaGFyZWRCdWZmZXI+
JiBidWZmZXIsIHNpemVfdCBjb3VudCA9IDEpCit7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVy
LT5zaXplKCkgPCBzaXplb2YoVCkgKiBjb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KGJ1ZmZlci0+ZGF0YSgpKTsKK30KKworc3Ry
dWN0IFRhYmxlQmFzZSB7Citwcm90ZWN0ZWQ6CisgICAgc3RhdGljIGJvb2wgaXNWYWxpZEVuZChj
b25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlciwgY29uc3Qgdm9pZCogcG9zaXRpb24pCisgICAgewor
ICAgICAgICBpZiAocG9zaXRpb24gPCBidWZmZXIuZGF0YSgpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBj
aGFyKj4ocG9zaXRpb24pIC0gYnVmZmVyLmRhdGEoKTsKKyAgICAgICAgcmV0dXJuIG9mZnNldCA8
PSBidWZmZXIuc2l6ZSgpOyAvLyAiPD0iIGJlY2F1c2UgZW5kIGlzIGluY2x1ZGVkIGFzIHZhbGlk
CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBjb25zdCBUKiB2YWxp
ZGF0ZVB0cihjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlciwgY29uc3Qgdm9pZCogcG9zaXRpb24p
CisgICAgeworICAgICAgICBjb25zdCBUKiBjYXN0ZWQgPSByZWludGVycHJldF9jYXN0PGNvbnN0
IFQqPihwb3NpdGlvbik7CisgICAgICAgIGlmICghaXNWYWxpZEVuZChidWZmZXIsICZjYXN0ZWRb
MV0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBjYXN0ZWQ7CisgICAg
fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlT2Zmc2V0KGNv
bnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyLCB1aW50MTZfdCBvZmZzZXQpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gdmFsaWRhdGVQdHI8VD4oYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNv
bnN0IGludDhfdCo+KHRoaXMpICsgb2Zmc2V0KTsKKyAgICB9Cit9OworCiB9IC8vIG5hbWVzcGFj
ZSBPcGVuVHlwZQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2FsRGF0YS5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZl
cnRpY2FsRGF0YS5jcHAKaW5kZXggNzhlYmNmOC4uYzZkMTNmMiAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNhbERhdGEu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5U
eXBlVmVydGljYWxEYXRhLmNwcApAQCAtMjMsNiArMjMsNyBAQAogICovCiAKICNpbmNsdWRlICJj
b25maWcuaCIKKyNpZiBFTkFCTEUoT1BFTlRZUEVfVkVSVElDQUwpCiAjaW5jbHVkZSAiT3BlblR5
cGVWZXJ0aWNhbERhdGEuaCIKIAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgpAQCAtMzcsMTMgKzM4
LDE2IEBAIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBuYW1lc3Bh
Y2UgT3BlblR5cGUgewogCi1lbnVtIHsKLSAgICBIaGVhVGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAn
aCcsICdlJywgJ2EnKSwKLSAgICBIbXR4VGFnID0gT1RfTUFLRV9UQUcoJ2gnLCAnbScsICd0Jywg
J3gnKSwKLSAgICBWaGVhVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKSwKLSAg
ICBWbXR4VGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnbScsICd0JywgJ3gnKSwKLSAgICBWT1JHVGFn
ID0gT1RfTUFLRV9UQUcoJ1YnLCAnTycsICdSJywgJ0cnKSwKLX07Citjb25zdCB1aW50MzJfdCBH
U1VCVGFnID0gT1RfTUFLRV9UQUcoJ0cnLCAnUycsICdVJywgJ0InKTsKK2NvbnN0IHVpbnQzMl90
IEhoZWFUYWcgPSBPVF9NQUtFX1RBRygnaCcsICdoJywgJ2UnLCAnYScpOworY29uc3QgdWludDMy
X3QgSG10eFRhZyA9IE9UX01BS0VfVEFHKCdoJywgJ20nLCAndCcsICd4Jyk7Citjb25zdCB1aW50
MzJfdCBWaGVhVGFnID0gT1RfTUFLRV9UQUcoJ3YnLCAnaCcsICdlJywgJ2EnKTsKK2NvbnN0IHVp
bnQzMl90IFZtdHhUYWcgPSBPVF9NQUtFX1RBRygndicsICdtJywgJ3QnLCAneCcpOworY29uc3Qg
dWludDMyX3QgVk9SR1RhZyA9IE9UX01BS0VfVEFHKCdWJywgJ08nLCAnUicsICdHJyk7CisKK2Nv
bnN0IHVpbnQzMl90IERlZmF1bHRTY3JpcHRUYWcgPSBPVF9NQUtFX1RBRygnRCcsICdGJywgJ0wn
LCAnVCcpOworCitjb25zdCB1aW50MzJfdCBWZXJ0RmVhdHVyZVRhZyA9IE9UX01BS0VfVEFHKCd2
JywgJ2UnLCAncicsICd0Jyk7CiAKICNwcmFnbWEgcGFjaygxKQogCkBAIC0xMDgsMjQgKzExMiwy
ODcgQEAgc3RydWN0IFZPUkdUYWJsZSB7CiAgICAgc2l6ZV90IHJlcXVpcmVkU2l6ZSgpIGNvbnN0
IHsgcmV0dXJuIHNpemVvZigqdGhpcykgKyBzaXplb2YoVmVydE9yaWdpbllNZXRyaWNzKSAqIChu
dW1WZXJ0T3JpZ2luWU1ldHJpY3MgLSAxKTsgfQogfTsKIAorc3RydWN0IENvdmVyYWdlVGFibGUg
OiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpVSW50MTYgY292ZXJhZ2VGb3JtYXQ7Cit9Owor
CitzdHJ1Y3QgQ292ZXJhZ2UxVGFibGUgOiBDb3ZlcmFnZVRhYmxlIHsKKyAgICBPcGVuVHlwZTo6
VUludDE2IGdseXBoQ291bnQ7CisgICAgT3BlblR5cGU6OkdseXBoSUQgZ2x5cGhBcnJheVsxXTsK
K307CisKK3N0cnVjdCBDb3ZlcmFnZTJUYWJsZSA6IENvdmVyYWdlVGFibGUgeworICAgIE9wZW5U
eXBlOjpVSW50MTYgcmFuZ2VDb3VudDsKKyAgICBzdHJ1Y3QgUmFuZ2VSZWNvcmQgeworICAgICAg
ICBPcGVuVHlwZTo6R2x5cGhJRCBzdGFydDsKKyAgICAgICAgT3BlblR5cGU6OkdseXBoSUQgZW5k
OworICAgICAgICBPcGVuVHlwZTo6VUludDE2IHN0YXJ0Q292ZXJhZ2VJbmRleDsKKyAgICB9IHJh
bmdlc1sxXTsKK307CisKK3N0cnVjdCBTdWJzdGl0dXRpb25TdWJUYWJsZSA6IFRhYmxlQmFzZSB7
CisgICAgT3BlblR5cGU6OlVJbnQxNiBzdWJzdEZvcm1hdDsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0
IGNvdmVyYWdlT2Zmc2V0OworCisgICAgY29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UoY29u
c3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0IHsgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PENv
dmVyYWdlVGFibGU+KGJ1ZmZlciwgY292ZXJhZ2VPZmZzZXQpOyB9Cit9OworCitzdHJ1Y3QgU2lu
Z2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlIDogU3Vic3RpdHV0aW9uU3ViVGFibGUgeworICAgIE9w
ZW5UeXBlOjpVSW50MTYgZ2x5cGhDb3VudDsKKyAgICBPcGVuVHlwZTo6R2x5cGhJRCBzdWJzdGl0
dXRlWzFdOworfTsKKworc3RydWN0IExvb2t1cFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVu
VHlwZTo6VUludDE2IGxvb2t1cFR5cGU7CisgICAgT3BlblR5cGU6OlVJbnQxNiBsb29rdXBGbGFn
OworICAgIE9wZW5UeXBlOjpVSW50MTYgc3ViVGFibGVDb3VudDsKKyAgICBPcGVuVHlwZTo6T2Zm
c2V0IHN1YlRhYmxlT2Zmc2V0c1sxXTsKKyAgICAvLyBPcGVuVHlwZTo6VUludDE2IG1hcmtGaWx0
ZXJpbmdTZXQ7IHRoaXMgZmllbGQgY29tZXMgYWZ0ZXIgdmFyaWFibGUgbGVuZ3RoLCBzbyBvZmZz
ZXQgaXMgZGV0ZXJtaW5lZCBkeW5hbWljYWxseS4KKworICAgIGJvb2wgZ2V0U3Vic3RpdHV0aW9u
cyhIYXNoTWFwPEdseXBoLCBHbHlwaD4qIG1hcCwgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIp
IGNvbnN0CisgICAgeworICAgICAgICB1aW50MTZfdCBjb3VudFN1YlRhYmxlID0gc3ViVGFibGVD
b3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJnN1YlRhYmxlT2Zmc2V0c1tj
b3VudFN1YlRhYmxlXSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChs
b29rdXBUeXBlICE9IDEpIC8vICJTaW5nbGUgU3Vic3RpdHV0aW9uIFN1YnRhYmxlIiBpcyBhbGwg
d2hhdCB3ZSBzdXBwb3J0CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAo
dWludDE2X3QgaSA9IDA7IGkgPCBjb3VudFN1YlRhYmxlOyArK2kpIHsKKyAgICAgICAgICAgIGNv
bnN0IFN1YnN0aXR1dGlvblN1YlRhYmxlKiBzdWJzdGl0dXRpb24gPSB2YWxpZGF0ZU9mZnNldDxT
dWJzdGl0dXRpb25TdWJUYWJsZT4oYnVmZmVyLCBzdWJUYWJsZU9mZnNldHNbaV0pOworICAgICAg
ICAgICAgaWYgKCFzdWJzdGl0dXRpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2VUYWJsZSogY292ZXJhZ2UgPSBzdWJzdGl0dXRpb24t
PmNvdmVyYWdlKGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoIWNvdmVyYWdlKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChzdWJzdGl0dXRpb24tPnN1YnN0
Rm9ybWF0ICE9IDIpIC8vICJTaW5nbGUgU3Vic3RpdHV0aW9uIEZvcm1hdCAyIiBpcyBhbGwgd2hh
dCB3ZSBzdXBwb3J0CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
Y29uc3QgU2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlKiBzaW5nbGVTdWJzdGl0dXRpb24yID0g
dmFsaWRhdGVQdHI8U2luZ2xlU3Vic3RpdHV0aW9uMlN1YlRhYmxlPihidWZmZXIsIHN1YnN0aXR1
dGlvbik7CisgICAgICAgICAgICBpZiAoIXNpbmdsZVN1YnN0aXR1dGlvbjIpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgdWludDE2X3QgY291bnRUbyA9IHNpbmds
ZVN1YnN0aXR1dGlvbjItPmdseXBoQ291bnQ7CisgICAgICAgICAgICBpZiAoIWlzVmFsaWRFbmQo
YnVmZmVyLCAmc2luZ2xlU3Vic3RpdHV0aW9uMi0+c3Vic3RpdHV0ZVtjb3VudFRvXSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgc3dpdGNoIChjb3ZlcmFnZS0+
Y292ZXJhZ2VGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgMTogeyAvLyBDb3ZlcmFnZSBGb3Jt
YXQgMSAoZS5nLiwgTVMgR290aGljKQorICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlMVRh
YmxlKiBjb3ZlcmFnZTEgPSB2YWxpZGF0ZVB0cjxDb3ZlcmFnZTFUYWJsZT4oYnVmZmVyLCBjb3Zl
cmFnZSk7CisgICAgICAgICAgICAgICAgaWYgKCFjb3ZlcmFnZTEpCisgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudEZyb20gPSBj
b3ZlcmFnZTEtPmdseXBoQ291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1
ZmZlciwgJmNvdmVyYWdlMS0+Z2x5cGhBcnJheVtjb3VudEZyb21dKSB8fCBjb3VudFRvICE9IGNv
dW50RnJvbSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudFRvOyArK2kpCisgICAgICAgICAgICAg
ICAgICAgIG1hcC0+c2V0KGNvdmVyYWdlMS0+Z2x5cGhBcnJheVtpXSwgc2luZ2xlU3Vic3RpdHV0
aW9uMi0+c3Vic3RpdHV0ZVtpXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjYXNlIDI6IHsgLy8gQ292ZXJhZ2UgRm9ybWF0IDIgKGUuZy4sIEFk
b2JlIEtvenVrYSBHb3RoaWMpCisgICAgICAgICAgICAgICAgY29uc3QgQ292ZXJhZ2UyVGFibGUq
IGNvdmVyYWdlMiA9IHZhbGlkYXRlUHRyPENvdmVyYWdlMlRhYmxlPihidWZmZXIsIGNvdmVyYWdl
KTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvdmVyYWdlMikKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvdW50UmFuZ2UgPSBjb3Zl
cmFnZTItPnJhbmdlQ291bnQ7CisgICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkRW5kKGJ1ZmZl
ciwgJmNvdmVyYWdlMi0+cmFuZ2VzW2NvdW50UmFuZ2VdKSkKKyAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAodWludDE2X3QgaSA9IDAsIGluZGV4
VG8gPSAwOyBpIDwgY291bnRSYW5nZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQx
Nl90IGZyb20gPSBjb3ZlcmFnZTItPnJhbmdlc1tpXS5zdGFydDsKKyAgICAgICAgICAgICAgICAg
ICAgdWludDE2X3QgZnJvbUVuZCA9IGNvdmVyYWdlMi0+cmFuZ2VzW2ldLmVuZCArIDE7IC8vIE9w
ZW5UeXBlICJlbmQiIGlzIGluY2x1c2l2ZQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXhU
byArIChmcm9tRW5kIC0gZnJvbSkgPiBjb3VudFRvKQorICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmb3IgKDsgZnJvbSAhPSBmcm9tRW5k
OyArK2Zyb20sICsraW5kZXhUbykKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcC0+c2V0KGZy
b20sIHNpbmdsZVN1YnN0aXR1dGlvbjItPnN1YnN0aXR1dGVbaW5kZXhUb10pOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
fQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBM
b29rdXBMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1cENvdW50
OworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3VwT2Zmc2V0c1sxXTsKKworICAgIGNvbnN0IExv
b2t1cFRhYmxlKiBsb29rdXAodWludDE2X3QgaW5kZXgsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVm
ZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsK
KyAgICAgICAgaWYgKGluZGV4ID49IGNvdW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmxvb2t1
cE9mZnNldHNbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4g
dmFsaWRhdGVPZmZzZXQ8TG9va3VwVGFibGU+KGJ1ZmZlciwgbG9va3VwT2Zmc2V0c1tpbmRleF0p
OworICAgIH0KK307CisKK3N0cnVjdCBGZWF0dXJlVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9w
ZW5UeXBlOjpPZmZzZXQgZmVhdHVyZVBhcmFtczsKKyAgICBPcGVuVHlwZTo6VUludDE2IGxvb2t1
cENvdW50OworICAgIE9wZW5UeXBlOjpVSW50MTYgbG9va3VwTGlzdEluZGV4WzFdOworCisgICAg
Ym9vbCBnZXRHbHlwaFN1YnN0aXR1dGlvbnMoY29uc3QgTG9va3VwTGlzdCogbG9va3VwcywgSGFz
aE1hcDxHbHlwaCwgR2x5cGg+KiBtYXAsIGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25z
dAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBsb29rdXBDb3VudDsKKyAgICAgICAg
aWYgKCFpc1ZhbGlkRW5kKGJ1ZmZlciwgJmxvb2t1cExpc3RJbmRleFtjb3VudF0pKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY291
bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgTG9va3VwVGFibGUqIGxvb2t1cCA9IGxvb2t1
cHMtPmxvb2t1cChsb29rdXBMaXN0SW5kZXhbaV0sIGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAo
IWxvb2t1cCB8fCAhbG9va3VwLT5nZXRTdWJzdGl0dXRpb25zKG1hcCwgYnVmZmVyKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorfTsKKworc3RydWN0IEZlYXR1cmVMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVu
VHlwZTo6VUludDE2IGZlYXR1cmVDb3VudDsKKyAgICBzdHJ1Y3QgRmVhdHVyZVJlY29yZCB7Cisg
ICAgICAgIE9wZW5UeXBlOjpUYWcgZmVhdHVyZVRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNl
dCBmZWF0dXJlT2Zmc2V0OworICAgIH0gZmVhdHVyZXNbMV07CisKKyAgICBjb25zdCBGZWF0dXJl
VGFibGUqIGZlYXR1cmUodWludDE2X3QgaW5kZXgsIE9wZW5UeXBlOjpUYWcgdGFnLCBjb25zdCBT
aGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7CisgICAgICAgIHVpbnQxNl90IGNvdW50
ID0gZmVhdHVyZUNvdW50OworICAgICAgICBpZiAoaW5kZXggPj0gY291bnQgfHwgIWlzVmFsaWRF
bmQoYnVmZmVyLCAmZmVhdHVyZXNbY291bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAg
ICAgICBpZiAoZmVhdHVyZXNbaW5kZXhdLmZlYXR1cmVUYWcgPT0gdGFnKQorICAgICAgICAgICAg
cmV0dXJuIHZhbGlkYXRlT2Zmc2V0PEZlYXR1cmVUYWJsZT4oYnVmZmVyLCBmZWF0dXJlc1tpbmRl
eF0uZmVhdHVyZU9mZnNldCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVj
dCBMYW5nU3lzVGFibGUgOiBUYWJsZUJhc2UgeworICAgIE9wZW5UeXBlOjpPZmZzZXQgbG9va3Vw
T3JkZXI7CisgICAgT3BlblR5cGU6OlVJbnQxNiByZXFGZWF0dXJlSW5kZXg7CisgICAgT3BlblR5
cGU6OlVJbnQxNiBmZWF0dXJlQ291bnQ7CisgICAgT3BlblR5cGU6OlVJbnQxNiBmZWF0dXJlSW5k
ZXhbMV07CisKKyAgICBjb25zdCBGZWF0dXJlVGFibGUqIGZlYXR1cmUoT3BlblR5cGU6OlRhZyBm
ZWF0dXJlVGFnLCBjb25zdCBGZWF0dXJlTGlzdCogZmVhdHVyZXMsIGNvbnN0IFNoYXJlZEJ1ZmZl
ciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgdWludDE2X3QgY291bnQgPSBmZWF0dXJl
Q291bnQ7CisgICAgICAgIGlmICghaXNWYWxpZEVuZChidWZmZXIsICZmZWF0dXJlSW5kZXhbY291
bnRdKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBmb3IgKHVpbnQxNl90IGkgPSAw
OyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICAgICAgY29uc3QgRmVhdHVyZVRhYmxlKiBmZWF0
dXJlVGFibGUgPSBmZWF0dXJlcy0+ZmVhdHVyZShmZWF0dXJlSW5kZXhbaV0sIGZlYXR1cmVUYWcs
IGJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZmVhdHVyZVRhYmxlKQorICAgICAgICAgICAgICAg
IHJldHVybiBmZWF0dXJlVGFibGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAg
fQorfTsKKworc3RydWN0IFNjcmlwdFRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6
T2Zmc2V0IGRlZmF1bHRMYW5nU3lzT2Zmc2V0OworICAgIE9wZW5UeXBlOjpVSW50MTYgbGFuZ1N5
c0NvdW50OworICAgIHN0cnVjdCBMYW5nU3lzUmVjb3JkIHsKKyAgICAgICAgT3BlblR5cGU6OlRh
ZyBsYW5nU3lzVGFnOworICAgICAgICBPcGVuVHlwZTo6T2Zmc2V0IGxhbmdTeXNPZmZzZXQ7Cisg
ICAgfSBsYW5nU3lzUmVjb3Jkc1sxXTsKKworICAgIGNvbnN0IExhbmdTeXNUYWJsZSogZGVmYXVs
dExhbmdTeXMoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAg
ICB1aW50MTZfdCBjb3VudCA9IGxhbmdTeXNDb3VudDsKKyAgICAgICAgaWYgKCFpc1ZhbGlkRW5k
KGJ1ZmZlciwgJmxhbmdTeXNSZWNvcmRzW2NvdW50XSkpCisgICAgICAgICAgICByZXR1cm4gMDsK
KyAgICAgICAgdWludDE2X3Qgb2Zmc2V0ID0gZGVmYXVsdExhbmdTeXNPZmZzZXQ7CisgICAgICAg
IGlmIChvZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVPZmZzZXQ8TGFuZ1N5c1Rh
YmxlPihidWZmZXIsIG9mZnNldCk7CisgICAgICAgIGlmIChjb3VudCkKKyAgICAgICAgICAgIHJl
dHVybiB2YWxpZGF0ZU9mZnNldDxMYW5nU3lzVGFibGU+KGJ1ZmZlciwgbGFuZ1N5c1JlY29yZHNb
MF0ubGFuZ1N5c09mZnNldCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK307CisKK3N0cnVj
dCBTY3JpcHRMaXN0IDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlwZTo6VUludDE2IHNjcmlwdENv
dW50OworICAgIHN0cnVjdCBTY3JpcHRSZWNvcmQgeworICAgICAgICBPcGVuVHlwZTo6VGFnIHNj
cmlwdFRhZzsKKyAgICAgICAgT3BlblR5cGU6Ok9mZnNldCBzY3JpcHRPZmZzZXQ7CisgICAgfSBz
Y3JpcHRzWzFdOworCisgICAgY29uc3QgU2NyaXB0VGFibGUqIHNjcmlwdChPcGVuVHlwZTo6VGFn
IHRhZywgY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAgeworICAgICAgICB1
aW50MTZfdCBjb3VudCA9IHNjcmlwdENvdW50OworICAgICAgICBpZiAoIWlzVmFsaWRFbmQoYnVm
ZmVyLCAmc2NyaXB0c1tjb3VudF0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZv
ciAodWludDE2X3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoc2Ny
aXB0c1tpXS5zY3JpcHRUYWcgPT0gdGFnKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0
ZU9mZnNldDxTY3JpcHRUYWJsZT4oYnVmZmVyLCBzY3JpcHRzW2ldLnNjcmlwdE9mZnNldCk7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY29uc3QgU2NyaXB0VGFi
bGUqIGRlZmF1bHRTY3JpcHQoY29uc3QgU2hhcmVkQnVmZmVyJiBidWZmZXIpIGNvbnN0CisgICAg
eworICAgICAgICB1aW50MTZfdCBjb3VudCA9IHNjcmlwdENvdW50OworICAgICAgICBpZiAoIWNv
dW50IHx8ICFpc1ZhbGlkRW5kKGJ1ZmZlciwgJnNjcmlwdHNbY291bnRdKSkKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBjb25zdCBTY3JpcHRUYWJsZSogc2NyaXB0T2ZEZWZhdWx0VGFn
ID0gc2NyaXB0KE9wZW5UeXBlOjpEZWZhdWx0U2NyaXB0VGFnLCBidWZmZXIpOworICAgICAgICBp
ZiAoc2NyaXB0T2ZEZWZhdWx0VGFnKQorICAgICAgICAgICAgcmV0dXJuIHNjcmlwdE9mRGVmYXVs
dFRhZzsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlT2Zmc2V0PFNjcmlwdFRhYmxlPihidWZmZXIs
IHNjcmlwdHNbMF0uc2NyaXB0T2Zmc2V0KTsKKyAgICB9CisKKyAgICBjb25zdCBMYW5nU3lzVGFi
bGUqIGRlZmF1bHRMYW5nU3lzKGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAg
IHsKKyAgICAgICAgY29uc3QgU2NyaXB0VGFibGUqIHNjcmlwdFRhYmxlID0gZGVmYXVsdFNjcmlw
dChidWZmZXIpOworICAgICAgICBpZiAoIXNjcmlwdFRhYmxlKQorICAgICAgICAgICAgcmV0dXJu
IDA7CisgICAgICAgIHJldHVybiBzY3JpcHRUYWJsZS0+ZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsK
KyAgICB9Cit9OworCitzdHJ1Y3QgR1NVQlRhYmxlIDogVGFibGVCYXNlIHsKKyAgICBPcGVuVHlw
ZTo6Rml4ZWQgdmVyc2lvbjsKKyAgICBPcGVuVHlwZTo6T2Zmc2V0IHNjcmlwdExpc3RPZmZzZXQ7
CisgICAgT3BlblR5cGU6Ok9mZnNldCBmZWF0dXJlTGlzdE9mZnNldDsKKyAgICBPcGVuVHlwZTo6
T2Zmc2V0IGxvb2t1cExpc3RPZmZzZXQ7CisKKyAgICBjb25zdCBTY3JpcHRMaXN0KiBzY3JpcHRM
aXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9m
ZnNldDxTY3JpcHRMaXN0PihidWZmZXIsIHNjcmlwdExpc3RPZmZzZXQpOyB9CisgICAgY29uc3Qg
RmVhdHVyZUxpc3QqIGZlYXR1cmVMaXN0KGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25z
dCB7IHJldHVybiB2YWxpZGF0ZU9mZnNldDxGZWF0dXJlTGlzdD4oYnVmZmVyLCBmZWF0dXJlTGlz
dE9mZnNldCk7IH0KKyAgICBjb25zdCBMb29rdXBMaXN0KiBsb29rdXBMaXN0KGNvbnN0IFNoYXJl
ZEJ1ZmZlciYgYnVmZmVyKSBjb25zdCB7IHJldHVybiB2YWxpZGF0ZU9mZnNldDxMb29rdXBMaXN0
PihidWZmZXIsIGxvb2t1cExpc3RPZmZzZXQpOyB9CisKKyAgICBjb25zdCBMYW5nU3lzVGFibGUq
IGRlZmF1bHRMYW5nU3lzKGNvbnN0IFNoYXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsK
KyAgICAgICAgY29uc3QgU2NyaXB0TGlzdCogc2NyaXB0cyA9IHNjcmlwdExpc3QoYnVmZmVyKTsK
KyAgICAgICAgaWYgKCFzY3JpcHRzKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJl
dHVybiBzY3JpcHRzLT5kZWZhdWx0TGFuZ1N5cyhidWZmZXIpOworICAgIH0KKworICAgIGNvbnN0
IEZlYXR1cmVUYWJsZSogZmVhdHVyZShPcGVuVHlwZTo6VGFnIGZlYXR1cmVUYWcsIGNvbnN0IFNo
YXJlZEJ1ZmZlciYgYnVmZmVyKSBjb25zdAorICAgIHsKKyAgICAgICAgY29uc3QgTGFuZ1N5c1Rh
YmxlKiBsYW5nU3lzID0gZGVmYXVsdExhbmdTeXMoYnVmZmVyKTsKKyAgICAgICAgY29uc3QgRmVh
dHVyZUxpc3QqIGZlYXR1cmVzID0gZmVhdHVyZUxpc3QoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFs
YW5nU3lzIHx8ICFmZWF0dXJlcykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1
cm4gbGFuZ1N5cy0+ZmVhdHVyZShmZWF0dXJlVGFnLCBmZWF0dXJlcywgYnVmZmVyKTsKKyAgICB9
CisKKyAgICBib29sIGdldFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKEhhc2hNYXA8R2x5cGgs
IEdseXBoPiogbWFwLCBjb25zdCBTaGFyZWRCdWZmZXImIGJ1ZmZlcikgY29uc3QKKyAgICB7Cisg
ICAgICAgIGNvbnN0IEZlYXR1cmVUYWJsZSogdmVydGljYWxGZWF0dXJlVGFibGUgPSBmZWF0dXJl
KE9wZW5UeXBlOjpWZXJ0RmVhdHVyZVRhZywgYnVmZmVyKTsKKyAgICAgICAgaWYgKCF2ZXJ0aWNh
bEZlYXR1cmVUYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY29uc3Qg
TG9va3VwTGlzdCogbG9va3VwcyA9IGxvb2t1cExpc3QoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJu
IGxvb2t1cHMgJiYgdmVydGljYWxGZWF0dXJlVGFibGUtPmdldEdseXBoU3Vic3RpdHV0aW9ucyhs
b29rdXBzLCBtYXAsIGJ1ZmZlcik7CisgICAgfQorfTsKKwogI3ByYWdtYSBwYWNrKCkKIAogfSAv
LyBuYW1lc3BhY2UgT3BlblR5cGUKIAotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZh
bGlkYXRlZFB0cihjb25zdCBSZWZQdHI8U2hhcmVkQnVmZmVyPiYgYnVmZmVyLCBzaXplX3QgY291
bnQgPSAxKQorT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKKyAgICA6IG1fZGVmYXVsdFZlcnRPcmln
aW5ZKDApCiB7Ci0gICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5zaXplKCkgPCBzaXplb2YoVCkg
KiBjb3VudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgVCo+KGJ1ZmZlci0+ZGF0YSgpKTsKKyAgICBsb2FkTWV0cmljcyhwbGF0Zm9ybURhdGEp
OworICAgIGxvYWRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0aW9ucyhwbGF0Zm9ybURhdGEpOwogfQog
Ci1PcGVuVHlwZVZlcnRpY2FsRGF0YTo6T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBs
YXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhKQotICAgIDogbV9kZWZhdWx0VmVydE9yaWdpblkoMCkK
K3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRNZXRyaWNzKGNvbnN0IEZvbnRQbGF0Zm9y
bURhdGEmIHBsYXRmb3JtRGF0YSkKIHsKICAgICAvLyBMb2FkIGhoZWEgYW5kIGhtdHggdG8gZ2V0
IHgtY29tcG9uZW50IG9mIHZlcnRpY2FsIG9yaWdpbnMuCiAgICAgLy8gSWYgdGhlc2UgdGFibGVz
IGFyZSBtaXNzaW5nLCBpdCdzIG5vdCBhbiBPcGVuVHlwZSBmb250LgogICAgIFJlZlB0cjxTaGFy
ZWRCdWZmZXI+IGJ1ZmZlciA9IHBsYXRmb3JtRGF0YS5vcGVuVHlwZVRhYmxlKE9wZW5UeXBlOjpI
aGVhVGFnKTsKLSAgICBjb25zdCBPcGVuVHlwZTo6SGhlYVRhYmxlKiBoaGVhID0gdmFsaWRhdGVk
UHRyPE9wZW5UeXBlOjpIaGVhVGFibGU+KGJ1ZmZlcik7CisgICAgY29uc3QgT3BlblR5cGU6Okho
ZWFUYWJsZSogaGhlYSA9IE9wZW5UeXBlOjp2YWxpZGF0ZVRhYmxlPE9wZW5UeXBlOjpIaGVhVGFi
bGU+KGJ1ZmZlcik7CiAgICAgaWYgKCFoaGVhKQogICAgICAgICByZXR1cm47CiAgICAgdWludDE2
X3QgY291bnRIbXR4RW50cmllcyA9IGhoZWEtPm51bWJlck9mSE1ldHJpY3M7CkBAIC0xMzUsNyAr
NDAyLDcgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0
IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkKICAgICB9CiAKICAgICBidWZmZXIgPSBw
bGF0Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6SG10eFRhZyk7Ci0gICAgY29uc3Qg
T3BlblR5cGU6OkhtdHhUYWJsZSogaG10eCA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6SG10eFRh
YmxlPihidWZmZXIsIGNvdW50SG10eEVudHJpZXMpOworICAgIGNvbnN0IE9wZW5UeXBlOjpIbXR4
VGFibGUqIGhtdHggPSBPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZTxPcGVuVHlwZTo6SG10eFRhYmxl
PihidWZmZXIsIGNvdW50SG10eEVudHJpZXMpOwogICAgIGlmICghaG10eCkgewogICAgICAgICBM
T0dfRVJST1IoImhoZWEgZXhpc3RzIGJ1dCBobXR4IGRvZXMgbm90IChvciBicm9rZW4pIik7CiAg
ICAgICAgIHJldHVybjsKQEAgLTE0Niw3ICs0MTMsNyBAQCBPcGVuVHlwZVZlcnRpY2FsRGF0YTo6
T3BlblR5cGVWZXJ0aWNhbERhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRh
KQogCiAgICAgLy8gTG9hZCB2aGVhIGZpcnN0LiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVkIGZvciBm
b250cyB0aGF0IHN1cHBvcnQgdmVydGljYWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0Zm9ybURh
dGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6VmhlYVRhZyk7Ci0gICAgY29uc3QgT3BlblR5cGU6
OlZoZWFUYWJsZSogdmhlYSA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6VmhlYVRhYmxlPihidWZm
ZXIpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWaGVhVGFibGUqIHZoZWEgPSBPcGVuVHlwZTo6dmFs
aWRhdGVUYWJsZTxPcGVuVHlwZTo6VmhlYVRhYmxlPihidWZmZXIpOwogICAgIGlmICghdmhlYSkK
ICAgICAgICAgcmV0dXJuOwogICAgIHVpbnQxNl90IGNvdW50Vm10eEVudHJpZXMgPSB2aGVhLT5u
dW1PZkxvbmdWZXJNZXRyaWNzOwpAQCAtMTU3LDcgKzQyNCw3IEBAIE9wZW5UeXBlVmVydGljYWxE
YXRhOjpPcGVuVHlwZVZlcnRpY2FsRGF0YShjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9y
bURhdGEpCiAKICAgICAvLyBMb2FkIFZPUkcuIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwuCiAgICAg
YnVmZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFibGUoT3BlblR5cGU6OlZPUkdUYWcpOwot
ICAgIGNvbnN0IE9wZW5UeXBlOjpWT1JHVGFibGUqIHZvcmcgPSB2YWxpZGF0ZWRQdHI8T3BlblR5
cGU6OlZPUkdUYWJsZT4oYnVmZmVyKTsKKyAgICBjb25zdCBPcGVuVHlwZTo6Vk9SR1RhYmxlKiB2
b3JnID0gT3BlblR5cGU6OnZhbGlkYXRlVGFibGU8T3BlblR5cGU6OlZPUkdUYWJsZT4oYnVmZmVy
KTsKICAgICBpZiAodm9yZyAmJiBidWZmZXItPnNpemUoKSA+PSB2b3JnLT5yZXF1aXJlZFNpemUo
KSkgewogICAgICAgICBtX2RlZmF1bHRWZXJ0T3JpZ2luWSA9IHZvcmctPmRlZmF1bHRWZXJ0T3Jp
Z2luWTsKICAgICAgICAgdWludDE2X3QgY291bnRWZXJ0T3JpZ2luWU1ldHJpY3MgPSB2b3JnLT5u
dW1WZXJ0T3JpZ2luWU1ldHJpY3M7CkBAIC0xNzQsNyArNDQxLDcgQEAgT3BlblR5cGVWZXJ0aWNh
bERhdGE6Ok9wZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRm
b3JtRGF0YSkKIAogICAgIC8vIExvYWQgdm10eCB0aGVuLiBUaGlzIHRhYmxlIGlzIHJlcXVpcmVk
IGZvciBmb250cyB0aGF0IHN1cHBvcnQgdmVydGljYWwgZmxvdy4KICAgICBidWZmZXIgPSBwbGF0
Zm9ybURhdGEub3BlblR5cGVUYWJsZShPcGVuVHlwZTo6Vm10eFRhZyk7Ci0gICAgY29uc3QgT3Bl
blR5cGU6OlZtdHhUYWJsZSogdm10eCA9IHZhbGlkYXRlZFB0cjxPcGVuVHlwZTo6Vm10eFRhYmxl
PihidWZmZXIsIGNvdW50Vm10eEVudHJpZXMpOworICAgIGNvbnN0IE9wZW5UeXBlOjpWbXR4VGFi
bGUqIHZtdHggPSBPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZTxPcGVuVHlwZTo6Vm10eFRhYmxlPihi
dWZmZXIsIGNvdW50Vm10eEVudHJpZXMpOwogICAgIGlmICghdm10eCkgewogICAgICAgICBMT0df
RVJST1IoInZoZWEgZXhpc3RzIGJ1dCB2bXR4IGRvZXMgbm90IChvciBicm9rZW4pIik7CiAgICAg
ICAgIHJldHVybjsKQEAgLTIwNSw2ICs0NzIsMTQgQEAgT3BlblR5cGVWZXJ0aWNhbERhdGE6Ok9w
ZW5UeXBlVmVydGljYWxEYXRhKGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSkK
ICAgICB9CiB9CiAKK3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OmxvYWRWZXJ0aWNhbEdseXBo
U3Vic3RpdHV0aW9ucyhjb25zdCBGb250UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEpCit7Cisg
ICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gcGxhdGZvcm1EYXRhLm9wZW5UeXBlVGFi
bGUoT3BlblR5cGU6OkdTVUJUYWcpOworICAgIGNvbnN0IE9wZW5UeXBlOjpHU1VCVGFibGUqIGdz
dWIgPSBPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZTxPcGVuVHlwZTo6R1NVQlRhYmxlPihidWZmZXIp
OworICAgIGlmIChnc3ViKQorICAgICAgICBnc3ViLT5nZXRWZXJ0aWNhbEdseXBoU3Vic3RpdHV0
aW9ucygmbV92ZXJ0aWNhbEdseXBoTWFwLCAqYnVmZmVyLmdldCgpKTsKK30KKwogZmxvYXQgT3Bl
blR5cGVWZXJ0aWNhbERhdGE6OmFkdmFuY2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqIGZv
bnQsIEdseXBoIGdseXBoKSBjb25zdAogewogICAgIHNpemVfdCBjb3VudEhlaWdodHMgPSBtX2Fk
dmFuY2VIZWlnaHRzLnNpemUoKTsKQEAgLTI2MSw0ICs1MzYsMjMgQEAgdm9pZCBPcGVuVHlwZVZl
cnRpY2FsRGF0YTo6Z2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMoY29uc3QgU2ltcGxl
Rm9udERhdGEKICAgICB9CiB9CiAKK3ZvaWQgT3BlblR5cGVWZXJ0aWNhbERhdGE6OnN1YnN0aXR1
dGVXaXRoVmVydGljYWxHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIEdseXBoUGFn
ZSogZ2x5cGhQYWdlLCB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCkgY29uc3QKK3sK
KyAgICBjb25zdCBIYXNoTWFwPEdseXBoLCBHbHlwaD4mIG1hcCA9IG1fdmVydGljYWxHbHlwaE1h
cDsKKyAgICBpZiAobWFwLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yICh1
bnNpZ25lZCBpbmRleCA9IG9mZnNldCwgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOyBpbmRleCA8IGVu
ZDsgKytpbmRleCkgeworICAgICAgICBHbHlwaCBnbHlwaCA9IGdseXBoUGFnZS0+Z2x5cGhBdChp
bmRleCk7CisgICAgICAgIGlmIChnbHlwaCkgeworICAgICAgICAgICAgQVNTRVJUKGdseXBoUGFn
ZS0+Z2x5cGhEYXRhRm9ySW5kZXgoaW5kZXgpLmZvbnREYXRhID09IGZvbnQpOworICAgICAgICAg
ICAgR2x5cGggdG8gPSBtYXAuZ2V0KGdseXBoKTsKKyAgICAgICAgICAgIGlmICh0bykKKyAgICAg
ICAgICAgICAgICBnbHlwaFBhZ2UtPnNldEdseXBoRGF0YUZvckluZGV4KGluZGV4LCB0bywgZm9u
dCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShPUEVOVFlQRV9WRVJUSUNBTCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmggYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVudHlwZS9PcGVuVHlwZVZlcnRpY2Fs
RGF0YS5oCmluZGV4IDg1ZTRlZTcuLmYwNzM5NTcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL29wZW50eXBlL09wZW5UeXBlVmVydGljYWxEYXRhLmgKKysrIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbnR5cGUvT3BlblR5cGVWZXJ0aWNh
bERhdGEuaApAQCAtNDMsMTAgKzQzLDE0IEBAIHB1YmxpYzoKICAgICBib29sIGhhc1ZlcnRpY2Fs
TWV0cmljcygpIGNvbnN0IHsgcmV0dXJuICFtX2FkdmFuY2VIZWlnaHRzLmlzRW1wdHkoKTsgfQog
ICAgIGZsb2F0IGFkdmFuY2VIZWlnaHQoY29uc3QgU2ltcGxlRm9udERhdGEqLCBHbHlwaCkgY29u
c3Q7CiAgICAgdm9pZCBnZXRWZXJ0aWNhbFRyYW5zbGF0aW9uc0ZvckdseXBocyhjb25zdCBTaW1w
bGVGb250RGF0YSosIGNvbnN0IEdseXBoKiwgc2l6ZV90LCBmbG9hdCogb3V0WFlBcnJheSkgY29u
c3Q7CisgICAgdm9pZCBzdWJzdGl0dXRlV2l0aFZlcnRpY2FsR2x5cGhzKGNvbnN0IFNpbXBsZUZv
bnREYXRhKiwgR2x5cGhQYWdlKiwgdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgpIGNv
bnN0OwogCiBwcml2YXRlOgorICAgIHZvaWQgbG9hZE1ldHJpY3MoY29uc3QgRm9udFBsYXRmb3Jt
RGF0YSYpOworICAgIHZvaWQgbG9hZFZlcnRpY2FsR2x5cGhTdWJzdGl0dXRpb25zKGNvbnN0IEZv
bnRQbGF0Zm9ybURhdGEmKTsKICAgICBib29sIGhhc1ZPUkcoKSBjb25zdCB7IHJldHVybiAhbV92
ZXJ0T3JpZ2luWS5pc0VtcHR5KCk7IH0KIAorICAgIEhhc2hNYXA8R2x5cGgsIEdseXBoPiBtX3Zl
cnRpY2FsR2x5cGhNYXA7CiAgICAgVmVjdG9yPHVpbnQxNl90PiBtX2FkdmFuY2VXaWR0aHM7CiAg
ICAgVmVjdG9yPHVpbnQxNl90PiBtX2FkdmFuY2VIZWlnaHRzOwogICAgIFZlY3RvcjxpbnQxNl90
PiBtX3RvcFNpZGVCZWFyaW5nczsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
Q2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKaW5kZXggY2EwMDQ5
MS4uNThkZGY4NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cK
KysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMi0wNy0xNSAgS29qaSBJc2hpaSAgPGtvamlpc2hpQGdtYWlsLmNvbT4KKworICAgICAgICBW
ZXJ0aWNhbCBhbHRlcm5hdGUgZ2x5cGggKEdTVUIpIHN1cHBvcnQgZm9yIE9wZW5UeXBlVmVydGlj
YWxEYXRhCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD04
MTM4OQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFRl
c3RzIGZvciBwb2ludGVyIHZhbGlkYXRpb25zIGZvciBPcGVuVHlwZSB0YWJsZXMuCisKKyAgICAg
ICAgKiBXZWJLaXQuZ3lwaToKKyAgICAgICAgKiB0ZXN0cy9PcGVuVHlwZVZlcnRpY2FsRGF0YVRl
c3QuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGVzdFRhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OlRlc3RUYWJsZTo6dmFsaWRhdGVPZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6VEVTVCk6CisKIDIwMTItMDctMTMgIEVyaWMgUGVubmVyICA8ZXBlbm5lckBnb29n
bGUuY29tPgogCiAgICAgICAgIFtjaHJvbWl1bV0gQWRkICdzZWxmLW1hbmFnZWQnIG9wdGlvbiB0
byBDQ1ByaW9yaXRpemVkVGV4dHVyZSB0byBlbmFibGUgcmVuZGVyLXN1cmZhY2UgYW5kIGNhbnZh
cyB1c2UgY2FzZXMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5n
eXBpIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQppbmRleCA1OWMwMDc5Li40
MGIyM2JlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkKQEAgLTEyNiw2ICsxMjYsNyBA
QAogICAgICAgICAgICAgJ3Rlc3RzL0xvY2FsaXplZE51bWJlcklDVVRlc3QuY3BwJywKICAgICAg
ICAgICAgICd0ZXN0cy9Nb2NrQ0NRdWFkQ3VsbGVyLmgnLAogICAgICAgICAgICAgJ3Rlc3RzL09w
YXF1ZVJlY3RUcmFja2luZ0NvbnRlbnRMYXllckRlbGVnYXRlVGVzdC5jcHAnLAorICAgICAgICAg
ICAgJ3Rlc3RzL09wZW5UeXBlVmVydGljYWxEYXRhVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rl
c3RzL1BhaW50QWdncmVnYXRvclRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9QbGF0Zm9y
bUdlc3R1cmVDdXJ2ZVRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9QbGF0Zm9ybUNvbnRl
eHRTa2lhVGVzdC5jcHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9PcGVuVHlwZVZlcnRpY2FsRGF0YVRlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90
ZXN0cy9PcGVuVHlwZVZlcnRpY2FsRGF0YVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmUwNWEyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL3Rlc3RzL09wZW5UeXBlVmVydGljYWxEYXRhVGVzdC5jcHAKQEAgLTAsMCArMSw4NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBLb2ppIElzaGlpIDxrb2ppaXNoaUBnbWFpbC5j
b20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElT
CisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoT1BFTlRZ
UEVfVkVSVElDQUwpCisKKyNpbmNsdWRlICJPcGVuVHlwZVR5cGVzLmgiCisjaW5jbHVkZSAiU2hh
cmVkQnVmZmVyLmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3dGYvUmVm
UHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2UgeworCitzdHJ1
Y3QgVGVzdFRhYmxlIDogT3BlblR5cGU6OlRhYmxlQmFzZSB7CisgICAgT3BlblR5cGU6OkZpeGVk
IHZlcnNpb247CisgICAgT3BlblR5cGU6OkludDE2IGFzY2VuZGVyOworCisgICAgdGVtcGxhdGUg
PHR5cGVuYW1lIFQ+IGNvbnN0IFQqIHZhbGlkYXRlT2Zmc2V0KGNvbnN0IFNoYXJlZEJ1ZmZlciYg
YnVmZmVyLCB1aW50MTZfdCBvZmZzZXQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gVGFi
bGVCYXNlOjp2YWxpZGF0ZU9mZnNldDxUPihidWZmZXIsIG9mZnNldCk7CisgICAgfQorfTsKKwor
VEVTVChPcGVuVHlwZVZlcnRpY2FsRGF0YVRlc3QsIFZhbGlkYXRlVGFibGVUZXN0KQoreworICAg
IFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKHNpemVv
ZihUZXN0VGFibGUpKTsKKyAgICBjb25zdCBUZXN0VGFibGUqIHRhYmxlID0gT3BlblR5cGU6OnZh
bGlkYXRlVGFibGU8VGVzdFRhYmxlPihidWZmZXIpOworICAgIEVYUEVDVF9UUlVFKHRhYmxlKTsK
KworICAgIGJ1ZmZlciA9IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlKHNpemVvZihUZXN0VGFibGUpIC0g
MSk7CisgICAgdGFibGUgPSBPcGVuVHlwZTo6dmFsaWRhdGVUYWJsZTxUZXN0VGFibGU+KGJ1ZmZl
cik7CisgICAgRVhQRUNUX0ZBTFNFKHRhYmxlKTsKKworICAgIGJ1ZmZlciA9IFNoYXJlZEJ1ZmZl
cjo6Y3JlYXRlKHNpemVvZihUZXN0VGFibGUpICsgMSk7CisgICAgdGFibGUgPSBPcGVuVHlwZTo6
dmFsaWRhdGVUYWJsZTxUZXN0VGFibGU+KGJ1ZmZlcik7CisgICAgRVhQRUNUX1RSVUUodGFibGUp
OworfQorCitURVNUKE9wZW5UeXBlVmVydGljYWxEYXRhVGVzdCwgVmFsaWRhdGVPZmZzZXRUZXN0
KQoreworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IGJ1ZmZlciA9IFNoYXJlZEJ1ZmZlcjo6Y3Jl
YXRlKHNpemVvZihUZXN0VGFibGUpKTsKKyAgICBjb25zdCBUZXN0VGFibGUqIHRhYmxlID0gT3Bl
blR5cGU6OnZhbGlkYXRlVGFibGU8VGVzdFRhYmxlPihidWZmZXIpOworICAgIEFTU0VSVF9UUlVF
KHRhYmxlKTsKKworICAgIC8vIFRlc3Qgb3ZlcmZsb3cKKyAgICBFWFBFQ1RfRkFMU0UodGFibGUt
PnZhbGlkYXRlT2Zmc2V0PHVpbnQ4X3Q+KCpidWZmZXIsIC0xKSk7CisKKyAgICAvLyB1aW50OF90
IGlzIHZhbGlkIGZvciBhbGwgb2Zmc2V0cworICAgIGZvciAodWludDE2X3Qgb2Zmc2V0ID0gMDsg
b2Zmc2V0IDwgc2l6ZW9mKFRlc3RUYWJsZSk7IG9mZnNldCsrKQorICAgICAgICBFWFBFQ1RfVFJV
RSh0YWJsZS0+dmFsaWRhdGVPZmZzZXQ8dWludDhfdD4oKmJ1ZmZlciwgb2Zmc2V0KSk7CisgICAg
RVhQRUNUX0ZBTFNFKHRhYmxlLT52YWxpZGF0ZU9mZnNldDx1aW50OF90PigqYnVmZmVyLCBzaXpl
b2YoVGVzdFRhYmxlKSkpOworICAgIEVYUEVDVF9GQUxTRSh0YWJsZS0+dmFsaWRhdGVPZmZzZXQ8
dWludDhfdD4oKmJ1ZmZlciwgc2l6ZW9mKFRlc3RUYWJsZSkgKyAxKSk7CisKKyAgICAvLyBGb3Ig
dWludDE2X3QsIHRoZSBsYXN0IGJ5dGUgaXMgaW52YWxpZAorICAgIGZvciAodWludDE2X3Qgb2Zm
c2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZW9mKFRlc3RUYWJsZSkgLSAxOyBvZmZzZXQrKykKKyAgICAg
ICAgRVhQRUNUX1RSVUUodGFibGUtPnZhbGlkYXRlT2Zmc2V0PHVpbnQxNl90PigqYnVmZmVyLCBv
ZmZzZXQpKTsKKyAgICBFWFBFQ1RfRkFMU0UodGFibGUtPnZhbGlkYXRlT2Zmc2V0PHVpbnQxNl90
PigqYnVmZmVyLCBzaXplb2YoVGVzdFRhYmxlKSAtIDEpKTsKK30KKworfSAvLyBuYW1lc3BhY2UK
KworI2VuZGlmIC8vIEVOQUJMRShPUEVOVFlQRV9WRVJUSUNBTCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>