<?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>57340</bug_id>
          
          <creation_ts>2011-03-29 07:34:53 -0700</creation_ts>
          <short_desc>REGRESSION(r74971): Selection doesn&apos;t work correctly in BiDi Text</short_desc>
          <delta_ts>2011-09-26 11:29:28 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Regression</keywords>
          <priority>P1</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>64626</dependson>
    
    <dependson>65356</dependson>
    
    <dependson>67869</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jeremy Moskovich">playmobil</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>cshu</cc>
    
    <cc>darin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>leviw</cc>
    
    <cc>mitz</cc>
    
    <cc>progame+wk</cc>
    
    <cc>rniwa</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>xji</cc>
    
    <cc>yael</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>375311</commentid>
    <comment_count>0</comment_count>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2011-03-29 07:34:53 -0700</bug_when>
    <thetext>In the attached testcase, try selecting the rightmost letter on the first line by clicking to it&apos;s right and dragging left.

Expected results:
The first letter should be selected.

Actual results:
The entire run EXCEPT for the first letter is selected.

See attached screenshot.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375312</commentid>
    <comment_count>1</comment_count>
      <attachid>87323</attachid>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2011-03-29 07:35:19 -0700</bug_when>
    <thetext>Created attachment 87323
Testcase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375315</commentid>
    <comment_count>2</comment_count>
      <attachid>87324</attachid>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2011-03-29 07:36:17 -0700</bug_when>
    <thetext>Created attachment 87324
Screenshot - trying to select the first letter.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375319</commentid>
    <comment_count>3</comment_count>
      <attachid>87325</attachid>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2011-03-29 07:38:21 -0700</bug_when>
    <thetext>Created attachment 87325
Testcase</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>375521</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-03-29 10:48:25 -0700</bug_when>
    <thetext>Since we have a test case, bisect-builds, or a tiny script written for git bisect should easily be able to find the regressing revision.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>399736</commentid>
    <comment_count>5</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-05-06 12:42:03 -0700</bug_when>
    <thetext>I think this is a dup of the bug 59435.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432926</commentid>
    <comment_count>6</comment_count>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-07-06 12:08:49 -0700</bug_when>
    <thetext>I am copying comments from issue 59435
https://bugs.webkit.org/show_bug.cgi?id=59435#c9

(In reply to comment #7)
&gt; Created an attachment (id=91394) [details] [details]
&gt; test case
&gt; 
&gt; I attached this simple html with a &lt;p&gt; and &lt;div&gt; (no &lt;br&gt;), 
&gt; but the selection is not correct in the ways that:
&gt; 1. select from left to right, you can not select the rightmost character.
&gt; 2. select from rightmost to left, you can not select the rightmost character.

For example, given the logical text &quot;abcABC&quot; in LTR context, whose display is &quot;abcCBA&quot;, when caret is placed rightmost at &quot;abcCBA|&quot;, the returned offset from 
http://trac.webkit.org/changeset/74971/trunk/WebCore/rendering/InlineTextBox.cpp is swapped from 0 to 3 due to the box and its containing block are in different directionality. Select left and stops at &quot;abcCB|A&quot;, the offset returned is 1, which is correct. The correct selection range should be from offset 0 to 1 and selects &apos;A&apos;, instead, the selection range is from offset 3 to 1 and &quot;CB&quot; is selected.

Similar when select left to right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>432927</commentid>
    <comment_count>7</comment_count>
      <attachid>99859</attachid>
    <who name="Xiaomei Ji">xji</who>
    <bug_when>2011-07-06 12:10:36 -0700</bug_when>
    <thetext>Created attachment 99859
test case corresponding to comment #6</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>435350</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-11 18:00:17 -0700</bug_when>
    <thetext>Fixing this bug would require us implementing some hack around FrameSelection.

To see the fundamental issue around this,
1. Open up TextEdit on Mac
2. Type &quot;‎לשנת מיליון שקלים&quot;
3. Set the writing direction to LTR
4. Enlarge the font size and resize the window so that each word appears on a separate line.

Place the insertion point on the right of the first line.  You can confirm that the insertion point is at offset 4 by inserting some letter or resizing the window.

Now extend the selection to the left by mouse or keyboard.  Observe that ‎&quot;ל&quot; is elected.  This is the first letter in the text and the only way this text can be selected was if selection starts at offset 0 and ends at 1 respectively.  In other words, TextEdit is changing the selection base from offset 4 to offset 0 when the user extends selection.

To implement this behavior in WebKit, we&apos;d have to detect when the selection base is at the line boundary and the line&apos;s direction and block&apos;s direction differ and modify the base; we need to restore the original base when the user extends the selection back to the original base or extends the selection to a different line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444180</commentid>
    <comment_count>9</comment_count>
      <attachid>102410</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-29 16:58:50 -0700</bug_when>
    <thetext>Created attachment 102410
work in progress

Here&apos;s work in progress.  I&apos;d have to cleanup the code and push the changes to FrameSelection because we have to restore the original base when scripts collapse selection, etc...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444398</commentid>
    <comment_count>10</comment_count>
      <attachid>102456</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-07-31 00:04:16 -0700</bug_when>
    <thetext>Created attachment 102456
work in progress 2

This patch fixes basic cases.  Jeremy&apos;s test case (attachment 87325) still doesn&apos;t work due to the bug 65356.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>454276</commentid>
    <comment_count>11</comment_count>
      <attachid>104608</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-08-19 18:56:42 -0700</bug_when>
    <thetext>Created attachment 104608
work in progress 3

Updated the patch after http://trac.webkit.org/changeset/93221.  Need to investigate why the following 2 tests fail:
editing/selection/select-bidi-run.html
editing/selection/select-from-textfield-outwards.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>455473</commentid>
    <comment_count>12</comment_count>
      <attachid>104862</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-08-23 10:21:40 -0700</bug_when>
    <thetext>Created attachment 104862
work in progress 4

I&apos;m trying to make this patch look nicer by pushing code into RenderedPosition, but having a trouble determining a good abstraction layer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460718</commentid>
    <comment_count>13</comment_count>
      <attachid>106014</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-01 12:54:03 -0700</bug_when>
    <thetext>Created attachment 106014
work in progress 5</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460738</commentid>
    <comment_count>14</comment_count>
      <attachid>106014</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-01 13:31:16 -0700</bug_when>
    <thetext>Comment on attachment 106014
work in progress 5

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

&gt; Source/WebCore/editing/RenderedPosition.cpp:118
&gt; +        if (!boxOnLeft || boxOnLeft-&gt;bidiLevel() &lt; box-&gt;bidiLevel()) {
&gt; +            return AtLeftBoundary;
&gt; +        }

{ } ?

&gt; Source/WebCore/editing/RenderedPosition.cpp:122
&gt; +    } else {
&gt; +    }

?

&gt; Source/WebCore/editing/RenderedPosition.cpp:123
&gt; +    if (m_offset == m_inlineBox-&gt;caretRightmostOffset()) {

Should this just early return !=?

&gt; Source/WebCore/editing/RenderedPosition.cpp:153
&gt; +    do {

I don&apos;t think there is any advantage to using do while over while here.

&gt; Source/WebCore/editing/RenderedPosition.cpp:196
&gt; +/*
&gt; +    if (atRightmostOffsetInBox())
&gt; +        return bidiLevel() &lt; bidiLevelOfRun &amp;&amp; nextLeafChild() &amp;&amp; nextLeafChild()-&gt;bidiLevel() &gt;= bidiLevelOfRun;
&gt; +*/

?

&gt; Source/WebCore/editing/RenderedPosition.cpp:213
&gt; +/*
&gt; +    if (atLeftmostOffsetInBox())
&gt; +        return bidiLevel() &lt; bidiLevelOfRun &amp;&amp; prevLeafChild() &amp;&amp; prevLeafChild()-&gt;bidiLevel() &gt; bidiLevel;
&gt; +*/

We don&apos;t normally commit commented out code.

Oh, now I see, this isnt&apos; actually up for review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>460742</commentid>
    <comment_count>15</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-01 13:36:02 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; Oh, now I see, this isnt&apos; actually up for review.

Yeah, I was working on this last week but I have to work on some editing/forms related regressions this week so I&apos;m uploading it here FYI.  The patch works as is (except few edge cases I have to address) but I want to organize code more cleanly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>464615</commentid>
    <comment_count>16</comment_count>
      <attachid>106833</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-08 20:31:04 -0700</bug_when>
    <thetext>Created attachment 106833
work in progress 6

I need a few more iterations but I welcome your early design review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465164</commentid>
    <comment_count>17</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-09 18:39:21 -0700</bug_when>
    <thetext>Unfortunately, I can&apos;t get the Jeremy&apos;s test case to a satisfactory level but Safari 5 didn&apos;t handle it well either so I would not consider it as a future improvement potential.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465237</commentid>
    <comment_count>18</comment_count>
      <attachid>106967</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-09 23:10:56 -0700</bug_when>
    <thetext>Created attachment 106967
initial patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465298</commentid>
    <comment_count>19</comment_count>
      <attachid>106967</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-09-10 10:06:26 -0700</bug_when>
    <thetext>Comment on attachment 106967
initial patch

Attachment 106967 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/9633242

New failing tests:
editing/selection/select-bidi-run.html
svg/custom/svg-fonts-word-spacing.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465767</commentid>
    <comment_count>20</comment_count>
      <attachid>106967</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-12 13:39:53 -0700</bug_when>
    <thetext>Comment on attachment 106967
initial patch

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

&gt; Source/WebCore/editing/FrameSelection.cpp:170
&gt; +    RenderedPosition basePosition(base);
&gt; +    RenderedPosition extentPosition(extent);

Seems it would be better to name these base and extent (since they&apos;re so commonly typed) and us visibleBase and visibleExtent for the less common argument names.

&gt; Source/WebCore/editing/RenderedPosition.cpp:112
&gt; +        m_nextLeafChild = m_inlineBox-&gt;nextLeafChild();
&gt; +        setCached(CachedNextLeafChild);
&gt; +    }

When do we expire these caches?

&gt; Source/WebCore/editing/RenderedPosition.cpp:169
&gt; +bool RenderedPosition::atLeftBoundaryOfBidiRun(ShouldMatchBidiLevel shouldMatchBidiLevel, unsigned char bidiLevelOfRun) const

I wish there were a way to share code between these two functions.

&gt; Source/WebCore/editing/RenderedPosition.h:93
&gt; +    mutable unsigned m_cacheStatus : 2;

Why this instead of just using -1 or some other value to indicate an uncached pointer?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465770</commentid>
    <comment_count>21</comment_count>
      <attachid>106967</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-12 13:46:02 -0700</bug_when>
    <thetext>Comment on attachment 106967
initial patch

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

&gt;&gt; Source/WebCore/editing/RenderedPosition.cpp:112
&gt;&gt; +    }
&gt; 
&gt; When do we expire these caches?

We never do at the moment because RenderedPosition doesn&apos;t provide any member functions to modify.

&gt;&gt; Source/WebCore/editing/RenderedPosition.cpp:169
&gt;&gt; +bool RenderedPosition::atLeftBoundaryOfBidiRun(ShouldMatchBidiLevel shouldMatchBidiLevel, unsigned char bidiLevelOfRun) const
&gt; 
&gt; I wish there were a way to share code between these two functions.

Yeah but they call opposite left/right functions so it&apos;s hard to do. I might be able to use macro or template to do it but that&apos;ll make this code less readable.

&gt;&gt; Source/WebCore/editing/RenderedPosition.h:93
&gt;&gt; +    mutable unsigned m_cacheStatus : 2;
&gt; 
&gt; Why this instead of just using -1 or some other value to indicate an uncached pointer?

Each pointer is cached separately.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465979</commentid>
    <comment_count>22</comment_count>
      <attachid>107115</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-12 17:08:28 -0700</bug_when>
    <thetext>Created attachment 107115
Updated per Eric&apos;s suggestion</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>465987</commentid>
    <comment_count>23</comment_count>
      <attachid>107115</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-09-12 17:23:29 -0700</bug_when>
    <thetext>Comment on attachment 107115
Updated per Eric&apos;s suggestion

Attachment 107115 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/9640961</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466001</commentid>
    <comment_count>24</comment_count>
      <attachid>107118</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-12 18:02:54 -0700</bug_when>
    <thetext>Created attachment 107118
Fixed qt build</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>466019</commentid>
    <comment_count>25</comment_count>
      <attachid>107118</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-09-12 18:41:08 -0700</bug_when>
    <thetext>Comment on attachment 107118
Fixed qt build

Attachment 107118 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/9644416

New failing tests:
editing/selection/select-bidi-run.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470496</commentid>
    <comment_count>26</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-20 17:21:58 -0700</bug_when>
    <thetext>Mitz and Enrica may wish to be aware of this change.  Reviewing now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470497</commentid>
    <comment_count>27</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-20 17:23:09 -0700</bug_when>
    <thetext>(In reply to comment #20)
&gt; (From update of attachment 106967 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=106967&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/FrameSelection.cpp:170
&gt; &gt; +    RenderedPosition basePosition(base);
&gt; &gt; +    RenderedPosition extentPosition(extent);
&gt; 
&gt; Seems it would be better to name these base and extent (since they&apos;re so commonly typed) and us visibleBase and visibleExtent for the less common argument names.

Did you disagree with this comment?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470499</commentid>
    <comment_count>28</comment_count>
      <attachid>107118</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-20 17:32:40 -0700</bug_when>
    <thetext>Comment on attachment 107118
Fixed qt build

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

&gt; Source/WebCore/editing/FrameSelection.cpp:170
&gt; +static void adjustEndpointsAtBidiBoundary(VisiblePosition&amp; base, VisiblePosition&amp; extent)
&gt; +{
&gt; +    RenderedPosition basePosition(base);
&gt; +    RenderedPosition extentPosition(extent);

I still would flip this argument naming.  Argument as visibleBase, visibleExtent and locals as base, extent.

&gt; Source/WebCore/editing/RenderedPosition.cpp:112
&gt; +InlineBox* RenderedPosition::prevLeafChild() const
&gt; +{
&gt; +    if (m_prevLeafChild == uncachedInlineBox())
&gt; +        m_prevLeafChild = m_inlineBox-&gt;prevLeafChild();
&gt; +    return m_prevLeafChild;
&gt; +}
&gt; +
&gt; +InlineBox* RenderedPosition::nextLeafChild() const
&gt; +{
&gt; +    if (m_nextLeafChild == uncachedInlineBox())
&gt; +        m_nextLeafChild = m_inlineBox-&gt;nextLeafChild();
&gt; +    return m_nextLeafChild;
&gt; +}

Why do we need these caches?  Did this show up on a benchmark?  If they didn&apos;t, I&apos;d rather not take the security risk associated with weak pointers.

&gt; Source/WebCore/editing/RenderedPosition.cpp:118
&gt; +    return (m_renderer == other.m_renderer &amp;&amp; m_inlineBox == other.m_inlineBox &amp;&amp; m_offset == other.m_offset)
&gt; +        || (atLeftmostOffsetInBox() &amp;&amp; other.atRightmostOffsetInBox() &amp;&amp; prevLeafChild() == other.m_inlineBox)
&gt; +        || (atRightmostOffsetInBox() &amp;&amp; other.atLeftmostOffsetInBox() &amp;&amp; nextLeafChild() == other.m_inlineBox);

This might be more clear written out using locals?  I&apos;m not sure.  as-is this is unreadable to my eyes.

Also, is this some sort of equivalence? WHy the ||?  Should this be a separately named equivalence function? (like how Darin long ago suggested for comparing Position objects)?  == seems wrongly overloaded for this use.

&gt; Source/WebCore/editing/RenderedPosition.cpp:147
&gt; +    ASSERT_NOT_REACHED();
&gt; +    return RenderedPosition();

I wonder if you can just remove this and the compiler will do the right thing?

&gt; Source/WebCore/editing/RenderedPosition.h:89
&gt; +    static InlineBox* uncachedInlineBox() { return reinterpret_cast&lt;InlineBox*&gt;(1); }

You might want to add a comment here about why you chose 1. (cause it&apos;s on the null page).

&gt; Source/WebCore/editing/RenderedPosition.h:91
&gt; +    static InlineBox* uncachedInlineBox() { return reinterpret_cast&lt;InlineBox*&gt;(1); }
&gt; +    mutable InlineBox* m_prevLeafChild;
&gt; +    mutable InlineBox* m_nextLeafChild;

I almost wonder if these shouldn&apos;t be their own separate struct.  Some sort of SiblingCache.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470570</commentid>
    <comment_count>29</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-20 20:01:47 -0700</bug_when>
    <thetext>Thanks for the review.

(In reply to comment #28)
&gt; (From update of attachment 107118 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=107118&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/editing/FrameSelection.cpp:170
&gt; &gt; +static void adjustEndpointsAtBidiBoundary(VisiblePosition&amp; base, VisiblePosition&amp; extent)
&gt; &gt; +{
&gt; &gt; +    RenderedPosition basePosition(base);
&gt; &gt; +    RenderedPosition extentPosition(extent);
&gt; 
&gt; I still would flip this argument naming.  Argument as visibleBase, visibleExtent and locals as base, extent.

Done.

&gt; &gt; Source/WebCore/editing/RenderedPosition.cpp:112
&gt; &gt; +InlineBox* RenderedPosition::prevLeafChild() const
&gt; &gt; +{
&gt; &gt; +    if (m_prevLeafChild == uncachedInlineBox())
&gt; &gt; +        m_prevLeafChild = m_inlineBox-&gt;prevLeafChild();
&gt; &gt; +    return m_prevLeafChild;
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +InlineBox* RenderedPosition::nextLeafChild() const
&gt; &gt; +{
&gt; &gt; +    if (m_nextLeafChild == uncachedInlineBox())
&gt; &gt; +        m_nextLeafChild = m_inlineBox-&gt;nextLeafChild();
&gt; &gt; +    return m_nextLeafChild;
&gt; &gt; +}
&gt; 
&gt; Why do we need these caches?  Did this show up on a benchmark?  If they didn&apos;t, I&apos;d rather not take the security risk associated with weak pointers.

Because I use nextLeafChild and prevLeafChild heavily and they&apos;re tree traversal (could be O(the number of boxes)).  We could get rid of it for now if you&apos;d like.

&gt; &gt; Source/WebCore/editing/RenderedPosition.cpp:118
&gt; &gt; +    return (m_renderer == other.m_renderer &amp;&amp; m_inlineBox == other.m_inlineBox &amp;&amp; m_offset == other.m_offset)
&gt; &gt; +        || (atLeftmostOffsetInBox() &amp;&amp; other.atRightmostOffsetInBox() &amp;&amp; prevLeafChild() == other.m_inlineBox)
&gt; &gt; +        || (atRightmostOffsetInBox() &amp;&amp; other.atLeftmostOffsetInBox() &amp;&amp; nextLeafChild() == other.m_inlineBox);
&gt; 
&gt; This might be more clear written out using locals?  I&apos;m not sure.  as-is this is unreadable to my eyes.
&gt; 
&gt; Also, is this some sort of equivalence? WHy the ||?  Should this be a separately named equivalence function? (like how Darin long ago suggested for comparing Position objects)?  == seems wrongly overloaded for this use.

Yes. I&apos;m considering two RenderedPositions in two adjacent boxes to be equal.

&gt; &gt; Source/WebCore/editing/RenderedPosition.cpp:147
&gt; &gt; +    ASSERT_NOT_REACHED();
&gt; &gt; +    return RenderedPosition();
&gt; 
&gt; I wonder if you can just remove this and the compiler will do the right thing?

No, gcc will spit a compiler warning/error.

&gt; &gt; Source/WebCore/editing/RenderedPosition.h:89
&gt; &gt; +    static InlineBox* uncachedInlineBox() { return reinterpret_cast&lt;InlineBox*&gt;(1); }
&gt; 
&gt; You might want to add a comment here about why you chose 1. (cause it&apos;s on the null page).

Done.

&gt; &gt; Source/WebCore/editing/RenderedPosition.h:91
&gt; &gt; +    static InlineBox* uncachedInlineBox() { return reinterpret_cast&lt;InlineBox*&gt;(1); }
&gt; &gt; +    mutable InlineBox* m_prevLeafChild;
&gt; &gt; +    mutable InlineBox* m_nextLeafChild;
&gt; 
&gt; I almost wonder if these shouldn&apos;t be their own separate struct.  Some sort of SiblingCache.

Maybe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470578</commentid>
    <comment_count>30</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-20 20:41:27 -0700</bug_when>
    <thetext>I&apos;m strongly against the caches unless we know we need them.  They just add an opportunity for us to have stale pointers around.

We could also have caches which only exist long enough for your algorithm to run.  Unclear what exactly that would mean.  But that would minimize risks of the tree being mutated in a way which could cause use-after-free or other such badness.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470581</commentid>
    <comment_count>31</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-20 20:50:26 -0700</bug_when>
    <thetext>(In reply to comment #30)
&gt; I&apos;m strongly against the caches unless we know we need them.  They just add an opportunity for us to have stale pointers around.
&gt;
&gt; We could also have caches which only exist long enough for your algorithm to run.  Unclear what exactly that would mean.  But that would minimize risks of the tree being mutated in a way which could cause use-after-free or other such badness.

The whole point of RenderedPosition is for it to exist between layouts / style recalc to speed up things for editing/hit testing code.  It&apos;s not meant to (and will not) survive DOM mutations or anything that trigger style recalc.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470588</commentid>
    <comment_count>32</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-20 21:27:36 -0700</bug_when>
    <thetext>If these are meant to be effemeral objects and never stored by anything (like AX), then it&apos;s more OK of course.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470590</commentid>
    <comment_count>33</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-20 21:30:58 -0700</bug_when>
    <thetext>(In reply to comment #32)
&gt; If these are meant to be effemeral objects and never stored by anything (like AX), then it&apos;s more OK of course.

Yup. RenderedPosition is meant to be used while iterating over paragraphs, etc... without modifying DOM. We&apos;re expecting to implement startOfWord, startOfLine, etc... in terms of RenderedPosition and deploy them heavily in accessibility code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470616</commentid>
    <comment_count>34</comment_count>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2011-09-20 23:34:52 -0700</bug_when>
    <thetext>(In reply to comment #31)
&gt; The whole point of RenderedPosition is for it to exist between layouts / style recalc to speed up things for editing/hit testing code.  It&apos;s not meant to (and will not) survive DOM mutations or anything that trigger style recalc.

Is this documented anywhere? If not could you add a code comment to this effect?
One of the things that makes it hard to hack on WebKit is what assumptions you can make about an object&apos;s lifetime esp. in relation to other objects.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>470617</commentid>
    <comment_count>35</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-20 23:37:35 -0700</bug_when>
    <thetext>(In reply to comment #34)
&gt; Is this documented anywhere? If not could you add a code comment to this effect?
&gt; One of the things that makes it hard to hack on WebKit is what assumptions you can make about an object&apos;s lifetime esp. in relation to other objects.

I have some out-dated document at https://docs.google.com/document/d/1vzzi_wQHO0GtLnu-1IYutUKbcpAYlHqZwQlwbfLuowM/edit?authkey=CLOa9cgN&amp;hl=en_US&amp;authkey=CLOa9cgN</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471106</commentid>
    <comment_count>36</comment_count>
      <attachid>108221</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-21 13:22:41 -0700</bug_when>
    <thetext>Created attachment 108221
fixes the bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471271</commentid>
    <comment_count>37</comment_count>
      <attachid>108221</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-09-21 16:52:18 -0700</bug_when>
    <thetext>Comment on attachment 108221
fixes the bug

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

This in general seems fine.  the == operator is dangerous, I think.  I&apos;m convinced that the caching approach is a good one, but you really need to add some sort of WARNING at the top of RenderPosition explaining that it is not safe across layouts (or render tree modifications in general).

&gt; Source/WebCore/editing/RenderedPosition.cpp:118
&gt; +    return (m_renderer == other.m_renderer &amp;&amp; m_inlineBox == other.m_inlineBox &amp;&amp; m_offset == other.m_offset)
&gt; +        || (atLeftmostOffsetInBox() &amp;&amp; other.atRightmostOffsetInBox() &amp;&amp; prevLeafChild() == other.m_inlineBox)
&gt; +        || (atRightmostOffsetInBox() &amp;&amp; other.atLeftmostOffsetInBox() &amp;&amp; nextLeafChild() == other.m_inlineBox);

I still think this should be an explicit isEquivalent call, or something other than ==.  Other parts of code (HashTable for example) would expect == to not be this loose.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471286</commentid>
    <comment_count>38</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-21 17:15:44 -0700</bug_when>
    <thetext>Enrica &amp; Dan,

Please let me know by tomorrow morning if you have any other concerns.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>471332</commentid>
    <comment_count>39</comment_count>
      <attachid>108221</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-09-21 20:46:14 -0700</bug_when>
    <thetext>Comment on attachment 108221
fixes the bug

Attachment 108221 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/9796048

New failing tests:
editing/selection/select-bidi-run.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>473232</commentid>
    <comment_count>40</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-09-26 11:29:28 -0700</bug_when>
    <thetext>Committed r95964: &lt;http://trac.webkit.org/changeset/95964&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="0"
              isprivate="0"
          >
            <attachid>87323</attachid>
            <date>2011-03-29 07:35:19 -0700</date>
            <delta_ts>2011-03-29 07:38:21 -0700</delta_ts>
            <desc>Testcase</desc>
            <filename>select_testcase.html</filename>
            <type>text/html</type>
            <size>368</size>
            <attacher name="Jeremy Moskovich">playmobil</attacher>
            
              <data encoding="base64">PCFkb2N0eXBlIGh0bWw+CjxodG1sPgo8aGVhZD4KPHN0eWxlPgojYm9sZHNlbGVjdCBvcHRpb24g
ewogICAgZm9udC13ZWlnaHQ6Ym9sZGVyOwogICAgZm9udC1mYW1pbHk6ICJMdWNpZGEgR3JhbmRl
IiwgTHVjaWRhLCBWZXJkYW5hLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6
IDIwcHg7Cn0KPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KPHNlbGVjdCBpZD1ib2xkc2VsZWN0Pgo8
b3B0aW9uPk9wZW4gTWVudSAtIGl0ZW1zIGFyZSBpbiAyMHB4IEx1Y2lkYTwvb3B0aW9uPgo8b3B0
aW9uPkZvbzwvb3B0aW9uPgo8b3B0aW9uPkJhcjwvb3B0aW9uPgo8b3B0aW9uPkJhejwvb3B0aW9u
Pgo8c2VsZWN0Pgo8L2JvZHk+CjwvaHRtbD4=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>87324</attachid>
            <date>2011-03-29 07:36:17 -0700</date>
            <delta_ts>2011-03-29 07:36:17 -0700</delta_ts>
            <desc>Screenshot - trying to select the first letter.</desc>
            <filename>Screen shot 2011-03-29 at 4.35.27 PM.png</filename>
            <type>image/png</type>
            <size>14613</size>
            <attacher name="Jeremy Moskovich">playmobil</attacher>
            
              <data encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAYYAAACFCAIAAADQAcioAAAKgWlDQ1BJQ0MgUHJvZmlsZQAAeAHV
lmdUFMkWx6u7JwfSDEhmyDmnASTHAZQcRWWYIcM4DkHErIgrsAZURFBRZMmCiSCLihgwsAgqQVEX
ZBFQ1sWACZXXAw/W887bb+/Lu32q+tf3/ut2dVX1ORcASiebz0+CxQBI5qUK/N2dGKFh4Qz8IECA
HCADPJBgc1L4jr6+3uAf7UMfgITBB/rCXP8o++8BcW50CgcAyBcNR3FTOMkoX0AbgcMXpAIAt6L+
7nWpfJSRPJTpAnSCKJ8Qcuw8o3pAj5rnW3OaQH9nVPMEAAKFzRbEAkAeR/2MdE4smodCQNmIx43n
ocxE2Y4Tx+ainIGyXnLyGiGXoawV9UOe2B+YzY5azMlmxy7y/LegI9EXu8Sn8JPY6+ce/pddclIa
ul5zRkN7Ci9puXBv6Gh7z4ta7rPAXLaL1wJH84ICFpifNLeXc/oYgZv/oj/V6Qf2DVzwZ8Y5L1/g
6BTXxTwJbE/hns3lEaT5By1wSnqA6wJnxgWGLHBcNGtxntxol0VNTLwba0ETn8pafG/iGq/F+QAX
4Aq80YsBgoAJMAPGwCg1OiMVHQec1/DXC+Jj41IZjujpi9ZjsHgcAz2GiZGxsTD8f2PC/25+su8G
5v4nSIrwt6/wFACu6LmHhMf83zqmHQC16FmVxP/tU38PgIgjAK3XOGmC9Pl8GOENC0hAFN0tGaAI
VIEW0EfX0QLYAAd0ZT2BDwgEYWAV4IA4kAwEYB3YCLaBbJAL9oFDoAiUgFOgEpwG50ATaAVXwU1w
F3SDXjAIhsAoeAWmwAcwA0EQHqJCNEgGUoLUIV3IBGJCdpAr5A35Q2FQJBQL8aA0aCO0A8qF8qEi
6CRUBZ2FLkJXodtQD/QIGoYmoLfQFxiBKTAdVoA1YEOYCTvCXnAgvBKOhdfCmXAWvAcuhEvhWrgR
vgrfhXvhIfgVPI0AhIxIIcqIPsJEnBEfJByJQQTIZiQHKUBKkTqkBelAHiBDyCTyGYPD0DAMjD7G
BuOBCcJwMGsxmzF5mCJMJaYRcx3zADOMmcJ8x1Kx8lhdrDWWhQ3FxmLXYbOxBdhybAP2BrYXO4r9
gMPhpHCaOEucBy4Ml4DbgMvDHcPV49pwPbgR3DQej5fB6+Jt8T54Nj4Vn40/gq/FX8Hfx4/iPxHI
BCWCCcGNEE7gEbYTCgjVhMuE+4QxwgxRjKhOtCb6ELnE9cS9xDJiC/EecZQ4QxInaZJsSYGkBNI2
UiGpjnSD9IT0jkwmq5CtyH7kePJWciH5DPkWeZj8mSJB0aE4UyIoaZQ9lApKG+UR5R2VStWgOlDD
qanUPdQq6jXqM+onEZqIgQhLhCuyRaRYpFHkvshrUaKouqij6CrRTNEC0fOi90QnxYhiGmLOYmyx
zWLFYhfF+sWmxWnixuI+4snieeLV4rfFxyXwEhoSrhJciSyJUxLXJEZoCE2V5kzj0HbQymg3aKN0
HF2TzqIn0HPpp+ld9ClJCUkzyWDJDMliyUuSQ1KIlIYUSypJaq/UOak+qS9LFJY4LolesntJ3ZL7
Sz5Ky0k7SEdL50jXS/dKf5FhyLjKJMrsl2mSeSqLkdWR9ZNdJ3tc9obspBxdzkaOI5cjd07usTws
ryPvL79B/pR8p/y0gqKCuwJf4YjCNYVJRSlFB8UExYOKlxUnlGhKdkrxSgeVrii9ZEgyHBlJjELG
dcaUsryyh3Ka8knlLuUZFU2VIJXtKvUqT1VJqkzVGNWDqu2qU2pKasvUNqrVqD1WJ6oz1ePUD6t3
qH/U0NQI0dil0aQxrimtydLM1KzRfKJF1bLXWqtVqvVQG6fN1E7UPqbdrQPrmOvE6RTr3NOFdS10
43WP6fboYfWs9Hh6pXr9+hR9R/10/Rr9YQMpA2+D7QZNBq8N1QzDDfcbdhh+NzI3SjIqMxo0ljD2
NN5u3GL81kTHhGNSbPLQlGrqZrrFtNn0jZmuWbTZcbMBc5r5MvNd5u3m3ywsLQQWdRYTlmqWkZZH
LfuZdKYvM495ywpr5WS1xarV6rO1hXWq9Tnrv2z0bRJtqm3Gl2oujV5atnTEVsWWbXvSdsiOYRdp
d8JuyF7Znm1fav/cQdWB61DuMOao7ZjgWOv42snISeDU4PTR2dp5k3ObC+Li7pLj0uUq4RrkWuT6
zE3FLdatxm3K3dx9g3ubB9bDy2O/Rz9LgcVhVbGmPC09N3le96J4BXgVeT331vEWeLcsg5d5Ljuw
7Mly9eW85U0+wIflc8Dnqa+m71rfX/1wfr5+xX4v/I39N/p3BNACVgdUB3wIdArcGzgYpBWUFtQe
LBocEVwV/DHEJSQ/ZCjUMHRT6N0w2bD4sOZwfHhweHn49ArXFYdWjEaYR2RH9K3UXJmx8vYq2VVJ
qy6tFl3NXn0+EhsZElkd+ZXtwy5lT0exoo5GTXGcOYc5r7gO3IPciWjb6PzosRjbmPyY8Vjb2AOx
E3H2cQVxk/HO8UXxbxI8EkoSPib6JFYkziaFJNUnE5Ijky/yJHiJvOtrFNdkrOnh6/Kz+UNrrdce
Wjsl8BKUp0ApK1OaU+logdOZppW2M2043S69OP3TuuB15zPEM3gZnet11u9eP5bplvnLBswGzob2
jcobt20c3uS46eRmaHPU5vYtqluytoxudd9auY20LXHbb9uNtudvf78jZEdLlkLW1qyRne47a7JF
sgXZ/btsdpX8hPkp/qeu3aa7j+z+nsPNuZNrlFuQ+zWPk3fnZ+OfC3+e3ROzp2uvxd7j+3D7ePv6
9tvvr8wXz8/MHzmw7EDjQcbBnIPvD60+dLvArKDkMOlw2uGhQu/C5iNqR/Yd+VoUV9Rb7FRcf1T+
6O6jH49xj90/7nC8rkShJLfky4n4EwMn3U82lmqUFpzCnUo/9aIsuKzjF+YvVeWy5bnl3yp4FUOV
/pXXqyyrqqrlq/fWwDVpNRO1EbXdp11ON9fp152sl6rPPQPOpJ15eTbybN85r3Pt55nn6y6oXzja
QGvIaYQa1zdONcU1DTWHNfdc9LzY3mLT0vCrwa8VrcqtxZckL+29TLqcdXn2SuaV6TZ+2+TV2Ksj
7avbB6+FXnt43e961w2vG7duut281uHYceWW7a3W29a3L95h3mm6a3G3sdO8s+E3898auiy6Gu9Z
3mvutupu6Vnac/m+/f2rD1we3HzIeni3d3lvT19Q30B/RP/QAHdg/FHSozeP0x/PDG59gn2S81Ts
acEz+Welv2v/Xj9kMXRp2GW483nA88ERzsirP1L++Dqa9YL6omBMaaxq3GS8dcJtovvlipejr/iv
Ziaz/xT/8+hrrdcX/nL4q3MqdGr0jeDN7Nu8dzLvKt6bvW+f9p1+9iH5w8zHnE8ynyo/Mz93fAn5
Mjaz7iv+a+E37W8t372+P5lNnp3lswXsuVoAQXs4JgaAtxUAUMMAoHUDQGqbr4vnFNB8LY+ysKYX
NqH9B8/XznMRCwDqUPBxAMCsDYCzWwHQQO8iAABfBwACHQBsarrYUK/QUmJMTeYAIjehpUnB7Ow7
tE7EawPwrX92dqZpdvZbOVq/Pwag7cN8PS5Ui9UCMCVpGhLm3bG5ZGBu/A/dvwAt2utCSD6PxAAA
AAlwSFlzAAALEwAACxMBAJqcGAAAIABJREFUeAHtXQ9YVMe1nzSLLMZFQUEFDSBCgIZrAzFLjJjs
mmehNK5NIGlkzSdJAza1iC9fpJhKnlilaFPA2hTI12AqkD/SlrX1YRoFg0ahPlAWA0SlsOoSBWFl
17ArbD7fXWDZO3Pv3r37DxYZPj93zpkzZ878ZubcmXPn3vvA9u3bAf7DCGAEMAKugcAD9+7dcw1L
sBUYAYwARgB8D2OAEcAIYARcBwHsklynL7AlGAGMAF4l4TGAEcAIuBICeJXkSr2BbcEITHsEsEua
9kMAA4ARcCUEsEtypd7AtmAEpj0C2CVN+yGAAcAIuBICPFcyBtuCEZg4BI624hN5VqCdEPGAFdJ2
iOJVkh3g4aIYAYyAoxHALsnRiGJ9GAGMgB0IYJdkB3i4KEYAI+BoBLBLcjSiWB9GACNgBwLYJdkB
Hi6KEcAIOBoB7JIcjSjWhxHACNiBAHZJdoCHi2IEMAKORgC7JEcjivVhBDACdiCAXZId4OGiGAGM
gKMR4HR6W9XdcVML3Kyv2zsg2ItTDTTVmoYNnjFlBAHk8tRSefHGSJoEJ4aut+Pc2VMna882Ntd3
9hmKyOVyQiQRi8Q/TEh4NirYNus41e1kIZWi5cSx6s9Pn6mXy+RyQBAE2TQACJE0Jm51QvwaUaSf
wBYTdL1NJz8/+ll1bY281qDWoGNuUIxI/PSaNc9Eh/nZiJhz1Pa2Nxw9IjtxrL6stpZsu8HauXOJ
ZTGrRfGi2OUBXnxbEMBlmBHQ1+z/xf5zg2OjSqMJffXdHWuDmWXt4HJ50a2meJnnJnK0W/+XV9+/
TehlfTldZZpHUslYOUlhY1V6lLVKdN0N+3dmZZaQI9X8HyEtL8lbL/QzL+GKOar2mn2/2pors9Al
hDSv5Dc/FwZwd0yaUxUFm5Oz2fQaEPvNemGANbg4Ra1GcSp3y6pcGZshkqzSXVulkT7MXhQ/UMKG
HS0vIeJOsdhzE2U+iQoba6yfmDTFKIPDxk2vbGIbpKhGKs23YWUFgOJIzrg/omrjnm4/ssvDP8aC
PyLVycuSY/zF2ytV3FVPsmRv5a513uGrLfqjkcZlxgR6bj3YoONgs763Yesyz1Xs/mhEaXJM4Ib9
p/QcdJIizlGrbzi41TPQgj8ia5flphC+biQCHK3l1qbpK+XuCbUdpqAsewjLLknfc6nenhqsLKtp
qQiU5FpZCBJvOpgWLsmGWKxEbW6Sd1oll3nLqmYCMhV7xb5J2awLA5oVBSkxHmkVGhofYqgaUnxj
CjhfeMq2rErc3wBpYCScolZTuX1NTEoBY4WMTBKBNbuOYa/ECI4LMi27JM21ds5jFW2gbhjlsNOq
loqVRDK7DHtuR+XW6BTjls8kKsoqLD9R39jYWC8rzROZ+MZUSVLWEYWRcM1f/bHtazMpy2ajlWTT
Sk/UGdpWd0JWmJVq5FN+S5I3FDdRaCSpOZgeU4bwAJDmFI0iVl1eKCVjNPCfbEvM3lO9MA+hnKL2
1F5JUi4DCpKMvMPVdWT/npCVZ9HMrc2Of6uyA7EPk66JgOVYUkvxOmKT6coskmatWz5Hx2FRcfcu
f81rbwg5x0PJ3Rbj6oZ7LEmvOOIWKEGAzig6kZ0mhgNaqmN70+MzkWkobVQfiuIeeEGqcTKpazno
QaQglRia9poYvYGg6TiY/XpKATJviWplYxxTX6hO7fVelQlrTq1TFsb6UWPDulPFW1ZtQny9VK49
FEmVomhxhlpd+0GPcBQEIMqqL81CQma9TZWvRyeZRq3BMBQBHEuidJflJBlLOrjOM4WCKfeJaVk7
RYI58kcR0LWcplgBwEvbstPMDUNKMSuTqspdKdZuSWhV6Kr2oP6osE6ZHkuPXnvFbTvUtmReeBJ1
/V9W/Nn/FCc6/g4CzU4bGKoPtyBTkShtPL4xyodBlyB4Y35N9PKtRDK1dfLMA3Vxe8Q0+d73NyP+
KKtNuycMdTT82LTitrlzw5Ooe+qyvR9vO8R8M9QZajUf/woBAYDU0p7ijXQUfKISq9TyrSsJym5U
Hp/5qfbQerRlNEQwY3IRsLhxu3kR2rZJIhY5uE9V7cfSlnnb7Y8A6P7XLvgqLilqZPJHY4CHJWYX
iiDwS2ScIsFQmQkh9N2n3oMXPdLST5j9kdGeyPW55VIjMfIrz/2knRZQ0TR9lAn1r6haSfdHY3rC
EvfUF0JKy1I+UkCVjBHOUKvr+Af1Em2oSVTI6I/GjBBE5h8/AfVwWfLHLRaiamNl8c/kIWDJJamu
1lOHLBEdDG+B7LFcr+qoMNw/ii+hVmGrxqZ/fACrySlMi2JV5pW4LQsSKPuii8OGFCoyIURPezPc
tNS3pWGWauavz6uGQ0Al9VeQCan7rHgLVQ+R9es4+pqSIiF84204WJV7jGGSO0Xt5ePVFEMMyfL3
U+nrI0jGR5ybBy2cUz6opbllqAQmJh0BCy5Jc72VenkmxMt8HWSy4sguN++lyQz3j0Q5WdAw4lZh
99H3oA1mzolNAZZK+gnjoUlLzLVUYnLyb1xspFYsKnw1zOKGmyzgG4Ls09SD8HzUtcrgdeVriY9R
K2JI88JeyoIw+6T6AirmFLWaxmo49ictfz7Y8oJdmLIJMregVgFjgBqPae4IuNt0xseSfgtDW9nY
RNVALAu1UIAqzZru+waaZmOyREb98fxo9cFs9jNwNM16xRnohB+R85rYwhXUoMPryeNKJfDw4Ht4
ePD4PEe1jWaefYw756ogb+vJ8SA9z385uc2CJzLVEl2XHM6UiiIsr4Ej45NBrmnRVlt+snsbFK5z
ilpd1wkIA5C3Od6yQyJb6xP9mghsMV1Xa84rdcEBnIpSsSKPWN3p7xm8o9bcvnW7T3VnoG/gTu+3
mtt31Nq7usG7g9+OCQ/e0QLgMXOWu7fPXJ+FPvOX+CwO8l0QNHeu14wHYX106m73V2dOdrR/dbXr
6l1D7h3t4Kz5wUTo46siHxN6P0QvMMYZuFRz4bKKN+Yf7oKZYctXRs2giQ+0fnah886Y2PBd3uKn
hATDVZujGKleVv1R5cJOMDREq4rGGBqaL4yP5bbDYp+F+kvN9VT1Kwl/KmlP2g2gN7fI+0c5aWKS
q7kx0iPWaFd8+TlVXPTaGtb9x7gsz8ePm+B4iUlI8J/NPSG7duOb7uuKG9+01jfHrwziZIVeeRF2
OUiprqazEEeyOpDDVPV59EkyQGOa4/LGaxpAfXbFKWqHh5E9J+dTuHxPaMzK265qgPUuSXvpzz/9
yc8huKwjiJgXE2LjfvqkMJLuLEY1aTvKM9FbDQDUlIP3DfmSrOoXpT+czVTp9RP/ve+A6SIBQgs+
ZnJJqotF+3ZS/Dop9vf0WTSFt5r27qMeswjN+/jvb9HFDOVkuchNTZoyE4PIq2/eJjTR5lPsLkkF
BzEkEUHjfkSvUak06sFh8vJhuCx4+/oI2HWZtwGIMooKt79m7uA/S0Fjlv7yRch1xglDjVn3wS8v
WCgO5tSbcGM13RAocCZJDVy/SeVJ4qPHe5fKR9NeP3hJAmpNY1vWcFkljDItr5yi1m0m4oZDF5tq
RC2EaF0z7Jcbz18DsRxW0JAS4BGwHHLEcC4HSl7/KfkvFzyx88CBHYFMS54Zs5aw6JHlxssa/vTx
H9Lo3uGhuZHkgwimsnPcmRZkupudnSYZMvWDeUzOUXOpwXS5IaWINdH0GiE93IggztcQVjeiuXaG
ap5I/KgX6G2p+eijT/6cSw9JizIKf5b28vNhPhwutQAM31WSbZFkFGZlbBAGcBxe5lqvVbRSugSI
Hl9CUajXdMgvNJw736G4QS6qgVYLvIOilgtXPBXtZ7sXNWeJC/EbDr1L7T0SbGEIBRaguXBGRjVX
vDyQSrKk3ZE88rpk+nOS2sFbpirIlOgh1pFLkeWHkZFJSkM7O6/rQRTX0uOK9MAweOz/+/c7m5+4
9O7ZQ494oroenB9qwevV/Lz46NNvJoShJTnRw/3XqXMExIQzr9eQ+NDMuXPG1Vu9eRkvaU2CrWt0
SjmlK8nF+p9/taGqpAwe56bKagu2kP9AauGJ36YjRxNNQuOpiA2lXS/PD+Dmv8ZLMSd0XU2QoSE+
o5d7jeJIacGOLZSzKXD51LzD76QnQkcCYYEpTKnIp1IhUIBkXQS0CqKHeekcTgDUNHSmmx6upiuh
c6xXOwzgjVvt+U5VrJcXF0WIA5U3f0Oq4lSSqv2hxeGhoP4SlYWmA58QeQLPmSOLihvXZV1mhcvf
fPLh9+W7FyKLGf1g34jKQINr6uu6BHmQ0cpqt+1+4dlDgUiTUEOYacTXgCHoSmIsoxm4bkyO/g6Z
SJuqNRXnmGJzSTcvIaDKS8osqy3Zsrrkz1mNJ/dQ1vIMpfheAQEMbNtYw/AOJCqED1RNFc9EJzP0
KqWGksykkkzJYXlpYqTVQ5SixgWTuspfrYIdEshJT4A8kq6zGpHg2g5BdLwUyMwMBSep9ZiNbNwG
bpOrFg69pruMxMXJVrINerMgeEW/KQv08J3vs2DmLM9Zsz0ul8RkUiM44j/t+0OaB6X40LeqPuVX
X53+W9W7BV0U/kgy9w8l8Xt+vhJiPxS9/ezAjIcEo4Hw777tvfLlwT9szYTLljd+vT+QgBr+HbgD
6WEmdINcpL690QZPeoIYB16wsVL7gpbRkaFVerj1//5HgUzPP6GSdJrtEMDVdigWMfrqHLoKBo48
N9p7XU23jZdHBoXsLAQmgaCr6aC3JX9kVClLIrx3HbuvHoBqKn4dfZWCqHAT7RYk5KGMcNj/6xS1
PP+nUiHTsreWsT9iNyrdfbLSjO+EtHEgeIErn4uOFi56OMDbm7x9xh+J4FDK3QHfUSgyOeMhr4Wh
K5999fcH5H07NpMLH+hPfqC4C90I8WZ5jvkjUvTBh3weWfPW7r/kQcUAaJN3IhyBXwTCYSC/vSb/
N8QOJxZD9CjBc6N6VQOP6r95fAG3Px7f25e2M2WojonF4pI0rVAkiXz52ZgCQpJRVC6rb5S3tcnJ
xxzzMhiPEclW++cqmKp0OE/TeQG63pclh0en0GohX9wmEZlxq9nxS/c3cBnhNK2ux+io3B69CZ2G
pYUpliK6kseCoGuvg1rmKLX8x56GfZI8M/9YtyUjFQficy3JOCwf2YeZ9D7oJfx55S+QQ2KAXO+o
TDJmUrOjN6aEQnmDQ4MQDcAc34chDmM4mgcQX+PGY4j5DilbkLjMzAk/GmPeJem64IfbRlotyam7
0t9clZ+2fq0wKjIsLFIoXrstv0rbI2d4Whxk//pgOwSWkwjqLhk6GGeoj7yd19jVP3yvuaaqqqa5
WdvfVV2UQTdkS8yv213y6DbdVBaOombXUugxNIOsKK9+YyR97UJFzSDGOWBsEDb/5yS1IDheiqw0
cuPjK9vhEBNklu7I9pSJc0hQ1XTCa02WLBBm19achxmMlNfSp6F2y081ITswZHUGaq7eRlmG++K0
8DzDJuY7PYJncpA/feQw2ukwplmXpFO2IJdaIuOwumoH43knvk9k+qHGuiL4OkYe00vZ3TIR85wS
dyOXcqalEFFU11WTnxYVYHpanoxhxaXla7tOSFEMS3Z/3ILyphTdXbM3cDXtRVHS0r8yngfhzVwM
uW+BG+pMbGq8k9SStnjF/joHmpzkne+kcM9dR1oY5pamff8GDwn1fI1NrXFgoQf9nkmAF0pdzRcR
58JUHW82cnRuFuM9fmrRVjVt0mmV56AoDACzZyHLphENemQzeYcBW2pVnNMrhEEcZc26JJ53VPXh
8qLCvKxUqYgcu5LC4/mJrA6TF5v2R1kGNMxJp/TBvxQcTbFZzG3mLKhW4w6zXH46LZY5hs4PEB/q
r0c2nGUpH3Q4qgdsboytBRXHdvmvzkRLS4p6Dm1k3o9pB6CDE0AzzClwidaA0k5SO1KNeHMu0mUk
O1tCuInTDh451aHo7u3t7mhvqty//QHP8C3IFRU1dOJpQWgsYr5F58JkJBc3Ris3pFHDvORF8xk2
bjcvIvu2CE8GKVgTI6VXnoWCKYDzsSQoeAXp5nmFxSWGGVmHjAn2X97a7flEwWpj0MkgXHC0ed/a
AGqMjF2FDbnDA33UGkc1kC9zWc+wW6Go9xIWyrJk0BssC4635QSzl6IoGE+SHx1ovTbgZnmZMQzc
FoTb/Eb98fpoiZYK5FUkIxKSQmVVmtkQEnp8Xn2bvLSyXnNo1TIxnKR2tCov4Xt1eTL07U7k8ZSS
lNoSJmsMPIlUIiuD54c5USfzH5wBh3lgypmVd3z6Cu1yxVgfYuETD88xGyFjLD/G1F2pp/UHVx9g
dpXEViFLno/4ALK6LqlXTsLSQ5qdEsVi5mhWwI9eQ6JKp890WSxFF2j96PXo6Gjy+xiW/qKJlyqR
zTpdm5UczbFd6+BXI40okBb1VKX7seqCLam9eE3FKs4100lqR6v3i92mrCviaophcV9f+vY6WP7u
JIzHEQvmR6yELKk53Y3sk6BsrsSDfPRKoqfGkr7rPr7zBdQli1f7UaIdxpr0N7+GYxeB82zzSP/M
TzHqHP3NSiBQI2EBE+VolwSAX/gyk3pDqnXk0DTMcyjlNnsuqi8jiRMCvOANhdBaWq7otWG8urn7
owaYo4PcuV4szGmg8jXte9d5xtPfppBa3n/I/PpoTIMb1zFCrXEkPTgAux1IwElqTXX4xaZplXUZ
IhPHTIrIk8mr0oUew9C8J2JCbW64mYpsZt/R2zDaaLXNmB8JgyH7zw1DB2n7Oxqrdm0mFhV8iu4i
XnxJxBRJ0mqQE97BQTNo1VlkdNfsQ86gSIpe5v55Mse7JP9HEJfE8bl1iy01K8D3f0QKZ0qCFnGd
+fC1Ql5/kWW2wZXYRKltKsVUSNNxZJ1neCZ6+QOinGpt8XovpiIQjx+4GvLGUCYrobpwjFbreAEn
qR3XP5Lg+8Xm12jl1aXoTbhRMUKSV35CqW3etjaSZPT39lBLBy3w5To2qMWck3aQJWgU8Gjuuu0/
+V5SbMg7b7/TRbc8NO/HK5lirN8pO2sg6eCQBRDNgSBfNh2P3mORZK03dATHPwdhQqltGEAXJUqO
85JolwT5zeZY2eKIFdATUJ62rWKs8GOOuC6C3oZi35hN9DZmlDfmr7e8Yx0tOANdLXAcDDzk4zkr
hNChOyeppTWWHxm38VDcxvd6u5U3bgwMAjKU5+Y2c+4Cf7+x54nGSvRdbqSWjX7U6mlGLe6KafeQ
CDGopXiTrn8jUWqq1RmFH77lTWWMp3UDN8fTI4k5XugQgfNplK79rUAJsiTLOPyu0Bo1HEchrW7z
DDcALzzIJ2zNCzsmhx+yUgKoEczO7gGOmge/vQ1Jqm0JNMxcGC2SAH+BJeA1Gk3EXPsRVxzbGxhP
j1YSpfXVG634TKYgEkat5vTl9Cgu7kzXo6ZiRoQtoK7JnKSWWiOUFvj4hfmwBM1UZ+AHZxb7Mc9H
SOkUIzz8IkSghsUNjbUn5vWyN3653ttMfEirvFAPNVyyxLpDSbrKLeEFkAYAMmS5Vr7P3twE0XU0
NSt6bvb39/fd6lF89U3Mtty1HF7iR9qj/LoZskq0YomlqQrJ20J4LAwijwGYvLN6wPhKLUva1IpW
qohI9Bh1elGzWNLBa3fUrGXJd2QWebM/MJ52+AhITyjfF1v5APHcgGjqClFWdU6TbvkTLfqOL+Bn
l4ig+dAocpJaG0HsPQ+/bVRKcHkplI2VTVYx3sIwMlpi1iUFPpEskrwoXPHMIl+2qdjXehpqQOiK
BUwvUYFkKISm6UMkhARA1pV9a609RQANJpN+Xeub0TEyEw0yEjLWBjPtPykyo8lb/+mEeCHO90iA
9/2nxIDywH9tdrVih5kjSZBxYHAApmdb0wlw0QmgDIch6f6IyGk7vSOMbbAxm+aL3Iiorb6sSbPo
k5RffQmpE61E5riT1AK9plvR0zdw6/Zt1c2rChD+XCKHJaHii3+YrlSk3ZKV5CPZ99/f3EeeIs/b
QO16sWBnXNQcn4Xz5vvPfohLm7tPfVhO1RD4dDTX8IehmKoiZxO1OJkub8vmHtUeL2smvM0PEsNB
/IKj5zgFQTRNuXDENfXpR7ngMW6QbYngFT+ETksCxtfU03Tr2z+ArRU9BoVFaAUmk6FqKmY4DCkt
Ujbb4o/IlvACHs+BUJMdv2DxQT/dl4ehoS9Ztxxxhk5Sq2mr8F+6lIiOWbU6PillU9KBMzrLvdEr
ew+yVrruacRayzqmgsSDfk8mw4/CxSwWRgtXBi8J5uaPwPWjOeWXoKaKYiMhmpXQK05RPvY4Ipoq
e5H27S1WHWOZZlwS8HpUBPukkl3/y+HJ/qaKfOrainy4I+GZpVzssFfGT/gGbO+mHRUqS0oV/1tc
AslIE5abPVoICU48oTr1QjR6FSJGbvazxFEsmemX8JqEKpNZ8rmFed57Mq+MWgJIJfTH0J2i1sNz
IeQ/y2SXLdgKek+VUt66TZotSpWEQdbfP4TfMz+DHueqfzfty6uWABpvfs9nv90GTwWQteIHVswF
1dX2cWWjidKta8xswRBBlDTnkkDkU/AUB3JJZhn7jSVNewX6DLo0cw3TF1ZRKxxAe8VlZEBqZJty
2L+5rGn4tQS6hALyNNMErOggKzkShvcfoaGC1PLTXG72s9ZAJMDHJ8qSc450mC/Ru//1eHgfVPpD
pvdYO0MtL+D7Ysgy8sOWLRADIVQNr8PnvImcnbE2RAoRta5KLnw2FZ6x8tz4jA41B3O/bXlfFN8F
C4r2bkDfMAcLINS182dgTpbIpiUSqcSsS/IRv5IFV0I+RLth1zFzXqm74eDK8GSkRPnbz0/YHA/4
URp0mSD31klL95/qRkwaI1VNWz1j4Os9OLzZRr/OXIXjuJoWpsDhH9fbvwfhBa8ugtZJIFeydG+N
gsl2VUXas8iLKguzJYw2OEdt8HPw95rKUqQV5t4EQPavNxQMJZdIBzbHMrXLNl732Y+gyAup5Tvb
NFkqxZthSWI03z3qpd3IBCzZ8uRPvpAz9uaYzh75X3/zxDJ4Z0NmZbwUZ91y0s0dHgiSAG9uVtOl
zLokAALeqi9ECsiy4z3FW2vaoXlOfiGyctcG/5gU6PppeCdG3XpbPSVSLyeSF7a9GvWiW1b5r9ta
3NJNdaS69priZd7R8ALJYG0it1uKnIxxpNCdv+7YRNOX+3z0sges/Ctm+Ayk1/rsIkR55urAtOIa
FSV2qFE07BJ7JyPvW5eUpkSZW3U4Ra14cx60dwPyZPJNABUNVFOBTtVwZD+9f6WlhfYskXpO7/vN
zl1f1H72dWvT1w0V76csQiIvwNemZ2hN0Ou7aov/+sH+I2Xwv0/3V8FRZ1MJWmrRut+nPIFwZfte
DvrxL//7i4amfrXO6DT1WnV3B9mKX37v1ZeT6pES5FfNP9qxyMxBAZqsGQaX1ZmZog/cu3fPTJaB
XbNLvDob3TEYMghJakLEIg9wvbG+RMYkIC3tN/cMuqE825+mpdiTME1C8gHaqvQotgKmPP2p/Ymr
kEv5aK5IkhET4aHtqy8oYTCXyOlq3hFg0uNCKd2VCo8Q5Opno3mFjf3pDE5Ef2rvmlXwjf2RCghp
RkKkt0dHY2WJDLnckPmErKuR9Xlqp6htKt6ABgcMthpMDfUG/ZdaC6jn00aaYfhPUtRflYa4z6Ot
98bzLSX0jXmPv/MXOgimckTW/+2RWhil2kvFSdCXlySF//578Ng9Xk11yuw/wi9+NGmnpp740+FS
6I261Eygbnj3yScZRrhRKDCUYHyrtzEfSPJbX1/DsERKiHhgXIaeaCneQFBfHCgqUtekwQsneiFm
joUIlHiH7LBWkkR/74xcVgJ/KwBST94GstUfQXqsJnix6ZV1gMkr1coKKB/6gRVL6467qD8i7ew6
XQ1b63CKF7tNdviblUmUUxQjdcjLUI6p6pzqI6z+iJR0itqotP2lp8tSkC03YDMVkIckPkb9kakl
nFLKS9B36BnKJKwKYeBaw3JzyIsBPIUZtXVARIs8Gi1h90fJB1pfFjH4I2Ppifhl2biNVi9I3FPT
Vl0IL5jZLJMWVqsPpdlxG4hNOYc80itVtVXncZAcEZHkyPsPWf9dL67q7Zcb5nzbxI66BIn5DdV5
cKjbrDryAwo9O+K4rCmdodZr4yF1dSESNjRrK/m90n7ykATfrACnDHXHl5fYBON2Nz/1sC1rAsrm
2IqHHIz7L2aTHvRd+WbT5YxX4GA3syyFK87aXT3gQH9EbRqlGstJiy7JoCIsLr1Zq6wugqOLNOWp
OaWNXepD6XG2dA6kDXokRWD9p8fD4rbdU3fJCrNYuoV8g7isvute1Y777eskEJIQ4e7Gsijmx207
1NN2Ige5bwMpIHJKT/QPVyVGcr897Ay1grj0YnVXXR6bqSA1p7ytR5ufZvn7XVATGYmHIje8s1P0
BP26TIheKdj99+ub10UylkOYD/KggQ3AfMoTlW6e8+j6EQUjpK/AcpzHPfjZzBMfV9elvgLfvGDS
R7y4c+ffr//zD7uX2eRVx1QiLQsRML1pgKl6Gs9CLAmV1+sUV1qbm+Rd13vIizefzwfunn4LFywJ
DQ9ZGuCSH2rUdXdcbr/89VVFt3rkcWB3z3kBD4eFR4YEwA9noi2dxrRe09vW2vJ1x9XuW2oSBp0O
+C4KDI9ctiyS6YY/Z6CcoVanUjSfb2673NUzoDOMRgA855Gmfj8iPNjiaLQmljTWyO++02m/1XxH
LgD0w4AvID8oYtk7cMbHSYLkx5eudTRdaZd3d39z966Hu7v27l3g7u41JzA4YElUYPDS2dxeus4e
S3Kg8Va6JAfWjFVhBCYVARtc0qTaO8mVT5hL4rRxm2QwcPUYAYzAtEEAu6Rp09W4oRiBqYAAdklT
oZewjRiBaYMAdknTpqtxQzECUwEB7JKmQi9hGzEC0wYB7JKmTVfjhmIEpgIC2CVNhV7CNmIEpg0C
2CVNm67GDcUITAUUB4wFAAAOLklEQVQEsEuaCr2EbcQITBsE8OntadPVuKEYgamAAF4lTYVewjZi
BKYNAtglTZuuxg3FCEwFBLBLmgq9hG3ECEwbBLBLmjZdjRuKEZgKCGCXNBV6CduIEZg2CGCXNG26
GjcUIzAVEMAuaSr0ErYRIzBtEMAuadp0NW4oRmAqIIBd0lToJWwjRmDaIIBd0rTpatxQjMBUQIDl
KzqTa76+Zv8v9p8bHPv+kkYT+uq7O9YGT65NuHYmBHBPMaGCebYi4LIuSXu5Cvqyt0icvcPWRuJy
zkQA95Qz0Z1+ul134+buCfUGTEFZmJhcBHBPTS7+91ntruuS7jOgcXMwAhgBLghgl8QFJSyDEcAI
TBAC2CVNENC4GowARoALAtglcUEJy2AEMAIThAB2SRMENK4GI4AR4IIAdklcUMIyGAGMwAQhMHVc
krvbBEGCq7ETAdxTdgI4vYtbOCqp12lU/f19fX3dyus3bnxzq2dg4PZtkr41OGjATaPRAIFg/rzF
wUGPhj0atSxyaYCPBY3jcKvaj1Q3Dc2YMcoYAt7/tU7MUlhW/VHlwk4wNDSuwGxiaGi+MD422Isq
oO9tqfq8BRiro2ZxTA+B+fGJsVSlvS01n7f0G1UOgVlhP46L4tPU9TYd+7z9zpjY0NCM4KfWCgNo
UoCjGL0gA4cjto4VM9phZ08Bi1bpu49VnbwDjCNnaNYzL8b50Yadprul9l+19We/ujY4SI5Twfyg
yKjlTz/7X8JgH6Ol+NclEbhn/k8tL7LeZFFGYXljV795rWM56sZCWLmoXk0tpC6VwPnWUERePVUX
maZVZ426MVnEwnt1OQSkhShkbLa8CG6JGbHGQhGsLY9RG9IuRpLWWNTy0VIOEnN2T9GM1zbCgIKc
uh4qDsM9jXmpMJhUZCVZJ9pshpZaD047BQGHb9xqC7YkRwd6i7dW9FLHAT3t5g7zPB24MQvi05Sh
1cGVc6JQC+f4wi5prjvtUk3q1XW2d0LqY+Z5QPQooTlXU0tlixIfp67IqFmW02hjUcvHNDhWzLJZ
DBIceopmPD8qPQtCPvtvZ/VG3S2Vu9x8ozNLIDCNmSO/stzV4d5pB1sgJiZcBgGHu6SxltUWJPuK
93bb0c67dpR1paLD33TKqfZIoiLpmztSAPXQvnOopVw5PfE9tfzlNyBACg636QyM9oo0IikbyjJD
lKQQ+5tUZjIxezIRsMMlEeQfq+m1mf5bj4wMFVYxM5nIFDUjxZk9PPETZ8w2tCF3h5mM1vTAaykw
afYyWcfKQxvIKuyQTEFkXBakqKy6VaNvPxieXAKxRwhCJGIcp1uiD9hzyaRXhDkOQcAqlySSyZVq
tVo7PDxM7iKbyb9794a1/T1d9ScO5zDu3gskOccUNhkq2FipJevi8jes7cozHzoYrV0Q9QYXVSYZ
7bCyLo/d8mGgYRcYydWp1RykNDfOQGspIBYGcSjmCiIO7iluTQp4uUhKlSzPz/7FGylUDpmW5Bzu
Ug8319Q03xvuqi9HIlAAZB84hp0Sgtnkk0zRD7NWeS4K8RMguw4e38snQCgm/yW+9U5DVnxMATy1
cjM/2Rq3zZabHDy+AK3MrGW+nmazjBk8gWDs5UtGjqXfObPZJeYGRAAgY5cBmmtwjAisEC5mKOLm
hhpHi4YxlHIRloN7ilOrwp9LIjaVjY81eRky7kCWrG3P2jCjLl6AcH2VOizNM5q6jsrdW/lWXLrt
MTujdvzrQASsWiUBwLjnMJrD9xPmn6xHr0Xy8kYLgW5j+an2O98/ADKZ0S26AcTX8N0Qp27Qoetq
KYN0AU83q64WcOFpQPH8Yt9Ah5qp2dLSRoo/MvIFUdtlGUZi5Le26qIKYmBi0hGw0iVZtNdL+F41
vM0H8s/O2rZ3s1jZRAsgDhkhgUzRM37jZ9w0ht0dXQgMDyN7QCkRiLiycY04MYqAV9yrsH8ZB0ZS
tH9j1DhFTQTEPg9v8WvPdyLIU8VxehIQcLRLAsDvmUTk6tXc1TfBLVvhlEBMxAKmu/eUprXe0lKo
kaSm6xyytZs3m0kLGn3XoP4OVXyf0Pb0VIDop8hIGwWlaNd6s3sxr0fXwT7pq3blfQLl/dIMx7sk
wA+Jh0cK44bGkQDqlWfheU8/lmRDdbreHqiUJMDb0l6KHv/R3R6AlABpmD/Dxq3rXA0sFsF4eAmW
mYKUY3tKEP1qBu1mGpH3fCTLApOHvAPzpmbkOYQpiOX9arITXNKEQ6W7Uk+NWY7Ub8l5WDZS98Un
8AkX9V2GHZcFPR17VmVaEBnNdodnkSjA1/4WcKp4QoUc3VM80U+TkQZI34hnvZciWC6GLpiypv/Y
fE4FqRqTDkHAGQNfsJxcJsngdYtDjGVWovtnPnL3NyuBgGc4WVCvKH5rT9PgzJkzSWLw1uD3/6cw
PZhhvTJWh77jn0mwn0v92RpkO+A2E61lmOq09N0Hf/F8AWKzZHUIQ6X6zubxe0cjBULm0hdciKYp
SHLrKWsa5jHPFxGXPBuCcBDSDfH+l/vI3TZDnyDFMDlRCDjDJQHaXSZOrbEtetJdsw/xHZKil4Pp
zdL2VReUUNykZPPvWFxS9+9fT4KNlrz6XBjMAXz/SCkAZSau7MJ1jdBLoOnt+PJoRWZKNuxmDHJZ
m0SoGzOwtf3ICe/vL3HlSeLcnjIAAv2xVKc4fxYSBVnLWa4zsOg4RR8s41k4MfEITFp3uKEPWAls
WBfoFUfiV8PbKyDJWh/JgCPNTZqvTn9se3wm/IyUKC9LyOBL0Mny3hbJJ321tXRXNGoQkbc5Dj43
MMrXK5spzpLkRT+6gKEJk8Sa4J6ypjrd+c+hpSyRtYoJ30kCDldrEwKT5pL4YRvv3dtok83GQrr2
twIlyPTPOPwuk+8wFuHw23EkOz4X1fpeupChKD9kpQSUUbyJvBb2ZFCZjMaT2/wgjpHQDnQak6O/
vj4M/g8WmThqgnvKiur0yi8hjwQSVoVPHC64JucgMHXD27rKLeFopCZDlpto1xdxdR2VSyW5CNTl
bblhzPsoj5Bo+JYyUtJISrLKlcP5UUgsypir6bpAcWskV/KD++pQklN6ioRJr/wKvk9JxIT7G0HF
v1MVgUlbJdkJmKbpQySERAZqruxby+w6uFam+vBNJIQEUsvb1ptxSADwgpctA8DsyogQSZNfSVq7
RhTmx7bqUTaehgwkVixhE4dkXZ9wTk8Z2q3qQG4KiEP9p+p4dv1+nDALp2gXqipyNiEYlbdlM0S1
ESFWUtcu2wQvV4Ck9Hfrw1gK+S97CgB4rZZaWP3SY75+fov9/X04PaPXfTi/jFoFkfA4621sqqzr
p53SU6PN/s/FRqj9kmXYI0GATE1iSrokveIU6jtSZS+aXctw7Bnd33YjhwlA+W9/yr5e4QWsIF8t
Sb21JgkWxomZAk9mrGiv2EktTkolx0eakZ16bOf01CgOmgs10AVEJKYf/Zh6iGGLp2QsSXW1Hem5
0q1r7Hauw+SLxKE/aflzlt2c3/rMVGopWWZqZQfnw3fdx15CX/GT9cKT988iyTk9NYK3rus05JGA
6DGmVyxQ+wanpwICU9IlXTt/BsY2S2TZd8Al6JTuMjLEUyWc7t0FP59Gnk6i/MmTlm7h9MJCTctW
/3jk3p60/BU7t58USyY/6ZSeGmmW/ubX0HYXEOEPs69oJx8NbAEXBKxySQI3pidG6dWgR47oEvZx
0AO45NNn9ilkLB31CHoymFEM8KPeLoWdEiiJ9l5X0aBglh/hKhoq13kScBSKzMh4+0W20BWLQtfM
cl5P9XS0wU0mHpnP6d6GswcnbBWmrEbAqu1O2d7c5ctnW6rDHXR+Al/ALJWwN19trwLG8nehx0MY
RcaYYRt/n/eXMvh0pSw5RpYsyShP3/DMYxG+XvwRoPUaVc/l8ycP7U8ugDcdo4oK67PDrOoQNqNc
Ms9xPXXt/+DYtmhlIMUj9TZVlh7/D59PYY3i4Q6+em9iB6dL9oMrG2XdDCjL3oL7k6k7fbb9tb7F
OwYFR1aQLBtbCZEvKpfLkV0apCnjcFu60AtiYcIsApoLZyCnLoqLoG7brp0uy8yEBMxqwhkuhoBV
GzcXs92lzPESlirrkP0b1UB2f5Qja8tPvK+2bNS2Oz5Ni23HhD1MrQXdMFLzcNq1EbhPXJLeESgj
N9ysVUm+evWQ9kppBqfz3Cbl5JcOr6h3mN4SbcqZ+BT6zJ4TLHBIT9HfCxwaOt9mYx1iks2144II
AmwuifYAJFKWM+nwr+ogCkME3MLu7Aa7IYPac6Z1u1qDdn7wxvya/it1hRnQS3kYKxal5lTLlfeq
9oiDqXsORlmnMGn9a8uTzxYsc0pPke8FHoLrJd8LDIWN3ASGd9Bw+vNn/CAop6JYyBkIPEB+/cgZ
el1Op65pg0c0JdYjaVRXRTnTFeg1vW2tjY0X5JcU32i1Hh4eWq0WeHh4LwgNfjQ8KjJiqY/AepfH
DVZNS7EnsYki6/TGUurCSYyAXQg4a1bYZdR9UZgn8IkUxpH/7ovW4EZgBCYIAbaN2wSZgKvBCGAE
MAJGBLBLMiKBfzECGAEXQAC7JBfoBGwCRgAjYEQAuyQjEvgXI4ARcAEEsEtygU7AJmAEMAJGBLBL
MiKBfzECGAEXQAC7JBfoBGwCRgAjYERg2rikYaA0tnnkVz0BD09AFU4kMXwXrq3zfm4s3FRMTXUE
ps3pbaBTtLT2AbeRz7cND4PZEZHWf4RwqvS2rrel9dpYW8mnL8DskMhJemhlqiCG7XQZBKaPS3IZ
yLEhGAGMgHkEps3GzTwEOAcjgBFwHQSwS3KdvsCWYAQwAgC7JDwIMAIYARdCALskF+oMbApGACPw
/0Yt/6+dk9/6AAAAAElFTkSuQmCC
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>87325</attachid>
            <date>2011-03-29 07:38:21 -0700</date>
            <delta_ts>2011-03-29 07:40:12 -0700</delta_ts>
            <desc>Testcase</desc>
            <filename>selection_testcase.html</filename>
            <type>text/html; charset=ISO-8859-8-I</type>
            <size>236</size>
            <attacher name="Jeremy Moskovich">playmobil</attacher>
            
              <data encoding="base64">PGh0bWw+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0i
dGV4dC9odG1sO2NoYXJzZXQ9d2luZG93cy0xMjU1IiAvPg0KPC9oZWFkPg0KPGJvZHk+DQo8ZGl2
IHN0eWxlPSd3aWR0aDo0MDhweDsnPjxIMSBzdHlsZT0iRk9OVDogNTJweCBhcmlhbCwgaGVsdmV0
aWNhOyI+IOz58PogMjAwOSAtICA1MTYg7uns6eXvIPn37OntPC9IMT48L2Rpdj4NCjwvYm9keT4N
CjwvaHRtbD4=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>99859</attachid>
            <date>2011-07-06 12:10:36 -0700</date>
            <delta_ts>2011-07-06 12:10:36 -0700</delta_ts>
            <desc>test case corresponding to comment #6</desc>
            <filename>selection.html</filename>
            <type>text/html</type>
            <size>277</size>
            <attacher name="Xiaomei Ji">xji</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFs
Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25h
bC5kdGQiPgo8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgPgo8aGVh
ZD4KICAgIDx0aXRsZT5VbnRpdGxlZCBQYWdlPC90aXRsZT4KPC9oZWFkPgo8Ym9keT4KPHA+YWJj
16nXoNeRPC9wPgo8ZGl2PmFiY9ep16DXkTwvZGl2Pgo8L2JvZHk+CjwvaHRtbD4KCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102410</attachid>
            <date>2011-07-29 16:58:50 -0700</date>
            <delta_ts>2011-07-31 00:04:16 -0700</delta_ts>
            <desc>work in progress</desc>
            <filename>wip57340</filename>
            <type>text/plain</type>
            <size>6579</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZG9tL1Bvc2l0aW9uLmNwcAkocmV2aXNpb24gOTE4OTEpCisrKyBTb3VyY2Uv
V2ViQ29yZS9kb20vUG9zaXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMTYxLDcgKzExNjEs
MTIgQEAKICAgICAgICAgICAgICAgICBpbmxpbmVCb3ggPSBib3g7CiAgICAgICAgICAgICAgICAg
cmV0dXJuOwogICAgICAgICAgICAgfQotCisvKgorICAgICAgICAgICAgYm9vbCBhdFN0YXJ0T2ZC
b3hJblRleHREaXJlY3Rpb25PZkJsb2NrID0gYm94LT5kaXJlY3Rpb24oKSA9PSBib3gtPnJvb3Qo
KS0+ZGlyZWN0aW9uKCkgPyBjYXJldE9mZnNldCA9PSBjYXJldE1pbk9mZnNldCA6IGNhcmV0T2Zm
c2V0ID09IGNhcmV0TWF4T2Zmc2V0OworICAgICAgICAgICAgYm9vbCBhdEVuZE9mQm94SW5UZXh0
RGlyZWN0aW9uT2ZCbG9jayA9IGJveC0+ZGlyZWN0aW9uKCkgPT0gYm94LT5yb290KCktPmRpcmVj
dGlvbigpID8gY2FyZXRPZmZzZXQgPT0gY2FyZXRNYXhPZmZzZXQgOiBjYXJldE9mZnNldCA9PSBj
YXJldE1pbk9mZnNldDsKKyAgICAgICAgICAgIGlmICghKChhZmZpbml0eSA9PSBVUFNUUkVBTSAm
JiBhdFN0YXJ0T2ZCb3hJblRleHREaXJlY3Rpb25PZkJsb2NrKSB8fCAoYWZmaW5pdHkgPT0gRE9X
TlNUUkVBTSAmJiBhdEVuZE9mQm94SW5UZXh0RGlyZWN0aW9uT2ZCbG9jaykpKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworKi8KICAgICAgICAgICAgIGlmICgoKGNhcmV0T2Zmc2V0ID09IGNhcmV0
TWF4T2Zmc2V0KSBeIChhZmZpbml0eSA9PSBET1dOU1RSRUFNKSkKICAgICAgICAgICAgICAgICB8
fCAoKGNhcmV0T2Zmc2V0ID09IGNhcmV0TWluT2Zmc2V0KSBeIChhZmZpbml0eSA9PSBVUFNUUkVB
TSkpKQogICAgICAgICAgICAgICAgIGJyZWFrOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGlu
Zy9WaXNpYmxlU2VsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGlu
Zy9WaXNpYmxlU2VsZWN0aW9uLmgJKHJldmlzaW9uIDkxODkxKQorKysgU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTY5LDYgKzY5LDgg
QEAKICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0KCkgY29uc3QgeyByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKG1fc3RhcnQsIGlzUmFuZ2UoKSA/IERPV05TVFJFQU0gOiBhZmZp
bml0eSgpKTsgfQogICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kKCkgY29uc3QgeyByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKG1fZW5kLCBpc1JhbmdlKCkgPyBVUFNUUkVBTSA6IGFmZmluaXR5
KCkpOyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVCYXNlKCkgY29uc3QgeyByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKG1fYmFzZSwgaXNSYW5nZSgpID8gKGlzQmFzZUZpcnN0KCkgPyBVUFNU
UkVBTSA6IERPV05TVFJFQU0pIDogYWZmaW5pdHkoKSk7IH0KKyAgICBWaXNpYmxlUG9zaXRpb24g
dmlzaWJsZUV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2V4dGVudCwg
aXNSYW5nZSgpID8gKGlzQmFzZUZpcnN0KCkgPyBET1dOU1RSRUFNIDogVVBTVFJFQU0pIDogYWZm
aW5pdHkoKSk7IH0KIAogICAgIGJvb2wgaXNOb25lKCkgY29uc3QgeyByZXR1cm4gc2VsZWN0aW9u
VHlwZSgpID09IE5vU2VsZWN0aW9uOyB9CiAgICAgYm9vbCBpc0NhcmV0KCkgY29uc3QgeyByZXR1
cm4gc2VsZWN0aW9uVHlwZSgpID09IENhcmV0U2VsZWN0aW9uOyB9CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGFnZS9FdmVudEhhbmRsZXIuY3BwCShyZXZpc2lvbiA5MTg5MSkKKysrIFNvdXJjZS9XZWJDb3Jl
L3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc0LDYgKzI3NCwxMCBA
QAogICAgICAgICBzZWxlY3Rpb24tPnNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pOwogfQogCit9
CisjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgorbmFtZXNwYWNlIFdlYkNvcmUgeworCiBzdGF0
aWMgdm9pZCBzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKEZyYW1lU2VsZWN0aW9u
KiBzZWxlY3Rpb24sIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbiwgVGV4dEdy
YW51bGFyaXR5IGdyYW51bGFyaXR5KQogewogICAgIEFTU0VSVChzZWxlY3Rpb24pOwpAQCAtNjY3
LDYgKzY3MSw2OSBAQAogICAgIHJldHVybiB0YXJnZXROb2RlLT5yZW5kZXJlcigpLT5wb3NpdGlv
bkZvclBvaW50KHNlbGVjdGlvbkVuZFBvaW50KTsKIH0KIAorc3RhdGljIGJvb2wgc3dhcEJhc2VG
b3JCaWRpV2hlbkJhc2VJc09uTGVmdEVkZ2VPZkJpZGlSdW4oSW5saW5lQm94KiBiYXNlQm94LCBp
bnQgYmFzZU9mZnNldCwgSW5saW5lQm94KiBleHRlbnRCb3gsIGludCBleHRlbnRPZmZzZXQsIFZp
c2libGVQb3NpdGlvbiYgbmV3QmFzZSkKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGJhc2VCb3g7
CisgICAgZG8geworICAgICAgICBpZiAoYm94ID09IGV4dGVudEJveCkgeworICAgICAgICAgICAg
Ly8gSWYgdGhlIGV4dGVudCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJ1biwgZG8gbm90
IHN3YXAuCisgICAgICAgICAgICBpZiAoIWJveC0+bmV4dExlYWZDaGlsZCgpIHx8IGJveC0+bmV4
dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJveC0+YmlkaUxldmVsKCkgJiYgZXh0ZW50T2Zm
c2V0ID09IGV4dGVudEJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBuZXdCYXNlID0gY3JlYXRlTGVnYWN5RWRpdGlu
Z1Bvc2l0aW9uKGJhc2VCb3gtPnJlbmRlcmVyKCktPm5vZGUoKSwgYmFzZU9mZnNldCk7CisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib3ggPSBib3gtPm5leHRM
ZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYgYm94LT5iaWRpTGV2ZWwoKSA+PSBiYXNl
Qm94LT5iaWRpTGV2ZWwoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBz
d2FwQmFzZUZvckJpZGlXaGVuQmFzZUlzT25SaWdodEVkZ2VPZkJpZGlSdW4oSW5saW5lQm94KiBi
YXNlQm94LCBpbnQgYmFzZU9mZnNldCwgSW5saW5lQm94KiBleHRlbnRCb3gsIGludCBleHRlbnRP
ZmZzZXQsIFZpc2libGVQb3NpdGlvbiYgbmV3QmFzZSkKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9
IGJhc2VCb3g7CisgICAgZG8geworICAgICAgICBpZiAoYm94ID09IGV4dGVudEJveCkgeworICAg
ICAgICAgICAgLy8gSWYgdGhlIGV4dGVudCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJ1
biwgZG8gbm90IHN3YXAuCisgICAgICAgICAgICBpZiAoIWJveC0+cHJldkxlYWZDaGlsZCgpIHx8
IGJveC0+cHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJveC0+YmlkaUxldmVsKCkgJiYg
ZXh0ZW50T2Zmc2V0ID09IGV4dGVudEJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKQorICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIG5ld0Jhc2UgPSBjcmVhdGVMZWdh
Y3lFZGl0aW5nUG9zaXRpb24oYmFzZUJveC0+cmVuZGVyZXIoKS0+bm9kZSgpLCBiYXNlT2Zmc2V0
KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJveCA9IGJv
eC0+cHJldkxlYWZDaGlsZCgpOworICAgIH0gd2hpbGUgKGJveCAmJiBib3gtPmJpZGlMZXZlbCgp
ID49IGJhc2VCb3gtPmJpZGlMZXZlbCgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyBib29sIHN3YXBCYXNlRm9yQmlkaVN1cHBvcnQoY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBiYXNl
LCBjb25zdCBWaXNpYmxlUG9zaXRpb24mIGV4dGVudCwgVmlzaWJsZVBvc2l0aW9uJiBuZXdCYXNl
KQoreworICAgIElubGluZUJveCogYmFzZUJveCA9IDA7CisgICAgaW50IGJhc2VPZmZzZXQgPSAw
OworICAgIGJhc2UuZ2V0SW5saW5lQm94QW5kT2Zmc2V0KGJhc2VCb3gsIGJhc2VPZmZzZXQpOwor
CisgICAgSW5saW5lQm94KiBleHRlbnRCb3ggPSAwOworICAgIGludCBleHRlbnRPZmZzZXQgPSAw
OworICAgIGV4dGVudC5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoZXh0ZW50Qm94LCBleHRlbnRPZmZz
ZXQpOworICAgIGlmICghYmFzZUJveCB8fCAhZXh0ZW50Qm94KQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoYmFzZU9mZnNldCA9PSBiYXNlQm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpIHsKKyAgICAgICAgSW5saW5lQm94KiBwcmV2Qm94ID0gYmFzZUJveC0+cHJldkxlYWZDaGls
ZCgpOworICAgICAgICBpZiAoIXByZXZCb3ggfHwgcHJldkJveC0+YmlkaUxldmVsKCkgPCBiYXNl
Qm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZvckJpZGlXaGVu
QmFzZUlzT25MZWZ0RWRnZU9mQmlkaVJ1bihiYXNlQm94LCBiYXNlT2Zmc2V0LCBleHRlbnRCb3gs
IGV4dGVudE9mZnNldCwgbmV3QmFzZSk7CisgICAgICAgIGlmIChwcmV2Qm94LT5iaWRpTGV2ZWwo
KSA+IGJhc2VCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIHN3YXBCYXNlRm9y
QmlkaVdoZW5CYXNlSXNPblJpZ2h0RWRnZU9mQmlkaVJ1bihwcmV2Qm94LCBwcmV2Qm94LT5jYXJl
dFJpZ2h0bW9zdE9mZnNldCgpLCBleHRlbnRCb3gsIGV4dGVudE9mZnNldCwgbmV3QmFzZSk7Cisg
ICAgfQorCisgICAgaWYgKGJhc2VPZmZzZXQgPT0gYmFzZUJveC0+Y2FyZXRSaWdodG1vc3RPZmZz
ZXQoKSkgeworICAgICAgICBJbmxpbmVCb3gqIG5leHRCb3ggPSBiYXNlQm94LT5wcmV2TGVhZkNo
aWxkKCk7CisgICAgICAgIGlmICghbmV4dEJveCB8fCBuZXh0Qm94LT5iaWRpTGV2ZWwoKSA8IGJh
c2VCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIHN3YXBCYXNlRm9yQmlkaVdo
ZW5CYXNlSXNPblJpZ2h0RWRnZU9mQmlkaVJ1bihiYXNlQm94LCBiYXNlT2Zmc2V0LCBleHRlbnRC
b3gsIGV4dGVudE9mZnNldCwgbmV3QmFzZSk7CisgICAgICAgIGlmIChuZXh0Qm94LT5iaWRpTGV2
ZWwoKSA+IGJhc2VCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIHN3YXBCYXNl
Rm9yQmlkaVdoZW5CYXNlSXNPbkxlZnRFZGdlT2ZCaWRpUnVuKG5leHRCb3gsIG5leHRCb3gtPmNh
cmV0TGVmdG1vc3RPZmZzZXQoKSwgZXh0ZW50Qm94LCBleHRlbnRPZmZzZXQsIG5ld0Jhc2UpOwor
ICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9pZCBFdmVudEhhbmRsZXI6OnVwZGF0
ZVNlbGVjdGlvbkZvck1vdXNlRHJhZyhjb25zdCBIaXRUZXN0UmVzdWx0JiBoaXRUZXN0UmVzdWx0
KQogewogICAgIGlmICghbV9tb3VzZURvd25NYXlTdGFydFNlbGVjdCkKQEAgLTcwOSw2ICs3NzYs
MjAgQEAKICAgICBpZiAobV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCkgIT0gQ2hh
cmFjdGVyR3JhbnVsYXJpdHkpCiAgICAgICAgIG5ld1NlbGVjdGlvbi5leHBhbmRVc2luZ0dyYW51
bGFyaXR5KG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpKTsKIAorICAgIERFRklO
RV9TVEFUSUNfTE9DQUwoVmlzaWJsZVBvc2l0aW9uLCBzX29yaWdpbmFsQmFzZVBvc2l0aW9uLCAo
KSk7CisKKyAgICBWaXNpYmxlUG9zaXRpb24gYmFzZSA9IHNfb3JpZ2luYWxCYXNlUG9zaXRpb24u
aXNOb3ROdWxsKCkgPyBzX29yaWdpbmFsQmFzZVBvc2l0aW9uIDogbV9mcmFtZS0+c2VsZWN0aW9u
KCktPnNlbGVjdGlvbigpLnZpc2libGVCYXNlKCk7CisgICAgVmlzaWJsZVBvc2l0aW9uIG5ld0Jh
c2U7CisgICAgaWYgKHN3YXBCYXNlRm9yQmlkaVN1cHBvcnQoYmFzZSwgdGFyZ2V0UG9zaXRpb24s
IG5ld0Jhc2UpKSB7CisgICAgICAgIHNfb3JpZ2luYWxCYXNlUG9zaXRpb24gPSBiYXNlOworICAg
ICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZShuZXdCYXNlKTsKKyAgICAgICAgZnByaW50ZihzdGRl
cnIsICJzd2FwIVxuIik7CisgICAgfSBlbHNlIGlmIChzX29yaWdpbmFsQmFzZVBvc2l0aW9uLmlz
Tm90TnVsbCgpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3dhcCBiYWNrIVxuIik7Cisg
ICAgICAgIG5ld1NlbGVjdGlvbi5zZXRCYXNlKHNfb3JpZ2luYWxCYXNlUG9zaXRpb24pOworICAg
ICAgICBzX29yaWdpbmFsQmFzZVBvc2l0aW9uLmNsZWFyKCk7CisgICAgfQorCiAgICAgc2V0Tm9u
RGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChtX2ZyYW1lLT5zZWxlY3Rpb24oKSwgbmV3U2Vs
ZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7CiB9CiAjZW5kaWYg
Ly8gRU5BQkxFKERSQUdfU1VQUE9SVCkK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102456</attachid>
            <date>2011-07-31 00:04:16 -0700</date>
            <delta_ts>2011-08-19 18:56:42 -0700</delta_ts>
            <desc>work in progress 2</desc>
            <filename>wip57340b</filename>
            <type>text/plain</type>
            <size>21047</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL1dlYkNvcmUuZXhwLmluCShyZXZpc2lvbiA5MjA1MykKKysrIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUuZXhwLmluCSh3b3JraW5nIGNvcHkpCkBAIC0zNDksNyArMzQ5LDcgQEAKIF9f
Wk43V2ViQ29yZTE0RG9jdW1lbnRXcml0ZXIxMXNldEVuY29kaW5nRVJLTjNXVEY2U3RyaW5nRWIK
IF9fWk43V2ViQ29yZTE0RmlsZUljb25Mb2FkZXIxNG5vdGlmeUZpbmlzaGVkRU4zV1RGMTBQYXNz
UmVmUHRySU5TXzRJY29uRUVFCiBfX1pON1dlYkNvcmUxNEZyYW1lU2VsZWN0aW9uMTBzZXRGb2N1
c2VkRWIKLV9fWk43V2ViQ29yZTE0RnJhbWVTZWxlY3Rpb24xMnNldFNlbGVjdGlvbkVSS05TXzE2
VmlzaWJsZVNlbGVjdGlvbkVqTlMwXzE5Q3Vyc29yQWxpZ25PblNjcm9sbEVOU18xNVRleHRHcmFu
dWxhcml0eUUKK19fWk43V2ViQ29yZTE0RnJhbWVTZWxlY3Rpb24xMnNldFNlbGVjdGlvbkVSS05T
XzE2VmlzaWJsZVNlbGVjdGlvbkVqTlMwXzE5Q3Vyc29yQWxpZ25PblNjcm9sbEVOU18xNVRleHRH
cmFudWxhcml0eUVOUzBfMzRCYXNlQXRCaWRpQm91bmRhcnlBZGp1c3RtZW50T3B0aW9uRQogX19a
TjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjE1cmV2ZWFsU2VsZWN0aW9uRVJLTlNfMTVTY3JvbGxB
bGlnbm1lbnRFYgogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlvbjE2c2V0U2VsZWN0ZWRSYW5n
ZUVQTlNfNVJhbmdlRU5TXzlFQWZmaW5pdHlFYgogX19aTjdXZWJDb3JlMTRGcmFtZVNlbGVjdGlv
bjIwc2V0U2VsZWN0aW9uRnJvbU5vbmVFdgpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL1Bvc2l0
aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uY3BwCShy
ZXZpc2lvbiA5MjA1MykKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTExNjEsNyArMTE2MSwxMiBAQAogICAgICAgICAgICAgICAgIGlubGluZUJv
eCA9IGJveDsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0KKy8qCisg
ICAgICAgICAgICBib29sIGF0U3RhcnRPZkJveEluVGV4dERpcmVjdGlvbk9mQmxvY2sgPSBib3gt
PmRpcmVjdGlvbigpID09IGJveC0+cm9vdCgpLT5kaXJlY3Rpb24oKSA/IGNhcmV0T2Zmc2V0ID09
IGNhcmV0TWluT2Zmc2V0IDogY2FyZXRPZmZzZXQgPT0gY2FyZXRNYXhPZmZzZXQ7CisgICAgICAg
ICAgICBib29sIGF0RW5kT2ZCb3hJblRleHREaXJlY3Rpb25PZkJsb2NrID0gYm94LT5kaXJlY3Rp
b24oKSA9PSBib3gtPnJvb3QoKS0+ZGlyZWN0aW9uKCkgPyBjYXJldE9mZnNldCA9PSBjYXJldE1h
eE9mZnNldCA6IGNhcmV0T2Zmc2V0ID09IGNhcmV0TWluT2Zmc2V0OworICAgICAgICAgICAgaWYg
KCEoKGFmZmluaXR5ID09IFVQU1RSRUFNICYmIGF0U3RhcnRPZkJveEluVGV4dERpcmVjdGlvbk9m
QmxvY2spIHx8IChhZmZpbml0eSA9PSBET1dOU1RSRUFNICYmIGF0RW5kT2ZCb3hJblRleHREaXJl
Y3Rpb25PZkJsb2NrKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisqLwogICAgICAgICAgICAg
aWYgKCgoY2FyZXRPZmZzZXQgPT0gY2FyZXRNYXhPZmZzZXQpIF4gKGFmZmluaXR5ID09IERPV05T
VFJFQU0pKQogICAgICAgICAgICAgICAgIHx8ICgoY2FyZXRPZmZzZXQgPT0gY2FyZXRNaW5PZmZz
ZXQpIF4gKGFmZmluaXR5ID09IFVQU1RSRUFNKSkpCiAgICAgICAgICAgICAgICAgYnJlYWs7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24g
OTIwNTMpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTU5LDggKzE1OSw5MSBAQAogICAgIHJldHVybiAhZnJhbWUgfHwgZnJh
bWUtPmVkaXRvcigpLT5iZWhhdmlvcigpLnNob3VsZENvbnNpZGVyU2VsZWN0aW9uQXNEaXJlY3Rp
b25hbCgpOwogfQogCi12b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3Rpb24oY29uc3QgVmlz
aWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBTZXRTZWxlY3Rpb25PcHRpb25zIG9wdGlvbnMs
IEN1cnNvckFsaWduT25TY3JvbGwgYWxpZ24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkK
K3N0YXRpYyBib29sIHN3YXBCYXNlRm9yQmlkaVdoZW5CYXNlSXNPbkxlZnRFZGdlT2ZCaWRpUnVu
KElubGluZUJveCogYmFzZUJveCwgaW50IGJhc2VPZmZzZXQsIElubGluZUJveCogZXh0ZW50Qm94
LCBpbnQgZXh0ZW50T2Zmc2V0LCBWaXNpYmxlUG9zaXRpb24mIG5ld0Jhc2UpCiB7CisgICAgSW5s
aW5lQm94KiBib3ggPSBiYXNlQm94OworICAgIGRvIHsKKyAgICAgICAgaWYgKGJveCA9PSBleHRl
bnRCb3gpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBleHRlbnQgaXMgYXQgdGhlIGVuZCBvZiB0
aGUgY3VycmVudCBydW4sIGRvIG5vdCBzd2FwLgorICAgICAgICAgICAgaWYgKCghYm94LT5uZXh0
TGVhZkNoaWxkKCkgfHwgYm94LT5uZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgYm94LT5i
aWRpTGV2ZWwoKSkgJiYgZXh0ZW50T2Zmc2V0ID09IGV4dGVudEJveC0+Y2FyZXRSaWdodG1vc3RP
ZmZzZXQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBuZXdC
YXNlID0gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKGJhc2VCb3gtPnJlbmRlcmVyKCktPm5v
ZGUoKSwgYmFzZU9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQor
ICAgICAgICBib3ggPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYg
Ym94LT5iaWRpTGV2ZWwoKSA+PSBiYXNlQm94LT5iaWRpTGV2ZWwoKSk7CisgICAgcmV0dXJuIGZh
bHNlOworfQorCitzdGF0aWMgYm9vbCBzd2FwQmFzZUZvckJpZGlXaGVuQmFzZUlzT25SaWdodEVk
Z2VPZkJpZGlSdW4oSW5saW5lQm94KiBiYXNlQm94LCBpbnQgYmFzZU9mZnNldCwgSW5saW5lQm94
KiBleHRlbnRCb3gsIGludCBleHRlbnRPZmZzZXQsIFZpc2libGVQb3NpdGlvbiYgbmV3QmFzZSkK
K3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGJhc2VCb3g7CisgICAgZG8geworICAgICAgICBpZiAo
Ym94ID09IGV4dGVudEJveCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGV4dGVudCBpcyBhdCB0
aGUgZW5kIG9mIHRoZSBjdXJyZW50IHJ1biwgZG8gbm90IHN3YXAuCisgICAgICAgICAgICBpZiAo
KCFib3gtPnByZXZMZWFmQ2hpbGQoKSB8fCBib3gtPnByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVs
KCkgPCBib3gtPmJpZGlMZXZlbCgpKSAmJiBleHRlbnRPZmZzZXQgPT0gZXh0ZW50Qm94LT5jYXJl
dExlZnRtb3N0T2Zmc2V0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgbmV3QmFzZSA9IGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihiYXNlQm94LT5yZW5k
ZXJlcigpLT5ub2RlKCksIGJhc2VPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKyAgICAgICAgYm94ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgfSB3aGls
ZSAoYm94ICYmIGJveC0+YmlkaUxldmVsKCkgPj0gYmFzZUJveC0+YmlkaUxldmVsKCkpOworICAg
IHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgc3dhcEJhc2VGb3JCaWRpU3VwcG9ydChj
b25zdCBWaXNpYmxlUG9zaXRpb24mIGJhc2UsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZXh0ZW50
LCBWaXNpYmxlUG9zaXRpb24mIG5ld0Jhc2UsIFZpc2libGVQb3NpdGlvbiYgbmV3RXh0ZW50KQor
eworICAgIElubGluZUJveCogYmFzZUJveCA9IDA7CisgICAgaW50IGJhc2VPZmZzZXQgPSAwOwor
ICAgIGJhc2UuZ2V0SW5saW5lQm94QW5kT2Zmc2V0KGJhc2VCb3gsIGJhc2VPZmZzZXQpOworCisg
ICAgSW5saW5lQm94KiBleHRlbnRCb3ggPSAwOworICAgIGludCBleHRlbnRPZmZzZXQgPSAwOwor
ICAgIGV4dGVudC5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoZXh0ZW50Qm94LCBleHRlbnRPZmZzZXQp
OworICAgIGlmICghYmFzZUJveCB8fCAhZXh0ZW50Qm94IHx8IChiYXNlQm94ID09IGV4dGVudEJv
eCAmJiBiYXNlT2Zmc2V0ID09IGV4dGVudE9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIG5ld0Jhc2UgPSBiYXNlOworICAgIG5ld0V4dGVudCA9IGV4dGVudDsKKworICAgIGlm
IChiYXNlT2Zmc2V0ID09IGJhc2VCb3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgeworICAgICAg
ICBJbmxpbmVCb3gqIHByZXZCb3ggPSBiYXNlQm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgICAg
IGlmICghcHJldkJveCB8fCBwcmV2Qm94LT5iaWRpTGV2ZWwoKSA8IGJhc2VCb3gtPmJpZGlMZXZl
bCgpKQorICAgICAgICAgICAgcmV0dXJuIHN3YXBCYXNlRm9yQmlkaVdoZW5CYXNlSXNPbkxlZnRF
ZGdlT2ZCaWRpUnVuKGJhc2VCb3gsIGJhc2VPZmZzZXQsIGV4dGVudEJveCwgZXh0ZW50T2Zmc2V0
LCBuZXdCYXNlKTsKKyAgICAgICAgaWYgKHByZXZCb3gtPmJpZGlMZXZlbCgpID4gYmFzZUJveC0+
YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJ
c09uUmlnaHRFZGdlT2ZCaWRpUnVuKHByZXZCb3gsIHByZXZCb3gtPmNhcmV0UmlnaHRtb3N0T2Zm
c2V0KCksIGV4dGVudEJveCwgZXh0ZW50T2Zmc2V0LCBuZXdCYXNlKTsKKyAgICB9CisKKyAgICBp
ZiAoYmFzZU9mZnNldCA9PSBiYXNlQm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAg
ICAgIElubGluZUJveCogbmV4dEJveCA9IGJhc2VCb3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAg
ICAgaWYgKCFuZXh0Qm94IHx8IG5leHRCb3gtPmJpZGlMZXZlbCgpIDwgYmFzZUJveC0+YmlkaUxl
dmVsKCkpCisgICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJc09uUmln
aHRFZGdlT2ZCaWRpUnVuKGJhc2VCb3gsIGJhc2VPZmZzZXQsIGV4dGVudEJveCwgZXh0ZW50T2Zm
c2V0LCBuZXdCYXNlKTsKKyAgICAgICAgaWYgKG5leHRCb3gtPmJpZGlMZXZlbCgpID4gYmFzZUJv
eC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJh
c2VJc09uTGVmdEVkZ2VPZkJpZGlSdW4obmV4dEJveCwgbmV4dEJveC0+Y2FyZXRMZWZ0bW9zdE9m
ZnNldCgpLCBleHRlbnRCb3gsIGV4dGVudE9mZnNldCwgbmV3QmFzZSk7CisgICAgfQorCisgICAg
aWYgKGV4dGVudE9mZnNldCA9PSBleHRlbnRCb3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgewor
ICAgICAgICBJbmxpbmVCb3gqIHByZXZCb3ggPSBleHRlbnRCb3gtPnByZXZMZWFmQ2hpbGQoKTsK
KyAgICAgICAgaWYgKCFwcmV2Qm94IHx8IHByZXZCb3gtPmJpZGlMZXZlbCgpIDwgZXh0ZW50Qm94
LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZvckJpZGlXaGVuQmFz
ZUlzT25MZWZ0RWRnZU9mQmlkaVJ1bihleHRlbnRCb3gsIGV4dGVudE9mZnNldCwgYmFzZUJveCwg
YmFzZU9mZnNldCwgbmV3RXh0ZW50KTsKKyAgICAgICAgaWYgKHByZXZCb3gtPmJpZGlMZXZlbCgp
ID4gZXh0ZW50Qm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZv
ckJpZGlXaGVuQmFzZUlzT25SaWdodEVkZ2VPZkJpZGlSdW4ocHJldkJveCwgcHJldkJveC0+Y2Fy
ZXRSaWdodG1vc3RPZmZzZXQoKSwgYmFzZUJveCwgYmFzZU9mZnNldCwgbmV3RXh0ZW50KTsKKyAg
ICB9CisKKyAgICBpZiAoZXh0ZW50T2Zmc2V0ID09IGV4dGVudEJveC0+Y2FyZXRSaWdodG1vc3RP
ZmZzZXQoKSkgeworICAgICAgICBJbmxpbmVCb3gqIG5leHRCb3ggPSBleHRlbnRCb3gtPm5leHRM
ZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFuZXh0Qm94IHx8IG5leHRCb3gtPmJpZGlMZXZlbCgp
IDwgZXh0ZW50Qm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZv
ckJpZGlXaGVuQmFzZUlzT25SaWdodEVkZ2VPZkJpZGlSdW4oZXh0ZW50Qm94LCBleHRlbnRPZmZz
ZXQsIGJhc2VCb3gsIGJhc2VPZmZzZXQsIG5ld0V4dGVudCk7CisgICAgICAgIGlmIChuZXh0Qm94
LT5iaWRpTGV2ZWwoKSA+IGV4dGVudEJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1
cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJc09uTGVmdEVkZ2VPZkJpZGlSdW4obmV4dEJveCwg
bmV4dEJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpLCBiYXNlQm94LCBiYXNlT2Zmc2V0LCBuZXdF
eHRlbnQpOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBGcmFtZVNlbGVj
dGlvbjo6c2V0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIG5ld1NlbGVjdGlvbiwg
U2V0U2VsZWN0aW9uT3B0aW9ucyBvcHRpb25zLCBDdXJzb3JBbGlnbk9uU2Nyb2xsIGFsaWduLAor
ICAgIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSwgQmFzZUF0QmlkaUJvdW5kYXJ5QWRqdXN0
bWVudE9wdGlvbiBiYXNlQWRqdXN0bWVudE9wdGlvbikKK3sKICAgICBib29sIGNsb3NlVHlwaW5n
ID0gb3B0aW9ucyAmIENsb3NlVHlwaW5nOwogICAgIGJvb2wgc2hvdWxkQ2xlYXJUeXBpbmdTdHls
ZSA9IG9wdGlvbnMgJiBDbGVhclR5cGluZ1N0eWxlOwogICAgIEVVc2VyVHJpZ2dlcmVkIHVzZXJU
cmlnZ2VyZWQgPSBzZWxlY3Rpb25PcHRpb25zVG9Vc2VyVHJpZ2dlcmVkKG9wdGlvbnMpOwpAQCAt
MjAwLDkgKzI4MywyNCBAQAogCiAgICAgVmlzaWJsZVNlbGVjdGlvbiBvbGRTZWxlY3Rpb24gPSBt
X3NlbGVjdGlvbjsKIAorICAgIHsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGJhc2UgPSBtX29y
aWdpbmFsQmFzZS5pc05vdE51bGwoKSA/IG1fb3JpZ2luYWxCYXNlIDogb2xkU2VsZWN0aW9uLnZp
c2libGVCYXNlKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXdCYXNlOworICAgICAgICBW
aXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50OworICAgICAgICBpZiAoYmFzZUFkanVzdG1lbnRPcHRp
b24gPT0gQWRqdXN0QmFzZUF0QmlkaUJvdW5kYXJ5ICYmIHN3YXBCYXNlRm9yQmlkaVN1cHBvcnQo
YmFzZSwgcy52aXNpYmxlRXh0ZW50KCksIG5ld0Jhc2UsIG5ld0V4dGVudCkpIHsKKyAgICAgICAg
ICAgIG1fb3JpZ2luYWxCYXNlID0gYmFzZTsKKyAgICAgICAgICAgIHMuc2V0QmFzZShuZXdCYXNl
KTsKKyAgICAgICAgICAgIHMuc2V0RXh0ZW50KG5ld0V4dGVudCk7CisgICAgICAgIH0gZWxzZSBp
ZiAobV9vcmlnaW5hbEJhc2UuaXNOb3ROdWxsKCkpIHsKKyAgICAgICAgICAgIGlmIChvbGRTZWxl
Y3Rpb24uYmFzZSgpID09IHMuYmFzZSgpKQorICAgICAgICAgICAgICAgIHMuc2V0QmFzZShtX29y
aWdpbmFsQmFzZSk7CisgICAgICAgICAgICBtX29yaWdpbmFsQmFzZS5jbGVhcigpOworICAgICAg
ICB9CisgICAgfQorCiAgICAgbV9zZWxlY3Rpb24gPSBzOwogICAgIHNldENhcmV0UmVjdE5lZWRz
VXBkYXRlKCk7Ci0gICAgCisKICAgICBpZiAoIXMuaXNOb25lKCkpCiAgICAgICAgIHNldEZvY3Vz
ZWROb2RlSWZOZWVkZWQoKTsKICAgICAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlz
aWJsZVNlbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlz
aWJsZVNlbGVjdGlvbi5oCShyZXZpc2lvbiA5MjA1MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvVmlzaWJsZVNlbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2OSw4IEBACiAg
ICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVQb3NpdGlvbihtX3N0YXJ0LCBpc1JhbmdlKCkgPyBET1dOU1RSRUFNIDogYWZmaW5pdHko
KSk7IH0KICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZCgpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVQb3NpdGlvbihtX2VuZCwgaXNSYW5nZSgpID8gVVBTVFJFQU0gOiBhZmZpbml0eSgpKTsg
fQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlQmFzZSgpIGNvbnN0IHsgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbihtX2Jhc2UsIGlzUmFuZ2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gVVBTVFJFQU0g
OiBET1dOU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2li
bGVFeHRlbnQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9leHRlbnQsIGlzUmFu
Z2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gRE9XTlNUUkVBTSA6IFVQU1RSRUFNKSA6IGFmZmluaXR5
KCkpOyB9CiAKICAgICBib29sIGlzTm9uZSgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUo
KSA9PSBOb1NlbGVjdGlvbjsgfQogICAgIGJvb2wgaXNDYXJldCgpIGNvbnN0IHsgcmV0dXJuIHNl
bGVjdGlvblR5cGUoKSA9PSBDYXJldFNlbGVjdGlvbjsgfQpJbmRleDogU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Vk
aXRpbmcvRnJhbWVTZWxlY3Rpb24uaAkocmV2aXNpb24gOTIwNTMpCisrKyBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTExMCw2ICsxMTAs
NyBAQAogICAgIGVudW0gRUFsdGVyYXRpb24geyBBbHRlcmF0aW9uTW92ZSwgQWx0ZXJhdGlvbkV4
dGVuZCB9OwogICAgIGVudW0gQ3Vyc29yQWxpZ25PblNjcm9sbCB7IEFsaWduQ3Vyc29yT25TY3Jv
bGxJZk5lZWRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlnbkN1cnNvck9u
U2Nyb2xsQWx3YXlzIH07CisgICAgZW51bSBCYXNlQXRCaWRpQm91bmRhcnlBZGp1c3RtZW50T3B0
aW9uIHsgRG9Ob3RBZGp1c3RCYXNlQXRCaWRpQm91bmRhcnksIEFkanVzdEJhc2VBdEJpZGlCb3Vu
ZGFyeSB9OwogICAgIGVudW0gU2V0U2VsZWN0aW9uT3B0aW9uIHsKICAgICAgICAgLy8gMSA8PCAw
IGlzIHJlc2VydmVkIGZvciBFVXNlclRyaWdnZXJlZAogICAgICAgICBDbG9zZVR5cGluZyA9IDEg
PDwgMSwKQEAgLTEzNSwxMiArMTM2LDE1IEBACiAgICAgdm9pZCBtb3ZlVG8oY29uc3QgUG9zaXRp
b24mLCBjb25zdCBQb3NpdGlvbiYsIEVBZmZpbml0eSwgRVVzZXJUcmlnZ2VyZWQgPSBOb3RVc2Vy
VHJpZ2dlcmVkKTsKIAogICAgIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHNlbGVjdGlvbigpIGNv
bnN0IHsgcmV0dXJuIG1fc2VsZWN0aW9uOyB9Ci0gICAgdm9pZCBzZXRTZWxlY3Rpb24oY29uc3Qg
VmlzaWJsZVNlbGVjdGlvbiYsIFNldFNlbGVjdGlvbk9wdGlvbnMgPSBDbG9zZVR5cGluZyB8IENs
ZWFyVHlwaW5nU3R5bGUsIEN1cnNvckFsaWduT25TY3JvbGwgPSBBbGlnbkN1cnNvck9uU2Nyb2xs
SWZOZWVkZWQsIFRleHRHcmFudWxhcml0eSA9IENoYXJhY3RlckdyYW51bGFyaXR5KTsKLSAgICB2
b2lkIHNldFNlbGVjdGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBzZWxlY3Rpb24sIFRleHRH
cmFudWxhcml0eSBncmFudWxhcml0eSkgeyBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uLCBDbG9zZVR5
cGluZyB8IENsZWFyVHlwaW5nU3R5bGUsIEFsaWduQ3Vyc29yT25TY3JvbGxJZk5lZWRlZCwgZ3Jh
bnVsYXJpdHkpOyB9CisgICAgdm9pZCBzZXRTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlv
biYsIFNldFNlbGVjdGlvbk9wdGlvbnMgPSBDbG9zZVR5cGluZyB8IENsZWFyVHlwaW5nU3R5bGUs
IEN1cnNvckFsaWduT25TY3JvbGwgPSBBbGlnbkN1cnNvck9uU2Nyb2xsSWZOZWVkZWQsIFRleHRH
cmFudWxhcml0eSA9IENoYXJhY3RlckdyYW51bGFyaXR5LCBCYXNlQXRCaWRpQm91bmRhcnlBZGp1
c3RtZW50T3B0aW9uID0gRG9Ob3RBZGp1c3RCYXNlQXRCaWRpQm91bmRhcnkpOworICAgIHZvaWQg
c2V0U2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHNlbGVjdGlvbiwgVGV4dEdyYW51
bGFyaXR5IGdyYW51bGFyaXR5LCBCYXNlQXRCaWRpQm91bmRhcnlBZGp1c3RtZW50T3B0aW9uIGJh
c2VBZGp1c3RtZW50T3B0aW9uKQorICAgIHsKKyAgICAgICAgc2V0U2VsZWN0aW9uKHNlbGVjdGlv
biwgQ2xvc2VUeXBpbmcgfCBDbGVhclR5cGluZ1N0eWxlLCBBbGlnbkN1cnNvck9uU2Nyb2xsSWZO
ZWVkZWQsIGdyYW51bGFyaXR5LCBiYXNlQWRqdXN0bWVudE9wdGlvbik7CisgICAgfQogICAgIGJv
b2wgc2V0U2VsZWN0ZWRSYW5nZShSYW5nZSosIEVBZmZpbml0eSwgYm9vbCBjbG9zZVR5cGluZyk7
CiAgICAgdm9pZCBzZWxlY3RBbGwoKTsKICAgICB2b2lkIGNsZWFyKCk7Ci0gICAgCisKICAgICAv
LyBDYWxsIHRoaXMgYWZ0ZXIgZG9pbmcgdXNlci10cmlnZ2VyZWQgc2VsZWN0aW9ucyB0byBtYWtl
IGl0IGVhc3kgdG8gZGVsZXRlIHRoZSBmcmFtZSB5b3UgZW50aXJlbHkgc2VsZWN0ZWQuCiAgICAg
dm9pZCBzZWxlY3RGcmFtZUVsZW1lbnRJblBhcmVudElmRnVsbHlTZWxlY3RlZCgpOwogCkBAIC0y
NzgsNiArMjgyLDcgQEAKICAgICBMYXlvdXRVbml0IG1feFBvc0ZvclZlcnRpY2FsQXJyb3dOYXZp
Z2F0aW9uOwogCiAgICAgVmlzaWJsZVNlbGVjdGlvbiBtX3NlbGVjdGlvbjsKKyAgICBWaXNpYmxl
UG9zaXRpb24gbV9vcmlnaW5hbEJhc2U7IC8vIFVzZWQgdG8gc3RvcmUgYmFzZSBiZWZvcmUgdGhl
IGFkanVzdG1lbnQgYXQgYmlkaSBib3VuZGFyeQogICAgIFRleHRHcmFudWxhcml0eSBtX2dyYW51
bGFyaXR5OwogCiAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gbV90eXBpbmdTdHlsZTsKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJKHJldmlzaW9uIDkyMDUzKQorKysgU291
cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNzQs
NyArMjc0LDggQEAKICAgICAgICAgc2VsZWN0aW9uLT5zZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9u
KTsKIH0KIAotc3RhdGljIHZvaWQgc2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChG
cmFtZVNlbGVjdGlvbiogc2VsZWN0aW9uLCBjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBuZXdTZWxl
Y3Rpb24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3N0YXRpYyB2b2lkIHNldE5vbkRp
cmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoRnJhbWVTZWxlY3Rpb24qIHNlbGVjdGlvbiwgY29u
c3QgVmlzaWJsZVNlbGVjdGlvbiYgbmV3U2VsZWN0aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVs
YXJpdHksCisgICAgRnJhbWVTZWxlY3Rpb246OkJhc2VBdEJpZGlCb3VuZGFyeUFkanVzdG1lbnRP
cHRpb24gYmFzZUFkanVzdG1lbnRPcHRpb24gPSBGcmFtZVNlbGVjdGlvbjo6RG9Ob3RBZGp1c3RC
YXNlQXRCaWRpQm91bmRhcnkpCiB7CiAgICAgQVNTRVJUKHNlbGVjdGlvbik7CiAgICAgaWYgKHNl
bGVjdGlvbi0+c2VsZWN0aW9uKCkgPT0gbmV3U2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24tPnNob3Vs
ZENoYW5nZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKQpAQCAtMjgzLDcgKzI4NCw3IEBACiAgICAg
VmlzaWJsZVNlbGVjdGlvbiBuZXdOb25EaXJlY3Rpb25hbFNlbGVjdGlvbiA9IG5ld1NlbGVjdGlv
bjsKICAgICBuZXdOb25EaXJlY3Rpb25hbFNlbGVjdGlvbi5zZXRJc0RpcmVjdGlvbmFsKGZhbHNl
KTsKIAotICAgIHNlbGVjdGlvbi0+c2V0U2VsZWN0aW9uKG5ld05vbkRpcmVjdGlvbmFsU2VsZWN0
aW9uLCBncmFudWxhcml0eSk7CisgICAgc2VsZWN0aW9uLT5zZXRTZWxlY3Rpb24obmV3Tm9uRGly
ZWN0aW9uYWxTZWxlY3Rpb24sIGdyYW51bGFyaXR5LCBiYXNlQWRqdXN0bWVudE9wdGlvbik7CiB9
CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBkaXNwYXRjaFNlbGVjdFN0YXJ0KE5vZGUqIG5vZGUpCkBA
IC03MDksNyArNzEwLDcgQEAKICAgICBpZiAobV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFy
aXR5KCkgIT0gQ2hhcmFjdGVyR3JhbnVsYXJpdHkpCiAgICAgICAgIG5ld1NlbGVjdGlvbi5leHBh
bmRVc2luZ0dyYW51bGFyaXR5KG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpKTsK
IAotICAgIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQobV9mcmFtZS0+c2VsZWN0
aW9uKCksIG5ld1NlbGVjdGlvbiwgbV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCkp
OworICAgIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQobV9mcmFtZS0+c2VsZWN0
aW9uKCksIG5ld1NlbGVjdGlvbiwgbV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCks
IEZyYW1lU2VsZWN0aW9uOjpBZGp1c3RCYXNlQXRCaWRpQm91bmRhcnkpOwogfQogI2VuZGlmIC8v
IEVOQUJMRShEUkFHX1NVUFBPUlQpCiAKSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0
aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1l
eHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsOTAgQEAKK1RoaXMgdGVzdCBlbnN1
cmVzIFdlYktpdCBsZXRzIHVzZXIgc2VsZWN0IGJpZGlyZWN0aW9uYWwgdGV4dCBpbnR1aXRpdmVs
eS4gVG8gbWFudWFsbHkgdGVzdCwgc2VsZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0
IGNhc2UgYmVsb3cgYnkgYSBtb3VzZSBkcmFnIGZyb20gbGVmdCB0byByaWdodC4gVGhlIGNoYW5n
ZXMgaW4gdGhlIHNlbGVjdGVkIHRleHQgc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RhdGlvbnMgYmVm
b3JlIHwuIERvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJhZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5k
IGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIgfC4KKworU2VsZWN0ZWQgdGV4dDoKK2FiY9eQ15HXkgor
YSBhYiBhYmMgYWJjQUIgYWJjQSBhYmNBQkMgfCBBIEFCIEFCQyBjQUJDIGJjQUJDIGFiY0FCQwor
15DXkdeSZGVmCitDIEJDIEFCQyBBQkNkIEFCQ2VmIEFCQ2RlZiB8IGYgZWYgZGVmIEJDZGVmIENk
ZWYgQUJDZGVmCithYmPXkNeR15JkZWYKK0MgQkMgQUJDIHwgQSBBQiBBQkMKK9eQ15HXkmRlZgor
QyBCQyBBQkMgfCBBIEFCIEFCQwor15DXkdeSZGVmINeQ15HXkmRlZgorZSBlZiB8IGYgZWYKK2Fi
Y9eQ15HXkiBhYmPXkNeR15IKK0IgQUIgfCBBIEFCCitUZXN0ICJhYmNBQkMiIGluICJhYmNBQkMi
OgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiYSIKK1BBU1Mg
c2VsZWN0ZWQgImFiIgorUEFTUyBzZWxlY3RlZCAiYWJjIgorUEFTUyBzZWxlY3RlZCAiYWJjQUIi
CitQQVNTIHNlbGVjdGVkICJhYmNBIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorU2VsZWN0aW5n
IGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFC
IgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiY0FCQyIKK1BBU1Mgc2VsZWN0
ZWQgImJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorCitUZXN0ICJBQkNkZWYiIGluICJB
QkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIK
K1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAi
QUJDZCIKK0ZBSUwgc2VsZWN0ZWQgIkFCQ2RlIiBidXQgZXhwZWN0ZWQgIkFCQ2VmIgorUEFTUyBz
ZWxlY3RlZCAiQUJDZGVmIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxl
Y3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorUEFTUyBzZWxlY3RlZCAiZGVmIgorUEFTUyBz
ZWxlY3RlZCAiQkNkZWYiCitQQVNTIHNlbGVjdGVkICJDZGVmIgorUEFTUyBzZWxlY3RlZCAiQUJD
ZGVmIgorCitUZXN0ICJBQkMiIGluICJhYmNBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0
byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxl
Y3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAi
QSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJBQkMi
IGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3Rl
ZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5n
IGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFC
IgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJlZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3Rp
bmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJlIgorUEFTUyBzZWxlY3RlZCAi
ZWYiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJmIgorUEFT
UyBzZWxlY3RlZCAiZWYiCisKK1Rlc3QgIkFCIiBpbiAiYWJjQUJDIjoKK1NlbGVjdGluZyBmcm9t
IGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkIiCitQQVNTIHNlbGVjdGVkICJBQiIKK1Nl
bGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVj
dGVkICJBQiIKKworUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBM
RVRFCisKKworCisKSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1i
aWRpLXJ1bi5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9u
L3NlbGVjdC1iaWRpLXJ1bi5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGlu
Zy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTM1IEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2
PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8bGlu
ayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3Qt
c3R5bGUuY3NzIj4KKzxzY3JpcHQgc3JjPSIuLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0
LXByZS5qcyI+PC9zY3JpcHQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorI3Rlc3RzIHsgZm9u
dC1zaXplOiAyLjVlbTsgcGFkZGluZzogMHB4OyBtYXJnaW46IDBweDsgfQorZHQgeyB3aWR0aDog
MTVleDsgcGFkZGluZzogMHB4IDEwcHg7IG1hcmdpbjogMHB4OyB9CitkZCB7IGZvbnQtc2l6ZTog
MC42ZW07IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMTBweDsgfQorLnRhcmdldCB7IGJhY2tn
cm91bmQtY29sb3I6ICNiYmVlZmY7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRo
aXMgdGVzdCBlbnN1cmVzIFdlYktpdCBsZXRzIHVzZXIgc2VsZWN0IGJpZGlyZWN0aW9uYWwgdGV4
dCBpbnR1aXRpdmVseS4KK1RvIG1hbnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGluIGJsdWUgYm94
IGluIGVhY2ggdGVzdCBjYXNlIGJlbG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxlZnQgdG8gcmln
aHQuCitUaGUgY2hhbmdlcyBpbiB0aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGV4
cGVjdGF0aW9ucyBiZWZvcmUgfC4KK0RvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJhZyBmcm9tIHJp
Z2h0IHRvIGxlZnQgYW5kIGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIgfC48L3A+Cis8ZGl2PlNlbGVj
dGVkIHRleHQ6IDxzcGFuIGlkPSJsb2ciPjwvc3Bhbj48L2Rpdj4KKzxkbCBpZD0idGVzdHMiPgor
PGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij5hYmPXkNeR15I8L3NwYW4+
PC9kdD4KKzxkZD5hIGFiIGFiYyBhYmNBQiBhYmNBIGFiY0FCQyB8IEEgQUIgQUJDIGNBQkMgYmNB
QkMgYWJjQUJDPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0
Ij7XkNeR15JkZWY8L3NwYW4+PC9kdD4KKzxkZD5DIEJDIEFCQyBBQkNkIEFCQ2VmIEFCQ2RlZiB8
IGYgZWYgZGVmIEJDZGVmIENkZWYgQUJDZGVmPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT5h
YmM8c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15I8L3NwYW4+ZGVmPC9kdD4KKzxkZD5DIEJDIEFC
QyB8IEEgQUIgQUJDPC9kZD4KKworPGR0IGRpcj0icnRsIiBjb250ZW50ZWRpdGFibGU+PHNwYW4g
Y2xhc3M9InRhcmdldCI+15DXkdeSPC9zcGFuPmRlZjwvZHQ+Cis8ZGQ+QyBCQyBBQkMgfCBBIEFC
IEFCQzwvZGQ+CisKKzwhLS08ZHQgY29udGVudGVkaXRhYmxlPtec16nXoCAyMDA5IC0gNTE2PC9k
dD4KKzxkZD5DIEJDIEFCQyB8IEEgQUIgQUJDPC9kZD4tLT4KKworPCEtLSBXb3JrIGFyb3VuZCBh
IFdlYktpdCBidWcgdGhhdCBoaXQtdGVzdGluZyBkb2Vzbid0IHdvcmsgcHJvcGVydHkgd2l0aCBz
cGFuIG1peGVkIHdpdGggYmlkaXJlY3Rpb25hbCB0ZXh0CitieSBvdmVybGFwcGluZyB0d28gc3Bh
bnMsIG9uZSB1c2VkIGZvciBhY3R1YWwgdGVzdGluZyBhbmQgYW5vdGhlciBvbmUgcHJvdmlkaW5n
IHRoZSBibHVlIGJhY2tncm91bmQgY29sb3IuIC0tPgorPGR0IGRpcj0icnRsIiBzdHlsZT0icG9z
aXRpb246IHJlbGF0aXZlOyI+15DXkdeSZGVmCis8c3BhbiBzdHlsZT0icG9zaXRpb246IGFic29s
dXRlOyByaWdodDogMTBweDsgei1pbmRleDogLTE7IGNvbG9yOiB0cmFuc3BhcmVudDsiPteQ15HX
kmQ8c3BhbiBjbGFzcz0idGFyZ2V0Ij5lZjwvc3Bhbj48L3NwYW4+PC9kdD4KKzxkZD5lIGVmIHwg
ZiBlZjwvZGQ+CisKKzxkdCBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyIgY29udGVudGVkaXRh
YmxlPmFiY9eQ15HXkgorPHNwYW4gc3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMTBw
eDsgei1pbmRleDogLTE7IGNvbG9yOiB0cmFuc3BhcmVudDsiPmFiYzxzcGFuIGNsYXNzPSJ0YXJn
ZXQiPteQ15E8L3NwYW4+15I8L3NwYW4+PC9kdD4KKzxkZD5CIEFCIHwgQSBBQjwvZGQ+CisKKzwh
LS08ZHQgY29udGVudGVkaXRhYmxlPmHXp9ecMTLXmdedZDwvZHQ+PGRkPlswIDEgNiAzIDQgNSAy
IDcgOF0gTChhIFIoQUIgTCgxMikgQ0QpIGIpPC9kZD4KKzxkdCBjb250ZW50ZWRpdGFibGU+PHNw
YW4gZGlyPSJydGwiPjEyPGI+16fXnDQzPC9iPjwvc3Bhbj5hYjwvZHQ+Cis8ZGQ+WzQgNSA2IDMg
MCAxICgyIDYpIDcgOF0gTChSe0woMTIpIEFCIEwoMzQpfSBhYik8L2RkPgorPGR0IGNvbnRlbnRl
ZGl0YWJsZSBkaXI9InJ0bCI+PHNwYW4gZGlyPSJsdHIiPmFiY9ec16nXoDwvc3Bhbj48L2R0Pgor
PGRkPls2IDEgMiA2IDUgNCAzXSBSKEx7YWJjIFIoQ0JBKX0pPC9kZD4tLT4KKzwvZGw+Cis8ZGl2
IGlkPSJjb25zb2xlIj48L2Rpdj4KKzxwcmU+PHNjcmlwdD4KK3ZhciB0ZXN0cyA9IGRvY3VtZW50
LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpOworCitTdHJpbmcucHJvdG90eXBlLmZvbGQgPSBmdW5j
dGlvbiAoKSB7CisgICAgdmFyIHJlc3VsdCA9ICcnOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwg
dGhpcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgY29kZSA9IHRoaXMuY2hhckNvZGVBdChp
KTsKKyAgICAgICAgaWYgKDB4MDVkMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgwNWVhKS8vIEhlYnJl
dyBBbGVmCisgICAgICAgICAgICBjb2RlICs9IC0weDA1ZDAgKyAnQScuY2hhckNvZGVBdCgwKTsK
KyAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK2Z1bmN0aW9uIGFzc2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1
YWwpIHsKKyAgICBkb2N1bWVudC53cml0ZWxuKCdFOicgKyBleHBlY3RlZCArICcgQTonICsgYWN0
dWFsKTsKK30KKworZnVuY3Rpb24gc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFy
Z2V0LCBsZWZ0VG9SaWdodCwgZXhwZWN0YXRpb25zKSB7CisgICAgdmFyIHkgPSB0YXJnZXQub2Zm
c2V0VG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCAvIDI7CisgICAgdmFyIGxlZnQgPSB0YXJnZXQu
b2Zmc2V0TGVmdDsKKworICAgIGlmICh0YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnN0eWxl
LnBvc2l0aW9uID09ICdyZWxhdGl2ZScpIHsKKyAgICAgICAgbGVmdCArPSB0YXJnZXQucGFyZW50
Tm9kZS5vZmZzZXRMZWZ0ICsgdGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5vZmZzZXRMZWZ0
OworICAgICAgICB5ICs9IHRhcmdldC5wYXJlbnROb2RlLm9mZnNldFRvcCArIHRhcmdldC5wYXJl
bnROb2RlLnBhcmVudE5vZGUub2Zmc2V0VG9wOworICAgIH0KKworICAgIHZhciBzdGFydFggPSBs
ZWZ0ICsgKGxlZnRUb1JpZ2h0ID8gMCA6IHRhcmdldC5vZmZzZXRXaWR0aCk7CisgICAgZXZlbnRT
ZW5kZXIuZHJhZ01vZGUgPSBmYWxzZTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgzMDAw
KTsKKyAgICBldmVudFNlbmRlci5tb3VzZU1vdmVUbyhzdGFydFgsIHkpOworICAgIGV2ZW50U2Vu
ZGVyLm1vdXNlRG93bigpOworCisgICAgdmFyIHByZXZpb3VzU2VsZWN0ZWRUZXh0ID0gJyc7Cisg
ICAgdmFyIGogPSAwOworICAgIHZhciB4SW5jcmVtZW50ID0gbGVmdFRvUmlnaHQgPyAxIDogLTE7
CisgICAgZm9yICh2YXIgeCA9IHN0YXJ0WDsgbGVmdCA8PSB4ICYmIHggPD0gbGVmdCArIHRhcmdl
dC5vZmZzZXRXaWR0aDsgeCArPSB4SW5jcmVtZW50KSB7CisgICAgICAgIGV2ZW50U2VuZGVyLmxl
YXBGb3J3YXJkKDEwMCk7CisgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlTW92ZVRvKHgsIHkpOwor
CisgICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJp
bmcoKS5mb2xkKCk7CisgICAgICAgIGlmIChwcmV2aW91c1NlbGVjdGVkVGV4dCAhPSBzZWxlY3Rl
ZFRleHQpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbnNbal0gPT0gc2VsZWN0ZWRUZXh0
KQorICAgICAgICAgICAgICAgIHRlc3RQYXNzZWQoJ3NlbGVjdGVkICInICsgc2VsZWN0ZWRUZXh0
ICsgJyInKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZXN0RmFpbGVkKCdz
ZWxlY3RlZCAiJyArIHNlbGVjdGVkVGV4dCArICciIGJ1dCBleHBlY3RlZCAiJyArIGV4cGVjdGF0
aW9uc1tqXSArICciJyk7CisgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGV4dCA9IHNlbGVj
dGVkVGV4dDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV2ZW50
U2VuZGVyLm1vdXNlVXAoKTsKK30KKworaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikg
eworICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworICAgIHZhciB0ZXN0
cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCdkdCcpOworICAgIHZhciB0ZXN0RXhwZWN0YXRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoJ3Rlc3RzJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RkJyk7CisgICAgZm9yICh2YXIgaSA9
IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIgdGFyZ2V0ID0gdGVzdHNb
aV0uZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGFyZ2V0JylbMF07CisgICAgICAgIHZhciB0ZXN0
RXhwZWN0YXRpb24gPSB0ZXN0RXhwZWN0YXRpb25zW2ldLnRleHRDb250ZW50OworCisgICAgICAg
IGRlYnVnKCdUZXN0ICInICsgdGFyZ2V0LnRleHRDb250ZW50LmZvbGQoKSArICciIGluICInICsg
dGFyZ2V0LnBhcmVudE5vZGUudGV4dENvbnRlbnQuZm9sZCgpICsgJyI6Jyk7CisgICAgICAgIGRl
YnVnKCdTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0Jyk7CisgICAgICAgIHNlbGVjdEJ5TW91
c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgdHJ1ZSwgdGVzdEV4cGVjdGF0aW9uLnNwbGl0
KC9cfC8pWzBdLnRyaW0oKS5zcGxpdCgvXHMrLykpOworICAgICAgICBkZWJ1ZygnU2VsZWN0aW5n
IGZyb20gcmlnaHQgdG8gbGVmdCcpOworICAgICAgICBzZWxlY3RCeU1vdXNlRHJhZ0FuZFZlcmlm
eVJlc3VsdCh0YXJnZXQsIGZhbHNlLCB0ZXN0RXhwZWN0YXRpb24uc3BsaXQoL1x8LylbMV0udHJp
bSgpLnNwbGl0KC9ccysvKSk7CisgICAgICAgIGRlYnVnKCcnKTsKKyAgICB9Cit9IGVsc2Ugewor
ICAgIGRlYnVnKCdUaGlzIHRlc3QgcmVxdWlyZXMgZXZlbnRTZW5kZXInKTsKKyAgICBkb2N1bWVu
dC5vbnNlbGVjdGlvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgZG9jdW1lbnQuZ2V0
RWxlbWVudEJ5SWQoJ2xvZycpLnRleHRDb250ZW50ID0gd2luZG93LmdldFNlbGVjdGlvbigpLnRv
U3RyaW5nKCkuZm9sZCgpOworICAgIH0KK30KKwordmFyIHN1Y2Nlc3NmdWxseVBhcnNlZCA9IHRy
dWU7CisKKzwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pz
LXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBh
dCBlbmQgb2YgZmlsZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>104608</attachid>
            <date>2011-08-19 18:56:42 -0700</date>
            <delta_ts>2011-09-08 20:31:04 -0700</delta_ts>
            <desc>work in progress 3</desc>
            <filename>wip57340c</filename>
            <type>text/plain</type>
            <size>17507</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCShyZXZpc2lv
biA5MzQ0MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNjMsMTUgKzE2MywxMTIgQEAKICAgICAgICAgdXBkYXRlQ2FyZXRS
ZWN0KGRvY3VtZW50LCBtX3Bvc2l0aW9uKTsKIH0KIAotdm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0
Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChGcmFtZVNlbGVjdGlvbiogc2VsZWN0aW9u
LCBjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWROZXdTZWxlY3Rpb24sIFRleHRHcmFudWxh
cml0eSBncmFudWxhcml0eSkKK3N0YXRpYyBib29sIHN3YXBCYXNlRm9yQmlkaVdoZW5CYXNlSXNP
bkxlZnRFZGdlT2ZCaWRpUnVuKElubGluZUJveCogYmFzZUJveCwgaW50IGJhc2VPZmZzZXQsIElu
bGluZUJveCogZXh0ZW50Qm94LCBpbnQgZXh0ZW50T2Zmc2V0LCBWaXNpYmxlUG9zaXRpb24mIG5l
d0Jhc2UpCiB7Ci0gICAgQVNTRVJUKHNlbGVjdGlvbik7CisgICAgSW5saW5lQm94KiBib3ggPSBi
YXNlQm94OworICAgIGRvIHsKKyAgICAgICAgaWYgKGJveCA9PSBleHRlbnRCb3gpIHsKKyAgICAg
ICAgICAgIC8vIElmIHRoZSBleHRlbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW4s
IGRvIG5vdCBzd2FwLgorICAgICAgICAgICAgaWYgKCghYm94LT5uZXh0TGVhZkNoaWxkKCkgfHwg
Ym94LT5uZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgYm94LT5iaWRpTGV2ZWwoKSkgJiYg
ZXh0ZW50T2Zmc2V0ID09IGV4dGVudEJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBuZXdCYXNlID0gY3JlYXRlTGVn
YWN5RWRpdGluZ1Bvc2l0aW9uKGJhc2VCb3gtPnJlbmRlcmVyKCktPm5vZGUoKSwgYmFzZU9mZnNl
dCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib3ggPSBi
b3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYgYm94LT5iaWRpTGV2ZWwo
KSA+PSBiYXNlQm94LT5iaWRpTGV2ZWwoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0
aWMgYm9vbCBzd2FwQmFzZUZvckJpZGlXaGVuQmFzZUlzT25SaWdodEVkZ2VPZkJpZGlSdW4oSW5s
aW5lQm94KiBiYXNlQm94LCBpbnQgYmFzZU9mZnNldCwgSW5saW5lQm94KiBleHRlbnRCb3gsIGlu
dCBleHRlbnRPZmZzZXQsIFZpc2libGVQb3NpdGlvbiYgbmV3QmFzZSkKK3sKKyAgICBJbmxpbmVC
b3gqIGJveCA9IGJhc2VCb3g7CisgICAgZG8geworICAgICAgICBpZiAoYm94ID09IGV4dGVudEJv
eCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGV4dGVudCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBj
dXJyZW50IHJ1biwgZG8gbm90IHN3YXAuCisgICAgICAgICAgICBpZiAoKCFib3gtPnByZXZMZWFm
Q2hpbGQoKSB8fCBib3gtPnByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBib3gtPmJpZGlM
ZXZlbCgpKSAmJiBleHRlbnRPZmZzZXQgPT0gZXh0ZW50Qm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbmV3QmFzZSA9
IGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihiYXNlQm94LT5yZW5kZXJlcigpLT5ub2RlKCks
IGJhc2VPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAg
ICAgYm94ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgfSB3aGlsZSAoYm94ICYmIGJveC0+
YmlkaUxldmVsKCkgPj0gYmFzZUJveC0+YmlkaUxldmVsKCkpOworICAgIHJldHVybiBmYWxzZTsK
K30KKworc3RhdGljIGJvb2wgc3dhcEJhc2VGb3JCaWRpU3VwcG9ydChjb25zdCBWaXNpYmxlUG9z
aXRpb24mIGJhc2UsIGNvbnN0IFZpc2libGVQb3NpdGlvbiYgZXh0ZW50LCBWaXNpYmxlUG9zaXRp
b24mIG5ld0Jhc2UsIFZpc2libGVQb3NpdGlvbiYgbmV3RXh0ZW50KQoreworICAgIElubGluZUJv
eCogYmFzZUJveCA9IDA7CisgICAgaW50IGJhc2VPZmZzZXQgPSAwOworICAgIGJhc2UuZ2V0SW5s
aW5lQm94QW5kT2Zmc2V0KGJhc2VCb3gsIGJhc2VPZmZzZXQpOworCisgICAgSW5saW5lQm94KiBl
eHRlbnRCb3ggPSAwOworICAgIGludCBleHRlbnRPZmZzZXQgPSAwOworICAgIGV4dGVudC5nZXRJ
bmxpbmVCb3hBbmRPZmZzZXQoZXh0ZW50Qm94LCBleHRlbnRPZmZzZXQpOworICAgIGlmICghYmFz
ZUJveCB8fCAhZXh0ZW50Qm94IHx8IChiYXNlQm94ID09IGV4dGVudEJveCAmJiBiYXNlT2Zmc2V0
ID09IGV4dGVudE9mZnNldCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG5ld0Jhc2Ug
PSBiYXNlOworICAgIG5ld0V4dGVudCA9IGV4dGVudDsKKworICAgIGlmIChiYXNlT2Zmc2V0ID09
IGJhc2VCb3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgeworICAgICAgICBJbmxpbmVCb3gqIHBy
ZXZCb3ggPSBiYXNlQm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghcHJldkJveCB8
fCBwcmV2Qm94LT5iaWRpTGV2ZWwoKSA8IGJhc2VCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAg
ICAgcmV0dXJuIHN3YXBCYXNlRm9yQmlkaVdoZW5CYXNlSXNPbkxlZnRFZGdlT2ZCaWRpUnVuKGJh
c2VCb3gsIGJhc2VPZmZzZXQsIGV4dGVudEJveCwgZXh0ZW50T2Zmc2V0LCBuZXdCYXNlKTsKKyAg
ICAgICAgaWYgKHByZXZCb3gtPmJpZGlMZXZlbCgpID4gYmFzZUJveC0+YmlkaUxldmVsKCkpCisg
ICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJc09uUmlnaHRFZGdlT2ZC
aWRpUnVuKHByZXZCb3gsIHByZXZCb3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCksIGV4dGVudEJv
eCwgZXh0ZW50T2Zmc2V0LCBuZXdCYXNlKTsKKyAgICB9CisKKyAgICBpZiAoYmFzZU9mZnNldCA9
PSBiYXNlQm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCog
bmV4dEJveCA9IGJhc2VCb3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFuZXh0Qm94
IHx8IG5leHRCb3gtPmJpZGlMZXZlbCgpIDwgYmFzZUJveC0+YmlkaUxldmVsKCkpCisgICAgICAg
ICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJc09uUmlnaHRFZGdlT2ZCaWRpUnVu
KGJhc2VCb3gsIGJhc2VPZmZzZXQsIGV4dGVudEJveCwgZXh0ZW50T2Zmc2V0LCBuZXdCYXNlKTsK
KyAgICAgICAgaWYgKG5leHRCb3gtPmJpZGlMZXZlbCgpID4gYmFzZUJveC0+YmlkaUxldmVsKCkp
CisgICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JCaWRpV2hlbkJhc2VJc09uTGVmdEVkZ2VP
ZkJpZGlSdW4obmV4dEJveCwgbmV4dEJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpLCBleHRlbnRC
b3gsIGV4dGVudE9mZnNldCwgbmV3QmFzZSk7CisgICAgfQorCisgICAgaWYgKGV4dGVudE9mZnNl
dCA9PSBleHRlbnRCb3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgeworICAgICAgICBJbmxpbmVC
b3gqIHByZXZCb3ggPSBleHRlbnRCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFw
cmV2Qm94IHx8IHByZXZCb3gtPmJpZGlMZXZlbCgpIDwgZXh0ZW50Qm94LT5iaWRpTGV2ZWwoKSkK
KyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZvckJpZGlXaGVuQmFzZUlzT25MZWZ0RWRnZU9m
QmlkaVJ1bihleHRlbnRCb3gsIGV4dGVudE9mZnNldCwgYmFzZUJveCwgYmFzZU9mZnNldCwgbmV3
RXh0ZW50KTsKKyAgICAgICAgaWYgKHByZXZCb3gtPmJpZGlMZXZlbCgpID4gZXh0ZW50Qm94LT5i
aWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZvckJpZGlXaGVuQmFzZUlz
T25SaWdodEVkZ2VPZkJpZGlSdW4ocHJldkJveCwgcHJldkJveC0+Y2FyZXRSaWdodG1vc3RPZmZz
ZXQoKSwgYmFzZUJveCwgYmFzZU9mZnNldCwgbmV3RXh0ZW50KTsKKyAgICB9CisKKyAgICBpZiAo
ZXh0ZW50T2Zmc2V0ID09IGV4dGVudEJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkgeworICAg
ICAgICBJbmxpbmVCb3gqIG5leHRCb3ggPSBleHRlbnRCb3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAg
ICAgICAgaWYgKCFuZXh0Qm94IHx8IG5leHRCb3gtPmJpZGlMZXZlbCgpIDwgZXh0ZW50Qm94LT5i
aWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBzd2FwQmFzZUZvckJpZGlXaGVuQmFzZUlz
T25SaWdodEVkZ2VPZkJpZGlSdW4oZXh0ZW50Qm94LCBleHRlbnRPZmZzZXQsIGJhc2VCb3gsIGJh
c2VPZmZzZXQsIG5ld0V4dGVudCk7CisgICAgICAgIGlmIChuZXh0Qm94LT5iaWRpTGV2ZWwoKSA+
IGV4dGVudEJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gc3dhcEJhc2VGb3JC
aWRpV2hlbkJhc2VJc09uTGVmdEVkZ2VPZkJpZGlSdW4obmV4dEJveCwgbmV4dEJveC0+Y2FyZXRM
ZWZ0bW9zdE9mZnNldCgpLCBiYXNlQm94LCBiYXNlT2Zmc2V0LCBuZXdFeHRlbnQpOworICAgIH0K
KworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0Tm9uRGly
ZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWRO
ZXdTZWxlY3Rpb24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSwKKyAgICBFbmRQb2ludHNB
ZGp1c3RtZW50TW9kZSBlbmRwb2ludHNBZGp1c3RtZW50TW9kZSkKK3sKICAgICBWaXNpYmxlU2Vs
ZWN0aW9uIG5ld1NlbGVjdGlvbiA9IHBhc3NlZE5ld1NlbGVjdGlvbjsKKyAgICBib29sIGlzRGly
ZWN0aW9uYWwgPSBzaG91bGRBbHdheXNVc2VEaXJlY3Rpb25hbFNlbGVjdGlvbihtX2ZyYW1lKSB8
fCBuZXdTZWxlY3Rpb24uaXNEaXJlY3Rpb25hbCgpOwogCi0gICAgaWYgKHNob3VsZEFsd2F5c1Vz
ZURpcmVjdGlvbmFsU2VsZWN0aW9uKG1fZnJhbWUpKQotICAgICAgICBuZXdTZWxlY3Rpb24uc2V0
SXNEaXJlY3Rpb25hbCh0cnVlKTsKKyAgICB7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBiYXNl
ID0gbV9vcmlnaW5hbEJhc2UuaXNOb3ROdWxsKCkgPyBtX29yaWdpbmFsQmFzZSA6IG1fc2VsZWN0
aW9uLnZpc2libGVCYXNlKCk7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBuZXdCYXNlOworICAg
ICAgICBWaXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50OworICAgICAgICBpZiAoZW5kcG9pbnRzQWRq
dXN0bWVudE1vZGUgPT0gQWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkgJiYgc3dhcEJhc2VG
b3JCaWRpU3VwcG9ydChiYXNlLCBuZXdTZWxlY3Rpb24udmlzaWJsZUV4dGVudCgpLCBuZXdCYXNl
LCBuZXdFeHRlbnQpKSB7CisgICAgICAgICAgICBtX29yaWdpbmFsQmFzZSA9IGJhc2U7CisgICAg
ICAgICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZShuZXdCYXNlKTsKKyAgICAgICAgICAgIG5ld1Nl
bGVjdGlvbi5zZXRFeHRlbnQobmV3RXh0ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChtX29yaWdp
bmFsQmFzZS5pc05vdE51bGwoKSkgeworICAgICAgICAgICAgaWYgKG1fc2VsZWN0aW9uLmJhc2Uo
KSA9PSBuZXdTZWxlY3Rpb24uYmFzZSgpKQorICAgICAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5z
ZXRCYXNlKG1fb3JpZ2luYWxCYXNlKTsKKyAgICAgICAgICAgIG1fb3JpZ2luYWxCYXNlLmNsZWFy
KCk7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBpZiAoc2VsZWN0aW9uLT5zZWxlY3Rpb24oKSA9
PSBuZXdTZWxlY3Rpb24gfHwgIXNlbGVjdGlvbi0+c2hvdWxkQ2hhbmdlU2VsZWN0aW9uKG5ld1Nl
bGVjdGlvbikpCisgICAgLy8gQWRqdXN0aW5nIGJhc2UgYW5kIGV4dGVudCB3aWxsIG1ha2UgdGhp
cyBzZWxlY3Rpb24gYWx3YXlzIGRpcmVjdGlvbmFsCisgICAgbmV3U2VsZWN0aW9uLnNldElzRGly
ZWN0aW9uYWwoaXNEaXJlY3Rpb25hbCk7CisgICAgaWYgKG1fc2VsZWN0aW9uID09IG5ld1NlbGVj
dGlvbiB8fCAhc2hvdWxkQ2hhbmdlU2VsZWN0aW9uKG5ld1NlbGVjdGlvbikpCiAgICAgICAgIHJl
dHVybjsKIAogICAgIHNldFNlbGVjdGlvbihuZXdTZWxlY3Rpb24sIGdyYW51bGFyaXR5KTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVNlbGVjdGlvbi5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVNlbGVjdGlvbi5oCShyZXZpc2lvbiA5
MzQ0MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVNlbGVjdGlvbi5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC02OSw2ICs2OSw4IEBACiAgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHZp
c2libGVTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX3N0YXJ0LCBpc1Jh
bmdlKCkgPyBET1dOU1RSRUFNIDogYWZmaW5pdHkoKSk7IH0KICAgICBWaXNpYmxlUG9zaXRpb24g
dmlzaWJsZUVuZCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2VuZCwgaXNSYW5n
ZSgpID8gVVBTVFJFQU0gOiBhZmZpbml0eSgpKTsgfQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNp
YmxlQmFzZSgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2Jhc2UsIGlzUmFuZ2Uo
KSA/IChpc0Jhc2VGaXJzdCgpID8gVVBTVFJFQU0gOiBET1dOU1RSRUFNKSA6IGFmZmluaXR5KCkp
OyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFeHRlbnQoKSBjb25zdCB7IHJldHVybiBW
aXNpYmxlUG9zaXRpb24obV9leHRlbnQsIGlzUmFuZ2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gRE9X
TlNUUkVBTSA6IFVQU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CiAKICAgICBib29sIGlzTm9uZSgp
IGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBOb1NlbGVjdGlvbjsgfQogICAgIGJv
b2wgaXNDYXJldCgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBDYXJldFNlbGVj
dGlvbjsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaAkocmV2
aXNpb24gOTM0NDMpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTIyMyw3ICsyMjMsOCBAQAogCiAgICAgYm9vbCBzaG91bGRDaGFu
Z2VTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0OwogICAgIGJvb2wgc2hv
dWxkRGVsZXRlU2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mKSBjb25zdDsKLSAgICB2
b2lkIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoRnJhbWVTZWxlY3Rpb24qLCBj
b25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5KTsKKyAgICBlbnVtIEVuZFBv
aW50c0FkanVzdG1lbnRNb2RlIHsgQWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnksIERvTm90
QWRqc3V0RW5kcG9pbnRzIH07CisgICAgdm9pZCBzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklm
TmVlZGVkKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mLCBUZXh0R3JhbnVsYXJpdHksIEVuZFBvaW50
c0FkanVzdG1lbnRNb2RlID0gRG9Ob3RBZGpzdXRFbmRwb2ludHMpOwogICAgIHZvaWQgc2V0Rm9j
dXNlZE5vZGVJZk5lZWRlZCgpOwogICAgIHZvaWQgbm90aWZ5UmVuZGVyZXJPZlNlbGVjdGlvbkNo
YW5nZShFVXNlclRyaWdnZXJlZCk7CiAKQEAgLTI4MCw2ICsyODEsNyBAQAogICAgIExheW91dFVu
aXQgbV94UG9zRm9yVmVydGljYWxBcnJvd05hdmlnYXRpb247CiAKICAgICBWaXNpYmxlU2VsZWN0
aW9uIG1fc2VsZWN0aW9uOworICAgIFZpc2libGVQb3NpdGlvbiBtX29yaWdpbmFsQmFzZTsgLy8g
VXNlZCB0byBzdG9yZSBiYXNlIGJlZm9yZSB0aGUgYWRqdXN0bWVudCBhdCBiaWRpIGJvdW5kYXJ5
CiAgICAgVGV4dEdyYW51bGFyaXR5IG1fZ3JhbnVsYXJpdHk7CiAKICAgICBSZWZQdHI8RWRpdGlu
Z1N0eWxlPiBtX3R5cGluZ1N0eWxlOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhh
bmRsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVy
LmNwcAkocmV2aXNpb24gOTM0NDMpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4Nyw3ICsyODcsNyBAQAogICAgICAgICBtX3NlbGVj
dGlvbkluaXRpYXRpb25TdGF0ZSA9IFBsYWNlZENhcmV0OwogICAgIH0KIAotICAgIG1fZnJhbWUt
PnNlbGVjdGlvbigpLT5zZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKG1fZnJhbWUt
PnNlbGVjdGlvbigpLCBuZXdTZWxlY3Rpb24sIGdyYW51bGFyaXR5KTsKKyAgICBtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rp
b24sIGdyYW51bGFyaXR5KTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtNjkwLDcgKzY5MCw4
IEBACiAgICAgaWYgKG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpICE9IENoYXJh
Y3RlckdyYW51bGFyaXR5KQogICAgICAgICBuZXdTZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxh
cml0eShtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7CiAKLSAgICBtX2ZyYW1l
LT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChtX2ZyYW1l
LT5zZWxlY3Rpb24oKSwgbmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSk7CisgICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2Vs
ZWN0aW9uSWZOZWVkZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSwKKyAgICAgICAgRnJhbWVTZWxlY3Rpb246OkFkanVzdEVuZHBvaW50c0F0QmlkaUJv
dW5kYXJ5KTsKIH0KICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQogCkluZGV4OiBMYXlv
dXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1
bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVj
dGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDkwIEBACitUaGlzIHRlc3QgZW5zdXJlcyBXZWJLaXQgbGV0cyB1c2VyIHNlbGVjdCBiaWRpcmVj
dGlvbmFsIHRleHQgaW50dWl0aXZlbHkuIFRvIG1hbnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGlu
IGJsdWUgYm94IGluIGVhY2ggdGVzdCBjYXNlIGJlbG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxl
ZnQgdG8gcmlnaHQuIFRoZSBjaGFuZ2VzIGluIHRoZSBzZWxlY3RlZCB0ZXh0IHNob3VsZCBtYXRj
aCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8LiBEbyB0aGUgc2FtZSBieSBhIG1vdXNlIGRyYWcg
ZnJvbSByaWdodCB0byBsZWZ0IGFuZCBleHBlY3RhdGlvbnMgYXJlIGFmdGVyIHwuCisKK1NlbGVj
dGVkIHRleHQ6CithYmPXkNeR15IKK2EgYWIgYWJjIGFiY0FCIGFiY0EgYWJjQUJDIHwgQSBBQiBB
QkMgY0FCQyBiY0FCQyBhYmNBQkMKK9eQ15HXkmRlZgorQyBCQyBBQkMgQUJDZCBBQkNlZiBBQkNk
ZWYgfCBmIGVmIGRlZiBCQ2RlZiBDZGVmIEFCQ2RlZgorYWJj15DXkdeSZGVmCitDIEJDIEFCQyB8
IEEgQUIgQUJDCivXkNeR15JkZWYKK0MgQkMgQUJDIHwgQSBBQiBBQkMKK9eQ15HXkmRlZiDXkNeR
15JkZWYKK2UgZWYgfCBmIGVmCithYmPXkNeR15IgYWJj15DXkdeSCitCIEFCIHwgQSBBQgorVGVz
dCAiYWJjQUJDIiBpbiAiYWJjQUJDIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BB
U1Mgc2VsZWN0ZWQgImEiCitQQVNTIHNlbGVjdGVkICJhYiIKK1BBU1Mgc2VsZWN0ZWQgImFiYyIK
K1BBU1Mgc2VsZWN0ZWQgImFiY0FCIgorUEFTUyBzZWxlY3RlZCAiYWJjQSIKK1BBU1Mgc2VsZWN0
ZWQgImFiY0FCQyIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQg
IkEiCitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKK1BBU1Mgc2VsZWN0
ZWQgImNBQkMiCitQQVNTIHNlbGVjdGVkICJiY0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImFiY0FCQyIK
KworVGVzdCAiQUJDZGVmIiBpbiAiQUJDZGVmIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmln
aHQKK1BBU1Mgc2VsZWN0ZWQgIkMiCitQQVNTIHNlbGVjdGVkICJCQyIKK1BBU1Mgc2VsZWN0ZWQg
IkFCQyIKK1BBU1Mgc2VsZWN0ZWQgIkFCQ2QiCitGQUlMIHNlbGVjdGVkICJBQkNkZSIgYnV0IGV4
cGVjdGVkICJBQkNlZiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQ2RlZiIKK1NlbGVjdGluZyBmcm9tIHJp
Z2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgImYiCitQQVNTIHNlbGVjdGVkICJlZiIKK1BBU1Mg
c2VsZWN0ZWQgImRlZiIKK1BBU1Mgc2VsZWN0ZWQgIkJDZGVmIgorUEFTUyBzZWxlY3RlZCAiQ2Rl
ZiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQ2RlZiIKKworVGVzdCAiQUJDIiBpbiAiYWJjQUJDZGVmIjoK
K1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkMiCitQQVNTIHNl
bGVjdGVkICJCQyIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRv
IGxlZnQKK1BBU1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0
ZWQgIkFCQyIKKworVGVzdCAiQUJDIiBpbiAiQUJDZGVmIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQg
dG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkMiCitQQVNTIHNlbGVjdGVkICJCQyIKK1BBU1Mgc2Vs
ZWN0ZWQgIkFCQyIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQg
IkEiCitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKKworVGVzdCAiZWYi
IGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3Rl
ZCAiZSIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAor
UEFTUyBzZWxlY3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorCitUZXN0ICJBQiIgaW4gImFi
Y0FCQyI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJCIgor
UEFTUyBzZWxlY3RlZCAiQUIiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNl
bGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCisKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2Vk
IGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCisKKworCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0
aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRtbAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRtbAkocmV2aXNpb24gMCkK
KysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5odG1sCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEzNSBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbD4KKzxo
ZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iY29udGVudC10eXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7
IGNoYXJzZXQ9dXRmLTgiPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9mYXN0
L2pzL3Jlc291cmNlcy9qcy10ZXN0LXN0eWxlLmNzcyI+Cis8c2NyaXB0IHNyYz0iLi4vLi4vZmFz
dC9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPHN0eWxlIHR5cGU9InRl
eHQvY3NzIj4KKyN0ZXN0cyB7IGZvbnQtc2l6ZTogMi41ZW07IHBhZGRpbmc6IDBweDsgbWFyZ2lu
OiAwcHg7IH0KK2R0IHsgd2lkdGg6IDE1ZXg7IHBhZGRpbmc6IDBweCAxMHB4OyBtYXJnaW46IDBw
eDsgfQorZGQgeyBmb250LXNpemU6IDAuNmVtOyBtYXJnaW46IDBweDsgcGFkZGluZzogMHB4IDEw
cHg7IH0KKy50YXJnZXQgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjYmJlZWZmOyB9Cis8L3N0eWxlPgor
PC9oZWFkPgorPGJvZHk+Cis8cD5UaGlzIHRlc3QgZW5zdXJlcyBXZWJLaXQgbGV0cyB1c2VyIHNl
bGVjdCBiaWRpcmVjdGlvbmFsIHRleHQgaW50dWl0aXZlbHkuCitUbyBtYW51YWxseSB0ZXN0LCBz
ZWxlY3QgdGV4dCBpbiBibHVlIGJveCBpbiBlYWNoIHRlc3QgY2FzZSBiZWxvdyBieSBhIG1vdXNl
IGRyYWcgZnJvbSBsZWZ0IHRvIHJpZ2h0LgorVGhlIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGVkIHRl
eHQgc2hvdWxkIG1hdGNoIHRoZSBleHBlY3RhdGlvbnMgYmVmb3JlIHwuCitEbyB0aGUgc2FtZSBi
eSBhIG1vdXNlIGRyYWcgZnJvbSByaWdodCB0byBsZWZ0IGFuZCBleHBlY3RhdGlvbnMgYXJlIGFm
dGVyIHwuPC9wPgorPGRpdj5TZWxlY3RlZCB0ZXh0OiA8c3BhbiBpZD0ibG9nIj48L3NwYW4+PC9k
aXY+Cis8ZGwgaWQ9InRlc3RzIj4KKzxkdCBjb250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9InRh
cmdldCI+YWJj15DXkdeSPC9zcGFuPjwvZHQ+Cis8ZGQ+YSBhYiBhYmMgYWJjQUIgYWJjQSBhYmNB
QkMgfCBBIEFCIEFCQyBjQUJDIGJjQUJDIGFiY0FCQzwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFi
bGU+PHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeSZGVmPC9zcGFuPjwvZHQ+Cis8ZGQ+QyBCQyBB
QkMgQUJDZCBBQkNlZiBBQkNkZWYgfCBmIGVmIGRlZiBCQ2RlZiBDZGVmIEFCQ2RlZjwvZGQ+CisK
KzxkdCBjb250ZW50ZWRpdGFibGU+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeSPC9zcGFu
PmRlZjwvZHQ+Cis8ZGQ+QyBCQyBBQkMgfCBBIEFCIEFCQzwvZGQ+CisKKzxkdCBkaXI9InJ0bCIg
Y29udGVudGVkaXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkjwvc3Bhbj5kZWY8L2R0
PgorPGRkPkMgQkMgQUJDIHwgQSBBQiBBQkM8L2RkPgorCis8IS0tPGR0IGNvbnRlbnRlZGl0YWJs
ZT7XnNep16AgMjAwOSAtIDUxNjwvZHQ+Cis8ZGQ+QyBCQyBBQkMgfCBBIEFCIEFCQzwvZGQ+LS0+
CisKKzwhLS0gV29yayBhcm91bmQgYSBXZWJLaXQgYnVnIHRoYXQgaGl0LXRlc3RpbmcgZG9lc24n
dCB3b3JrIHByb3BlcnR5IHdpdGggc3BhbiBtaXhlZCB3aXRoIGJpZGlyZWN0aW9uYWwgdGV4dAor
Ynkgb3ZlcmxhcHBpbmcgdHdvIHNwYW5zLCBvbmUgdXNlZCBmb3IgYWN0dWFsIHRlc3RpbmcgYW5k
IGFub3RoZXIgb25lIHByb3ZpZGluZyB0aGUgYmx1ZSBiYWNrZ3JvdW5kIGNvbG9yLiAtLT4KKzxk
dCBkaXI9InJ0bCIgc3R5bGU9InBvc2l0aW9uOiByZWxhdGl2ZTsiPteQ15HXkmRlZgorPHNwYW4g
c3R5bGU9InBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDEwcHg7IHotaW5kZXg6IC0xOyBjb2xv
cjogdHJhbnNwYXJlbnQ7Ij7XkNeR15JkPHNwYW4gY2xhc3M9InRhcmdldCI+ZWY8L3NwYW4+PC9z
cGFuPjwvZHQ+Cis8ZGQ+ZSBlZiB8IGYgZWY8L2RkPgorCis8ZHQgc3R5bGU9InBvc2l0aW9uOiBy
ZWxhdGl2ZTsiIGNvbnRlbnRlZGl0YWJsZT5hYmPXkNeR15IKKzxzcGFuIHN0eWxlPSJwb3NpdGlv
bjogYWJzb2x1dGU7IGxlZnQ6IDEwcHg7IHotaW5kZXg6IC0xOyBjb2xvcjogdHJhbnNwYXJlbnQ7
Ij5hYmM8c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeRPC9zcGFuPteSPC9zcGFuPjwvZHQ+Cis8ZGQ+
QiBBQiB8IEEgQUI8L2RkPgorCis8IS0tPGR0IGNvbnRlbnRlZGl0YWJsZT5h16fXnDEy15nXnWQ8
L2R0PjxkZD5bMCAxIDYgMyA0IDUgMiA3IDhdIEwoYSBSKEFCIEwoMTIpIENEKSBiKTwvZGQ+Cis8
ZHQgY29udGVudGVkaXRhYmxlPjxzcGFuIGRpcj0icnRsIj4xMjxiPten15w0MzwvYj48L3NwYW4+
YWI8L2R0PgorPGRkPls0IDUgNiAzIDAgMSAoMiA2KSA3IDhdIEwoUntMKDEyKSBBQiBMKDM0KX0g
YWIpPC9kZD4KKzxkdCBjb250ZW50ZWRpdGFibGUgZGlyPSJydGwiPjxzcGFuIGRpcj0ibHRyIj5h
YmPXnNep16A8L3NwYW4+PC9kdD4KKzxkZD5bNiAxIDIgNiA1IDQgM10gUihMe2FiYyBSKENCQSl9
KTwvZGQ+LS0+Cis8L2RsPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cis8cHJlPjxzY3JpcHQ+
Cit2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKTsKKworU3RyaW5n
LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKCkgeworICAgIHZhciByZXN1bHQgPSAnJzsKKyAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNv
ZGUgPSB0aGlzLmNoYXJDb2RlQXQoaSk7CisgICAgICAgIGlmICgweDA1ZDAgPD0gY29kZSAmJiBj
b2RlIDw9IDB4MDVlYSkvLyBIZWJyZXcgQWxlZgorICAgICAgICAgICAgY29kZSArPSAtMHgwNWQw
ICsgJ0EnLmNoYXJDb2RlQXQoMCk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJD
b2RlKGNvZGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitmdW5jdGlvbiBhc3Nl
cnRFcXVhbChleHBlY3RlZCwgYWN0dWFsKSB7CisgICAgZG9jdW1lbnQud3JpdGVsbignRTonICsg
ZXhwZWN0ZWQgKyAnIEE6JyArIGFjdHVhbCk7Cit9CisKK2Z1bmN0aW9uIHNlbGVjdEJ5TW91c2VE
cmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgbGVmdFRvUmlnaHQsIGV4cGVjdGF0aW9ucykgewor
ICAgIHZhciB5ID0gdGFyZ2V0Lm9mZnNldFRvcCArIHRhcmdldC5vZmZzZXRIZWlnaHQgLyAyOwor
ICAgIHZhciBsZWZ0ID0gdGFyZ2V0Lm9mZnNldExlZnQ7CisKKyAgICBpZiAodGFyZ2V0LnBhcmVu
dE5vZGUucGFyZW50Tm9kZS5zdHlsZS5wb3NpdGlvbiA9PSAncmVsYXRpdmUnKSB7CisgICAgICAg
IGxlZnQgKz0gdGFyZ2V0LnBhcmVudE5vZGUub2Zmc2V0TGVmdCArIHRhcmdldC5wYXJlbnROb2Rl
LnBhcmVudE5vZGUub2Zmc2V0TGVmdDsKKyAgICAgICAgeSArPSB0YXJnZXQucGFyZW50Tm9kZS5v
ZmZzZXRUb3AgKyB0YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldFRvcDsKKyAgICB9
CisKKyAgICB2YXIgc3RhcnRYID0gbGVmdCArIChsZWZ0VG9SaWdodCA/IDAgOiB0YXJnZXQub2Zm
c2V0V2lkdGgpOworICAgIGV2ZW50U2VuZGVyLmRyYWdNb2RlID0gZmFsc2U7CisgICAgZXZlbnRT
ZW5kZXIubGVhcEZvcndhcmQoMzAwMCk7CisgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oc3Rh
cnRYLCB5KTsKKyAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKworICAgIHZhciBwcmV2aW91
c1NlbGVjdGVkVGV4dCA9ICcnOworICAgIHZhciBqID0gMDsKKyAgICB2YXIgeEluY3JlbWVudCA9
IGxlZnRUb1JpZ2h0ID8gMSA6IC0xOworICAgIGZvciAodmFyIHggPSBzdGFydFg7IGxlZnQgPD0g
eCAmJiB4IDw9IGxlZnQgKyB0YXJnZXQub2Zmc2V0V2lkdGg7IHggKz0geEluY3JlbWVudCkgewor
ICAgICAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgxMDApOworICAgICAgICBldmVudFNlbmRl
ci5tb3VzZU1vdmVUbyh4LCB5KTsKKworICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gd2luZG93
LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkuZm9sZCgpOworICAgICAgICBpZiAocHJldmlvdXNT
ZWxlY3RlZFRleHQgIT0gc2VsZWN0ZWRUZXh0KSB7CisgICAgICAgICAgICBpZiAoZXhwZWN0YXRp
b25zW2pdID09IHNlbGVjdGVkVGV4dCkKKyAgICAgICAgICAgICAgICB0ZXN0UGFzc2VkKCdzZWxl
Y3RlZCAiJyArIHNlbGVjdGVkVGV4dCArICciJyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgdGVzdEZhaWxlZCgnc2VsZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAnIiBidXQg
ZXhwZWN0ZWQgIicgKyBleHBlY3RhdGlvbnNbal0gKyAnIicpOworICAgICAgICAgICAgcHJldmlv
dXNTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CisgICAgICAgICAgICBqKys7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Cit9CisKK2lmICh3aW5kb3cu
bGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNU
ZXh0KCk7CisKKyAgICB2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMn
KS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZHQnKTsKKyAgICB2YXIgdGVzdEV4cGVjdGF0aW9ucyA9
IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdk
ZCcpOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdHMubGVuZ3RoOyBpKyspIHsKKyAgICAg
ICAgdmFyIHRhcmdldCA9IHRlc3RzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhcmdldCcp
WzBdOworICAgICAgICB2YXIgdGVzdEV4cGVjdGF0aW9uID0gdGVzdEV4cGVjdGF0aW9uc1tpXS50
ZXh0Q29udGVudDsKKworICAgICAgICBkZWJ1ZygnVGVzdCAiJyArIHRhcmdldC50ZXh0Q29udGVu
dC5mb2xkKCkgKyAnIiBpbiAiJyArIHRhcmdldC5wYXJlbnROb2RlLnRleHRDb250ZW50LmZvbGQo
KSArICciOicpOworICAgICAgICBkZWJ1ZygnU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodCcp
OworICAgICAgICBzZWxlY3RCeU1vdXNlRHJhZ0FuZFZlcmlmeVJlc3VsdCh0YXJnZXQsIHRydWUs
IHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwvKVswXS50cmltKCkuc3BsaXQoL1xzKy8pKTsKKyAg
ICAgICAgZGVidWcoJ1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQnKTsKKyAgICAgICAgc2Vs
ZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCBmYWxzZSwgdGVzdEV4cGVjdGF0
aW9uLnNwbGl0KC9cfC8pWzFdLnRyaW0oKS5zcGxpdCgvXHMrLykpOworICAgICAgICBkZWJ1Zygn
Jyk7CisgICAgfQorfSBlbHNlIHsKKyAgICBkZWJ1ZygnVGhpcyB0ZXN0IHJlcXVpcmVzIGV2ZW50
U2VuZGVyJyk7CisgICAgZG9jdW1lbnQub25zZWxlY3Rpb25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7
CisgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKS50ZXh0Q29udGVudCA9IHdp
bmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmZvbGQoKTsKKyAgICB9Cit9CisKK3ZhciBz
dWNjZXNzZnVsbHlQYXJzZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8u
Li9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5Pgor
PC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>104862</attachid>
            <date>2011-08-23 10:21:40 -0700</date>
            <delta_ts>2011-09-08 20:31:04 -0700</delta_ts>
            <desc>work in progress 4</desc>
            <filename>wip57340d</filename>
            <type>text/plain</type>
            <size>26608</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBl
Y3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2Vs
ZWN0LWJpZGktcnVuLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Vk
aXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsOTEgQEAKK1RoaXMgdGVzdCBlbnN1cmVzIFdlYktpdCBsZXRzIHVzZXIgc2Vs
ZWN0IGJpZGlyZWN0aW9uYWwgdGV4dCBpbnR1aXRpdmVseS4gVG8gbWFudWFsbHkgdGVzdCwgc2Vs
ZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0IGNhc2UgYmVsb3cgYnkgYSBtb3VzZSBk
cmFnIGZyb20gbGVmdCB0byByaWdodC4gVGhlIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGVkIHRleHQg
c2hvdWxkIG1hdGNoIHRoZSBleHBlY3RhdGlvbnMgYmVmb3JlIHwuIERvIHRoZSBzYW1lIGJ5IGEg
bW91c2UgZHJhZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5kIGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIg
fC4KKworU2VsZWN0ZWQgdGV4dDoKK2FiY9eQ15HXkgorYSBhYiBhYmMgYWJjQUIgYWJjQSBhYmNB
QkMgfCBBIEFCIEFCQyBjQUJDIGJjQUJDIGFiY0FCQwor15DXkdeSZGVmCitDIEJDIEFCQyBBQkNk
IEFCQ2VmIEFCQ2RlZiB8IGYgZWYgZGVmIEJDZGVmIENkZWYgQUJDZGVmCithYmPXkNeR15JkZWYK
K0MgQkMgQUJDIHwgQSBBQiBBQkMKK9eQ15HXkmRlZgorQyBCQyBBQkMgfCBBIEFCIEFCQwor15DX
kdeSZGVmINeQ15HXkmRlZgorZSBlZiB8IGYgZWYKK2FiY9eQ15HXkiBhYmPXkNeR15IKK0IgQUIg
fCBBIEFCCitUZXN0ICJhYmNBQkMiIGluICJhYmNBQkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0
byByaWdodAorUEFTUyBzZWxlY3RlZCAiYSIKK1BBU1Mgc2VsZWN0ZWQgImFiIgorUEFTUyBzZWxl
Y3RlZCAiYWJjIgorUEFTUyBzZWxlY3RlZCAiYWJjQUIiCitQQVNTIHNlbGVjdGVkICJhYmNBIgor
UEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFT
UyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgor
UEFTUyBzZWxlY3RlZCAiY0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImJjQUJDIgorUEFTUyBzZWxlY3Rl
ZCAiYWJjQUJDIgorCitUZXN0ICJBQkNkZWYiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20g
bGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFT
UyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiQUJDZCIKK0ZBSUwgc2VsZWN0ZWQgIkFC
Q2RlIiBidXQgZXhwZWN0ZWQgIkFCQ2VmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorU2VsZWN0
aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQg
ImVmIgorUEFTUyBzZWxlY3RlZCAiZGVmIgorUEFTUyBzZWxlY3RlZCAiQkNkZWYiCitQQVNTIHNl
bGVjdGVkICJDZGVmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorCitUZXN0ICJBQkMiIGluICJh
YmNBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAi
QyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZy
b20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgor
UEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJBQkMiIGluICJBQkNkZWYiOgorU2VsZWN0aW5n
IGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJD
IgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFT
UyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgor
CitUZXN0ICJlZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQ
QVNTIHNlbGVjdGVkICJlIgorUEFTUyBzZWxlY3RlZCAiZWYiCitTZWxlY3RpbmcgZnJvbSByaWdo
dCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAiZWYiCisKK1Rlc3Qg
IkFCIiBpbiAiYWJjQUJDIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2Vs
ZWN0ZWQgIkIiCitQQVNTIHNlbGVjdGVkICJBQiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxl
ZnQKK1BBU1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKKworUEFTUyBzdWNjZXNz
ZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKKworCisKKwpJbmRleDogTGF5
b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwJ
KHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlk
aS1ydW4uaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzUgQEAKKzwhRE9DVFlQRSBodG1s
PgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVu
dD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJl
Zj0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiPgorPHNjcmlwdCBz
cmM9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzxz
dHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisjdGVzdHMgeyBmb250LXNpemU6IDIuNWVtOyBwYWRkaW5n
OiAwcHg7IG1hcmdpbjogMHB4OyB9CitkdCB7IHdpZHRoOiAxNWV4OyBwYWRkaW5nOiAwcHggMTBw
eDsgbWFyZ2luOiAwcHg7IH0KK2RkIHsgZm9udC1zaXplOiAwLjZlbTsgbWFyZ2luOiAwcHg7IHBh
ZGRpbmc6IDBweCAxMHB4OyB9CisudGFyZ2V0IHsgYmFja2dyb3VuZC1jb2xvcjogI2JiZWVmZjsg
fQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhpcyB0ZXN0IGVuc3VyZXMgV2ViS2l0
IGxldHMgdXNlciBzZWxlY3QgYmlkaXJlY3Rpb25hbCB0ZXh0IGludHVpdGl2ZWx5LgorVG8gbWFu
dWFsbHkgdGVzdCwgc2VsZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0IGNhc2UgYmVs
b3cgYnkgYSBtb3VzZSBkcmFnIGZyb20gbGVmdCB0byByaWdodC4KK1RoZSBjaGFuZ2VzIGluIHRo
ZSBzZWxlY3RlZCB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8Lgor
RG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBkcmFnIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgZXhwZWN0
YXRpb25zIGFyZSBhZnRlciB8LjwvcD4KKzxkaXY+U2VsZWN0ZWQgdGV4dDogPHNwYW4gaWQ9Imxv
ZyI+PC9zcGFuPjwvZGl2PgorPGRsIGlkPSJ0ZXN0cyI+Cis8ZHQgY29udGVudGVkaXRhYmxlPjxz
cGFuIGNsYXNzPSJ0YXJnZXQiPmFiY9eQ15HXkjwvc3Bhbj48L2R0PgorPGRkPmEgYWIgYWJjIGFi
Y0FCIGFiY0EgYWJjQUJDIHwgQSBBQiBBQkMgY0FCQyBiY0FCQyBhYmNBQkM8L2RkPgorCis8ZHQg
Y29udGVudGVkaXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkmRlZjwvc3Bhbj48L2R0
PgorPGRkPkMgQkMgQUJDIEFCQ2QgQUJDZWYgQUJDZGVmIHwgZiBlZiBkZWYgQkNkZWYgQ2RlZiBB
QkNkZWY8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlPmFiYzxzcGFuIGNsYXNzPSJ0YXJnZXQi
PteQ15HXkjwvc3Bhbj5kZWY8L2R0PgorPGRkPkMgQkMgQUJDIHwgQSBBQiBBQkM8L2RkPgorCis8
ZHQgZGlyPSJydGwiIGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15I8
L3NwYW4+ZGVmPC9kdD4KKzxkZD5DIEJDIEFCQyB8IEEgQUIgQUJDPC9kZD4KKworPCEtLTxkdCBj
b250ZW50ZWRpdGFibGU+15zXqdegIDIwMDkgLSA1MTY8L2R0PgorPGRkPkMgQkMgQUJDIHwgQSBB
QiBBQkM8L2RkPi0tPgorCis8IS0tIFdvcmsgYXJvdW5kIGEgV2ViS2l0IGJ1ZyB0aGF0IGhpdC10
ZXN0aW5nIGRvZXNuJ3Qgd29yayBwcm9wZXJ0eSB3aXRoIHNwYW4gbWl4ZWQgd2l0aCBiaWRpcmVj
dGlvbmFsIHRleHQKK2J5IG92ZXJsYXBwaW5nIHR3byBzcGFucywgb25lIHVzZWQgZm9yIGFjdHVh
bCB0ZXN0aW5nIGFuZCBhbm90aGVyIG9uZSBwcm92aWRpbmcgdGhlIGJsdWUgYmFja2dyb3VuZCBj
b2xvci4gLS0+Cis8ZHQgZGlyPSJydGwiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7Ij7XkNeR
15JkZWYKKzxzcGFuIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyB6LWlu
ZGV4OiAtMTsgY29sb3I6IHRyYW5zcGFyZW50OyI+15DXkdeSZDxzcGFuIGNsYXNzPSJ0YXJnZXQi
PmVmPC9zcGFuPjwvc3Bhbj48L2R0PgorPGRkPmUgZWYgfCBmIGVmPC9kZD4KKworPGR0IHN0eWxl
PSJwb3NpdGlvbjogcmVsYXRpdmU7IiBjb250ZW50ZWRpdGFibGU+YWJj15DXkdeSCis8c3BhbiBz
dHlsZT0icG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAxMHB4OyB6LWluZGV4OiAtMTsgY29sb3I6
IHRyYW5zcGFyZW50OyI+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+15DXkTwvc3Bhbj7Xkjwvc3Bh
bj48L2R0PgorPGRkPkIgQUIgfCBBIEFCPC9kZD4KKworPCEtLTxkdCBjb250ZW50ZWRpdGFibGU+
Yden15wxMteZ151kPC9kdD48ZGQ+WzAgMSA2IDMgNCA1IDIgNyA4XSBMKGEgUihBQiBMKDEyKSBD
RCkgYik8L2RkPgorPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBkaXI9InJ0bCI+MTI8Yj7Xp9ec
NDM8L2I+PC9zcGFuPmFiPC9kdD4KKzxkZD5bNCA1IDYgMyAwIDEgKDIgNikgNyA4XSBMKFJ7TCgx
MikgQUIgTCgzNCl9IGFiKTwvZGQ+Cis8ZHQgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIj48c3Bh
biBkaXI9Imx0ciI+YWJj15zXqdegPC9zcGFuPjwvZHQ+Cis8ZGQ+WzYgMSAyIDYgNSA0IDNdIFIo
THthYmMgUihDQkEpfSk8L2RkPi0tPgorPC9kbD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2Pgor
PHByZT48c2NyaXB0PgordmFyIHRlc3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3Rz
Jyk7CisKK1N0cmluZy5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcmVz
dWx0ID0gJyc7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7Cisg
ICAgICAgIHZhciBjb2RlID0gdGhpcy5jaGFyQ29kZUF0KGkpOworICAgICAgICBpZiAoMHgwNWQw
IDw9IGNvZGUgJiYgY29kZSA8PSAweDA1ZWEpLy8gSGVicmV3IEFsZWYKKyAgICAgICAgICAgIGNv
ZGUgKz0gLTB4MDVkMCArICdBJy5jaGFyQ29kZUF0KDApOworICAgICAgICByZXN1bHQgKz0gU3Ry
aW5nLmZyb21DaGFyQ29kZShjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwor
ZnVuY3Rpb24gYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkgeworICAgIGRvY3VtZW50Lndy
aXRlbG4oJ0U6JyArIGV4cGVjdGVkICsgJyBBOicgKyBhY3R1YWwpOworfQorCitmdW5jdGlvbiBz
ZWxlY3RCeU1vdXNlRHJhZ0FuZFZlcmlmeVJlc3VsdCh0YXJnZXQsIGxlZnRUb1JpZ2h0LCBleHBl
Y3RhdGlvbnMpIHsKKyAgICB2YXIgeSA9IHRhcmdldC5vZmZzZXRUb3AgKyB0YXJnZXQub2Zmc2V0
SGVpZ2h0IC8gMjsKKyAgICB2YXIgbGVmdCA9IHRhcmdldC5vZmZzZXRMZWZ0OworCisgICAgaWYg
KHRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUuc3R5bGUucG9zaXRpb24gPT0gJ3JlbGF0aXZl
JykgeworICAgICAgICBsZWZ0ICs9IHRhcmdldC5wYXJlbnROb2RlLm9mZnNldExlZnQgKyB0YXJn
ZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLm9mZnNldExlZnQ7CisgICAgICAgIHkgKz0gdGFyZ2V0
LnBhcmVudE5vZGUub2Zmc2V0VG9wICsgdGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5vZmZz
ZXRUb3A7CisgICAgfQorCisgICAgdmFyIHN0YXJ0WCA9IGxlZnQgKyAobGVmdFRvUmlnaHQgPyAw
IDogdGFyZ2V0Lm9mZnNldFdpZHRoKTsKKyAgICBldmVudFNlbmRlci5kcmFnTW9kZSA9IGZhbHNl
OworICAgIGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDMwMDApOworICAgIGV2ZW50U2VuZGVyLm1v
dXNlTW92ZVRvKHN0YXJ0WCwgeSk7CisgICAgZXZlbnRTZW5kZXIubW91c2VEb3duKCk7CisKKyAg
ICB2YXIgcHJldmlvdXNTZWxlY3RlZFRleHQgPSAnJzsKKyAgICB2YXIgaiA9IDA7CisgICAgdmFy
IHhJbmNyZW1lbnQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsKKyAgICBmb3IgKHZhciB4ID0gc3Rh
cnRYOyBsZWZ0IDw9IHggJiYgeCA8PSBsZWZ0ICsgdGFyZ2V0Lm9mZnNldFdpZHRoOyB4ICs9IHhJ
bmNyZW1lbnQpIHsKKyAgICAgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAwKTsKKyAgICAg
ICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oeCwgeSk7CisKKyAgICAgICAgdmFyIHNlbGVjdGVk
VGV4dCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmZvbGQoKTsKKyAgICAgICAg
aWYgKHByZXZpb3VzU2VsZWN0ZWRUZXh0ICE9IHNlbGVjdGVkVGV4dCkgeworICAgICAgICAgICAg
aWYgKGV4cGVjdGF0aW9uc1tqXSA9PSBzZWxlY3RlZFRleHQpCisgICAgICAgICAgICAgICAgdGVz
dFBhc3NlZCgnc2VsZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAnIicpOworICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHRlc3RGYWlsZWQoJ3NlbGVjdGVkICInICsgc2VsZWN0ZWRU
ZXh0ICsgJyIgYnV0IGV4cGVjdGVkICInICsgZXhwZWN0YXRpb25zW2pdICsgJyInKTsKKyAgICAg
ICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OworICAgICAgICAgICAg
aisrOworICAgICAgICB9CisgICAgfQorCisgICAgZXZlbnRTZW5kZXIubW91c2VVcCgpOworfQor
CitpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgbGF5b3V0VGVzdENvbnRy
b2xsZXIuZHVtcEFzVGV4dCgpOworCisgICAgdmFyIHRlc3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVu
dEJ5SWQoJ3Rlc3RzJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2R0Jyk7CisgICAgdmFyIHRlc3RF
eHBlY3RhdGlvbnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKS5nZXRFbGVtZW50
c0J5VGFnTmFtZSgnZGQnKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsg
aSsrKSB7CisgICAgICAgIHZhciB0YXJnZXQgPSB0ZXN0c1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NO
YW1lKCd0YXJnZXQnKVswXTsKKyAgICAgICAgdmFyIHRlc3RFeHBlY3RhdGlvbiA9IHRlc3RFeHBl
Y3RhdGlvbnNbaV0udGV4dENvbnRlbnQ7CisKKyAgICAgICAgZGVidWcoJ1Rlc3QgIicgKyB0YXJn
ZXQudGV4dENvbnRlbnQuZm9sZCgpICsgJyIgaW4gIicgKyB0YXJnZXQucGFyZW50Tm9kZS50ZXh0
Q29udGVudC5mb2xkKCkgKyAnIjonKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGluZyBmcm9tIGxl
ZnQgdG8gcmlnaHQnKTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQo
dGFyZ2V0LCB0cnVlLCB0ZXN0RXhwZWN0YXRpb24uc3BsaXQoL1x8LylbMF0udHJpbSgpLnNwbGl0
KC9ccysvKSk7CisgICAgICAgIGRlYnVnKCdTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0Jyk7
CisgICAgICAgIHNlbGVjdEJ5TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgZmFsc2Us
IHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwvKVsxXS50cmltKCkuc3BsaXQoL1xzKy8pKTsKKyAg
ICAgICAgZGVidWcoJycpOworICAgIH0KK30gZWxzZSB7CisgICAgZGVidWcoJ1RoaXMgdGVzdCBy
ZXF1aXJlcyBldmVudFNlbmRlcicpOworICAgIGRvY3VtZW50Lm9uc2VsZWN0aW9uY2hhbmdlID0g
ZnVuY3Rpb24gKCkgeworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJykudGV4
dENvbnRlbnQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5mb2xkKCk7CisgICAg
fQorfQorCit2YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKworPC9zY3JpcHQ+Cis8c2Ny
aXB0IHNyYz0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3Njcmlw
dD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVT
ZWxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVT
ZWxlY3Rpb24uY3BwCShyZXZpc2lvbiA5MzUyNSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
RnJhbWVTZWxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw3IEBACiAjaW5j
bHVkZSAiUmVuZGVyVGhlbWUuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAi
UmVuZGVyV2lkZ2V0LmgiCisjaW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgogI2luY2x1ZGUg
IlNlY3VyZVRleHRJbnB1dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU3Bh
dGlhbE5hdmlnYXRpb24uaCIKQEAgLTE2MywxNSArMTY0LDEzMCBAQAogICAgICAgICB1cGRhdGVD
YXJldFJlY3QoZG9jdW1lbnQsIG1fcG9zaXRpb24pOwogfQogCi12b2lkIEZyYW1lU2VsZWN0aW9u
OjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKEZyYW1lU2VsZWN0aW9uKiBzZWxl
Y3Rpb24sIGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHBhc3NlZE5ld1NlbGVjdGlvbiwgVGV4dEdy
YW51bGFyaXR5IGdyYW51bGFyaXR5KQorc3RhdGljIElubGluZUJveCogYm94Rm9yTGVmdEVkZ2VP
ZkJpZGlSdW4oSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQpCiB7Ci0gICAgQVNTRVJUKHNlbGVj
dGlvbik7CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgewor
ICAgICAgICBJbmxpbmVCb3gqIGJveE9uTGVmdCA9IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAg
ICAgICBpZiAoIWJveE9uTGVmdCB8fCBib3hPbkxlZnQtPmJpZGlMZXZlbCgpIDwgYm94LT5iaWRp
TGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVybiBib3g7CisgICAgfQorICAgIGlmIChvZmZzZXQg
PT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94
T25SaWdodCA9IGJveC0+bmV4dExlYWZDaGlsZCgpOworICAgICAgICBpZiAoYm94T25SaWdodCAm
JiBib3hPblJpZ2h0LT5iaWRpTGV2ZWwoKSA+IGJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAg
ICByZXR1cm4gYm94T25SaWdodDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBi
b29sIGJpZGlSdW5PblJpZ2h0Q29udGFpbnNQb3NpdGlvbihJbmxpbmVCb3gqIGxlZnRFZGdlQm94
LCBSZW5kZXJlZFBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGxl
ZnRFZGdlQm94OworICAgIGRvIHsKKyAgICAgICAgaWYgKGJveCA9PSBwb3NpdGlvbi5ib3goKSkK
KyAgICAgICAgICAgIHJldHVybiAhcG9zaXRpb24uYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCk7
IC8vIElmIHRoZSBleHRlbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW4sIGRvIG5v
dCBzd2FwLgorICAgICAgICBib3ggPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxl
IChib3ggJiYgYm94LT5iaWRpTGV2ZWwoKSA+PSBsZWZ0RWRnZUJveC0+YmlkaUxldmVsKCkpOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIElubGluZUJveCogYm94Rm9yUmlnaHRFZGdl
T2ZCaWRpUnVuKElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0KQoreworICAgIGlmIChvZmZzZXQg
PT0gYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94
T25SaWdodCA9IGJveC0+bmV4dExlYWZDaGlsZCgpOworICAgICAgICBpZiAoIWJveE9uUmlnaHQg
fHwgYm94T25SaWdodC0+YmlkaUxldmVsKCkgPCBib3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAg
ICAgcmV0dXJuIGJveDsKKyAgICB9CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1v
c3RPZmZzZXQoKSkgeworICAgICAgICBJbmxpbmVCb3gqIGJveE9uTGVmdCA9IGJveC0+cHJldkxl
YWZDaGlsZCgpOworICAgICAgICBpZiAoYm94T25MZWZ0ICYmIGJveE9uTGVmdC0+YmlkaUxldmVs
KCkgPiBib3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIGJveE9uTGVmdDsKKyAg
ICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGJpZGlSdW5PbkxlZnRDb250YWlu
c1Bvc2l0aW9uKElubGluZUJveCogcmlnaHRFZGdlQm94LCBSZW5kZXJlZFBvc2l0aW9uJiBwb3Np
dGlvbikKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IHJpZ2h0RWRnZUJveDsKKyAgICBkbyB7Cisg
ICAgICAgIGlmIChib3ggPT0gcG9zaXRpb24uYm94KCkpCisgICAgICAgICAgICByZXR1cm4gIXBv
c2l0aW9uLmF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCk7IC8vIElmIHRoZSBleHRlbnQgaXMgYXQg
dGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW4sIGRvIG5vdCBzd2FwLgorICAgICAgICBib3ggPSBi
b3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYgYm94LT5iaWRpTGV2ZWwo
KSA+PSByaWdodEVkZ2VCb3gtPmJpZGlMZXZlbCgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3N0YXRpYyBib29sIGFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KFZpc2libGVQb3NpdGlv
biYgYmFzZSwgVmlzaWJsZVBvc2l0aW9uJiBleHRlbnQpCit7CisgICAgSW5saW5lQm94KiBiYXNl
Qm94ID0gMDsKKyAgICBpbnQgYmFzZU9mZnNldCA9IDA7CisgICAgYmFzZS5nZXRJbmxpbmVCb3hB
bmRPZmZzZXQoYmFzZUJveCwgYmFzZU9mZnNldCk7CisKKyAgICBJbmxpbmVCb3gqIGV4dGVudEJv
eCA9IDA7CisgICAgaW50IGV4dGVudE9mZnNldCA9IDA7CisgICAgZXh0ZW50LmdldElubGluZUJv
eEFuZE9mZnNldChleHRlbnRCb3gsIGV4dGVudE9mZnNldCk7CisgICAgaWYgKCFiYXNlQm94IHx8
ICFleHRlbnRCb3ggfHwgKGJhc2VCb3ggPT0gZXh0ZW50Qm94ICYmIGJhc2VPZmZzZXQgPT0gZXh0
ZW50T2Zmc2V0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmVuZGVyZWRQb3NpdGlv
biBiYXNlUG9zaXRpb24oYmFzZSk7CisgICAgUmVuZGVyZWRQb3NpdGlvbiBleHRlbnRQb3NpdGlv
bihleHRlbnQpOworICAgIGlmIChJbmxpbmVCb3gqIGJveE9uTGVmdEVkZ2UgPSBib3hGb3JMZWZ0
RWRnZU9mQmlkaVJ1bihiYXNlQm94LCBiYXNlT2Zmc2V0KSkgeworICAgICAgICBpZiAoYmlkaVJ1
bk9uUmlnaHRDb250YWluc1Bvc2l0aW9uKGJveE9uTGVmdEVkZ2UsIGV4dGVudFBvc2l0aW9uKSkg
eworICAgICAgICAgICAgYmFzZSA9IGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihib3hPbkxl
ZnRFZGdlLT5yZW5kZXJlcigpLT5ub2RlKCksIGJveE9uTGVmdEVkZ2UtPmNhcmV0TGVmdG1vc3RP
ZmZzZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKElubGluZUJveCogYm94T25SaWdodEVkZ2Ug
PSBib3hGb3JSaWdodEVkZ2VPZkJpZGlSdW4oYmFzZUJveCwgYmFzZU9mZnNldCkpIHsKKyAgICAg
ICAgaWYgKGJpZGlSdW5PbkxlZnRDb250YWluc1Bvc2l0aW9uKGJveE9uUmlnaHRFZGdlLCBleHRl
bnRQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIGJhc2UgPSBjcmVhdGVMZWdhY3lFZGl0aW5nUG9z
aXRpb24oYm94T25SaWdodEVkZ2UtPnJlbmRlcmVyKCktPm5vZGUoKSwgYm94T25SaWdodEVkZ2Ut
PmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChJbmxpbmVCb3gq
IGJveE9uTGVmdEVkZ2UgPSBib3hGb3JMZWZ0RWRnZU9mQmlkaVJ1bihleHRlbnRCb3gsIGV4dGVu
dE9mZnNldCkpIHsKKyAgICAgICAgaWYgKGJpZGlSdW5PblJpZ2h0Q29udGFpbnNQb3NpdGlvbihi
b3hPbkxlZnRFZGdlLCBiYXNlUG9zaXRpb24pKSB7CisgICAgICAgICAgICBleHRlbnQgPSBjcmVh
dGVMZWdhY3lFZGl0aW5nUG9zaXRpb24oYm94T25MZWZ0RWRnZS0+cmVuZGVyZXIoKS0+bm9kZSgp
LCBib3hPbkxlZnRFZGdlLT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpOworICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAg
IGlmIChJbmxpbmVCb3gqIGJveE9uUmlnaHRFZGdlID0gYm94Rm9yUmlnaHRFZGdlT2ZCaWRpUnVu
KGV4dGVudEJveCwgZXh0ZW50T2Zmc2V0KSkgeworICAgICAgICBpZiAoYmlkaVJ1bk9uTGVmdENv
bnRhaW5zUG9zaXRpb24oYm94T25SaWdodEVkZ2UsIGJhc2VQb3NpdGlvbikpIHsKKyAgICAgICAg
ICAgIGV4dGVudCA9IGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihib3hPblJpZ2h0RWRnZS0+
cmVuZGVyZXIoKS0+bm9kZSgpLCBib3hPblJpZ2h0RWRnZS0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJl
dHVybiBmYWxzZTsKK30KKwordm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxT
ZWxlY3Rpb25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWROZXdTZWxlY3Rp
b24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSwKKyAgICBFbmRQb2ludHNBZGp1c3RtZW50
TW9kZSBlbmRwb2ludHNBZGp1c3RtZW50TW9kZSkKK3sKICAgICBWaXNpYmxlU2VsZWN0aW9uIG5l
d1NlbGVjdGlvbiA9IHBhc3NlZE5ld1NlbGVjdGlvbjsKKyAgICBib29sIGlzRGlyZWN0aW9uYWwg
PSBzaG91bGRBbHdheXNVc2VEaXJlY3Rpb25hbFNlbGVjdGlvbihtX2ZyYW1lKSB8fCBuZXdTZWxl
Y3Rpb24uaXNEaXJlY3Rpb25hbCgpOwogCi0gICAgaWYgKHNob3VsZEFsd2F5c1VzZURpcmVjdGlv
bmFsU2VsZWN0aW9uKG1fZnJhbWUpKQotICAgICAgICBuZXdTZWxlY3Rpb24uc2V0SXNEaXJlY3Rp
b25hbCh0cnVlKTsKKyAgICB7CisgICAgICAgIFZpc2libGVQb3NpdGlvbiBiYXNlID0gbV9vcmln
aW5hbEJhc2UuaXNOb3ROdWxsKCkgPyBtX29yaWdpbmFsQmFzZSA6IG5ld1NlbGVjdGlvbi52aXNp
YmxlQmFzZSgpOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gbmV3QmFzZSA9IGJhc2U7CisgICAg
ICAgIFZpc2libGVQb3NpdGlvbiBuZXdFeHRlbnQgPSBuZXdTZWxlY3Rpb24udmlzaWJsZUV4dGVu
dCgpOworICAgICAgICBpZiAoZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUgPT0gQWRqdXN0RW5kcG9p
bnRzQXRCaWRpQm91bmRhcnkgJiYgYWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkobmV3QmFz
ZSwgbmV3RXh0ZW50KSkgeworICAgICAgICAgICAgbV9vcmlnaW5hbEJhc2UgPSBiYXNlOworICAg
ICAgICAgICAgbmV3U2VsZWN0aW9uLnNldEJhc2UobmV3QmFzZSk7CisgICAgICAgICAgICBuZXdT
ZWxlY3Rpb24uc2V0RXh0ZW50KG5ld0V4dGVudCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9vcmln
aW5hbEJhc2UuaXNOb3ROdWxsKCkpIHsKKyAgICAgICAgICAgIGlmIChtX3NlbGVjdGlvbi5iYXNl
KCkgPT0gbmV3U2VsZWN0aW9uLmJhc2UoKSkKKyAgICAgICAgICAgICAgICBuZXdTZWxlY3Rpb24u
c2V0QmFzZShtX29yaWdpbmFsQmFzZSk7CisgICAgICAgICAgICBtX29yaWdpbmFsQmFzZS5jbGVh
cigpOworICAgICAgICB9CisgICAgfQogCi0gICAgaWYgKHNlbGVjdGlvbi0+c2VsZWN0aW9uKCkg
PT0gbmV3U2VsZWN0aW9uIHx8ICFzZWxlY3Rpb24tPnNob3VsZENoYW5nZVNlbGVjdGlvbihuZXdT
ZWxlY3Rpb24pKQorICAgIC8vIEFkanVzdGluZyBiYXNlIGFuZCBleHRlbnQgd2lsbCBtYWtlIHRo
aXMgc2VsZWN0aW9uIGFsd2F5cyBkaXJlY3Rpb25hbAorICAgIG5ld1NlbGVjdGlvbi5zZXRJc0Rp
cmVjdGlvbmFsKGlzRGlyZWN0aW9uYWwpOworICAgIGlmIChtX3NlbGVjdGlvbiA9PSBuZXdTZWxl
Y3Rpb24gfHwgIXNob3VsZENoYW5nZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKQogICAgICAgICBy
ZXR1cm47CiAKICAgICBzZXRTZWxlY3Rpb24obmV3U2VsZWN0aW9uLCBncmFudWxhcml0eSk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkocmV2aXNpb24g
OTM1MjUpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkod29y
a2luZyBjb3B5KQpAQCAtNjksNiArNjksOCBAQAogICAgIAogICAgIFZpc2libGVQb3NpdGlvbiB2
aXNpYmxlU3RhcnQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9zdGFydCwgaXNS
YW5nZSgpID8gRE9XTlNUUkVBTSA6IGFmZmluaXR5KCkpOyB9CiAgICAgVmlzaWJsZVBvc2l0aW9u
IHZpc2libGVFbmQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9lbmQsIGlzUmFu
Z2UoKSA/IFVQU1RSRUFNIDogYWZmaW5pdHkoKSk7IH0KKyAgICBWaXNpYmxlUG9zaXRpb24gdmlz
aWJsZUJhc2UoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9iYXNlLCBpc1Jhbmdl
KCkgPyAoaXNCYXNlRmlyc3QoKSA/IFVQU1RSRUFNIDogRE9XTlNUUkVBTSkgOiBhZmZpbml0eSgp
KTsgfQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRXh0ZW50KCkgY29uc3QgeyByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKG1fZXh0ZW50LCBpc1JhbmdlKCkgPyAoaXNCYXNlRmlyc3QoKSA/IERP
V05TVFJFQU0gOiBVUFNUUkVBTSkgOiBhZmZpbml0eSgpKTsgfQogCiAgICAgYm9vbCBpc05vbmUo
KSBjb25zdCB7IHJldHVybiBzZWxlY3Rpb25UeXBlKCkgPT0gTm9TZWxlY3Rpb247IH0KICAgICBi
b29sIGlzQ2FyZXQoKSBjb25zdCB7IHJldHVybiBzZWxlY3Rpb25UeXBlKCkgPT0gQ2FyZXRTZWxl
Y3Rpb247IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9u
LmNwcAkocmV2aXNpb24gOTM1MjUpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVk
UG9zaXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02OCw2ICs2OCw3IEBACiAgICAgOiBtX3Jl
bmRlcmVyKDApCiAgICAgLCBtX2lubGluZUJveCgwKQogICAgICwgbV9vZmZzZXQoMCkKKyAgICAs
IG1fY2FjaGVTdGF0dXMoMCkKIHsKICAgICBpZiAocG9zaXRpb24uaXNOdWxsKCkpCiAgICAgICAg
IHJldHVybjsKQEAgLTgyLDYgKzgzLDcgQEAKICAgICA6IG1fcmVuZGVyZXIoMCkKICAgICAsIG1f
aW5saW5lQm94KDApCiAgICAgLCBtX29mZnNldCgwKQorICAgICwgbV9jYWNoZVN0YXR1cygwKQog
ewogICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtOTEsNyAr
OTMsMTc1IEBACiAgICAgZWxzZQogICAgICAgICBtX3JlbmRlcmVyID0gcmVuZGVyZXJGcm9tUG9z
aXRpb24ocG9zaXRpb24pOwogfQorLyoKK2VudW0gQmlkaUJvdW5kYXJ5U2lkZSB7CisgICAgTm90
QXRCb3VuZGFyeSwKKyAgICBBdExlZnRCb3VuZGFyeSwKKyAgICBBdFJpZ2h0Qm91bmRhcnksCit9
OwogCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRlcmVkUG9zaXRpb246OmNvbXB1dGVCaWRpQm91bmRh
cnlTaWRlKElubGluZUJveCogYm94LCBpbnQgb2Zmc2V0KQoreworICAgIG1fYmlkaUJvdW5kYXJ5
ID0gTm90QXRCb3VuZGFyeTsKKyAgICBpZiAob2Zmc2V0ID09IGJveC0+Y2FyZXRMZWZ0bW9zdE9m
ZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25MZWZ0ID0gcHJldkxlYWZDaGlsZCgp
OworICAgICAgICBpZiAoIWJveE9uTGVmdCB8fCBib3hPbkxlZnQtPmJpZGlMZXZlbCgpIDwgYm94
LT5iaWRpTGV2ZWwoKSkgeworICAgICAgICAgICAgcmV0dXJuIEF0TGVmdEJvdW5kYXJ5OworICAg
ICAgICB9CisgICAgICAgIGlmIChib3hPbkxlZnQgJiYgYm94T25MZWZ0LT5iaWRpTGV2ZWwoKSA+
IGJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gQXRMZWZ0Qm91bmRhcnk7Cisg
ICAgfSBlbHNlIHsKKyAgICB9CisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJl
dFJpZ2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25SaWdodCA9IG1f
aW5saW5lQm94LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgICAgIGlmIChib3hPblJpZ2h0ICYmIGJv
eE9uUmlnaHQtPmJpZGlMZXZlbCgpID4gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKQorICAgICAg
ICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oYm94T25SaWdodC0+cmVuZGVyZXIoKSwgYm94
T25SaWdodCwgYm94T25SaWdodC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKTsKKyAgICB9Cit9CisK
K2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6YXRCaWRpQm91bmRhcnkoKSBjb25zdAoreworICAgIGlm
ICghbV9pbmxpbmVCb3gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX29mZnNl
dCA9PSBtX2lubGluZUJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKQorICAgICAgICByZXR1cm4g
IXByZXZMZWFmQ2hpbGQoKSB8fCBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpICE9IG1faW5s
aW5lQm94LT5iaWRpTGV2ZWwoKTsKKworICAgIGlmIChtX29mZnNldCA9PSBtX2lubGluZUJveC0+
Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuICFuZXh0TGVhZkNoaWxkKCkg
fHwgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSAhPSBtX2lubGluZUJveC0+YmlkaUxldmVs
KCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisqLworCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRl
cmVkUG9zaXRpb246OmxlZnRCb3VuZGFyeU9mQmlkaVJ1bihpbnQgYmlkaUxldmVsT2ZSdW4pCit7
CisgICAgaWYgKCFtX2lubGluZUJveCkKKyAgICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24o
KTsKKworICAgIC8vIG1faW5saW5lQm94IG11c3QgYmUgaW4gdGhlIGJpZGkgcnVuLgorICAgIEFT
U0VSVChiaWRpTGV2ZWxPZlJ1biA8PSBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpOworICAgIElu
bGluZUJveCogYm94ID0gbV9pbmxpbmVCb3g7CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gq
IHByZXYgPSBib3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFwcmV2IHx8IHByZXYt
PmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVy
ZWRQb3NpdGlvbihib3gtPnJlbmRlcmVyKCksIGJveCwgYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpOworICAgIH0gd2hpbGUgKGJveCk7CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbigpOworfQorCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRl
cmVkUG9zaXRpb246OnJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oaW50IGJpZGlMZXZlbE9mUnVuKQor
eworICAgIGlmICghbV9pbmxpbmVCb3gpCisgICAgICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9u
KCk7CisKKyAgICAvLyBtX2lubGluZUJveCBtdXN0IGJlIGluIHRoZSBiaWRpIHJ1bi4KKyAgICBB
U1NFUlQoYmlkaUxldmVsT2ZSdW4gPD0gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKTsKKyAgICBJ
bmxpbmVCb3gqIGJveCA9IG1faW5saW5lQm94OworICAgIGRvIHsKKyAgICAgICAgSW5saW5lQm94
KiBuZXh0ID0gYm94LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghbmV4dCB8fCBuZXh0
LT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKQorICAgICAgICAgICAgcmV0dXJuIFJlbmRl
cmVkUG9zaXRpb24oYm94LT5yZW5kZXJlcigpLCBib3gsIGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNl
dCgpKTsKKyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworYm9vbCBSZW5kZXJlZFBvc2l0aW9u
OjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0Cit7CisgICAgaWYgKCFtX2lubGluZUJv
eCB8fCBtX29mZnNldCAhPSBtX2lubGluZUJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gIXByZXZMZWFmQ2hpbGQoKSB8fCBwcmV2
TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpOworfQor
Citib29sIFJlbmRlcmVkUG9zaXRpb246OmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0
Cit7CisgICAgaWYgKCFtX2lubGluZUJveCB8fCBtX29mZnNldCAhPSBtX2lubGluZUJveC0+Y2Fy
ZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJu
ICFuZXh0TGVhZkNoaWxkKCkgfHwgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IG1faW5s
aW5lQm94LT5iaWRpTGV2ZWwoKTsKK30KKworLyoKKworYm9vbCBSZW5kZXJlZFBvc2l0aW9uOjpp
c0luQmlkaVJ1bk9uTGVmdE9mQm94KElubGluZUJveCogc3RhcnRCb3gpCit7CisgICAgSW5saW5l
Qm94KiBib3ggPSBtX2lubGluZUJveDsKKyAgICBkbyB7CisgICAgICAgIGlmIChib3ggPT0gc3Rh
cnRCb3gpIHsKKyAgICAgICAgICAgIHJldHVybiAKKyAgICAgICAgICAgIC8vIElmIHRoZSBleHRl
bnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW4sIGRvIG5vdCBzd2FwLgorICAgICAg
ICAgICAgaWYgKCghYm94LT5uZXh0TGVhZkNoaWxkKCkgfHwgYm94LT5uZXh0TGVhZkNoaWxkKCkt
PmJpZGlMZXZlbCgpIDwgYm94LT5iaWRpTGV2ZWwoKSkgJiYgb3RoZXJPZmZzZXQgPT0gb3RoZXJC
b3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYm94ID0gYm94
LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgfSB3aGlsZSAoYm94ICYmIGJveC0+YmlkaUxldmVsKCkg
Pj0gc3RhcnRCb3gtPmJpZGlMZXZlbCgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp
YyBib29sIGJpZGlSdW5PblJpZ2h0Q29udGFpbnNQb3NpdGlvbihJbmxpbmVCb3gqIHN0YXJ0Qm94
LCBSZW5kZXJlZFBvc2l0aW9uIHBvc2l0aW9uKQoreworICAgIElubGluZUJveCogYm94ID0gc3Rh
cnRCb3g7CisgICAgZG8geworICAgICAgICBpZiAoYm94ID09IHBvc2l0aW9uLm1faW5saW5lQm94
KSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgZXh0ZW50IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGN1
cnJlbnQgcnVuLCBkbyBub3Qgc3dhcC4KKyAgICAgICAgICAgIGlmICgoIWJveC0+bmV4dExlYWZD
aGlsZCgpIHx8IGJveC0+bmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJveC0+YmlkaUxl
dmVsKCkpICYmIG90aGVyT2Zmc2V0ID09IG90aGVyQm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgp
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICB9CisgICAgICAgIGJveCA9IGJveC0+bmV4dExlYWZDaGlsZCgpOworICAgIH0g
d2hpbGUgKGJveCAmJiBib3gtPmJpZGlMZXZlbCgpID49IHN0YXJ0Qm94LT5iaWRpTGV2ZWwoKSk7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlcmVkUG9zaXRpb246Om1vdmVUb0Jp
ZGlMZXZlbFRoYXRDb250YWluc1Bvc2l0aW9uSWZBdEJvdW5kYXJ5KFJlbmRlcmVkUG9zaXRpb24g
cG9zaXRpb24pCit7CisgICAgaWYgKCFtX2lubGluZUJveCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpIHsKKyAgICAgICAgSW5saW5lQm94KiBwcmV2TGVhZkNoaWxkID0gbV9pbmxpbmVCb3gtPnBy
ZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFwcmV2TGVhZkNoaWxkIHx8IHByZXZMZWFmQ2hp
bGQtPmJpZGlMZXZlbCgpIDwgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKSB7CisgICAgICAgICAg
ICBpZiAoYmlkaVJ1bk9uUmlnaHRDb250YWluc1Bvc2l0aW9uKG1faW5saW5lQm94LCBwb3NpdGlv
bikpIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAg
ICBpZiAocHJldkxlYWZDaGlsZC0+YmlkaUxldmVsKCkgPiBtX2lubGluZUJveC0+YmlkaUxldmVs
KCkpIHsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICAKKyAgICBpZiAo
bV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkpCisgICAgICAg
IHJldHVybiAhbmV4dExlYWZDaGlsZCgpIHx8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkg
IT0gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpOworfQorCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRl
cmVkUG9zaXRpb246OnJpZ2h0Qm91bmRhcnlPZkJpZGlSdW5JZkF0Qm91bmRhcnkoKSBjb25zdAor
eworICAgIGlmICghbV9pbmxpbmVCb3gpCisgICAgICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9u
KCk7CisKKyAgICBpZiAobV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNhcmV0UmlnaHRtb3N0T2Zm
c2V0KCkpIHsKKyAgICAgICAgSW5saW5lQm94KiBib3hPblJpZ2h0ID0gbV9pbmxpbmVCb3gtPm5l
eHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFib3hPblJpZ2h0IHx8IGJveE9uUmlnaHQtPmJp
ZGlMZXZlbCgpIDwgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJu
IFJlbmRlcmVkUG9zaXRpb24obV9yZW5kZXJlciwgbV9pbmxpbmVCb3gsIG1fb2Zmc2V0KTsKKyAg
ICB9CisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpIHsKKyAgICAgICAgSW5saW5lQm94KiBib3hPbkxlZnQgPSBtX2lubGluZUJveC0+cHJldkxl
YWZDaGlsZCgpOworICAgICAgICBpZiAoYm94T25MZWZ0ICYmIGJveE9uTGVmdC0+YmlkaUxldmVs
KCkgPiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gUmVuZGVy
ZWRQb3NpdGlvbihib3hPbkxlZnQtPnJlbmRlcmVyKCksIGJveE9uTGVmdCwgYm94T25MZWZ0LT5j
YXJldFJpZ2h0bW9zdE9mZnNldCgpKQorICAgIH0KKworICAgIHJldHVybiBSZW5kZXJlZFBvc2l0
aW9uKCk7Cit9CisqLworCiBMYXlvdXRSZWN0IFJlbmRlcmVkUG9zaXRpb246OmFic29sdXRlUmVj
dChpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3QKIHsKICAgICBpZiAoaXNOdWxsKCkp
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCShyZXZpc2lvbiA5
MzUyNSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaAkod29ya2lu
ZyBjb3B5KQpAQCAtMjIzLDcgKzIyMyw4IEBACiAKICAgICBib29sIHNob3VsZENoYW5nZVNlbGVj
dGlvbihjb25zdCBWaXNpYmxlU2VsZWN0aW9uJikgY29uc3Q7CiAgICAgYm9vbCBzaG91bGREZWxl
dGVTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0OwotICAgIHZvaWQgc2V0
Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChGcmFtZVNlbGVjdGlvbiosIGNvbnN0IFZp
c2libGVTZWxlY3Rpb24mLCBUZXh0R3JhbnVsYXJpdHkpOworICAgIGVudW0gRW5kUG9pbnRzQWRq
dXN0bWVudE1vZGUgeyBBZGp1c3RFbmRwb2ludHNBdEJpZGlCb3VuZGFyeSwgRG9Ob3RBZGpzdXRF
bmRwb2ludHMgfTsKKyAgICB2b2lkIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQo
Y29uc3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFudWxhcml0eSwgRW5kUG9pbnRzQWRqdXN0
bWVudE1vZGUgPSBEb05vdEFkanN1dEVuZHBvaW50cyk7CiAgICAgdm9pZCBzZXRGb2N1c2VkTm9k
ZUlmTmVlZGVkKCk7CiAgICAgdm9pZCBub3RpZnlSZW5kZXJlck9mU2VsZWN0aW9uQ2hhbmdlKEVV
c2VyVHJpZ2dlcmVkKTsKIApAQCAtMjgwLDYgKzI4MSw3IEBACiAgICAgTGF5b3V0VW5pdCBtX3hQ
b3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbjsKIAogICAgIFZpc2libGVTZWxlY3Rpb24gbV9z
ZWxlY3Rpb247CisgICAgVmlzaWJsZVBvc2l0aW9uIG1fb3JpZ2luYWxCYXNlOyAvLyBVc2VkIHRv
IHN0b3JlIGJhc2UgYmVmb3JlIHRoZSBhZGp1c3RtZW50IGF0IGJpZGkgYm91bmRhcnkKICAgICBU
ZXh0R3JhbnVsYXJpdHkgbV9ncmFudWxhcml0eTsKIAogICAgIFJlZlB0cjxFZGl0aW5nU3R5bGU+
IG1fdHlwaW5nU3R5bGU7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVkUG9z
aXRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVkUG9z
aXRpb24uaAkocmV2aXNpb24gOTM1MjUpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRl
cmVkUG9zaXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNTAsMjQgKzUwLDc2IEBACiAgICAgYm9v
bCBpc051bGwoKSBjb25zdCB7IHJldHVybiAhbV9yZW5kZXJlcjsgfQogICAgIFJvb3RJbmxpbmVC
b3gqIHJvb3RCb3goKSB7IHJldHVybiBtX2lubGluZUJveCA/IG1faW5saW5lQm94LT5yb290KCkg
OiAwOyB9CiAKKyAgICAvLyBGSVhNRTogZ2V0IHJpZCBvZiBib3goKQorICAgIElubGluZUJveCog
Ym94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3g7IH0KKworICAgIGludCBjdXJyZW50QmlkaUxldmwo
KSBjb25zdCB7IHJldHVybiBtX2lubGluZUJveCA/IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSA6
IDA7IH0KKyAgICBSZW5kZXJlZFBvc2l0aW9uIGxlZnRCb3VuZGFyeU9mQmlkaVJ1bihpbnQgYmlk
aUxldmVsT2ZSdW4pOworICAgIFJlbmRlcmVkUG9zaXRpb24gcmlnaHRCb3VuZGFyeU9mQmlkaVJ1
bihpbnQgYmlkaUxldmVsT2ZSdW4pOworICAgIGJvb2wgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4o
KSBjb25zdDsKKyAgICBib29sIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0OworCiAg
ICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoKSBjb25zdCB7IHJldHVybiBhYnNvbHV0ZVJlY3Qo
MCk7IH0KICAgICBMYXlvdXRSZWN0IGFic29sdXRlUmVjdChpbnQmIGV4dHJhV2lkdGhUb0VuZE9m
TGluZSkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVSZWN0KCZleHRyYVdpZHRoVG9FbmRPZkxpbmUp
OyB9CiAKIHByaXZhdGU6CisgICAgZXhwbGljaXQgUmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmpl
Y3QqLCBJbmxpbmVCb3gqLCBpbnQgb2Zmc2V0KTsKKworICAgIGVudW0gQ2FjaGVTdGF0dXMgeyBD
YWNoZWRQcmV2TGVhZkNoaWxkLCBDYWNoZWROZXh0TGVhZkNoaWxkIH07CisgICAgaW5saW5lIGJv
b2wgc2hvdWxkQ2FjaGUoQ2FjaGVTdGF0dXMgZmxhZykgY29uc3QgeyByZXR1cm4gIShtX2NhY2hl
U3RhdHVzICYgZmxhZyk7IH0KKyAgICBpbmxpbmUgdm9pZCBzZXRDYWNoZWQoQ2FjaGVTdGF0dXMg
ZmxhZykgY29uc3QgeyBtX2NhY2hlU3RhdHVzIHw9IGZsYWc7IH0KKworICAgIElubGluZUJveCog
cHJldkxlYWZDaGlsZCgpIGNvbnN0OworICAgIElubGluZUJveCogbmV4dExlYWZDaGlsZCgpIGNv
bnN0OworCiAgICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoaW50KiBleHRyYVdpZHRoVG9FbmRP
ZkxpbmUpIGNvbnN0OwogCiAgICAgUmVuZGVyT2JqZWN0KiBtX3JlbmRlcmVyOwogICAgIElubGlu
ZUJveCogbV9pbmxpbmVCb3g7CiAgICAgaW50IG1fb2Zmc2V0OworCisgICAgbXV0YWJsZSB1bnNp
Z25lZCBtX2NhY2hlU3RhdHVzIDogMjsKKworICAgIC8vIERvIG5vdCBpbml0aWFsaXplIHRoZSBm
b2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBhcyBvcHRpbWl6YXRpb24uCisgICAgLy8gRmxhZ3Mg
aW4gbV9jYWNoZVN0YXR1cyB0ZWxsIHVzIHdoaWNoIG9uZXMgYXJlIGluaXRpYWxpemVkLgorICAg
IG11dGFibGUgSW5saW5lQm94KiBtX3ByZXZMZWFmQ2hpbGQ7CisgICAgbXV0YWJsZSBJbmxpbmVC
b3gqIG1fbmV4dExlYWZDaGlsZDsKIH07CiAKIGlubGluZSBSZW5kZXJlZFBvc2l0aW9uOjpSZW5k
ZXJlZFBvc2l0aW9uKCkKICAgICA6IG1fcmVuZGVyZXIoMCkKICAgICAsIG1faW5saW5lQm94KDAp
CiAgICAgLCBtX29mZnNldCgwKQorICAgICwgbV9jYWNoZVN0YXR1cygwKQogewogfQogCitpbmxp
bmUgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCkKKyAgICA6IG1fcmVuZGVyZXIocmVuZGVy
ZXIpCisgICAgLCBtX2lubGluZUJveChib3gpCisgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAg
LCBtX2NhY2hlU3RhdHVzKDApCit7Cit9CisKK2lubGluZSBJbmxpbmVCb3gqIFJlbmRlcmVkUG9z
aXRpb246OnByZXZMZWFmQ2hpbGQoKSBjb25zdAoreworICAgIGlmIChzaG91bGRDYWNoZShDYWNo
ZWRQcmV2TGVhZkNoaWxkKSkgeworICAgICAgICBtX3ByZXZMZWFmQ2hpbGQgPSBtX2lubGluZUJv
eC0+cHJldkxlYWZDaGlsZCgpOworICAgICAgICBzZXRDYWNoZWQoQ2FjaGVkUHJldkxlYWZDaGls
ZCk7CisgICAgfQorICAgIHJldHVybiBtX3ByZXZMZWFmQ2hpbGQ7Cit9CisKK2lubGluZSBJbmxp
bmVCb3gqIFJlbmRlcmVkUG9zaXRpb246Om5leHRMZWFmQ2hpbGQoKSBjb25zdAoreworICAgIGlm
IChzaG91bGRDYWNoZShDYWNoZWROZXh0TGVhZkNoaWxkKSkgeworICAgICAgICBtX25leHRMZWFm
Q2hpbGQgPSBtX2lubGluZUJveC0+bmV4dExlYWZDaGlsZCgpOworICAgICAgICBzZXRDYWNoZWQo
Q2FjaGVkTmV4dExlYWZDaGlsZCk7CisgICAgfQorICAgIHJldHVybiBtX25leHRMZWFmQ2hpbGQ7
Cit9CisKIGJvb2wgcmVuZGVyT2JqZWN0Q29udGFpbnNQb3NpdGlvbihSZW5kZXJPYmplY3QqLCBj
b25zdCBQb3NpdGlvbiYpOwogCiB9OwpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhh
bmRsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVy
LmNwcAkocmV2aXNpb24gOTM1MjUpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4Nyw3ICsyODcsNyBAQAogICAgICAgICBtX3NlbGVj
dGlvbkluaXRpYXRpb25TdGF0ZSA9IFBsYWNlZENhcmV0OwogICAgIH0KIAotICAgIG1fZnJhbWUt
PnNlbGVjdGlvbigpLT5zZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKG1fZnJhbWUt
PnNlbGVjdGlvbigpLCBuZXdTZWxlY3Rpb24sIGdyYW51bGFyaXR5KTsKKyAgICBtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rp
b24sIGdyYW51bGFyaXR5KTsKIAogICAgIHJldHVybiB0cnVlOwogfQpAQCAtNjkwLDcgKzY5MCw4
IEBACiAgICAgaWYgKG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpICE9IENoYXJh
Y3RlckdyYW51bGFyaXR5KQogICAgICAgICBuZXdTZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxh
cml0eShtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7CiAKLSAgICBtX2ZyYW1l
LT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChtX2ZyYW1l
LT5zZWxlY3Rpb24oKSwgbmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSk7CisgICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2Vs
ZWN0aW9uSWZOZWVkZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSwKKyAgICAgICAgRnJhbWVTZWxlY3Rpb246OkFkanVzdEVuZHBvaW50c0F0QmlkaUJv
dW5kYXJ5KTsKIH0KICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>106014</attachid>
            <date>2011-09-01 12:54:03 -0700</date>
            <delta_ts>2011-09-08 20:31:04 -0700</delta_ts>
            <desc>work in progress 5</desc>
            <filename>wip57340e</filename>
            <type>text/plain</type>
            <size>29367</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCShyZXZpc2lv
biA5MzU3NykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIK
ICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUmVuZGVyV2lkZ2V0LmgiCisjaW5j
bHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgogI2luY2x1ZGUgIlNlY3VyZVRleHRJbnB1dC5oIgog
I2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU3BhdGlhbE5hdmlnYXRpb24uaCIKQEAg
LTE2MywxMyArMTY0LDEzOCBAQAogICAgICAgICB1cGRhdGVDYXJldFJlY3QoZG9jdW1lbnQsIG1f
cG9zaXRpb24pOwogfQogCi12b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNl
bGVjdGlvbklmTmVlZGVkKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHBhc3NlZE5ld1NlbGVjdGlv
biwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5KQorc3RhdGljIElubGluZUJveCogYm94Rm9y
TGVmdEVkZ2VPZkJpZGlSdW4oSW5saW5lQm94KiBib3gsIGludCBvZmZzZXQpCiB7CisgICAgaWYg
KG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgeworICAgICAgICBJbmxpbmVC
b3gqIGJveE9uTGVmdCA9IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAgICAgICBpZiAoIWJveE9u
TGVmdCB8fCBib3hPbkxlZnQtPmJpZGlMZXZlbCgpIDwgYm94LT5iaWRpTGV2ZWwoKSkKKyAgICAg
ICAgICAgIHJldHVybiBib3g7CisgICAgfQorICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJp
Z2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25SaWdodCA9IGJveC0+
bmV4dExlYWZDaGlsZCgpOworICAgICAgICBpZiAoYm94T25SaWdodCAmJiBib3hPblJpZ2h0LT5i
aWRpTGV2ZWwoKSA+IGJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gYm94T25S
aWdodDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIGJpZGlSdW5PblJp
Z2h0Q29udGFpbnNQb3NpdGlvbihJbmxpbmVCb3gqIGxlZnRFZGdlQm94LCBSZW5kZXJlZFBvc2l0
aW9uJiBwb3NpdGlvbikKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGxlZnRFZGdlQm94OworICAg
IGRvIHsKKyAgICAgICAgaWYgKGJveCA9PSBwb3NpdGlvbi5ib3goKSkKKyAgICAgICAgICAgIHJl
dHVybiAhcG9zaXRpb24uYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCk7IC8vIElmIHRoZSBleHRl
bnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBydW4sIGRvIG5vdCBzd2FwLgorICAgICAg
ICBib3ggPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYgYm94LT5i
aWRpTGV2ZWwoKSA+PSBsZWZ0RWRnZUJveC0+YmlkaUxldmVsKCkpOworICAgIHJldHVybiBmYWxz
ZTsKK30KKworc3RhdGljIElubGluZUJveCogYm94Rm9yUmlnaHRFZGdlT2ZCaWRpUnVuKElubGlu
ZUJveCogYm94LCBpbnQgb2Zmc2V0KQoreworICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldFJp
Z2h0bW9zdE9mZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25SaWdodCA9IGJveC0+
bmV4dExlYWZDaGlsZCgpOworICAgICAgICBpZiAoIWJveE9uUmlnaHQgfHwgYm94T25SaWdodC0+
YmlkaUxldmVsKCkgPCBib3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIGJveDsK
KyAgICB9CisgICAgaWYgKG9mZnNldCA9PSBib3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSkgewor
ICAgICAgICBJbmxpbmVCb3gqIGJveE9uTGVmdCA9IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAg
ICAgICBpZiAoYm94T25MZWZ0ICYmIGJveE9uTGVmdC0+YmlkaUxldmVsKCkgPiBib3gtPmJpZGlM
ZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIGJveE9uTGVmdDsKKyAgICB9CisgICAgcmV0dXJu
IDA7Cit9CisKK3N0YXRpYyBib29sIGJpZGlSdW5PbkxlZnRDb250YWluc1Bvc2l0aW9uKElubGlu
ZUJveCogcmlnaHRFZGdlQm94LCBSZW5kZXJlZFBvc2l0aW9uJiBwb3NpdGlvbikKK3sKKyAgICBJ
bmxpbmVCb3gqIGJveCA9IHJpZ2h0RWRnZUJveDsKKyAgICBkbyB7CisgICAgICAgIGlmIChib3gg
PT0gcG9zaXRpb24uYm94KCkpCisgICAgICAgICAgICByZXR1cm4gIXBvc2l0aW9uLmF0TGVmdEJv
dW5kYXJ5T2ZCaWRpUnVuKCk7IC8vIElmIHRoZSBleHRlbnQgaXMgYXQgdGhlIGVuZCBvZiB0aGUg
Y3VycmVudCBydW4sIGRvIG5vdCBzd2FwLgorICAgICAgICBib3ggPSBib3gtPnByZXZMZWFmQ2hp
bGQoKTsKKyAgICB9IHdoaWxlIChib3ggJiYgYm94LT5iaWRpTGV2ZWwoKSA+PSByaWdodEVkZ2VC
b3gtPmJpZGlMZXZlbCgpKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGFk
anVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KFZpc2libGVQb3NpdGlvbiYgYmFzZSwgVmlzaWJs
ZVBvc2l0aW9uJiBleHRlbnQpCit7CisgICAgSW5saW5lQm94KiBiYXNlQm94ID0gMDsKKyAgICBp
bnQgYmFzZU9mZnNldCA9IDA7CisgICAgYmFzZS5nZXRJbmxpbmVCb3hBbmRPZmZzZXQoYmFzZUJv
eCwgYmFzZU9mZnNldCk7CisKKyAgICBJbmxpbmVCb3gqIGV4dGVudEJveCA9IDA7CisgICAgaW50
IGV4dGVudE9mZnNldCA9IDA7CisgICAgZXh0ZW50LmdldElubGluZUJveEFuZE9mZnNldChleHRl
bnRCb3gsIGV4dGVudE9mZnNldCk7CisgICAgaWYgKCFiYXNlQm94IHx8ICFleHRlbnRCb3ggfHwg
KGJhc2VCb3ggPT0gZXh0ZW50Qm94ICYmIGJhc2VPZmZzZXQgPT0gZXh0ZW50T2Zmc2V0KSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmVuZGVyZWRQb3NpdGlvbiBiYXNlUG9zaXRpb24o
YmFzZSk7CisgICAgUmVuZGVyZWRQb3NpdGlvbiBleHRlbnRQb3NpdGlvbihleHRlbnQpOworCisg
ICAgYm9vbCBhZGp1c3RCYXNlID0gZmFsc2U7CisgICAgaWYgKGJhc2VQb3NpdGlvbi5hdExlZnRC
b3VuZGFyeU9mQmlkaVJ1bigpICYmICFleHRlbnRQb3NpdGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJp
ZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkKKyAgICAgICAgJiYgYmFzZVBv
c2l0aW9uID09IGV4dGVudFBvc2l0aW9uLmxlZnRCb3VuZGFyeU9mQmlkaVJ1bihiYXNlUG9zaXRp
b24uYmlkaUxldmVsT25SaWdodCgpKSkgeworICAgICAgICBhZGp1c3RCYXNlID0gdHJ1ZTsKKyAg
ICB9CisKKyAgICBpZiAoSW5saW5lQm94KiBib3hPbkxlZnRFZGdlID0gYm94Rm9yTGVmdEVkZ2VP
ZkJpZGlSdW4oYmFzZUJveCwgYmFzZU9mZnNldCkpIHsKKyAgICAgICAgaWYgKGJpZGlSdW5PblJp
Z2h0Q29udGFpbnNQb3NpdGlvbihib3hPbkxlZnRFZGdlLCBleHRlbnRQb3NpdGlvbikpIHsKKyAg
ICAgICAgICAgIGJhc2UgPSBjcmVhdGVMZWdhY3lFZGl0aW5nUG9zaXRpb24oYm94T25MZWZ0RWRn
ZS0+cmVuZGVyZXIoKS0+bm9kZSgpLCBib3hPbkxlZnRFZGdlLT5jYXJldExlZnRtb3N0T2Zmc2V0
KCkpOworICAgICAgICAgICAgQVNTRVJUKGFkanVzdEJhc2UpOworICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQVNTRVJUKCFhZGp1c3RCYXNlKTsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChJbmxpbmVCb3gqIGJveE9uUmlnaHRFZGdl
ID0gYm94Rm9yUmlnaHRFZGdlT2ZCaWRpUnVuKGJhc2VCb3gsIGJhc2VPZmZzZXQpKSB7CisgICAg
ICAgIGlmIChiaWRpUnVuT25MZWZ0Q29udGFpbnNQb3NpdGlvbihib3hPblJpZ2h0RWRnZSwgZXh0
ZW50UG9zaXRpb24pKSB7CisgICAgICAgICAgICBiYXNlID0gY3JlYXRlTGVnYWN5RWRpdGluZ1Bv
c2l0aW9uKGJveE9uUmlnaHRFZGdlLT5yZW5kZXJlcigpLT5ub2RlKCksIGJveE9uUmlnaHRFZGdl
LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoSW5saW5lQm94
KiBib3hPbkxlZnRFZGdlID0gYm94Rm9yTGVmdEVkZ2VPZkJpZGlSdW4oZXh0ZW50Qm94LCBleHRl
bnRPZmZzZXQpKSB7CisgICAgICAgIGlmIChiaWRpUnVuT25SaWdodENvbnRhaW5zUG9zaXRpb24o
Ym94T25MZWZ0RWRnZSwgYmFzZVBvc2l0aW9uKSkgeworICAgICAgICAgICAgZXh0ZW50ID0gY3Jl
YXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKGJveE9uTGVmdEVkZ2UtPnJlbmRlcmVyKCktPm5vZGUo
KSwgYm94T25MZWZ0RWRnZS0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKTsKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAg
ICBpZiAoSW5saW5lQm94KiBib3hPblJpZ2h0RWRnZSA9IGJveEZvclJpZ2h0RWRnZU9mQmlkaVJ1
bihleHRlbnRCb3gsIGV4dGVudE9mZnNldCkpIHsKKyAgICAgICAgaWYgKGJpZGlSdW5PbkxlZnRD
b250YWluc1Bvc2l0aW9uKGJveE9uUmlnaHRFZGdlLCBiYXNlUG9zaXRpb24pKSB7CisgICAgICAg
ICAgICBleHRlbnQgPSBjcmVhdGVMZWdhY3lFZGl0aW5nUG9zaXRpb24oYm94T25SaWdodEVkZ2Ut
PnJlbmRlcmVyKCktPm5vZGUoKSwgYm94T25SaWdodEVkZ2UtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0
KCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRnJhbWVTZWxlY3Rpb246OnNldE5vbkRpcmVjdGlvbmFs
U2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgcGFzc2VkTmV3U2VsZWN0
aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHksCisgICAgRW5kUG9pbnRzQWRqdXN0bWVu
dE1vZGUgZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUpCit7CiAgICAgVmlzaWJsZVNlbGVjdGlvbiBu
ZXdTZWxlY3Rpb24gPSBwYXNzZWROZXdTZWxlY3Rpb247CisgICAgYm9vbCBpc0RpcmVjdGlvbmFs
ID0gc2hvdWxkQWx3YXlzVXNlRGlyZWN0aW9uYWxTZWxlY3Rpb24obV9mcmFtZSkgfHwgbmV3U2Vs
ZWN0aW9uLmlzRGlyZWN0aW9uYWwoKTsKIAotICAgIGlmIChzaG91bGRBbHdheXNVc2VEaXJlY3Rp
b25hbFNlbGVjdGlvbihtX2ZyYW1lKSkKLSAgICAgICAgbmV3U2VsZWN0aW9uLnNldElzRGlyZWN0
aW9uYWwodHJ1ZSk7CisgICAgeworICAgICAgICBWaXNpYmxlUG9zaXRpb24gYmFzZSA9IG1fb3Jp
Z2luYWxCYXNlLmlzTm90TnVsbCgpID8gbV9vcmlnaW5hbEJhc2UgOiBuZXdTZWxlY3Rpb24udmlz
aWJsZUJhc2UoKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIG5ld0Jhc2UgPSBiYXNlOworICAg
ICAgICBWaXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50ID0gbmV3U2VsZWN0aW9uLnZpc2libGVFeHRl
bnQoKTsKKyAgICAgICAgaWYgKGVuZHBvaW50c0FkanVzdG1lbnRNb2RlID09IEFkanVzdEVuZHBv
aW50c0F0QmlkaUJvdW5kYXJ5ICYmIGFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KG5ld0Jh
c2UsIG5ld0V4dGVudCkpIHsKKyAgICAgICAgICAgIG1fb3JpZ2luYWxCYXNlID0gYmFzZTsKKyAg
ICAgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRCYXNlKG5ld0Jhc2UpOworICAgICAgICAgICAgbmV3
U2VsZWN0aW9uLnNldEV4dGVudChuZXdFeHRlbnQpOworICAgICAgICB9IGVsc2UgaWYgKG1fb3Jp
Z2luYWxCYXNlLmlzTm90TnVsbCgpKSB7CisgICAgICAgICAgICBpZiAobV9zZWxlY3Rpb24uYmFz
ZSgpID09IG5ld1NlbGVjdGlvbi5iYXNlKCkpCisgICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9u
LnNldEJhc2UobV9vcmlnaW5hbEJhc2UpOworICAgICAgICAgICAgbV9vcmlnaW5hbEJhc2UuY2xl
YXIoKTsKKyAgICAgICAgfQorICAgIH0KIAorICAgIC8vIEFkanVzdGluZyBiYXNlIGFuZCBleHRl
bnQgd2lsbCBtYWtlIHRoaXMgc2VsZWN0aW9uIGFsd2F5cyBkaXJlY3Rpb25hbAorICAgIG5ld1Nl
bGVjdGlvbi5zZXRJc0RpcmVjdGlvbmFsKGlzRGlyZWN0aW9uYWwpOwogICAgIGlmIChtX3NlbGVj
dGlvbiA9PSBuZXdTZWxlY3Rpb24gfHwgIXNob3VsZENoYW5nZVNlbGVjdGlvbihuZXdTZWxlY3Rp
b24pKQogICAgICAgICByZXR1cm47CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlz
aWJsZVNlbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlz
aWJsZVNlbGVjdGlvbi5oCShyZXZpc2lvbiA5MzU3NykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvVmlzaWJsZVNlbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2OSw4IEBACiAg
ICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVQb3NpdGlvbihtX3N0YXJ0LCBpc1JhbmdlKCkgPyBET1dOU1RSRUFNIDogYWZmaW5pdHko
KSk7IH0KICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZCgpIGNvbnN0IHsgcmV0dXJuIFZp
c2libGVQb3NpdGlvbihtX2VuZCwgaXNSYW5nZSgpID8gVVBTVFJFQU0gOiBhZmZpbml0eSgpKTsg
fQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlQmFzZSgpIGNvbnN0IHsgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbihtX2Jhc2UsIGlzUmFuZ2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gVVBTVFJFQU0g
OiBET1dOU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2li
bGVFeHRlbnQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9leHRlbnQsIGlzUmFu
Z2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gRE9XTlNUUkVBTSA6IFVQU1RSRUFNKSA6IGFmZmluaXR5
KCkpOyB9CiAKICAgICBib29sIGlzTm9uZSgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUo
KSA9PSBOb1NlbGVjdGlvbjsgfQogICAgIGJvb2wgaXNDYXJldCgpIGNvbnN0IHsgcmV0dXJuIHNl
bGVjdGlvblR5cGUoKSA9PSBDYXJldFNlbGVjdGlvbjsgfQpJbmRleDogU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3BwCShyZXZpc2lvbiA5MzU3NykKKysrIFNvdXJj
ZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTY4LDYgKzY4LDcgQEAKICAgICA6IG1fcmVuZGVyZXIoMCkKICAgICAsIG1faW5saW5lQm94KDAp
CiAgICAgLCBtX29mZnNldCgwKQorICAgICwgbV9jYWNoZVN0YXR1cygwKQogewogICAgIGlmIChw
b3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtODIsNiArODMsNyBAQAogICAg
IDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zmc2V0KDAp
CisgICAgLCBtX2NhY2hlU3RhdHVzKDApCiB7CiAgICAgaWYgKHBvc2l0aW9uLmlzTnVsbCgpKQog
ICAgICAgICByZXR1cm47CkBAIC05Miw2ICs5NCwyMDIgQEAKICAgICAgICAgbV9yZW5kZXJlciA9
IHJlbmRlcmVyRnJvbVBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAorYm9vbCBSZW5kZXJlZFBvc2l0
aW9uOjpvcGVyYXRvcj09KGNvbnN0IFJlbmRlcmVkUG9zaXRpb24mIG90aGVyKSBjb25zdAorewor
ICAgIHJldHVybiBtX3JlbmRlcmVyID09IG90aGVyLm1fcmVuZGVyZXIgJiYgKChtX2lubGluZUJv
eCA9PSBvdGhlci5tX2lubGluZUJveCAmJiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCkKKyAg
ICAgICAgfHwgKGF0TGVmdG1vc3RPZmZzZXRJbkJveCgpICYmIG90aGVyLmF0UmlnaHRtb3N0T2Zm
c2V0SW5Cb3goKSAmJiBwcmV2TGVhZkNoaWxkKCkgPT0gb3RoZXIubV9pbmxpbmVCb3gpCisgICAg
ICAgIHx8IChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkgJiYgb3RoZXIuYXRMZWZ0bW9zdE9mZnNl
dEluQm94KCkgJiYgbmV4dExlYWZDaGlsZCgpID09IG90aGVyLm1faW5saW5lQm94KSk7IAorfQor
CisvKgorZW51bSBCaWRpQm91bmRhcnlTaWRlIHsKKyAgICBOb3RBdEJvdW5kYXJ5LAorICAgIEF0
TGVmdEJvdW5kYXJ5LAorICAgIEF0UmlnaHRCb3VuZGFyeSwKK307CisKK1JlbmRlcmVkUG9zaXRp
b24gUmVuZGVyZWRQb3NpdGlvbjo6Y29tcHV0ZUJpZGlCb3VuZGFyeVNpZGUoSW5saW5lQm94KiBi
b3gsIGludCBvZmZzZXQpCit7CisgICAgbV9iaWRpQm91bmRhcnkgPSBOb3RBdEJvdW5kYXJ5Owor
ICAgIGlmIChvZmZzZXQgPT0gYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpIHsKKyAgICAgICAg
SW5saW5lQm94KiBib3hPbkxlZnQgPSBwcmV2TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghYm94
T25MZWZ0IHx8IGJveE9uTGVmdC0+YmlkaUxldmVsKCkgPCBib3gtPmJpZGlMZXZlbCgpKSB7Cisg
ICAgICAgICAgICByZXR1cm4gQXRMZWZ0Qm91bmRhcnk7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KGJveE9uTGVmdCAmJiBib3hPbkxlZnQtPmJpZGlMZXZlbCgpID4gYm94LT5iaWRpTGV2ZWwoKSkK
KyAgICAgICAgICAgIHJldHVybiBBdExlZnRCb3VuZGFyeTsKKyAgICB9IGVsc2UgeworICAgIH0K
KyAgICBpZiAobV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCkp
IHsKKyAgICAgICAgSW5saW5lQm94KiBib3hPblJpZ2h0ID0gbV9pbmxpbmVCb3gtPm5leHRMZWFm
Q2hpbGQoKTsKKyAgICAgICAgaWYgKGJveE9uUmlnaHQgJiYgYm94T25SaWdodC0+YmlkaUxldmVs
KCkgPiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpCisgICAgICAgICAgICByZXR1cm4gUmVuZGVy
ZWRQb3NpdGlvbihib3hPblJpZ2h0LT5yZW5kZXJlcigpLCBib3hPblJpZ2h0LCBib3hPblJpZ2h0
LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpOworICAgIH0KK30KKworYm9vbCBSZW5kZXJlZFBvc2l0
aW9uOjphdEJpZGlCb3VuZGFyeSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2lubGluZUJveCkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5j
YXJldExlZnRtb3N0T2Zmc2V0KCkpCisgICAgICAgIHJldHVybiAhcHJldkxlYWZDaGlsZCgpIHx8
IHByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgIT0gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgp
OworCisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldFJpZ2h0bW9zdE9mZnNl
dCgpKQorICAgICAgICByZXR1cm4gIW5leHRMZWFmQ2hpbGQoKSB8fCBuZXh0TGVhZkNoaWxkKCkt
PmJpZGlMZXZlbCgpICE9IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKTsKKworICAgIHJldHVybiBm
YWxzZTsKK30KKyovCisKK1JlbmRlcmVkUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6bGVmdEJv
dW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pCit7CisgICAgaWYg
KCFtX2lubGluZUJveCkKKyAgICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKKworICAg
IC8vIG1faW5saW5lQm94IG11c3QgYmUgaW4gdGhlIGJpZGkgcnVuLgorICAgIEFTU0VSVChiaWRp
TGV2ZWxPZlJ1biA8PSBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpOworICAgIElubGluZUJveCog
Ym94ID0gbV9pbmxpbmVCb3g7CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gqIHByZXYgPSBi
b3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFwcmV2IHx8IHByZXYtPmJpZGlMZXZl
bCgpIDwgYmlkaUxldmVsT2ZSdW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlv
bihib3gtPnJlbmRlcmVyKCksIGJveCwgYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpOworICAg
ICAgICBib3ggPSBwcmV2OworICAgIH0gd2hpbGUgKGJveCk7CisKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbigpOworfQorCitSZW5kZXJlZFBv
c2l0aW9uIFJlbmRlcmVkUG9zaXRpb246OnJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQg
Y2hhciBiaWRpTGV2ZWxPZlJ1bikKK3sKKyAgICBpZiAoIW1faW5saW5lQm94KQorICAgICAgICBy
ZXR1cm4gUmVuZGVyZWRQb3NpdGlvbigpOworCisgICAgLy8gbV9pbmxpbmVCb3ggbXVzdCBiZSBp
biB0aGUgYmlkaSBydW4uCisgICAgQVNTRVJUKGJpZGlMZXZlbE9mUnVuIDw9IG1faW5saW5lQm94
LT5iaWRpTGV2ZWwoKSk7CisgICAgSW5saW5lQm94KiBib3ggPSBtX2lubGluZUJveDsKKyAgICBk
byB7CisgICAgICAgIElubGluZUJveCogbmV4dCA9IGJveC0+bmV4dExlYWZDaGlsZCgpOworICAg
ICAgICBpZiAoIW5leHQgfHwgbmV4dC0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1bikKKyAg
ICAgICAgICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKGJveC0+cmVuZGVyZXIoKSwgYm94LCBi
b3gtPmNhcmV0TGVmdG1vc3RPZmZzZXQoKSk7CisgICAgICAgIGJveCA9IG5leHQ7CisgICAgfSB3
aGlsZSAoYm94KTsKKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBSZW5k
ZXJlZFBvc2l0aW9uKCk7Cit9CisKK2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6YXRMZWZ0Qm91bmRh
cnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2ZWwgc2hvdWxkTWF0Y2hCaWRpTGV2ZWwsIHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0Cit7CisgICAgaWYgKCFtX2lubGluZUJv
eCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgYm9vbCBpZ25vcmVCaWRpTGV2
ZWwgPSBzaG91bGRNYXRjaEJpZGlMZXZlbCA9PSBJZ25vcmVCaWRpTGV2ZWw7CisgICAgQVNTRVJU
KCFpZ25vcmVCaWRpTGV2ZWwgfHwgIW1faW5saW5lQm94IHx8IGJpZGlMZXZlbE9mUnVuID09IG1f
aW5saW5lQm94LT5iaWRpTGV2ZWwoKSk7CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94
KCkpCisgICAgICAgIHJldHVybiAoaWdub3JlQmlkaUxldmVsIHx8IG1faW5saW5lQm94LT5iaWRp
TGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1bikgJiYgKCFwcmV2TGVhZkNoaWxkKCkgfHwgcHJldkxl
YWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKTsKKy8qCisgICAgaWYgKGF0
UmlnaHRtb3N0T2Zmc2V0SW5Cb3goKSkKKyAgICAgICAgcmV0dXJuIGJpZGlMZXZlbCgpIDwgYmlk
aUxldmVsT2ZSdW4gJiYgbmV4dExlYWZDaGlsZCgpICYmIG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxl
dmVsKCkgPj0gYmlkaUxldmVsT2ZSdW47CisqLworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9v
bCBSZW5kZXJlZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hC
aWRpTGV2ZWwgc2hvdWxkTWF0Y2hCaWRpTGV2ZWwsIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZS
dW4pIGNvbnN0Cit7CisgICAgaWYgKCFtX2lubGluZUJveCkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgY29uc3QgYm9vbCBpZ25vcmVCaWRpTGV2ZWwgPSBzaG91bGRNYXRjaEJpZGlMZXZl
bCA9PSBJZ25vcmVCaWRpTGV2ZWw7CisgICAgQVNTRVJUKCFpZ25vcmVCaWRpTGV2ZWwgfHwgIW1f
aW5saW5lQm94IHx8IGJpZGlMZXZlbE9mUnVuID09IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSk7
CisgICAgCisgICAgaWYgKGF0UmlnaHRtb3N0T2Zmc2V0SW5Cb3goKSkKKyAgICAgICAgcmV0dXJu
IChpZ25vcmVCaWRpTGV2ZWwgfHwgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpID49IGJpZGlMZXZl
bE9mUnVuKSAmJiAoIW5leHRMZWFmQ2hpbGQoKSB8fCBuZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZl
bCgpIDwgYmlkaUxldmVsT2ZSdW4pOworLyoKKyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94
KCkpCisgICAgICAgIHJldHVybiBiaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuICYmIHByZXZM
ZWFmQ2hpbGQoKSAmJiBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpID4gYmlkaUxldmVsOwor
Ki8KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qCisKK2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6
aXNJbkJpZGlSdW5PbkxlZnRPZkJveChJbmxpbmVCb3gqIHN0YXJ0Qm94KQoreworICAgIElubGlu
ZUJveCogYm94ID0gbV9pbmxpbmVCb3g7CisgICAgZG8geworICAgICAgICBpZiAoYm94ID09IHN0
YXJ0Qm94KSB7CisgICAgICAgICAgICByZXR1cm4gCisgICAgICAgICAgICAvLyBJZiB0aGUgZXh0
ZW50IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcnVuLCBkbyBub3Qgc3dhcC4KKyAgICAg
ICAgICAgIGlmICgoIWJveC0+bmV4dExlYWZDaGlsZCgpIHx8IGJveC0+bmV4dExlYWZDaGlsZCgp
LT5iaWRpTGV2ZWwoKSA8IGJveC0+YmlkaUxldmVsKCkpICYmIG90aGVyT2Zmc2V0ID09IG90aGVy
Qm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJveCA9IGJv
eC0+cHJldkxlYWZDaGlsZCgpOworICAgIH0gd2hpbGUgKGJveCAmJiBib3gtPmJpZGlMZXZlbCgp
ID49IHN0YXJ0Qm94LT5iaWRpTGV2ZWwoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0
aWMgYm9vbCBiaWRpUnVuT25SaWdodENvbnRhaW5zUG9zaXRpb24oSW5saW5lQm94KiBzdGFydEJv
eCwgUmVuZGVyZWRQb3NpdGlvbiBwb3NpdGlvbikKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IHN0
YXJ0Qm94OworICAgIGRvIHsKKyAgICAgICAgaWYgKGJveCA9PSBwb3NpdGlvbi5tX2lubGluZUJv
eCkgeworICAgICAgICAgICAgLy8gSWYgdGhlIGV4dGVudCBpcyBhdCB0aGUgZW5kIG9mIHRoZSBj
dXJyZW50IHJ1biwgZG8gbm90IHN3YXAuCisgICAgICAgICAgICBpZiAoKCFib3gtPm5leHRMZWFm
Q2hpbGQoKSB8fCBib3gtPm5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBib3gtPmJpZGlM
ZXZlbCgpKSAmJiBvdGhlck9mZnNldCA9PSBvdGhlckJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQo
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgfQorICAgICAgICBib3ggPSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICB9
IHdoaWxlIChib3ggJiYgYm94LT5iaWRpTGV2ZWwoKSA+PSBzdGFydEJveC0+YmlkaUxldmVsKCkp
OworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJlZFBvc2l0aW9uOjptb3ZlVG9C
aWRpTGV2ZWxUaGF0Q29udGFpbnNQb3NpdGlvbklmQXRCb3VuZGFyeShSZW5kZXJlZFBvc2l0aW9u
IHBvc2l0aW9uKQoreworICAgIGlmICghbV9pbmxpbmVCb3gpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChtX29mZnNldCA9PSBtX2lubGluZUJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNl
dCgpKSB7CisgICAgICAgIElubGluZUJveCogcHJldkxlYWZDaGlsZCA9IG1faW5saW5lQm94LT5w
cmV2TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghcHJldkxlYWZDaGlsZCB8fCBwcmV2TGVhZkNo
aWxkLT5iaWRpTGV2ZWwoKSA8IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSkgeworICAgICAgICAg
ICAgaWYgKGJpZGlSdW5PblJpZ2h0Q29udGFpbnNQb3NpdGlvbihtX2lubGluZUJveCwgcG9zaXRp
b24pKSB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKHByZXZMZWFmQ2hpbGQtPmJpZGlMZXZlbCgpID4gbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpKSB7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgCisgICAgaWYg
KG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKQorICAgICAg
ICByZXR1cm4gIW5leHRMZWFmQ2hpbGQoKSB8fCBuZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgp
ICE9IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKTsKK30KKworUmVuZGVyZWRQb3NpdGlvbiBSZW5k
ZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuSWZBdEJvdW5kYXJ5KCkgY29uc3QK
K3sKKyAgICBpZiAoIW1faW5saW5lQm94KQorICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlv
bigpOworCisgICAgaWYgKG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldFJpZ2h0bW9zdE9m
ZnNldCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25SaWdodCA9IG1faW5saW5lQm94LT5u
ZXh0TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghYm94T25SaWdodCB8fCBib3hPblJpZ2h0LT5i
aWRpTGV2ZWwoKSA8IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgICAgIHJldHVy
biBSZW5kZXJlZFBvc2l0aW9uKG1fcmVuZGVyZXIsIG1faW5saW5lQm94LCBtX29mZnNldCk7Cisg
ICAgfQorICAgIGlmIChtX29mZnNldCA9PSBtX2lubGluZUJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNl
dCgpKSB7CisgICAgICAgIElubGluZUJveCogYm94T25MZWZ0ID0gbV9pbmxpbmVCb3gtPnByZXZM
ZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKGJveE9uTGVmdCAmJiBib3hPbkxlZnQtPmJpZGlMZXZl
bCgpID4gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICAgICAgcmV0dXJuIFJlbmRl
cmVkUG9zaXRpb24oYm94T25MZWZ0LT5yZW5kZXJlcigpLCBib3hPbkxlZnQsIGJveE9uTGVmdC0+
Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSkKKyAgICB9CisKKyAgICByZXR1cm4gUmVuZGVyZWRQb3Np
dGlvbigpOworfQorKi8KKwogTGF5b3V0UmVjdCBSZW5kZXJlZFBvc2l0aW9uOjphYnNvbHV0ZVJl
Y3QoaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0CiB7CiAgICAgaWYgKGlzTnVsbCgp
KQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaAkocmV2aXNpb24g
OTM1NzcpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJKHdvcmtp
bmcgY29weSkKQEAgLTIyMyw3ICsyMjMsOCBAQAogCiAgICAgYm9vbCBzaG91bGRDaGFuZ2VTZWxl
Y3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0OwogICAgIGJvb2wgc2hvdWxkRGVs
ZXRlU2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mKSBjb25zdDsKLSAgICB2b2lkIHNl
dE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYs
IFRleHRHcmFudWxhcml0eSk7CisgICAgZW51bSBFbmRQb2ludHNBZGp1c3RtZW50TW9kZSB7IEFk
anVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5LCBEb05vdEFkanN1dEVuZHBvaW50cyB9OworICAg
IHZvaWQgc2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2Vs
ZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5LCBFbmRQb2ludHNBZGp1c3RtZW50TW9kZSA9IERvTm90
QWRqc3V0RW5kcG9pbnRzKTsKICAgICB2b2lkIHNldEZvY3VzZWROb2RlSWZOZWVkZWQoKTsKICAg
ICB2b2lkIG5vdGlmeVJlbmRlcmVyT2ZTZWxlY3Rpb25DaGFuZ2UoRVVzZXJUcmlnZ2VyZWQpOwog
CkBAIC0yODAsNiArMjgxLDcgQEAKICAgICBMYXlvdXRVbml0IG1feFBvc0ZvclZlcnRpY2FsQXJy
b3dOYXZpZ2F0aW9uOwogCiAgICAgVmlzaWJsZVNlbGVjdGlvbiBtX3NlbGVjdGlvbjsKKyAgICBW
aXNpYmxlUG9zaXRpb24gbV9vcmlnaW5hbEJhc2U7IC8vIFVzZWQgdG8gc3RvcmUgYmFzZSBiZWZv
cmUgdGhlIGFkanVzdG1lbnQgYXQgYmlkaSBib3VuZGFyeQogICAgIFRleHRHcmFudWxhcml0eSBt
X2dyYW51bGFyaXR5OwogCiAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gbV90eXBpbmdTdHlsZTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5oCShyZXZpc2lv
biA5MzU3NykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5oCSh3
b3JraW5nIGNvcHkpCkBAIC00NiwyOCArNDYsOTEgQEAKICAgICBSZW5kZXJlZFBvc2l0aW9uKCk7
CiAgICAgZXhwbGljaXQgUmVuZGVyZWRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsK
ICAgICBleHBsaWNpdCBSZW5kZXJlZFBvc2l0aW9uKGNvbnN0IFBvc2l0aW9uJiwgRUFmZmluaXR5
KTsKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVuZGVyZWRQb3NpdGlvbiYgb3RoZXIpIGNv
bnN0OwogCiAgICAgYm9vbCBpc051bGwoKSBjb25zdCB7IHJldHVybiAhbV9yZW5kZXJlcjsgfQog
ICAgIFJvb3RJbmxpbmVCb3gqIHJvb3RCb3goKSB7IHJldHVybiBtX2lubGluZUJveCA/IG1faW5s
aW5lQm94LT5yb290KCkgOiAwOyB9CiAKKyAgICAvLyBGSVhNRTogZ2V0IHJpZCBvZiBib3goKQor
ICAgIElubGluZUJveCogYm94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3g7IH0KKworICAgIHVuc2ln
bmVkIGNoYXIgYmlkaUxldmVsT25MZWZ0KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVCb3ggPyAo
YXRMZWZ0bW9zdE9mZnNldEluQm94KCkgPyBwcmV2TGVhZkNoaWxkKCkgOiBtX2lubGluZUJveCkt
PmJpZGlMZXZlbCgpIDogMDt9CisgICAgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPblJpZ2h0KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmxpbmVCb3ggPyAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpID8g
bmV4dExlYWZDaGlsZCgpIDogbV9pbmxpbmVCb3gpLT5iaWRpTGV2ZWwoKSA6IDA7fQorICAgIFJl
bmRlcmVkUG9zaXRpb24gbGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxl
dmVsT2ZSdW4pOworICAgIFJlbmRlcmVkUG9zaXRpb24gcmlnaHRCb3VuZGFyeU9mQmlkaVJ1bih1
bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKTsKKworICAgIGVudW0gU2hvdWxkTWF0Y2hCaWRp
TGV2ZWwgeyBNYXRjaEJpZGlMZXZlbCwgSWdub3JlQmlkaUxldmVsIH07CisgICAgYm9vbCBhdExl
ZnRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0TGVmdEJvdW5kYXJ5T2ZCaWRp
UnVuKElnbm9yZUJpZGlMZXZlbCwgbV9pbmxpbmVCb3ggPyBtX2lubGluZUJveC0+YmlkaUxldmVs
KCkgOiAwKTsgfQorICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCkgY29uc3QgeyBy
ZXR1cm4gYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKElnbm9yZUJpZGlMZXZlbCwgbV9pbmxpbmVC
b3ggPyBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgOiAwKTsgfQorICAgIC8vIFRoZSBmb2xsb3dp
bmcgdHdvIGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IHBvc2l0aW9u
IGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJpZGkgcnVuCisgICAgLy8gb2YgdGhlIHNwZWNpZmllZCBi
aWRpIGVtYmVkZGluZyBsZXZlbC4KKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0IHsgcmV0dXJuIGF0TGVmdEJvdW5kYXJ5
T2ZCaWRpUnVuKE1hdGNoQmlkaUxldmVsLCBiaWRpTGV2ZWxPZlJ1bik7IH0KKyAgICBib29sIGF0
UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25z
dCB7IHJldHVybiBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oTWF0Y2hCaWRpTGV2ZWwsIGJpZGlM
ZXZlbE9mUnVuKTsgfQorCiAgICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoKSBjb25zdCB7IHJl
dHVybiBhYnNvbHV0ZVJlY3QoMCk7IH0KICAgICBMYXlvdXRSZWN0IGFic29sdXRlUmVjdChpbnQm
IGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVSZWN0KCZleHRy
YVdpZHRoVG9FbmRPZkxpbmUpOyB9Citwcml2YXRlOgorICAgIGV4cGxpY2l0IFJlbmRlcmVkUG9z
aXRpb24oUmVuZGVyT2JqZWN0KiwgSW5saW5lQm94KiwgaW50IG9mZnNldCk7CiAKLXByaXZhdGU6
CisgICAgZW51bSBDYWNoZVN0YXR1cyB7IENhY2hlZFByZXZMZWFmQ2hpbGQsIENhY2hlZE5leHRM
ZWFmQ2hpbGQgfTsKKyAgICBpbmxpbmUgYm9vbCBzaG91bGRDYWNoZShDYWNoZVN0YXR1cyBmbGFn
KSBjb25zdCB7IHJldHVybiAhKG1fY2FjaGVTdGF0dXMgJiBmbGFnKTsgfQorICAgIGlubGluZSB2
b2lkIHNldENhY2hlZChDYWNoZVN0YXR1cyBmbGFnKSBjb25zdCB7IG1fY2FjaGVTdGF0dXMgfD0g
ZmxhZzsgfQorCisgICAgSW5saW5lQm94KiBwcmV2TGVhZkNoaWxkKCkgY29uc3Q7CisgICAgSW5s
aW5lQm94KiBuZXh0TGVhZkNoaWxkKCkgY29uc3Q7CisgICAgYm9vbCBhdExlZnRtb3N0T2Zmc2V0
SW5Cb3goKSBjb25zdCB7IHJldHVybiBtX2lubGluZUJveCAmJiBtX29mZnNldCA9PSBtX2lubGlu
ZUJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgpOyB9CisgICAgYm9vbCBhdFJpZ2h0bW9zdE9mZnNl
dEluQm94KCkgY29uc3QgeyByZXR1cm4gbV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gbV9pbmxp
bmVCb3gtPmNhcmV0UmlnaHRtb3N0T2Zmc2V0KCk7IH0KKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5
T2ZCaWRpUnVuKFNob3VsZE1hdGNoQmlkaUxldmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9m
UnVuKSBjb25zdDsKKyAgICBib29sIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRj
aEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3Q7CisKICAgICBM
YXlvdXRSZWN0IGFic29sdXRlUmVjdChpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3Q7
CiAKICAgICBSZW5kZXJPYmplY3QqIG1fcmVuZGVyZXI7CiAgICAgSW5saW5lQm94KiBtX2lubGlu
ZUJveDsKICAgICBpbnQgbV9vZmZzZXQ7CisKKyAgICBtdXRhYmxlIHVuc2lnbmVkIG1fY2FjaGVT
dGF0dXMgOiAyOworCisgICAgLy8gRG8gbm90IGluaXRpYWxpemUgdGhlIGZvbGxvd2luZyBtZW1i
ZXIgdmFyaWFibGVzIGFzIG9wdGltaXphdGlvbi4KKyAgICAvLyBGbGFncyBpbiBtX2NhY2hlU3Rh
dHVzIHRlbGwgdXMgd2hpY2ggb25lcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgbXV0YWJsZSBJbmxp
bmVCb3gqIG1fcHJldkxlYWZDaGlsZDsKKyAgICBtdXRhYmxlIElubGluZUJveCogbV9uZXh0TGVh
ZkNoaWxkOwogfTsKIAogaW5saW5lIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVkUG9zaXRpb24o
KQogICAgIDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zm
c2V0KDApCisgICAgLCBtX2NhY2hlU3RhdHVzKDApCiB7CiB9CiAKK2lubGluZSBSZW5kZXJlZFBv
c2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIElubGluZUJv
eCogYm94LCBpbnQgb2Zmc2V0KQorICAgIDogbV9yZW5kZXJlcihyZW5kZXJlcikKKyAgICAsIG1f
aW5saW5lQm94KGJveCkKKyAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICAsIG1fY2FjaGVTdGF0
dXMoMCkKK3sKK30KKworaW5saW5lIElubGluZUJveCogUmVuZGVyZWRQb3NpdGlvbjo6cHJldkxl
YWZDaGlsZCgpIGNvbnN0Cit7CisgICAgaWYgKHNob3VsZENhY2hlKENhY2hlZFByZXZMZWFmQ2hp
bGQpKSB7CisgICAgICAgIG1fcHJldkxlYWZDaGlsZCA9IG1faW5saW5lQm94LT5wcmV2TGVhZkNo
aWxkKCk7CisgICAgICAgIHNldENhY2hlZChDYWNoZWRQcmV2TGVhZkNoaWxkKTsKKyAgICB9Cisg
ICAgcmV0dXJuIG1fcHJldkxlYWZDaGlsZDsKK30KKworaW5saW5lIElubGluZUJveCogUmVuZGVy
ZWRQb3NpdGlvbjo6bmV4dExlYWZDaGlsZCgpIGNvbnN0Cit7CisgICAgaWYgKHNob3VsZENhY2hl
KENhY2hlZE5leHRMZWFmQ2hpbGQpKSB7CisgICAgICAgIG1fbmV4dExlYWZDaGlsZCA9IG1faW5s
aW5lQm94LT5uZXh0TGVhZkNoaWxkKCk7CisgICAgICAgIHNldENhY2hlZChDYWNoZWROZXh0TGVh
ZkNoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIG1fbmV4dExlYWZDaGlsZDsKK30KKwogYm9vbCBy
ZW5kZXJPYmplY3RDb250YWluc1Bvc2l0aW9uKFJlbmRlck9iamVjdCosIGNvbnN0IFBvc2l0aW9u
Jik7CiAKIH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCShyZXZpc2lv
biA5MzU3NykKKysrIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtNjkwLDcgKzY5MCw4IEBACiAgICAgaWYgKG1fZnJhbWUtPnNlbGVjdGlvbigp
LT5ncmFudWxhcml0eSgpICE9IENoYXJhY3RlckdyYW51bGFyaXR5KQogICAgICAgICBuZXdTZWxl
Y3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0eShtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSk7CiAKLSAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxT
ZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rpb24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFu
dWxhcml0eSgpKTsKKyAgICBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxT
ZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rpb24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFu
dWxhcml0eSgpLAorICAgICAgICBGcmFtZVNlbGVjdGlvbjo6QWRqdXN0RW5kcG9pbnRzQXRCaWRp
Qm91bmRhcnkpOwogfQogI2VuZGlmIC8vIEVOQUJMRShEUkFHX1NVUFBPUlQpCiAKSW5kZXg6IExh
eW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGkt
cnVuLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2Vs
ZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsOTEgQEAKK1RoaXMgdGVzdCBlbnN1cmVzIFdlYktpdCBsZXRzIHVzZXIgc2VsZWN0IGJpZGly
ZWN0aW9uYWwgdGV4dCBpbnR1aXRpdmVseS4gVG8gbWFudWFsbHkgdGVzdCwgc2VsZWN0IHRleHQg
aW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0IGNhc2UgYmVsb3cgYnkgYSBtb3VzZSBkcmFnIGZyb20g
bGVmdCB0byByaWdodC4gVGhlIGNoYW5nZXMgaW4gdGhlIHNlbGVjdGVkIHRleHQgc2hvdWxkIG1h
dGNoIHRoZSBleHBlY3RhdGlvbnMgYmVmb3JlIHwuIERvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJh
ZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5kIGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIgfC4KKworU2Vs
ZWN0ZWQgdGV4dDoKK2FiY9eQ15HXkgorYSBhYiBhYmMgYWJjQUIgYWJjQSBhYmNBQkMgfCBBIEFC
IEFCQyBjQUJDIGJjQUJDIGFiY0FCQwor15DXkdeSZGVmCitDIEJDIEFCQyBBQkNkIEFCQ2VmIEFC
Q2RlZiB8IGYgZWYgZGVmIEJDZGVmIENkZWYgQUJDZGVmCithYmPXkNeR15JkZWYKK0MgQkMgQUJD
IHwgQSBBQiBBQkMKK9eQ15HXkmRlZgorQyBCQyBBQkMgfCBBIEFCIEFCQwor15DXkdeSZGVmINeQ
15HXkmRlZgorZSBlZiB8IGYgZWYKK2FiY9eQ15HXkiBhYmPXkNeR15IKK0IgQUIgfCBBIEFCCitU
ZXN0ICJhYmNBQkMiIGluICJhYmNBQkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAor
UEFTUyBzZWxlY3RlZCAiYSIKK1BBU1Mgc2VsZWN0ZWQgImFiIgorUEFTUyBzZWxlY3RlZCAiYWJj
IgorUEFTUyBzZWxlY3RlZCAiYWJjQUIiCitQQVNTIHNlbGVjdGVkICJhYmNBIgorUEFTUyBzZWxl
Y3RlZCAiYWJjQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3Rl
ZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxl
Y3RlZCAiY0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJD
IgorCitUZXN0ICJBQkNkZWYiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byBy
aWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3Rl
ZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiQUJDZCIKK0ZBSUwgc2VsZWN0ZWQgIkFCQ2RlIiBidXQg
ZXhwZWN0ZWQgIkFCQ2VmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorU2VsZWN0aW5nIGZyb20g
cmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorUEFT
UyBzZWxlY3RlZCAiZGVmIgorUEFTUyBzZWxlY3RlZCAiQkNkZWYiCitQQVNTIHNlbGVjdGVkICJD
ZGVmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorCitUZXN0ICJBQkMiIGluICJhYmNBQkNkZWYi
OgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mg
c2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQg
dG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxl
Y3RlZCAiQUJDIgorCitUZXN0ICJBQkMiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVm
dCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBz
ZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3Rl
ZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJl
ZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVj
dGVkICJlIgorUEFTUyBzZWxlY3RlZCAiZWYiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0
CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAiZWYiCisKK1Rlc3QgIkFCIiBpbiAi
YWJjQUJDIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkIi
CitQQVNTIHNlbGVjdGVkICJBQiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mg
c2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKKworUEFTUyBzdWNjZXNzZnVsbHlQYXJz
ZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKKworCisKKwpJbmRleDogTGF5b3V0VGVzdHMv
ZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRt
bAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWw+
Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9o
dG1sOyBjaGFyc2V0PXV0Zi04Ij4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4v
ZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiPgorPHNjcmlwdCBzcmM9Ii4uLy4u
L2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4KKzxzdHlsZSB0eXBl
PSJ0ZXh0L2NzcyI+CisjdGVzdHMgeyBmb250LXNpemU6IDIuNWVtOyBwYWRkaW5nOiAwcHg7IG1h
cmdpbjogMHB4OyB9CitkdCB7IHdpZHRoOiAxNWV4OyBwYWRkaW5nOiAwcHggMTBweDsgbWFyZ2lu
OiAwcHg7IH0KK2RkIHsgZm9udC1zaXplOiAwLjZlbTsgbWFyZ2luOiAwcHg7IHBhZGRpbmc6IDBw
eCAxMHB4OyB9CisudGFyZ2V0IHsgYmFja2dyb3VuZC1jb2xvcjogI2JiZWVmZjsgfQorPC9zdHls
ZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhpcyB0ZXN0IGVuc3VyZXMgV2ViS2l0IGxldHMgdXNl
ciBzZWxlY3QgYmlkaXJlY3Rpb25hbCB0ZXh0IGludHVpdGl2ZWx5LgorVG8gbWFudWFsbHkgdGVz
dCwgc2VsZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0IGNhc2UgYmVsb3cgYnkgYSBt
b3VzZSBkcmFnIGZyb20gbGVmdCB0byByaWdodC4KK1RoZSBjaGFuZ2VzIGluIHRoZSBzZWxlY3Rl
ZCB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8LgorRG8gdGhlIHNh
bWUgYnkgYSBtb3VzZSBkcmFnIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgZXhwZWN0YXRpb25zIGFy
ZSBhZnRlciB8LjwvcD4KKzxkaXY+U2VsZWN0ZWQgdGV4dDogPHNwYW4gaWQ9ImxvZyI+PC9zcGFu
PjwvZGl2PgorPGRsIGlkPSJ0ZXN0cyI+Cis8ZHQgY29udGVudGVkaXRhYmxlPjxzcGFuIGNsYXNz
PSJ0YXJnZXQiPmFiY9eQ15HXkjwvc3Bhbj48L2R0PgorPGRkPmEgYWIgYWJjIGFiY0FCIGFiY0Eg
YWJjQUJDIHwgQSBBQiBBQkMgY0FCQyBiY0FCQyBhYmNBQkM8L2RkPgorCis8ZHQgY29udGVudGVk
aXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkmRlZjwvc3Bhbj48L2R0PgorPGRkPkMg
QkMgQUJDIEFCQ2QgQUJDZWYgQUJDZGVmIHwgZiBlZiBkZWYgQkNkZWYgQ2RlZiBBQkNkZWY8L2Rk
PgorCis8ZHQgY29udGVudGVkaXRhYmxlPmFiYzxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkjwv
c3Bhbj5kZWY8L2R0PgorPGRkPkMgQkMgQUJDIHwgQSBBQiBBQkM8L2RkPgorCis8ZHQgZGlyPSJy
dGwiIGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15I8L3NwYW4+ZGVm
PC9kdD4KKzxkZD5DIEJDIEFCQyB8IEEgQUIgQUJDPC9kZD4KKworPCEtLTxkdCBjb250ZW50ZWRp
dGFibGU+15zXqdegIDIwMDkgLSA1MTY8L2R0PgorPGRkPkMgQkMgQUJDIHwgQSBBQiBBQkM8L2Rk
Pi0tPgorCis8IS0tIFdvcmsgYXJvdW5kIGEgV2ViS2l0IGJ1ZyB0aGF0IGhpdC10ZXN0aW5nIGRv
ZXNuJ3Qgd29yayBwcm9wZXJ0eSB3aXRoIHNwYW4gbWl4ZWQgd2l0aCBiaWRpcmVjdGlvbmFsIHRl
eHQKK2J5IG92ZXJsYXBwaW5nIHR3byBzcGFucywgb25lIHVzZWQgZm9yIGFjdHVhbCB0ZXN0aW5n
IGFuZCBhbm90aGVyIG9uZSBwcm92aWRpbmcgdGhlIGJsdWUgYmFja2dyb3VuZCBjb2xvci4gLS0+
Cis8ZHQgZGlyPSJydGwiIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7Ij7XkNeR15JkZWYKKzxz
cGFuIHN0eWxlPSJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAxMHB4OyB6LWluZGV4OiAtMTsg
Y29sb3I6IHRyYW5zcGFyZW50OyI+15DXkdeSZDxzcGFuIGNsYXNzPSJ0YXJnZXQiPmVmPC9zcGFu
Pjwvc3Bhbj48L2R0PgorPGRkPmUgZWYgfCBmIGVmPC9kZD4KKworPGR0IHN0eWxlPSJwb3NpdGlv
bjogcmVsYXRpdmU7IiBjb250ZW50ZWRpdGFibGU+YWJj15DXkdeSCis8c3BhbiBzdHlsZT0icG9z
aXRpb246IGFic29sdXRlOyBsZWZ0OiAxMHB4OyB6LWluZGV4OiAtMTsgY29sb3I6IHRyYW5zcGFy
ZW50OyI+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+15DXkTwvc3Bhbj7Xkjwvc3Bhbj48L2R0Pgor
PGRkPkIgQUIgfCBBIEFCPC9kZD4KKworPCEtLTxkdCBjb250ZW50ZWRpdGFibGU+Yden15wxMteZ
151kPC9kdD48ZGQ+WzAgMSA2IDMgNCA1IDIgNyA4XSBMKGEgUihBQiBMKDEyKSBDRCkgYik8L2Rk
PgorPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBkaXI9InJ0bCI+MTI8Yj7Xp9ecNDM8L2I+PC9z
cGFuPmFiPC9kdD4KKzxkZD5bNCA1IDYgMyAwIDEgKDIgNikgNyA4XSBMKFJ7TCgxMikgQUIgTCgz
NCl9IGFiKTwvZGQ+Cis8ZHQgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIj48c3BhbiBkaXI9Imx0
ciI+YWJj15zXqdegPC9zcGFuPjwvZHQ+Cis8ZGQ+WzYgMSAyIDYgNSA0IDNdIFIoTHthYmMgUihD
QkEpfSk8L2RkPi0tPgorPC9kbD4KKzxkaXYgaWQ9ImNvbnNvbGUiPjwvZGl2PgorPHByZT48c2Ny
aXB0PgordmFyIHRlc3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3RzJyk7CisKK1N0
cmluZy5wcm90b3R5cGUuZm9sZCA9IGZ1bmN0aW9uICgpIHsKKyAgICB2YXIgcmVzdWx0ID0gJyc7
CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgIHZh
ciBjb2RlID0gdGhpcy5jaGFyQ29kZUF0KGkpOworICAgICAgICBpZiAoMHgwNWQwIDw9IGNvZGUg
JiYgY29kZSA8PSAweDA1ZWEpLy8gSGVicmV3IEFsZWYKKyAgICAgICAgICAgIGNvZGUgKz0gLTB4
MDVkMCArICdBJy5jaGFyQ29kZUF0KDApOworICAgICAgICByZXN1bHQgKz0gU3RyaW5nLmZyb21D
aGFyQ29kZShjb2RlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworZnVuY3Rpb24g
YXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGFjdHVhbCkgeworICAgIGRvY3VtZW50LndyaXRlbG4oJ0U6
JyArIGV4cGVjdGVkICsgJyBBOicgKyBhY3R1YWwpOworfQorCitmdW5jdGlvbiBzZWxlY3RCeU1v
dXNlRHJhZ0FuZFZlcmlmeVJlc3VsdCh0YXJnZXQsIGxlZnRUb1JpZ2h0LCBleHBlY3RhdGlvbnMp
IHsKKyAgICB2YXIgeSA9IHRhcmdldC5vZmZzZXRUb3AgKyB0YXJnZXQub2Zmc2V0SGVpZ2h0IC8g
MjsKKyAgICB2YXIgbGVmdCA9IHRhcmdldC5vZmZzZXRMZWZ0OworCisgICAgaWYgKHRhcmdldC5w
YXJlbnROb2RlLnBhcmVudE5vZGUuc3R5bGUucG9zaXRpb24gPT0gJ3JlbGF0aXZlJykgeworICAg
ICAgICBsZWZ0ICs9IHRhcmdldC5wYXJlbnROb2RlLm9mZnNldExlZnQgKyB0YXJnZXQucGFyZW50
Tm9kZS5wYXJlbnROb2RlLm9mZnNldExlZnQ7CisgICAgICAgIHkgKz0gdGFyZ2V0LnBhcmVudE5v
ZGUub2Zmc2V0VG9wICsgdGFyZ2V0LnBhcmVudE5vZGUucGFyZW50Tm9kZS5vZmZzZXRUb3A7Cisg
ICAgfQorCisgICAgdmFyIHN0YXJ0WCA9IGxlZnQgKyAobGVmdFRvUmlnaHQgPyAwIDogdGFyZ2V0
Lm9mZnNldFdpZHRoKTsKKyAgICBldmVudFNlbmRlci5kcmFnTW9kZSA9IGZhbHNlOworICAgIGV2
ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDMwMDApOworICAgIGV2ZW50U2VuZGVyLm1vdXNlTW92ZVRv
KHN0YXJ0WCwgeSk7CisgICAgZXZlbnRTZW5kZXIubW91c2VEb3duKCk7CisKKyAgICB2YXIgcHJl
dmlvdXNTZWxlY3RlZFRleHQgPSAnJzsKKyAgICB2YXIgaiA9IDA7CisgICAgdmFyIHhJbmNyZW1l
bnQgPSBsZWZ0VG9SaWdodCA/IDEgOiAtMTsKKyAgICBmb3IgKHZhciB4ID0gc3RhcnRYOyBsZWZ0
IDw9IHggJiYgeCA8PSBsZWZ0ICsgdGFyZ2V0Lm9mZnNldFdpZHRoOyB4ICs9IHhJbmNyZW1lbnQp
IHsKKyAgICAgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAwKTsKKyAgICAgICAgZXZlbnRT
ZW5kZXIubW91c2VNb3ZlVG8oeCwgeSk7CisKKyAgICAgICAgdmFyIHNlbGVjdGVkVGV4dCA9IHdp
bmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmZvbGQoKTsKKyAgICAgICAgaWYgKHByZXZp
b3VzU2VsZWN0ZWRUZXh0ICE9IHNlbGVjdGVkVGV4dCkgeworICAgICAgICAgICAgaWYgKGV4cGVj
dGF0aW9uc1tqXSA9PSBzZWxlY3RlZFRleHQpCisgICAgICAgICAgICAgICAgdGVzdFBhc3NlZCgn
c2VsZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAnIicpOworICAgICAgICAgICAgZWxzZQorICAg
ICAgICAgICAgICAgIHRlc3RGYWlsZWQoJ3NlbGVjdGVkICInICsgc2VsZWN0ZWRUZXh0ICsgJyIg
YnV0IGV4cGVjdGVkICInICsgZXhwZWN0YXRpb25zW2pdICsgJyInKTsKKyAgICAgICAgICAgIHBy
ZXZpb3VzU2VsZWN0ZWRUZXh0ID0gc2VsZWN0ZWRUZXh0OworICAgICAgICAgICAgaisrOworICAg
ICAgICB9CisgICAgfQorCisgICAgZXZlbnRTZW5kZXIubW91c2VVcCgpOworfQorCitpZiAod2lu
ZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVt
cEFzVGV4dCgpOworCisgICAgdmFyIHRlc3RzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rl
c3RzJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2R0Jyk7CisgICAgdmFyIHRlc3RFeHBlY3RhdGlv
bnMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKS5nZXRFbGVtZW50c0J5VGFnTmFt
ZSgnZGQnKTsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7Cisg
ICAgICAgIHZhciB0YXJnZXQgPSB0ZXN0c1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXJn
ZXQnKVswXTsKKyAgICAgICAgdmFyIHRlc3RFeHBlY3RhdGlvbiA9IHRlc3RFeHBlY3RhdGlvbnNb
aV0udGV4dENvbnRlbnQ7CisKKyAgICAgICAgZGVidWcoJ1Rlc3QgIicgKyB0YXJnZXQudGV4dENv
bnRlbnQuZm9sZCgpICsgJyIgaW4gIicgKyB0YXJnZXQucGFyZW50Tm9kZS50ZXh0Q29udGVudC5m
b2xkKCkgKyAnIjonKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmln
aHQnKTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCB0
cnVlLCB0ZXN0RXhwZWN0YXRpb24uc3BsaXQoL1x8LylbMF0udHJpbSgpLnNwbGl0KC9ccysvKSk7
CisgICAgICAgIGRlYnVnKCdTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0Jyk7CisgICAgICAg
IHNlbGVjdEJ5TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgZmFsc2UsIHRlc3RFeHBl
Y3RhdGlvbi5zcGxpdCgvXHwvKVsxXS50cmltKCkuc3BsaXQoL1xzKy8pKTsKKyAgICAgICAgZGVi
dWcoJycpOworICAgIH0KK30gZWxzZSB7CisgICAgZGVidWcoJ1RoaXMgdGVzdCByZXF1aXJlcyBl
dmVudFNlbmRlcicpOworICAgIGRvY3VtZW50Lm9uc2VsZWN0aW9uY2hhbmdlID0gZnVuY3Rpb24g
KCkgeworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJykudGV4dENvbnRlbnQg
PSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5mb2xkKCk7CisgICAgfQorfQorCit2
YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKworPC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0i
Li4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9k
eT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>106833</attachid>
            <date>2011-09-08 20:31:04 -0700</date>
            <delta_ts>2011-09-09 23:10:50 -0700</delta_ts>
            <desc>work in progress 6</desc>
            <filename>wip57340f</filename>
            <type>text/plain</type>
            <size>24373</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBl
Y3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2Vs
ZWN0LWJpZGktcnVuLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2Vk
aXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMTIyIEBACitUaGlzIHRlc3QgZW5zdXJlcyBXZWJLaXQgbGV0cyB1c2VyIHNl
bGVjdCBiaWRpcmVjdGlvbmFsIHRleHQgaW50dWl0aXZlbHkuIFRvIG1hbnVhbGx5IHRlc3QsIHNl
bGVjdCB0ZXh0IGluIGJsdWUgYm94IGluIGVhY2ggdGVzdCBjYXNlIGJlbG93IGJ5IGEgbW91c2Ug
ZHJhZyBmcm9tIGxlZnQgdG8gcmlnaHQuIFRoZSBjaGFuZ2VzIGluIHRoZSBzZWxlY3RlZCB0ZXh0
IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8LiBEbyB0aGUgc2FtZSBieSBh
IG1vdXNlIGRyYWcgZnJvbSByaWdodCB0byBsZWZ0IGFuZCBleHBlY3RhdGlvbnMgYXJlIGFmdGVy
IHwuCisKK1Rlc3QgImFiY0FCQyIgaW4gImFiY0FCQyI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRv
IHJpZ2h0CitQQVNTIHNlbGVjdGVkICJhIgorUEFTUyBzZWxlY3RlZCAiYWIiCitQQVNTIHNlbGVj
dGVkICJhYmMiCitQQVNTIHNlbGVjdGVkICJhYmNBQiIKK1BBU1Mgc2VsZWN0ZWQgImFiY0EiCitQ
QVNTIHNlbGVjdGVkICJhYmNBQkMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNT
IHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitQ
QVNTIHNlbGVjdGVkICJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYmNBQkMiCitQQVNTIHNlbGVjdGVk
ICJhYmNBQkMiCisKK1Rlc3QgIkFCQ2RlZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBs
ZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJDIgorUEFTUyBzZWxlY3RlZCAiQkMiCitQQVNT
IHNlbGVjdGVkICJBQkMiCitQQVNTIHNlbGVjdGVkICJBQkNkIgorRkFJTCBzZWxlY3RlZCAiQUJD
ZGUiIGJ1dCBleHBlY3RlZCAiQUJDZWYiCitQQVNTIHNlbGVjdGVkICJBQkNkZWYiCitTZWxlY3Rp
bmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAi
ZWYiCitQQVNTIHNlbGVjdGVkICJkZWYiCitQQVNTIHNlbGVjdGVkICJCQ2RlZiIKK1BBU1Mgc2Vs
ZWN0ZWQgIkNkZWYiCitQQVNTIHNlbGVjdGVkICJBQkNkZWYiCisKK1Rlc3QgIkFCQyIgaW4gImFi
Y0FCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJD
IgorUEFTUyBzZWxlY3RlZCAiQkMiCitQQVNTIHNlbGVjdGVkICJBQkMiCitTZWxlY3RpbmcgZnJv
bSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQ
QVNTIHNlbGVjdGVkICJBQkMiCisKK1Rlc3QgIkFCQyIgaW4gIkFCQ2RlZiI6CitTZWxlY3Rpbmcg
ZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJDIgorUEFTUyBzZWxlY3RlZCAiQkMi
CitQQVNTIHNlbGVjdGVkICJBQkMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNT
IHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCisK
K1Rlc3QgImVmIiBpbiAiQUJDZGVmIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BB
U1Mgc2VsZWN0ZWQgImUiCitQQVNTIHNlbGVjdGVkICJlZiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0
IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgImYiCitQQVNTIHNlbGVjdGVkICJlZiIKKworVGVzdCAi
QUIiIGluICJhYmNBQkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxl
Y3RlZCAiQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVm
dAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorCitUZXN0ICIxMiIgaW4g
ImFYTTEySk5kIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQg
IjEiCitQQVNTIHNlbGVjdGVkICIxMiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BB
U1Mgc2VsZWN0ZWQgIjIiCitQQVNTIHNlbGVjdGVkICIxMiIKKworVGVzdCAiQUJDIDEyMyIgaW4g
IkFCQyAxMjMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAi
MSIKK1BBU1Mgc2VsZWN0ZWQgIjEyIgorUEFTUyBzZWxlY3RlZCAiMTIzIgorUEFTUyBzZWxlY3Rl
ZCAiIDEyMyIKK1BBU1Mgc2VsZWN0ZWQgIkMgMTIzIgorUEFTUyBzZWxlY3RlZCAiQkMgMTIzIgor
UEFTUyBzZWxlY3RlZCAiQUJDIDEyMyIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BB
U1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIK
K1BBU1Mgc2VsZWN0ZWQgIkFCQyAiCitQQVNTIHNlbGVjdGVkICJBQkMgMTIiCitQQVNTIHNlbGVj
dGVkICJBQkMgMSIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxMjMiCisKK1Rlc3QgIkFCQyAxMjMiIGlu
ICJBQkMgMTIzIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQg
IjEiCitQQVNTIHNlbGVjdGVkICIxMiIKK0ZBSUwgc2VsZWN0ZWQgIjEyMyIgYnV0IGV4cGVjdGVk
ICIgMTIzIgorRkFJTCBzZWxlY3RlZCAiICIgYnV0IGV4cGVjdGVkICJDIDEyMyIKK0ZBSUwgc2Vs
ZWN0ZWQgIkMgIiBidXQgZXhwZWN0ZWQgIkJDIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIkJDICIgYnV0
IGV4cGVjdGVkICJBQkMgMTIzIgorRkFJTCBzZWxlY3RlZCAiMTIzIiBidXQgZXhwZWN0ZWQgInVu
ZGVmaW5lZCIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgIkEi
CitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKK0ZBSUwgc2VsZWN0ZWQg
IiIgYnV0IGV4cGVjdGVkICJBQkMgIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEyIgorUEFTUyBzZWxl
Y3RlZCAiQUJDIDEiCitGQUlMIHNlbGVjdGVkICIxMjMiIGJ1dCBleHBlY3RlZCAiQUJDIDEyMyIK
KworUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKKwor
CisKKwpJbmRleDogTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVu
Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0
LWJpZGktcnVuLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVj
dGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNDMgQEAK
KzwhRE9DVFlQRSBodG1sPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRl
bnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKzxsaW5rIHJlbD0i
c3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5j
c3MiPgorPHNjcmlwdCBzcmM9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpz
Ij48L3NjcmlwdD4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisjdGVzdHMgeyBmb250LXNpemU6
IDIuNWVtOyBwYWRkaW5nOiAwcHg7IG1hcmdpbjogMHB4OyB9CitkdCB7IHdpZHRoOiAxNWV4OyBw
YWRkaW5nOiAwcHggMTBweDsgbWFyZ2luOiAwcHg7IH0KK2RkIHsgZm9udC1zaXplOiAwLjZlbTsg
bWFyZ2luOiAwcHg7IHBhZGRpbmc6IDBweCAxMHB4OyB9CisudGFyZ2V0IHsgYmFja2dyb3VuZC1j
b2xvcjogI2JiZWVmZjsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhpcyB0ZXN0
IGVuc3VyZXMgV2ViS2l0IGxldHMgdXNlciBzZWxlY3QgYmlkaXJlY3Rpb25hbCB0ZXh0IGludHVp
dGl2ZWx5LgorVG8gbWFudWFsbHkgdGVzdCwgc2VsZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFj
aCB0ZXN0IGNhc2UgYmVsb3cgYnkgYSBtb3VzZSBkcmFnIGZyb20gbGVmdCB0byByaWdodC4KK1Ro
ZSBjaGFuZ2VzIGluIHRoZSBzZWxlY3RlZCB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0YXRp
b25zIGJlZm9yZSB8LgorRG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBkcmFnIGZyb20gcmlnaHQgdG8g
bGVmdCBhbmQgZXhwZWN0YXRpb25zIGFyZSBhZnRlciB8LjwvcD4KKzxkaXY+U2VsZWN0ZWQgdGV4
dDogPHNwYW4gaWQ9ImxvZyI+PC9zcGFuPjwvZGl2PgorPGRsIGlkPSJ0ZXN0cyI+Cis8ZHQgY29u
dGVudGVkaXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPmFiY9eQ15HXkjwvc3Bhbj48L2R0Pgor
PGRkPmEsYWIsYWJjLGFiY0FCLGFiY0EsYWJjQUJDfEEsQUIsQUJDLGNBQkMsYmNBQkMsYWJjQUJD
PC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15Jk
ZWY8L3NwYW4+PC9kdD4KKzxkZD5DLEJDLEFCQyxBQkNkLEFCQ2VmLEFCQ2RlZnxmLGVmLGRlZixC
Q2RlZixDZGVmLEFCQ2RlZjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+YWJjPHNwYW4gY2xh
c3M9InRhcmdldCI+15DXkdeSPC9zcGFuPmRlZjwvZHQ+Cis8ZGQ+QyxCQyxBQkN8QSxBQixBQkM8
L2RkPgorCis8ZHQgZGlyPSJydGwiIGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0
Ij7XkNeR15I8L3NwYW4+ZGVmPC9kdD4KKzxkZD5DLEJDLEFCQ3xBLEFCLEFCQzwvZGQ+CisKKzxk
dCBkaXI9InJ0bCI+15DXkdeSZDxzcGFuIGNsYXNzPSJ0YXJnZXQiPmVmPC9zcGFuPjwvZHQ+Cis8
ZGQ+ZSxlZnxmLGVmPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT5hYmM8c3BhbiBjbGFzcz0i
dGFyZ2V0Ij7XkNeRPC9zcGFuPteSPC9kdD4KKzxkZD5CLEFCfEEsQUI8L2RkPgorCis8ZHQgY29u
dGVudGVkaXRhYmxlPmHXp9ecPHNwYW4gY2xhc3M9InRhcmdldCI+MTI8L3NwYW4+15nXnWQ8L2R0
PgorPGRkPjEsMTJ8MiwxMjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGUgZGlyPSJydGwiPjxz
cGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkiAxMjM8L3NwYW4+PC9kdD4KKzxkZD4xLDEyLDEyMywg
MTIzLEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFCQyAx
MjM8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HX
kiAxMjM8L3NwYW4+PC9kdD4KKzxkZD4xLDEyLCAxMjMsQyAxMjMsQkMgMTIzLEFCQyAxMjN8QSxB
QixBQkMsQUJDICxBQkMgMTIsQUJDIDEsQUJDIDEyMzwvZGQ+CisKKzwhLS08ZHQgY29udGVudGVk
aXRhYmxlPmHXp9ecMTLXmdedZDwvZHQ+PGRkPlswIDEgNiAzIDQgNSAyIDcgOF0gTChhIFIoQUIg
TCgxMikgQ0QpIGIpPC9kZD4KKzxkdCBjb250ZW50ZWRpdGFibGU+PHNwYW4gZGlyPSJydGwiPjEy
PGI+16fXnDQzPC9iPjwvc3Bhbj5hYjwvZHQ+Cis8ZGQ+WzQgNSA2IDMgMCAxICgyIDYpIDcgOF0g
TChSe0woMTIpIEFCIEwoMzQpfSBhYik8L2RkPgorPGR0IGNvbnRlbnRlZGl0YWJsZSBkaXI9InJ0
bCI+PHNwYW4gZGlyPSJsdHIiPmFiY9ec16nXoDwvc3Bhbj48L2R0PgorPGRkPls2IDEgMiA2IDUg
NCAzXSBSKEx7YWJjIFIoQ0JBKX0pPC9kZD4tLT4KKzwvZGw+Cis8ZGl2IGlkPSJjb25zb2xlIj48
L2Rpdj4KKzxwcmU+PHNjcmlwdD4KK3ZhciB0ZXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCd0ZXN0cycpOworCitTdHJpbmcucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoKSB7CisgICAg
dmFyIHJlc3VsdCA9ICcnOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkr
KykgeworICAgICAgICB2YXIgY29kZSA9IHRoaXMuY2hhckNvZGVBdChpKTsKKyAgICAgICAgaWYg
KDB4MDVkMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgwNWVhKS8vIEhlYnJldyBBbGVmCisgICAgICAg
ICAgICBjb2RlICs9IC0weDA1ZDAgKyAnQScuY2hhckNvZGVBdCgwKTsKKyAgICAgICAgcmVzdWx0
ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK2Z1bmN0aW9uIGFzc2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpIHsKKyAgICBkb2N1
bWVudC53cml0ZWxuKCdFOicgKyBleHBlY3RlZCArICcgQTonICsgYWN0dWFsKTsKK30KKworZnVu
Y3Rpb24gc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCBsZWZ0VG9SaWdo
dCwgZXhwZWN0YXRpb25zKSB7CisgICAgdmFyIHkgPSB0YXJnZXQub2Zmc2V0VG9wICsgdGFyZ2V0
Lm9mZnNldEhlaWdodCAvIDI7CisgICAgdmFyIGxlZnQgPSB0YXJnZXQub2Zmc2V0TGVmdDsKKwor
ICAgIHZhciBzdGFydFggPSBsZWZ0ICsgKGxlZnRUb1JpZ2h0ID8gMCA6IHRhcmdldC5vZmZzZXRX
aWR0aCk7CisgICAgZXZlbnRTZW5kZXIuZHJhZ01vZGUgPSBmYWxzZTsKKyAgICBldmVudFNlbmRl
ci5sZWFwRm9yd2FyZCgzMDAwKTsKKyAgICBldmVudFNlbmRlci5tb3VzZU1vdmVUbyhzdGFydFgs
IHkpOworICAgIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpOworCisgICAgdmFyIHByZXZpb3VzU2Vs
ZWN0ZWRUZXh0ID0gJyc7CisgICAgdmFyIGogPSAwOworICAgIHZhciB4SW5jcmVtZW50ID0gbGVm
dFRvUmlnaHQgPyAxIDogLTE7CisgICAgZm9yICh2YXIgeCA9IHN0YXJ0WDsgbGVmdCA8PSB4ICYm
IHggPD0gbGVmdCArIHRhcmdldC5vZmZzZXRXaWR0aDsgeCArPSB4SW5jcmVtZW50KSB7CisgICAg
ICAgIGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDEwMCk7CisgICAgICAgIGV2ZW50U2VuZGVyLm1v
dXNlTW92ZVRvKHgsIHkpOworCisgICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0
U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5mb2xkKCk7CisgICAgICAgIGlmIChwcmV2aW91c1NlbGVj
dGVkVGV4dCAhPSBzZWxlY3RlZFRleHQpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbnNb
al0gPT0gc2VsZWN0ZWRUZXh0KQorICAgICAgICAgICAgICAgIHRlc3RQYXNzZWQoJ3NlbGVjdGVk
ICInICsgc2VsZWN0ZWRUZXh0ICsgJyInKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAg
ICAgICB0ZXN0RmFpbGVkKCdzZWxlY3RlZCAiJyArIHNlbGVjdGVkVGV4dCArICciIGJ1dCBleHBl
Y3RlZCAiJyArIGV4cGVjdGF0aW9uc1tqXSArICciJyk7CisgICAgICAgICAgICBwcmV2aW91c1Nl
bGVjdGVkVGV4dCA9IHNlbGVjdGVkVGV4dDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIGV2ZW50U2VuZGVyLm1vdXNlVXAoKTsKK30KKworaWYgKHdpbmRvdy5sYXlv
dXRUZXN0Q29udHJvbGxlcikgeworICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQo
KTsKKworICAgIHZhciB0ZXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLmdl
dEVsZW1lbnRzQnlUYWdOYW1lKCdkdCcpOworICAgIHZhciB0ZXN0RXhwZWN0YXRpb25zID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3RzJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RkJyk7
CisKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7ICAgICAgICAK
KyAgICAgICAgdGVzdHNbaV0uc3R5bGUuZGlzcGxheSA9IG51bGw7CisgICAgICAgIHRlc3RFeHBl
Y3RhdGlvbnNbaV0uc3R5bGUuZGlzcGxheSA9IG51bGw7CisKKyAgICAgICAgdmFyIHRhcmdldCA9
IHRlc3RzW2ldLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RhcmdldCcpWzBdOworICAgICAgICB2
YXIgdGVzdEV4cGVjdGF0aW9uID0gdGVzdEV4cGVjdGF0aW9uc1tpXS50ZXh0Q29udGVudDsKKwor
ICAgICAgICBkZWJ1ZygnVGVzdCAiJyArIHRhcmdldC50ZXh0Q29udGVudC5mb2xkKCkgKyAnIiBp
biAiJyArIHRhcmdldC5wYXJlbnROb2RlLnRleHRDb250ZW50LmZvbGQoKSArICciOicpOworICAg
ICAgICBkZWJ1ZygnU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodCcpOworICAgICAgICBzZWxl
Y3RCeU1vdXNlRHJhZ0FuZFZlcmlmeVJlc3VsdCh0YXJnZXQsIHRydWUsIHRlc3RFeHBlY3RhdGlv
bi5zcGxpdCgvXHwvKVswXS5zcGxpdCgvLC8pKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGluZyBm
cm9tIHJpZ2h0IHRvIGxlZnQnKTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlS
ZXN1bHQodGFyZ2V0LCBmYWxzZSwgdGVzdEV4cGVjdGF0aW9uLnNwbGl0KC9cfC8pWzFdLnNwbGl0
KC8sLykpOworICAgICAgICBkZWJ1ZygnJyk7CisKKyAgICAgICAgLy8gU29tZSB0ZXN0cyBtYXkg
YmUgb3VzaWRlIG9mIHRoZSB3aW5kb3cgc28gYnJpbmcgdGhlbSBpbiBhcyB3ZSBwcm9jZXNzLgor
ICAgICAgICB0ZXN0c1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgICAgICB0ZXN0RXhw
ZWN0YXRpb25zW2ldLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgfQorCisgICAgZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3RzJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICBk
b2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJykucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0g
J25vbmUnOworfSBlbHNlIHsKKyAgICBkZWJ1ZygnVGhpcyB0ZXN0IHJlcXVpcmVzIGV2ZW50U2Vu
ZGVyJyk7CisgICAgZG9jdW1lbnQub25zZWxlY3Rpb25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7Cisg
ICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2cnKS50ZXh0Q29udGVudCA9IHdpbmRv
dy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmZvbGQoKTsKKyAgICB9Cit9CisKK3ZhciBzdWNj
ZXNzZnVsbHlQYXJzZWQgPSB0cnVlOworCis8L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9m
YXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9o
dG1sPgpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5jcHAJKHJl
dmlzaW9uIDk0Nzc3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICJSZW5kZXJUaGVt
ZS5oIgogI2luY2x1ZGUgIlJlbmRlclZpZXcuaCIKICNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIK
KyNpbmNsdWRlICJSZW5kZXJlZFBvc2l0aW9uLmgiCiAjaW5jbHVkZSAiU2VjdXJlVGV4dElucHV0
LmgiCiAjaW5jbHVkZSAiU2V0dGluZ3MuaCIKICNpbmNsdWRlICJTcGF0aWFsTmF2aWdhdGlvbi5o
IgpAQCAtMTYzLDEzICsxNjQsNjggQEAKICAgICAgICAgdXBkYXRlQ2FyZXRSZWN0KGRvY3VtZW50
LCBtX3Bvc2l0aW9uKTsKIH0KIAotdm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9u
YWxTZWxlY3Rpb25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWROZXdTZWxl
Y3Rpb24sIFRleHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3N0YXRpYyBib29sIGFkanVzdEVu
ZHBvaW50c0F0QmlkaUJvdW5kYXJ5KFZpc2libGVQb3NpdGlvbiYgYmFzZSwgVmlzaWJsZVBvc2l0
aW9uJiBleHRlbnQpCiB7CisgICAgUmVuZGVyZWRQb3NpdGlvbiBiYXNlUG9zaXRpb24oYmFzZSk7
CisgICAgUmVuZGVyZWRQb3NpdGlvbiBleHRlbnRQb3NpdGlvbihleHRlbnQpOworICAgIAorICAg
IGlmIChiYXNlUG9zaXRpb24uaXNOdWxsKCkgfHwgZXh0ZW50UG9zaXRpb24uaXNOdWxsKCkgfHwg
YmFzZVBvc2l0aW9uID09IGV4dGVudFBvc2l0aW9uKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoYmFzZVBvc2l0aW9uLmF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCkpIHsKKyAgICAg
ICAgaWYgKCFleHRlbnRQb3NpdGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0
aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkKKyAgICAgICAgICAgICYmIGJhc2VQb3NpdGlvbiA9PSBl
eHRlbnRQb3NpdGlvbi5sZWZ0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZl
bE9uUmlnaHQoKSkpIHsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlUG9zaXRpb24ucG9zaXRpb25B
dExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChiYXNlUG9zaXRp
b24uYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCkpIHsKKyAgICAgICAgaWYgKCFleHRlbnRQb3Np
dGlvbi5hdExlZnRCb3VuZGFyeU9mQmlkaVJ1bihiYXNlUG9zaXRpb24uYmlkaUxldmVsT25MZWZ0
KCkpCisgICAgICAgICAgICAmJiBiYXNlUG9zaXRpb24gPT0gZXh0ZW50UG9zaXRpb24ucmlnaHRC
b3VuZGFyeU9mQmlkaVJ1bihiYXNlUG9zaXRpb24uYmlkaUxldmVsT25MZWZ0KCkpKSB7CisgICAg
ICAgICAgICBiYXNlID0gYmFzZVBvc2l0aW9uLnBvc2l0aW9uQXRSaWdodEJvdW5kYXJ5T2ZCaURp
UnVuKCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGlmIChleHRlbnRQb3NpdGlvbi5hdExlZnRCb3Vu
ZGFyeU9mQmlkaVJ1bigpCisgICAgICAgICYmIGV4dGVudFBvc2l0aW9uID09IGJhc2VQb3NpdGlv
bi5sZWZ0Qm91bmRhcnlPZkJpZGlSdW4oZXh0ZW50UG9zaXRpb24uYmlkaUxldmVsT25SaWdodCgp
KSkgeworICAgICAgICBleHRlbnQgPSBleHRlbnRQb3NpdGlvbi5wb3NpdGlvbkF0TGVmdEJvdW5k
YXJ5T2ZCaURpUnVuKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChl
eHRlbnRQb3NpdGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oKQorICAgICAgICAmJiBleHRl
bnRQb3NpdGlvbiA9PSBiYXNlUG9zaXRpb24ucmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihleHRlbnRQ
b3NpdGlvbi5iaWRpTGV2ZWxPbkxlZnQoKSkpIHsKKyAgICAgICAgZXh0ZW50ID0gZXh0ZW50UG9z
aXRpb24ucG9zaXRpb25BdFJpZ2h0Qm91bmRhcnlPZkJpRGlSdW4oKTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEZyYW1lU2VsZWN0
aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKGNvbnN0IFZpc2libGVTZWxl
Y3Rpb24mIHBhc3NlZE5ld1NlbGVjdGlvbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LAor
ICAgIEVuZFBvaW50c0FkanVzdG1lbnRNb2RlIGVuZHBvaW50c0FkanVzdG1lbnRNb2RlKQorewog
ICAgIFZpc2libGVTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gcGFzc2VkTmV3U2VsZWN0aW9uOwor
ICAgIGJvb2wgaXNEaXJlY3Rpb25hbCA9IHNob3VsZEFsd2F5c1VzZURpcmVjdGlvbmFsU2VsZWN0
aW9uKG1fZnJhbWUpIHx8IG5ld1NlbGVjdGlvbi5pc0RpcmVjdGlvbmFsKCk7CiAKLSAgICBpZiAo
c2hvdWxkQWx3YXlzVXNlRGlyZWN0aW9uYWxTZWxlY3Rpb24obV9mcmFtZSkpCi0gICAgICAgIG5l
d1NlbGVjdGlvbi5zZXRJc0RpcmVjdGlvbmFsKHRydWUpOworICAgIFZpc2libGVQb3NpdGlvbiBi
YXNlID0gbV9vcmlnaW5hbEJhc2UuaXNOb3ROdWxsKCkgPyBtX29yaWdpbmFsQmFzZSA6IG5ld1Nl
bGVjdGlvbi52aXNpYmxlQmFzZSgpOworICAgIFZpc2libGVQb3NpdGlvbiBuZXdCYXNlID0gYmFz
ZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50ID0gbmV3U2VsZWN0aW9uLnZpc2libGVF
eHRlbnQoKTsKKyAgICBpZiAoZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUgPT0gQWRqdXN0RW5kcG9p
bnRzQXRCaWRpQm91bmRhcnkgJiYgYWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkobmV3QmFz
ZSwgbmV3RXh0ZW50KSkgeworICAgICAgICBtX29yaWdpbmFsQmFzZSA9IGJhc2U7CisgICAgICAg
IG5ld1NlbGVjdGlvbi5zZXRCYXNlKG5ld0Jhc2UpOworICAgICAgICBuZXdTZWxlY3Rpb24uc2V0
RXh0ZW50KG5ld0V4dGVudCk7CisgICAgfSBlbHNlIGlmIChtX29yaWdpbmFsQmFzZS5pc05vdE51
bGwoKSkgeworICAgICAgICBpZiAobV9zZWxlY3Rpb24uYmFzZSgpID09IG5ld1NlbGVjdGlvbi5i
YXNlKCkpCisgICAgICAgICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZShtX29yaWdpbmFsQmFzZSk7
CisgICAgICAgIG1fb3JpZ2luYWxCYXNlLmNsZWFyKCk7CisgICAgfQogCisgICAgLy8gQWRqdXN0
aW5nIGJhc2UgYW5kIGV4dGVudCB3aWxsIG1ha2UgdGhpcyBzZWxlY3Rpb24gYWx3YXlzIGRpcmVj
dGlvbmFsCisgICAgbmV3U2VsZWN0aW9uLnNldElzRGlyZWN0aW9uYWwoaXNEaXJlY3Rpb25hbCk7
CiAgICAgaWYgKG1fc2VsZWN0aW9uID09IG5ld1NlbGVjdGlvbiB8fCAhc2hvdWxkQ2hhbmdlU2Vs
ZWN0aW9uKG5ld1NlbGVjdGlvbikpCiAgICAgICAgIHJldHVybjsKIApJbmRleDogU291cmNlL1dl
YkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgJKHJldmlzaW9uIDk0Nzc3KQorKysgU291
cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAg
LTY5LDYgKzY5LDggQEAKICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0KCkg
Y29uc3QgeyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG1fc3RhcnQsIGlzUmFuZ2UoKSA/IERPV05T
VFJFQU0gOiBhZmZpbml0eSgpKTsgfQogICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kKCkg
Y29uc3QgeyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG1fZW5kLCBpc1JhbmdlKCkgPyBVUFNUUkVB
TSA6IGFmZmluaXR5KCkpOyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVCYXNlKCkgY29u
c3QgeyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG1fYmFzZSwgaXNSYW5nZSgpID8gKGlzQmFzZUZp
cnN0KCkgPyBVUFNUUkVBTSA6IERPV05TVFJFQU0pIDogYWZmaW5pdHkoKSk7IH0KKyAgICBWaXNp
YmxlUG9zaXRpb24gdmlzaWJsZUV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlv
bihtX2V4dGVudCwgaXNSYW5nZSgpID8gKGlzQmFzZUZpcnN0KCkgPyBET1dOU1RSRUFNIDogVVBT
VFJFQU0pIDogYWZmaW5pdHkoKSk7IH0KIAogICAgIGJvb2wgaXNOb25lKCkgY29uc3QgeyByZXR1
cm4gc2VsZWN0aW9uVHlwZSgpID09IE5vU2VsZWN0aW9uOyB9CiAgICAgYm9vbCBpc0NhcmV0KCkg
Y29uc3QgeyByZXR1cm4gc2VsZWN0aW9uVHlwZSgpID09IENhcmV0U2VsZWN0aW9uOyB9CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAJKHJldmlzaW9u
IDk0Nzc3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNjgsNiArNjgsNyBAQAogICAgIDogbV9yZW5kZXJlcigwKQogICAg
ICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX2NhY2hlU3RhdHVz
KDApCiB7CiAgICAgaWYgKHBvc2l0aW9uLmlzTnVsbCgpKQogICAgICAgICByZXR1cm47CkBAIC04
Miw2ICs4Myw3IEBACiAgICAgOiBtX3JlbmRlcmVyKDApCiAgICAgLCBtX2lubGluZUJveCgwKQog
ICAgICwgbV9vZmZzZXQoMCkKKyAgICAsIG1fY2FjaGVTdGF0dXMoMCkKIHsKICAgICBpZiAocG9z
aXRpb24uaXNOdWxsKCkpCiAgICAgICAgIHJldHVybjsKQEAgLTkyLDYgKzk0LDExOSBAQAogICAg
ICAgICBtX3JlbmRlcmVyID0gcmVuZGVyZXJGcm9tUG9zaXRpb24ocG9zaXRpb24pOwogfQogCiti
b29sIFJlbmRlcmVkUG9zaXRpb246Om9wZXJhdG9yPT0oY29uc3QgUmVuZGVyZWRQb3NpdGlvbiYg
b3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX3JlbmRlcmVyID09IG90aGVyLm1fcmVuZGVy
ZXIgJiYgbV9pbmxpbmVCb3ggPT0gb3RoZXIubV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gb3Ro
ZXIubV9vZmZzZXQpCisgICAgICAgIHx8IChhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSAmJiBvdGhl
ci5hdFJpZ2h0bW9zdE9mZnNldEluQm94KCkgJiYgcHJldkxlYWZDaGlsZCgpID09IG90aGVyLm1f
aW5saW5lQm94KQorICAgICAgICB8fCAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpICYmIG90aGVy
LmF0TGVmdG1vc3RPZmZzZXRJbkJveCgpICYmIG5leHRMZWFmQ2hpbGQoKSA9PSBvdGhlci5tX2lu
bGluZUJveCk7Cit9CisKK3Vuc2lnbmVkIGNoYXIgUmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVs
T25MZWZ0KCkgY29uc3QKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGF0TGVmdG1vc3RPZmZzZXRJ
bkJveCgpID8gcHJldkxlYWZDaGlsZCgpIDogbV9pbmxpbmVCb3g7CisgICAgcmV0dXJuIGJveCA/
IGJveC0+YmlkaUxldmVsKCkgOiAwOworfQorCit1bnNpZ25lZCBjaGFyIFJlbmRlcmVkUG9zaXRp
b246OmJpZGlMZXZlbE9uUmlnaHQoKSBjb25zdAoreworICAgIElubGluZUJveCogYm94ID0gYXRS
aWdodG1vc3RPZmZzZXRJbkJveCgpID8gbmV4dExlYWZDaGlsZCgpIDogbV9pbmxpbmVCb3g7Cisg
ICAgcmV0dXJuIGJveCA/IGJveC0+YmlkaUxldmVsKCkgOiAwOworfQorCitSZW5kZXJlZFBvc2l0
aW9uIFJlbmRlcmVkUG9zaXRpb246OmxlZnRCb3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFy
IGJpZGlMZXZlbE9mUnVuKQoreworICAgIGlmICghbV9pbmxpbmVCb3ggfHwgYmlkaUxldmVsT2ZS
dW4gPiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpCisgICAgICAgIHJldHVybiBSZW5kZXJlZFBv
c2l0aW9uKCk7CisKKyAgICBJbmxpbmVCb3gqIGJveCA9IG1faW5saW5lQm94OworICAgIGRvIHsK
KyAgICAgICAgSW5saW5lQm94KiBwcmV2ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgICAg
IGlmICghcHJldiB8fCBwcmV2LT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKQorICAgICAg
ICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oYm94LT5yZW5kZXJlcigpLCBib3gsIGJveC0+
Y2FyZXRMZWZ0bW9zdE9mZnNldCgpKTsKKyAgICAgICAgYm94ID0gcHJldjsKKyAgICB9IHdoaWxl
IChib3gpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFJlbmRlcmVk
UG9zaXRpb24oKTsKK30KKworUmVuZGVyZWRQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpyaWdo
dEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pCit7CisgICAg
aWYgKCFtX2lubGluZUJveCB8fCBiaWRpTGV2ZWxPZlJ1biA+IG1faW5saW5lQm94LT5iaWRpTGV2
ZWwoKSkKKyAgICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKKworICAgIElubGluZUJv
eCogYm94ID0gbV9pbmxpbmVCb3g7CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gqIG5leHQg
PSBib3gtPm5leHRMZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQtPmJpZGlM
ZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3Np
dGlvbihib3gtPnJlbmRlcmVyKCksIGJveCwgYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKTsK
KyAgICAgICAgYm94ID0gbmV4dDsKKyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworYm9vbCBS
ZW5kZXJlZFBvc2l0aW9uOjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRjaEJpZGlM
ZXZlbCBzaG91bGRNYXRjaEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikg
Y29uc3QKK3sKKyAgICBpZiAoIW1faW5saW5lQm94KQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1h
dGNoQmlkaUxldmVsID09IElnbm9yZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhcHJl
dkxlYWZDaGlsZCgpIHx8IHByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJv
eC0+YmlkaUxldmVsKCk7CisgICAgICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkg
Pj0gYmlkaUxldmVsT2ZSdW4gJiYgKCFwcmV2TGVhZkNoaWxkKCkgfHwgcHJldkxlYWZDaGlsZCgp
LT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRSaWdo
dG1vc3RPZmZzZXRJbkJveCgpKSB7CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZlbCA9
PSBJZ25vcmVCaWRpTGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gbmV4dExlYWZDaGlsZCgpICYm
IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSA8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCk7
CisgICAgICAgIHJldHVybiBuZXh0TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpIDwgYmlkaUxldmVsT2ZSdW4gJiYgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA+PSBi
aWRpTGV2ZWxPZlJ1bjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVu
ZGVyZWRQb3NpdGlvbjo6YXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKFNob3VsZE1hdGNoQmlkaUxl
dmVsIHNob3VsZE1hdGNoQmlkaUxldmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBj
b25zdAoreworICAgIGlmICghbV9pbmxpbmVCb3gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGlmIChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1h
dGNoQmlkaUxldmVsID09IElnbm9yZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhbmV4
dExlYWZDaGlsZCgpIHx8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJv
eC0+YmlkaUxldmVsKCk7CisgICAgICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkg
Pj0gYmlkaUxldmVsT2ZSdW4gJiYgKCFuZXh0TGVhZkNoaWxkKCkgfHwgbmV4dExlYWZDaGlsZCgp
LT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRMZWZ0
bW9zdE9mZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09
IElnbm9yZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiBwcmV2TGVhZkNoaWxkKCkgJiYg
bV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpIDwgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKTsK
KyAgICAgICAgcmV0dXJuIHByZXZMZWFmQ2hpbGQoKSAmJiBtX2lubGluZUJveC0+YmlkaUxldmVs
KCkgPCBiaWRpTGV2ZWxPZlJ1biAmJiBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpID49IGJp
ZGlMZXZlbE9mUnVuOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworUG9zaXRpb24g
UmVuZGVyZWRQb3NpdGlvbjo6cG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpIGNvbnN0
Cit7CisgICAgQVNTRVJUKGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCkpOworCisgICAgaWYgKGF0
TGVmdG1vc3RPZmZzZXRJbkJveCgpKQorICAgICAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGlu
Z1Bvc2l0aW9uKG1fcmVuZGVyZXItPm5vZGUoKSwgbV9vZmZzZXQpOworCisgICAgcmV0dXJuIGNy
ZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihuZXh0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCktPm5v
ZGUoKSwgbV9vZmZzZXQpOworfQorCitQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlv
bkF0UmlnaHRCb3VuZGFyeU9mQmlEaVJ1bigpIGNvbnN0Cit7CisgICAgQVNTRVJUKGF0UmlnaHRC
b3VuZGFyeU9mQmlkaVJ1bigpKTsKKworICAgIGlmIChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkp
CisgICAgICAgIHJldHVybiBjcmVhdGVMZWdhY3lFZGl0aW5nUG9zaXRpb24obV9yZW5kZXJlci0+
bm9kZSgpLCBtX29mZnNldCk7CisKKyAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0
aW9uKHByZXZMZWFmQ2hpbGQoKS0+cmVuZGVyZXIoKS0+bm9kZSgpLCBtX29mZnNldCk7Cit9CisK
IExheW91dFJlY3QgUmVuZGVyZWRQb3NpdGlvbjo6YWJzb2x1dGVSZWN0KGludCogZXh0cmFXaWR0
aFRvRW5kT2ZMaW5lKSBjb25zdAogewogICAgIGlmIChpc051bGwoKSkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJKHJldmlzaW9uIDk0Nzc3KQorKysgU291cmNl
L1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjMs
NyArMjIzLDggQEAKIAogICAgIGJvb2wgc2hvdWxkQ2hhbmdlU2VsZWN0aW9uKGNvbnN0IFZpc2li
bGVTZWxlY3Rpb24mKSBjb25zdDsKICAgICBib29sIHNob3VsZERlbGV0ZVNlbGVjdGlvbihjb25z
dCBWaXNpYmxlU2VsZWN0aW9uJikgY29uc3Q7Ci0gICAgdm9pZCBzZXROb25EaXJlY3Rpb25hbFNl
bGVjdGlvbklmTmVlZGVkKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mLCBUZXh0R3JhbnVsYXJpdHkp
OworICAgIGVudW0gRW5kUG9pbnRzQWRqdXN0bWVudE1vZGUgeyBBZGp1c3RFbmRwb2ludHNBdEJp
ZGlCb3VuZGFyeSwgRG9Ob3RBZGpzdXRFbmRwb2ludHMgfTsKKyAgICB2b2lkIHNldE5vbkRpcmVj
dGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFu
dWxhcml0eSwgRW5kUG9pbnRzQWRqdXN0bWVudE1vZGUgPSBEb05vdEFkanN1dEVuZHBvaW50cyk7
CiAgICAgdm9pZCBzZXRGb2N1c2VkTm9kZUlmTmVlZGVkKCk7CiAgICAgdm9pZCBub3RpZnlSZW5k
ZXJlck9mU2VsZWN0aW9uQ2hhbmdlKEVVc2VyVHJpZ2dlcmVkKTsKIApAQCAtMjgwLDYgKzI4MSw3
IEBACiAgICAgTGF5b3V0VW5pdCBtX3hQb3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbjsKIAog
ICAgIFZpc2libGVTZWxlY3Rpb24gbV9zZWxlY3Rpb247CisgICAgVmlzaWJsZVBvc2l0aW9uIG1f
b3JpZ2luYWxCYXNlOyAvLyBVc2VkIHRvIHN0b3JlIGJhc2UgYmVmb3JlIHRoZSBhZGp1c3RtZW50
IGF0IGJpZGkgYm91bmRhcnkKICAgICBUZXh0R3JhbnVsYXJpdHkgbV9ncmFudWxhcml0eTsKIAog
ICAgIFJlZlB0cjxFZGl0aW5nU3R5bGU+IG1fdHlwaW5nU3R5bGU7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uaAkocmV2aXNpb24gOTQ3NzcpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAt
NDYsMjggKzQ2LDk0IEBACiAgICAgUmVuZGVyZWRQb3NpdGlvbigpOwogICAgIGV4cGxpY2l0IFJl
bmRlcmVkUG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJik7CiAgICAgZXhwbGljaXQgUmVu
ZGVyZWRQb3NpdGlvbihjb25zdCBQb3NpdGlvbiYsIEVBZmZpbml0eSk7CisgICAgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFJlbmRlcmVkUG9zaXRpb24mIG90aGVyKSBjb25zdDsKIAogICAgIGJvb2wg
aXNOdWxsKCkgY29uc3QgeyByZXR1cm4gIW1fcmVuZGVyZXI7IH0KICAgICBSb290SW5saW5lQm94
KiByb290Qm94KCkgeyByZXR1cm4gbV9pbmxpbmVCb3ggPyBtX2lubGluZUJveC0+cm9vdCgpIDog
MDsgfQogCisgICAgLy8gRklYTUU6IGdldCByaWQgb2YgYm94KCkKKyAgICBJbmxpbmVCb3gqIGJv
eCgpIHsgcmV0dXJuIG1faW5saW5lQm94OyB9CisKKyAgICB1bnNpZ25lZCBjaGFyIGJpZGlMZXZl
bE9uTGVmdCgpIGNvbnN0OworICAgIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT25SaWdodCgpIGNv
bnN0OworICAgIFJlbmRlcmVkUG9zaXRpb24gbGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVk
IGNoYXIgYmlkaUxldmVsT2ZSdW4pOworICAgIFJlbmRlcmVkUG9zaXRpb24gcmlnaHRCb3VuZGFy
eU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKTsKKworICAgIGVudW0gU2hv
dWxkTWF0Y2hCaWRpTGV2ZWwgeyBNYXRjaEJpZGlMZXZlbCwgSWdub3JlQmlkaUxldmVsIH07Cisg
ICAgYm9vbCBhdExlZnRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0TGVmdEJv
dW5kYXJ5T2ZCaWRpUnVuKElnbm9yZUJpZGlMZXZlbCwgMCk7IH0KKyAgICBib29sIGF0UmlnaHRC
b3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1
bihJZ25vcmVCaWRpTGV2ZWwsIDApOyB9CisgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rp
b25zIHJldHVybiB0cnVlIG9ubHkgaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVu
ZCBvZiB0aGUgYmlkaSBydW4KKyAgICAvLyBvZiB0aGUgc3BlY2lmaWVkIGJpZGkgZW1iZWRkaW5n
IGxldmVsLgorICAgIGJvb2wgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBi
aWRpTGV2ZWxPZlJ1bikgY29uc3QgeyByZXR1cm4gYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oTWF0
Y2hCaWRpTGV2ZWwsIGJpZGlMZXZlbE9mUnVuKTsgfQorICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5
T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0IHsgcmV0dXJuIGF0
UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihNYXRjaEJpZGlMZXZlbCwgYmlkaUxldmVsT2ZSdW4pOyB9
CisKKyAgICBQb3NpdGlvbiBwb3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKCkgY29uc3Q7
CisgICAgUG9zaXRpb24gcG9zaXRpb25BdFJpZ2h0Qm91bmRhcnlPZkJpRGlSdW4oKSBjb25zdDsK
KwogICAgIExheW91dFJlY3QgYWJzb2x1dGVSZWN0KCkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVS
ZWN0KDApOyB9CiAgICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoaW50JiBleHRyYVdpZHRoVG9F
bmRPZkxpbmUpIGNvbnN0IHsgcmV0dXJuIGFic29sdXRlUmVjdCgmZXh0cmFXaWR0aFRvRW5kT2ZM
aW5lKTsgfQorcHJpdmF0ZToKKyAgICBleHBsaWNpdCBSZW5kZXJlZFBvc2l0aW9uKFJlbmRlck9i
amVjdCosIElubGluZUJveCosIGludCBvZmZzZXQpOwogCi1wcml2YXRlOgorICAgIGVudW0gQ2Fj
aGVTdGF0dXMgeyBDYWNoZWRQcmV2TGVhZkNoaWxkLCBDYWNoZWROZXh0TGVhZkNoaWxkIH07Cisg
ICAgaW5saW5lIGJvb2wgc2hvdWxkQ2FjaGUoQ2FjaGVTdGF0dXMgZmxhZykgY29uc3QgeyByZXR1
cm4gIShtX2NhY2hlU3RhdHVzICYgZmxhZyk7IH0KKyAgICBpbmxpbmUgdm9pZCBzZXRDYWNoZWQo
Q2FjaGVTdGF0dXMgZmxhZykgY29uc3QgeyBtX2NhY2hlU3RhdHVzIHw9IGZsYWc7IH0KKworICAg
IElubGluZUJveCogcHJldkxlYWZDaGlsZCgpIGNvbnN0OworICAgIElubGluZUJveCogbmV4dExl
YWZDaGlsZCgpIGNvbnN0OworICAgIGJvb2wgYXRMZWZ0bW9zdE9mZnNldEluQm94KCkgY29uc3Qg
eyByZXR1cm4gbV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNhcmV0TGVm
dG1vc3RPZmZzZXQoKTsgfQorICAgIGJvb2wgYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpIGNvbnN0
IHsgcmV0dXJuIG1faW5saW5lQm94ICYmIG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5jYXJldFJp
Z2h0bW9zdE9mZnNldCgpOyB9CisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9mQmlkaVJ1bihTaG91
bGRNYXRjaEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3Q7Cisg
ICAgYm9vbCBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2ZWwsIHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0OworCiAgICAgTGF5b3V0UmVjdCBhYnNv
bHV0ZVJlY3QoaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0OwogCiAgICAgUmVuZGVy
T2JqZWN0KiBtX3JlbmRlcmVyOwogICAgIElubGluZUJveCogbV9pbmxpbmVCb3g7CiAgICAgaW50
IG1fb2Zmc2V0OworCisgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2NhY2hlU3RhdHVzIDogMjsKKwor
ICAgIC8vIERvIG5vdCBpbml0aWFsaXplIHRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyBh
cyBvcHRpbWl6YXRpb24uCisgICAgLy8gRmxhZ3MgaW4gbV9jYWNoZVN0YXR1cyB0ZWxsIHVzIHdo
aWNoIG9uZXMgYXJlIGluaXRpYWxpemVkLgorICAgIG11dGFibGUgSW5saW5lQm94KiBtX3ByZXZM
ZWFmQ2hpbGQ7CisgICAgbXV0YWJsZSBJbmxpbmVCb3gqIG1fbmV4dExlYWZDaGlsZDsKIH07CiAK
IGlubGluZSBSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKCkKICAgICA6IG1fcmVu
ZGVyZXIoMCkKICAgICAsIG1faW5saW5lQm94KDApCiAgICAgLCBtX29mZnNldCgwKQorICAgICwg
bV9jYWNoZVN0YXR1cygwKQogewogfQogCitpbmxpbmUgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVy
ZWRQb3NpdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBJbmxpbmVCb3gqIGJveCwgaW50IG9m
ZnNldCkKKyAgICA6IG1fcmVuZGVyZXIocmVuZGVyZXIpCisgICAgLCBtX2lubGluZUJveChib3gp
CisgICAgLCBtX29mZnNldChvZmZzZXQpCisgICAgLCBtX2NhY2hlU3RhdHVzKDApCit7Cit9CisK
K2lubGluZSBJbmxpbmVCb3gqIFJlbmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQoKSBjb25z
dAoreworICAgIGlmIChzaG91bGRDYWNoZShDYWNoZWRQcmV2TGVhZkNoaWxkKSkgeworICAgICAg
ICBtX3ByZXZMZWFmQ2hpbGQgPSBtX2lubGluZUJveC0+cHJldkxlYWZDaGlsZCgpOworICAgICAg
ICBzZXRDYWNoZWQoQ2FjaGVkUHJldkxlYWZDaGlsZCk7CisgICAgfQorICAgIHJldHVybiBtX3By
ZXZMZWFmQ2hpbGQ7Cit9CisKK2lubGluZSBJbmxpbmVCb3gqIFJlbmRlcmVkUG9zaXRpb246Om5l
eHRMZWFmQ2hpbGQoKSBjb25zdAoreworICAgIGlmIChzaG91bGRDYWNoZShDYWNoZWROZXh0TGVh
ZkNoaWxkKSkgeworICAgICAgICBtX25leHRMZWFmQ2hpbGQgPSBtX2lubGluZUJveC0+bmV4dExl
YWZDaGlsZCgpOworICAgICAgICBzZXRDYWNoZWQoQ2FjaGVkTmV4dExlYWZDaGlsZCk7CisgICAg
fQorICAgIHJldHVybiBtX25leHRMZWFmQ2hpbGQ7Cit9CisKIGJvb2wgcmVuZGVyT2JqZWN0Q29u
dGFpbnNQb3NpdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBQb3NpdGlvbiYpOwogCiB9OwpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkocmV2aXNpb24gOTQ3NzcpCisrKyBT
b3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY5
MCw3ICs2OTAsOCBAQAogICAgIGlmIChtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHko
KSAhPSBDaGFyYWN0ZXJHcmFudWxhcml0eSkKICAgICAgICAgbmV3U2VsZWN0aW9uLmV4cGFuZFVz
aW5nR3JhbnVsYXJpdHkobV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCkpOwogCi0g
ICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVk
ZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7Cisg
ICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVk
ZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSwKKyAg
ICAgICAgRnJhbWVTZWxlY3Rpb246OkFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KTsKIH0K
ICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>106967</attachid>
            <date>2011-09-09 23:10:56 -0700</date>
            <delta_ts>2011-09-12 17:08:23 -0700</delta_ts>
            <desc>initial patch</desc>
            <filename>bug-57340-20110909231054.patch</filename>
            <type>text/plain</type>
            <size>30710</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0ODk5KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDktMDkgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVHUkVTU0lPTihyNzQ5NzEpOiBT
ZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURpIFRleHQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRzIHRoZSBl
bmQgcG9pbnQgYWRqdXN0bWVudCBtZWNoYW5pc20gYXQgYmlkaSBib3VuZGFyaWVzIHNpbWlsYXIg
dG8gdGhlIG9uZSBOU1RleHRWaWV3IGltcGxlbWVudHMuCisKKyAgICAgICAgVG8gdW5kZXJzdGFu
ZCB0aGUgcHJvYmxlbSwgc3VwcG9zZSB3ZSBoYXZlIHN0cm9uZyBSVEwgbGV0dGVycyAiQUJDIiBp
biBhIExUUiBibG9jayAodmlzdWFsbHkgbGFpZCBvdXQgYXMgQ0JBKS4KKworICAgICAgICBQZXIg
TlNUZXh0VmlldyBjb252ZW50aW9uLCBsb2dpY2FsIG9mZnNldHMgYmV0d2VlbiBlYWNoIGxldHRl
ciBpcyBwbGFjZWQgYXMgKDApQygyKUIoMSlBKDMpLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAg
cGxhY2luZyB0aGUgY2FyZXQgdmlzdWFsbHkgb24gdGhlIGxlZnQgb2YgQ0JBIHlpZWxkcyB0aGUg
cG9zaXRpb24gaW5zaWRlIHRoZSB0ZXh0IG5vZGUgb2YgIkFCQyIgYXQgb2Zmc2V0IDAuCisgICAg
ICAgIExpa2V3aXNlLCBwbGFjaW5nIGl0IGJldHdlZW4gQyBhbmQgQiB5aWVsZHMgKCJBQkMiLCAy
KSwgYW5kIHBsYWNpbmcgaXQgb24gdGhlIHJpZ2h0IG9mIENCQSB5aWVsZHMgKCJBQkMiLCAzKS4K
KworICAgICAgICBOb3cgc3VwcG9zZSBhIHVzZXIgYXR0ZW1wdHMgdG8gc2VsZWN0IHRoZSBsZXR0
ZXIgQSBieSBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQ0JBIHRvIGEgcG9pbnQgYmV0
d2VlbgorICAgICAgICBCIGFuZCBBLiBGaXJzdCwgdGhlIGluaXRpYWwgbW91c2UgZG93biBwbGFj
ZXMgdGhlIHNlbGVjdGlvbidzIGJhc2UgYXQgKCJBQkMiLCAzKS4gVGhlbiBhcyB0aGUgbW91c2Ug
cG9pbnRlcgorICAgICAgICBtb3ZlcyB0byBhIHBvaW50IG9uIHRoZSBsZWZ0IG9mIEEsIHRoZSBz
ZWxlY3Rpb24ncyBleHRlbnQgaXMgc2V0IGF0ICgiQUJDIiwgMSksIHNlbGVjdGluZyAiQkMiLgor
CisgICAgICAgIFRvIG1pdGlnYXRlIHRoaXMgaXNzdWUsIE5TVGV4dFZpZXcgYWRqdXN0cyBzZWxl
Y3Rpb24gYmFzZSBhbmQgZXh0ZW50IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gSW4gdGhlIGFi
b3ZlCisgICAgICAgIGV4YW1wbGUsIE5TVGV4dFZpZXcgZGV0ZWN0cyB1c2VyJ3MgaW50ZW50IGFu
ZCBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24ncyBiYXNlIHRvICgiQUJDIiwgMCkgdGVtcG9yYXJpbHku
CisKKyAgICAgICAgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgc2ltaWxhciB0cmljayBvbiBXZWJL
aXQuIFdlIGFkanVzdCB0aGUgYmFzZSBvciB0aGUgZXh0ZW50IHdoZW4gdGhleSdyZSBhdCB0aGUg
bGVmdAorICAgICAgICBlbmQgb3IgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0
aGUgb3RoZXIgZW5kIGlzIGluc2lkZSBvZiB0aGUgcnVuLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwg
dGhlCisgICAgICAgIGJhc2UgcG9zaXRpb24gb24gdGhlIHJpZ2h0IG9mIEEgaXMgdGhlIHJpZ2h0
IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0aGUgZXh0ZW50IHBvc2l0aW9uIGJldHdlZW4gQiBhbmQg
QSBpcworICAgICAgICBpbnNpZGUgdGhlIHNhbWUgcnVuIChDQkEpLCBzbyB3ZSB3b3VsZCBhZGp1
c3QgdGhlIGJhc2UgdG8gYmUgKCJBQkMiLCAwKSBhcyBOU1RleHRWaWV3IGRvZXMuCisKKyAgICAg
ICAgVGFrZSBhbm90aGVyIGV4YW1wbGUgYWJjQUJDLiBOb3RlIG9mZnNldHMgYXJlIGFzc2lnbmVk
IGFzICgwKWEoMSliKDIpYygzKUMoNSlCKDQpQSg2KSBXaGVuIHRoZSB1c2VyIHN0YXJ0cworICAg
ICAgICBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQSB0byBhIHBvaW50IGJldHdlZW4g
QiBhbmQgQSwgd2UgYWRqdXN0IHRoZSBzZWxlY3Rpb24gYmFzZSB0byBiZSAoImFiY0FCQyIsIDMp
CisgICAgICAgIGJlY2F1c2UgdGhlIGJhc2UgaXMgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkg
cnVuIGFuZCB0aGUgZXh0ZW50IGlzIGluIHRoZSBzYW1lIHJ1bi4gV2Uga2VlcCB0aGUgYWRqdXN0
bWVudAorICAgICAgICB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIG1vdmVzIHRvIGEgcG9pbnQgYmV0
d2VlbiBDIGFuZCBCLiBIb3dldmVyLCB3aGVuIHRoZSBtb3VzZXIgcG9pbnRlciByZWFjaGVzIGEg
cG9pbnQKKyAgICAgICAgYmV0d2VlbiBsZXR0ZXJzIGIgYW5kIGMsIHRoZSBzZWxlY3Rpb24gZXh0
ZW50IGlzIHBsYWNlZCBhdCAoImFiY0FCQyIsIDIpLiBCZWNhdXNlIHRoZSBleHRlbnQgaXMgb3V0
c2lkZSBvZgorICAgICAgICB0aGUgYmlkaSBydW4gc3RhcnRlZCBmcm9tIHRoZSBzZWxlY3Rpb24g
YmFzZSwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZSBhdCB0aGlzIHBvaW50LiBIYWQgd2Ug
bm90IGRvbmUgdGhpcywKKyAgICAgICAgd2UnbGwgZW5kIHVwIHNlbGVjdGluZyBqdXN0ICJjIi4K
KworICAgICAgICBXaGlsZSB0aGlzIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBpbiBGcmFtZVNl
bGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZCwgdGhpcyBwYXRjaCBh
ZGRzCisgICAgICAgIHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB0byBSZW5kZXJlZFBvc2l0aW9u
IHRvIGZhY2lsaXRhdGUgYWJzdHJhY3Rpb24gYXJvdW5kIGlubGluZSBib3hlcyBhbmQgYmlkaSBy
dW5zLgorCisgICAgICAgIFRlc3Q6IGVkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5o
dG1sCisKKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KTogQWRkZWQuIEltcGxlbWVudHMg
dGhlIGVuZHBvaW50cyBhZGp1c3RtZW50IGFsZ29yaXRobS4KKyAgICAgICAgKFdlYkNvcmU6OkZy
YW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKTogQ2FsbHMg
YWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnksIGFuZAorICAgICAgICByZXN0b3JlcyB0aGUg
b3JpZ2luYWwgYmFzZSBhcyBuZWVkZWQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5oOgorICAgICAgICAqIGVkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQpOiBBZGRlZCB0byBjYWNoZSBw
cmV2TGVhZkNoaWxkIG9mIHRoZSBjdXJyZW50IGlubGluZSBib3guCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJlZFBvc2l0aW9uOjpuZXh0TGVhZkNoaWxkKTogRGl0dG8gZm9yIG5leHRMZWFmQ2hp
bGQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpvcGVyYXRvcj09KTogQ29t
cGFyZXMgdHdvIFJlbmRlcmVkUG9zaXRpb25zIGNvbnNpZGVyaW5nIG5laWdoYm9yaW5nIGlubGlu
ZSBib3hlcworICAgICAgICBzbyB0aGF0IHRoZSByaWdodG1vc3QgcG9zaXRpb24gaW4gYSBib3gg
YW5kIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiBpbiB0aGUgZm9sbG93aW5nIGJveCBpcyBjb25zaWRl
cmVkIGVxdWFsLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVs
T25MZWZ0KTogQWRkZWQuIFJldHVybnMgdGhlIGJpZGkgbGV2ZWwgb2YgdGhlIHJ1biBvbiB0aGUg
bGVmdC4gV2UgY2FuJ3QKKyAgICAgICAgYWRkIGEgZ2VuZXJpYyBiaWRpTGV2ZWwgdG8gdGhpcyBj
bGFzcyBiZWNhdXNlIGl0J2xsIGJlIGFtYmlndW91cyBhdCBiaWRpIGJvdW5kYXJpZXMuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpiaWRpTGV2ZWxPblJpZ2h0KTogRGl0dG8g
Zm9yIHRoZSBydW4gb24gdGhlIHJpZ2h0LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3Np
dGlvbjo6bGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bik6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodEJvdW5kYXJ5
T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpw
b3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKTogUmV0dXJucyBQb3NpdGlvbiBhdCB0aGUg
bGVmdCBlZGdlIG9mIGEgYmlkaSBydW4KKyAgICAgICAgaWYgUmVuZGVyZWRQb3NpdGlvbiBpcyBh
dCBzdWNoIGEgcG9zaXRpb24uIEFzc2VydHMgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bik6IERpdHRvIGZvciB0aGUgcmlnaHQgZWRnZS4KKyAgICAgICAgKiBlZGl0aW5nL1Jl
bmRlcmVkUG9zaXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0
TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJl
ZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4pOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OnNob3VsZENhY2hlKTogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpzZXRDYWNoZWQpOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0TGVmdG1vc3RPZmZzZXRJbkJveCk6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodG1vc3RPZmZzZXRJbkJv
eCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQ
b3NpdGlvbik6CisgICAgICAgICogZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmg6CisgICAgICAg
IChXZWJDb3JlOjpWaXNpYmxlU2VsZWN0aW9uOjp2aXNpYmxlQmFzZSk6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbjo6dmlzaWJsZUV4dGVudCk6IEFkZGVkLgorICAg
ICAgICAqIHBhZ2UvRXZlbnRIYW5kbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50SGFu
ZGxlcjo6dXBkYXRlU2VsZWN0aW9uRm9yTW91c2VEcmFnKToKKwogMjAxMS0wOS0wOSAgRXJpayBB
cnZpZHNzb24gIDxhcnZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIE1vdmUgRWxlbWVudC5jb250
YWlucyB0byBOb2RlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9u
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9u
LmNwcAkocmV2aXNpb24gOTQ4NjcpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2Vs
ZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgIlJl
bmRlclRoZW1lLmgiCiAjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJlbmRlcldp
ZGdldC5oIgorI2luY2x1ZGUgIlJlbmRlcmVkUG9zaXRpb24uaCIKICNpbmNsdWRlICJTZWN1cmVU
ZXh0SW5wdXQuaCIKICNpbmNsdWRlICJTZXR0aW5ncy5oIgogI2luY2x1ZGUgIlNwYXRpYWxOYXZp
Z2F0aW9uLmgiCkBAIC0xNjMsMTMgKzE2NCw2OCBAQCB2b2lkIERyYWdDYXJldENvbnRyb2xsZXI6
OnNldENhcmV0UG9zaXRpCiAgICAgICAgIHVwZGF0ZUNhcmV0UmVjdChkb2N1bWVudCwgbV9wb3Np
dGlvbik7CiB9CiAKLXZvaWQgRnJhbWVTZWxlY3Rpb246OnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0
aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYgcGFzc2VkTmV3U2VsZWN0aW9uLCBU
ZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHkpCitzdGF0aWMgdm9pZCBhZGp1c3RFbmRwb2ludHNB
dEJpZGlCb3VuZGFyeShWaXNpYmxlUG9zaXRpb24mIGJhc2UsIFZpc2libGVQb3NpdGlvbiYgZXh0
ZW50KQoreworICAgIFJlbmRlcmVkUG9zaXRpb24gYmFzZVBvc2l0aW9uKGJhc2UpOworICAgIFJl
bmRlcmVkUG9zaXRpb24gZXh0ZW50UG9zaXRpb24oZXh0ZW50KTsKKworICAgIGlmIChiYXNlUG9z
aXRpb24uaXNOdWxsKCkgfHwgZXh0ZW50UG9zaXRpb24uaXNOdWxsKCkgfHwgYmFzZVBvc2l0aW9u
ID09IGV4dGVudFBvc2l0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYmFzZVBvc2l0
aW9uLmF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCkpIHsKKyAgICAgICAgaWYgKCFleHRlbnRQb3Np
dGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uUmln
aHQoKSkKKyAgICAgICAgICAgICYmIGJhc2VQb3NpdGlvbiA9PSBleHRlbnRQb3NpdGlvbi5sZWZ0
Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAg
ICAgICAgICAgIGJhc2UgPSBiYXNlUG9zaXRpb24ucG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlE
aVJ1bigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBpZiAoYmFzZVBvc2l0aW9uLmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigp
KSB7CisgICAgICAgIGlmICghZXh0ZW50UG9zaXRpb24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4o
YmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uTGVmdCgpKQorICAgICAgICAgICAgJiYgYmFzZVBvc2l0
aW9uID09IGV4dGVudFBvc2l0aW9uLnJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9u
LmJpZGlMZXZlbE9uTGVmdCgpKSkgeworICAgICAgICAgICAgYmFzZSA9IGJhc2VQb3NpdGlvbi5w
b3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW50UG9zaXRp
b24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oKQorICAgICAgICAmJiBleHRlbnRQb3NpdGlvbiA9
PSBiYXNlUG9zaXRpb24ubGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKGV4dGVudFBvc2l0aW9uLmJpZGlM
ZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAgICAgZXh0ZW50ID0gZXh0ZW50UG9zaXRpb24ucG9zaXRp
b25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgaWYgKGV4dGVudFBvc2l0aW9uLmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpCisgICAgICAg
ICYmIGV4dGVudFBvc2l0aW9uID09IGJhc2VQb3NpdGlvbi5yaWdodEJvdW5kYXJ5T2ZCaWRpUnVu
KGV4dGVudFBvc2l0aW9uLmJpZGlMZXZlbE9uTGVmdCgpKSkgeworICAgICAgICBleHRlbnQgPSBl
eHRlbnRQb3NpdGlvbi5wb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAg
ICByZXR1cm47CisgICAgfQorfQorCit2b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rp
b25hbFNlbGVjdGlvbklmTmVlZGVkKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mIHBhc3NlZE5ld1Nl
bGVjdGlvbiwgVGV4dEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LAorICAgIEVuZFBvaW50c0FkanVz
dG1lbnRNb2RlIGVuZHBvaW50c0FkanVzdG1lbnRNb2RlKQogewogICAgIFZpc2libGVTZWxlY3Rp
b24gbmV3U2VsZWN0aW9uID0gcGFzc2VkTmV3U2VsZWN0aW9uOworICAgIGJvb2wgaXNEaXJlY3Rp
b25hbCA9IHNob3VsZEFsd2F5c1VzZURpcmVjdGlvbmFsU2VsZWN0aW9uKG1fZnJhbWUpIHx8IG5l
d1NlbGVjdGlvbi5pc0RpcmVjdGlvbmFsKCk7CiAKLSAgICBpZiAoc2hvdWxkQWx3YXlzVXNlRGly
ZWN0aW9uYWxTZWxlY3Rpb24obV9mcmFtZSkpCi0gICAgICAgIG5ld1NlbGVjdGlvbi5zZXRJc0Rp
cmVjdGlvbmFsKHRydWUpOworICAgIFZpc2libGVQb3NpdGlvbiBiYXNlID0gbV9vcmlnaW5hbEJh
c2UuaXNOb3ROdWxsKCkgPyBtX29yaWdpbmFsQmFzZSA6IG5ld1NlbGVjdGlvbi52aXNpYmxlQmFz
ZSgpOworICAgIFZpc2libGVQb3NpdGlvbiBuZXdCYXNlID0gYmFzZTsKKyAgICBWaXNpYmxlUG9z
aXRpb24gbmV3RXh0ZW50ID0gbmV3U2VsZWN0aW9uLnZpc2libGVFeHRlbnQoKTsKKyAgICBpZiAo
ZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUgPT0gQWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkp
CisgICAgICAgIGFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KG5ld0Jhc2UsIG5ld0V4dGVu
dCk7CisKKyAgICBpZiAobmV3QmFzZSAhPSBiYXNlIHx8IG5ld0V4dGVudCAhPSBuZXdTZWxlY3Rp
b24udmlzaWJsZUV4dGVudCgpKSB7CisgICAgICAgIG1fb3JpZ2luYWxCYXNlID0gYmFzZTsKKyAg
ICAgICAgbmV3U2VsZWN0aW9uLnNldEJhc2UobmV3QmFzZSk7CisgICAgICAgIG5ld1NlbGVjdGlv
bi5zZXRFeHRlbnQobmV3RXh0ZW50KTsKKyAgICB9IGVsc2UgaWYgKG1fb3JpZ2luYWxCYXNlLmlz
Tm90TnVsbCgpKSB7CisgICAgICAgIGlmIChtX3NlbGVjdGlvbi5iYXNlKCkgPT0gbmV3U2VsZWN0
aW9uLmJhc2UoKSkKKyAgICAgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRCYXNlKG1fb3JpZ2luYWxC
YXNlKTsKKyAgICAgICAgbV9vcmlnaW5hbEJhc2UuY2xlYXIoKTsKKyAgICB9CiAKKyAgICBuZXdT
ZWxlY3Rpb24uc2V0SXNEaXJlY3Rpb25hbChpc0RpcmVjdGlvbmFsKTsgLy8gQWRqdXN0aW5nIGJh
c2UgYW5kIGV4dGVudCB3aWxsIG1ha2UgbmV3U2VsZWN0aW9uIGFsd2F5cyBkaXJlY3Rpb25hbAog
ICAgIGlmIChtX3NlbGVjdGlvbiA9PSBuZXdTZWxlY3Rpb24gfHwgIXNob3VsZENoYW5nZVNlbGVj
dGlvbihuZXdTZWxlY3Rpb24pKQogICAgICAgICByZXR1cm47CiAKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmgJKHJldmlzaW9uIDk0ODY3KQorKysgU291cmNlL1dl
YkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjMsNyAr
MjIzLDggQEAgcHVibGljOgogCiAgICAgYm9vbCBzaG91bGRDaGFuZ2VTZWxlY3Rpb24oY29uc3Qg
VmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0OwogICAgIGJvb2wgc2hvdWxkRGVsZXRlU2VsZWN0aW9u
KGNvbnN0IFZpc2libGVTZWxlY3Rpb24mKSBjb25zdDsKLSAgICB2b2lkIHNldE5vbkRpcmVjdGlv
bmFsU2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFudWxh
cml0eSk7CisgICAgZW51bSBFbmRQb2ludHNBZGp1c3RtZW50TW9kZSB7IEFkanVzdEVuZHBvaW50
c0F0QmlkaUJvdW5kYXJ5LCBEb05vdEFkanN1dEVuZHBvaW50cyB9OworICAgIHZvaWQgc2V0Tm9u
RGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4
dEdyYW51bGFyaXR5LCBFbmRQb2ludHNBZGp1c3RtZW50TW9kZSA9IERvTm90QWRqc3V0RW5kcG9p
bnRzKTsKICAgICB2b2lkIHNldEZvY3VzZWROb2RlSWZOZWVkZWQoKTsKICAgICB2b2lkIG5vdGlm
eVJlbmRlcmVyT2ZTZWxlY3Rpb25DaGFuZ2UoRVVzZXJUcmlnZ2VyZWQpOwogCkBAIC0yODAsNiAr
MjgxLDcgQEAgcHJpdmF0ZToKICAgICBMYXlvdXRVbml0IG1feFBvc0ZvclZlcnRpY2FsQXJyb3dO
YXZpZ2F0aW9uOwogCiAgICAgVmlzaWJsZVNlbGVjdGlvbiBtX3NlbGVjdGlvbjsKKyAgICBWaXNp
YmxlUG9zaXRpb24gbV9vcmlnaW5hbEJhc2U7IC8vIFVzZWQgdG8gc3RvcmUgYmFzZSBiZWZvcmUg
dGhlIGFkanVzdG1lbnQgYXQgYmlkaSBib3VuZGFyeQogICAgIFRleHRHcmFudWxhcml0eSBtX2dy
YW51bGFyaXR5OwogCiAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gbV90eXBpbmdTdHlsZTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAkocmV2aXNp
b24gOTQ4NjcpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyZWRQb3Np
dGlvbi5oIgogCiAjaW5jbHVkZSAiSW5saW5lQm94LmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEJv
eC5oIgogI2luY2x1ZGUgIlBvc2l0aW9uLmgiCiAjaW5jbHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgi
CiAKQEAgLTY4LDYgKzY5LDcgQEAgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihj
b25zdAogICAgIDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1f
b2Zmc2V0KDApCisgICAgLCBtX2NhY2hlU3RhdHVzKDApCiB7CiAgICAgaWYgKHBvc2l0aW9uLmlz
TnVsbCgpKQogICAgICAgICByZXR1cm47CkBAIC04Miw2ICs4NCw3IEBAIFJlbmRlcmVkUG9zaXRp
b246OlJlbmRlcmVkUG9zaXRpb24oY29uc3QKICAgICA6IG1fcmVuZGVyZXIoMCkKICAgICAsIG1f
aW5saW5lQm94KDApCiAgICAgLCBtX29mZnNldCgwKQorICAgICwgbV9jYWNoZVN0YXR1cygwKQog
ewogICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtOTIsNiAr
OTUsMTM3IEBAIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVkUG9zaXRpb24oY29uc3QKICAgICAg
ICAgbV9yZW5kZXJlciA9IHJlbmRlcmVyRnJvbVBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAorSW5s
aW5lQm94KiBSZW5kZXJlZFBvc2l0aW9uOjpwcmV2TGVhZkNoaWxkKCkgY29uc3QKK3sKKyAgICBp
ZiAoc2hvdWxkQ2FjaGUoQ2FjaGVkUHJldkxlYWZDaGlsZCkpIHsKKyAgICAgICAgbV9wcmV2TGVh
ZkNoaWxkID0gbV9pbmxpbmVCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICAgICAgc2V0Q2FjaGVk
KENhY2hlZFByZXZMZWFmQ2hpbGQpOworICAgIH0KKyAgICByZXR1cm4gbV9wcmV2TGVhZkNoaWxk
OworfQorCitJbmxpbmVCb3gqIFJlbmRlcmVkUG9zaXRpb246Om5leHRMZWFmQ2hpbGQoKSBjb25z
dAoreworICAgIGlmIChzaG91bGRDYWNoZShDYWNoZWROZXh0TGVhZkNoaWxkKSkgeworICAgICAg
ICBtX25leHRMZWFmQ2hpbGQgPSBtX2lubGluZUJveC0+bmV4dExlYWZDaGlsZCgpOworICAgICAg
ICBzZXRDYWNoZWQoQ2FjaGVkTmV4dExlYWZDaGlsZCk7CisgICAgfQorICAgIHJldHVybiBtX25l
eHRMZWFmQ2hpbGQ7Cit9CisKK2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6b3BlcmF0b3I9PShjb25z
dCBSZW5kZXJlZFBvc2l0aW9uJiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fcmVuZGVy
ZXIgPT0gb3RoZXIubV9yZW5kZXJlciAmJiBtX2lubGluZUJveCA9PSBvdGhlci5tX2lubGluZUJv
eCAmJiBtX29mZnNldCA9PSBvdGhlci5tX29mZnNldCkKKyAgICAgICAgfHwgKGF0TGVmdG1vc3RP
ZmZzZXRJbkJveCgpICYmIG90aGVyLmF0UmlnaHRtb3N0T2Zmc2V0SW5Cb3goKSAmJiBwcmV2TGVh
ZkNoaWxkKCkgPT0gb3RoZXIubV9pbmxpbmVCb3gpCisgICAgICAgIHx8IChhdFJpZ2h0bW9zdE9m
ZnNldEluQm94KCkgJiYgb3RoZXIuYXRMZWZ0bW9zdE9mZnNldEluQm94KCkgJiYgbmV4dExlYWZD
aGlsZCgpID09IG90aGVyLm1faW5saW5lQm94KTsKK30KKwordW5zaWduZWQgY2hhciBSZW5kZXJl
ZFBvc2l0aW9uOjpiaWRpTGV2ZWxPbkxlZnQoKSBjb25zdAoreworICAgIElubGluZUJveCogYm94
ID0gYXRMZWZ0bW9zdE9mZnNldEluQm94KCkgPyBwcmV2TGVhZkNoaWxkKCkgOiBtX2lubGluZUJv
eDsKKyAgICByZXR1cm4gYm94ID8gYm94LT5iaWRpTGV2ZWwoKSA6IDA7Cit9CisKK3Vuc2lnbmVk
IGNoYXIgUmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVsT25SaWdodCgpIGNvbnN0Cit7CisgICAg
SW5saW5lQm94KiBib3ggPSBhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkgPyBuZXh0TGVhZkNoaWxk
KCkgOiBtX2lubGluZUJveDsKKyAgICByZXR1cm4gYm94ID8gYm94LT5iaWRpTGV2ZWwoKSA6IDA7
Cit9CisKK1JlbmRlcmVkUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6bGVmdEJvdW5kYXJ5T2ZC
aWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pCit7CisgICAgaWYgKCFtX2lubGlu
ZUJveCB8fCBiaWRpTGV2ZWxPZlJ1biA+IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSkKKyAgICAg
ICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKKworICAgIElubGluZUJveCogYm94ID0gbV9p
bmxpbmVCb3g7CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gqIHByZXYgPSBib3gtPnByZXZM
ZWFmQ2hpbGQoKTsKKyAgICAgICAgaWYgKCFwcmV2IHx8IHByZXYtPmJpZGlMZXZlbCgpIDwgYmlk
aUxldmVsT2ZSdW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbihib3gtPnJl
bmRlcmVyKCksIGJveCwgYm94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCkpOworICAgICAgICBib3gg
PSBwcmV2OworICAgIH0gd2hpbGUgKGJveCk7CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbigpOworfQorCitSZW5kZXJlZFBvc2l0aW9uIFJl
bmRlcmVkUG9zaXRpb246OnJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRp
TGV2ZWxPZlJ1bikKK3sKKyAgICBpZiAoIW1faW5saW5lQm94IHx8IGJpZGlMZXZlbE9mUnVuID4g
bV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlv
bigpOworCisgICAgSW5saW5lQm94KiBib3ggPSBtX2lubGluZUJveDsKKyAgICBkbyB7CisgICAg
ICAgIElubGluZUJveCogbmV4dCA9IGJveC0+bmV4dExlYWZDaGlsZCgpOworICAgICAgICBpZiAo
IW5leHQgfHwgbmV4dC0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1bikKKyAgICAgICAgICAg
IHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKGJveC0+cmVuZGVyZXIoKSwgYm94LCBib3gtPmNhcmV0
UmlnaHRtb3N0T2Zmc2V0KCkpOworICAgICAgICBib3ggPSBuZXh0OworICAgIH0gd2hpbGUgKGJv
eCk7CisKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gUmVuZGVyZWRQb3Np
dGlvbigpOworfQorCitib29sIFJlbmRlcmVkUG9zaXRpb246OmF0TGVmdEJvdW5kYXJ5T2ZCaWRp
UnVuKFNob3VsZE1hdGNoQmlkaUxldmVsIHNob3VsZE1hdGNoQmlkaUxldmVsLCB1bnNpZ25lZCBj
aGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdAoreworICAgIGlmICghbV9pbmxpbmVCb3gpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSkgewor
ICAgICAgICBpZiAoc2hvdWxkTWF0Y2hCaWRpTGV2ZWwgPT0gSWdub3JlQmlkaUxldmVsKQorICAg
ICAgICAgICAgcmV0dXJuICFwcmV2TGVhZkNoaWxkKCkgfHwgcHJldkxlYWZDaGlsZCgpLT5iaWRp
TGV2ZWwoKSA8IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIG1faW5s
aW5lQm94LT5iaWRpTGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1biAmJiAoIXByZXZMZWFmQ2hpbGQo
KSB8fCBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4pOworICAg
IH0KKworICAgIGlmIChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNo
b3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9yZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVy
biBuZXh0TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpIDwgbmV4dExlYWZD
aGlsZCgpLT5iaWRpTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIG5leHRMZWFmQ2hpbGQoKSAmJiBt
X2lubGluZUJveC0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1biAmJiBuZXh0TGVhZkNoaWxk
KCktPmJpZGlMZXZlbCgpID49IGJpZGlMZXZlbE9mUnVuOworICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKworYm9vbCBSZW5kZXJlZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlS
dW4oU2hvdWxkTWF0Y2hCaWRpTGV2ZWwgc2hvdWxkTWF0Y2hCaWRpTGV2ZWwsIHVuc2lnbmVkIGNo
YXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0Cit7CisgICAgaWYgKCFtX2lubGluZUJveCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGF0UmlnaHRtb3N0T2Zmc2V0SW5Cb3goKSkgewor
ICAgICAgICBpZiAoc2hvdWxkTWF0Y2hCaWRpTGV2ZWwgPT0gSWdub3JlQmlkaUxldmVsKQorICAg
ICAgICAgICAgcmV0dXJuICFuZXh0TGVhZkNoaWxkKCkgfHwgbmV4dExlYWZDaGlsZCgpLT5iaWRp
TGV2ZWwoKSA8IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIG1faW5s
aW5lQm94LT5iaWRpTGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1biAmJiAoIW5leHRMZWFmQ2hpbGQo
KSB8fCBuZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4pOworICAg
IH0KKworICAgIGlmIChhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSkgeworICAgICAgICBpZiAoc2hv
dWxkTWF0Y2hCaWRpTGV2ZWwgPT0gSWdub3JlQmlkaUxldmVsKQorICAgICAgICAgICAgcmV0dXJu
IHByZXZMZWFmQ2hpbGQoKSAmJiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPCBwcmV2TGVhZkNo
aWxkKCktPmJpZGlMZXZlbCgpOworICAgICAgICByZXR1cm4gcHJldkxlYWZDaGlsZCgpICYmIG1f
aW5saW5lQm94LT5iaWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuICYmIHByZXZMZWFmQ2hpbGQo
KS0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZSdW47CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0TGVmdEJvdW5k
YXJ5T2ZCaURpUnVuKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoYXRMZWZ0Qm91bmRhcnlPZkJpZGlS
dW4oKSk7CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94KCkpCisgICAgICAgIHJldHVy
biBjcmVhdGVMZWdhY3lFZGl0aW5nUG9zaXRpb24obV9yZW5kZXJlci0+bm9kZSgpLCBtX29mZnNl
dCk7CisKKyAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG5leHRMZWFmQ2hp
bGQoKS0+cmVuZGVyZXIoKS0+bm9kZSgpLCBtX29mZnNldCk7Cit9CisKK1Bvc2l0aW9uIFJlbmRl
cmVkUG9zaXRpb246OnBvc2l0aW9uQXRSaWdodEJvdW5kYXJ5T2ZCaURpUnVuKCkgY29uc3QKK3sK
KyAgICBBU1NFUlQoYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCkpOworCisgICAgaWYgKGF0Umln
aHRtb3N0T2Zmc2V0SW5Cb3goKSkKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUxlZ2FjeUVkaXRpbmdQ
b3NpdGlvbihtX3JlbmRlcmVyLT5ub2RlKCksIG1fb2Zmc2V0KTsKKworICAgIHJldHVybiBjcmVh
dGVMZWdhY3lFZGl0aW5nUG9zaXRpb24ocHJldkxlYWZDaGlsZCgpLT5yZW5kZXJlcigpLT5ub2Rl
KCksIG1fb2Zmc2V0KTsKK30KKwogTGF5b3V0UmVjdCBSZW5kZXJlZFBvc2l0aW9uOjphYnNvbHV0
ZVJlY3QoaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0CiB7CiAgICAgaWYgKGlzTnVs
bCgpKQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmgJKHJl
dmlzaW9uIDk0ODY3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9u
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDI1ICs0Niw3MSBAQCBwdWJsaWM6CiAgICAgUmVuZGVy
ZWRQb3NpdGlvbigpOwogICAgIGV4cGxpY2l0IFJlbmRlcmVkUG9zaXRpb24oY29uc3QgVmlzaWJs
ZVBvc2l0aW9uJik7CiAgICAgZXhwbGljaXQgUmVuZGVyZWRQb3NpdGlvbihjb25zdCBQb3NpdGlv
biYsIEVBZmZpbml0eSk7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlbmRlcmVkUG9zaXRp
b24mIG90aGVyKSBjb25zdDsKIAogICAgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gIW1f
cmVuZGVyZXI7IH0KICAgICBSb290SW5saW5lQm94KiByb290Qm94KCkgeyByZXR1cm4gbV9pbmxp
bmVCb3ggPyBtX2lubGluZUJveC0+cm9vdCgpIDogMDsgfQogCisgICAgdW5zaWduZWQgY2hhciBi
aWRpTGV2ZWxPbkxlZnQoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9uUmln
aHQoKSBjb25zdDsKKyAgICBSZW5kZXJlZFBvc2l0aW9uIGxlZnRCb3VuZGFyeU9mQmlkaVJ1bih1
bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKTsKKyAgICBSZW5kZXJlZFBvc2l0aW9uIHJpZ2h0
Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bik7CisKKyAgICBl
bnVtIFNob3VsZE1hdGNoQmlkaUxldmVsIHsgTWF0Y2hCaWRpTGV2ZWwsIElnbm9yZUJpZGlMZXZl
bCB9OworICAgIGJvb2wgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oKSBjb25zdCB7IHJldHVybiBh
dExlZnRCb3VuZGFyeU9mQmlkaVJ1bihJZ25vcmVCaWRpTGV2ZWwsIDApOyB9CisgICAgYm9vbCBh
dFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oKSBjb25zdCB7IHJldHVybiBhdFJpZ2h0Qm91bmRhcnlP
ZkJpZGlSdW4oSWdub3JlQmlkaUxldmVsLCAwKTsgfQorICAgIC8vIFRoZSBmb2xsb3dpbmcgdHdv
IGZ1bmN0aW9ucyByZXR1cm4gdHJ1ZSBvbmx5IGlmIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGF0
IHRoZSBlbmQgb2YgdGhlIGJpZGkgcnVuCisgICAgLy8gb2YgdGhlIHNwZWNpZmllZCBiaWRpIGVt
YmVkZGluZyBsZXZlbC4KKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVk
IGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0IHsgcmV0dXJuIGF0TGVmdEJvdW5kYXJ5T2ZCaWRp
UnVuKE1hdGNoQmlkaUxldmVsLCBiaWRpTGV2ZWxPZlJ1bik7IH0KKyAgICBib29sIGF0UmlnaHRC
b3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdCB7IHJl
dHVybiBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oTWF0Y2hCaWRpTGV2ZWwsIGJpZGlMZXZlbE9m
UnVuKTsgfQorCisgICAgUG9zaXRpb24gcG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigp
IGNvbnN0OworICAgIFBvc2l0aW9uIHBvc2l0aW9uQXRSaWdodEJvdW5kYXJ5T2ZCaURpUnVuKCkg
Y29uc3Q7CisKICAgICBMYXlvdXRSZWN0IGFic29sdXRlUmVjdCgpIGNvbnN0IHsgcmV0dXJuIGFi
c29sdXRlUmVjdCgwKTsgfQogICAgIExheW91dFJlY3QgYWJzb2x1dGVSZWN0KGludCYgZXh0cmFX
aWR0aFRvRW5kT2ZMaW5lKSBjb25zdCB7IHJldHVybiBhYnNvbHV0ZVJlY3QoJmV4dHJhV2lkdGhU
b0VuZE9mTGluZSk7IH0KIAogcHJpdmF0ZToKKyAgICBleHBsaWNpdCBSZW5kZXJlZFBvc2l0aW9u
KFJlbmRlck9iamVjdCosIElubGluZUJveCosIGludCBvZmZzZXQpOworCisgICAgZW51bSBDYWNo
ZVN0YXR1cyB7IENhY2hlZFByZXZMZWFmQ2hpbGQsIENhY2hlZE5leHRMZWFmQ2hpbGQgfTsKKyAg
ICBpbmxpbmUgYm9vbCBzaG91bGRDYWNoZShDYWNoZVN0YXR1cyBmbGFnKSBjb25zdCB7IHJldHVy
biAhKG1fY2FjaGVTdGF0dXMgJiBmbGFnKTsgfQorICAgIGlubGluZSB2b2lkIHNldENhY2hlZChD
YWNoZVN0YXR1cyBmbGFnKSBjb25zdCB7IG1fY2FjaGVTdGF0dXMgfD0gZmxhZzsgfQorCisgICAg
SW5saW5lQm94KiBwcmV2TGVhZkNoaWxkKCkgY29uc3Q7CisgICAgSW5saW5lQm94KiBuZXh0TGVh
ZkNoaWxkKCkgY29uc3Q7CisgICAgYm9vbCBhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSBjb25zdCB7
IHJldHVybiBtX2lubGluZUJveCAmJiBtX29mZnNldCA9PSBtX2lubGluZUJveC0+Y2FyZXRMZWZ0
bW9zdE9mZnNldCgpOyB9CisgICAgYm9vbCBhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkgY29uc3Qg
eyByZXR1cm4gbV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNhcmV0Umln
aHRtb3N0T2Zmc2V0KCk7IH0KKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKFNob3Vs
ZE1hdGNoQmlkaUxldmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdDsKKyAg
ICBib29sIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRjaEJpZGlMZXZlbCwgdW5z
aWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3Q7CisKICAgICBMYXlvdXRSZWN0IGFic29s
dXRlUmVjdChpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3Q7CiAKICAgICBSZW5kZXJP
YmplY3QqIG1fcmVuZGVyZXI7CiAgICAgSW5saW5lQm94KiBtX2lubGluZUJveDsKICAgICBpbnQg
bV9vZmZzZXQ7CisKKyAgICBtdXRhYmxlIHVuc2lnbmVkIG1fY2FjaGVTdGF0dXMgOiAyOworCisg
ICAgLy8gRG8gbm90IGluaXRpYWxpemUgdGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFz
IG9wdGltaXphdGlvbi4KKyAgICAvLyBGbGFncyBpbiBtX2NhY2hlU3RhdHVzIHRlbGwgdXMgd2hp
Y2ggb25lcyBhcmUgaW5pdGlhbGl6ZWQuCisgICAgbXV0YWJsZSBJbmxpbmVCb3gqIG1fcHJldkxl
YWZDaGlsZDsKKyAgICBtdXRhYmxlIElubGluZUJveCogbV9uZXh0TGVhZkNoaWxkOwogfTsKIAog
aW5saW5lIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVkUG9zaXRpb24oKQogICAgIDogbV9yZW5k
ZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBt
X2NhY2hlU3RhdHVzKDApCit7Cit9CisKK2lubGluZSBSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJl
ZFBvc2l0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIElubGluZUJveCogYm94LCBpbnQgb2Zm
c2V0KQorICAgIDogbV9yZW5kZXJlcihyZW5kZXJlcikKKyAgICAsIG1faW5saW5lQm94KGJveCkK
KyAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICAsIG1fY2FjaGVTdGF0dXMoMCkKIHsKIH0KIApJ
bmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgJKHJldmlzaW9u
IDk0ODY3KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlU2VsZWN0aW9uLmgJKHdv
cmtpbmcgY29weSkKQEAgLTY5LDYgKzY5LDggQEAgcHVibGljOgogICAgIAogICAgIFZpc2libGVQ
b3NpdGlvbiB2aXNpYmxlU3RhcnQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9z
dGFydCwgaXNSYW5nZSgpID8gRE9XTlNUUkVBTSA6IGFmZmluaXR5KCkpOyB9CiAgICAgVmlzaWJs
ZVBvc2l0aW9uIHZpc2libGVFbmQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9l
bmQsIGlzUmFuZ2UoKSA/IFVQU1RSRUFNIDogYWZmaW5pdHkoKSk7IH0KKyAgICBWaXNpYmxlUG9z
aXRpb24gdmlzaWJsZUJhc2UoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9zaXRpb24obV9iYXNl
LCBpc1JhbmdlKCkgPyAoaXNCYXNlRmlyc3QoKSA/IFVQU1RSRUFNIDogRE9XTlNUUkVBTSkgOiBh
ZmZpbml0eSgpKTsgfQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRXh0ZW50KCkgY29uc3Qg
eyByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKG1fZXh0ZW50LCBpc1JhbmdlKCkgPyAoaXNCYXNlRmly
c3QoKSA/IERPV05TVFJFQU0gOiBVUFNUUkVBTSkgOiBhZmZpbml0eSgpKTsgfQogCiAgICAgYm9v
bCBpc05vbmUoKSBjb25zdCB7IHJldHVybiBzZWxlY3Rpb25UeXBlKCkgPT0gTm9TZWxlY3Rpb247
IH0KICAgICBib29sIGlzQ2FyZXQoKSBjb25zdCB7IHJldHVybiBzZWxlY3Rpb25UeXBlKCkgPT0g
Q2FyZXRTZWxlY3Rpb247IH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJ
KHJldmlzaW9uIDk0ODY3KQorKysgU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC02OTAsNyArNjkwLDggQEAgdm9pZCBFdmVudEhhbmRsZXI6OnVw
ZGF0ZVNlbGVjdGlvbkZvck1vdQogICAgIGlmIChtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVs
YXJpdHkoKSAhPSBDaGFyYWN0ZXJHcmFudWxhcml0eSkKICAgICAgICAgbmV3U2VsZWN0aW9uLmV4
cGFuZFVzaW5nR3JhbnVsYXJpdHkobV9mcmFtZS0+c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCkp
OwogCi0gICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9u
SWZOZWVkZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHko
KSk7CisgICAgbV9mcmFtZS0+c2VsZWN0aW9uKCktPnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9u
SWZOZWVkZWQobmV3U2VsZWN0aW9uLCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHko
KSwKKyAgICAgICAgRnJhbWVTZWxlY3Rpb246OkFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5
KTsKIH0KICNlbmRpZiAvLyBFTkFCTEUoRFJBR19TVVBQT1JUKQogCkluZGV4OiBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lv
biA5NDg5OSkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDEzIEBACisyMDExLTA5LTA5ICBSeW9zdWtlIE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgor
CisgICAgICAgIFJFR1JFU1NJT04ocjc0OTcxKTogU2VsZWN0aW9uIGRvZXNuJ3Qgd29yayBjb3Jy
ZWN0bHkgaW4gQmlEaSBUZXh0CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD01NzM0MAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0
bWw6IEFkZGVkLgorCiAyMDExLTA5LTA5ICBFcmlrIEFydmlkc3NvbiAgPGFydkBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgTW92ZSBFbGVtZW50LmNvbnRhaW5zIHRvIE5vZGUKSW5kZXg6IExheW91
dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVu
LWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0
aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTIyIEBACitUaGlzIHRlc3QgZW5zdXJlcyBXZWJLaXQgbGV0cyB1c2VyIHNlbGVjdCBiaWRpcmVj
dGlvbmFsIHRleHQgaW50dWl0aXZlbHkuIFRvIG1hbnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGlu
IGJsdWUgYm94IGluIGVhY2ggdGVzdCBjYXNlIGJlbG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxl
ZnQgdG8gcmlnaHQuIFRoZSBjaGFuZ2VzIGluIHRoZSBzZWxlY3RlZCB0ZXh0IHNob3VsZCBtYXRj
aCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8LiBEbyB0aGUgc2FtZSBieSBhIG1vdXNlIGRyYWcg
ZnJvbSByaWdodCB0byBsZWZ0IGFuZCBleHBlY3RhdGlvbnMgYXJlIGFmdGVyIHwuCisKK1Rlc3Qg
ImFiY0FCQyIgaW4gImFiY0FCQyI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNT
IHNlbGVjdGVkICJhIgorUEFTUyBzZWxlY3RlZCAiYWIiCitQQVNTIHNlbGVjdGVkICJhYmMiCitQ
QVNTIHNlbGVjdGVkICJhYmNBQiIKK1BBU1Mgc2VsZWN0ZWQgImFiY0EiCitQQVNTIHNlbGVjdGVk
ICJhYmNBQkMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJB
IgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitQQVNTIHNlbGVjdGVk
ICJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYmNBQkMiCitQQVNTIHNlbGVjdGVkICJhYmNBQkMiCisK
K1Rlc3QgIkFCQ2RlZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0
CitQQVNTIHNlbGVjdGVkICJDIgorUEFTUyBzZWxlY3RlZCAiQkMiCitQQVNTIHNlbGVjdGVkICJB
QkMiCitQQVNTIHNlbGVjdGVkICJBQkNkIgorRkFJTCBzZWxlY3RlZCAiQUJDZGUiIGJ1dCBleHBl
Y3RlZCAiQUJDZWYiCitQQVNTIHNlbGVjdGVkICJBQkNkZWYiCitTZWxlY3RpbmcgZnJvbSByaWdo
dCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAiZWYiCitQQVNTIHNl
bGVjdGVkICJkZWYiCitQQVNTIHNlbGVjdGVkICJCQ2RlZiIKK1BBU1Mgc2VsZWN0ZWQgIkNkZWYi
CitQQVNTIHNlbGVjdGVkICJBQkNkZWYiCisKK1Rlc3QgIkFCQyIgaW4gImFiY0FCQ2RlZiI6CitT
ZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJDIgorUEFTUyBzZWxl
Y3RlZCAiQkMiCitQQVNTIHNlbGVjdGVkICJBQkMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBs
ZWZ0CitQQVNTIHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVk
ICJBQkMiCisKK1Rlc3QgIkFCQyIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRv
IHJpZ2h0CitQQVNTIHNlbGVjdGVkICJDIgorUEFTUyBzZWxlY3RlZCAiQkMiCitQQVNTIHNlbGVj
dGVkICJBQkMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJB
IgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCisKK1Rlc3QgImVmIiBp
biAiQUJDZGVmIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQg
ImUiCitQQVNTIHNlbGVjdGVkICJlZiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BB
U1Mgc2VsZWN0ZWQgImYiCitQQVNTIHNlbGVjdGVkICJlZiIKKworVGVzdCAiQUIiIGluICJhYmNB
QkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQiIKK1BB
U1Mgc2VsZWN0ZWQgIkFCIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxl
Y3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorCitUZXN0ICIxMiIgaW4gImFYTTEySk5kIjoK
K1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIjEiCitQQVNTIHNl
bGVjdGVkICIxMiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQg
IjIiCitQQVNTIHNlbGVjdGVkICIxMiIKKworVGVzdCAiQUJDIDEyMyIgaW4gIkFCQyAxMjMiOgor
U2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiMSIKK1BBU1Mgc2Vs
ZWN0ZWQgIjEyIgorUEFTUyBzZWxlY3RlZCAiMTIzIgorUEFTUyBzZWxlY3RlZCAiIDEyMyIKK1BB
U1Mgc2VsZWN0ZWQgIkMgMTIzIgorUEFTUyBzZWxlY3RlZCAiQkMgMTIzIgorUEFTUyBzZWxlY3Rl
ZCAiQUJDIDEyMyIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQg
IkEiCitQQVNTIHNlbGVjdGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKK1BBU1Mgc2VsZWN0
ZWQgIkFCQyAiCitQQVNTIHNlbGVjdGVkICJBQkMgMTIiCitQQVNTIHNlbGVjdGVkICJBQkMgMSIK
K1BBU1Mgc2VsZWN0ZWQgIkFCQyAxMjMiCisKK1Rlc3QgIkFCQyAxMjMiIGluICJBQkMgMTIzIjoK
K1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIjEiCitQQVNTIHNl
bGVjdGVkICIxMiIKK0ZBSUwgc2VsZWN0ZWQgIjEyMyIgYnV0IGV4cGVjdGVkICIgMTIzIgorRkFJ
TCBzZWxlY3RlZCAiICIgYnV0IGV4cGVjdGVkICJDIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIkMgIiBi
dXQgZXhwZWN0ZWQgIkJDIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIkJDICIgYnV0IGV4cGVjdGVkICJB
QkMgMTIzIgorRkFJTCBzZWxlY3RlZCAiMTIzIiBidXQgZXhwZWN0ZWQgInVuZGVmaW5lZCIKK1Nl
bGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVj
dGVkICJBQiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyIKK0ZBSUwgc2VsZWN0ZWQgIiIgYnV0IGV4cGVj
dGVkICJBQkMgIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEyIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEi
CitGQUlMIHNlbGVjdGVkICIxMjMiIGJ1dCBleHBlY3RlZCAiQUJDIDEyMyIKKworUEFTUyBzdWNj
ZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNUIENPTVBMRVRFCisKKworCisKKwpJbmRleDog
TGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0
bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3Qt
YmlkaS1ydW4uaHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNDEgQEAKKzwhRE9DVFlQRSBo
dG1sPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29u
dGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIg
aHJlZj0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiPgorPHNjcmlw
dCBzcmM9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3NjcmlwdD4K
KzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisjdGVzdHMgeyBmb250LXNpemU6IDIuNWVtOyBwYWRk
aW5nOiAwcHg7IG1hcmdpbjogMHB4OyB9CitkdCB7IHdpZHRoOiAxNWV4OyBwYWRkaW5nOiAwcHgg
MTBweDsgbWFyZ2luOiAwcHg7IH0KK2RkIHsgZm9udC1zaXplOiAwLjZlbTsgbWFyZ2luOiAwcHg7
IHBhZGRpbmc6IDBweCAxMHB4OyB9CisudGFyZ2V0IHsgYmFja2dyb3VuZC1jb2xvcjogI2JiZWVm
ZjsgfQorPC9zdHlsZT4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGhpcyB0ZXN0IGVuc3VyZXMgV2Vi
S2l0IGxldHMgdXNlciBzZWxlY3QgYmlkaXJlY3Rpb25hbCB0ZXh0IGludHVpdGl2ZWx5LgorVG8g
bWFudWFsbHkgdGVzdCwgc2VsZWN0IHRleHQgaW4gYmx1ZSBib3ggaW4gZWFjaCB0ZXN0IGNhc2Ug
YmVsb3cgYnkgYSBtb3VzZSBkcmFnIGZyb20gbGVmdCB0byByaWdodC4KK1RoZSBjaGFuZ2VzIGlu
IHRoZSBzZWxlY3RlZCB0ZXh0IHNob3VsZCBtYXRjaCB0aGUgZXhwZWN0YXRpb25zIGJlZm9yZSB8
LgorRG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBkcmFnIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgZXhw
ZWN0YXRpb25zIGFyZSBhZnRlciB8LjwvcD4KKzxkaXY+U2VsZWN0ZWQgdGV4dDogPHNwYW4gaWQ9
ImxvZyI+PC9zcGFuPjwvZGl2PgorPGRsIGlkPSJ0ZXN0cyI+Cis8ZHQgY29udGVudGVkaXRhYmxl
PjxzcGFuIGNsYXNzPSJ0YXJnZXQiPmFiY9eQ15HXkjwvc3Bhbj48L2R0PgorPGRkPmEsYWIsYWJj
LGFiY0FCLGFiY0EsYWJjQUJDfEEsQUIsQUJDLGNBQkMsYmNBQkMsYWJjQUJDPC9kZD4KKworPGR0
IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15JkZWY8L3NwYW4+PC9k
dD4KKzxkZD5DLEJDLEFCQyxBQkNkLEFCQ2VmLEFCQ2RlZnxmLGVmLGRlZixCQ2RlZixDZGVmLEFC
Q2RlZjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+
15DXkdeSPC9zcGFuPmRlZjwvZHQ+Cis8ZGQ+QyxCQyxBQkN8QSxBQixBQkM8L2RkPgorCis8ZHQg
ZGlyPSJydGwiIGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15I8L3Nw
YW4+ZGVmPC9kdD4KKzxkZD5DLEJDLEFCQ3xBLEFCLEFCQzwvZGQ+CisKKzxkdCBkaXI9InJ0bCI+
15DXkdeSZDxzcGFuIGNsYXNzPSJ0YXJnZXQiPmVmPC9zcGFuPjwvZHQ+Cis8ZGQ+ZSxlZnxmLGVm
PC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT5hYmM8c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR
PC9zcGFuPteSPC9kdD4KKzxkZD5CLEFCfEEsQUI8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxl
PmHXp9ecPHNwYW4gY2xhc3M9InRhcmdldCI+MTI8L3NwYW4+15nXnWQ8L2R0PgorPGRkPjEsMTJ8
MiwxMjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGUgZGlyPSJydGwiPjxzcGFuIGNsYXNzPSJ0
YXJnZXQiPteQ15HXkiAxMjM8L3NwYW4+PC9kdD4KKzxkZD4xLDEyLDEyMywgMTIzLEMgMTIzLEJD
IDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFCQyAxMjM8L2RkPgorCis8
ZHQgY29udGVudGVkaXRhYmxlPjxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkiAxMjM8L3NwYW4+
PC9kdD4KKzxkZD4xLDEyLCAxMjMsQyAxMjMsQkMgMTIzLEFCQyAxMjN8QSxBQixBQkMsQUJDICxB
QkMgMTIsQUJDIDEsQUJDIDEyMzwvZGQ+CisKKzwhLS08ZHQgY29udGVudGVkaXRhYmxlPjxzcGFu
IGNsYXNzPSJ0YXJnZXQiPteQ15HXkiAxMjMgLSA0NTY8L3NwYW4+PC9kdD4KKzxkZD4xLDEyLCAx
MjMsQyAxMjMsQkMgMTIzLEFCQyAxMjN8QSxBQixBQkMsQUJDICxBQkMgMTIsQUJDIDEsQUJDIDEy
MzwvZGQ+LS0+CisKKzwvZGw+Cis8ZGl2IGlkPSJjb25zb2xlIj48L2Rpdj4KKzxwcmU+PHNjcmlw
dD4KK3ZhciB0ZXN0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpOworCitTdHJp
bmcucHJvdG90eXBlLmZvbGQgPSBmdW5jdGlvbiAoKSB7CisgICAgdmFyIHJlc3VsdCA9ICcnOwor
ICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykgeworICAgICAgICB2YXIg
Y29kZSA9IHRoaXMuY2hhckNvZGVBdChpKTsKKyAgICAgICAgaWYgKDB4MDVkMCA8PSBjb2RlICYm
IGNvZGUgPD0gMHgwNWVhKS8vIEhlYnJldyBBbGVmCisgICAgICAgICAgICBjb2RlICs9IC0weDA1
ZDAgKyAnQScuY2hhckNvZGVBdCgwKTsKKyAgICAgICAgcmVzdWx0ICs9IFN0cmluZy5mcm9tQ2hh
ckNvZGUoY29kZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Z1bmN0aW9uIGFz
c2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpIHsKKyAgICBkb2N1bWVudC53cml0ZWxuKCdFOicg
KyBleHBlY3RlZCArICcgQTonICsgYWN0dWFsKTsKK30KKworZnVuY3Rpb24gc2VsZWN0QnlNb3Vz
ZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCBsZWZ0VG9SaWdodCwgZXhwZWN0YXRpb25zKSB7
CisgICAgdmFyIHkgPSB0YXJnZXQub2Zmc2V0VG9wICsgdGFyZ2V0Lm9mZnNldEhlaWdodCAvIDI7
CisgICAgdmFyIGxlZnQgPSB0YXJnZXQub2Zmc2V0TGVmdDsKKworICAgIHZhciBzdGFydFggPSBs
ZWZ0ICsgKGxlZnRUb1JpZ2h0ID8gMCA6IHRhcmdldC5vZmZzZXRXaWR0aCk7CisgICAgZXZlbnRT
ZW5kZXIuZHJhZ01vZGUgPSBmYWxzZTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgzMDAw
KTsKKyAgICBldmVudFNlbmRlci5tb3VzZU1vdmVUbyhzdGFydFgsIHkpOworICAgIGV2ZW50U2Vu
ZGVyLm1vdXNlRG93bigpOworCisgICAgdmFyIHByZXZpb3VzU2VsZWN0ZWRUZXh0ID0gJyc7Cisg
ICAgdmFyIGogPSAwOworICAgIHZhciB4SW5jcmVtZW50ID0gbGVmdFRvUmlnaHQgPyAxIDogLTE7
CisgICAgZm9yICh2YXIgeCA9IHN0YXJ0WDsgbGVmdCA8PSB4ICYmIHggPD0gbGVmdCArIHRhcmdl
dC5vZmZzZXRXaWR0aDsgeCArPSB4SW5jcmVtZW50KSB7CisgICAgICAgIGV2ZW50U2VuZGVyLmxl
YXBGb3J3YXJkKDEwMCk7CisgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlTW92ZVRvKHgsIHkpOwor
CisgICAgICAgIHZhciBzZWxlY3RlZFRleHQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJp
bmcoKS5mb2xkKCk7CisgICAgICAgIGlmIChwcmV2aW91c1NlbGVjdGVkVGV4dCAhPSBzZWxlY3Rl
ZFRleHQpIHsKKyAgICAgICAgICAgIGlmIChleHBlY3RhdGlvbnNbal0gPT0gc2VsZWN0ZWRUZXh0
KQorICAgICAgICAgICAgICAgIHRlc3RQYXNzZWQoJ3NlbGVjdGVkICInICsgc2VsZWN0ZWRUZXh0
ICsgJyInKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZXN0RmFpbGVkKCdz
ZWxlY3RlZCAiJyArIHNlbGVjdGVkVGV4dCArICciIGJ1dCBleHBlY3RlZCAiJyArIGV4cGVjdGF0
aW9uc1tqXSArICciJyk7CisgICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGV4dCA9IHNlbGVj
dGVkVGV4dDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGV2ZW50
U2VuZGVyLm1vdXNlVXAoKTsKK30KKworaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikg
eworICAgIGxheW91dFRlc3RDb250cm9sbGVyLmR1bXBBc1RleHQoKTsKKworICAgIHZhciB0ZXN0
cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdOYW1l
KCdkdCcpOworICAgIHZhciB0ZXN0RXhwZWN0YXRpb25zID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoJ3Rlc3RzJykuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RkJyk7CisKKyAgICBmb3IgKHZhciBp
ID0gMDsgaSA8IHRlc3RzLmxlbmd0aDsgaSsrKSB7ICAgICAgICAKKyAgICAgICAgdGVzdHNbaV0u
c3R5bGUuZGlzcGxheSA9IG51bGw7CisgICAgICAgIHRlc3RFeHBlY3RhdGlvbnNbaV0uc3R5bGUu
ZGlzcGxheSA9IG51bGw7CisKKyAgICAgICAgdmFyIHRhcmdldCA9IHRlc3RzW2ldLmdldEVsZW1l
bnRzQnlDbGFzc05hbWUoJ3RhcmdldCcpWzBdOworICAgICAgICB2YXIgdGVzdEV4cGVjdGF0aW9u
ID0gdGVzdEV4cGVjdGF0aW9uc1tpXS50ZXh0Q29udGVudDsKKworICAgICAgICBkZWJ1ZygnVGVz
dCAiJyArIHRhcmdldC50ZXh0Q29udGVudC5mb2xkKCkgKyAnIiBpbiAiJyArIHRhcmdldC5wYXJl
bnROb2RlLnRleHRDb250ZW50LmZvbGQoKSArICciOicpOworICAgICAgICBkZWJ1ZygnU2VsZWN0
aW5nIGZyb20gbGVmdCB0byByaWdodCcpOworICAgICAgICBzZWxlY3RCeU1vdXNlRHJhZ0FuZFZl
cmlmeVJlc3VsdCh0YXJnZXQsIHRydWUsIHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwvKVswXS5z
cGxpdCgvLC8pKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQn
KTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCBmYWxz
ZSwgdGVzdEV4cGVjdGF0aW9uLnNwbGl0KC9cfC8pWzFdLnNwbGl0KC8sLykpOworICAgICAgICBk
ZWJ1ZygnJyk7CisKKyAgICAgICAgLy8gU29tZSB0ZXN0cyBtYXkgYmUgb3VzaWRlIG9mIHRoZSB3
aW5kb3cgc28gYnJpbmcgdGhlbSBpbiBhcyB3ZSBwcm9jZXNzLgorICAgICAgICB0ZXN0c1tpXS5z
dHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgICAgICB0ZXN0RXhwZWN0YXRpb25zW2ldLnN0eWxl
LmRpc3BsYXkgPSAnbm9uZSc7CisgICAgfQorCisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQo
J3Rlc3RzJykuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgnbG9nJykucGFyZW50Tm9kZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworfSBlbHNlIHsK
KyAgICBkZWJ1ZygnVGhpcyB0ZXN0IHJlcXVpcmVzIGV2ZW50U2VuZGVyJyk7CisgICAgZG9jdW1l
bnQub25zZWxlY3Rpb25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGRvY3VtZW50Lmdl
dEVsZW1lbnRCeUlkKCdsb2cnKS50ZXh0Q29udGVudCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50
b1N0cmluZygpLmZvbGQoKTsKKyAgICB9Cit9CisKK3ZhciBzdWNjZXNzZnVsbHlQYXJzZWQgPSB0
cnVlOworCis8L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9q
cy10ZXN0LXBvc3QuanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107115</attachid>
            <date>2011-09-12 17:08:28 -0700</date>
            <delta_ts>2011-09-12 18:02:48 -0700</delta_ts>
            <desc>Updated per Eric&apos;s suggestion</desc>
            <filename>bug-57340-20110912170827.patch</filename>
            <type>text/plain</type>
            <size>30657</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0OTg4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDktMTIgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVHUkVTU0lPTihyNzQ5NzEpOiBT
ZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURpIFRleHQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRzIHRoZSBl
bmQgcG9pbnQgYWRqdXN0bWVudCBtZWNoYW5pc20gYXQgYmlkaSBib3VuZGFyaWVzIHNpbWlsYXIg
dG8gdGhlIG9uZSBOU1RleHRWaWV3IGltcGxlbWVudHMuCisKKyAgICAgICAgVG8gdW5kZXJzdGFu
ZCB0aGUgcHJvYmxlbSwgc3VwcG9zZSB3ZSBoYXZlIHN0cm9uZyBSVEwgbGV0dGVycyAiQUJDIiBp
biBhIExUUiBibG9jayAodmlzdWFsbHkgbGFpZCBvdXQgYXMgQ0JBKS4KKworICAgICAgICBQZXIg
TlNUZXh0VmlldyBjb252ZW50aW9uLCBsb2dpY2FsIG9mZnNldHMgYmV0d2VlbiBlYWNoIGxldHRl
ciBpcyBwbGFjZWQgYXMgKDApQygyKUIoMSlBKDMpLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAg
cGxhY2luZyB0aGUgY2FyZXQgdmlzdWFsbHkgb24gdGhlIGxlZnQgb2YgQ0JBIHlpZWxkcyB0aGUg
cG9zaXRpb24gaW5zaWRlIHRoZSB0ZXh0IG5vZGUgb2YgIkFCQyIgYXQgb2Zmc2V0IDAuCisgICAg
ICAgIExpa2V3aXNlLCBwbGFjaW5nIGl0IGJldHdlZW4gQyBhbmQgQiB5aWVsZHMgKCJBQkMiLCAy
KSwgYW5kIHBsYWNpbmcgaXQgb24gdGhlIHJpZ2h0IG9mIENCQSB5aWVsZHMgKCJBQkMiLCAzKS4K
KworICAgICAgICBOb3cgc3VwcG9zZSBhIHVzZXIgYXR0ZW1wdHMgdG8gc2VsZWN0IHRoZSBsZXR0
ZXIgQSBieSBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQ0JBIHRvIGEgcG9pbnQgYmV0
d2VlbgorICAgICAgICBCIGFuZCBBLiBGaXJzdCwgdGhlIGluaXRpYWwgbW91c2UgZG93biBwbGFj
ZXMgdGhlIHNlbGVjdGlvbidzIGJhc2UgYXQgKCJBQkMiLCAzKS4gVGhlbiBhcyB0aGUgbW91c2Ug
cG9pbnRlcgorICAgICAgICBtb3ZlcyB0byBhIHBvaW50IG9uIHRoZSBsZWZ0IG9mIEEsIHRoZSBz
ZWxlY3Rpb24ncyBleHRlbnQgaXMgc2V0IGF0ICgiQUJDIiwgMSksIHNlbGVjdGluZyAiQkMiLgor
CisgICAgICAgIFRvIG1pdGlnYXRlIHRoaXMgaXNzdWUsIE5TVGV4dFZpZXcgYWRqdXN0cyBzZWxl
Y3Rpb24gYmFzZSBhbmQgZXh0ZW50IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gSW4gdGhlIGFi
b3ZlCisgICAgICAgIGV4YW1wbGUsIE5TVGV4dFZpZXcgZGV0ZWN0cyB1c2VyJ3MgaW50ZW50IGFu
ZCBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24ncyBiYXNlIHRvICgiQUJDIiwgMCkgdGVtcG9yYXJpbHku
CisKKyAgICAgICAgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgc2ltaWxhciB0cmljayBvbiBXZWJL
aXQuIFdlIGFkanVzdCB0aGUgYmFzZSBvciB0aGUgZXh0ZW50IHdoZW4gdGhleSdyZSBhdCB0aGUg
bGVmdAorICAgICAgICBlbmQgb3IgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0
aGUgb3RoZXIgZW5kIGlzIGluc2lkZSBvZiB0aGUgcnVuLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwg
dGhlCisgICAgICAgIGJhc2UgcG9zaXRpb24gb24gdGhlIHJpZ2h0IG9mIEEgaXMgdGhlIHJpZ2h0
IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0aGUgZXh0ZW50IHBvc2l0aW9uIGJldHdlZW4gQiBhbmQg
QSBpcworICAgICAgICBpbnNpZGUgdGhlIHNhbWUgcnVuIChDQkEpLCBzbyB3ZSB3b3VsZCBhZGp1
c3QgdGhlIGJhc2UgdG8gYmUgKCJBQkMiLCAwKSBhcyBOU1RleHRWaWV3IGRvZXMuCisKKyAgICAg
ICAgVGFrZSBhbm90aGVyIGV4YW1wbGUgYWJjQUJDLiBOb3RlIG9mZnNldHMgYXJlIGFzc2lnbmVk
IGFzICgwKWEoMSliKDIpYygzKUMoNSlCKDQpQSg2KSBXaGVuIHRoZSB1c2VyIHN0YXJ0cworICAg
ICAgICBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQSB0byBhIHBvaW50IGJldHdlZW4g
QiBhbmQgQSwgd2UgYWRqdXN0IHRoZSBzZWxlY3Rpb24gYmFzZSB0byBiZSAoImFiY0FCQyIsIDMp
CisgICAgICAgIGJlY2F1c2UgdGhlIGJhc2UgaXMgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkg
cnVuIGFuZCB0aGUgZXh0ZW50IGlzIGluIHRoZSBzYW1lIHJ1bi4gV2Uga2VlcCB0aGUgYWRqdXN0
bWVudAorICAgICAgICB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIG1vdmVzIHRvIGEgcG9pbnQgYmV0
d2VlbiBDIGFuZCBCLiBIb3dldmVyLCB3aGVuIHRoZSBtb3VzZXIgcG9pbnRlciByZWFjaGVzIGEg
cG9pbnQKKyAgICAgICAgYmV0d2VlbiBsZXR0ZXJzIGIgYW5kIGMsIHRoZSBzZWxlY3Rpb24gZXh0
ZW50IGlzIHBsYWNlZCBhdCAoImFiY0FCQyIsIDIpLiBCZWNhdXNlIHRoZSBleHRlbnQgaXMgb3V0
c2lkZSBvZgorICAgICAgICB0aGUgYmlkaSBydW4gc3RhcnRlZCBmcm9tIHRoZSBzZWxlY3Rpb24g
YmFzZSwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZSBhdCB0aGlzIHBvaW50LiBIYWQgd2Ug
bm90IGRvbmUgdGhpcywKKyAgICAgICAgd2UnbGwgZW5kIHVwIHNlbGVjdGluZyBqdXN0ICJjIi4K
KworICAgICAgICBXaGlsZSB0aGlzIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBpbiBGcmFtZVNl
bGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZCwgdGhpcyBwYXRjaCBh
ZGRzCisgICAgICAgIHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB0byBSZW5kZXJlZFBvc2l0aW9u
IHRvIGZhY2lsaXRhdGUgYWJzdHJhY3Rpb24gYXJvdW5kIGlubGluZSBib3hlcyBhbmQgYmlkaSBy
dW5zLgorCisgICAgICAgIFRlc3Q6IGVkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5o
dG1sCisKKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KTogQWRkZWQuIEltcGxlbWVudHMg
dGhlIGVuZHBvaW50cyBhZGp1c3RtZW50IGFsZ29yaXRobS4KKyAgICAgICAgKFdlYkNvcmU6OkZy
YW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKTogQ2FsbHMg
YWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnksIGFuZAorICAgICAgICByZXN0b3JlcyB0aGUg
b3JpZ2luYWwgYmFzZSBhcyBuZWVkZWQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5oOgorICAgICAgICAqIGVkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQpOiBBZGRlZCB0byBjYWNoZSBw
cmV2TGVhZkNoaWxkIG9mIHRoZSBjdXJyZW50IGlubGluZSBib3guCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJlZFBvc2l0aW9uOjpuZXh0TGVhZkNoaWxkKTogRGl0dG8gZm9yIG5leHRMZWFmQ2hp
bGQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpvcGVyYXRvcj09KTogQ29t
cGFyZXMgdHdvIFJlbmRlcmVkUG9zaXRpb25zIGNvbnNpZGVyaW5nIG5laWdoYm9yaW5nIGlubGlu
ZSBib3hlcworICAgICAgICBzbyB0aGF0IHRoZSByaWdodG1vc3QgcG9zaXRpb24gaW4gYSBib3gg
YW5kIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiBpbiB0aGUgZm9sbG93aW5nIGJveCBpcyBjb25zaWRl
cmVkIGVxdWFsLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVs
T25MZWZ0KTogQWRkZWQuIFJldHVybnMgdGhlIGJpZGkgbGV2ZWwgb2YgdGhlIHJ1biBvbiB0aGUg
bGVmdC4gV2UgY2FuJ3QKKyAgICAgICAgYWRkIGEgZ2VuZXJpYyBiaWRpTGV2ZWwgdG8gdGhpcyBj
bGFzcyBiZWNhdXNlIGl0J2xsIGJlIGFtYmlndW91cyBhdCBiaWRpIGJvdW5kYXJpZXMuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpiaWRpTGV2ZWxPblJpZ2h0KTogRGl0dG8g
Zm9yIHRoZSBydW4gb24gdGhlIHJpZ2h0LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3Np
dGlvbjo6bGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bik6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodEJvdW5kYXJ5
T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpw
b3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKTogUmV0dXJucyBQb3NpdGlvbiBhdCB0aGUg
bGVmdCBlZGdlIG9mIGEgYmlkaSBydW4KKyAgICAgICAgaWYgUmVuZGVyZWRQb3NpdGlvbiBpcyBh
dCBzdWNoIGEgcG9zaXRpb24uIEFzc2VydHMgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bik6IERpdHRvIGZvciB0aGUgcmlnaHQgZWRnZS4KKyAgICAgICAgKiBlZGl0aW5nL1Jl
bmRlcmVkUG9zaXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0
TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJl
ZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4pOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0TGVmdG1vc3RPZmZzZXRJbkJveCk6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodG1vc3RPZmZzZXRJbkJv
eCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6dW5jYWNoZWRJ
bmxpbmVCb3gpOiBBZGRlZC4gV2UgY2FuJ3QgdXNlIGEgc3RhdGljIGNvbnN0IHZhcmlhYmxlIGJl
Y2F1c2UgZ2NjIHRoaW5rcworICAgICAgICByZWludGVycHJldF9jYXN0PElubGluZUJveCo+KDEp
IGlzIG5vdCBhbiBpbnRlZ3JhbCB2YWx1ZS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9z
aXRpb246OlJlbmRlcmVkUG9zaXRpb24pOgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVNlbGVj
dGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbjo6dmlzaWJsZUJhc2Up
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb246OnZpc2libGVFeHRl
bnQpOiBBZGRlZC4KKyAgICAgICAgKiBwYWdlL0V2ZW50SGFuZGxlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpFdmVudEhhbmRsZXI6OnVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRHJhZyk6CisKIDIw
MTEtMDktMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUkVH
UkVTU0lPTjogTW92aW5nIHVwIGRvZXNuJ3Qgd29yayBpbiBzb21lIGNhc2VzCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gOTQ5ODgpCisr
KyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAjaW5jbHVkZSAi
UmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1ZGUgIlJlbmRl
cmVkUG9zaXRpb24uaCIKICNpbmNsdWRlICJTZWN1cmVUZXh0SW5wdXQuaCIKICNpbmNsdWRlICJT
ZXR0aW5ncy5oIgogI2luY2x1ZGUgIlNwYXRpYWxOYXZpZ2F0aW9uLmgiCkBAIC0xNjMsMTMgKzE2
NCw2OCBAQCB2b2lkIERyYWdDYXJldENvbnRyb2xsZXI6OnNldENhcmV0UG9zaXRpCiAgICAgICAg
IHVwZGF0ZUNhcmV0UmVjdChkb2N1bWVudCwgbV9wb3NpdGlvbik7CiB9CiAKLXZvaWQgRnJhbWVT
ZWxlY3Rpb246OnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJs
ZVNlbGVjdGlvbiYgcGFzc2VkTmV3U2VsZWN0aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJp
dHkpCitzdGF0aWMgdm9pZCBhZGp1c3RFbmRwb2ludHNBdEJpZGlCb3VuZGFyeShWaXNpYmxlUG9z
aXRpb24mIGJhc2UsIFZpc2libGVQb3NpdGlvbiYgZXh0ZW50KQoreworICAgIFJlbmRlcmVkUG9z
aXRpb24gYmFzZVBvc2l0aW9uKGJhc2UpOworICAgIFJlbmRlcmVkUG9zaXRpb24gZXh0ZW50UG9z
aXRpb24oZXh0ZW50KTsKKworICAgIGlmIChiYXNlUG9zaXRpb24uaXNOdWxsKCkgfHwgZXh0ZW50
UG9zaXRpb24uaXNOdWxsKCkgfHwgYmFzZVBvc2l0aW9uID09IGV4dGVudFBvc2l0aW9uKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoYmFzZVBvc2l0aW9uLmF0TGVmdEJvdW5kYXJ5T2ZCaWRp
UnVuKCkpIHsKKyAgICAgICAgaWYgKCFleHRlbnRQb3NpdGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJp
ZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkKKyAgICAgICAgICAgICYmIGJh
c2VQb3NpdGlvbiA9PSBleHRlbnRQb3NpdGlvbi5sZWZ0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBv
c2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlUG9z
aXRpb24ucG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYmFzZVBv
c2l0aW9uLmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpKSB7CisgICAgICAgIGlmICghZXh0ZW50
UG9zaXRpb24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9u
TGVmdCgpKQorICAgICAgICAgICAgJiYgYmFzZVBvc2l0aW9uID09IGV4dGVudFBvc2l0aW9uLnJp
Z2h0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uTGVmdCgpKSkgewor
ICAgICAgICAgICAgYmFzZSA9IGJhc2VQb3NpdGlvbi5wb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW50UG9zaXRpb24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlS
dW4oKQorICAgICAgICAmJiBleHRlbnRQb3NpdGlvbiA9PSBiYXNlUG9zaXRpb24ubGVmdEJvdW5k
YXJ5T2ZCaWRpUnVuKGV4dGVudFBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAg
ICAgZXh0ZW50ID0gZXh0ZW50UG9zaXRpb24ucG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1
bigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV4dGVudFBvc2l0aW9uLmF0
UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpCisgICAgICAgICYmIGV4dGVudFBvc2l0aW9uID09IGJh
c2VQb3NpdGlvbi5yaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKGV4dGVudFBvc2l0aW9uLmJpZGlMZXZl
bE9uTGVmdCgpKSkgeworICAgICAgICBleHRlbnQgPSBleHRlbnRQb3NpdGlvbi5wb3NpdGlvbkF0
UmlnaHRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2
b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKGNv
bnN0IFZpc2libGVTZWxlY3Rpb24mIHBhc3NlZE5ld1NlbGVjdGlvbiwgVGV4dEdyYW51bGFyaXR5
IGdyYW51bGFyaXR5LAorICAgIEVuZFBvaW50c0FkanVzdG1lbnRNb2RlIGVuZHBvaW50c0FkanVz
dG1lbnRNb2RlKQogewogICAgIFZpc2libGVTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gcGFzc2Vk
TmV3U2VsZWN0aW9uOworICAgIGJvb2wgaXNEaXJlY3Rpb25hbCA9IHNob3VsZEFsd2F5c1VzZURp
cmVjdGlvbmFsU2VsZWN0aW9uKG1fZnJhbWUpIHx8IG5ld1NlbGVjdGlvbi5pc0RpcmVjdGlvbmFs
KCk7CiAKLSAgICBpZiAoc2hvdWxkQWx3YXlzVXNlRGlyZWN0aW9uYWxTZWxlY3Rpb24obV9mcmFt
ZSkpCi0gICAgICAgIG5ld1NlbGVjdGlvbi5zZXRJc0RpcmVjdGlvbmFsKHRydWUpOworICAgIFZp
c2libGVQb3NpdGlvbiBiYXNlID0gbV9vcmlnaW5hbEJhc2UuaXNOb3ROdWxsKCkgPyBtX29yaWdp
bmFsQmFzZSA6IG5ld1NlbGVjdGlvbi52aXNpYmxlQmFzZSgpOworICAgIFZpc2libGVQb3NpdGlv
biBuZXdCYXNlID0gYmFzZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50ID0gbmV3U2Vs
ZWN0aW9uLnZpc2libGVFeHRlbnQoKTsKKyAgICBpZiAoZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUg
PT0gQWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkpCisgICAgICAgIGFkanVzdEVuZHBvaW50
c0F0QmlkaUJvdW5kYXJ5KG5ld0Jhc2UsIG5ld0V4dGVudCk7CisKKyAgICBpZiAobmV3QmFzZSAh
PSBiYXNlIHx8IG5ld0V4dGVudCAhPSBuZXdTZWxlY3Rpb24udmlzaWJsZUV4dGVudCgpKSB7Cisg
ICAgICAgIG1fb3JpZ2luYWxCYXNlID0gYmFzZTsKKyAgICAgICAgbmV3U2VsZWN0aW9uLnNldEJh
c2UobmV3QmFzZSk7CisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRFeHRlbnQobmV3RXh0ZW50KTsK
KyAgICB9IGVsc2UgaWYgKG1fb3JpZ2luYWxCYXNlLmlzTm90TnVsbCgpKSB7CisgICAgICAgIGlm
IChtX3NlbGVjdGlvbi5iYXNlKCkgPT0gbmV3U2VsZWN0aW9uLmJhc2UoKSkKKyAgICAgICAgICAg
IG5ld1NlbGVjdGlvbi5zZXRCYXNlKG1fb3JpZ2luYWxCYXNlKTsKKyAgICAgICAgbV9vcmlnaW5h
bEJhc2UuY2xlYXIoKTsKKyAgICB9CiAKKyAgICBuZXdTZWxlY3Rpb24uc2V0SXNEaXJlY3Rpb25h
bChpc0RpcmVjdGlvbmFsKTsgLy8gQWRqdXN0aW5nIGJhc2UgYW5kIGV4dGVudCB3aWxsIG1ha2Ug
bmV3U2VsZWN0aW9uIGFsd2F5cyBkaXJlY3Rpb25hbAogICAgIGlmIChtX3NlbGVjdGlvbiA9PSBu
ZXdTZWxlY3Rpb24gfHwgIXNob3VsZENoYW5nZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKQogICAg
ICAgICByZXR1cm47CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rp
b24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9u
LmgJKHJldmlzaW9uIDk0OTg4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjMsNyArMjIzLDggQEAgcHVibGljOgogCiAgICAg
Ym9vbCBzaG91bGRDaGFuZ2VTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0
OwogICAgIGJvb2wgc2hvdWxkRGVsZXRlU2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24m
KSBjb25zdDsKLSAgICB2b2lkIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29u
c3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFudWxhcml0eSk7CisgICAgZW51bSBFbmRQb2lu
dHNBZGp1c3RtZW50TW9kZSB7IEFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5LCBEb05vdEFk
anN1dEVuZHBvaW50cyB9OworICAgIHZvaWQgc2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5l
ZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5LCBFbmRQb2ludHNB
ZGp1c3RtZW50TW9kZSA9IERvTm90QWRqc3V0RW5kcG9pbnRzKTsKICAgICB2b2lkIHNldEZvY3Vz
ZWROb2RlSWZOZWVkZWQoKTsKICAgICB2b2lkIG5vdGlmeVJlbmRlcmVyT2ZTZWxlY3Rpb25DaGFu
Z2UoRVVzZXJUcmlnZ2VyZWQpOwogCkBAIC0yODIsNiArMjgzLDcgQEAgcHJpdmF0ZToKICAgICBM
YXlvdXRVbml0IG1feFBvc0ZvclZlcnRpY2FsQXJyb3dOYXZpZ2F0aW9uOwogCiAgICAgVmlzaWJs
ZVNlbGVjdGlvbiBtX3NlbGVjdGlvbjsKKyAgICBWaXNpYmxlUG9zaXRpb24gbV9vcmlnaW5hbEJh
c2U7IC8vIFVzZWQgdG8gc3RvcmUgYmFzZSBiZWZvcmUgdGhlIGFkanVzdG1lbnQgYXQgYmlkaSBi
b3VuZGFyeQogICAgIFRleHRHcmFudWxhcml0eSBtX2dyYW51bGFyaXR5OwogCiAgICAgUmVmUHRy
PEVkaXRpbmdTdHlsZT4gbV90eXBpbmdTdHlsZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAkocmV2aXNpb24gOTQ5ODgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2
ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgogCiAjaW5jbHVkZSAiSW5s
aW5lQm94LmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgogI2luY2x1ZGUgIlBvc2l0aW9u
LmgiCiAjaW5jbHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgiCiAKQEAgLTY4LDYgKzY5LDggQEAgUmVu
ZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihjb25zdAogICAgIDogbV9yZW5kZXJlcigw
KQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX3ByZXZM
ZWFmQ2hpbGQodW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAsIG1fbmV4dExlYWZDaGlsZCh1bmNh
Y2hlZElubGluZUJveCgpKQogewogICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAg
cmV0dXJuOwpAQCAtODIsNiArODUsOCBAQCBSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0
aW9uKGNvbnN0CiAgICAgOiBtX3JlbmRlcmVyKDApCiAgICAgLCBtX2lubGluZUJveCgwKQogICAg
ICwgbV9vZmZzZXQoMCkKKyAgICAsIG1fcHJldkxlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgp
KQorICAgICwgbV9uZXh0TGVhZkNoaWxkKHVuY2FjaGVkSW5saW5lQm94KCkpCiB7CiAgICAgaWYg
KHBvc2l0aW9uLmlzTnVsbCgpKQogICAgICAgICByZXR1cm47CkBAIC05Miw2ICs5NywxMzMgQEAg
UmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihjb25zdAogICAgICAgICBtX3JlbmRl
cmVyID0gcmVuZGVyZXJGcm9tUG9zaXRpb24ocG9zaXRpb24pOwogfQogCitJbmxpbmVCb3gqIFJl
bmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQoKSBjb25zdAoreworICAgIGlmIChtX3ByZXZM
ZWFmQ2hpbGQgPT0gdW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAgICAgbV9wcmV2TGVhZkNoaWxk
ID0gbV9pbmxpbmVCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICByZXR1cm4gbV9wcmV2TGVhZkNo
aWxkOworfQorCitJbmxpbmVCb3gqIFJlbmRlcmVkUG9zaXRpb246Om5leHRMZWFmQ2hpbGQoKSBj
b25zdAoreworICAgIGlmIChtX25leHRMZWFmQ2hpbGQgPT0gdW5jYWNoZWRJbmxpbmVCb3goKSkK
KyAgICAgICAgbV9uZXh0TGVhZkNoaWxkID0gbV9pbmxpbmVCb3gtPm5leHRMZWFmQ2hpbGQoKTsK
KyAgICByZXR1cm4gbV9uZXh0TGVhZkNoaWxkOworfQorCitib29sIFJlbmRlcmVkUG9zaXRpb246
Om9wZXJhdG9yPT0oY29uc3QgUmVuZGVyZWRQb3NpdGlvbiYgb3RoZXIpIGNvbnN0Cit7CisgICAg
cmV0dXJuIChtX3JlbmRlcmVyID09IG90aGVyLm1fcmVuZGVyZXIgJiYgbV9pbmxpbmVCb3ggPT0g
b3RoZXIubV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQpCisgICAgICAg
IHx8IChhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSAmJiBvdGhlci5hdFJpZ2h0bW9zdE9mZnNldElu
Qm94KCkgJiYgcHJldkxlYWZDaGlsZCgpID09IG90aGVyLm1faW5saW5lQm94KQorICAgICAgICB8
fCAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpICYmIG90aGVyLmF0TGVmdG1vc3RPZmZzZXRJbkJv
eCgpICYmIG5leHRMZWFmQ2hpbGQoKSA9PSBvdGhlci5tX2lubGluZUJveCk7Cit9CisKK3Vuc2ln
bmVkIGNoYXIgUmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVsT25MZWZ0KCkgY29uc3QKK3sKKyAg
ICBJbmxpbmVCb3gqIGJveCA9IGF0TGVmdG1vc3RPZmZzZXRJbkJveCgpID8gcHJldkxlYWZDaGls
ZCgpIDogbV9pbmxpbmVCb3g7CisgICAgcmV0dXJuIGJveCA/IGJveC0+YmlkaUxldmVsKCkgOiAw
OworfQorCit1bnNpZ25lZCBjaGFyIFJlbmRlcmVkUG9zaXRpb246OmJpZGlMZXZlbE9uUmlnaHQo
KSBjb25zdAoreworICAgIElubGluZUJveCogYm94ID0gYXRSaWdodG1vc3RPZmZzZXRJbkJveCgp
ID8gbmV4dExlYWZDaGlsZCgpIDogbV9pbmxpbmVCb3g7CisgICAgcmV0dXJuIGJveCA/IGJveC0+
YmlkaUxldmVsKCkgOiAwOworfQorCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRlcmVkUG9zaXRpb246
OmxlZnRCb3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKQorewor
ICAgIGlmICghbV9pbmxpbmVCb3ggfHwgYmlkaUxldmVsT2ZSdW4gPiBtX2lubGluZUJveC0+Ymlk
aUxldmVsKCkpCisgICAgICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKCk7CisKKyAgICBJbmxp
bmVCb3gqIGJveCA9IG1faW5saW5lQm94OworICAgIGRvIHsKKyAgICAgICAgSW5saW5lQm94KiBw
cmV2ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghcHJldiB8fCBwcmV2LT5i
aWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKQorICAgICAgICAgICAgcmV0dXJuIFJlbmRlcmVk
UG9zaXRpb24oYm94LT5yZW5kZXJlcigpLCBib3gsIGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgp
KTsKKyAgICAgICAgYm94ID0gcHJldjsKKyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworUmVu
ZGVyZWRQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pCit7CisgICAgaWYgKCFtX2lubGluZUJveCB8fCBi
aWRpTGV2ZWxPZlJ1biA+IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgcmV0dXJu
IFJlbmRlcmVkUG9zaXRpb24oKTsKKworICAgIElubGluZUJveCogYm94ID0gbV9pbmxpbmVCb3g7
CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gqIG5leHQgPSBib3gtPm5leHRMZWFmQ2hpbGQo
KTsKKyAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQtPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZS
dW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbihib3gtPnJlbmRlcmVyKCks
IGJveCwgYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKTsKKyAgICAgICAgYm94ID0gbmV4dDsK
KyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0
dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworYm9vbCBSZW5kZXJlZFBvc2l0aW9uOjphdExl
ZnRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRjaEJpZGlMZXZlbCBzaG91bGRNYXRjaEJpZGlM
ZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3QKK3sKKyAgICBpZiAoIW1f
aW5saW5lQm94KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9m
ZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9y
ZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhcHJldkxlYWZDaGlsZCgpIHx8IHByZXZM
ZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJveC0+YmlkaUxldmVsKCk7CisgICAg
ICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZSdW4gJiYg
KCFwcmV2TGVhZkNoaWxkKCkgfHwgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJpZGlM
ZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpKSB7
CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZlbCA9PSBJZ25vcmVCaWRpTGV2ZWwpCisg
ICAgICAgICAgICByZXR1cm4gbmV4dExlYWZDaGlsZCgpICYmIG1faW5saW5lQm94LT5iaWRpTGV2
ZWwoKSA8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCk7CisgICAgICAgIHJldHVybiBuZXh0
TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4g
JiYgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1bjsKKyAgICB9
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdo
dEJvdW5kYXJ5T2ZCaWRpUnVuKFNob3VsZE1hdGNoQmlkaUxldmVsIHNob3VsZE1hdGNoQmlkaUxl
dmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdAoreworICAgIGlmICghbV9p
bmxpbmVCb3gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChhdFJpZ2h0bW9zdE9m
ZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9y
ZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhbmV4dExlYWZDaGlsZCgpIHx8IG5leHRM
ZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJveC0+YmlkaUxldmVsKCk7CisgICAg
ICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZSdW4gJiYg
KCFuZXh0TGVhZkNoaWxkKCkgfHwgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJpZGlM
ZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94KCkpIHsK
KyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9yZUJpZGlMZXZlbCkKKyAg
ICAgICAgICAgIHJldHVybiBwcmV2TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpIDwgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIHByZXZM
ZWFmQ2hpbGQoKSAmJiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1biAm
JiBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpID49IGJpZGlMZXZlbE9mUnVuOworICAgIH0K
KworICAgIHJldHVybiBmYWxzZTsKK30KKworUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6cG9z
aXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpIGNvbnN0Cit7CisgICAgQVNTRVJUKGF0TGVm
dEJvdW5kYXJ5T2ZCaWRpUnVuKCkpOworCisgICAgaWYgKGF0TGVmdG1vc3RPZmZzZXRJbkJveCgp
KQorICAgICAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG1fcmVuZGVyZXIt
Pm5vZGUoKSwgbV9vZmZzZXQpOworCisgICAgcmV0dXJuIGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3Np
dGlvbihuZXh0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCktPm5vZGUoKSwgbV9vZmZzZXQpOworfQor
CitQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9mQmlE
aVJ1bigpIGNvbnN0Cit7CisgICAgQVNTRVJUKGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpKTsK
KworICAgIGlmIChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkpCisgICAgICAgIHJldHVybiBjcmVh
dGVMZWdhY3lFZGl0aW5nUG9zaXRpb24obV9yZW5kZXJlci0+bm9kZSgpLCBtX29mZnNldCk7CisK
KyAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKHByZXZMZWFmQ2hpbGQoKS0+
cmVuZGVyZXIoKS0+bm9kZSgpLCBtX29mZnNldCk7Cit9CisKIExheW91dFJlY3QgUmVuZGVyZWRQ
b3NpdGlvbjo6YWJzb2x1dGVSZWN0KGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKSBjb25zdAog
ewogICAgIGlmIChpc051bGwoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVy
ZWRQb3NpdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVy
ZWRQb3NpdGlvbi5oCShyZXZpc2lvbiA5NDk4OCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
UmVuZGVyZWRQb3NpdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwyNSArNDYsNjYgQEAgcHVi
bGljOgogICAgIFJlbmRlcmVkUG9zaXRpb24oKTsKICAgICBleHBsaWNpdCBSZW5kZXJlZFBvc2l0
aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogICAgIGV4cGxpY2l0IFJlbmRlcmVkUG9zaXRp
b24oY29uc3QgUG9zaXRpb24mLCBFQWZmaW5pdHkpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBSZW5kZXJlZFBvc2l0aW9uJiBvdGhlcikgY29uc3Q7CiAKICAgICBib29sIGlzTnVsbCgpIGNv
bnN0IHsgcmV0dXJuICFtX3JlbmRlcmVyOyB9CiAgICAgUm9vdElubGluZUJveCogcm9vdEJveCgp
IHsgcmV0dXJuIG1faW5saW5lQm94ID8gbV9pbmxpbmVCb3gtPnJvb3QoKSA6IDA7IH0KIAorICAg
IHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT25MZWZ0KCkgY29uc3Q7CisgICAgdW5zaWduZWQgY2hh
ciBiaWRpTGV2ZWxPblJpZ2h0KCkgY29uc3Q7CisgICAgUmVuZGVyZWRQb3NpdGlvbiBsZWZ0Qm91
bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bik7CisgICAgUmVuZGVy
ZWRQb3NpdGlvbiByaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVs
T2ZSdW4pOworCisgICAgZW51bSBTaG91bGRNYXRjaEJpZGlMZXZlbCB7IE1hdGNoQmlkaUxldmVs
LCBJZ25vcmVCaWRpTGV2ZWwgfTsKKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCkg
Y29uc3QgeyByZXR1cm4gYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oSWdub3JlQmlkaUxldmVsLCAw
KTsgfQorICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCkgY29uc3QgeyByZXR1cm4g
YXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKElnbm9yZUJpZGlMZXZlbCwgMCk7IH0KKyAgICAvLyBU
aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVu
dCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBiaWRpIHJ1bgorICAgIC8vIG9mIHRoZSBz
cGVjaWZpZWQgYmlkaSBlbWJlZGRpbmcgbGV2ZWwuCisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9m
QmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdCB7IHJldHVybiBhdExl
ZnRCb3VuZGFyeU9mQmlkaVJ1bihNYXRjaEJpZGlMZXZlbCwgYmlkaUxldmVsT2ZSdW4pOyB9Cisg
ICAgYm9vbCBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxP
ZlJ1bikgY29uc3QgeyByZXR1cm4gYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKE1hdGNoQmlkaUxl
dmVsLCBiaWRpTGV2ZWxPZlJ1bik7IH0KKworICAgIFBvc2l0aW9uIHBvc2l0aW9uQXRMZWZ0Qm91
bmRhcnlPZkJpRGlSdW4oKSBjb25zdDsKKyAgICBQb3NpdGlvbiBwb3NpdGlvbkF0UmlnaHRCb3Vu
ZGFyeU9mQmlEaVJ1bigpIGNvbnN0OworCiAgICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoKSBj
b25zdCB7IHJldHVybiBhYnNvbHV0ZVJlY3QoMCk7IH0KICAgICBMYXlvdXRSZWN0IGFic29sdXRl
UmVjdChpbnQmIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVS
ZWN0KCZleHRyYVdpZHRoVG9FbmRPZkxpbmUpOyB9CiAKIHByaXZhdGU6CisgICAgZXhwbGljaXQg
UmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmplY3QqLCBJbmxpbmVCb3gqLCBpbnQgb2Zmc2V0KTsK
KworICAgIElubGluZUJveCogcHJldkxlYWZDaGlsZCgpIGNvbnN0OworICAgIElubGluZUJveCog
bmV4dExlYWZDaGlsZCgpIGNvbnN0OworICAgIGJvb2wgYXRMZWZ0bW9zdE9mZnNldEluQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNh
cmV0TGVmdG1vc3RPZmZzZXQoKTsgfQorICAgIGJvb2wgYXRSaWdodG1vc3RPZmZzZXRJbkJveCgp
IGNvbnN0IHsgcmV0dXJuIG1faW5saW5lQm94ICYmIG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5j
YXJldFJpZ2h0bW9zdE9mZnNldCgpOyB9CisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9mQmlkaVJ1
bihTaG91bGRNYXRjaEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29u
c3Q7CisgICAgYm9vbCBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2
ZWwsIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0OworCiAgICAgTGF5b3V0UmVj
dCBhYnNvbHV0ZVJlY3QoaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0OwogCiAgICAg
UmVuZGVyT2JqZWN0KiBtX3JlbmRlcmVyOwogICAgIElubGluZUJveCogbV9pbmxpbmVCb3g7CiAg
ICAgaW50IG1fb2Zmc2V0OworCisgICAgc3RhdGljIElubGluZUJveCogY29uc3QgdW5jYWNoZWRJ
bmxpbmVCb3goKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PElubGluZUJveCo+KDEpOyB9Cisg
ICAgbXV0YWJsZSBJbmxpbmVCb3gqIG1fcHJldkxlYWZDaGlsZDsKKyAgICBtdXRhYmxlIElubGlu
ZUJveCogbV9uZXh0TGVhZkNoaWxkOwogfTsKIAogaW5saW5lIFJlbmRlcmVkUG9zaXRpb246OlJl
bmRlcmVkUG9zaXRpb24oKQogICAgIDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3go
MCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX3ByZXZMZWFmQ2hpbGQodW5jYWNoZWRJbmxp
bmVCb3goKSkKKyAgICAsIG1fbmV4dExlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQorewor
fQorCitpbmxpbmUgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyLCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCkKKyAgICA6IG1fcmVuZGVy
ZXIocmVuZGVyZXIpCisgICAgLCBtX2lubGluZUJveChib3gpCisgICAgLCBtX29mZnNldChvZmZz
ZXQpCisgICAgLCBtX3ByZXZMZWFmQ2hpbGQodW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAsIG1f
bmV4dExlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQogewogfQogCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkocmV2aXNpb24gOTQ5ODgpCisrKyBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkod29ya2luZyBjb3B5KQpA
QCAtNjksNiArNjksOCBAQCBwdWJsaWM6CiAgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2li
bGVTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX3N0YXJ0LCBpc1Jhbmdl
KCkgPyBET1dOU1RSRUFNIDogYWZmaW5pdHkoKSk7IH0KICAgICBWaXNpYmxlUG9zaXRpb24gdmlz
aWJsZUVuZCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2VuZCwgaXNSYW5nZSgp
ID8gVVBTVFJFQU0gOiBhZmZpbml0eSgpKTsgfQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxl
QmFzZSgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2Jhc2UsIGlzUmFuZ2UoKSA/
IChpc0Jhc2VGaXJzdCgpID8gVVBTVFJFQU0gOiBET1dOU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9
CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVFeHRlbnQoKSBjb25zdCB7IHJldHVybiBWaXNp
YmxlUG9zaXRpb24obV9leHRlbnQsIGlzUmFuZ2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gRE9XTlNU
UkVBTSA6IFVQU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CiAKICAgICBib29sIGlzTm9uZSgpIGNv
bnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBOb1NlbGVjdGlvbjsgfQogICAgIGJvb2wg
aXNDYXJldCgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBDYXJldFNlbGVjdGlv
bjsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkocmV2aXNpb24gOTQ5
ODgpCisrKyBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTY5MCw3ICs2OTAsOCBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6dXBkYXRlU2VsZWN0aW9u
Rm9yTW91CiAgICAgaWYgKG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpICE9IENo
YXJhY3RlckdyYW51bGFyaXR5KQogICAgICAgICBuZXdTZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFu
dWxhcml0eShtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7CiAKLSAgICBtX2Zy
YW1lLT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdT
ZWxlY3Rpb24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpKTsKKyAgICBtX2Zy
YW1lLT5zZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdT
ZWxlY3Rpb24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpLAorICAgICAgICBG
cmFtZVNlbGVjdGlvbjo6QWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkpOwogfQogI2VuZGlm
IC8vIEVOQUJMRShEUkFHX1NVUFBPUlQpCiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0OTg4KQorKysg
TGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIw
MTEtMDktMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVH
UkVTU0lPTihyNzQ5NzEpOiBTZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURp
IFRleHQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3
MzQwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBl
ZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAg
ICAgICAgKiBlZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRtbDogQWRkZWQuCisK
IDIwMTEtMDktMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAg
UkVHUkVTU0lPTjogTW92aW5nIHVwIGRvZXNuJ3Qgd29yayBpbiBzb21lIGNhc2VzCkluZGV4OiBM
YXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRp
LXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3Nl
bGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDEyMiBAQAorVGhpcyB0ZXN0IGVuc3VyZXMgV2ViS2l0IGxldHMgdXNlciBzZWxlY3QgYmlk
aXJlY3Rpb25hbCB0ZXh0IGludHVpdGl2ZWx5LiBUbyBtYW51YWxseSB0ZXN0LCBzZWxlY3QgdGV4
dCBpbiBibHVlIGJveCBpbiBlYWNoIHRlc3QgY2FzZSBiZWxvdyBieSBhIG1vdXNlIGRyYWcgZnJv
bSBsZWZ0IHRvIHJpZ2h0LiBUaGUgY2hhbmdlcyBpbiB0aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQg
bWF0Y2ggdGhlIGV4cGVjdGF0aW9ucyBiZWZvcmUgfC4gRG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBk
cmFnIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgZXhwZWN0YXRpb25zIGFyZSBhZnRlciB8LgorCitU
ZXN0ICJhYmNBQkMiIGluICJhYmNBQkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAor
UEFTUyBzZWxlY3RlZCAiYSIKK1BBU1Mgc2VsZWN0ZWQgImFiIgorUEFTUyBzZWxlY3RlZCAiYWJj
IgorUEFTUyBzZWxlY3RlZCAiYWJjQUIiCitQQVNTIHNlbGVjdGVkICJhYmNBIgorUEFTUyBzZWxl
Y3RlZCAiYWJjQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3Rl
ZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxl
Y3RlZCAiY0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJD
IgorCitUZXN0ICJBQkNkZWYiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byBy
aWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3Rl
ZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiQUJDZCIKK0ZBSUwgc2VsZWN0ZWQgIkFCQ2RlIiBidXQg
ZXhwZWN0ZWQgIkFCQ2VmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorU2VsZWN0aW5nIGZyb20g
cmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorUEFT
UyBzZWxlY3RlZCAiZGVmIgorUEFTUyBzZWxlY3RlZCAiQkNkZWYiCitQQVNTIHNlbGVjdGVkICJD
ZGVmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorCitUZXN0ICJBQkMiIGluICJhYmNBQkNkZWYi
OgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mg
c2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQg
dG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxl
Y3RlZCAiQUJDIgorCitUZXN0ICJBQkMiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVm
dCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBz
ZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3Rl
ZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJl
ZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVj
dGVkICJlIgorUEFTUyBzZWxlY3RlZCAiZWYiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0
CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAiZWYiCisKK1Rlc3QgIkFCIiBpbiAi
YWJjQUJDIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkIi
CitQQVNTIHNlbGVjdGVkICJBQiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mg
c2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKKworVGVzdCAiMTIiIGluICJhWE0xMkpO
ZCI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICIxIgorUEFT
UyBzZWxlY3RlZCAiMTIiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVj
dGVkICIyIgorUEFTUyBzZWxlY3RlZCAiMTIiCisKK1Rlc3QgIkFCQyAxMjMiIGluICJBQkMgMTIz
IjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIjEiCitQQVNT
IHNlbGVjdGVkICIxMiIKK1BBU1Mgc2VsZWN0ZWQgIjEyMyIKK1BBU1Mgc2VsZWN0ZWQgIiAxMjMi
CitQQVNTIHNlbGVjdGVkICJDIDEyMyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIDEyMyIKK1BBU1Mgc2Vs
ZWN0ZWQgIkFCQyAxMjMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVj
dGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitQQVNTIHNl
bGVjdGVkICJBQkMgIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEyIgorUEFTUyBzZWxlY3RlZCAiQUJD
IDEiCitQQVNTIHNlbGVjdGVkICJBQkMgMTIzIgorCitUZXN0ICJBQkMgMTIzIiBpbiAiQUJDIDEy
MyI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICIxIgorUEFT
UyBzZWxlY3RlZCAiMTIiCitGQUlMIHNlbGVjdGVkICIxMjMiIGJ1dCBleHBlY3RlZCAiIDEyMyIK
K0ZBSUwgc2VsZWN0ZWQgIiAiIGJ1dCBleHBlY3RlZCAiQyAxMjMiCitGQUlMIHNlbGVjdGVkICJD
ICIgYnV0IGV4cGVjdGVkICJCQyAxMjMiCitGQUlMIHNlbGVjdGVkICJCQyAiIGJ1dCBleHBlY3Rl
ZCAiQUJDIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIjEyMyIgYnV0IGV4cGVjdGVkICJ1bmRlZmluZWQi
CitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJBIgorUEFTUyBz
ZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitGQUlMIHNlbGVjdGVkICIiIGJ1dCBl
eHBlY3RlZCAiQUJDICIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxMiIKK1BBU1Mgc2VsZWN0ZWQgIkFC
QyAxIgorRkFJTCBzZWxlY3RlZCAiMTIzIiBidXQgZXhwZWN0ZWQgIkFCQyAxMjMiCisKK1BBU1Mg
c3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCisKKworCisKSW5k
ZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5odG1sCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1
bi5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2Vs
ZWN0LWJpZGktcnVuLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQxIEBACis8IURPQ1RZ
UEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUi
IGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8bGluayByZWw9InN0eWxlc2hl
ZXQiIGhyZWY9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxz
Y3JpcHQgc3JjPSIuLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3Jp
cHQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorI3Rlc3RzIHsgZm9udC1zaXplOiAyLjVlbTsg
cGFkZGluZzogMHB4OyBtYXJnaW46IDBweDsgfQorZHQgeyB3aWR0aDogMTVleDsgcGFkZGluZzog
MHB4IDEwcHg7IG1hcmdpbjogMHB4OyB9CitkZCB7IGZvbnQtc2l6ZTogMC42ZW07IG1hcmdpbjog
MHB4OyBwYWRkaW5nOiAwcHggMTBweDsgfQorLnRhcmdldCB7IGJhY2tncm91bmQtY29sb3I6ICNi
YmVlZmY7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoaXMgdGVzdCBlbnN1cmVz
IFdlYktpdCBsZXRzIHVzZXIgc2VsZWN0IGJpZGlyZWN0aW9uYWwgdGV4dCBpbnR1aXRpdmVseS4K
K1RvIG1hbnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGluIGJsdWUgYm94IGluIGVhY2ggdGVzdCBj
YXNlIGJlbG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxlZnQgdG8gcmlnaHQuCitUaGUgY2hhbmdl
cyBpbiB0aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGF0aW9ucyBiZWZv
cmUgfC4KK0RvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJhZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5k
IGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIgfC48L3A+Cis8ZGl2PlNlbGVjdGVkIHRleHQ6IDxzcGFu
IGlkPSJsb2ciPjwvc3Bhbj48L2Rpdj4KKzxkbCBpZD0idGVzdHMiPgorPGR0IGNvbnRlbnRlZGl0
YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij5hYmPXkNeR15I8L3NwYW4+PC9kdD4KKzxkZD5hLGFi
LGFiYyxhYmNBQixhYmNBLGFiY0FCQ3xBLEFCLEFCQyxjQUJDLGJjQUJDLGFiY0FCQzwvZGQ+CisK
KzxkdCBjb250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeSZGVmPC9zcGFu
PjwvZHQ+Cis8ZGQ+QyxCQyxBQkMsQUJDZCxBQkNlZixBQkNkZWZ8ZixlZixkZWYsQkNkZWYsQ2Rl
ZixBQkNkZWY8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlPmFiYzxzcGFuIGNsYXNzPSJ0YXJn
ZXQiPteQ15HXkjwvc3Bhbj5kZWY8L2R0PgorPGRkPkMsQkMsQUJDfEEsQUIsQUJDPC9kZD4KKwor
PGR0IGRpcj0icnRsIiBjb250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeS
PC9zcGFuPmRlZjwvZHQ+Cis8ZGQ+QyxCQyxBQkN8QSxBQixBQkM8L2RkPgorCis8ZHQgZGlyPSJy
dGwiPteQ15HXkmQ8c3BhbiBjbGFzcz0idGFyZ2V0Ij5lZjwvc3Bhbj48L2R0PgorPGRkPmUsZWZ8
ZixlZjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+
15DXkTwvc3Bhbj7XkjwvZHQ+Cis8ZGQ+QixBQnxBLEFCPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0
YWJsZT5h16fXnDxzcGFuIGNsYXNzPSJ0YXJnZXQiPjEyPC9zcGFuPteZ151kPC9kdD4KKzxkZD4x
LDEyfDIsMTI8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIj48c3BhbiBjbGFz
cz0idGFyZ2V0Ij7XkNeR15IgMTIzPC9zcGFuPjwvZHQ+Cis8ZGQ+MSwxMiwxMjMsIDEyMyxDIDEy
MyxCQyAxMjMsQUJDIDEyM3xBLEFCLEFCQyxBQkMgLEFCQyAxMixBQkMgMSxBQkMgMTIzPC9kZD4K
KworPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzPC9z
cGFuPjwvZHQ+Cis8ZGQ+MSwxMiwgMTIzLEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFC
QyAsQUJDIDEyLEFCQyAxLEFCQyAxMjM8L2RkPgorCis8IS0tPGR0IGNvbnRlbnRlZGl0YWJsZT48
c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzIC0gNDU2PC9zcGFuPjwvZHQ+Cis8ZGQ+MSwx
MiwgMTIzLEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFC
QyAxMjM8L2RkPi0tPgorCis8L2RsPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cis8cHJlPjxz
Y3JpcHQ+Cit2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKTsKKwor
U3RyaW5nLnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKCkgeworICAgIHZhciByZXN1bHQgPSAn
JzsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAg
dmFyIGNvZGUgPSB0aGlzLmNoYXJDb2RlQXQoaSk7CisgICAgICAgIGlmICgweDA1ZDAgPD0gY29k
ZSAmJiBjb2RlIDw9IDB4MDVlYSkvLyBIZWJyZXcgQWxlZgorICAgICAgICAgICAgY29kZSArPSAt
MHgwNWQwICsgJ0EnLmNoYXJDb2RlQXQoMCk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJv
bUNoYXJDb2RlKGNvZGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitmdW5jdGlv
biBhc3NlcnRFcXVhbChleHBlY3RlZCwgYWN0dWFsKSB7CisgICAgZG9jdW1lbnQud3JpdGVsbign
RTonICsgZXhwZWN0ZWQgKyAnIEE6JyArIGFjdHVhbCk7Cit9CisKK2Z1bmN0aW9uIHNlbGVjdEJ5
TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgbGVmdFRvUmlnaHQsIGV4cGVjdGF0aW9u
cykgeworICAgIHZhciB5ID0gdGFyZ2V0Lm9mZnNldFRvcCArIHRhcmdldC5vZmZzZXRIZWlnaHQg
LyAyOworICAgIHZhciBsZWZ0ID0gdGFyZ2V0Lm9mZnNldExlZnQ7CisKKyAgICB2YXIgc3RhcnRY
ID0gbGVmdCArIChsZWZ0VG9SaWdodCA/IDAgOiB0YXJnZXQub2Zmc2V0V2lkdGgpOworICAgIGV2
ZW50U2VuZGVyLmRyYWdNb2RlID0gZmFsc2U7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQo
MzAwMCk7CisgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oc3RhcnRYLCB5KTsKKyAgICBldmVu
dFNlbmRlci5tb3VzZURvd24oKTsKKworICAgIHZhciBwcmV2aW91c1NlbGVjdGVkVGV4dCA9ICcn
OworICAgIHZhciBqID0gMDsKKyAgICB2YXIgeEluY3JlbWVudCA9IGxlZnRUb1JpZ2h0ID8gMSA6
IC0xOworICAgIGZvciAodmFyIHggPSBzdGFydFg7IGxlZnQgPD0geCAmJiB4IDw9IGxlZnQgKyB0
YXJnZXQub2Zmc2V0V2lkdGg7IHggKz0geEluY3JlbWVudCkgeworICAgICAgICBldmVudFNlbmRl
ci5sZWFwRm9yd2FyZCgxMDApOworICAgICAgICBldmVudFNlbmRlci5tb3VzZU1vdmVUbyh4LCB5
KTsKKworICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gd2luZG93LmdldFNlbGVjdGlvbigpLnRv
U3RyaW5nKCkuZm9sZCgpOworICAgICAgICBpZiAocHJldmlvdXNTZWxlY3RlZFRleHQgIT0gc2Vs
ZWN0ZWRUZXh0KSB7CisgICAgICAgICAgICBpZiAoZXhwZWN0YXRpb25zW2pdID09IHNlbGVjdGVk
VGV4dCkKKyAgICAgICAgICAgICAgICB0ZXN0UGFzc2VkKCdzZWxlY3RlZCAiJyArIHNlbGVjdGVk
VGV4dCArICciJyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVzdEZhaWxl
ZCgnc2VsZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAnIiBidXQgZXhwZWN0ZWQgIicgKyBleHBl
Y3RhdGlvbnNbal0gKyAnIicpOworICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRleHQgPSBz
ZWxlY3RlZFRleHQ7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBl
dmVudFNlbmRlci5tb3VzZVVwKCk7Cit9CisKK2lmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xs
ZXIpIHsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisKKyAgICB2YXIg
dGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKS5nZXRFbGVtZW50c0J5VGFn
TmFtZSgnZHQnKTsKKyAgICB2YXIgdGVzdEV4cGVjdGF0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1l
bnRCeUlkKCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkZCcpOworCisgICAgZm9yICh2
YXIgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykgeyAgICAgICAgCisgICAgICAgIHRlc3Rz
W2ldLnN0eWxlLmRpc3BsYXkgPSBudWxsOworICAgICAgICB0ZXN0RXhwZWN0YXRpb25zW2ldLnN0
eWxlLmRpc3BsYXkgPSBudWxsOworCisgICAgICAgIHZhciB0YXJnZXQgPSB0ZXN0c1tpXS5nZXRF
bGVtZW50c0J5Q2xhc3NOYW1lKCd0YXJnZXQnKVswXTsKKyAgICAgICAgdmFyIHRlc3RFeHBlY3Rh
dGlvbiA9IHRlc3RFeHBlY3RhdGlvbnNbaV0udGV4dENvbnRlbnQ7CisKKyAgICAgICAgZGVidWco
J1Rlc3QgIicgKyB0YXJnZXQudGV4dENvbnRlbnQuZm9sZCgpICsgJyIgaW4gIicgKyB0YXJnZXQu
cGFyZW50Tm9kZS50ZXh0Q29udGVudC5mb2xkKCkgKyAnIjonKTsKKyAgICAgICAgZGVidWcoJ1Nl
bGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQnKTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdB
bmRWZXJpZnlSZXN1bHQodGFyZ2V0LCB0cnVlLCB0ZXN0RXhwZWN0YXRpb24uc3BsaXQoL1x8Lylb
MF0uc3BsaXQoLywvKSk7CisgICAgICAgIGRlYnVnKCdTZWxlY3RpbmcgZnJvbSByaWdodCB0byBs
ZWZ0Jyk7CisgICAgICAgIHNlbGVjdEJ5TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwg
ZmFsc2UsIHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwvKVsxXS5zcGxpdCgvLC8pKTsKKyAgICAg
ICAgZGVidWcoJycpOworCisgICAgICAgIC8vIFNvbWUgdGVzdHMgbWF5IGJlIG91c2lkZSBvZiB0
aGUgd2luZG93IHNvIGJyaW5nIHRoZW0gaW4gYXMgd2UgcHJvY2Vzcy4KKyAgICAgICAgdGVzdHNb
aV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICAgICAgdGVzdEV4cGVjdGF0aW9uc1tpXS5z
dHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgIH0KKworICAgIGRvY3VtZW50LmdldEVsZW1lbnRC
eUlkKCd0ZXN0cycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgZG9jdW1lbnQuZ2V0RWxl
bWVudEJ5SWQoJ2xvZycpLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKK30gZWxz
ZSB7CisgICAgZGVidWcoJ1RoaXMgdGVzdCByZXF1aXJlcyBldmVudFNlbmRlcicpOworICAgIGRv
Y3VtZW50Lm9uc2VsZWN0aW9uY2hhbmdlID0gZnVuY3Rpb24gKCkgeworICAgICAgICBkb2N1bWVu
dC5nZXRFbGVtZW50QnlJZCgnbG9nJykudGV4dENvbnRlbnQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9u
KCkudG9TdHJpbmcoKS5mb2xkKCk7CisgICAgfQorfQorCit2YXIgc3VjY2Vzc2Z1bGx5UGFyc2Vk
ID0gdHJ1ZTsKKworPC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vZmFzdC9qcy9yZXNvdXJj
ZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>107118</attachid>
            <date>2011-09-12 18:02:54 -0700</date>
            <delta_ts>2011-09-21 13:22:36 -0700</delta_ts>
            <desc>Fixed qt build</desc>
            <filename>bug-57340-20110912180253.patch</filename>
            <type>text/plain</type>
            <size>30651</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0OTg4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDktMTIgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVHUkVTU0lPTihyNzQ5NzEpOiBT
ZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURpIFRleHQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRzIHRoZSBl
bmQgcG9pbnQgYWRqdXN0bWVudCBtZWNoYW5pc20gYXQgYmlkaSBib3VuZGFyaWVzIHNpbWlsYXIg
dG8gdGhlIG9uZSBOU1RleHRWaWV3IGltcGxlbWVudHMuCisKKyAgICAgICAgVG8gdW5kZXJzdGFu
ZCB0aGUgcHJvYmxlbSwgc3VwcG9zZSB3ZSBoYXZlIHN0cm9uZyBSVEwgbGV0dGVycyAiQUJDIiBp
biBhIExUUiBibG9jayAodmlzdWFsbHkgbGFpZCBvdXQgYXMgQ0JBKS4KKworICAgICAgICBQZXIg
TlNUZXh0VmlldyBjb252ZW50aW9uLCBsb2dpY2FsIG9mZnNldHMgYmV0d2VlbiBlYWNoIGxldHRl
ciBpcyBwbGFjZWQgYXMgKDApQygyKUIoMSlBKDMpLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAg
cGxhY2luZyB0aGUgY2FyZXQgdmlzdWFsbHkgb24gdGhlIGxlZnQgb2YgQ0JBIHlpZWxkcyB0aGUg
cG9zaXRpb24gaW5zaWRlIHRoZSB0ZXh0IG5vZGUgb2YgIkFCQyIgYXQgb2Zmc2V0IDAuCisgICAg
ICAgIExpa2V3aXNlLCBwbGFjaW5nIGl0IGJldHdlZW4gQyBhbmQgQiB5aWVsZHMgKCJBQkMiLCAy
KSwgYW5kIHBsYWNpbmcgaXQgb24gdGhlIHJpZ2h0IG9mIENCQSB5aWVsZHMgKCJBQkMiLCAzKS4K
KworICAgICAgICBOb3cgc3VwcG9zZSBhIHVzZXIgYXR0ZW1wdHMgdG8gc2VsZWN0IHRoZSBsZXR0
ZXIgQSBieSBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQ0JBIHRvIGEgcG9pbnQgYmV0
d2VlbgorICAgICAgICBCIGFuZCBBLiBGaXJzdCwgdGhlIGluaXRpYWwgbW91c2UgZG93biBwbGFj
ZXMgdGhlIHNlbGVjdGlvbidzIGJhc2UgYXQgKCJBQkMiLCAzKS4gVGhlbiBhcyB0aGUgbW91c2Ug
cG9pbnRlcgorICAgICAgICBtb3ZlcyB0byBhIHBvaW50IG9uIHRoZSBsZWZ0IG9mIEEsIHRoZSBz
ZWxlY3Rpb24ncyBleHRlbnQgaXMgc2V0IGF0ICgiQUJDIiwgMSksIHNlbGVjdGluZyAiQkMiLgor
CisgICAgICAgIFRvIG1pdGlnYXRlIHRoaXMgaXNzdWUsIE5TVGV4dFZpZXcgYWRqdXN0cyBzZWxl
Y3Rpb24gYmFzZSBhbmQgZXh0ZW50IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gSW4gdGhlIGFi
b3ZlCisgICAgICAgIGV4YW1wbGUsIE5TVGV4dFZpZXcgZGV0ZWN0cyB1c2VyJ3MgaW50ZW50IGFu
ZCBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24ncyBiYXNlIHRvICgiQUJDIiwgMCkgdGVtcG9yYXJpbHku
CisKKyAgICAgICAgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgc2ltaWxhciB0cmljayBvbiBXZWJL
aXQuIFdlIGFkanVzdCB0aGUgYmFzZSBvciB0aGUgZXh0ZW50IHdoZW4gdGhleSdyZSBhdCB0aGUg
bGVmdAorICAgICAgICBlbmQgb3IgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0
aGUgb3RoZXIgZW5kIGlzIGluc2lkZSBvZiB0aGUgcnVuLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwg
dGhlCisgICAgICAgIGJhc2UgcG9zaXRpb24gb24gdGhlIHJpZ2h0IG9mIEEgaXMgdGhlIHJpZ2h0
IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0aGUgZXh0ZW50IHBvc2l0aW9uIGJldHdlZW4gQiBhbmQg
QSBpcworICAgICAgICBpbnNpZGUgdGhlIHNhbWUgcnVuIChDQkEpLCBzbyB3ZSB3b3VsZCBhZGp1
c3QgdGhlIGJhc2UgdG8gYmUgKCJBQkMiLCAwKSBhcyBOU1RleHRWaWV3IGRvZXMuCisKKyAgICAg
ICAgVGFrZSBhbm90aGVyIGV4YW1wbGUgYWJjQUJDLiBOb3RlIG9mZnNldHMgYXJlIGFzc2lnbmVk
IGFzICgwKWEoMSliKDIpYygzKUMoNSlCKDQpQSg2KSBXaGVuIHRoZSB1c2VyIHN0YXJ0cworICAg
ICAgICBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQSB0byBhIHBvaW50IGJldHdlZW4g
QiBhbmQgQSwgd2UgYWRqdXN0IHRoZSBzZWxlY3Rpb24gYmFzZSB0byBiZSAoImFiY0FCQyIsIDMp
CisgICAgICAgIGJlY2F1c2UgdGhlIGJhc2UgaXMgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkg
cnVuIGFuZCB0aGUgZXh0ZW50IGlzIGluIHRoZSBzYW1lIHJ1bi4gV2Uga2VlcCB0aGUgYWRqdXN0
bWVudAorICAgICAgICB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIG1vdmVzIHRvIGEgcG9pbnQgYmV0
d2VlbiBDIGFuZCBCLiBIb3dldmVyLCB3aGVuIHRoZSBtb3VzZXIgcG9pbnRlciByZWFjaGVzIGEg
cG9pbnQKKyAgICAgICAgYmV0d2VlbiBsZXR0ZXJzIGIgYW5kIGMsIHRoZSBzZWxlY3Rpb24gZXh0
ZW50IGlzIHBsYWNlZCBhdCAoImFiY0FCQyIsIDIpLiBCZWNhdXNlIHRoZSBleHRlbnQgaXMgb3V0
c2lkZSBvZgorICAgICAgICB0aGUgYmlkaSBydW4gc3RhcnRlZCBmcm9tIHRoZSBzZWxlY3Rpb24g
YmFzZSwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZSBhdCB0aGlzIHBvaW50LiBIYWQgd2Ug
bm90IGRvbmUgdGhpcywKKyAgICAgICAgd2UnbGwgZW5kIHVwIHNlbGVjdGluZyBqdXN0ICJjIi4K
KworICAgICAgICBXaGlsZSB0aGlzIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBpbiBGcmFtZVNl
bGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZCwgdGhpcyBwYXRjaCBh
ZGRzCisgICAgICAgIHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB0byBSZW5kZXJlZFBvc2l0aW9u
IHRvIGZhY2lsaXRhdGUgYWJzdHJhY3Rpb24gYXJvdW5kIGlubGluZSBib3hlcyBhbmQgYmlkaSBy
dW5zLgorCisgICAgICAgIFRlc3Q6IGVkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5o
dG1sCisKKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KTogQWRkZWQuIEltcGxlbWVudHMg
dGhlIGVuZHBvaW50cyBhZGp1c3RtZW50IGFsZ29yaXRobS4KKyAgICAgICAgKFdlYkNvcmU6OkZy
YW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKTogQ2FsbHMg
YWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnksIGFuZAorICAgICAgICByZXN0b3JlcyB0aGUg
b3JpZ2luYWwgYmFzZSBhcyBuZWVkZWQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5oOgorICAgICAgICAqIGVkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQpOiBBZGRlZCB0byBjYWNoZSBw
cmV2TGVhZkNoaWxkIG9mIHRoZSBjdXJyZW50IGlubGluZSBib3guCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJlZFBvc2l0aW9uOjpuZXh0TGVhZkNoaWxkKTogRGl0dG8gZm9yIG5leHRMZWFmQ2hp
bGQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpvcGVyYXRvcj09KTogQ29t
cGFyZXMgdHdvIFJlbmRlcmVkUG9zaXRpb25zIGNvbnNpZGVyaW5nIG5laWdoYm9yaW5nIGlubGlu
ZSBib3hlcworICAgICAgICBzbyB0aGF0IHRoZSByaWdodG1vc3QgcG9zaXRpb24gaW4gYSBib3gg
YW5kIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiBpbiB0aGUgZm9sbG93aW5nIGJveCBpcyBjb25zaWRl
cmVkIGVxdWFsLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVs
T25MZWZ0KTogQWRkZWQuIFJldHVybnMgdGhlIGJpZGkgbGV2ZWwgb2YgdGhlIHJ1biBvbiB0aGUg
bGVmdC4gV2UgY2FuJ3QKKyAgICAgICAgYWRkIGEgZ2VuZXJpYyBiaWRpTGV2ZWwgdG8gdGhpcyBj
bGFzcyBiZWNhdXNlIGl0J2xsIGJlIGFtYmlndW91cyBhdCBiaWRpIGJvdW5kYXJpZXMuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpiaWRpTGV2ZWxPblJpZ2h0KTogRGl0dG8g
Zm9yIHRoZSBydW4gb24gdGhlIHJpZ2h0LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3Np
dGlvbjo6bGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bik6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodEJvdW5kYXJ5
T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpw
b3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKTogUmV0dXJucyBQb3NpdGlvbiBhdCB0aGUg
bGVmdCBlZGdlIG9mIGEgYmlkaSBydW4KKyAgICAgICAgaWYgUmVuZGVyZWRQb3NpdGlvbiBpcyBh
dCBzdWNoIGEgcG9zaXRpb24uIEFzc2VydHMgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bik6IERpdHRvIGZvciB0aGUgcmlnaHQgZWRnZS4KKyAgICAgICAgKiBlZGl0aW5nL1Jl
bmRlcmVkUG9zaXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0
TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJl
ZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4pOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0TGVmdG1vc3RPZmZzZXRJbkJveCk6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodG1vc3RPZmZzZXRJbkJv
eCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6dW5jYWNoZWRJ
bmxpbmVCb3gpOiBBZGRlZC4gV2UgY2FuJ3QgdXNlIGEgc3RhdGljIGNvbnN0IHZhcmlhYmxlIGJl
Y2F1c2UgZ2NjIHRoaW5rcworICAgICAgICByZWludGVycHJldF9jYXN0PElubGluZUJveCo+KDEp
IGlzIG5vdCBhbiBpbnRlZ3JhbCB2YWx1ZS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9z
aXRpb246OlJlbmRlcmVkUG9zaXRpb24pOgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVNlbGVj
dGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbjo6dmlzaWJsZUJhc2Up
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb246OnZpc2libGVFeHRl
bnQpOiBBZGRlZC4KKyAgICAgICAgKiBwYWdlL0V2ZW50SGFuZGxlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpFdmVudEhhbmRsZXI6OnVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRHJhZyk6CisKIDIw
MTEtMDktMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUkVH
UkVTU0lPTjogTW92aW5nIHVwIGRvZXNuJ3Qgd29yayBpbiBzb21lIGNhc2VzCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gOTQ5ODgpCisr
KyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCiAjaW5jbHVkZSAi
UmVuZGVyVmlldy5oIgogI2luY2x1ZGUgIlJlbmRlcldpZGdldC5oIgorI2luY2x1ZGUgIlJlbmRl
cmVkUG9zaXRpb24uaCIKICNpbmNsdWRlICJTZWN1cmVUZXh0SW5wdXQuaCIKICNpbmNsdWRlICJT
ZXR0aW5ncy5oIgogI2luY2x1ZGUgIlNwYXRpYWxOYXZpZ2F0aW9uLmgiCkBAIC0xNjMsMTMgKzE2
NCw2OCBAQCB2b2lkIERyYWdDYXJldENvbnRyb2xsZXI6OnNldENhcmV0UG9zaXRpCiAgICAgICAg
IHVwZGF0ZUNhcmV0UmVjdChkb2N1bWVudCwgbV9wb3NpdGlvbik7CiB9CiAKLXZvaWQgRnJhbWVT
ZWxlY3Rpb246OnNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJs
ZVNlbGVjdGlvbiYgcGFzc2VkTmV3U2VsZWN0aW9uLCBUZXh0R3JhbnVsYXJpdHkgZ3JhbnVsYXJp
dHkpCitzdGF0aWMgdm9pZCBhZGp1c3RFbmRwb2ludHNBdEJpZGlCb3VuZGFyeShWaXNpYmxlUG9z
aXRpb24mIGJhc2UsIFZpc2libGVQb3NpdGlvbiYgZXh0ZW50KQoreworICAgIFJlbmRlcmVkUG9z
aXRpb24gYmFzZVBvc2l0aW9uKGJhc2UpOworICAgIFJlbmRlcmVkUG9zaXRpb24gZXh0ZW50UG9z
aXRpb24oZXh0ZW50KTsKKworICAgIGlmIChiYXNlUG9zaXRpb24uaXNOdWxsKCkgfHwgZXh0ZW50
UG9zaXRpb24uaXNOdWxsKCkgfHwgYmFzZVBvc2l0aW9uID09IGV4dGVudFBvc2l0aW9uKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoYmFzZVBvc2l0aW9uLmF0TGVmdEJvdW5kYXJ5T2ZCaWRp
UnVuKCkpIHsKKyAgICAgICAgaWYgKCFleHRlbnRQb3NpdGlvbi5hdFJpZ2h0Qm91bmRhcnlPZkJp
ZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkKKyAgICAgICAgICAgICYmIGJh
c2VQb3NpdGlvbiA9PSBleHRlbnRQb3NpdGlvbi5sZWZ0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBv
c2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlUG9z
aXRpb24ucG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYmFzZVBv
c2l0aW9uLmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpKSB7CisgICAgICAgIGlmICghZXh0ZW50
UG9zaXRpb24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9u
TGVmdCgpKQorICAgICAgICAgICAgJiYgYmFzZVBvc2l0aW9uID09IGV4dGVudFBvc2l0aW9uLnJp
Z2h0Qm91bmRhcnlPZkJpZGlSdW4oYmFzZVBvc2l0aW9uLmJpZGlMZXZlbE9uTGVmdCgpKSkgewor
ICAgICAgICAgICAgYmFzZSA9IGJhc2VQb3NpdGlvbi5wb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBpZiAoZXh0ZW50UG9zaXRpb24uYXRMZWZ0Qm91bmRhcnlPZkJpZGlS
dW4oKQorICAgICAgICAmJiBleHRlbnRQb3NpdGlvbiA9PSBiYXNlUG9zaXRpb24ubGVmdEJvdW5k
YXJ5T2ZCaWRpUnVuKGV4dGVudFBvc2l0aW9uLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAg
ICAgZXh0ZW50ID0gZXh0ZW50UG9zaXRpb24ucG9zaXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1
bigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV4dGVudFBvc2l0aW9uLmF0
UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpCisgICAgICAgICYmIGV4dGVudFBvc2l0aW9uID09IGJh
c2VQb3NpdGlvbi5yaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKGV4dGVudFBvc2l0aW9uLmJpZGlMZXZl
bE9uTGVmdCgpKSkgeworICAgICAgICBleHRlbnQgPSBleHRlbnRQb3NpdGlvbi5wb3NpdGlvbkF0
UmlnaHRCb3VuZGFyeU9mQmlEaVJ1bigpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCit2
b2lkIEZyYW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKGNv
bnN0IFZpc2libGVTZWxlY3Rpb24mIHBhc3NlZE5ld1NlbGVjdGlvbiwgVGV4dEdyYW51bGFyaXR5
IGdyYW51bGFyaXR5LAorICAgIEVuZFBvaW50c0FkanVzdG1lbnRNb2RlIGVuZHBvaW50c0FkanVz
dG1lbnRNb2RlKQogewogICAgIFZpc2libGVTZWxlY3Rpb24gbmV3U2VsZWN0aW9uID0gcGFzc2Vk
TmV3U2VsZWN0aW9uOworICAgIGJvb2wgaXNEaXJlY3Rpb25hbCA9IHNob3VsZEFsd2F5c1VzZURp
cmVjdGlvbmFsU2VsZWN0aW9uKG1fZnJhbWUpIHx8IG5ld1NlbGVjdGlvbi5pc0RpcmVjdGlvbmFs
KCk7CiAKLSAgICBpZiAoc2hvdWxkQWx3YXlzVXNlRGlyZWN0aW9uYWxTZWxlY3Rpb24obV9mcmFt
ZSkpCi0gICAgICAgIG5ld1NlbGVjdGlvbi5zZXRJc0RpcmVjdGlvbmFsKHRydWUpOworICAgIFZp
c2libGVQb3NpdGlvbiBiYXNlID0gbV9vcmlnaW5hbEJhc2UuaXNOb3ROdWxsKCkgPyBtX29yaWdp
bmFsQmFzZSA6IG5ld1NlbGVjdGlvbi52aXNpYmxlQmFzZSgpOworICAgIFZpc2libGVQb3NpdGlv
biBuZXdCYXNlID0gYmFzZTsKKyAgICBWaXNpYmxlUG9zaXRpb24gbmV3RXh0ZW50ID0gbmV3U2Vs
ZWN0aW9uLnZpc2libGVFeHRlbnQoKTsKKyAgICBpZiAoZW5kcG9pbnRzQWRqdXN0bWVudE1vZGUg
PT0gQWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkpCisgICAgICAgIGFkanVzdEVuZHBvaW50
c0F0QmlkaUJvdW5kYXJ5KG5ld0Jhc2UsIG5ld0V4dGVudCk7CisKKyAgICBpZiAobmV3QmFzZSAh
PSBiYXNlIHx8IG5ld0V4dGVudCAhPSBuZXdTZWxlY3Rpb24udmlzaWJsZUV4dGVudCgpKSB7Cisg
ICAgICAgIG1fb3JpZ2luYWxCYXNlID0gYmFzZTsKKyAgICAgICAgbmV3U2VsZWN0aW9uLnNldEJh
c2UobmV3QmFzZSk7CisgICAgICAgIG5ld1NlbGVjdGlvbi5zZXRFeHRlbnQobmV3RXh0ZW50KTsK
KyAgICB9IGVsc2UgaWYgKG1fb3JpZ2luYWxCYXNlLmlzTm90TnVsbCgpKSB7CisgICAgICAgIGlm
IChtX3NlbGVjdGlvbi5iYXNlKCkgPT0gbmV3U2VsZWN0aW9uLmJhc2UoKSkKKyAgICAgICAgICAg
IG5ld1NlbGVjdGlvbi5zZXRCYXNlKG1fb3JpZ2luYWxCYXNlKTsKKyAgICAgICAgbV9vcmlnaW5h
bEJhc2UuY2xlYXIoKTsKKyAgICB9CiAKKyAgICBuZXdTZWxlY3Rpb24uc2V0SXNEaXJlY3Rpb25h
bChpc0RpcmVjdGlvbmFsKTsgLy8gQWRqdXN0aW5nIGJhc2UgYW5kIGV4dGVudCB3aWxsIG1ha2Ug
bmV3U2VsZWN0aW9uIGFsd2F5cyBkaXJlY3Rpb25hbAogICAgIGlmIChtX3NlbGVjdGlvbiA9PSBu
ZXdTZWxlY3Rpb24gfHwgIXNob3VsZENoYW5nZVNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKQogICAg
ICAgICByZXR1cm47CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rp
b24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0ZyYW1lU2VsZWN0aW9u
LmgJKHJldmlzaW9uIDk0OTg4KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjMsNyArMjIzLDggQEAgcHVibGljOgogCiAgICAg
Ym9vbCBzaG91bGRDaGFuZ2VTZWxlY3Rpb24oY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYpIGNvbnN0
OwogICAgIGJvb2wgc2hvdWxkRGVsZXRlU2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rpb24m
KSBjb25zdDsKLSAgICB2b2lkIHNldE5vbkRpcmVjdGlvbmFsU2VsZWN0aW9uSWZOZWVkZWQoY29u
c3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFudWxhcml0eSk7CisgICAgZW51bSBFbmRQb2lu
dHNBZGp1c3RtZW50TW9kZSB7IEFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5LCBEb05vdEFk
anN1dEVuZHBvaW50cyB9OworICAgIHZvaWQgc2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5l
ZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiwgVGV4dEdyYW51bGFyaXR5LCBFbmRQb2ludHNB
ZGp1c3RtZW50TW9kZSA9IERvTm90QWRqc3V0RW5kcG9pbnRzKTsKICAgICB2b2lkIHNldEZvY3Vz
ZWROb2RlSWZOZWVkZWQoKTsKICAgICB2b2lkIG5vdGlmeVJlbmRlcmVyT2ZTZWxlY3Rpb25DaGFu
Z2UoRVVzZXJUcmlnZ2VyZWQpOwogCkBAIC0yODIsNiArMjgzLDcgQEAgcHJpdmF0ZToKICAgICBM
YXlvdXRVbml0IG1feFBvc0ZvclZlcnRpY2FsQXJyb3dOYXZpZ2F0aW9uOwogCiAgICAgVmlzaWJs
ZVNlbGVjdGlvbiBtX3NlbGVjdGlvbjsKKyAgICBWaXNpYmxlUG9zaXRpb24gbV9vcmlnaW5hbEJh
c2U7IC8vIFVzZWQgdG8gc3RvcmUgYmFzZSBiZWZvcmUgdGhlIGFkanVzdG1lbnQgYXQgYmlkaSBi
b3VuZGFyeQogICAgIFRleHRHcmFudWxhcml0eSBtX2dyYW51bGFyaXR5OwogCiAgICAgUmVmUHRy
PEVkaXRpbmdTdHlsZT4gbV90eXBpbmdTdHlsZTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRp
bmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAkocmV2aXNpb24gOTQ5ODgpCisrKyBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2
ICszMiw3IEBACiAjaW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgogCiAjaW5jbHVkZSAiSW5s
aW5lQm94LmgiCisjaW5jbHVkZSAiSW5saW5lVGV4dEJveC5oIgogI2luY2x1ZGUgIlBvc2l0aW9u
LmgiCiAjaW5jbHVkZSAiVmlzaWJsZVBvc2l0aW9uLmgiCiAKQEAgLTY4LDYgKzY5LDggQEAgUmVu
ZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihjb25zdAogICAgIDogbV9yZW5kZXJlcigw
KQogICAgICwgbV9pbmxpbmVCb3goMCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX3ByZXZM
ZWFmQ2hpbGQodW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAsIG1fbmV4dExlYWZDaGlsZCh1bmNh
Y2hlZElubGluZUJveCgpKQogewogICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAg
cmV0dXJuOwpAQCAtODIsNiArODUsOCBAQCBSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0
aW9uKGNvbnN0CiAgICAgOiBtX3JlbmRlcmVyKDApCiAgICAgLCBtX2lubGluZUJveCgwKQogICAg
ICwgbV9vZmZzZXQoMCkKKyAgICAsIG1fcHJldkxlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgp
KQorICAgICwgbV9uZXh0TGVhZkNoaWxkKHVuY2FjaGVkSW5saW5lQm94KCkpCiB7CiAgICAgaWYg
KHBvc2l0aW9uLmlzTnVsbCgpKQogICAgICAgICByZXR1cm47CkBAIC05Miw2ICs5NywxMzMgQEAg
UmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihjb25zdAogICAgICAgICBtX3JlbmRl
cmVyID0gcmVuZGVyZXJGcm9tUG9zaXRpb24ocG9zaXRpb24pOwogfQogCitJbmxpbmVCb3gqIFJl
bmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQoKSBjb25zdAoreworICAgIGlmIChtX3ByZXZM
ZWFmQ2hpbGQgPT0gdW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAgICAgbV9wcmV2TGVhZkNoaWxk
ID0gbV9pbmxpbmVCb3gtPnByZXZMZWFmQ2hpbGQoKTsKKyAgICByZXR1cm4gbV9wcmV2TGVhZkNo
aWxkOworfQorCitJbmxpbmVCb3gqIFJlbmRlcmVkUG9zaXRpb246Om5leHRMZWFmQ2hpbGQoKSBj
b25zdAoreworICAgIGlmIChtX25leHRMZWFmQ2hpbGQgPT0gdW5jYWNoZWRJbmxpbmVCb3goKSkK
KyAgICAgICAgbV9uZXh0TGVhZkNoaWxkID0gbV9pbmxpbmVCb3gtPm5leHRMZWFmQ2hpbGQoKTsK
KyAgICByZXR1cm4gbV9uZXh0TGVhZkNoaWxkOworfQorCitib29sIFJlbmRlcmVkUG9zaXRpb246
Om9wZXJhdG9yPT0oY29uc3QgUmVuZGVyZWRQb3NpdGlvbiYgb3RoZXIpIGNvbnN0Cit7CisgICAg
cmV0dXJuIChtX3JlbmRlcmVyID09IG90aGVyLm1fcmVuZGVyZXIgJiYgbV9pbmxpbmVCb3ggPT0g
b3RoZXIubV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gb3RoZXIubV9vZmZzZXQpCisgICAgICAg
IHx8IChhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSAmJiBvdGhlci5hdFJpZ2h0bW9zdE9mZnNldElu
Qm94KCkgJiYgcHJldkxlYWZDaGlsZCgpID09IG90aGVyLm1faW5saW5lQm94KQorICAgICAgICB8
fCAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpICYmIG90aGVyLmF0TGVmdG1vc3RPZmZzZXRJbkJv
eCgpICYmIG5leHRMZWFmQ2hpbGQoKSA9PSBvdGhlci5tX2lubGluZUJveCk7Cit9CisKK3Vuc2ln
bmVkIGNoYXIgUmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVsT25MZWZ0KCkgY29uc3QKK3sKKyAg
ICBJbmxpbmVCb3gqIGJveCA9IGF0TGVmdG1vc3RPZmZzZXRJbkJveCgpID8gcHJldkxlYWZDaGls
ZCgpIDogbV9pbmxpbmVCb3g7CisgICAgcmV0dXJuIGJveCA/IGJveC0+YmlkaUxldmVsKCkgOiAw
OworfQorCit1bnNpZ25lZCBjaGFyIFJlbmRlcmVkUG9zaXRpb246OmJpZGlMZXZlbE9uUmlnaHQo
KSBjb25zdAoreworICAgIElubGluZUJveCogYm94ID0gYXRSaWdodG1vc3RPZmZzZXRJbkJveCgp
ID8gbmV4dExlYWZDaGlsZCgpIDogbV9pbmxpbmVCb3g7CisgICAgcmV0dXJuIGJveCA/IGJveC0+
YmlkaUxldmVsKCkgOiAwOworfQorCitSZW5kZXJlZFBvc2l0aW9uIFJlbmRlcmVkUG9zaXRpb246
OmxlZnRCb3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKQorewor
ICAgIGlmICghbV9pbmxpbmVCb3ggfHwgYmlkaUxldmVsT2ZSdW4gPiBtX2lubGluZUJveC0+Ymlk
aUxldmVsKCkpCisgICAgICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKCk7CisKKyAgICBJbmxp
bmVCb3gqIGJveCA9IG1faW5saW5lQm94OworICAgIGRvIHsKKyAgICAgICAgSW5saW5lQm94KiBw
cmV2ID0gYm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghcHJldiB8fCBwcmV2LT5i
aWRpTGV2ZWwoKSA8IGJpZGlMZXZlbE9mUnVuKQorICAgICAgICAgICAgcmV0dXJuIFJlbmRlcmVk
UG9zaXRpb24oYm94LT5yZW5kZXJlcigpLCBib3gsIGJveC0+Y2FyZXRMZWZ0bW9zdE9mZnNldCgp
KTsKKyAgICAgICAgYm94ID0gcHJldjsKKyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworUmVu
ZGVyZWRQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pCit7CisgICAgaWYgKCFtX2lubGluZUJveCB8fCBi
aWRpTGV2ZWxPZlJ1biA+IG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSkKKyAgICAgICAgcmV0dXJu
IFJlbmRlcmVkUG9zaXRpb24oKTsKKworICAgIElubGluZUJveCogYm94ID0gbV9pbmxpbmVCb3g7
CisgICAgZG8geworICAgICAgICBJbmxpbmVCb3gqIG5leHQgPSBib3gtPm5leHRMZWFmQ2hpbGQo
KTsKKyAgICAgICAgaWYgKCFuZXh0IHx8IG5leHQtPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZS
dW4pCisgICAgICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbihib3gtPnJlbmRlcmVyKCks
IGJveCwgYm94LT5jYXJldFJpZ2h0bW9zdE9mZnNldCgpKTsKKyAgICAgICAgYm94ID0gbmV4dDsK
KyAgICB9IHdoaWxlIChib3gpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0
dXJuIFJlbmRlcmVkUG9zaXRpb24oKTsKK30KKworYm9vbCBSZW5kZXJlZFBvc2l0aW9uOjphdExl
ZnRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRjaEJpZGlMZXZlbCBzaG91bGRNYXRjaEJpZGlM
ZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3QKK3sKKyAgICBpZiAoIW1f
aW5saW5lQm94KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9m
ZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9y
ZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhcHJldkxlYWZDaGlsZCgpIHx8IHByZXZM
ZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJveC0+YmlkaUxldmVsKCk7CisgICAg
ICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZSdW4gJiYg
KCFwcmV2TGVhZkNoaWxkKCkgfHwgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJpZGlM
ZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpKSB7
CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZlbCA9PSBJZ25vcmVCaWRpTGV2ZWwpCisg
ICAgICAgICAgICByZXR1cm4gbmV4dExlYWZDaGlsZCgpICYmIG1faW5saW5lQm94LT5iaWRpTGV2
ZWwoKSA8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCk7CisgICAgICAgIHJldHVybiBuZXh0
TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpIDwgYmlkaUxldmVsT2ZSdW4g
JiYgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1bjsKKyAgICB9
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdo
dEJvdW5kYXJ5T2ZCaWRpUnVuKFNob3VsZE1hdGNoQmlkaUxldmVsIHNob3VsZE1hdGNoQmlkaUxl
dmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdAoreworICAgIGlmICghbV9p
bmxpbmVCb3gpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChhdFJpZ2h0bW9zdE9m
ZnNldEluQm94KCkpIHsKKyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9y
ZUJpZGlMZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAhbmV4dExlYWZDaGlsZCgpIHx8IG5leHRM
ZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPCBtX2lubGluZUJveC0+YmlkaUxldmVsKCk7CisgICAg
ICAgIHJldHVybiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZSdW4gJiYg
KCFuZXh0TGVhZkNoaWxkKCkgfHwgbmV4dExlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA8IGJpZGlM
ZXZlbE9mUnVuKTsKKyAgICB9CisKKyAgICBpZiAoYXRMZWZ0bW9zdE9mZnNldEluQm94KCkpIHsK
KyAgICAgICAgaWYgKHNob3VsZE1hdGNoQmlkaUxldmVsID09IElnbm9yZUJpZGlMZXZlbCkKKyAg
ICAgICAgICAgIHJldHVybiBwcmV2TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpIDwgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKTsKKyAgICAgICAgcmV0dXJuIHByZXZM
ZWFmQ2hpbGQoKSAmJiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1biAm
JiBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpID49IGJpZGlMZXZlbE9mUnVuOworICAgIH0K
KworICAgIHJldHVybiBmYWxzZTsKK30KKworUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6cG9z
aXRpb25BdExlZnRCb3VuZGFyeU9mQmlEaVJ1bigpIGNvbnN0Cit7CisgICAgQVNTRVJUKGF0TGVm
dEJvdW5kYXJ5T2ZCaWRpUnVuKCkpOworCisgICAgaWYgKGF0TGVmdG1vc3RPZmZzZXRJbkJveCgp
KQorICAgICAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG1fcmVuZGVyZXIt
Pm5vZGUoKSwgbV9vZmZzZXQpOworCisgICAgcmV0dXJuIGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3Np
dGlvbihuZXh0TGVhZkNoaWxkKCktPnJlbmRlcmVyKCktPm5vZGUoKSwgbV9vZmZzZXQpOworfQor
CitQb3NpdGlvbiBSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9mQmlE
aVJ1bigpIGNvbnN0Cit7CisgICAgQVNTRVJUKGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpKTsK
KworICAgIGlmIChhdFJpZ2h0bW9zdE9mZnNldEluQm94KCkpCisgICAgICAgIHJldHVybiBjcmVh
dGVMZWdhY3lFZGl0aW5nUG9zaXRpb24obV9yZW5kZXJlci0+bm9kZSgpLCBtX29mZnNldCk7CisK
KyAgICByZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKHByZXZMZWFmQ2hpbGQoKS0+
cmVuZGVyZXIoKS0+bm9kZSgpLCBtX29mZnNldCk7Cit9CisKIExheW91dFJlY3QgUmVuZGVyZWRQ
b3NpdGlvbjo6YWJzb2x1dGVSZWN0KGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKSBjb25zdAog
ewogICAgIGlmIChpc051bGwoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVy
ZWRQb3NpdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVuZGVy
ZWRQb3NpdGlvbi5oCShyZXZpc2lvbiA5NDk4OCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
UmVuZGVyZWRQb3NpdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00NiwyNSArNDYsNjYgQEAgcHVi
bGljOgogICAgIFJlbmRlcmVkUG9zaXRpb24oKTsKICAgICBleHBsaWNpdCBSZW5kZXJlZFBvc2l0
aW9uKGNvbnN0IFZpc2libGVQb3NpdGlvbiYpOwogICAgIGV4cGxpY2l0IFJlbmRlcmVkUG9zaXRp
b24oY29uc3QgUG9zaXRpb24mLCBFQWZmaW5pdHkpOworICAgIGJvb2wgb3BlcmF0b3I9PShjb25z
dCBSZW5kZXJlZFBvc2l0aW9uJiBvdGhlcikgY29uc3Q7CiAKICAgICBib29sIGlzTnVsbCgpIGNv
bnN0IHsgcmV0dXJuICFtX3JlbmRlcmVyOyB9CiAgICAgUm9vdElubGluZUJveCogcm9vdEJveCgp
IHsgcmV0dXJuIG1faW5saW5lQm94ID8gbV9pbmxpbmVCb3gtPnJvb3QoKSA6IDA7IH0KIAorICAg
IHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT25MZWZ0KCkgY29uc3Q7CisgICAgdW5zaWduZWQgY2hh
ciBiaWRpTGV2ZWxPblJpZ2h0KCkgY29uc3Q7CisgICAgUmVuZGVyZWRQb3NpdGlvbiBsZWZ0Qm91
bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bik7CisgICAgUmVuZGVy
ZWRQb3NpdGlvbiByaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVs
T2ZSdW4pOworCisgICAgZW51bSBTaG91bGRNYXRjaEJpZGlMZXZlbCB7IE1hdGNoQmlkaUxldmVs
LCBJZ25vcmVCaWRpTGV2ZWwgfTsKKyAgICBib29sIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKCkg
Y29uc3QgeyByZXR1cm4gYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oSWdub3JlQmlkaUxldmVsLCAw
KTsgfQorICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKCkgY29uc3QgeyByZXR1cm4g
YXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKElnbm9yZUJpZGlMZXZlbCwgMCk7IH0KKyAgICAvLyBU
aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgcmV0dXJuIHRydWUgb25seSBpZiB0aGUgY3VycmVu
dCBwb3NpdGlvbiBpcyBhdCB0aGUgZW5kIG9mIHRoZSBiaWRpIHJ1bgorICAgIC8vIG9mIHRoZSBz
cGVjaWZpZWQgYmlkaSBlbWJlZGRpbmcgbGV2ZWwuCisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9m
QmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdCB7IHJldHVybiBhdExl
ZnRCb3VuZGFyeU9mQmlkaVJ1bihNYXRjaEJpZGlMZXZlbCwgYmlkaUxldmVsT2ZSdW4pOyB9Cisg
ICAgYm9vbCBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxP
ZlJ1bikgY29uc3QgeyByZXR1cm4gYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKE1hdGNoQmlkaUxl
dmVsLCBiaWRpTGV2ZWxPZlJ1bik7IH0KKworICAgIFBvc2l0aW9uIHBvc2l0aW9uQXRMZWZ0Qm91
bmRhcnlPZkJpRGlSdW4oKSBjb25zdDsKKyAgICBQb3NpdGlvbiBwb3NpdGlvbkF0UmlnaHRCb3Vu
ZGFyeU9mQmlEaVJ1bigpIGNvbnN0OworCiAgICAgTGF5b3V0UmVjdCBhYnNvbHV0ZVJlY3QoKSBj
b25zdCB7IHJldHVybiBhYnNvbHV0ZVJlY3QoMCk7IH0KICAgICBMYXlvdXRSZWN0IGFic29sdXRl
UmVjdChpbnQmIGV4dHJhV2lkdGhUb0VuZE9mTGluZSkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVS
ZWN0KCZleHRyYVdpZHRoVG9FbmRPZkxpbmUpOyB9CiAKIHByaXZhdGU6CisgICAgZXhwbGljaXQg
UmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmplY3QqLCBJbmxpbmVCb3gqLCBpbnQgb2Zmc2V0KTsK
KworICAgIElubGluZUJveCogcHJldkxlYWZDaGlsZCgpIGNvbnN0OworICAgIElubGluZUJveCog
bmV4dExlYWZDaGlsZCgpIGNvbnN0OworICAgIGJvb2wgYXRMZWZ0bW9zdE9mZnNldEluQm94KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmxpbmVCb3ggJiYgbV9vZmZzZXQgPT0gbV9pbmxpbmVCb3gtPmNh
cmV0TGVmdG1vc3RPZmZzZXQoKTsgfQorICAgIGJvb2wgYXRSaWdodG1vc3RPZmZzZXRJbkJveCgp
IGNvbnN0IHsgcmV0dXJuIG1faW5saW5lQm94ICYmIG1fb2Zmc2V0ID09IG1faW5saW5lQm94LT5j
YXJldFJpZ2h0bW9zdE9mZnNldCgpOyB9CisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9mQmlkaVJ1
bihTaG91bGRNYXRjaEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29u
c3Q7CisgICAgYm9vbCBhdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2
ZWwsIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0OworCiAgICAgTGF5b3V0UmVj
dCBhYnNvbHV0ZVJlY3QoaW50KiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0OwogCiAgICAg
UmVuZGVyT2JqZWN0KiBtX3JlbmRlcmVyOwogICAgIElubGluZUJveCogbV9pbmxpbmVCb3g7CiAg
ICAgaW50IG1fb2Zmc2V0OworCisgICAgc3RhdGljIElubGluZUJveCogdW5jYWNoZWRJbmxpbmVC
b3goKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PElubGluZUJveCo+KDEpOyB9CisgICAgbXV0
YWJsZSBJbmxpbmVCb3gqIG1fcHJldkxlYWZDaGlsZDsKKyAgICBtdXRhYmxlIElubGluZUJveCog
bV9uZXh0TGVhZkNoaWxkOwogfTsKIAogaW5saW5lIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVk
UG9zaXRpb24oKQogICAgIDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVCb3goMCkKICAg
ICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX3ByZXZMZWFmQ2hpbGQodW5jYWNoZWRJbmxpbmVCb3go
KSkKKyAgICAsIG1fbmV4dExlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQoreworfQorCitp
bmxpbmUgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbihSZW5kZXJPYmplY3QqIHJl
bmRlcmVyLCBJbmxpbmVCb3gqIGJveCwgaW50IG9mZnNldCkKKyAgICA6IG1fcmVuZGVyZXIocmVu
ZGVyZXIpCisgICAgLCBtX2lubGluZUJveChib3gpCisgICAgLCBtX29mZnNldChvZmZzZXQpCisg
ICAgLCBtX3ByZXZMZWFmQ2hpbGQodW5jYWNoZWRJbmxpbmVCb3goKSkKKyAgICAsIG1fbmV4dExl
YWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQogewogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkocmV2aXNpb24gOTQ5ODgpCisrKyBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL1Zpc2libGVTZWxlY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNjks
NiArNjksOCBAQCBwdWJsaWM6CiAgICAgCiAgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFy
dCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX3N0YXJ0LCBpc1JhbmdlKCkgPyBE
T1dOU1RSRUFNIDogYWZmaW5pdHkoKSk7IH0KICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVu
ZCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2VuZCwgaXNSYW5nZSgpID8gVVBT
VFJFQU0gOiBhZmZpbml0eSgpKTsgfQorICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlQmFzZSgp
IGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2Jhc2UsIGlzUmFuZ2UoKSA/IChpc0Jh
c2VGaXJzdCgpID8gVVBTVFJFQU0gOiBET1dOU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CisgICAg
VmlzaWJsZVBvc2l0aW9uIHZpc2libGVFeHRlbnQoKSBjb25zdCB7IHJldHVybiBWaXNpYmxlUG9z
aXRpb24obV9leHRlbnQsIGlzUmFuZ2UoKSA/IChpc0Jhc2VGaXJzdCgpID8gRE9XTlNUUkVBTSA6
IFVQU1RSRUFNKSA6IGFmZmluaXR5KCkpOyB9CiAKICAgICBib29sIGlzTm9uZSgpIGNvbnN0IHsg
cmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBOb1NlbGVjdGlvbjsgfQogICAgIGJvb2wgaXNDYXJl
dCgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGlvblR5cGUoKSA9PSBDYXJldFNlbGVjdGlvbjsgfQpJ
bmRleDogU291cmNlL1dlYkNvcmUvcGFnZS9FdmVudEhhbmRsZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL3BhZ2UvRXZlbnRIYW5kbGVyLmNwcAkocmV2aXNpb24gOTQ5ODgpCisr
KyBTb3VyY2UvV2ViQ29yZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTY5MCw3ICs2OTAsOCBAQCB2b2lkIEV2ZW50SGFuZGxlcjo6dXBkYXRlU2VsZWN0aW9uRm9yTW91
CiAgICAgaWYgKG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpICE9IENoYXJhY3Rl
ckdyYW51bGFyaXR5KQogICAgICAgICBuZXdTZWxlY3Rpb24uZXhwYW5kVXNpbmdHcmFudWxhcml0
eShtX2ZyYW1lLT5zZWxlY3Rpb24oKS0+Z3JhbnVsYXJpdHkoKSk7CiAKLSAgICBtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rp
b24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpKTsKKyAgICBtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS0+c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZChuZXdTZWxlY3Rp
b24sIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5ncmFudWxhcml0eSgpLAorICAgICAgICBGcmFtZVNl
bGVjdGlvbjo6QWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnkpOwogfQogI2VuZGlmIC8vIEVO
QUJMRShEUkFHX1NVUFBPUlQpCiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDk0OTg4KQorKysgTGF5b3V0
VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTEtMDkt
MTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVHUkVTU0lP
TihyNzQ5NzEpOiBTZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURpIFRleHQK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzQwCisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBlZGl0aW5n
L3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAg
KiBlZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4uaHRtbDogQWRkZWQuCisKIDIwMTEt
MDktMTIgIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUkVHUkVT
U0lPTjogTW92aW5nIHVwIGRvZXNuJ3Qgd29yayBpbiBzb21lIGNhc2VzCkluZGV4OiBMYXlvdXRU
ZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0Cj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1l
eHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlv
bi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEy
MiBAQAorVGhpcyB0ZXN0IGVuc3VyZXMgV2ViS2l0IGxldHMgdXNlciBzZWxlY3QgYmlkaXJlY3Rp
b25hbCB0ZXh0IGludHVpdGl2ZWx5LiBUbyBtYW51YWxseSB0ZXN0LCBzZWxlY3QgdGV4dCBpbiBi
bHVlIGJveCBpbiBlYWNoIHRlc3QgY2FzZSBiZWxvdyBieSBhIG1vdXNlIGRyYWcgZnJvbSBsZWZ0
IHRvIHJpZ2h0LiBUaGUgY2hhbmdlcyBpbiB0aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0Y2gg
dGhlIGV4cGVjdGF0aW9ucyBiZWZvcmUgfC4gRG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBkcmFnIGZy
b20gcmlnaHQgdG8gbGVmdCBhbmQgZXhwZWN0YXRpb25zIGFyZSBhZnRlciB8LgorCitUZXN0ICJh
YmNBQkMiIGluICJhYmNBQkMiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBz
ZWxlY3RlZCAiYSIKK1BBU1Mgc2VsZWN0ZWQgImFiIgorUEFTUyBzZWxlY3RlZCAiYWJjIgorUEFT
UyBzZWxlY3RlZCAiYWJjQUIiCitQQVNTIHNlbGVjdGVkICJhYmNBIgorUEFTUyBzZWxlY3RlZCAi
YWJjQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIK
K1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAi
Y0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImJjQUJDIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorCitU
ZXN0ICJBQkNkZWYiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAor
UEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJD
IgorUEFTUyBzZWxlY3RlZCAiQUJDZCIKK0ZBSUwgc2VsZWN0ZWQgIkFCQ2RlIiBidXQgZXhwZWN0
ZWQgIkFCQ2VmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorU2VsZWN0aW5nIGZyb20gcmlnaHQg
dG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiZiIKK1BBU1Mgc2VsZWN0ZWQgImVmIgorUEFTUyBzZWxl
Y3RlZCAiZGVmIgorUEFTUyBzZWxlY3RlZCAiQkNkZWYiCitQQVNTIHNlbGVjdGVkICJDZGVmIgor
UEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorCitUZXN0ICJBQkMiIGluICJhYmNBQkNkZWYiOgorU2Vs
ZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0
ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVm
dAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAi
QUJDIgorCitUZXN0ICJBQkMiIGluICJBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byBy
aWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3Rl
ZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIK
K1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJlZiIgaW4g
IkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJl
IgorUEFTUyBzZWxlY3RlZCAiZWYiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNT
IHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3RlZCAiZWYiCisKK1Rlc3QgIkFCIiBpbiAiYWJjQUJD
IjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkIiCitQQVNT
IHNlbGVjdGVkICJBQiIKK1NlbGVjdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0
ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIKKworVGVzdCAiMTIiIGluICJhWE0xMkpOZCI6CitT
ZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICIxIgorUEFTUyBzZWxl
Y3RlZCAiMTIiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICIy
IgorUEFTUyBzZWxlY3RlZCAiMTIiCisKK1Rlc3QgIkFCQyAxMjMiIGluICJBQkMgMTIzIjoKK1Nl
bGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIjEiCitQQVNTIHNlbGVj
dGVkICIxMiIKK1BBU1Mgc2VsZWN0ZWQgIjEyMyIKK1BBU1Mgc2VsZWN0ZWQgIiAxMjMiCitQQVNT
IHNlbGVjdGVkICJDIDEyMyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIDEyMyIKK1BBU1Mgc2VsZWN0ZWQg
IkFCQyAxMjMiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJB
IgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitQQVNTIHNlbGVjdGVk
ICJBQkMgIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEyIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEiCitQ
QVNTIHNlbGVjdGVkICJBQkMgMTIzIgorCitUZXN0ICJBQkMgMTIzIiBpbiAiQUJDIDEyMyI6CitT
ZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICIxIgorUEFTUyBzZWxl
Y3RlZCAiMTIiCitGQUlMIHNlbGVjdGVkICIxMjMiIGJ1dCBleHBlY3RlZCAiIDEyMyIKK0ZBSUwg
c2VsZWN0ZWQgIiAiIGJ1dCBleHBlY3RlZCAiQyAxMjMiCitGQUlMIHNlbGVjdGVkICJDICIgYnV0
IGV4cGVjdGVkICJCQyAxMjMiCitGQUlMIHNlbGVjdGVkICJCQyAiIGJ1dCBleHBlY3RlZCAiQUJD
IDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIjEyMyIgYnV0IGV4cGVjdGVkICJ1bmRlZmluZWQiCitTZWxl
Y3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3Rl
ZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMiCitGQUlMIHNlbGVjdGVkICIiIGJ1dCBleHBlY3Rl
ZCAiQUJDICIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxMiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxIgor
RkFJTCBzZWxlY3RlZCAiMTIzIiBidXQgZXhwZWN0ZWQgIkFCQyAxMjMiCisKK1BBU1Mgc3VjY2Vz
c2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCisKKworCisKSW5kZXg6IExh
eW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5odG1s
CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJp
ZGktcnVuLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTQxIEBACis8IURPQ1RZUEUgaHRt
bD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRl
bnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhy
ZWY9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQg
c3JjPSIuLi8uLi9mYXN0L2pzL3Jlc291cmNlcy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8
c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorI3Rlc3RzIHsgZm9udC1zaXplOiAyLjVlbTsgcGFkZGlu
ZzogMHB4OyBtYXJnaW46IDBweDsgfQorZHQgeyB3aWR0aDogMTVleDsgcGFkZGluZzogMHB4IDEw
cHg7IG1hcmdpbjogMHB4OyB9CitkZCB7IGZvbnQtc2l6ZTogMC42ZW07IG1hcmdpbjogMHB4OyBw
YWRkaW5nOiAwcHggMTBweDsgfQorLnRhcmdldCB7IGJhY2tncm91bmQtY29sb3I6ICNiYmVlZmY7
IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoaXMgdGVzdCBlbnN1cmVzIFdlYktp
dCBsZXRzIHVzZXIgc2VsZWN0IGJpZGlyZWN0aW9uYWwgdGV4dCBpbnR1aXRpdmVseS4KK1RvIG1h
bnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGluIGJsdWUgYm94IGluIGVhY2ggdGVzdCBjYXNlIGJl
bG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxlZnQgdG8gcmlnaHQuCitUaGUgY2hhbmdlcyBpbiB0
aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGF0aW9ucyBiZWZvcmUgfC4K
K0RvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJhZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5kIGV4cGVj
dGF0aW9ucyBhcmUgYWZ0ZXIgfC48L3A+Cis8ZGl2PlNlbGVjdGVkIHRleHQ6IDxzcGFuIGlkPSJs
b2ciPjwvc3Bhbj48L2Rpdj4KKzxkbCBpZD0idGVzdHMiPgorPGR0IGNvbnRlbnRlZGl0YWJsZT48
c3BhbiBjbGFzcz0idGFyZ2V0Ij5hYmPXkNeR15I8L3NwYW4+PC9kdD4KKzxkZD5hLGFiLGFiYyxh
YmNBQixhYmNBLGFiY0FCQ3xBLEFCLEFCQyxjQUJDLGJjQUJDLGFiY0FCQzwvZGQ+CisKKzxkdCBj
b250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeSZGVmPC9zcGFuPjwvZHQ+
Cis8ZGQ+QyxCQyxBQkMsQUJDZCxBQkNlZixBQkNkZWZ8ZixlZixkZWYsQkNkZWYsQ2RlZixBQkNk
ZWY8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlPmFiYzxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ
15HXkjwvc3Bhbj5kZWY8L2R0PgorPGRkPkMsQkMsQUJDfEEsQUIsQUJDPC9kZD4KKworPGR0IGRp
cj0icnRsIiBjb250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9InRhcmdldCI+15DXkdeSPC9zcGFu
PmRlZjwvZHQ+Cis8ZGQ+QyxCQyxBQkN8QSxBQixBQkM8L2RkPgorCis8ZHQgZGlyPSJydGwiPteQ
15HXkmQ8c3BhbiBjbGFzcz0idGFyZ2V0Ij5lZjwvc3Bhbj48L2R0PgorPGRkPmUsZWZ8ZixlZjwv
ZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+15DXkTwv
c3Bhbj7XkjwvZHQ+Cis8ZGQ+QixBQnxBLEFCPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT5h
16fXnDxzcGFuIGNsYXNzPSJ0YXJnZXQiPjEyPC9zcGFuPteZ151kPC9kdD4KKzxkZD4xLDEyfDIs
MTI8L2RkPgorCis8ZHQgY29udGVudGVkaXRhYmxlIGRpcj0icnRsIj48c3BhbiBjbGFzcz0idGFy
Z2V0Ij7XkNeR15IgMTIzPC9zcGFuPjwvZHQ+Cis8ZGQ+MSwxMiwxMjMsIDEyMyxDIDEyMyxCQyAx
MjMsQUJDIDEyM3xBLEFCLEFCQyxBQkMgLEFCQyAxMixBQkMgMSxBQkMgMTIzPC9kZD4KKworPGR0
IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzPC9zcGFuPjwv
ZHQ+Cis8ZGQ+MSwxMiwgMTIzLEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJD
IDEyLEFCQyAxLEFCQyAxMjM8L2RkPgorCis8IS0tPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBj
bGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzIC0gNDU2PC9zcGFuPjwvZHQ+Cis8ZGQ+MSwxMiwgMTIz
LEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFCQyAxMjM8
L2RkPi0tPgorCis8L2RsPgorPGRpdiBpZD0iY29uc29sZSI+PC9kaXY+Cis8cHJlPjxzY3JpcHQ+
Cit2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKTsKKworU3RyaW5n
LnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24gKCkgeworICAgIHZhciByZXN1bHQgPSAnJzsKKyAg
ICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNv
ZGUgPSB0aGlzLmNoYXJDb2RlQXQoaSk7CisgICAgICAgIGlmICgweDA1ZDAgPD0gY29kZSAmJiBj
b2RlIDw9IDB4MDVlYSkvLyBIZWJyZXcgQWxlZgorICAgICAgICAgICAgY29kZSArPSAtMHgwNWQw
ICsgJ0EnLmNoYXJDb2RlQXQoMCk7CisgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJD
b2RlKGNvZGUpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitmdW5jdGlvbiBhc3Nl
cnRFcXVhbChleHBlY3RlZCwgYWN0dWFsKSB7CisgICAgZG9jdW1lbnQud3JpdGVsbignRTonICsg
ZXhwZWN0ZWQgKyAnIEE6JyArIGFjdHVhbCk7Cit9CisKK2Z1bmN0aW9uIHNlbGVjdEJ5TW91c2VE
cmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgbGVmdFRvUmlnaHQsIGV4cGVjdGF0aW9ucykgewor
ICAgIHZhciB5ID0gdGFyZ2V0Lm9mZnNldFRvcCArIHRhcmdldC5vZmZzZXRIZWlnaHQgLyAyOwor
ICAgIHZhciBsZWZ0ID0gdGFyZ2V0Lm9mZnNldExlZnQ7CisKKyAgICB2YXIgc3RhcnRYID0gbGVm
dCArIChsZWZ0VG9SaWdodCA/IDAgOiB0YXJnZXQub2Zmc2V0V2lkdGgpOworICAgIGV2ZW50U2Vu
ZGVyLmRyYWdNb2RlID0gZmFsc2U7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMzAwMCk7
CisgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oc3RhcnRYLCB5KTsKKyAgICBldmVudFNlbmRl
ci5tb3VzZURvd24oKTsKKworICAgIHZhciBwcmV2aW91c1NlbGVjdGVkVGV4dCA9ICcnOworICAg
IHZhciBqID0gMDsKKyAgICB2YXIgeEluY3JlbWVudCA9IGxlZnRUb1JpZ2h0ID8gMSA6IC0xOwor
ICAgIGZvciAodmFyIHggPSBzdGFydFg7IGxlZnQgPD0geCAmJiB4IDw9IGxlZnQgKyB0YXJnZXQu
b2Zmc2V0V2lkdGg7IHggKz0geEluY3JlbWVudCkgeworICAgICAgICBldmVudFNlbmRlci5sZWFw
Rm9yd2FyZCgxMDApOworICAgICAgICBldmVudFNlbmRlci5tb3VzZU1vdmVUbyh4LCB5KTsKKwor
ICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gd2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5n
KCkuZm9sZCgpOworICAgICAgICBpZiAocHJldmlvdXNTZWxlY3RlZFRleHQgIT0gc2VsZWN0ZWRU
ZXh0KSB7CisgICAgICAgICAgICBpZiAoZXhwZWN0YXRpb25zW2pdID09IHNlbGVjdGVkVGV4dCkK
KyAgICAgICAgICAgICAgICB0ZXN0UGFzc2VkKCdzZWxlY3RlZCAiJyArIHNlbGVjdGVkVGV4dCAr
ICciJyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVzdEZhaWxlZCgnc2Vs
ZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAnIiBidXQgZXhwZWN0ZWQgIicgKyBleHBlY3RhdGlv
bnNbal0gKyAnIicpOworICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRleHQgPSBzZWxlY3Rl
ZFRleHQ7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBldmVudFNl
bmRlci5tb3VzZVVwKCk7Cit9CisKK2lmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsK
KyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisKKyAgICB2YXIgdGVzdHMg
PSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVzdHMnKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgn
ZHQnKTsKKyAgICB2YXIgdGVzdEV4cGVjdGF0aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlk
KCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkZCcpOworCisgICAgZm9yICh2YXIgaSA9
IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykgeyAgICAgICAgCisgICAgICAgIHRlc3RzW2ldLnN0
eWxlLmRpc3BsYXkgPSBudWxsOworICAgICAgICB0ZXN0RXhwZWN0YXRpb25zW2ldLnN0eWxlLmRp
c3BsYXkgPSBudWxsOworCisgICAgICAgIHZhciB0YXJnZXQgPSB0ZXN0c1tpXS5nZXRFbGVtZW50
c0J5Q2xhc3NOYW1lKCd0YXJnZXQnKVswXTsKKyAgICAgICAgdmFyIHRlc3RFeHBlY3RhdGlvbiA9
IHRlc3RFeHBlY3RhdGlvbnNbaV0udGV4dENvbnRlbnQ7CisKKyAgICAgICAgZGVidWcoJ1Rlc3Qg
IicgKyB0YXJnZXQudGV4dENvbnRlbnQuZm9sZCgpICsgJyIgaW4gIicgKyB0YXJnZXQucGFyZW50
Tm9kZS50ZXh0Q29udGVudC5mb2xkKCkgKyAnIjonKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGlu
ZyBmcm9tIGxlZnQgdG8gcmlnaHQnKTsKKyAgICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJp
ZnlSZXN1bHQodGFyZ2V0LCB0cnVlLCB0ZXN0RXhwZWN0YXRpb24uc3BsaXQoL1x8LylbMF0uc3Bs
aXQoLywvKSk7CisgICAgICAgIGRlYnVnKCdTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0Jyk7
CisgICAgICAgIHNlbGVjdEJ5TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgZmFsc2Us
IHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwvKVsxXS5zcGxpdCgvLC8pKTsKKyAgICAgICAgZGVi
dWcoJycpOworCisgICAgICAgIC8vIFNvbWUgdGVzdHMgbWF5IGJlIG91c2lkZSBvZiB0aGUgd2lu
ZG93IHNvIGJyaW5nIHRoZW0gaW4gYXMgd2UgcHJvY2Vzcy4KKyAgICAgICAgdGVzdHNbaV0uc3R5
bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICAgICAgdGVzdEV4cGVjdGF0aW9uc1tpXS5zdHlsZS5k
aXNwbGF5ID0gJ25vbmUnOworICAgIH0KKworICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0
ZXN0cycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5
SWQoJ2xvZycpLnBhcmVudE5vZGUuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKK30gZWxzZSB7Cisg
ICAgZGVidWcoJ1RoaXMgdGVzdCByZXF1aXJlcyBldmVudFNlbmRlcicpOworICAgIGRvY3VtZW50
Lm9uc2VsZWN0aW9uY2hhbmdlID0gZnVuY3Rpb24gKCkgeworICAgICAgICBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgnbG9nJykudGV4dENvbnRlbnQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9T
dHJpbmcoKS5mb2xkKCk7CisgICAgfQorfQorCit2YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1
ZTsKKworPC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMt
dGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>108221</attachid>
            <date>2011-09-21 13:22:41 -0700</date>
            <delta_ts>2011-09-21 20:46:14 -0700</delta_ts>
            <desc>fixes the bug</desc>
            <filename>bug-57340-20110921132240.patch</filename>
            <type>text/plain</type>
            <size>30624</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk1NjYzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzggQEAKKzIwMTEtMDktMTIgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUkVHUkVTU0lPTihyNzQ5NzEpOiBT
ZWxlY3Rpb24gZG9lc24ndCB3b3JrIGNvcnJlY3RseSBpbiBCaURpIFRleHQKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU3MzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBwYXRjaCBhZGRzIHRoZSBl
bmQgcG9pbnQgYWRqdXN0bWVudCBtZWNoYW5pc20gYXQgYmlkaSBib3VuZGFyaWVzIHNpbWlsYXIg
dG8gdGhlIG9uZSBOU1RleHRWaWV3IGltcGxlbWVudHMuCisKKyAgICAgICAgVG8gdW5kZXJzdGFu
ZCB0aGUgcHJvYmxlbSwgc3VwcG9zZSB3ZSBoYXZlIHN0cm9uZyBSVEwgbGV0dGVycyAiQUJDIiBp
biBhIExUUiBibG9jayAodmlzdWFsbHkgbGFpZCBvdXQgYXMgQ0JBKS4KKworICAgICAgICBQZXIg
TlNUZXh0VmlldyBjb252ZW50aW9uLCBsb2dpY2FsIG9mZnNldHMgYmV0d2VlbiBlYWNoIGxldHRl
ciBpcyBwbGFjZWQgYXMgKDApQygyKUIoMSlBKDMpLiBJbiBvdGhlciB3b3JkcywKKyAgICAgICAg
cGxhY2luZyB0aGUgY2FyZXQgdmlzdWFsbHkgb24gdGhlIGxlZnQgb2YgQ0JBIHlpZWxkcyB0aGUg
cG9zaXRpb24gaW5zaWRlIHRoZSB0ZXh0IG5vZGUgb2YgIkFCQyIgYXQgb2Zmc2V0IDAuCisgICAg
ICAgIExpa2V3aXNlLCBwbGFjaW5nIGl0IGJldHdlZW4gQyBhbmQgQiB5aWVsZHMgKCJBQkMiLCAy
KSwgYW5kIHBsYWNpbmcgaXQgb24gdGhlIHJpZ2h0IG9mIENCQSB5aWVsZHMgKCJBQkMiLCAzKS4K
KworICAgICAgICBOb3cgc3VwcG9zZSBhIHVzZXIgYXR0ZW1wdHMgdG8gc2VsZWN0IHRoZSBsZXR0
ZXIgQSBieSBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQ0JBIHRvIGEgcG9pbnQgYmV0
d2VlbgorICAgICAgICBCIGFuZCBBLiBGaXJzdCwgdGhlIGluaXRpYWwgbW91c2UgZG93biBwbGFj
ZXMgdGhlIHNlbGVjdGlvbidzIGJhc2UgYXQgKCJBQkMiLCAzKS4gVGhlbiBhcyB0aGUgbW91c2Ug
cG9pbnRlcgorICAgICAgICBtb3ZlcyB0byBhIHBvaW50IG9uIHRoZSBsZWZ0IG9mIEEsIHRoZSBz
ZWxlY3Rpb24ncyBleHRlbnQgaXMgc2V0IGF0ICgiQUJDIiwgMSksIHNlbGVjdGluZyAiQkMiLgor
CisgICAgICAgIFRvIG1pdGlnYXRlIHRoaXMgaXNzdWUsIE5TVGV4dFZpZXcgYWRqdXN0cyBzZWxl
Y3Rpb24gYmFzZSBhbmQgZXh0ZW50IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gSW4gdGhlIGFi
b3ZlCisgICAgICAgIGV4YW1wbGUsIE5TVGV4dFZpZXcgZGV0ZWN0cyB1c2VyJ3MgaW50ZW50IGFu
ZCBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24ncyBiYXNlIHRvICgiQUJDIiwgMCkgdGVtcG9yYXJpbHku
CisKKyAgICAgICAgVGhpcyBwYXRjaCBpbXBsZW1lbnRzIGEgc2ltaWxhciB0cmljayBvbiBXZWJL
aXQuIFdlIGFkanVzdCB0aGUgYmFzZSBvciB0aGUgZXh0ZW50IHdoZW4gdGhleSdyZSBhdCB0aGUg
bGVmdAorICAgICAgICBlbmQgb3IgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0
aGUgb3RoZXIgZW5kIGlzIGluc2lkZSBvZiB0aGUgcnVuLiBJbiB0aGUgYWJvdmUgZXhhbXBsZSwg
dGhlCisgICAgICAgIGJhc2UgcG9zaXRpb24gb24gdGhlIHJpZ2h0IG9mIEEgaXMgdGhlIHJpZ2h0
IGVuZCBvZiBhIGJpZGkgcnVuIGFuZCB0aGUgZXh0ZW50IHBvc2l0aW9uIGJldHdlZW4gQiBhbmQg
QSBpcworICAgICAgICBpbnNpZGUgdGhlIHNhbWUgcnVuIChDQkEpLCBzbyB3ZSB3b3VsZCBhZGp1
c3QgdGhlIGJhc2UgdG8gYmUgKCJBQkMiLCAwKSBhcyBOU1RleHRWaWV3IGRvZXMuCisKKyAgICAg
ICAgVGFrZSBhbm90aGVyIGV4YW1wbGUgYWJjQUJDLiBOb3RlIG9mZnNldHMgYXJlIGFzc2lnbmVk
IGFzICgwKWEoMSliKDIpYygzKUMoNSlCKDQpQSg2KSBXaGVuIHRoZSB1c2VyIHN0YXJ0cworICAg
ICAgICBhIG1vdXNlIGRyYWcgZnJvbSB0aGUgcmlnaHQgb2YgQSB0byBhIHBvaW50IGJldHdlZW4g
QiBhbmQgQSwgd2UgYWRqdXN0IHRoZSBzZWxlY3Rpb24gYmFzZSB0byBiZSAoImFiY0FCQyIsIDMp
CisgICAgICAgIGJlY2F1c2UgdGhlIGJhc2UgaXMgYXQgdGhlIHJpZ2h0IGVuZCBvZiBhIGJpZGkg
cnVuIGFuZCB0aGUgZXh0ZW50IGlzIGluIHRoZSBzYW1lIHJ1bi4gV2Uga2VlcCB0aGUgYWRqdXN0
bWVudAorICAgICAgICB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIG1vdmVzIHRvIGEgcG9pbnQgYmV0
d2VlbiBDIGFuZCBCLiBIb3dldmVyLCB3aGVuIHRoZSBtb3VzZXIgcG9pbnRlciByZWFjaGVzIGEg
cG9pbnQKKyAgICAgICAgYmV0d2VlbiBsZXR0ZXJzIGIgYW5kIGMsIHRoZSBzZWxlY3Rpb24gZXh0
ZW50IGlzIHBsYWNlZCBhdCAoImFiY0FCQyIsIDIpLiBCZWNhdXNlIHRoZSBleHRlbnQgaXMgb3V0
c2lkZSBvZgorICAgICAgICB0aGUgYmlkaSBydW4gc3RhcnRlZCBmcm9tIHRoZSBzZWxlY3Rpb24g
YmFzZSwgd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgYmFzZSBhdCB0aGlzIHBvaW50LiBIYWQgd2Ug
bm90IGRvbmUgdGhpcywKKyAgICAgICAgd2UnbGwgZW5kIHVwIHNlbGVjdGluZyBqdXN0ICJjIi4K
KworICAgICAgICBXaGlsZSB0aGlzIGFsZ29yaXRobSBpcyBpbXBsZW1lbnRlZCBpbiBGcmFtZVNl
bGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25JZk5lZWRlZCwgdGhpcyBwYXRjaCBh
ZGRzCisgICAgICAgIHZhcmlvdXMgbWVtYmVyIGZ1bmN0aW9ucyB0byBSZW5kZXJlZFBvc2l0aW9u
IHRvIGZhY2lsaXRhdGUgYWJzdHJhY3Rpb24gYXJvdW5kIGlubGluZSBib3hlcyBhbmQgYmlkaSBy
dW5zLgorCisgICAgICAgIFRlc3Q6IGVkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5o
dG1sCisKKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KTogQWRkZWQuIEltcGxlbWVudHMg
dGhlIGVuZHBvaW50cyBhZGp1c3RtZW50IGFsZ29yaXRobS4KKyAgICAgICAgKFdlYkNvcmU6OkZy
YW1lU2VsZWN0aW9uOjpzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKTogQ2FsbHMg
YWRqdXN0RW5kcG9pbnRzQXRCaWRpQm91bmRhcnksIGFuZAorICAgICAgICByZXN0b3JlcyB0aGUg
b3JpZ2luYWwgYmFzZSBhcyBuZWVkZWQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5oOgorICAgICAgICAqIGVkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpSZW5kZXJlZFBvc2l0aW9uKToKKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OnByZXZMZWFmQ2hpbGQpOiBBZGRlZCB0byBjYWNoZSBw
cmV2TGVhZkNoaWxkIG9mIHRoZSBjdXJyZW50IGlubGluZSBib3guCisgICAgICAgIChXZWJDb3Jl
OjpSZW5kZXJlZFBvc2l0aW9uOjpuZXh0TGVhZkNoaWxkKTogRGl0dG8gZm9yIG5leHRMZWFmQ2hp
bGQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpvcGVyYXRvcj09KTogQ29t
cGFyZXMgdHdvIFJlbmRlcmVkUG9zaXRpb25zIGNvbnNpZGVyaW5nIG5laWdoYm9yaW5nIGlubGlu
ZSBib3hlcworICAgICAgICBzbyB0aGF0IHRoZSByaWdodG1vc3QgcG9zaXRpb24gaW4gYSBib3gg
YW5kIHRoZSBsZWZ0bW9zdCBwb3NpdGlvbiBpbiB0aGUgZm9sbG93aW5nIGJveCBpcyBjb25zaWRl
cmVkIGVxdWFsLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YmlkaUxldmVs
T25MZWZ0KTogQWRkZWQuIFJldHVybnMgdGhlIGJpZGkgbGV2ZWwgb2YgdGhlIHJ1biBvbiB0aGUg
bGVmdC4gV2UgY2FuJ3QKKyAgICAgICAgYWRkIGEgZ2VuZXJpYyBiaWRpTGV2ZWwgdG8gdGhpcyBj
bGFzcyBiZWNhdXNlIGl0J2xsIGJlIGFtYmlndW91cyBhdCBiaWRpIGJvdW5kYXJpZXMuCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpiaWRpTGV2ZWxPblJpZ2h0KTogRGl0dG8g
Zm9yIHRoZSBydW4gb24gdGhlIHJpZ2h0LgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3Np
dGlvbjo6bGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJlZFBvc2l0aW9uOjpyaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjphdExlZnRCb3VuZGFyeU9mQmlkaVJ1bik6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodEJvdW5kYXJ5
T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpw
b3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKTogUmV0dXJucyBQb3NpdGlvbiBhdCB0aGUg
bGVmdCBlZGdlIG9mIGEgYmlkaSBydW4KKyAgICAgICAgaWYgUmVuZGVyZWRQb3NpdGlvbiBpcyBh
dCBzdWNoIGEgcG9zaXRpb24uIEFzc2VydHMgYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4uCisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJlZFBvc2l0aW9uOjpwb3NpdGlvbkF0UmlnaHRCb3VuZGFyeU9m
QmlEaVJ1bik6IERpdHRvIGZvciB0aGUgcmlnaHQgZWRnZS4KKyAgICAgICAgKiBlZGl0aW5nL1Jl
bmRlcmVkUG9zaXRpb24uaDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0
TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJl
ZFBvc2l0aW9uOjphdFJpZ2h0Qm91bmRhcnlPZkJpZGlSdW4pOiBBZGRlZC4KKyAgICAgICAgKFdl
YkNvcmU6OlJlbmRlcmVkUG9zaXRpb246OmF0TGVmdG1vc3RPZmZzZXRJbkJveCk6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6YXRSaWdodG1vc3RPZmZzZXRJbkJv
eCk6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyZWRQb3NpdGlvbjo6dW5jYWNoZWRJ
bmxpbmVCb3gpOiBBZGRlZC4gV2UgY2FuJ3QgdXNlIGEgc3RhdGljIGNvbnN0IHZhcmlhYmxlIGJl
Y2F1c2UgZ2NjIHRoaW5rcworICAgICAgICByZWludGVycHJldF9jYXN0PElubGluZUJveCo+KDEp
IGlzIG5vdCBhbiBpbnRlZ3JhbCB2YWx1ZS4KKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlcmVkUG9z
aXRpb246OlJlbmRlcmVkUG9zaXRpb24pOgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVNlbGVj
dGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6VmlzaWJsZVNlbGVjdGlvbjo6dmlzaWJsZUJhc2Up
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlZpc2libGVTZWxlY3Rpb246OnZpc2libGVFeHRl
bnQpOiBBZGRlZC4KKyAgICAgICAgKiBwYWdlL0V2ZW50SGFuZGxlci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpFdmVudEhhbmRsZXI6OnVwZGF0ZVNlbGVjdGlvbkZvck1vdXNlRHJhZyk6CisKIDIw
MTEtMDktMjEgIENocmlzIE1hcnJpbiAgPGNtYXJyaW5AYXBwbGUuY29tPgogCiAgICAgICAgIENo
ZWNrIGluIFdlYkNvcmUudmNwcm9qIGZpbGUgdW5jaGFuZ2VkIGJ1dCB3cml0dGVuIGxpa2UgTVNE
ZXYgbGlrZXMgaXQKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24u
Y3BwCShyZXZpc2lvbiA5NTY2MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxl
Y3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAiUmVu
ZGVyVGhlbWUuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiUmVuZGVyV2lk
Z2V0LmgiCisjaW5jbHVkZSAiUmVuZGVyZWRQb3NpdGlvbi5oIgogI2luY2x1ZGUgIlNlY3VyZVRl
eHRJbnB1dC5oIgogI2luY2x1ZGUgIlNldHRpbmdzLmgiCiAjaW5jbHVkZSAiU3BhdGlhbE5hdmln
YXRpb24uaCIKQEAgLTE2MywxMyArMTY0LDY4IEBAIHZvaWQgRHJhZ0NhcmV0Q29udHJvbGxlcjo6
c2V0Q2FyZXRQb3NpdGkKICAgICAgICAgdXBkYXRlQ2FyZXRSZWN0KGRvY3VtZW50LCBtX3Bvc2l0
aW9uKTsKIH0KIAotdm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rp
b25JZk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWROZXdTZWxlY3Rpb24sIFRl
eHRHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3N0YXRpYyB2b2lkIGFkanVzdEVuZHBvaW50c0F0
QmlkaUJvdW5kYXJ5KFZpc2libGVQb3NpdGlvbiYgdmlzaWJsZUJhc2UsIFZpc2libGVQb3NpdGlv
biYgdmlzaWJsZUV4dGVudCkKK3sKKyAgICBSZW5kZXJlZFBvc2l0aW9uIGJhc2UodmlzaWJsZUJh
c2UpOworICAgIFJlbmRlcmVkUG9zaXRpb24gZXh0ZW50KHZpc2libGVFeHRlbnQpOworCisgICAg
aWYgKGJhc2UuaXNOdWxsKCkgfHwgZXh0ZW50LmlzTnVsbCgpIHx8IGJhc2UgPT0gZXh0ZW50KQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYmFzZS5hdExlZnRCb3VuZGFyeU9mQmlkaVJ1bigp
KSB7CisgICAgICAgIGlmICghZXh0ZW50LmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihiYXNlLmJp
ZGlMZXZlbE9uUmlnaHQoKSkKKyAgICAgICAgICAgICYmIGJhc2UgPT0gZXh0ZW50LmxlZnRCb3Vu
ZGFyeU9mQmlkaVJ1bihiYXNlLmJpZGlMZXZlbE9uUmlnaHQoKSkpIHsKKyAgICAgICAgICAgIHZp
c2libGVCYXNlID0gYmFzZS5wb3NpdGlvbkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKCk7CisgICAg
ICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IGlmIChiYXNlLmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpKSB7CisgICAgICAgIGlmICghZXh0
ZW50LmF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKGJhc2UuYmlkaUxldmVsT25MZWZ0KCkpCisgICAg
ICAgICAgICAmJiBiYXNlID09IGV4dGVudC5yaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKGJhc2UuYmlk
aUxldmVsT25MZWZ0KCkpKSB7CisgICAgICAgICAgICB2aXNpYmxlQmFzZSA9IGJhc2UucG9zaXRp
b25BdFJpZ2h0Qm91bmRhcnlPZkJpRGlSdW4oKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGV4dGVudC5hdExlZnRCb3Vu
ZGFyeU9mQmlkaVJ1bigpCisgICAgICAgICYmIGV4dGVudCA9PSBiYXNlLmxlZnRCb3VuZGFyeU9m
QmlkaVJ1bihleHRlbnQuYmlkaUxldmVsT25SaWdodCgpKSkgeworICAgICAgICB2aXNpYmxlRXh0
ZW50ID0gZXh0ZW50LnBvc2l0aW9uQXRMZWZ0Qm91bmRhcnlPZkJpRGlSdW4oKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIGlmIChleHRlbnQuYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVu
KCkKKyAgICAgICAgJiYgZXh0ZW50ID09IGJhc2UucmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihleHRl
bnQuYmlkaUxldmVsT25MZWZ0KCkpKSB7CisgICAgICAgIHZpc2libGVFeHRlbnQgPSBleHRlbnQu
cG9zaXRpb25BdFJpZ2h0Qm91bmRhcnlPZkJpRGlSdW4oKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KK30KKwordm9pZCBGcmFtZVNlbGVjdGlvbjo6c2V0Tm9uRGlyZWN0aW9uYWxTZWxlY3Rpb25J
Zk5lZWRlZChjb25zdCBWaXNpYmxlU2VsZWN0aW9uJiBwYXNzZWROZXdTZWxlY3Rpb24sIFRleHRH
cmFudWxhcml0eSBncmFudWxhcml0eSwKKyAgICBFbmRQb2ludHNBZGp1c3RtZW50TW9kZSBlbmRw
b2ludHNBZGp1c3RtZW50TW9kZSkKIHsKICAgICBWaXNpYmxlU2VsZWN0aW9uIG5ld1NlbGVjdGlv
biA9IHBhc3NlZE5ld1NlbGVjdGlvbjsKKyAgICBib29sIGlzRGlyZWN0aW9uYWwgPSBzaG91bGRB
bHdheXNVc2VEaXJlY3Rpb25hbFNlbGVjdGlvbihtX2ZyYW1lKSB8fCBuZXdTZWxlY3Rpb24uaXNE
aXJlY3Rpb25hbCgpOwogCi0gICAgaWYgKHNob3VsZEFsd2F5c1VzZURpcmVjdGlvbmFsU2VsZWN0
aW9uKG1fZnJhbWUpKQotICAgICAgICBuZXdTZWxlY3Rpb24uc2V0SXNEaXJlY3Rpb25hbCh0cnVl
KTsKKyAgICBWaXNpYmxlUG9zaXRpb24gYmFzZSA9IG1fb3JpZ2luYWxCYXNlLmlzTm90TnVsbCgp
ID8gbV9vcmlnaW5hbEJhc2UgOiBuZXdTZWxlY3Rpb24udmlzaWJsZUJhc2UoKTsKKyAgICBWaXNp
YmxlUG9zaXRpb24gbmV3QmFzZSA9IGJhc2U7CisgICAgVmlzaWJsZVBvc2l0aW9uIG5ld0V4dGVu
dCA9IG5ld1NlbGVjdGlvbi52aXNpYmxlRXh0ZW50KCk7CisgICAgaWYgKGVuZHBvaW50c0FkanVz
dG1lbnRNb2RlID09IEFkanVzdEVuZHBvaW50c0F0QmlkaUJvdW5kYXJ5KQorICAgICAgICBhZGp1
c3RFbmRwb2ludHNBdEJpZGlCb3VuZGFyeShuZXdCYXNlLCBuZXdFeHRlbnQpOworCisgICAgaWYg
KG5ld0Jhc2UgIT0gYmFzZSB8fCBuZXdFeHRlbnQgIT0gbmV3U2VsZWN0aW9uLnZpc2libGVFeHRl
bnQoKSkgeworICAgICAgICBtX29yaWdpbmFsQmFzZSA9IGJhc2U7CisgICAgICAgIG5ld1NlbGVj
dGlvbi5zZXRCYXNlKG5ld0Jhc2UpOworICAgICAgICBuZXdTZWxlY3Rpb24uc2V0RXh0ZW50KG5l
d0V4dGVudCk7CisgICAgfSBlbHNlIGlmIChtX29yaWdpbmFsQmFzZS5pc05vdE51bGwoKSkgewor
ICAgICAgICBpZiAobV9zZWxlY3Rpb24uYmFzZSgpID09IG5ld1NlbGVjdGlvbi5iYXNlKCkpCisg
ICAgICAgICAgICBuZXdTZWxlY3Rpb24uc2V0QmFzZShtX29yaWdpbmFsQmFzZSk7CisgICAgICAg
IG1fb3JpZ2luYWxCYXNlLmNsZWFyKCk7CisgICAgfQogCisgICAgbmV3U2VsZWN0aW9uLnNldElz
RGlyZWN0aW9uYWwoaXNEaXJlY3Rpb25hbCk7IC8vIEFkanVzdGluZyBiYXNlIGFuZCBleHRlbnQg
d2lsbCBtYWtlIG5ld1NlbGVjdGlvbiBhbHdheXMgZGlyZWN0aW9uYWwKICAgICBpZiAobV9zZWxl
Y3Rpb24gPT0gbmV3U2VsZWN0aW9uIHx8ICFzaG91bGRDaGFuZ2VTZWxlY3Rpb24obmV3U2VsZWN0
aW9uKSkKICAgICAgICAgcmV0dXJuOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFt
ZVNlbGVjdGlvbi5oCShyZXZpc2lvbiA5NTY2MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcv
RnJhbWVTZWxlY3Rpb24uaAkod29ya2luZyBjb3B5KQpAQCAtMjIzLDcgKzIyMyw4IEBAIHB1Ymxp
YzoKIAogICAgIGJvb2wgc2hvdWxkQ2hhbmdlU2VsZWN0aW9uKGNvbnN0IFZpc2libGVTZWxlY3Rp
b24mKSBjb25zdDsKICAgICBib29sIHNob3VsZERlbGV0ZVNlbGVjdGlvbihjb25zdCBWaXNpYmxl
U2VsZWN0aW9uJikgY29uc3Q7Ci0gICAgdm9pZCBzZXROb25EaXJlY3Rpb25hbFNlbGVjdGlvbklm
TmVlZGVkKGNvbnN0IFZpc2libGVTZWxlY3Rpb24mLCBUZXh0R3JhbnVsYXJpdHkpOworICAgIGVu
dW0gRW5kUG9pbnRzQWRqdXN0bWVudE1vZGUgeyBBZGp1c3RFbmRwb2ludHNBdEJpZGlCb3VuZGFy
eSwgRG9Ob3RBZGpzdXRFbmRwb2ludHMgfTsKKyAgICB2b2lkIHNldE5vbkRpcmVjdGlvbmFsU2Vs
ZWN0aW9uSWZOZWVkZWQoY29uc3QgVmlzaWJsZVNlbGVjdGlvbiYsIFRleHRHcmFudWxhcml0eSwg
RW5kUG9pbnRzQWRqdXN0bWVudE1vZGUgPSBEb05vdEFkanN1dEVuZHBvaW50cyk7CiAgICAgdm9p
ZCBzZXRGb2N1c2VkTm9kZUlmTmVlZGVkKCk7CiAgICAgdm9pZCBub3RpZnlSZW5kZXJlck9mU2Vs
ZWN0aW9uQ2hhbmdlKEVVc2VyVHJpZ2dlcmVkKTsKIApAQCAtMjgyLDYgKzI4Myw3IEBAIHByaXZh
dGU6CiAgICAgTGF5b3V0VW5pdCBtX3hQb3NGb3JWZXJ0aWNhbEFycm93TmF2aWdhdGlvbjsKIAog
ICAgIFZpc2libGVTZWxlY3Rpb24gbV9zZWxlY3Rpb247CisgICAgVmlzaWJsZVBvc2l0aW9uIG1f
b3JpZ2luYWxCYXNlOyAvLyBVc2VkIHRvIHN0b3JlIGJhc2UgYmVmb3JlIHRoZSBhZGp1c3RtZW50
IGF0IGJpZGkgYm91bmRhcnkKICAgICBUZXh0R3JhbnVsYXJpdHkgbV9ncmFudWxhcml0eTsKIAog
ICAgIFJlZlB0cjxFZGl0aW5nU3R5bGU+IG1fdHlwaW5nU3R5bGU7CkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2VkaXRpbmcvUmVuZGVyZWRQb3NpdGlvbi5jcHAJKHJldmlzaW9uIDk1NjYzKQorKysg
U291cmNlL1dlYkNvcmUvZWRpdGluZy9SZW5kZXJlZFBvc2l0aW9uLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIlJlbmRlcmVkUG9zaXRpb24uaCIKIAogI2lu
Y2x1ZGUgIklubGluZUJveC5oIgorI2luY2x1ZGUgIklubGluZVRleHRCb3guaCIKICNpbmNsdWRl
ICJQb3NpdGlvbi5oIgogI2luY2x1ZGUgIlZpc2libGVQb3NpdGlvbi5oIgogCkBAIC02OCw2ICs2
OSw4IEBAIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVkUG9zaXRpb24oY29uc3QKICAgICA6IG1f
cmVuZGVyZXIoMCkKICAgICAsIG1faW5saW5lQm94KDApCiAgICAgLCBtX29mZnNldCgwKQorICAg
ICwgbV9wcmV2TGVhZkNoaWxkKHVuY2FjaGVkSW5saW5lQm94KCkpCisgICAgLCBtX25leHRMZWFm
Q2hpbGQodW5jYWNoZWRJbmxpbmVCb3goKSkKIHsKICAgICBpZiAocG9zaXRpb24uaXNOdWxsKCkp
CiAgICAgICAgIHJldHVybjsKQEAgLTgyLDYgKzg1LDggQEAgUmVuZGVyZWRQb3NpdGlvbjo6UmVu
ZGVyZWRQb3NpdGlvbihjb25zdAogICAgIDogbV9yZW5kZXJlcigwKQogICAgICwgbV9pbmxpbmVC
b3goMCkKICAgICAsIG1fb2Zmc2V0KDApCisgICAgLCBtX3ByZXZMZWFmQ2hpbGQodW5jYWNoZWRJ
bmxpbmVCb3goKSkKKyAgICAsIG1fbmV4dExlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQog
ewogICAgIGlmIChwb3NpdGlvbi5pc051bGwoKSkKICAgICAgICAgcmV0dXJuOwpAQCAtOTIsNiAr
OTcsMTMzIEBAIFJlbmRlcmVkUG9zaXRpb246OlJlbmRlcmVkUG9zaXRpb24oY29uc3QKICAgICAg
ICAgbV9yZW5kZXJlciA9IHJlbmRlcmVyRnJvbVBvc2l0aW9uKHBvc2l0aW9uKTsKIH0KIAorSW5s
aW5lQm94KiBSZW5kZXJlZFBvc2l0aW9uOjpwcmV2TGVhZkNoaWxkKCkgY29uc3QKK3sKKyAgICBp
ZiAobV9wcmV2TGVhZkNoaWxkID09IHVuY2FjaGVkSW5saW5lQm94KCkpCisgICAgICAgIG1fcHJl
dkxlYWZDaGlsZCA9IG1faW5saW5lQm94LT5wcmV2TGVhZkNoaWxkKCk7CisgICAgcmV0dXJuIG1f
cHJldkxlYWZDaGlsZDsKK30KKworSW5saW5lQm94KiBSZW5kZXJlZFBvc2l0aW9uOjpuZXh0TGVh
ZkNoaWxkKCkgY29uc3QKK3sKKyAgICBpZiAobV9uZXh0TGVhZkNoaWxkID09IHVuY2FjaGVkSW5s
aW5lQm94KCkpCisgICAgICAgIG1fbmV4dExlYWZDaGlsZCA9IG1faW5saW5lQm94LT5uZXh0TGVh
ZkNoaWxkKCk7CisgICAgcmV0dXJuIG1fbmV4dExlYWZDaGlsZDsKK30KKworYm9vbCBSZW5kZXJl
ZFBvc2l0aW9uOjpvcGVyYXRvcj09KGNvbnN0IFJlbmRlcmVkUG9zaXRpb24mIG90aGVyKSBjb25z
dAoreworICAgIHJldHVybiAobV9yZW5kZXJlciA9PSBvdGhlci5tX3JlbmRlcmVyICYmIG1faW5s
aW5lQm94ID09IG90aGVyLm1faW5saW5lQm94ICYmIG1fb2Zmc2V0ID09IG90aGVyLm1fb2Zmc2V0
KQorICAgICAgICB8fCAoYXRMZWZ0bW9zdE9mZnNldEluQm94KCkgJiYgb3RoZXIuYXRSaWdodG1v
c3RPZmZzZXRJbkJveCgpICYmIHByZXZMZWFmQ2hpbGQoKSA9PSBvdGhlci5tX2lubGluZUJveCkK
KyAgICAgICAgfHwgKGF0UmlnaHRtb3N0T2Zmc2V0SW5Cb3goKSAmJiBvdGhlci5hdExlZnRtb3N0
T2Zmc2V0SW5Cb3goKSAmJiBuZXh0TGVhZkNoaWxkKCkgPT0gb3RoZXIubV9pbmxpbmVCb3gpOwor
fQorCit1bnNpZ25lZCBjaGFyIFJlbmRlcmVkUG9zaXRpb246OmJpZGlMZXZlbE9uTGVmdCgpIGNv
bnN0Cit7CisgICAgSW5saW5lQm94KiBib3ggPSBhdExlZnRtb3N0T2Zmc2V0SW5Cb3goKSA/IHBy
ZXZMZWFmQ2hpbGQoKSA6IG1faW5saW5lQm94OworICAgIHJldHVybiBib3ggPyBib3gtPmJpZGlM
ZXZlbCgpIDogMDsKK30KKwordW5zaWduZWQgY2hhciBSZW5kZXJlZFBvc2l0aW9uOjpiaWRpTGV2
ZWxPblJpZ2h0KCkgY29uc3QKK3sKKyAgICBJbmxpbmVCb3gqIGJveCA9IGF0UmlnaHRtb3N0T2Zm
c2V0SW5Cb3goKSA/IG5leHRMZWFmQ2hpbGQoKSA6IG1faW5saW5lQm94OworICAgIHJldHVybiBi
b3ggPyBib3gtPmJpZGlMZXZlbCgpIDogMDsKK30KKworUmVuZGVyZWRQb3NpdGlvbiBSZW5kZXJl
ZFBvc2l0aW9uOjpsZWZ0Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxP
ZlJ1bikKK3sKKyAgICBpZiAoIW1faW5saW5lQm94IHx8IGJpZGlMZXZlbE9mUnVuID4gbV9pbmxp
bmVCb3gtPmJpZGlMZXZlbCgpKQorICAgICAgICByZXR1cm4gUmVuZGVyZWRQb3NpdGlvbigpOwor
CisgICAgSW5saW5lQm94KiBib3ggPSBtX2lubGluZUJveDsKKyAgICBkbyB7CisgICAgICAgIElu
bGluZUJveCogcHJldiA9IGJveC0+cHJldkxlYWZDaGlsZCgpOworICAgICAgICBpZiAoIXByZXYg
fHwgcHJldi0+YmlkaUxldmVsKCkgPCBiaWRpTGV2ZWxPZlJ1bikKKyAgICAgICAgICAgIHJldHVy
biBSZW5kZXJlZFBvc2l0aW9uKGJveC0+cmVuZGVyZXIoKSwgYm94LCBib3gtPmNhcmV0TGVmdG1v
c3RPZmZzZXQoKSk7CisgICAgICAgIGJveCA9IHByZXY7CisgICAgfSB3aGlsZSAoYm94KTsKKwor
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKCk7
Cit9CisKK1JlbmRlcmVkUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6cmlnaHRCb3VuZGFyeU9m
QmlkaVJ1bih1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKQoreworICAgIGlmICghbV9pbmxp
bmVCb3ggfHwgYmlkaUxldmVsT2ZSdW4gPiBtX2lubGluZUJveC0+YmlkaUxldmVsKCkpCisgICAg
ICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKCk7CisKKyAgICBJbmxpbmVCb3gqIGJveCA9IG1f
aW5saW5lQm94OworICAgIGRvIHsKKyAgICAgICAgSW5saW5lQm94KiBuZXh0ID0gYm94LT5uZXh0
TGVhZkNoaWxkKCk7CisgICAgICAgIGlmICghbmV4dCB8fCBuZXh0LT5iaWRpTGV2ZWwoKSA8IGJp
ZGlMZXZlbE9mUnVuKQorICAgICAgICAgICAgcmV0dXJuIFJlbmRlcmVkUG9zaXRpb24oYm94LT5y
ZW5kZXJlcigpLCBib3gsIGJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKSk7CisgICAgICAgIGJv
eCA9IG5leHQ7CisgICAgfSB3aGlsZSAoYm94KTsKKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgIHJldHVybiBSZW5kZXJlZFBvc2l0aW9uKCk7Cit9CisKK2Jvb2wgUmVuZGVyZWRQb3Np
dGlvbjo6YXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2ZWwgc2hvdWxk
TWF0Y2hCaWRpTGV2ZWwsIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pIGNvbnN0Cit7Cisg
ICAgaWYgKCFtX2lubGluZUJveCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGF0
TGVmdG1vc3RPZmZzZXRJbkJveCgpKSB7CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZl
bCA9PSBJZ25vcmVCaWRpTGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gIXByZXZMZWFmQ2hpbGQo
KSB8fCBwcmV2TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpOworICAgICAgICByZXR1cm4gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpID49IGJpZGlMZXZl
bE9mUnVuICYmICghcHJldkxlYWZDaGlsZCgpIHx8IHByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVs
KCkgPCBiaWRpTGV2ZWxPZlJ1bik7CisgICAgfQorCisgICAgaWYgKGF0UmlnaHRtb3N0T2Zmc2V0
SW5Cb3goKSkgeworICAgICAgICBpZiAoc2hvdWxkTWF0Y2hCaWRpTGV2ZWwgPT0gSWdub3JlQmlk
aUxldmVsKQorICAgICAgICAgICAgcmV0dXJuIG5leHRMZWFmQ2hpbGQoKSAmJiBtX2lubGluZUJv
eC0+YmlkaUxldmVsKCkgPCBuZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpOworICAgICAgICBy
ZXR1cm4gbmV4dExlYWZDaGlsZCgpICYmIG1faW5saW5lQm94LT5iaWRpTGV2ZWwoKSA8IGJpZGlM
ZXZlbE9mUnVuICYmIG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCkgPj0gYmlkaUxldmVsT2ZS
dW47CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlcmVkUG9zaXRp
b246OmF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihTaG91bGRNYXRjaEJpZGlMZXZlbCBzaG91bGRN
YXRjaEJpZGlMZXZlbCwgdW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3QKK3sKKyAg
ICBpZiAoIW1faW5saW5lQm94KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYXRS
aWdodG1vc3RPZmZzZXRJbkJveCgpKSB7CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZl
bCA9PSBJZ25vcmVCaWRpTGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gIW5leHRMZWFmQ2hpbGQo
KSB8fCBuZXh0TGVhZkNoaWxkKCktPmJpZGlMZXZlbCgpIDwgbV9pbmxpbmVCb3gtPmJpZGlMZXZl
bCgpOworICAgICAgICByZXR1cm4gbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpID49IGJpZGlMZXZl
bE9mUnVuICYmICghbmV4dExlYWZDaGlsZCgpIHx8IG5leHRMZWFmQ2hpbGQoKS0+YmlkaUxldmVs
KCkgPCBiaWRpTGV2ZWxPZlJ1bik7CisgICAgfQorCisgICAgaWYgKGF0TGVmdG1vc3RPZmZzZXRJ
bkJveCgpKSB7CisgICAgICAgIGlmIChzaG91bGRNYXRjaEJpZGlMZXZlbCA9PSBJZ25vcmVCaWRp
TGV2ZWwpCisgICAgICAgICAgICByZXR1cm4gcHJldkxlYWZDaGlsZCgpICYmIG1faW5saW5lQm94
LT5iaWRpTGV2ZWwoKSA8IHByZXZMZWFmQ2hpbGQoKS0+YmlkaUxldmVsKCk7CisgICAgICAgIHJl
dHVybiBwcmV2TGVhZkNoaWxkKCkgJiYgbV9pbmxpbmVCb3gtPmJpZGlMZXZlbCgpIDwgYmlkaUxl
dmVsT2ZSdW4gJiYgcHJldkxlYWZDaGlsZCgpLT5iaWRpTGV2ZWwoKSA+PSBiaWRpTGV2ZWxPZlJ1
bjsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Bvc2l0aW9uIFJlbmRlcmVkUG9z
aXRpb246OnBvc2l0aW9uQXRMZWZ0Qm91bmRhcnlPZkJpRGlSdW4oKSBjb25zdAoreworICAgIEFT
U0VSVChhdExlZnRCb3VuZGFyeU9mQmlkaVJ1bigpKTsKKworICAgIGlmIChhdExlZnRtb3N0T2Zm
c2V0SW5Cb3goKSkKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbiht
X3JlbmRlcmVyLT5ub2RlKCksIG1fb2Zmc2V0KTsKKworICAgIHJldHVybiBjcmVhdGVMZWdhY3lF
ZGl0aW5nUG9zaXRpb24obmV4dExlYWZDaGlsZCgpLT5yZW5kZXJlcigpLT5ub2RlKCksIG1fb2Zm
c2V0KTsKK30KKworUG9zaXRpb24gUmVuZGVyZWRQb3NpdGlvbjo6cG9zaXRpb25BdFJpZ2h0Qm91
bmRhcnlPZkJpRGlSdW4oKSBjb25zdAoreworICAgIEFTU0VSVChhdFJpZ2h0Qm91bmRhcnlPZkJp
ZGlSdW4oKSk7CisKKyAgICBpZiAoYXRSaWdodG1vc3RPZmZzZXRJbkJveCgpKQorICAgICAgICBy
ZXR1cm4gY3JlYXRlTGVnYWN5RWRpdGluZ1Bvc2l0aW9uKG1fcmVuZGVyZXItPm5vZGUoKSwgbV9v
ZmZzZXQpOworCisgICAgcmV0dXJuIGNyZWF0ZUxlZ2FjeUVkaXRpbmdQb3NpdGlvbihwcmV2TGVh
ZkNoaWxkKCktPnJlbmRlcmVyKCktPm5vZGUoKSwgbV9vZmZzZXQpOworfQorCiBMYXlvdXRSZWN0
IFJlbmRlcmVkUG9zaXRpb246OmFic29sdXRlUmVjdChpbnQqIGV4dHJhV2lkdGhUb0VuZE9mTGlu
ZSkgY29uc3QKIHsKICAgICBpZiAoaXNOdWxsKCkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL1JlbmRlcmVkUG9zaXRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL1JlbmRlcmVkUG9zaXRpb24uaAkocmV2aXNpb24gOTU2NjMpCisrKyBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL1JlbmRlcmVkUG9zaXRpb24uaAkod29ya2luZyBjb3B5KQpAQCAtNDYsMjUgKzQ2
LDY4IEBAIHB1YmxpYzoKICAgICBSZW5kZXJlZFBvc2l0aW9uKCk7CiAgICAgZXhwbGljaXQgUmVu
ZGVyZWRQb3NpdGlvbihjb25zdCBWaXNpYmxlUG9zaXRpb24mKTsKICAgICBleHBsaWNpdCBSZW5k
ZXJlZFBvc2l0aW9uKGNvbnN0IFBvc2l0aW9uJiwgRUFmZmluaXR5KTsKKyAgICBib29sIG9wZXJh
dG9yPT0oY29uc3QgUmVuZGVyZWRQb3NpdGlvbiYgb3RoZXIpIGNvbnN0OwogCiAgICAgYm9vbCBp
c051bGwoKSBjb25zdCB7IHJldHVybiAhbV9yZW5kZXJlcjsgfQogICAgIFJvb3RJbmxpbmVCb3gq
IHJvb3RCb3goKSB7IHJldHVybiBtX2lubGluZUJveCA/IG1faW5saW5lQm94LT5yb290KCkgOiAw
OyB9CiAKKyAgICB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9uTGVmdCgpIGNvbnN0OworICAgIHVu
c2lnbmVkIGNoYXIgYmlkaUxldmVsT25SaWdodCgpIGNvbnN0OworICAgIFJlbmRlcmVkUG9zaXRp
b24gbGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIgYmlkaUxldmVsT2ZSdW4pOwor
ICAgIFJlbmRlcmVkUG9zaXRpb24gcmlnaHRCb3VuZGFyeU9mQmlkaVJ1bih1bnNpZ25lZCBjaGFy
IGJpZGlMZXZlbE9mUnVuKTsKKworICAgIGVudW0gU2hvdWxkTWF0Y2hCaWRpTGV2ZWwgeyBNYXRj
aEJpZGlMZXZlbCwgSWdub3JlQmlkaUxldmVsIH07CisgICAgYm9vbCBhdExlZnRCb3VuZGFyeU9m
QmlkaVJ1bigpIGNvbnN0IHsgcmV0dXJuIGF0TGVmdEJvdW5kYXJ5T2ZCaWRpUnVuKElnbm9yZUJp
ZGlMZXZlbCwgMCk7IH0KKyAgICBib29sIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bigpIGNvbnN0
IHsgcmV0dXJuIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihJZ25vcmVCaWRpTGV2ZWwsIDApOyB9
CisgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIHJldHVybiB0cnVlIG9ubHkgaWYg
dGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYXQgdGhlIGVuZCBvZiB0aGUgYmlkaSBydW4KKyAgICAv
LyBvZiB0aGUgc3BlY2lmaWVkIGJpZGkgZW1iZWRkaW5nIGxldmVsLgorICAgIGJvb2wgYXRMZWZ0
Qm91bmRhcnlPZkJpZGlSdW4odW5zaWduZWQgY2hhciBiaWRpTGV2ZWxPZlJ1bikgY29uc3QgeyBy
ZXR1cm4gYXRMZWZ0Qm91bmRhcnlPZkJpZGlSdW4oTWF0Y2hCaWRpTGV2ZWwsIGJpZGlMZXZlbE9m
UnVuKTsgfQorICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKHVuc2lnbmVkIGNoYXIg
YmlkaUxldmVsT2ZSdW4pIGNvbnN0IHsgcmV0dXJuIGF0UmlnaHRCb3VuZGFyeU9mQmlkaVJ1bihN
YXRjaEJpZGlMZXZlbCwgYmlkaUxldmVsT2ZSdW4pOyB9CisKKyAgICBQb3NpdGlvbiBwb3NpdGlv
bkF0TGVmdEJvdW5kYXJ5T2ZCaURpUnVuKCkgY29uc3Q7CisgICAgUG9zaXRpb24gcG9zaXRpb25B
dFJpZ2h0Qm91bmRhcnlPZkJpRGlSdW4oKSBjb25zdDsKKwogICAgIExheW91dFJlY3QgYWJzb2x1
dGVSZWN0KCkgY29uc3QgeyByZXR1cm4gYWJzb2x1dGVSZWN0KDApOyB9CiAgICAgTGF5b3V0UmVj
dCBhYnNvbHV0ZVJlY3QoaW50JiBleHRyYVdpZHRoVG9FbmRPZkxpbmUpIGNvbnN0IHsgcmV0dXJu
IGFic29sdXRlUmVjdCgmZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKTsgfQogCiBwcml2YXRlOgorICAg
IGV4cGxpY2l0IFJlbmRlcmVkUG9zaXRpb24oUmVuZGVyT2JqZWN0KiwgSW5saW5lQm94KiwgaW50
IG9mZnNldCk7CisKKyAgICBJbmxpbmVCb3gqIHByZXZMZWFmQ2hpbGQoKSBjb25zdDsKKyAgICBJ
bmxpbmVCb3gqIG5leHRMZWFmQ2hpbGQoKSBjb25zdDsKKyAgICBib29sIGF0TGVmdG1vc3RPZmZz
ZXRJbkJveCgpIGNvbnN0IHsgcmV0dXJuIG1faW5saW5lQm94ICYmIG1fb2Zmc2V0ID09IG1faW5s
aW5lQm94LT5jYXJldExlZnRtb3N0T2Zmc2V0KCk7IH0KKyAgICBib29sIGF0UmlnaHRtb3N0T2Zm
c2V0SW5Cb3goKSBjb25zdCB7IHJldHVybiBtX2lubGluZUJveCAmJiBtX29mZnNldCA9PSBtX2lu
bGluZUJveC0+Y2FyZXRSaWdodG1vc3RPZmZzZXQoKTsgfQorICAgIGJvb2wgYXRMZWZ0Qm91bmRh
cnlPZkJpZGlSdW4oU2hvdWxkTWF0Y2hCaWRpTGV2ZWwsIHVuc2lnbmVkIGNoYXIgYmlkaUxldmVs
T2ZSdW4pIGNvbnN0OworICAgIGJvb2wgYXRSaWdodEJvdW5kYXJ5T2ZCaWRpUnVuKFNob3VsZE1h
dGNoQmlkaUxldmVsLCB1bnNpZ25lZCBjaGFyIGJpZGlMZXZlbE9mUnVuKSBjb25zdDsKKwogICAg
IExheW91dFJlY3QgYWJzb2x1dGVSZWN0KGludCogZXh0cmFXaWR0aFRvRW5kT2ZMaW5lKSBjb25z
dDsKIAogICAgIFJlbmRlck9iamVjdCogbV9yZW5kZXJlcjsKICAgICBJbmxpbmVCb3gqIG1faW5s
aW5lQm94OwogICAgIGludCBtX29mZnNldDsKKworICAgIHN0YXRpYyBJbmxpbmVCb3gqIHVuY2Fj
aGVkSW5saW5lQm94KCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbmxpbmVCb3gqPigxKTsg
fQorICAgIC8vIE5lZWRzIHRvIGJlIGRpZmZlcmVudCBmb3JtIDAgc28gcGljayAxIGJlY2F1c2Ug
aXQncyBhbHNvIG9uIHRoZSBudWxsIHBhZ2UuCisKKyAgICBtdXRhYmxlIElubGluZUJveCogbV9w
cmV2TGVhZkNoaWxkOworICAgIG11dGFibGUgSW5saW5lQm94KiBtX25leHRMZWFmQ2hpbGQ7CiB9
OwogCiBpbmxpbmUgUmVuZGVyZWRQb3NpdGlvbjo6UmVuZGVyZWRQb3NpdGlvbigpCiAgICAgOiBt
X3JlbmRlcmVyKDApCiAgICAgLCBtX2lubGluZUJveCgwKQogICAgICwgbV9vZmZzZXQoMCkKKyAg
ICAsIG1fcHJldkxlYWZDaGlsZCh1bmNhY2hlZElubGluZUJveCgpKQorICAgICwgbV9uZXh0TGVh
ZkNoaWxkKHVuY2FjaGVkSW5saW5lQm94KCkpCit7Cit9CisKK2lubGluZSBSZW5kZXJlZFBvc2l0
aW9uOjpSZW5kZXJlZFBvc2l0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIElubGluZUJveCog
Ym94LCBpbnQgb2Zmc2V0KQorICAgIDogbV9yZW5kZXJlcihyZW5kZXJlcikKKyAgICAsIG1faW5s
aW5lQm94KGJveCkKKyAgICAsIG1fb2Zmc2V0KG9mZnNldCkKKyAgICAsIG1fcHJldkxlYWZDaGls
ZCh1bmNhY2hlZElubGluZUJveCgpKQorICAgICwgbV9uZXh0TGVhZkNoaWxkKHVuY2FjaGVkSW5s
aW5lQm94KCkpCiB7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVNl
bGVjdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVNl
bGVjdGlvbi5oCShyZXZpc2lvbiA5NTY2MykKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlz
aWJsZVNlbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC02OSw2ICs2OSw4IEBAIHB1YmxpYzoK
ICAgICAKICAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0KCkgY29uc3QgeyByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKG1fc3RhcnQsIGlzUmFuZ2UoKSA/IERPV05TVFJFQU0gOiBhZmZpbml0
eSgpKTsgfQogICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kKCkgY29uc3QgeyByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKG1fZW5kLCBpc1JhbmdlKCkgPyBVUFNUUkVBTSA6IGFmZmluaXR5KCkp
OyB9CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVCYXNlKCkgY29uc3QgeyByZXR1cm4gVmlz
aWJsZVBvc2l0aW9uKG1fYmFzZSwgaXNSYW5nZSgpID8gKGlzQmFzZUZpcnN0KCkgPyBVUFNUUkVB
TSA6IERPV05TVFJFQU0pIDogYWZmaW5pdHkoKSk7IH0KKyAgICBWaXNpYmxlUG9zaXRpb24gdmlz
aWJsZUV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIFZpc2libGVQb3NpdGlvbihtX2V4dGVudCwgaXNS
YW5nZSgpID8gKGlzQmFzZUZpcnN0KCkgPyBET1dOU1RSRUFNIDogVVBTVFJFQU0pIDogYWZmaW5p
dHkoKSk7IH0KIAogICAgIGJvb2wgaXNOb25lKCkgY29uc3QgeyByZXR1cm4gc2VsZWN0aW9uVHlw
ZSgpID09IE5vU2VsZWN0aW9uOyB9CiAgICAgYm9vbCBpc0NhcmV0KCkgY29uc3QgeyByZXR1cm4g
c2VsZWN0aW9uVHlwZSgpID09IENhcmV0U2VsZWN0aW9uOyB9CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wYWdlL0V2ZW50SGFuZGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGFn
ZS9FdmVudEhhbmRsZXIuY3BwCShyZXZpc2lvbiA5NTY2MykKKysrIFNvdXJjZS9XZWJDb3JlL3Bh
Z2UvRXZlbnRIYW5kbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjkwLDcgKzY5MCw4IEBAIHZv
aWQgRXZlbnRIYW5kbGVyOjp1cGRhdGVTZWxlY3Rpb25Gb3JNb3UKICAgICBpZiAobV9mcmFtZS0+
c2VsZWN0aW9uKCktPmdyYW51bGFyaXR5KCkgIT0gQ2hhcmFjdGVyR3JhbnVsYXJpdHkpCiAgICAg
ICAgIG5ld1NlbGVjdGlvbi5leHBhbmRVc2luZ0dyYW51bGFyaXR5KG1fZnJhbWUtPnNlbGVjdGlv
bigpLT5ncmFudWxhcml0eSgpKTsKIAotICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5zZXROb25E
aXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKG5ld1NlbGVjdGlvbiwgbV9mcmFtZS0+c2VsZWN0
aW9uKCktPmdyYW51bGFyaXR5KCkpOworICAgIG1fZnJhbWUtPnNlbGVjdGlvbigpLT5zZXROb25E
aXJlY3Rpb25hbFNlbGVjdGlvbklmTmVlZGVkKG5ld1NlbGVjdGlvbiwgbV9mcmFtZS0+c2VsZWN0
aW9uKCktPmdyYW51bGFyaXR5KCksCisgICAgICAgIEZyYW1lU2VsZWN0aW9uOjpBZGp1c3RFbmRw
b2ludHNBdEJpZGlCb3VuZGFyeSk7CiB9CiAjZW5kaWYgLy8gRU5BQkxFKERSQUdfU1VQUE9SVCkK
IApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkocmV2aXNpb24gOTU2NjMpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdv
cmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxMS0wOS0xMiAgUnlvc3VrZSBOaXdhICA8
cm5pd2FAd2Via2l0Lm9yZz4KKworICAgICAgICBSRUdSRVNTSU9OKHI3NDk3MSk6IFNlbGVjdGlv
biBkb2Vzbid0IHdvcmsgY29ycmVjdGx5IGluIEJpRGkgVGV4dAorICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTczNDAKKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9uL3NlbGVjdC1i
aWRpLXJ1bi1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9u
L3NlbGVjdC1iaWRpLXJ1bi5odG1sOiBBZGRlZC4KKwogMjAxMS0wOS0yMSAgQ2hhbmcgU2h1ICA8
Y3NodUB3ZWJraXQub3JnPgogCiAgICAgICAgIFtXSzJdIFtNYWNdIEltcGxlbWVudCBhIG1vcmUt
Y29tcGxldGUgTW91c2VEb3duL01vdXNlVXAvTW91c2VNb3ZlVG8gZnVuY3Rpb25zIGZvciBXZWJL
aXQyIEV2ZW50U2VuZGVyCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxl
Y3QtYmlkaS1ydW4tZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRp
bmcvc2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisr
KyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9zZWxlY3QtYmlkaS1ydW4tZXhwZWN0ZWQu
dHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDEyMiBAQAorVGhpcyB0ZXN0IGVuc3VyZXMgV2Vi
S2l0IGxldHMgdXNlciBzZWxlY3QgYmlkaXJlY3Rpb25hbCB0ZXh0IGludHVpdGl2ZWx5LiBUbyBt
YW51YWxseSB0ZXN0LCBzZWxlY3QgdGV4dCBpbiBibHVlIGJveCBpbiBlYWNoIHRlc3QgY2FzZSBi
ZWxvdyBieSBhIG1vdXNlIGRyYWcgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBUaGUgY2hhbmdlcyBpbiB0
aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0Y2ggdGhlIGV4cGVjdGF0aW9ucyBiZWZvcmUgfC4g
RG8gdGhlIHNhbWUgYnkgYSBtb3VzZSBkcmFnIGZyb20gcmlnaHQgdG8gbGVmdCBhbmQgZXhwZWN0
YXRpb25zIGFyZSBhZnRlciB8LgorCitUZXN0ICJhYmNBQkMiIGluICJhYmNBQkMiOgorU2VsZWN0
aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiYSIKK1BBU1Mgc2VsZWN0ZWQg
ImFiIgorUEFTUyBzZWxlY3RlZCAiYWJjIgorUEFTUyBzZWxlY3RlZCAiYWJjQUIiCitQQVNTIHNl
bGVjdGVkICJhYmNBIgorUEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorU2VsZWN0aW5nIGZyb20gcmln
aHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBz
ZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiY0FCQyIKK1BBU1Mgc2VsZWN0ZWQgImJjQUJD
IgorUEFTUyBzZWxlY3RlZCAiYWJjQUJDIgorCitUZXN0ICJBQkNkZWYiIGluICJBQkNkZWYiOgor
U2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2Vs
ZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorUEFTUyBzZWxlY3RlZCAiQUJDZCIKK0ZB
SUwgc2VsZWN0ZWQgIkFCQ2RlIiBidXQgZXhwZWN0ZWQgIkFCQ2VmIgorUEFTUyBzZWxlY3RlZCAi
QUJDZGVmIgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiZiIK
K1BBU1Mgc2VsZWN0ZWQgImVmIgorUEFTUyBzZWxlY3RlZCAiZGVmIgorUEFTUyBzZWxlY3RlZCAi
QkNkZWYiCitQQVNTIHNlbGVjdGVkICJDZGVmIgorUEFTUyBzZWxlY3RlZCAiQUJDZGVmIgorCitU
ZXN0ICJBQkMiIGluICJhYmNBQkNkZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAor
UEFTUyBzZWxlY3RlZCAiQyIKK1BBU1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJD
IgorU2VsZWN0aW5nIGZyb20gcmlnaHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mg
c2VsZWN0ZWQgIkFCIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorCitUZXN0ICJBQkMiIGluICJBQkNk
ZWYiOgorU2VsZWN0aW5nIGZyb20gbGVmdCB0byByaWdodAorUEFTUyBzZWxlY3RlZCAiQyIKK1BB
U1Mgc2VsZWN0ZWQgIkJDIgorUEFTUyBzZWxlY3RlZCAiQUJDIgorU2VsZWN0aW5nIGZyb20gcmln
aHQgdG8gbGVmdAorUEFTUyBzZWxlY3RlZCAiQSIKK1BBU1Mgc2VsZWN0ZWQgIkFCIgorUEFTUyBz
ZWxlY3RlZCAiQUJDIgorCitUZXN0ICJlZiIgaW4gIkFCQ2RlZiI6CitTZWxlY3RpbmcgZnJvbSBs
ZWZ0IHRvIHJpZ2h0CitQQVNTIHNlbGVjdGVkICJlIgorUEFTUyBzZWxlY3RlZCAiZWYiCitTZWxl
Y3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJmIgorUEFTUyBzZWxlY3Rl
ZCAiZWYiCisKK1Rlc3QgIkFCIiBpbiAiYWJjQUJDIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8g
cmlnaHQKK1BBU1Mgc2VsZWN0ZWQgIkIiCitQQVNTIHNlbGVjdGVkICJBQiIKK1NlbGVjdGluZyBm
cm9tIHJpZ2h0IHRvIGxlZnQKK1BBU1Mgc2VsZWN0ZWQgIkEiCitQQVNTIHNlbGVjdGVkICJBQiIK
KworVGVzdCAiMTIiIGluICJhWE0xMkpOZCI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0
CitQQVNTIHNlbGVjdGVkICIxIgorUEFTUyBzZWxlY3RlZCAiMTIiCitTZWxlY3RpbmcgZnJvbSBy
aWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICIyIgorUEFTUyBzZWxlY3RlZCAiMTIiCisKK1Rl
c3QgIkFCQyAxMjMiIGluICJBQkMgMTIzIjoKK1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQK
K1BBU1Mgc2VsZWN0ZWQgIjEiCitQQVNTIHNlbGVjdGVkICIxMiIKK1BBU1Mgc2VsZWN0ZWQgIjEy
MyIKK1BBU1Mgc2VsZWN0ZWQgIiAxMjMiCitQQVNTIHNlbGVjdGVkICJDIDEyMyIKK1BBU1Mgc2Vs
ZWN0ZWQgIkJDIDEyMyIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxMjMiCitTZWxlY3RpbmcgZnJvbSBy
aWdodCB0byBsZWZ0CitQQVNTIHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNT
IHNlbGVjdGVkICJBQkMiCitQQVNTIHNlbGVjdGVkICJBQkMgIgorUEFTUyBzZWxlY3RlZCAiQUJD
IDEyIgorUEFTUyBzZWxlY3RlZCAiQUJDIDEiCitQQVNTIHNlbGVjdGVkICJBQkMgMTIzIgorCitU
ZXN0ICJBQkMgMTIzIiBpbiAiQUJDIDEyMyI6CitTZWxlY3RpbmcgZnJvbSBsZWZ0IHRvIHJpZ2h0
CitQQVNTIHNlbGVjdGVkICIxIgorUEFTUyBzZWxlY3RlZCAiMTIiCitGQUlMIHNlbGVjdGVkICIx
MjMiIGJ1dCBleHBlY3RlZCAiIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIiAiIGJ1dCBleHBlY3RlZCAi
QyAxMjMiCitGQUlMIHNlbGVjdGVkICJDICIgYnV0IGV4cGVjdGVkICJCQyAxMjMiCitGQUlMIHNl
bGVjdGVkICJCQyAiIGJ1dCBleHBlY3RlZCAiQUJDIDEyMyIKK0ZBSUwgc2VsZWN0ZWQgIjEyMyIg
YnV0IGV4cGVjdGVkICJ1bmRlZmluZWQiCitTZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0CitQ
QVNTIHNlbGVjdGVkICJBIgorUEFTUyBzZWxlY3RlZCAiQUIiCitQQVNTIHNlbGVjdGVkICJBQkMi
CitGQUlMIHNlbGVjdGVkICIiIGJ1dCBleHBlY3RlZCAiQUJDICIKK1BBU1Mgc2VsZWN0ZWQgIkFC
QyAxMiIKK1BBU1Mgc2VsZWN0ZWQgIkFCQyAxIgorRkFJTCBzZWxlY3RlZCAiMTIzIiBidXQgZXhw
ZWN0ZWQgIkFCQyAxMjMiCisKK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVT
VCBDT01QTEVURQorCisKKworCisKSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9u
L3NlbGVjdC1iaWRpLXJ1bi5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcv
c2VsZWN0aW9uL3NlbGVjdC1iaWRpLXJ1bi5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVz
dHMvZWRpdGluZy9zZWxlY3Rpb24vc2VsZWN0LWJpZGktcnVuLmh0bWwJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsMTQxIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBo
dHRwLWVxdWl2PSJjb250ZW50LXR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYt
OCI+Cis8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2Zhc3QvanMvcmVzb3VyY2Vz
L2pzLXRlc3Qtc3R5bGUuY3NzIj4KKzxzY3JpcHQgc3JjPSIuLi8uLi9mYXN0L2pzL3Jlc291cmNl
cy9qcy10ZXN0LXByZS5qcyI+PC9zY3JpcHQ+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorI3Rl
c3RzIHsgZm9udC1zaXplOiAyLjVlbTsgcGFkZGluZzogMHB4OyBtYXJnaW46IDBweDsgfQorZHQg
eyB3aWR0aDogMTVleDsgcGFkZGluZzogMHB4IDEwcHg7IG1hcmdpbjogMHB4OyB9CitkZCB7IGZv
bnQtc2l6ZTogMC42ZW07IG1hcmdpbjogMHB4OyBwYWRkaW5nOiAwcHggMTBweDsgfQorLnRhcmdl
dCB7IGJhY2tncm91bmQtY29sb3I6ICNiYmVlZmY7IH0KKzwvc3R5bGU+Cis8L2hlYWQ+Cis8Ym9k
eT4KKzxwPlRoaXMgdGVzdCBlbnN1cmVzIFdlYktpdCBsZXRzIHVzZXIgc2VsZWN0IGJpZGlyZWN0
aW9uYWwgdGV4dCBpbnR1aXRpdmVseS4KK1RvIG1hbnVhbGx5IHRlc3QsIHNlbGVjdCB0ZXh0IGlu
IGJsdWUgYm94IGluIGVhY2ggdGVzdCBjYXNlIGJlbG93IGJ5IGEgbW91c2UgZHJhZyBmcm9tIGxl
ZnQgdG8gcmlnaHQuCitUaGUgY2hhbmdlcyBpbiB0aGUgc2VsZWN0ZWQgdGV4dCBzaG91bGQgbWF0
Y2ggdGhlIGV4cGVjdGF0aW9ucyBiZWZvcmUgfC4KK0RvIHRoZSBzYW1lIGJ5IGEgbW91c2UgZHJh
ZyBmcm9tIHJpZ2h0IHRvIGxlZnQgYW5kIGV4cGVjdGF0aW9ucyBhcmUgYWZ0ZXIgfC48L3A+Cis8
ZGl2PlNlbGVjdGVkIHRleHQ6IDxzcGFuIGlkPSJsb2ciPjwvc3Bhbj48L2Rpdj4KKzxkbCBpZD0i
dGVzdHMiPgorPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij5hYmPXkNeR
15I8L3NwYW4+PC9kdD4KKzxkZD5hLGFiLGFiYyxhYmNBQixhYmNBLGFiY0FCQ3xBLEFCLEFCQyxj
QUJDLGJjQUJDLGFiY0FCQzwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+PHNwYW4gY2xhc3M9
InRhcmdldCI+15DXkdeSZGVmPC9zcGFuPjwvZHQ+Cis8ZGQ+QyxCQyxBQkMsQUJDZCxBQkNlZixB
QkNkZWZ8ZixlZixkZWYsQkNkZWYsQ2RlZixBQkNkZWY8L2RkPgorCis8ZHQgY29udGVudGVkaXRh
YmxlPmFiYzxzcGFuIGNsYXNzPSJ0YXJnZXQiPteQ15HXkjwvc3Bhbj5kZWY8L2R0PgorPGRkPkMs
QkMsQUJDfEEsQUIsQUJDPC9kZD4KKworPGR0IGRpcj0icnRsIiBjb250ZW50ZWRpdGFibGU+PHNw
YW4gY2xhc3M9InRhcmdldCI+15DXkdeSPC9zcGFuPmRlZjwvZHQ+Cis8ZGQ+QyxCQyxBQkN8QSxB
QixBQkM8L2RkPgorCis8ZHQgZGlyPSJydGwiPteQ15HXkmQ8c3BhbiBjbGFzcz0idGFyZ2V0Ij5l
Zjwvc3Bhbj48L2R0PgorPGRkPmUsZWZ8ZixlZjwvZGQ+CisKKzxkdCBjb250ZW50ZWRpdGFibGU+
YWJjPHNwYW4gY2xhc3M9InRhcmdldCI+15DXkTwvc3Bhbj7XkjwvZHQ+Cis8ZGQ+QixBQnxBLEFC
PC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT5h16fXnDxzcGFuIGNsYXNzPSJ0YXJnZXQiPjEy
PC9zcGFuPteZ151kPC9kdD4KKzxkZD4xLDEyfDIsMTI8L2RkPgorCis8ZHQgY29udGVudGVkaXRh
YmxlIGRpcj0icnRsIj48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzPC9zcGFuPjwvZHQ+
Cis8ZGQ+MSwxMiwxMjMsIDEyMyxDIDEyMyxCQyAxMjMsQUJDIDEyM3xBLEFCLEFCQyxBQkMgLEFC
QyAxMixBQkMgMSxBQkMgMTIzPC9kZD4KKworPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFz
cz0idGFyZ2V0Ij7XkNeR15IgMTIzPC9zcGFuPjwvZHQ+Cis8ZGQ+MSwxMiwgMTIzLEMgMTIzLEJD
IDEyMyxBQkMgMTIzfEEsQUIsQUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFCQyAxMjM8L2RkPgorCis8
IS0tPGR0IGNvbnRlbnRlZGl0YWJsZT48c3BhbiBjbGFzcz0idGFyZ2V0Ij7XkNeR15IgMTIzIC0g
NDU2PC9zcGFuPjwvZHQ+Cis8ZGQ+MSwxMiwgMTIzLEMgMTIzLEJDIDEyMyxBQkMgMTIzfEEsQUIs
QUJDLEFCQyAsQUJDIDEyLEFCQyAxLEFCQyAxMjM8L2RkPi0tPgorCis8L2RsPgorPGRpdiBpZD0i
Y29uc29sZSI+PC9kaXY+Cis8cHJlPjxzY3JpcHQ+Cit2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRF
bGVtZW50QnlJZCgndGVzdHMnKTsKKworU3RyaW5nLnByb3RvdHlwZS5mb2xkID0gZnVuY3Rpb24g
KCkgeworICAgIHZhciByZXN1bHQgPSAnJzsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMu
bGVuZ3RoOyBpKyspIHsKKyAgICAgICAgdmFyIGNvZGUgPSB0aGlzLmNoYXJDb2RlQXQoaSk7Cisg
ICAgICAgIGlmICgweDA1ZDAgPD0gY29kZSAmJiBjb2RlIDw9IDB4MDVlYSkvLyBIZWJyZXcgQWxl
ZgorICAgICAgICAgICAgY29kZSArPSAtMHgwNWQwICsgJ0EnLmNoYXJDb2RlQXQoMCk7CisgICAg
ICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpOworICAgIH0KKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitmdW5jdGlvbiBhc3NlcnRFcXVhbChleHBlY3RlZCwgYWN0dWFsKSB7
CisgICAgZG9jdW1lbnQud3JpdGVsbignRTonICsgZXhwZWN0ZWQgKyAnIEE6JyArIGFjdHVhbCk7
Cit9CisKK2Z1bmN0aW9uIHNlbGVjdEJ5TW91c2VEcmFnQW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwg
bGVmdFRvUmlnaHQsIGV4cGVjdGF0aW9ucykgeworICAgIHZhciB5ID0gdGFyZ2V0Lm9mZnNldFRv
cCArIHRhcmdldC5vZmZzZXRIZWlnaHQgLyAyOworICAgIHZhciBsZWZ0ID0gdGFyZ2V0Lm9mZnNl
dExlZnQ7CisKKyAgICB2YXIgc3RhcnRYID0gbGVmdCArIChsZWZ0VG9SaWdodCA/IDAgOiB0YXJn
ZXQub2Zmc2V0V2lkdGgpOworICAgIGV2ZW50U2VuZGVyLmRyYWdNb2RlID0gZmFsc2U7CisgICAg
ZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMzAwMCk7CisgICAgZXZlbnRTZW5kZXIubW91c2VNb3Zl
VG8oc3RhcnRYLCB5KTsKKyAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKworICAgIHZhciBw
cmV2aW91c1NlbGVjdGVkVGV4dCA9ICcnOworICAgIHZhciBqID0gMDsKKyAgICB2YXIgeEluY3Jl
bWVudCA9IGxlZnRUb1JpZ2h0ID8gMSA6IC0xOworICAgIGZvciAodmFyIHggPSBzdGFydFg7IGxl
ZnQgPD0geCAmJiB4IDw9IGxlZnQgKyB0YXJnZXQub2Zmc2V0V2lkdGg7IHggKz0geEluY3JlbWVu
dCkgeworICAgICAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgxMDApOworICAgICAgICBldmVu
dFNlbmRlci5tb3VzZU1vdmVUbyh4LCB5KTsKKworICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0g
d2luZG93LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkuZm9sZCgpOworICAgICAgICBpZiAocHJl
dmlvdXNTZWxlY3RlZFRleHQgIT0gc2VsZWN0ZWRUZXh0KSB7CisgICAgICAgICAgICBpZiAoZXhw
ZWN0YXRpb25zW2pdID09IHNlbGVjdGVkVGV4dCkKKyAgICAgICAgICAgICAgICB0ZXN0UGFzc2Vk
KCdzZWxlY3RlZCAiJyArIHNlbGVjdGVkVGV4dCArICciJyk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgdGVzdEZhaWxlZCgnc2VsZWN0ZWQgIicgKyBzZWxlY3RlZFRleHQgKyAn
IiBidXQgZXhwZWN0ZWQgIicgKyBleHBlY3RhdGlvbnNbal0gKyAnIicpOworICAgICAgICAgICAg
cHJldmlvdXNTZWxlY3RlZFRleHQgPSBzZWxlY3RlZFRleHQ7CisgICAgICAgICAgICBqKys7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Cit9CisKK2lmICh3
aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5k
dW1wQXNUZXh0KCk7CisKKyAgICB2YXIgdGVzdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgn
dGVzdHMnKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgnZHQnKTsKKyAgICB2YXIgdGVzdEV4cGVjdGF0
aW9ucyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLmdldEVsZW1lbnRzQnlUYWdO
YW1lKCdkZCcpOworCisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7IGkrKykg
eyAgICAgICAgCisgICAgICAgIHRlc3RzW2ldLnN0eWxlLmRpc3BsYXkgPSBudWxsOworICAgICAg
ICB0ZXN0RXhwZWN0YXRpb25zW2ldLnN0eWxlLmRpc3BsYXkgPSBudWxsOworCisgICAgICAgIHZh
ciB0YXJnZXQgPSB0ZXN0c1tpXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0YXJnZXQnKVswXTsK
KyAgICAgICAgdmFyIHRlc3RFeHBlY3RhdGlvbiA9IHRlc3RFeHBlY3RhdGlvbnNbaV0udGV4dENv
bnRlbnQ7CisKKyAgICAgICAgZGVidWcoJ1Rlc3QgIicgKyB0YXJnZXQudGV4dENvbnRlbnQuZm9s
ZCgpICsgJyIgaW4gIicgKyB0YXJnZXQucGFyZW50Tm9kZS50ZXh0Q29udGVudC5mb2xkKCkgKyAn
IjonKTsKKyAgICAgICAgZGVidWcoJ1NlbGVjdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQnKTsKKyAg
ICAgICAgc2VsZWN0QnlNb3VzZURyYWdBbmRWZXJpZnlSZXN1bHQodGFyZ2V0LCB0cnVlLCB0ZXN0
RXhwZWN0YXRpb24uc3BsaXQoL1x8LylbMF0uc3BsaXQoLywvKSk7CisgICAgICAgIGRlYnVnKCdT
ZWxlY3RpbmcgZnJvbSByaWdodCB0byBsZWZ0Jyk7CisgICAgICAgIHNlbGVjdEJ5TW91c2VEcmFn
QW5kVmVyaWZ5UmVzdWx0KHRhcmdldCwgZmFsc2UsIHRlc3RFeHBlY3RhdGlvbi5zcGxpdCgvXHwv
KVsxXS5zcGxpdCgvLC8pKTsKKyAgICAgICAgZGVidWcoJycpOworCisgICAgICAgIC8vIFNvbWUg
dGVzdHMgbWF5IGJlIG91c2lkZSBvZiB0aGUgd2luZG93IHNvIGJyaW5nIHRoZW0gaW4gYXMgd2Ug
cHJvY2Vzcy4KKyAgICAgICAgdGVzdHNbaV0uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKKyAgICAg
ICAgdGVzdEV4cGVjdGF0aW9uc1tpXS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOworICAgIH0KKwor
ICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cycpLnN0eWxlLmRpc3BsYXkgPSAnbm9u
ZSc7CisgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZycpLnBhcmVudE5vZGUuc3R5bGUu
ZGlzcGxheSA9ICdub25lJzsKK30gZWxzZSB7CisgICAgZGVidWcoJ1RoaXMgdGVzdCByZXF1aXJl
cyBldmVudFNlbmRlcicpOworICAgIGRvY3VtZW50Lm9uc2VsZWN0aW9uY2hhbmdlID0gZnVuY3Rp
b24gKCkgeworICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJykudGV4dENvbnRl
bnQgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5mb2xkKCk7CisgICAgfQorfQor
Cit2YXIgc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsKKworPC9zY3JpcHQ+Cis8c2NyaXB0IHNy
Yz0iLi4vLi4vZmFzdC9qcy9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwv
Ym9keT4KKzwvaHRtbD4K
</data>
<flag name="review"
          id="105132"
          type_id="1"
          status="+"
          setter="eric"
    />
    <flag name="commit-queue"
          id="105177"
          type_id="3"
          status="-"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>