<?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>63384</bug_id>
          
          <creation_ts>2011-06-25 12:54:57 -0700</creation_ts>
          <short_desc>Stop instantiating Position with PositionIsOffsetInAnchor in various files</short_desc>
          <delta_ts>2011-06-28 13:07:37 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>63040</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>enrica</cc>
    
    <cc>eric</cc>
    
    <cc>leviw</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>427410</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-25 12:54:57 -0700</bug_when>
    <thetext>This is a refactoring to resolve the 63040.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427415</commentid>
    <comment_count>1</comment_count>
      <attachid>98601</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-25 13:12:10 -0700</bug_when>
    <thetext>Created attachment 98601
63384</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427416</commentid>
    <comment_count>2</comment_count>
      <attachid>98601</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-25 13:16:32 -0700</bug_when>
    <thetext>Comment on attachment 98601
63384

Attachment 98601 did not pass chromium-ews (chromium-xvfb):
Output: http://queues.webkit.org/results/8934867</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427418</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-25 13:17:16 -0700</bug_when>
    <thetext>I&apos;ve got rid of all calls to old constructor.  After this patch there will be 30 lines in WebCore that calls the old constructor:

Source/WebCore/accessibility/AccessibilityRenderObject.cpp:2061:    frame-&gt;selection()-&gt;setSelection(VisibleSelection(Position(node, range.start, Position::PositionIsOffsetInAnchor),
Source/WebCore/accessibility/AccessibilityRenderObject.cpp:2062:        Position(node, range.start + range.length, Position::PositionIsOffsetInAnchor), DOWNSTREAM));
Source/WebCore/accessibility/AccessibilityRenderObject.cpp:2496:    return VisiblePosition(Position(it.range()-&gt;endContainer(ec), it.range()-&gt;endOffset(ec), Position::PositionIsOffsetInAnchor), UPSTREAM);
Source/WebCore/dom/Position.cpp:191:        return Position(m_anchorNode.get(), 0, PositionIsOffsetInAnchor);
Source/WebCore/dom/Position.cpp:200:    return Position(containerNode(), computeOffsetInContainerNode(), PositionIsOffsetInAnchor);
Source/WebCore/dom/Position.h:240:    return Position(node-&gt;nonShadowBoundaryParentNode(), node-&gt;nodeIndex(), Position::PositionIsOffsetInAnchor);
Source/WebCore/dom/Position.h:246:    return Position(node-&gt;nonShadowBoundaryParentNode(), node-&gt;nodeIndex() + 1, Position::PositionIsOffsetInAnchor);
Source/WebCore/dom/Position.h:271:        return Position(anchorNode, 0, Position::PositionIsOffsetInAnchor);
Source/WebCore/dom/Position.h:278:        return Position(anchorNode, lastOffsetInNode(anchorNode), Position::PositionIsOffsetInAnchor);
Source/WebCore/dom/Range.cpp:1589:    VisiblePosition visiblePosition = Position(m_start.container(), m_start.offset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/ApplyStyleCommand.cpp:1264:        updateStartEnd(Position(startNode, startOffsetAdjustment, Position::PositionIsOffsetInAnchor),
Source/WebCore/editing/ApplyStyleCommand.cpp:1265:                       Position(end.deprecatedNode(), end.deprecatedEditingOffset() + endOffsetAdjustment, Position::PositionIsOffsetInAnchor)); 
Source/WebCore/editing/ApplyStyleCommand.cpp:1302:        updateStartEnd(shouldUpdateStart ? Position(nextElement, start.offsetInContainerNode(), Position::PositionIsOffsetInAnchor) : start,
Source/WebCore/editing/ApplyStyleCommand.cpp:1303:                       Position(nextElement, endOffset, Position::PositionIsOffsetInAnchor));
Source/WebCore/editing/FrameSelection.cpp:1408:    VisiblePosition beforeOwnerElement(VisiblePosition(Position(ownerElementParent, ownerElementNodeIndex, Position::PositionIsOffsetInAnchor)));
Source/WebCore/editing/FrameSelection.cpp:1409:    VisiblePosition afterOwnerElement(VisiblePosition(Position(ownerElementParent, ownerElementNodeIndex + 1, Position::PositionIsOffsetInAnchor), VP_UPSTREAM_IF_POSSIBLE));
Source/WebCore/editing/TextIterator.cpp:871:    VisiblePosition startPos = VisiblePosition(Position(m_startContainer, m_startOffset, Position::PositionIsOffsetInAnchor), DOWNSTREAM);
Source/WebCore/editing/TypingCommand.cpp:620:                extent = Position(extent.containerNode(), extent.computeOffsetInContainerNode() + extraCharacters, Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1083:    VisiblePosition visPos = logicalStartNode-&gt;isTextNode() ? VisiblePosition(Position(logicalStartNode, logicalStartBox-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor), DOWNSTREAM)
Source/WebCore/editing/visible_units.cpp:1130:        pos = Position(logicalEndNode, endOffset, Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1191:        wordBreak = Position(box-&gt;renderer()-&gt;node(), box-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1234:        return Position(node, box-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1238:            return Position(previousLeaf-&gt;renderer()-&gt;node(), previousLeaf-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1245:        return Position(lastRTLLeaf-&gt;renderer()-&gt;node(), lastRTLLeaf-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1248:    return Position(node, box-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1259:        return Position(node, box-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1263:            return Position(nextLeaf-&gt;renderer()-&gt;node(), nextLeaf-&gt;caretMaxOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1270:        return Position(firstLTRLeaf-&gt;renderer()-&gt;node(), firstLTRLeaf-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1273:    return Position(node, box-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);
Source/WebCore/editing/visible_units.cpp:1323:    VisiblePosition wordBreak = hasSeenWordBreakInThisBox ? previousWordBreak : Position(box-&gt;renderer()-&gt;node(), box-&gt;caretMinOffset(), Position::PositionIsOffsetInAnchor);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427420</commentid>
    <comment_count>4</comment_count>
      <attachid>98601</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-06-25 13:19:59 -0700</bug_when>
    <thetext>Comment on attachment 98601
63384

Attachment 98601 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/8931926</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427422</commentid>
    <comment_count>5</comment_count>
      <attachid>98601</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-25 13:25:29 -0700</bug_when>
    <thetext>Comment on attachment 98601
63384

Attachment 98601 did not pass cr-mac-ews (chromium):
Output: http://queues.webkit.org/results/8933923</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427429</commentid>
    <comment_count>6</comment_count>
      <attachid>98604</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-25 14:00:06 -0700</bug_when>
    <thetext>Created attachment 98604
fixed build</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427770</commentid>
    <comment_count>7</comment_count>
      <attachid>98604</attachid>
    <who name="Hajime Morrita">morrita</who>
    <bug_when>2011-06-27 01:36:37 -0700</bug_when>
    <thetext>Comment on attachment 98604
fixed build

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

I hope we have TextPosition class which is a subtype of Position, and provides text-based position specific helper methods.
It is another story and should be another bug, though.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:197
&gt; +                end = Position(static_cast&lt;Text*&gt;(start.containerNode()), end.offsetInContainerNode() - startOffset);

It looks we should have containerText() or something and encapsulate static_cast&lt;&gt; into it.
By doing so, we can assert nodeType() in that method. raw static_cast is makes my heart weak. Especially the method is named containerNode().

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:250
&gt; +    if (containerNode.get() == start.containerNode() &amp;&amp; containerNode-&gt;previousSibling() &amp;&amp; containerNode-&gt;previousSibling()-&gt;isTextNode()) {

It it possible for text node to have non-text sibling?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428545</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-27 18:26:12 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 98604 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=98604&amp;action=review
&gt; 
&gt; I hope we have TextPosition class which is a subtype of Position, and provides text-based position specific helper methods.

That&apos;ll be tricky because Position is a stack-allocated object (unless you new/malloc yourself).

&gt; &gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:197
&gt; &gt; +                end = Position(static_cast&lt;Text*&gt;(start.containerNode()), end.offsetInContainerNode() - startOffset);
&gt; 
&gt; It looks we should have containerText() or something and encapsulate static_cast&lt;&gt; into it.
&gt; By doing so, we can assert nodeType() in that method. raw static_cast is makes my heart weak. Especially the method is named containerNode().

That&apos;s a good idea.  Will add one.

&gt; &gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:250
&gt; &gt; +    if (containerNode.get() == start.containerNode() &amp;&amp; containerNode-&gt;previousSibling() &amp;&amp; containerNode-&gt;previousSibling()-&gt;isTextNode()) {
&gt; 
&gt; It it possible for text node to have non-text sibling?

Yes. Scripts can modify it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428568</commentid>
    <comment_count>9</comment_count>
      <attachid>98844</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-27 19:11:00 -0700</bug_when>
    <thetext>Created attachment 98844
Added containerText</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428891</commentid>
    <comment_count>10</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 08:17:43 -0700</bug_when>
    <thetext>Ping reviewers</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428932</commentid>
    <comment_count>11</comment_count>
      <attachid>98844</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-06-28 09:49:38 -0700</bug_when>
    <thetext>Comment on attachment 98844
Added containerText

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

&gt; Source/WebCore/dom/Position.cpp:95
&gt; +    ASSERT(!((anchorType == PositionIsBeforeChildren || anchorType == PositionIsAfterChildren)
&gt; +             &amp;&amp; (m_anchorNode-&gt;isTextNode() || editingIgnoresContent(m_anchorNode.get()))));

Normally we’d not line up the &amp;&amp; with the parenthesis, and just indent it 4 characters. Or we’d leave this all in one big if statement. Or even make a helper so this assertion is easier to read and shorter.

&gt; Source/WebCore/dom/Position.cpp:152
&gt; +Text* Position::containerText() const

I’m a little confused about the rules for when this function returns 0 and when it’s illegal to call the function. It seems that for PositionIsBeforeChildren and PositionIsAfterChildren it’s illegal to even call the function. Why is that? And why not the same rule for the other anchor types.

I’m guessing some of this strangeness might be shared by the containerNode function. I’d like to understand the rationale for when this returns 0 and when it asserts.

&gt; Source/WebCore/dom/Position.cpp:155
&gt; +    if (!m_anchorNode || !m_anchorNode-&gt;isTextNode())
&gt; +        return 0;

Strange to not check the anchor type when the anchor node happens to not be a text node. It would be more natural to have the isTextNode check be inside the switch statement just before the return statement.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:193
&gt; +            splitTextNode(start.containerText(), startOffset);

For uses like this it might be good to have a containerText function that asserts it’s non-zero rather than one that returns 0 if it’s not text or a null position or whatever. I think it makes sense to have a function that is only callable when you know the container is a text node.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:194
&gt; +            start = firstPositionInNode(start.containerNode());

It seems a little strange to get the container again right after getting it on the previous line. This was less strange when this was a free getter, but now that it does some additional checking it’s a little irritating that it does it twice.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:197
&gt; +                end = Position(start.containerText(), end.offsetInContainerNode() - startOffset);

Not twice, three times!

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:201
&gt; +                m_endOfLastParagraph = Position(start.containerText(), m_endOfLastParagraph.offsetInContainerNode() - startOffset);

Four times!

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:250
&gt; +    if (containerNode.get() == start.containerNode() &amp;&amp; containerNode-&gt;previousSibling() &amp;&amp; containerNode-&gt;previousSibling()-&gt;isTextNode()) {

Should not need the get() here.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:254
&gt; +    if (containerNode.get() == end.containerNode() &amp;&amp; containerNode-&gt;previousSibling() &amp;&amp; containerNode-&gt;previousSibling()-&gt;isTextNode()) {

Should not need the get() here.

&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:258
&gt; +    if (containerNode.get() == m_endOfLastParagraph.containerNode()) {

Should not need the get() here.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);

A general pattern here seems to be re-fetching the same node over and over again. Can we maybe use RefPtr&lt;Text&gt; a bit to avoid that. Not sure what the best style is.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428941</commentid>
    <comment_count>12</comment_count>
      <attachid>98844</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 10:11:35 -0700</bug_when>
    <thetext>Comment on attachment 98844
Added containerText

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

&gt;&gt; Source/WebCore/dom/Position.cpp:95
&gt;&gt; +             &amp;&amp; (m_anchorNode-&gt;isTextNode() || editingIgnoresContent(m_anchorNode.get()))));
&gt; 
&gt; Normally we’d not line up the &amp;&amp; with the parenthesis, and just indent it 4 characters. Or we’d leave this all in one big if statement. Or even make a helper so this assertion is easier to read and shorter.

Oops, I forgot to fix it.  Will fix.

&gt;&gt; Source/WebCore/dom/Position.cpp:152
&gt;&gt; +Text* Position::containerText() const
&gt; 
&gt; I’m a little confused about the rules for when this function returns 0 and when it’s illegal to call the function. It seems that for PositionIsBeforeChildren and PositionIsAfterChildren it’s illegal to even call the function. Why is that? And why not the same rule for the other anchor types.
&gt; 
&gt; I’m guessing some of this strangeness might be shared by the containerNode function. I’d like to understand the rationale for when this returns 0 and when it asserts.

So the idea is that if m_anchorNode is not a text, then we&apos;ll return 0 regardless of m_anchorType. Now if the anchor node is a text node, then the anchor type should NOT be PositionIsBeforeChildren or PositionIsAfterChildren because a text node cannot have children.

&gt;&gt; Source/WebCore/dom/Position.cpp:155
&gt;&gt; +        return 0;
&gt; 
&gt; Strange to not check the anchor type when the anchor node happens to not be a text node. It would be more natural to have the isTextNode check be inside the switch statement just before the return statement.

I guess I can switch it around.  Do you strongly prefer me to make that change?

&gt;&gt; Source/WebCore/editing/ApplyBlockElementCommand.cpp:201
&gt;&gt; +                m_endOfLastParagraph = Position(start.containerText(), m_endOfLastParagraph.offsetInContainerNode() - startOffset);
&gt; 
&gt; Four times!

I&apos;ll add a local variable here.

&gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt;&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);
&gt; 
&gt; A general pattern here seems to be re-fetching the same node over and over again. Can we maybe use RefPtr&lt;Text&gt; a bit to avoid that. Not sure what the best style is.

We could but I&apos;m not sure how much of benefit we&apos;d get out of that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>428944</commentid>
    <comment_count>13</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-06-28 10:18:56 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; &gt;&gt; Source/WebCore/dom/Position.cpp:152
&gt; &gt;&gt; +Text* Position::containerText() const
&gt; &gt; 
&gt; &gt; I’m a little confused about the rules for when this function returns 0 and when it’s illegal to call the function. It seems that for PositionIsBeforeChildren and PositionIsAfterChildren it’s illegal to even call the function. Why is that? And why not the same rule for the other anchor types.
&gt; &gt; 
&gt; &gt; I’m guessing some of this strangeness might be shared by the containerNode function. I’d like to understand the rationale for when this returns 0 and when it asserts.
&gt; 
&gt; So the idea is that if m_anchorNode is not a text, then we&apos;ll return 0 regardless of m_anchorType. Now if the anchor node is a text node, then the anchor type should NOT be PositionIsBeforeChildren or PositionIsAfterChildren because a text node cannot have children.
&gt; 
&gt; &gt;&gt; Source/WebCore/dom/Position.cpp:155
&gt; &gt;&gt; +        return 0;
&gt; &gt; 
&gt; &gt; Strange to not check the anchor type when the anchor node happens to not be a text node. It would be more natural to have the isTextNode check be inside the switch statement just before the return statement.
&gt; 
&gt; I guess I can switch it around.  Do you strongly prefer me to make that change?

I think what you’re saying is that it’s always legal to call containerText on any Position. The assertion will only happen if somehow we have an impossible, badly formed, Position. It’s never the caller’s fault.

That seems like a fine design, but was not clear from the code. Maybe a small comment would clear this up, but I guess it’s OK as is.

&gt; &gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt; &gt;&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);
&gt; &gt; 
&gt; &gt; A general pattern here seems to be re-fetching the same node over and over again. Can we maybe use RefPtr&lt;Text&gt; a bit to avoid that. Not sure what the best style is.
&gt; 
&gt; We could but I&apos;m not sure how much of benefit we&apos;d get out of that.

Not sure, I think we’d get some clarity from it. The expressions in these functions are getting so long that some simpler names for things could be a big help.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429012</commentid>
    <comment_count>14</comment_count>
      <attachid>98844</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 11:21:59 -0700</bug_when>
    <thetext>Comment on attachment 98844
Added containerText

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

&gt;&gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt;&gt;&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);
&gt;&gt; 
&gt;&gt; A general pattern here seems to be re-fetching the same node over and over again. Can we maybe use RefPtr&lt;Text&gt; a bit to avoid that. Not sure what the best style is.
&gt; 
&gt; We could but I&apos;m not sure how much of benefit we&apos;d get out of that.

Oh wait, we&apos;re calling containerNode/containerText on end / start so I don&apos;t think we can use RefPtr&lt;Text&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429025</commentid>
    <comment_count>15</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 11:27:59 -0700</bug_when>
    <thetext>I&apos;ll re-submit my patch for another review even though darin r+ed it because I&apos;ve made quite few changes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429033</commentid>
    <comment_count>16</comment_count>
      <attachid>98951</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 11:32:22 -0700</bug_when>
    <thetext>Created attachment 98951
Fixed per comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429060</commentid>
    <comment_count>17</comment_count>
      <attachid>98951</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-06-28 12:09:15 -0700</bug_when>
    <thetext>Comment on attachment 98951
Fixed per comments

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

&gt; Source/WebCore/dom/Position.cpp:156
&gt; +            return m_anchorNode &amp;&amp; m_anchorNode-&gt;isTextNode() ? static_cast&lt;Text*&gt;(m_anchorNode.get()) : 0;

Wrong indentation here.

&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);

This could be text instead of start.containerNode().

&gt; Source/WebCore/editing/VisiblePosition.cpp:-557
&gt; -    unsigned length = textNode-&gt;length();

Why did you get rid of this local variable?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429062</commentid>
    <comment_count>18</comment_count>
      <attachid>98951</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 12:14:12 -0700</bug_when>
    <thetext>Comment on attachment 98951
Fixed per comments

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

&gt;&gt; Source/WebCore/dom/Position.cpp:156
&gt;&gt; +            return m_anchorNode &amp;&amp; m_anchorNode-&gt;isTextNode() ? static_cast&lt;Text*&gt;(m_anchorNode.get()) : 0;
&gt; 
&gt; Wrong indentation here.

WIll fix.

&gt;&gt; Source/WebCore/editing/ApplyStyleCommand.cpp:1130
&gt;&gt; +    updateStartEnd(firstPositionInNode(start.containerNode()), newEnd);
&gt; 
&gt; This could be text instead of start.containerNode().

Okay, will replace Text* by RefPtr&lt;Text&gt;.

&gt;&gt; Source/WebCore/editing/VisiblePosition.cpp:-557
&gt;&gt; -    unsigned length = textNode-&gt;length();
&gt; 
&gt; Why did you get rid of this local variable?

Oops, that was unintentional.  Will revert.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>429090</commentid>
    <comment_count>19</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2011-06-28 13:07:37 -0700</bug_when>
    <thetext>Committed r89952: &lt;http://trac.webkit.org/changeset/89952&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98601</attachid>
            <date>2011-06-25 13:12:10 -0700</date>
            <delta_ts>2011-06-25 14:00:01 -0700</delta_ts>
            <desc>63384</desc>
            <filename>bug-63384-20110625131209.patch</filename>
            <type>text/plain</type>
            <size>28784</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg5NzQ3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTAgQEAKKzIwMTEtMDYtMjUgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgU3RvcCBpbnN0YW50aWF0aW5nIFBvc2l0aW9uIHdpdGggUG9zaXRp
b25Jc09mZnNldEluQW5jaG9yIGluIHZhcmlvdXMgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzg0CisKKyAgICAgICAgUmVmYWN0b3Jpbmcu
CisgICAgICAgIAorICAgICAgICBSZW1vdmVkIG1hbnkgaWYgY29uZGl0aW9ucyB0aGF0IGNvbXBh
cmVkIHRoZSBhbmNob3IgdHlwZSB0byBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9y
CisgICAgICAgIGJlY2F1c2UgdGhlcmUgd2VyZSBhbHNvIGNoZWNraW5nIHRoYXQgY29udGFpbmVy
Tm9kZSBpcyBhIHRleHQgbm9kZS4KKworICAgICAgICAqIGRvbS9Qb3NpdGlvbi5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpQb3NpdGlvbjo6UG9zaXRpb24pOiBBZGRlZCBhbiBhc3NlcnRpb24gdG8g
ZW5zdXJlIEJlZm9yZUNoaWxkcmVuL0FmdGVyQ2hpbGRyZW4KKyAgICAgICAgYW5jaG9yIHR5cGUg
d29uJ3QgYmUgdXNlZCBmb3IgYSBub2RlIHdob3NlIGNvbnRlbnRzIGlzIGlnbm9yZWQgYnkgZWRp
dGluZy4KKyAgICAgICAgKiBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjppc05ld0xpbmVBdFBvc2l0aW9uKTogUmVtb3ZlIGEgcmVkdW5kYW50
IGNvbXBhcmlzb24gb2YgYW5jaG9yIHR5cGUuCisgICAgICAgIChXZWJDb3JlOjpBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQ6OnJhbmdlRm9yUGFyYWdyYXBoU3BsaXR0aW5nVGV4dE5vZGVzSWZOZWVk
ZWQpOiBTaW5jZSBjb250YWluZXJOb2RlCisgICAgICAgIGlzIGFsd2F5cyBhIHRleHQgbm9kZSB3
aGVuIHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZSByZXR1cm5zIGEgcmVuZGVyIHN0eWxl
LCB1c2UgbmV3IFBvc2l0aW9uCisgICAgICAgIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgVGV4dCog
YW5kIG9mZnNldC4KKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6
ZW5kT2ZOZXh0UGFyYWdyYWhTcGxpdHRpbmdUZXh0Tm9kZXNJZk5lZWRlZCk6IFJlbW92ZWQgcmVk
dW5kYW50CisgICAgICAgIGNvbXBhcmlzb24gb2YgYW5jaG9yIHR5cGUgYW5kIHVzZSBuZXcgUG9z
aXRpb24gY29uc3RydWN0b3IgdGhhdCB0YWtlcyBUZXh0KiBhbmQgb2Zmc2V0LgorICAgICAgICAq
IGVkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlT
dHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0U3RhcnQpOiBSZXBsYWNlZCBhbiBhc3NlcnRpb24gdGhh
dCBjb21wYXJlZCBhbmNob3IgdHlwZSBieQorICAgICAgICBhbiBhc3NlcnRpb24gdGhhdCB0aGUg
Y29udGFpbmVyIG5vZGUgaXMgYSB0ZXh0IG5vZGU7IHVzZSBuZXcgY29uc3RydWN0b3IuCisgICAg
ICAgIChXZWJDb3JlOjpBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0QXRFbmQpOiBEaXR0bzsg
YWxzbyBhZGRlZCBlYXJseSBleGl0cyBpbiB0aGUgY2FzZSBzY3JpcHQKKyAgICAgICAgbW9kaWZp
ZWQgRE9NLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEVs
ZW1lbnRBdFN0YXJ0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpBcHBseVN0eWxlQ29tbWFu
ZDo6c3BsaXRUZXh0RWxlbWVudEF0RW5kKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpBcHBs
eVN0eWxlQ29tbWFuZDo6am9pbkNoaWxkVGV4dE5vZGVzKTogVXNlIG5ldyBjb25zdHJ1Y3Rvci4K
KyAgICAgICAgKiBlZGl0aW5nL0VkaXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0b3I6
OmNhbkRlbGV0ZVJhbmdlKTogQ2FsbCBSYW5nZTo6c3RhcnRQb3NpdGlvbiBpbnN0ZWFkIG9mIG1h
bnVhbGx5IGluc3RhbnRpYXRpbmcgUG9zaXRpb24KKyAgICAgICAgYnkgY2FsbGluZyBzdGFydENv
bnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6c2V0U2VsZWN0ZWRSYW5n
ZSk6IERpdHRvLgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbjo6Y2hhcmFjdGVyQWZ0ZXIpOiBSZW1vdmVkIGEg
cmVkdW5kYW50IGFuY2hvciB0eXBlIGNvbXBhcmlzb24uCisgICAgICAgIChXZWJDb3JlOjpzdGFy
dFZpc2libGVQb3NpdGlvbik6IENhbGwgUmFuZ2U6OnN0YXJ0UG9zaXRpb24gaW5zdGVhZCBvZiBz
dGFydENvbnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgIChXZWJDb3JlOjplbmRWaXNp
YmxlUG9zaXRpb24pOiBDYWxsIFJhbmdlOjplbmRQb3NpdGlvbiBpbnN0ZWFkIG9mIGVuZENvbnRh
aW5lciBhbmQgZW5kT2Zmc2V0LgorICAgICAgICAqIGVkaXRpbmcvaHRtbGVkaXRpbmcuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Zmlyc3RJblNwZWNpYWxFbGVtZW50KTogQ2FsbCBjb250YWluZXJO
b2RlKCkgdG8gYWRkcmVzcyA8cmRhcjovL3Byb2JsZW0vNTAyNzcwMj4uCisgICAgICAgIChXZWJD
b3JlOjpsYXN0SW5TcGVjaWFsRWxlbWVudCk6IERpdHRvOyB1c2UgbmV3IGNvbnN0cnVjdG9yLgor
ICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpl
bmRQb3NpdGlvbkZvckxpbmUpOiBVc2UgbmV3IGNvbnN0cnVjdG9yLgorICAgICAgICAoV2ViQ29y
ZTo6c3RhcnRPZlBhcmFncmFwaCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6ZW5kT2ZQYXJh
Z3JhcGgpOiBEaXR0by4KKwogMjAxMS0wNi0yNSAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE5pa29sYXMgWmltbWVybWFubi4KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9t
L1Bvc2l0aW9uLmNwcAkocmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vUG9z
aXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MSw3ICs5MSw4IEBAIFBvc2l0aW9uOjpQb3Np
dGlvbihQYXNzUmVmUHRyPE5vZGU+IGFuY2gKIHsKICAgICBBU1NFUlQoIW1fYW5jaG9yTm9kZSB8
fCAhbV9hbmNob3JOb2RlLT5pc1NoYWRvd1Jvb3QoKSk7CiAgICAgQVNTRVJUKGFuY2hvclR5cGUg
IT0gUG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKLSAgICBBU1NFUlQoISgoYW5jaG9yVHlwZSA9
PSBQb3NpdGlvbklzQmVmb3JlQ2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQWZ0
ZXJDaGlsZHJlbikgJiYgbV9hbmNob3JOb2RlLT5pc1RleHROb2RlKCkpKTsKKyAgICBBU1NFUlQo
ISgoYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQmVmb3JlQ2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9
PSBQb3NpdGlvbklzQWZ0ZXJDaGlsZHJlbikKKyAgICAgICAgICAgICAmJiAobV9hbmNob3JOb2Rl
LT5pc1RleHROb2RlKCkgfHwgZWRpdGluZ0lnbm9yZXNDb250ZW50KG1fYW5jaG9yTm9kZS5nZXQo
KSkpKSk7CiB9CiAKIFBvc2l0aW9uOjpQb3NpdGlvbihQYXNzUmVmUHRyPE5vZGU+IGFuY2hvck5v
ZGUsIGludCBvZmZzZXQsIEFuY2hvclR5cGUgYW5jaG9yVHlwZSkKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAJKHJldmlz
aW9uIDg5NzMxKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENv
bW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsOSArMTUwLDYgQEAgdm9pZCBBcHBseUJs
b2NrRWxlbWVudENvbW1hbmQ6OmZvcm1hdFNlbAogCiBzdGF0aWMgYm9vbCBpc05ld0xpbmVBdFBv
c2l0aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlvbikKIHsKLSAgICBpZiAocG9zaXRpb24uYW5j
aG9yVHlwZSgpICE9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQogICAgIE5vZGUqIHRleHROb2RlID0gcG9zaXRpb24uY29udGFpbmVy
Tm9kZSgpOwogICAgIGludCBvZmZzZXQgPSBwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KTsKICAgICBpZiAoIXRleHROb2RlIHx8ICF0ZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpIHx8IG9mZnNl
dCA8IDAgfHwgb2Zmc2V0ID49IHRleHROb2RlLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkKQEAgLTE4
MSw5ICsxNzgsOCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6cmFuZ2VGb3JQCiAg
ICAgc3RhcnQgPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaCkuZGVlcEVx
dWl2YWxlbnQoKTsKICAgICBlbmQgPSBlbmRPZkN1cnJlbnRQYXJhZ3JhcGguZGVlcEVxdWl2YWxl
bnQoKTsKIAotICAgIFJlbmRlclN0eWxlKiBzdGFydFN0eWxlID0gcmVuZGVyU3R5bGVPZkVuY2xv
c2luZ1RleHROb2RlKHN0YXJ0KTsKICAgICBib29sIGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlID0g
ZmFsc2U7Ci0gICAgaWYgKHN0YXJ0U3R5bGUpIHsKKyAgICBpZiAoUmVuZGVyU3R5bGUqIHN0YXJ0
U3R5bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUoc3RhcnQpKSB7CiAgICAgICAg
IGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlID0gcmVuZGVyU3R5bGVPZkVuY2xvc2luZ1RleHROb2Rl
KGVuZCkgJiYgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSA9PSBlbmQuZGVwcmVjYXRlZE5vZGUoKTsK
ICAgICAgICAgYm9vbCBpc1N0YXJ0QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSA9IHJl
bmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFncmFwaCkgJiYgc3Rh
cnQuZGVwcmVjYXRlZE5vZGUoKSA9PSBtX2VuZE9mTGFzdFBhcmFncmFwaC5kZXByZWNhdGVkTm9k
ZSgpOwogCkBAIC0xOTQsNDUgKzE5MCw0MCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFu
ZDo6cmFuZ2VGb3JQCiAgICAgICAgIC8vIElmIHN0YXJ0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSB0
ZXh0IG5vZGUsIHNwbGl0LgogICAgICAgICBpZiAoIXN0YXJ0U3R5bGUtPmNvbGxhcHNlV2hpdGVT
cGFjZSgpICYmIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpID4gMCkgewogICAgICAgICAg
ICAgaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7Ci0gICAg
ICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5kZXByZWNhdGVk
Tm9kZSgpKSwgc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgc3RhcnQgPSBmaXJzdFBvc2l0aW9u
SW5PckJlZm9yZU5vZGUoc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgICAgICAgICBzcGxp
dFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5jb250YWluZXJOb2RlKCkpLCBzdGFy
dE9mZnNldCk7CisgICAgICAgICAgICBzdGFydCA9IGZpcnN0UG9zaXRpb25Jbk5vZGUoc3RhcnQu
Y29udGFpbmVyTm9kZSgpKTsKICAgICAgICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT25TYW1lTm9k
ZSkgewogICAgICAgICAgICAgICAgIEFTU0VSVChlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkg
Pj0gc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVuZC5kZXBy
ZWNhdGVkTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydE9mZnNldCwg
UG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgICAgICAgICAgZW5k
ID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0LmNvbnRhaW5lck5vZGUoKSksIGVu
ZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSkg
ewogICAgICAgICAgICAgICAgIEFTU0VSVChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNv
bnRhaW5lck5vZGUoKSA+PSBzdGFydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgbV9lbmRPZkxh
c3RQYXJhZ3JhcGggPSBQb3NpdGlvbihtX2VuZE9mTGFzdFBhcmFncmFwaC5kZXByZWNhdGVkTm9k
ZSgpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0
T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKTsKKyAgICAgICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9u
KHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5jb250YWluZXJOb2RlKCkpLCBtX2VuZE9mTGFzdFBh
cmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIFJlbmRlclN0eWxlKiBlbmRTdHlsZSA9IHJl
bmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShlbmQpOwotICAgIGlmIChlbmRTdHlsZSkgewor
ICAgIGlmIChSZW5kZXJTdHlsZSogZW5kU3R5bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4
dE5vZGUoZW5kKSkgewogICAgICAgICBib29sIGlzRW5kQW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25T
YW1lTm9kZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFn
cmFwaCkgJiYgZW5kLmRlcHJlY2F0ZWROb2RlKCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguZGVw
cmVjYXRlZE5vZGUoKTsKICAgICAgICAgLy8gSW5jbHVkZSBcbiBhdCB0aGUgZW5kIG9mIGxpbmUg
aWYgd2UncmUgYXQgYW4gZW1wdHkgcGFyYWdyYXBoCi0gICAgICAgIGlmIChlbmRTdHlsZS0+cHJl
c2VydmVOZXdsaW5lKCkgJiYgc3RhcnQgPT0gZW5kCi0gICAgICAgICAgICAmJiBlbmQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZz
ZXQoKSkgeworICAgICAgICBpZiAoZW5kU3R5bGUtPnByZXNlcnZlTmV3bGluZSgpICYmIHN0YXJ0
ID09IGVuZCAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9k
ZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkgewogICAgICAgICAgICAgaW50IGVuZE9mZnNldCA9
IGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKICAgICAgICAgICAgIGlmICghaXNOZXdMaW5l
QXRQb3NpdGlvbihlbmQucHJldmlvdXMoKSkgJiYgaXNOZXdMaW5lQXRQb3NpdGlvbihlbmQpKQot
ICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVuZC5kZXByZWNhdGVkTm9kZSgpLCBlbmRP
ZmZzZXQgKyAxLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAg
ICAgICAgICBlbmQgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kLmNvbnRhaW5lck5v
ZGUoKSksIGVuZE9mZnNldCArIDEpOwogICAgICAgICAgICAgaWYgKGlzRW5kQW5kRW5kT2ZMYXN0
UGFyYWdyYXBoT25TYW1lTm9kZSAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPj0gbV9l
bmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpCiAgICAgICAgICAgICAg
ICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBlbmQ7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJ
ZiBlbmQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHRleHQgbm9kZSwgc3BsaXQuCi0gICAgICAgIGlm
ICghZW5kU3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKQotICAgICAgICAgICAgJiYgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgZW5k
LmNvbnRhaW5lck5vZGUoKS0+bWF4Q2hhcmFjdGVyT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgIHNw
bGl0VGV4dE5vZGUoc3RhdGljX2Nhc3Q8VGV4dCo+KGVuZC5kZXByZWNhdGVkTm9kZSgpKSwgZW5k
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKyAgICAgICAgaWYgKCFlbmRTdHlsZS0+Y29sbGFw
c2VXaGl0ZVNwYWNlKCkgJiYgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpICYmIGVuZC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSA8IGVuZC5jb250YWluZXJOb2RlKCktPm1heENoYXJhY3Rlck9m
ZnNldCgpKSB7CisgICAgICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihl
bmQuY29udGFpbmVyTm9kZSgpKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKICAgICAg
ICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT25TYW1lTm9kZSkKLSAgICAgICAgICAgICAgICBzdGFy
dCA9IGZpcnN0UG9zaXRpb25Jbk9yQmVmb3JlTm9kZShlbmQuZGVwcmVjYXRlZE5vZGUoKS0+cHJl
dmlvdXNTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbklu
T3JCZWZvcmVOb2RlKGVuZC5jb250YWluZXJOb2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAg
ICAgICAgICAgIGlmIChpc0VuZEFuZEVuZE9mTGFzdFBhcmFncmFwaE9uU2FtZU5vZGUpIHsKICAg
ICAgICAgICAgICAgICBpZiAobV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJO
b2RlKCkgPT0gZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgICAgICAg
ICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IGxhc3RQb3NpdGlvbkluTm9kZShlbmQuZGVwcmVjYXRl
ZE5vZGUoKS0+cHJldmlvdXNTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBtX2VuZE9m
TGFzdFBhcmFncmFwaCA9IGxhc3RQb3NpdGlvbkluT3JBZnRlck5vZGUoZW5kLmNvbnRhaW5lck5v
ZGUoKS0+cHJldmlvdXNTaWJsaW5nKCkpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlvbihlbmQuZGVwcmVjYXRl
ZE5vZGUoKSwgbV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBl
bmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cik7CisgICAgICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gUG9zaXRpb24o
c3RhdGljX2Nhc3Q8VGV4dCo+KGVuZC5jb250YWluZXJOb2RlKCkpLCBtX2VuZE9mTGFzdFBhcmFn
cmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbmQgPSBsYXN0UG9zaXRpb25Jbk5vZGUo
ZW5kLmRlcHJlY2F0ZWROb2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAgICAgICAgfQpAQCAt
MjQ4LDggKzIzOSw3IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQK
ICAgICAgICAgcmV0dXJuIGVuZE9mTmV4dFBhcmFncmFwaDsKIAogICAgIFJlZlB0cjxOb2RlPiBj
b250YWluZXJOb2RlID0gcG9zaXRpb24uY29udGFpbmVyTm9kZSgpOwotICAgIGlmICghc3R5bGUt
PnByZXNlcnZlTmV3bGluZSgpIHx8ICFwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKQot
ICAgICAgICB8fCAhaXNOZXdMaW5lQXRQb3NpdGlvbihQb3NpdGlvbihjb250YWluZXJOb2RlLmdl
dCgpLCAwLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSkpCisgICAgaWYgKCFz
dHlsZS0+cHJlc2VydmVOZXdsaW5lKCkgfHwgIXBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpIHx8ICFpc05ld0xpbmVBdFBvc2l0aW9uKGZpcnN0UG9zaXRpb25Jbk5vZGUoY29udGFpbmVy
Tm9kZS5nZXQoKSkpKQogICAgICAgICByZXR1cm4gZW5kT2ZOZXh0UGFyYWdyYXBoOwogCiAgICAg
Ly8gXG4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBub2RlIGltbWVkaWF0ZWx5IGZvbGxv
d2luZyB0aGUgY3VycmVudCBwYXJhZ3JhcGggaXMgdHJpbW1lZCBieSBtb3ZlUGFyYWdyYXBoV2l0
aENsb25lcy4KQEAgLTI1NywyMiArMjQ3LDI1IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQKICAgICAvLyBBdm9pZCB0aGlzIGJ5IHNwbGl0dGluZyAiXG4iCiAgICAg
c3BsaXRUZXh0Tm9kZShzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIDEp
OwogCi0gICAgaWYgKHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9k
ZSgpKSB7CisgICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9k
ZSgpICYmIGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpICYmIGNvbnRhaW5lck5vZGUt
PnByZXZpb3VzU2libGluZygpLT5pc1RleHROb2RlKCkpIHsKICAgICAgICAgQVNTRVJUKHN0YXJ0
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCkpOwotICAgICAgICBzdGFydCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2li
bGluZygpLCBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9u
SXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHN0YXJ0ID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8
VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgc3RhcnQub2Zmc2V0SW5D
b250YWluZXJOb2RlKCkpOwogICAgIH0KLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0g
ZW5kLmNvbnRhaW5lck5vZGUoKSkgeworICAgIGlmIChjb250YWluZXJOb2RlLmdldCgpID09IGVu
ZC5jb250YWluZXJOb2RlKCkgJiYgY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCkgJiYg
Y29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKSkgewogICAgICAg
ICBBU1NFUlQoZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5D
b250YWluZXJOb2RlKCkpOwotICAgICAgICBlbmQgPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5w
cmV2aW91c1NpYmxpbmcoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgZW5kID0gUG9zaXRpb24oc3RhdGlj
X2Nhc3Q8VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgZW5kLm9mZnNl
dEluQ29udGFpbmVyTm9kZSgpKTsKICAgICB9Ci0gICAgaWYgKG1fZW5kT2ZMYXN0UGFyYWdyYXBo
LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNv
bnRhaW5lck5vZGUuZ2V0KCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguY29udGFpbmVyTm9kZSgp
KSB7Ci0gICAgICAgIGlmIChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5v
ZGUoKSA8IHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgbV9l
bmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5wcmV2aW91c1NpYmxp
bmcoKSwgbV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUsIG1fZW5kT2ZM
YXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gbV9l
bmRPZkxhc3RQYXJhZ3JhcGguY29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIGlmIChtX2VuZE9m
TGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8IHBvc2l0aW9uLm9mZnNldElu
Q29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgICAgICAvLyBXZSBjYW4gb25seSBmaXggZW5kT2ZM
YXN0UGFyYWdyYXBoIGlmIHRoZSBwcmV2aW91cyBub2RlIHdhcyBzdGlsbCB0ZXh0IGFuZCBoYXNu
J3QgYmVlbiBtb2RpZmllZCBieSBzY3JpcHQuCisgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9k
ZS0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKQorICAgICAgICAgICAgICAgICYmIHN0
YXRpY19jYXN0PHVuc2lnbmVkPihtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKSkgPD0gc3RhdGljX2Nhc3Q8VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2li
bGluZygpKS0+bGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGgg
PSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJs
aW5nKCkpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Cisg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlv
bihzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIG1fZW5kT2ZMYXN0UGFy
YWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSk7CiAgICAgfQogCi0gICAgcmV0dXJu
IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUuZ2V0KCksIHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVy
Tm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgcmV0
dXJuIFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihjb250YWluZXJOb2RlLmdldCgpKSwgcG9z
aXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSAxKTsKIH0KIAogUGFzc1JlZlB0cjxFbGVt
ZW50PiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6OmNyZWF0ZUJsb2NrRWxlbWVudCgpIGNvbnN0
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAko
cmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21t
YW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTExNyw2MCArMTExNyw2NSBAQCBib29sIEFwcGx5
U3R5bGVDb21tYW5kOjpub2RlRnVsbHlVbnNlbGVjCiAKIHZvaWQgQXBwbHlTdHlsZUNvbW1hbmQ6
OnNwbGl0VGV4dEF0U3RhcnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYg
ZW5kKQogewotICAgIEFTU0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+
aXNUZXh0Tm9kZSgpKTsKIAogICAgIFBvc2l0aW9uIG5ld0VuZDsKICAgICBpZiAoZW5kLmFuY2hv
clR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQ
b3NpdGlvbihlbmQuY29udGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkg
LSBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgICAgIG5ld0VuZCA9IFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQq
PihlbmQuY29udGFpbmVyTm9kZSgpKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3Rh
cnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgIGVsc2UKICAgICAgICAgbmV3RW5kID0g
ZW5kOwogCi0gICAgVGV4dCogdGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5kZXByZWNh
dGVkTm9kZSgpKTsKKyAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSk7CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBzdGFydC5vZmZzZXRJbkNv
bnRhaW5lck5vZGUoKSk7Ci0gICAgdXBkYXRlU3RhcnRFbmQoZmlyc3RQb3NpdGlvbkluTm9kZShz
dGFydC5kZXByZWNhdGVkTm9kZSgpKSwgbmV3RW5kKTsKKyAgICB1cGRhdGVTdGFydEVuZChmaXJz
dFBvc2l0aW9uSW5Ob2RlKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSksIG5ld0VuZCk7CiB9CiAKIHZv
aWQgQXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0RW5kKGNvbnN0IFBvc2l0aW9uJiBzdGFy
dCwgY29uc3QgUG9zaXRpb24mIGVuZCkKIHsKLSAgICBBU1NFUlQoZW5kLmFuY2hvclR5cGUoKSA9
PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBBU1NFUlQoZW5kLmNv
bnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsKIAogICAgIGJvb2wgc2hvdWxkVXBkYXRlU3Rh
cnQgPSBzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvciAmJiBzdGFydC5jb250YWluZXJOb2RlKCkgPT0gZW5kLmNvbnRhaW5lck5vZGUoKTsKICAg
ICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihlbmQuZGVwcmVjYXRlZE5vZGUoKSk7
CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwog
CiAgICAgTm9kZSogcHJldk5vZGUgPSB0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBBU1NF
UlQocHJldk5vZGUpOwotICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBkYXRlU3RhcnQg
PyBQb3NpdGlvbihwcmV2Tm9kZSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpIDogc3RhcnQ7CisgICAgaWYgKCFwcmV2Tm9k
ZSB8fCAhcHJldk5vZGUtPmlzVGV4dE5vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUG9z
aXRpb24gbmV3U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHN0YXRpY19jYXN0
PFRleHQqPihwcmV2Tm9kZSksIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0YXJ0
OwogICAgIHVwZGF0ZVN0YXJ0RW5kKG5ld1N0YXJ0LCBsYXN0UG9zaXRpb25Jbk5vZGUocHJldk5v
ZGUpKTsKIH0KIAogdm9pZCBBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0RWxlbWVudEF0U3Rh
cnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIEFT
U0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsK
IAogICAgIFBvc2l0aW9uIG5ld0VuZDsKLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9
PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihlbmQuY29u
dGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cisg
ICAgaWYgKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQorICAg
ICAgICBuZXdFbmQgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kLmNvbnRhaW5lck5v
ZGUoKSksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0Lm9mZnNldEluQ29udGFp
bmVyTm9kZSgpKTsKICAgICBlbHNlCiAgICAgICAgIG5ld0VuZCA9IGVuZDsKIAotICAgIFRleHQq
IHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7Ci0gICAg
c3BsaXRUZXh0Tm9kZUNvbnRhaW5pbmdFbGVtZW50KHRleHQsIHN0YXJ0LmRlcHJlY2F0ZWRFZGl0
aW5nT2Zmc2V0KCkpOwotICAgIHVwZGF0ZVN0YXJ0RW5kKFBvc2l0aW9uKHN0YXJ0LmRlcHJlY2F0
ZWROb2RlKCktPnBhcmVudE5vZGUoKSwgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKS0+bm9kZUluZGV4
KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBuZXdFbmQpOworICAgIHNw
bGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChzdGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnQuY29u
dGFpbmVyTm9kZSgpKSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOworICAgIHVwZGF0
ZVN0YXJ0RW5kKHBvc2l0aW9uQmVmb3JlTm9kZShzdGFydC5jb250YWluZXJOb2RlKCkpLCBuZXdF
bmQpOwogfQogCiB2b2lkIEFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRFbGVtZW50QXRFbmQo
Y29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIEFTU0VS
VChlbmQuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3Ip
OworICAgIEFTU0VSVChlbmQuY29udGFpbmVyTm9kZSgpLT5pc1RleHROb2RlKCkpOwogCi0gICAg
Ym9vbCBzaG91bGRVcGRhdGVTdGFydCA9IHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQu
Y29udGFpbmVyTm9kZSgpOwotICAgIFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oZW5k
LmRlcHJlY2F0ZWROb2RlKCkpOwotICAgIHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudCh0
ZXh0LCBlbmQuZGVwcmVjYXRlZEVkaXRpbmdPZmZzZXQoKSk7CisgICAgYm9vbCBzaG91bGRVcGRh
dGVTdGFydCA9IHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpOwor
ICAgIHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChzdGF0aWNfY2FzdDxUZXh0Kj4oZW5k
LmNvbnRhaW5lck5vZGUoKSksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisKKyAgICBO
b2RlKiBwYXJlbnRFbGVtZW50ID0gZW5kLmNvbnRhaW5lck5vZGUoKS0+cGFyZW50Tm9kZSgpOwor
ICAgIGlmICghcGFyZW50RWxlbWVudCB8fCAhcGFyZW50RWxlbWVudC0+cHJldmlvdXNTaWJsaW5n
KCkpCisgICAgICAgIHJldHVybjsKKyAgICBOb2RlKiBmaXJzdFRleHROb2RlID0gcGFyZW50RWxl
bWVudC0+cHJldmlvdXNTaWJsaW5nKCktPmxhc3RDaGlsZCgpOworICAgIGlmICghZmlyc3RUZXh0
Tm9kZSB8fCAhZmlyc3RUZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICByZXR1cm47CiAK
LSAgICBOb2RlKiBwcmV2Tm9kZSA9IHRleHQtPnBhcmVudE5vZGUoKS0+cHJldmlvdXNTaWJsaW5n
KCktPmxhc3RDaGlsZCgpOwotICAgIEFTU0VSVChwcmV2Tm9kZSk7Ci0gICAgUG9zaXRpb24gbmV3
U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHByZXZOb2RlLCBzdGFydC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikg
OiBzdGFydDsKLSAgICB1cGRhdGVTdGFydEVuZChuZXdTdGFydCwgUG9zaXRpb24ocHJldk5vZGUt
PnBhcmVudE5vZGUoKSwgcHJldk5vZGUtPm5vZGVJbmRleCgpICsgMSwgUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcikpOworICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBk
YXRlU3RhcnQgPyBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZmlyc3RUZXh0Tm9kZSksIHN0
YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0YXJ0OworICAgIHVwZGF0ZVN0YXJ0RW5k
KG5ld1N0YXJ0LCBwb3NpdGlvbkFmdGVyTm9kZShmaXJzdFRleHROb2RlKSk7CiB9CiAKIGJvb2wg
QXBwbHlTdHlsZUNvbW1hbmQ6OnNob3VsZFNwbGl0VGV4dEVsZW1lbnQoRWxlbWVudCogZWxlbWVu
dCwgRWRpdGluZ1N0eWxlKiBzdHlsZSkKQEAgLTE0ODAsOSArMTQ4NSw5IEBAIHZvaWQgQXBwbHlT
dHlsZUNvbW1hbmQ6OmpvaW5DaGlsZFRleHROb2QKICAgICAgICAgICAgIFRleHQqIGNoaWxkVGV4
dCA9IHN0YXRpY19jYXN0PFRleHQgKj4oY2hpbGQpOwogICAgICAgICAgICAgVGV4dCogbmV4dFRl
eHQgPSBzdGF0aWNfY2FzdDxUZXh0ICo+KG5leHQpOwogICAgICAgICAgICAgaWYgKHN0YXJ0LmFu
Y2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIG5leHQg
PT0gc3RhcnQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgICAgIG5ld1N0YXJ0ID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgc3RhcnQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAg
ICAgICAgICAgIG5ld1N0YXJ0ID0gUG9zaXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0
aCgpICsgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgaWYgKGVu
ZC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciAmJiBu
ZXh0ID09IGVuZC5jb250YWluZXJOb2RlKCkpCi0gICAgICAgICAgICAgICAgbmV3RW5kID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgZW5kLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAg
ICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+bGVuZ3RoKCkg
KyBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgU3RyaW5nIHRleHRU
b01vdmUgPSBuZXh0VGV4dC0+ZGF0YSgpOwogICAgICAgICAgICAgaW5zZXJ0VGV4dEludG9Ob2Rl
KGNoaWxkVGV4dCwgY2hpbGRUZXh0LT5sZW5ndGgoKSwgdGV4dFRvTW92ZSk7CiAgICAgICAgICAg
ICByZW1vdmVOb2RlKG5leHQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0b3Iu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAkocmV2
aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0VkaXRvci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2Niw3ICsyNjYsNyBAQCBib29sIEVkaXRvcjo6Y2FuRGVsZXRlUmFuZ2Uo
UmFuZ2UqIHJhbmdlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKICAgICBpZiAocmFuZ2Ut
PmNvbGxhcHNlZChlYykpIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0KFBvc2l0aW9u
KHN0YXJ0Q29udGFpbmVyLCByYW5nZS0+c3RhcnRPZmZzZXQoZWMpLCBQb3NpdGlvbjo6UG9zaXRp
b25Jc09mZnNldEluQW5jaG9yKSwgRE9XTlNUUkVBTSk7CisgICAgICAgIFZpc2libGVQb3NpdGlv
biBzdGFydChyYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBET1dOU1RSRUFNKTsKICAgICAgICAgVmlz
aWJsZVBvc2l0aW9uIHByZXZpb3VzID0gc3RhcnQucHJldmlvdXMoKTsKICAgICAgICAgLy8gRklY
TUU6IFdlIHNvbWV0aW1lcyBhbGxvdyBkZWxldGlvbnMgYXQgdGhlIHN0YXJ0IG9mIGVkaXRhYmxl
IHJvb3RzLCBsaWtlIHdoZW4gdGhlIGNhcmV0IGlzIGluIGFuIGVtcHR5IGxpc3QgaXRlbS4KICAg
ICAgICAgaWYgKHByZXZpb3VzLmlzTnVsbCgpIHx8IHByZXZpb3VzLmRlZXBFcXVpdmFsZW50KCku
ZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpICE9IHN0YXJ0Q29udGFpbmVy
LT5yb290RWRpdGFibGVFbGVtZW50KCkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ4MywyMCArMTQ4Mywx
MiBAQCBib29sIEZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3RlZFJhbmdlKFJhCiAgICAgLy8gTm9u
LWNvbGxhcHNlZCByYW5nZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHN0YXJ0IGF0IHRoZSBlbmQgb2Yg
YSBsaW5lIHRoYXQgaXMgd3JhcHBlZCwKICAgICAvLyB0aGV5IHN0YXJ0IGF0IHRoZSBiZWdpbm5p
bmcgb2YgdGhlIG5leHQgbGluZSBpbnN0ZWFkCiAgICAgYm9vbCBjb2xsYXBzZWQgPSByYW5nZS0+
Y29sbGFwc2VkKGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICBpbnQgc3RhcnRPZmZzZXQgPSByYW5nZS0+c3RhcnRPZmZzZXQoZWMpOwotICAgIGlmIChl
YykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IGVuZE9mZnNldCA9IHJhbmdlLT5l
bmRPZmZzZXQoZWMpOwotICAgIGlmIChlYykKKyAgICBpZiAoZWMgfHwgIXJhbmdlLT5zdGFydENv
bnRhaW5lcigpIHx8ICFyYW5nZS0+ZW5kQ29udGFpbmVyKCkpCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKICAgICAKICAgICAvLyBGSVhNRTogQ2FuIHdlIHByb3ZpZGUgZXh0ZW50QWZmaW5pdHk/Ci0g
ICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydChQb3NpdGlvbihzdGFydENvbnRhaW5lciwg
c3RhcnRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBjb2xsYXBz
ZWQgPyBhZmZpbml0eSA6IERPV05TVFJFQU0pOwotICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxl
RW5kKFBvc2l0aW9uKGVuZENvbnRhaW5lciwgZW5kT2Zmc2V0LCBQb3NpdGlvbjo6UG9zaXRpb25J
c09mZnNldEluQW5jaG9yKSwgU0VMX0RFRkFVTFRfQUZGSU5JVFkpOworICAgIFZpc2libGVQb3Np
dGlvbiB2aXNpYmxlU3RhcnQocmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgY29sbGFwc2VkID8gYWZm
aW5pdHkgOiBET1dOU1RSRUFNKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZChyYW5n
ZS0+ZW5kUG9zaXRpb24oKSwgU0VMX0RFRkFVTFRfQUZGSU5JVFkpOwogICAgIFNldFNlbGVjdGlv
bk9wdGlvbnMgb3B0aW9ucyA9IENsZWFyVHlwaW5nU3R5bGU7CiAgICAgaWYgKGNsb3NlVHlwaW5n
KQogICAgICAgICBvcHRpb25zIHw9IENsb3NlVHlwaW5nOwpJbmRleDogU291cmNlL1dlYkNvcmUv
ZWRpdGluZy9WaXNpYmxlUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcAkocmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL1Zpc2libGVQb3NpdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTU1
MiwxNSArNTUyLDE0IEBAIFVDaGFyMzIgVmlzaWJsZVBvc2l0aW9uOjpjaGFyYWN0ZXJBZnRlcigK
ICAgICBjYXNlIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I6CiAgICAgICAgIGJy
ZWFrOwogICAgIH0KKyAgICB1bnNpZ25lZCBvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
cG9zLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKICAgICBUZXh0KiB0ZXh0Tm9kZSA9IHN0YXRp
Y19jYXN0PFRleHQqPihwb3MuY29udGFpbmVyTm9kZSgpKTsKLSAgICB1bnNpZ25lZCBvZmZzZXQg
PSBwb3MuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3Ig
PyBwb3Mub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgOiAwOwotICAgIHVuc2lnbmVkIGxlbmd0aCA9
IHRleHROb2RlLT5sZW5ndGgoKTsKLSAgICBpZiAob2Zmc2V0ID49IGxlbmd0aCkKKyAgICBpZiAo
b2Zmc2V0ID49IHRleHROb2RlLT5sZW5ndGgoKSkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBV
Q2hhcjMyIGNoOwogICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gdGV4dE5vZGUtPmRhdGEo
KS5jaGFyYWN0ZXJzKCk7Ci0gICAgVTE2X05FWFQoY2hhcmFjdGVycywgb2Zmc2V0LCBsZW5ndGgs
IGNoKTsKKyAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBvZmZzZXQsIHRleHROb2RlLT5sZW5ndGgo
KSwgY2gpOwogICAgIHJldHVybiBjaDsKIH0KIApAQCAtNjQ5LDE0ICs2NDgsMTIgQEAgUGFzc1Jl
ZlB0cjxSYW5nZT4gbWFrZVJhbmdlKGNvbnN0IFZpc2libAogCiBWaXNpYmxlUG9zaXRpb24gc3Rh
cnRWaXNpYmxlUG9zaXRpb24oY29uc3QgUmFuZ2UgKnIsIEVBZmZpbml0eSBhZmZpbml0eSkKIHsK
LSAgICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0
aW9uKHItPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIHItPnN0YXJ0T2Zmc2V0KGV4Y2VwdGlv
biksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBhZmZpbml0eSk7CisgICAg
cmV0dXJuIFZpc2libGVQb3NpdGlvbihyLT5zdGFydFBvc2l0aW9uKCksIGFmZmluaXR5KTsKIH0K
IAogVmlzaWJsZVBvc2l0aW9uIGVuZFZpc2libGVQb3NpdGlvbihjb25zdCBSYW5nZSAqciwgRUFm
ZmluaXR5IGFmZmluaXR5KQogewotICAgIGludCBleGNlcHRpb24gPSAwOwotICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oUG9zaXRpb24oci0+ZW5kQ29udGFpbmVyKGV4Y2VwdGlvbiksIHItPmVu
ZE9mZnNldChleGNlcHRpb24pLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSwg
YWZmaW5pdHkpOworICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oci0+ZW5kUG9zaXRpb24oKSwg
YWZmaW5pdHkpOwogfQogCiBib29sIHNldFN0YXJ0KFJhbmdlICpyLCBjb25zdCBWaXNpYmxlUG9z
aXRpb24gJnZpc2libGVQb3NpdGlvbikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRt
bGVkaXRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVk
aXRpbmcuY3BwCShyZXZpc2lvbiA4OTczMSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRt
bGVkaXRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MDIsOCArNDAyLDcgQEAgYm9vbCBpc1Nw
ZWNpYWxFbGVtZW50KGNvbnN0IE5vZGUgKm4pCiAKIHN0YXRpYyBOb2RlKiBmaXJzdEluU3BlY2lh
bEVsZW1lbnQoY29uc3QgUG9zaXRpb24mIHBvcykKIHsKLSAgICAvLyBGSVhNRTogVGhpcyBiZWdp
bnMgYXQgcG9zLmRlcHJlY2F0ZWROb2RlKCksIHdoaWNoIGRvZXNuJ3QgbmVjZXNzYXJpbHkgY29u
dGFpbiBwb3MgKHN1cHBvc2UgcG9zIHdhcyBbaW1nLCAwXSkuICBTZWUgPHJkYXI6Ly9wcm9ibGVt
LzUwMjc3MDI+LgotICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuZGVwcmVjYXRl
ZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVs
ZW1lbnQgPSBwb3MuY29udGFpbmVyTm9kZSgpLT5yb290RWRpdGFibGVFbGVtZW50KCk7CiAgICAg
Zm9yIChOb2RlKiBuID0gcG9zLmRlcHJlY2F0ZWROb2RlKCk7IG4gJiYgbi0+cm9vdEVkaXRhYmxl
RWxlbWVudCgpID09IHJvb3RFZGl0YWJsZUVsZW1lbnQ7IG4gPSBuLT5wYXJlbnROb2RlKCkpCiAg
ICAgICAgIGlmIChpc1NwZWNpYWxFbGVtZW50KG4pKSB7CiAgICAgICAgICAgICBWaXNpYmxlUG9z
aXRpb24gdlBvcyA9IFZpc2libGVQb3NpdGlvbihwb3MsIERPV05TVFJFQU0pOwpAQCAtNDE4LDEy
ICs0MTcsMTEgQEAgc3RhdGljIE5vZGUqIGZpcnN0SW5TcGVjaWFsRWxlbWVudChjb25zdAogCiBz
dGF0aWMgTm9kZSogbGFzdEluU3BlY2lhbEVsZW1lbnQoY29uc3QgUG9zaXRpb24mIHBvcykKIHsK
LSAgICAvLyBGSVhNRTogVGhpcyBiZWdpbnMgYXQgcG9zLmRlcHJlY2F0ZWROb2RlKCksIHdoaWNo
IGRvZXNuJ3QgbmVjZXNzYXJpbHkgY29udGFpbiBwb3MgKHN1cHBvc2UgcG9zIHdhcyBbaW1nLCAw
XSkuICBTZWUgPHJkYXI6Ly9wcm9ibGVtLzUwMjc3MDI+LgotICAgIE5vZGUqIHJvb3RFZGl0YWJs
ZUVsZW1lbnQgPSBwb3MuZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwor
ICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuY29udGFpbmVyTm9kZSgpLT5yb290
RWRpdGFibGVFbGVtZW50KCk7CiAgICAgZm9yIChOb2RlKiBuID0gcG9zLmRlcHJlY2F0ZWROb2Rl
KCk7IG4gJiYgbi0+cm9vdEVkaXRhYmxlRWxlbWVudCgpID09IHJvb3RFZGl0YWJsZUVsZW1lbnQ7
IG4gPSBuLT5wYXJlbnROb2RlKCkpCiAgICAgICAgIGlmIChpc1NwZWNpYWxFbGVtZW50KG4pKSB7
CiAgICAgICAgICAgICBWaXNpYmxlUG9zaXRpb24gdlBvcyA9IFZpc2libGVQb3NpdGlvbihwb3Ms
IERPV05TVFJFQU0pOwotICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxhc3RJbkVsZW1lbnQg
PSBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24obiwgbi0+Y2hpbGROb2RlQ291bnQoKSwgUG9zaXRp
b246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciksIERPV05TVFJFQU0pOworICAgICAgICAgICAg
VmlzaWJsZVBvc2l0aW9uIGxhc3RJbkVsZW1lbnQgPSBWaXNpYmxlUG9zaXRpb24obGFzdFBvc2l0
aW9uSW5PckFmdGVyTm9kZShuKSwgRE9XTlNUUkVBTSk7CiAgICAgICAgICAgICBpZiAoaXNUYWJs
ZUVsZW1lbnQobikgJiYgdlBvcyA9PSBsYXN0SW5FbGVtZW50LnByZXZpb3VzKCkpCiAgICAgICAg
ICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICBpZiAodlBvcyA9PSBsYXN0SW5FbGVtZW50
KQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCShyZXZpc2lv
biA4OTczMSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQzNywxMiArNDM3LDEyIEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24g
ZW5kUG9zaXRpb25Gb3JMaW4KICAgICBQb3NpdGlvbiBwb3M7CiAgICAgaWYgKGVuZE5vZGUtPmhh
c1RhZ05hbWUoYnJUYWcpKSB7CiAgICAgICAgIHBvcyA9IHBvc2l0aW9uQmVmb3JlTm9kZShlbmRO
b2RlKTsKLSAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAgICAg
ICAgSW5saW5lVGV4dEJveCAqZW5kVGV4dEJveCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3gg
Kj4oZW5kQm94KTsKKyAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxpbmVUZXh0Qm94KCkgJiYg
ZW5kTm9kZS0+aXNUZXh0Tm9kZSgpKSB7CisgICAgICAgIElubGluZVRleHRCb3gqIGVuZFRleHRC
b3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94ICo+KGVuZEJveCk7CiAgICAgICAgIGludCBl
bmRPZmZzZXQgPSBlbmRUZXh0Qm94LT5zdGFydCgpOwogICAgICAgICBpZiAoIWVuZFRleHRCb3gt
PmlzTGluZUJyZWFrKCkpCiAgICAgICAgICAgICBlbmRPZmZzZXQgKz0gZW5kVGV4dEJveC0+bGVu
KCk7Ci0gICAgICAgIHBvcyA9IFBvc2l0aW9uKGVuZE5vZGUsIGVuZE9mZnNldCwgUG9zaXRpb246
OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHBvcyA9IFBvc2l0aW9uKHN0YXRp
Y19jYXN0PFRleHQqPihlbmROb2RlKSwgZW5kT2Zmc2V0KTsKICAgICB9IGVsc2UKICAgICAgICAg
cG9zID0gcG9zaXRpb25BZnRlck5vZGUoZW5kTm9kZSk7CiAgICAgCkBAIC03OTMsNiArNzkzLDcg
QEAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZQYXJhZ3JhcGgoY29uc3QgVgogICAgICAgICAgICAg
YnJlYWs7CiAKICAgICAgICAgaWYgKHItPmlzVGV4dCgpICYmIHItPmNhcmV0TWF4UmVuZGVyZWRP
ZmZzZXQoKSA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChuLT5pc1RleHROb2RlKCkpOwogICAg
ICAgICAgICAgdHlwZSA9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I7CiAgICAg
ICAgICAgICBpZiAoc3R5bGUtPnByZXNlcnZlTmV3bGluZSgpKSB7CiAgICAgICAgICAgICAgICAg
Y29uc3QgVUNoYXIqIGNoYXJzID0gdG9SZW5kZXJUZXh0KHIpLT5jaGFyYWN0ZXJzKCk7CkBAIC04
MDAsOSArODAxLDEwIEBAIFZpc2libGVQb3NpdGlvbiBzdGFydE9mUGFyYWdyYXBoKGNvbnN0IFYK
ICAgICAgICAgICAgICAgICBpbnQgbyA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBpZiAobiA9
PSBzdGFydE5vZGUgJiYgbyA8IGkpCiAgICAgICAgICAgICAgICAgICAgIGkgPSBtYXgoMCwgbyk7
Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0taSA+PSAwKQorICAgICAgICAgICAgICAgIHdoaWxl
ICgtLWkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gJ1xuJykK
LSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24o
biwgaSArIDEsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFN
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRp
b24oc3RhdGljX2Nhc3Q8VGV4dCo+KG4pLCBpICsgMSksIERPV05TVFJFQU0pOworICAgICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGUgPSBuOwogICAgICAgICAg
ICAgb2Zmc2V0ID0gMDsKQEAgLTgxNSw5ICs4MTcsMTEgQEAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0
T2ZQYXJhZ3JhcGgoY29uc3QgVgogICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNO
b2RlUG9zdE9yZGVyKHN0YXJ0QmxvY2spOwogICAgIH0KIAotICAgIGlmICh0eXBlID09IFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCisgICAgaWYgKHR5cGUgPT0gUG9zaXRpb246
OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikgeworICAgICAgICBBU1NFUlQodHlwZSAhPSBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yIHx8ICFvZmZzZXQpOwogICAgICAgICByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG5vZGUsIG9mZnNldCwgdHlwZSksIERPV05TVFJF
QU0pOwotICAgIAorICAgIH0KKwogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24o
bm9kZSwgdHlwZSksIERPV05TVFJFQU0pOwogfQogCkBAIC04NjcsMTQgKzg3MSwxNiBAQCBWaXNp
YmxlUG9zaXRpb24gZW5kT2ZQYXJhZ3JhcGgoY29uc3QgVmlzCiAKICAgICAgICAgLy8gRklYTUU6
IFdlIGF2b2lkIHJldHVybmluZyBhIHBvc2l0aW9uIHdoZXJlIHRoZSByZW5kZXJlciBjYW4ndCBh
Y2NlcHQgdGhlIGNhcmV0LgogICAgICAgICBpZiAoci0+aXNUZXh0KCkgJiYgci0+Y2FyZXRNYXhS
ZW5kZXJlZE9mZnNldCgpID4gMCkgeworICAgICAgICAgICAgQVNTRVJUKG4tPmlzVGV4dE5vZGUo
KSk7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdG9SZW5kZXJUZXh0KHIpLT50ZXh0TGVuZ3Ro
KCk7CiAgICAgICAgICAgICB0eXBlID0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cjsKICAgICAgICAgICAgIGlmIChzdHlsZS0+cHJlc2VydmVOZXdsaW5lKCkpIHsKICAgICAgICAg
ICAgICAgICBjb25zdCBVQ2hhciogY2hhcnMgPSB0b1JlbmRlclRleHQociktPmNoYXJhY3RlcnMo
KTsKICAgICAgICAgICAgICAgICBpbnQgbyA9IG4gPT0gc3RhcnROb2RlID8gb2Zmc2V0IDogMDsK
LSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbzsgaSA8IGxlbmd0aDsgKytpKQorICAgICAg
ICAgICAgICAgIGZvciAoaW50IGkgPSBvOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAg
ICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG4sIGksIFBvc2l0aW9uOjpQb3NpdGlvbklz
T2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KG4pLCBpKSwg
RE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAg
ICAgbm9kZSA9IG47CiAgICAgICAgICAgICBvZmZzZXQgPSByLT5jYXJldE1heE9mZnNldCgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98604</attachid>
            <date>2011-06-25 14:00:06 -0700</date>
            <delta_ts>2011-06-27 19:10:56 -0700</delta_ts>
            <desc>fixed build</desc>
            <filename>bug-63384-20110625140005.patch</filename>
            <type>text/plain</type>
            <size>29654</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg5NzQ3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTAgQEAKKzIwMTEtMDYtMjUgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgU3RvcCBpbnN0YW50aWF0aW5nIFBvc2l0aW9uIHdpdGggUG9zaXRp
b25Jc09mZnNldEluQW5jaG9yIGluIHZhcmlvdXMgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzg0CisKKyAgICAgICAgUmVmYWN0b3Jpbmcu
CisgICAgICAgIAorICAgICAgICBSZW1vdmVkIG1hbnkgaWYgY29uZGl0aW9ucyB0aGF0IGNvbXBh
cmVkIHRoZSBhbmNob3IgdHlwZSB0byBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9y
CisgICAgICAgIGJlY2F1c2UgdGhlcmUgd2VyZSBhbHNvIGNoZWNraW5nIHRoYXQgY29udGFpbmVy
Tm9kZSBpcyBhIHRleHQgbm9kZS4KKworICAgICAgICAqIGRvbS9Qb3NpdGlvbi5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpQb3NpdGlvbjo6UG9zaXRpb24pOiBBZGRlZCBhbiBhc3NlcnRpb24gdG8g
ZW5zdXJlIEJlZm9yZUNoaWxkcmVuL0FmdGVyQ2hpbGRyZW4KKyAgICAgICAgYW5jaG9yIHR5cGUg
d29uJ3QgYmUgdXNlZCBmb3IgYSBub2RlIHdob3NlIGNvbnRlbnRzIGlzIGlnbm9yZWQgYnkgZWRp
dGluZy4KKyAgICAgICAgKiBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjppc05ld0xpbmVBdFBvc2l0aW9uKTogUmVtb3ZlIGEgcmVkdW5kYW50
IGNvbXBhcmlzb24gb2YgYW5jaG9yIHR5cGUuCisgICAgICAgIChXZWJDb3JlOjpBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQ6OnJhbmdlRm9yUGFyYWdyYXBoU3BsaXR0aW5nVGV4dE5vZGVzSWZOZWVk
ZWQpOiBTaW5jZSBjb250YWluZXJOb2RlCisgICAgICAgIGlzIGFsd2F5cyBhIHRleHQgbm9kZSB3
aGVuIHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZSByZXR1cm5zIGEgcmVuZGVyIHN0eWxl
LCB1c2UgbmV3IFBvc2l0aW9uCisgICAgICAgIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgVGV4dCog
YW5kIG9mZnNldC4KKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6
ZW5kT2ZOZXh0UGFyYWdyYWhTcGxpdHRpbmdUZXh0Tm9kZXNJZk5lZWRlZCk6IFJlbW92ZWQgcmVk
dW5kYW50CisgICAgICAgIGNvbXBhcmlzb24gb2YgYW5jaG9yIHR5cGUgYW5kIHVzZSBuZXcgUG9z
aXRpb24gY29uc3RydWN0b3IgdGhhdCB0YWtlcyBUZXh0KiBhbmQgb2Zmc2V0LgorICAgICAgICAq
IGVkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlT
dHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0U3RhcnQpOiBSZXBsYWNlZCBhbiBhc3NlcnRpb24gdGhh
dCBjb21wYXJlZCBhbmNob3IgdHlwZSBieQorICAgICAgICBhbiBhc3NlcnRpb24gdGhhdCB0aGUg
Y29udGFpbmVyIG5vZGUgaXMgYSB0ZXh0IG5vZGU7IHVzZSBuZXcgY29uc3RydWN0b3IuCisgICAg
ICAgIChXZWJDb3JlOjpBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0QXRFbmQpOiBEaXR0bzsg
YWxzbyBhZGRlZCBlYXJseSBleGl0cyBpbiB0aGUgY2FzZSBzY3JpcHQKKyAgICAgICAgbW9kaWZp
ZWQgRE9NLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEVs
ZW1lbnRBdFN0YXJ0KTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpBcHBseVN0eWxlQ29tbWFu
ZDo6c3BsaXRUZXh0RWxlbWVudEF0RW5kKTogRGl0dG8uCisgICAgICAgIChXZWJDb3JlOjpBcHBs
eVN0eWxlQ29tbWFuZDo6am9pbkNoaWxkVGV4dE5vZGVzKTogVXNlIG5ldyBjb25zdHJ1Y3Rvci4K
KyAgICAgICAgKiBlZGl0aW5nL0VkaXRvci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0b3I6
OmNhbkRlbGV0ZVJhbmdlKTogQ2FsbCBSYW5nZTo6c3RhcnRQb3NpdGlvbiBpbnN0ZWFkIG9mIG1h
bnVhbGx5IGluc3RhbnRpYXRpbmcgUG9zaXRpb24KKyAgICAgICAgYnkgY2FsbGluZyBzdGFydENv
bnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgICogZWRpdGluZy9GcmFtZVNlbGVjdGlv
bi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGcmFtZVNlbGVjdGlvbjo6c2V0U2VsZWN0ZWRSYW5n
ZSk6IERpdHRvLgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcDoKKyAgICAg
ICAgKFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbjo6Y2hhcmFjdGVyQWZ0ZXIpOiBSZW1vdmVkIGEg
cmVkdW5kYW50IGFuY2hvciB0eXBlIGNvbXBhcmlzb24uCisgICAgICAgIChXZWJDb3JlOjpzdGFy
dFZpc2libGVQb3NpdGlvbik6IENhbGwgUmFuZ2U6OnN0YXJ0UG9zaXRpb24gaW5zdGVhZCBvZiBz
dGFydENvbnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgIChXZWJDb3JlOjplbmRWaXNp
YmxlUG9zaXRpb24pOiBDYWxsIFJhbmdlOjplbmRQb3NpdGlvbiBpbnN0ZWFkIG9mIGVuZENvbnRh
aW5lciBhbmQgZW5kT2Zmc2V0LgorICAgICAgICAqIGVkaXRpbmcvaHRtbGVkaXRpbmcuY3BwOgor
ICAgICAgICAoV2ViQ29yZTo6Zmlyc3RJblNwZWNpYWxFbGVtZW50KTogQ2FsbCBjb250YWluZXJO
b2RlKCkgdG8gYWRkcmVzcyA8cmRhcjovL3Byb2JsZW0vNTAyNzcwMj4uCisgICAgICAgIChXZWJD
b3JlOjpsYXN0SW5TcGVjaWFsRWxlbWVudCk6IERpdHRvOyB1c2UgbmV3IGNvbnN0cnVjdG9yLgor
ICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAgIChXZWJDb3JlOjpl
bmRQb3NpdGlvbkZvckxpbmUpOiBVc2UgbmV3IGNvbnN0cnVjdG9yLgorICAgICAgICAoV2ViQ29y
ZTo6c3RhcnRPZlBhcmFncmFwaCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6ZW5kT2ZQYXJh
Z3JhcGgpOiBEaXR0by4KKwogMjAxMS0wNi0yNSAgUm9iIEJ1aXMgIDxyYnVpc0ByaW0uY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE5pa29sYXMgWmltbWVybWFubi4KSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9t
L1Bvc2l0aW9uLmNwcAkocmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vUG9z
aXRpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MSw3ICs5MSw4IEBAIFBvc2l0aW9uOjpQb3Np
dGlvbihQYXNzUmVmUHRyPE5vZGU+IGFuY2gKIHsKICAgICBBU1NFUlQoIW1fYW5jaG9yTm9kZSB8
fCAhbV9hbmNob3JOb2RlLT5pc1NoYWRvd1Jvb3QoKSk7CiAgICAgQVNTRVJUKGFuY2hvclR5cGUg
IT0gUG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKLSAgICBBU1NFUlQoISgoYW5jaG9yVHlwZSA9
PSBQb3NpdGlvbklzQmVmb3JlQ2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQWZ0
ZXJDaGlsZHJlbikgJiYgbV9hbmNob3JOb2RlLT5pc1RleHROb2RlKCkpKTsKKyAgICBBU1NFUlQo
ISgoYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQmVmb3JlQ2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9
PSBQb3NpdGlvbklzQWZ0ZXJDaGlsZHJlbikKKyAgICAgICAgICAgICAmJiAobV9hbmNob3JOb2Rl
LT5pc1RleHROb2RlKCkgfHwgZWRpdGluZ0lnbm9yZXNDb250ZW50KG1fYW5jaG9yTm9kZS5nZXQo
KSkpKSk7CiB9CiAKIFBvc2l0aW9uOjpQb3NpdGlvbihQYXNzUmVmUHRyPE5vZGU+IGFuY2hvck5v
ZGUsIGludCBvZmZzZXQsIEFuY2hvclR5cGUgYW5jaG9yVHlwZSkKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAJKHJldmlz
aW9uIDg5NzMxKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENv
bW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsOSArMTUwLDYgQEAgdm9pZCBBcHBseUJs
b2NrRWxlbWVudENvbW1hbmQ6OmZvcm1hdFNlbAogCiBzdGF0aWMgYm9vbCBpc05ld0xpbmVBdFBv
c2l0aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlvbikKIHsKLSAgICBpZiAocG9zaXRpb24uYW5j
aG9yVHlwZSgpICE9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQogICAgIE5vZGUqIHRleHROb2RlID0gcG9zaXRpb24uY29udGFpbmVy
Tm9kZSgpOwogICAgIGludCBvZmZzZXQgPSBwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KTsKICAgICBpZiAoIXRleHROb2RlIHx8ICF0ZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpIHx8IG9mZnNl
dCA8IDAgfHwgb2Zmc2V0ID49IHRleHROb2RlLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkKQEAgLTE4
MSw5ICsxNzgsOCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6cmFuZ2VGb3JQCiAg
ICAgc3RhcnQgPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaCkuZGVlcEVx
dWl2YWxlbnQoKTsKICAgICBlbmQgPSBlbmRPZkN1cnJlbnRQYXJhZ3JhcGguZGVlcEVxdWl2YWxl
bnQoKTsKIAotICAgIFJlbmRlclN0eWxlKiBzdGFydFN0eWxlID0gcmVuZGVyU3R5bGVPZkVuY2xv
c2luZ1RleHROb2RlKHN0YXJ0KTsKICAgICBib29sIGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlID0g
ZmFsc2U7Ci0gICAgaWYgKHN0YXJ0U3R5bGUpIHsKKyAgICBpZiAoUmVuZGVyU3R5bGUqIHN0YXJ0
U3R5bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUoc3RhcnQpKSB7CiAgICAgICAg
IGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlID0gcmVuZGVyU3R5bGVPZkVuY2xvc2luZ1RleHROb2Rl
KGVuZCkgJiYgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSA9PSBlbmQuZGVwcmVjYXRlZE5vZGUoKTsK
ICAgICAgICAgYm9vbCBpc1N0YXJ0QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSA9IHJl
bmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFncmFwaCkgJiYgc3Rh
cnQuZGVwcmVjYXRlZE5vZGUoKSA9PSBtX2VuZE9mTGFzdFBhcmFncmFwaC5kZXByZWNhdGVkTm9k
ZSgpOwogCkBAIC0xOTQsNDUgKzE5MCw0MCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFu
ZDo6cmFuZ2VGb3JQCiAgICAgICAgIC8vIElmIHN0YXJ0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSB0
ZXh0IG5vZGUsIHNwbGl0LgogICAgICAgICBpZiAoIXN0YXJ0U3R5bGUtPmNvbGxhcHNlV2hpdGVT
cGFjZSgpICYmIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpID4gMCkgewogICAgICAgICAg
ICAgaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7Ci0gICAg
ICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5kZXByZWNhdGVk
Tm9kZSgpKSwgc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgc3RhcnQgPSBmaXJzdFBvc2l0aW9u
SW5PckJlZm9yZU5vZGUoc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgICAgICAgICBzcGxp
dFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5jb250YWluZXJOb2RlKCkpLCBzdGFy
dE9mZnNldCk7CisgICAgICAgICAgICBzdGFydCA9IGZpcnN0UG9zaXRpb25Jbk5vZGUoc3RhcnQu
Y29udGFpbmVyTm9kZSgpKTsKICAgICAgICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT25TYW1lTm9k
ZSkgewogICAgICAgICAgICAgICAgIEFTU0VSVChlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkg
Pj0gc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVuZC5kZXBy
ZWNhdGVkTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydE9mZnNldCwg
UG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgICAgICAgICAgZW5k
ID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0LmNvbnRhaW5lck5vZGUoKSksIGVu
ZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSkg
ewogICAgICAgICAgICAgICAgIEFTU0VSVChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNv
bnRhaW5lck5vZGUoKSA+PSBzdGFydE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgbV9lbmRPZkxh
c3RQYXJhZ3JhcGggPSBQb3NpdGlvbihtX2VuZE9mTGFzdFBhcmFncmFwaC5kZXByZWNhdGVkTm9k
ZSgpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0
T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKTsKKyAgICAgICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9u
KHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5jb250YWluZXJOb2RlKCkpLCBtX2VuZE9mTGFzdFBh
cmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIFJlbmRlclN0eWxlKiBlbmRTdHlsZSA9IHJl
bmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShlbmQpOwotICAgIGlmIChlbmRTdHlsZSkgewor
ICAgIGlmIChSZW5kZXJTdHlsZSogZW5kU3R5bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4
dE5vZGUoZW5kKSkgewogICAgICAgICBib29sIGlzRW5kQW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25T
YW1lTm9kZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFn
cmFwaCkgJiYgZW5kLmRlcHJlY2F0ZWROb2RlKCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguZGVw
cmVjYXRlZE5vZGUoKTsKICAgICAgICAgLy8gSW5jbHVkZSBcbiBhdCB0aGUgZW5kIG9mIGxpbmUg
aWYgd2UncmUgYXQgYW4gZW1wdHkgcGFyYWdyYXBoCi0gICAgICAgIGlmIChlbmRTdHlsZS0+cHJl
c2VydmVOZXdsaW5lKCkgJiYgc3RhcnQgPT0gZW5kCi0gICAgICAgICAgICAmJiBlbmQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZz
ZXQoKSkgeworICAgICAgICBpZiAoZW5kU3R5bGUtPnByZXNlcnZlTmV3bGluZSgpICYmIHN0YXJ0
ID09IGVuZCAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9k
ZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkgewogICAgICAgICAgICAgaW50IGVuZE9mZnNldCA9
IGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKICAgICAgICAgICAgIGlmICghaXNOZXdMaW5l
QXRQb3NpdGlvbihlbmQucHJldmlvdXMoKSkgJiYgaXNOZXdMaW5lQXRQb3NpdGlvbihlbmQpKQot
ICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVuZC5kZXByZWNhdGVkTm9kZSgpLCBlbmRP
ZmZzZXQgKyAxLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAg
ICAgICAgICBlbmQgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kLmNvbnRhaW5lck5v
ZGUoKSksIGVuZE9mZnNldCArIDEpOwogICAgICAgICAgICAgaWYgKGlzRW5kQW5kRW5kT2ZMYXN0
UGFyYWdyYXBoT25TYW1lTm9kZSAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPj0gbV9l
bmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpCiAgICAgICAgICAgICAg
ICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBlbmQ7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBJ
ZiBlbmQgaXMgaW4gdGhlIG1pZGRsZSBvZiBhIHRleHQgbm9kZSwgc3BsaXQuCi0gICAgICAgIGlm
ICghZW5kU3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKQotICAgICAgICAgICAgJiYgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgZW5k
LmNvbnRhaW5lck5vZGUoKS0+bWF4Q2hhcmFjdGVyT2Zmc2V0KCkpIHsKLSAgICAgICAgICAgIHNw
bGl0VGV4dE5vZGUoc3RhdGljX2Nhc3Q8VGV4dCo+KGVuZC5kZXByZWNhdGVkTm9kZSgpKSwgZW5k
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKyAgICAgICAgaWYgKCFlbmRTdHlsZS0+Y29sbGFw
c2VXaGl0ZVNwYWNlKCkgJiYgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpICYmIGVuZC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSA8IGVuZC5jb250YWluZXJOb2RlKCktPm1heENoYXJhY3Rlck9m
ZnNldCgpKSB7CisgICAgICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihl
bmQuY29udGFpbmVyTm9kZSgpKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKICAgICAg
ICAgICAgIGlmIChpc1N0YXJ0QW5kRW5kT25TYW1lTm9kZSkKLSAgICAgICAgICAgICAgICBzdGFy
dCA9IGZpcnN0UG9zaXRpb25Jbk9yQmVmb3JlTm9kZShlbmQuZGVwcmVjYXRlZE5vZGUoKS0+cHJl
dmlvdXNTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbklu
T3JCZWZvcmVOb2RlKGVuZC5jb250YWluZXJOb2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAg
ICAgICAgICAgIGlmIChpc0VuZEFuZEVuZE9mTGFzdFBhcmFncmFwaE9uU2FtZU5vZGUpIHsKICAg
ICAgICAgICAgICAgICBpZiAobV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJO
b2RlKCkgPT0gZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgICAgICAg
ICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IGxhc3RQb3NpdGlvbkluTm9kZShlbmQuZGVwcmVjYXRl
ZE5vZGUoKS0+cHJldmlvdXNTaWJsaW5nKCkpOworICAgICAgICAgICAgICAgICAgICBtX2VuZE9m
TGFzdFBhcmFncmFwaCA9IGxhc3RQb3NpdGlvbkluT3JBZnRlck5vZGUoZW5kLmNvbnRhaW5lck5v
ZGUoKS0+cHJldmlvdXNTaWJsaW5nKCkpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlvbihlbmQuZGVwcmVjYXRl
ZE5vZGUoKSwgbV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBl
bmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cik7CisgICAgICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gUG9zaXRpb24o
c3RhdGljX2Nhc3Q8VGV4dCo+KGVuZC5jb250YWluZXJOb2RlKCkpLCBtX2VuZE9mTGFzdFBhcmFn
cmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbmQgPSBsYXN0UG9zaXRpb25Jbk5vZGUo
ZW5kLmRlcHJlY2F0ZWROb2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAgICAgICAgfQpAQCAt
MjQ4LDggKzIzOSw3IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQK
ICAgICAgICAgcmV0dXJuIGVuZE9mTmV4dFBhcmFncmFwaDsKIAogICAgIFJlZlB0cjxOb2RlPiBj
b250YWluZXJOb2RlID0gcG9zaXRpb24uY29udGFpbmVyTm9kZSgpOwotICAgIGlmICghc3R5bGUt
PnByZXNlcnZlTmV3bGluZSgpIHx8ICFwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKQot
ICAgICAgICB8fCAhaXNOZXdMaW5lQXRQb3NpdGlvbihQb3NpdGlvbihjb250YWluZXJOb2RlLmdl
dCgpLCAwLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSkpCisgICAgaWYgKCFz
dHlsZS0+cHJlc2VydmVOZXdsaW5lKCkgfHwgIXBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpIHx8ICFpc05ld0xpbmVBdFBvc2l0aW9uKGZpcnN0UG9zaXRpb25Jbk5vZGUoY29udGFpbmVy
Tm9kZS5nZXQoKSkpKQogICAgICAgICByZXR1cm4gZW5kT2ZOZXh0UGFyYWdyYXBoOwogCiAgICAg
Ly8gXG4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBub2RlIGltbWVkaWF0ZWx5IGZvbGxv
d2luZyB0aGUgY3VycmVudCBwYXJhZ3JhcGggaXMgdHJpbW1lZCBieSBtb3ZlUGFyYWdyYXBoV2l0
aENsb25lcy4KQEAgLTI1NywyMiArMjQ3LDI1IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQKICAgICAvLyBBdm9pZCB0aGlzIGJ5IHNwbGl0dGluZyAiXG4iCiAgICAg
c3BsaXRUZXh0Tm9kZShzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIDEp
OwogCi0gICAgaWYgKHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9k
ZSgpKSB7CisgICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9k
ZSgpICYmIGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpICYmIGNvbnRhaW5lck5vZGUt
PnByZXZpb3VzU2libGluZygpLT5pc1RleHROb2RlKCkpIHsKICAgICAgICAgQVNTRVJUKHN0YXJ0
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCkpOwotICAgICAgICBzdGFydCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2li
bGluZygpLCBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9u
SXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHN0YXJ0ID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8
VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgc3RhcnQub2Zmc2V0SW5D
b250YWluZXJOb2RlKCkpOwogICAgIH0KLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0g
ZW5kLmNvbnRhaW5lck5vZGUoKSkgeworICAgIGlmIChjb250YWluZXJOb2RlLmdldCgpID09IGVu
ZC5jb250YWluZXJOb2RlKCkgJiYgY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCkgJiYg
Y29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKSkgewogICAgICAg
ICBBU1NFUlQoZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5D
b250YWluZXJOb2RlKCkpOwotICAgICAgICBlbmQgPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5w
cmV2aW91c1NpYmxpbmcoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgZW5kID0gUG9zaXRpb24oc3RhdGlj
X2Nhc3Q8VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgZW5kLm9mZnNl
dEluQ29udGFpbmVyTm9kZSgpKTsKICAgICB9Ci0gICAgaWYgKG1fZW5kT2ZMYXN0UGFyYWdyYXBo
LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNv
bnRhaW5lck5vZGUuZ2V0KCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguY29udGFpbmVyTm9kZSgp
KSB7Ci0gICAgICAgIGlmIChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5v
ZGUoKSA8IHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgbV9l
bmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5wcmV2aW91c1NpYmxp
bmcoKSwgbV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAg
ICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUsIG1fZW5kT2ZM
YXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gbV9l
bmRPZkxhc3RQYXJhZ3JhcGguY29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIGlmIChtX2VuZE9m
TGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8IHBvc2l0aW9uLm9mZnNldElu
Q29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgICAgICAvLyBXZSBjYW4gb25seSBmaXggZW5kT2ZM
YXN0UGFyYWdyYXBoIGlmIHRoZSBwcmV2aW91cyBub2RlIHdhcyBzdGlsbCB0ZXh0IGFuZCBoYXNu
J3QgYmVlbiBtb2RpZmllZCBieSBzY3JpcHQuCisgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9k
ZS0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKQorICAgICAgICAgICAgICAgICYmIHN0
YXRpY19jYXN0PHVuc2lnbmVkPihtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKSkgPD0gc3RhdGljX2Nhc3Q8VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2li
bGluZygpKS0+bGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGgg
PSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJs
aW5nKCkpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Cisg
ICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlv
bihzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIG1fZW5kT2ZMYXN0UGFy
YWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSk7CiAgICAgfQogCi0gICAgcmV0dXJu
IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUuZ2V0KCksIHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVy
Tm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgcmV0
dXJuIFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihjb250YWluZXJOb2RlLmdldCgpKSwgcG9z
aXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSAxKTsKIH0KIAogUGFzc1JlZlB0cjxFbGVt
ZW50PiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6OmNyZWF0ZUJsb2NrRWxlbWVudCgpIGNvbnN0
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAko
cmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21t
YW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTExNyw2MCArMTExNyw2NSBAQCBib29sIEFwcGx5
U3R5bGVDb21tYW5kOjpub2RlRnVsbHlVbnNlbGVjCiAKIHZvaWQgQXBwbHlTdHlsZUNvbW1hbmQ6
OnNwbGl0VGV4dEF0U3RhcnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYg
ZW5kKQogewotICAgIEFTU0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+
aXNUZXh0Tm9kZSgpKTsKIAogICAgIFBvc2l0aW9uIG5ld0VuZDsKICAgICBpZiAoZW5kLmFuY2hv
clR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQ
b3NpdGlvbihlbmQuY29udGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkg
LSBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgICAgIG5ld0VuZCA9IFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQq
PihlbmQuY29udGFpbmVyTm9kZSgpKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3Rh
cnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgIGVsc2UKICAgICAgICAgbmV3RW5kID0g
ZW5kOwogCi0gICAgVGV4dCogdGV4dCA9IHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5kZXByZWNh
dGVkTm9kZSgpKTsKKyAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSk7CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBzdGFydC5vZmZzZXRJbkNv
bnRhaW5lck5vZGUoKSk7Ci0gICAgdXBkYXRlU3RhcnRFbmQoZmlyc3RQb3NpdGlvbkluTm9kZShz
dGFydC5kZXByZWNhdGVkTm9kZSgpKSwgbmV3RW5kKTsKKyAgICB1cGRhdGVTdGFydEVuZChmaXJz
dFBvc2l0aW9uSW5Ob2RlKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSksIG5ld0VuZCk7CiB9CiAKIHZv
aWQgQXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0RW5kKGNvbnN0IFBvc2l0aW9uJiBzdGFy
dCwgY29uc3QgUG9zaXRpb24mIGVuZCkKIHsKLSAgICBBU1NFUlQoZW5kLmFuY2hvclR5cGUoKSA9
PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBBU1NFUlQoZW5kLmNv
bnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsKIAogICAgIGJvb2wgc2hvdWxkVXBkYXRlU3Rh
cnQgPSBzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvciAmJiBzdGFydC5jb250YWluZXJOb2RlKCkgPT0gZW5kLmNvbnRhaW5lck5vZGUoKTsKICAg
ICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihlbmQuZGVwcmVjYXRlZE5vZGUoKSk7
CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwog
CiAgICAgTm9kZSogcHJldk5vZGUgPSB0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBBU1NF
UlQocHJldk5vZGUpOwotICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBkYXRlU3RhcnQg
PyBQb3NpdGlvbihwcmV2Tm9kZSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpIDogc3RhcnQ7CisgICAgaWYgKCFwcmV2Tm9k
ZSB8fCAhcHJldk5vZGUtPmlzVGV4dE5vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgUG9z
aXRpb24gbmV3U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHN0YXRpY19jYXN0
PFRleHQqPihwcmV2Tm9kZSksIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0YXJ0
OwogICAgIHVwZGF0ZVN0YXJ0RW5kKG5ld1N0YXJ0LCBsYXN0UG9zaXRpb25Jbk5vZGUocHJldk5v
ZGUpKTsKIH0KIAogdm9pZCBBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0RWxlbWVudEF0U3Rh
cnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIEFT
U0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsK
IAogICAgIFBvc2l0aW9uIG5ld0VuZDsKLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9
PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihlbmQuY29u
dGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cisg
ICAgaWYgKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQorICAg
ICAgICBuZXdFbmQgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZW5kLmNvbnRhaW5lck5v
ZGUoKSksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0Lm9mZnNldEluQ29udGFp
bmVyTm9kZSgpKTsKICAgICBlbHNlCiAgICAgICAgIG5ld0VuZCA9IGVuZDsKIAotICAgIFRleHQq
IHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7Ci0gICAg
c3BsaXRUZXh0Tm9kZUNvbnRhaW5pbmdFbGVtZW50KHRleHQsIHN0YXJ0LmRlcHJlY2F0ZWRFZGl0
aW5nT2Zmc2V0KCkpOwotICAgIHVwZGF0ZVN0YXJ0RW5kKFBvc2l0aW9uKHN0YXJ0LmRlcHJlY2F0
ZWROb2RlKCktPnBhcmVudE5vZGUoKSwgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKS0+bm9kZUluZGV4
KCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBuZXdFbmQpOworICAgIHNw
bGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChzdGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnQuY29u
dGFpbmVyTm9kZSgpKSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOworICAgIHVwZGF0
ZVN0YXJ0RW5kKHBvc2l0aW9uQmVmb3JlTm9kZShzdGFydC5jb250YWluZXJOb2RlKCkpLCBuZXdF
bmQpOwogfQogCiB2b2lkIEFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRFbGVtZW50QXRFbmQo
Y29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIEFTU0VS
VChlbmQuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3Ip
OworICAgIEFTU0VSVChlbmQuY29udGFpbmVyTm9kZSgpLT5pc1RleHROb2RlKCkpOwogCi0gICAg
Ym9vbCBzaG91bGRVcGRhdGVTdGFydCA9IHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQu
Y29udGFpbmVyTm9kZSgpOwotICAgIFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oZW5k
LmRlcHJlY2F0ZWROb2RlKCkpOwotICAgIHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudCh0
ZXh0LCBlbmQuZGVwcmVjYXRlZEVkaXRpbmdPZmZzZXQoKSk7CisgICAgYm9vbCBzaG91bGRVcGRh
dGVTdGFydCA9IHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpOwor
ICAgIHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChzdGF0aWNfY2FzdDxUZXh0Kj4oZW5k
LmNvbnRhaW5lck5vZGUoKSksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisKKyAgICBO
b2RlKiBwYXJlbnRFbGVtZW50ID0gZW5kLmNvbnRhaW5lck5vZGUoKS0+cGFyZW50Tm9kZSgpOwor
ICAgIGlmICghcGFyZW50RWxlbWVudCB8fCAhcGFyZW50RWxlbWVudC0+cHJldmlvdXNTaWJsaW5n
KCkpCisgICAgICAgIHJldHVybjsKKyAgICBOb2RlKiBmaXJzdFRleHROb2RlID0gcGFyZW50RWxl
bWVudC0+cHJldmlvdXNTaWJsaW5nKCktPmxhc3RDaGlsZCgpOworICAgIGlmICghZmlyc3RUZXh0
Tm9kZSB8fCAhZmlyc3RUZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICByZXR1cm47CiAK
LSAgICBOb2RlKiBwcmV2Tm9kZSA9IHRleHQtPnBhcmVudE5vZGUoKS0+cHJldmlvdXNTaWJsaW5n
KCktPmxhc3RDaGlsZCgpOwotICAgIEFTU0VSVChwcmV2Tm9kZSk7Ci0gICAgUG9zaXRpb24gbmV3
U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHByZXZOb2RlLCBzdGFydC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikg
OiBzdGFydDsKLSAgICB1cGRhdGVTdGFydEVuZChuZXdTdGFydCwgUG9zaXRpb24ocHJldk5vZGUt
PnBhcmVudE5vZGUoKSwgcHJldk5vZGUtPm5vZGVJbmRleCgpICsgMSwgUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcikpOworICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBk
YXRlU3RhcnQgPyBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZmlyc3RUZXh0Tm9kZSksIHN0
YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0YXJ0OworICAgIHVwZGF0ZVN0YXJ0RW5k
KG5ld1N0YXJ0LCBwb3NpdGlvbkFmdGVyTm9kZShmaXJzdFRleHROb2RlKSk7CiB9CiAKIGJvb2wg
QXBwbHlTdHlsZUNvbW1hbmQ6OnNob3VsZFNwbGl0VGV4dEVsZW1lbnQoRWxlbWVudCogZWxlbWVu
dCwgRWRpdGluZ1N0eWxlKiBzdHlsZSkKQEAgLTE0ODAsOSArMTQ4NSw5IEBAIHZvaWQgQXBwbHlT
dHlsZUNvbW1hbmQ6OmpvaW5DaGlsZFRleHROb2QKICAgICAgICAgICAgIFRleHQqIGNoaWxkVGV4
dCA9IHN0YXRpY19jYXN0PFRleHQgKj4oY2hpbGQpOwogICAgICAgICAgICAgVGV4dCogbmV4dFRl
eHQgPSBzdGF0aWNfY2FzdDxUZXh0ICo+KG5leHQpOwogICAgICAgICAgICAgaWYgKHN0YXJ0LmFu
Y2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIG5leHQg
PT0gc3RhcnQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgICAgIG5ld1N0YXJ0ID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgc3RhcnQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAg
ICAgICAgICAgIG5ld1N0YXJ0ID0gUG9zaXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0
aCgpICsgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgaWYgKGVu
ZC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciAmJiBu
ZXh0ID09IGVuZC5jb250YWluZXJOb2RlKCkpCi0gICAgICAgICAgICAgICAgbmV3RW5kID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgZW5kLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAg
ICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+bGVuZ3RoKCkg
KyBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgU3RyaW5nIHRleHRU
b01vdmUgPSBuZXh0VGV4dC0+ZGF0YSgpOwogICAgICAgICAgICAgaW5zZXJ0VGV4dEludG9Ob2Rl
KGNoaWxkVGV4dCwgY2hpbGRUZXh0LT5sZW5ndGgoKSwgdGV4dFRvTW92ZSk7CiAgICAgICAgICAg
ICByZW1vdmVOb2RlKG5leHQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0b3Iu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAkocmV2
aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0VkaXRvci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI2Niw3ICsyNjYsNyBAQCBib29sIEVkaXRvcjo6Y2FuRGVsZXRlUmFuZ2Uo
UmFuZ2UqIHJhbmdlCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAKICAgICBpZiAocmFuZ2Ut
PmNvbGxhcHNlZChlYykpIHsKLSAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0KFBvc2l0aW9u
KHN0YXJ0Q29udGFpbmVyLCByYW5nZS0+c3RhcnRPZmZzZXQoZWMpLCBQb3NpdGlvbjo6UG9zaXRp
b25Jc09mZnNldEluQW5jaG9yKSwgRE9XTlNUUkVBTSk7CisgICAgICAgIFZpc2libGVQb3NpdGlv
biBzdGFydChyYW5nZS0+c3RhcnRQb3NpdGlvbigpLCBET1dOU1RSRUFNKTsKICAgICAgICAgVmlz
aWJsZVBvc2l0aW9uIHByZXZpb3VzID0gc3RhcnQucHJldmlvdXMoKTsKICAgICAgICAgLy8gRklY
TUU6IFdlIHNvbWV0aW1lcyBhbGxvdyBkZWxldGlvbnMgYXQgdGhlIHN0YXJ0IG9mIGVkaXRhYmxl
IHJvb3RzLCBsaWtlIHdoZW4gdGhlIGNhcmV0IGlzIGluIGFuIGVtcHR5IGxpc3QgaXRlbS4KICAg
ICAgICAgaWYgKHByZXZpb3VzLmlzTnVsbCgpIHx8IHByZXZpb3VzLmRlZXBFcXVpdmFsZW50KCku
ZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpICE9IHN0YXJ0Q29udGFpbmVy
LT5yb290RWRpdGFibGVFbGVtZW50KCkpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Zy
YW1lU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gODk3MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTQ2Miw0NSArMTQ2Miwy
MyBAQCB2b2lkIEZyYW1lU2VsZWN0aW9uOjpzZWxlY3RBbGwoKQogCiBib29sIEZyYW1lU2VsZWN0
aW9uOjpzZXRTZWxlY3RlZFJhbmdlKFJhbmdlKiByYW5nZSwgRUFmZmluaXR5IGFmZmluaXR5LCBi
b29sIGNsb3NlVHlwaW5nKQogewotICAgIGlmICghcmFuZ2UpCisgICAgaWYgKCFyYW5nZSB8fCAh
cmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCkgfHwgIXJhbmdlLT5lbmRDb250YWluZXIoKSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIEFTU0VSVChyYW5nZS0+c3RhcnRDb250YWluZXIoKS0+ZG9j
dW1lbnQoKSA9PSByYW5nZS0+ZW5kQ29udGFpbmVyKCktPmRvY3VtZW50KCkpOwogCi0gICAgRXhj
ZXB0aW9uQ29kZSBlYyA9IDA7Ci0gICAgTm9kZSogc3RhcnRDb250YWluZXIgPSByYW5nZS0+c3Rh
cnRDb250YWluZXIoZWMpOwotICAgIGlmIChlYykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgTm9kZSogZW5kQ29udGFpbmVyID0gcmFuZ2UtPmVuZENvbnRhaW5lcihlYyk7Ci0gICAgaWYg
KGVjKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgQVNTRVJUKHN0YXJ0Q29udGFp
bmVyKTsKLSAgICBBU1NFUlQoZW5kQ29udGFpbmVyKTsKLSAgICBBU1NFUlQoc3RhcnRDb250YWlu
ZXItPmRvY3VtZW50KCkgPT0gZW5kQ29udGFpbmVyLT5kb2N1bWVudCgpKTsKLSAgICAKICAgICBt
X2ZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMo
KTsKIAogICAgIC8vIE5vbi1jb2xsYXBzZWQgcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCB0byBzdGFy
dCBhdCB0aGUgZW5kIG9mIGEgbGluZSB0aGF0IGlzIHdyYXBwZWQsCiAgICAgLy8gdGhleSBzdGFy
dCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUgaW5zdGVhZAorICAgIEV4Y2VwdGlv
bkNvZGUgZWMgPSAwOwogICAgIGJvb2wgY29sbGFwc2VkID0gcmFuZ2UtPmNvbGxhcHNlZChlYyk7
CiAgICAgaWYgKGVjKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgaW50IHN0YXJ0
T2Zmc2V0ID0gcmFuZ2UtPnN0YXJ0T2Zmc2V0KGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKIAotICAgIGludCBlbmRPZmZzZXQgPSByYW5nZS0+ZW5kT2Zmc2V0KGVjKTsK
LSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKICAgICAvLyBGSVhNRTog
Q2FuIHdlIHByb3ZpZGUgZXh0ZW50QWZmaW5pdHk/Ci0gICAgVmlzaWJsZVBvc2l0aW9uIHZpc2li
bGVTdGFydChQb3NpdGlvbihzdGFydENvbnRhaW5lciwgc3RhcnRPZmZzZXQsIFBvc2l0aW9uOjpQ
b3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBjb2xsYXBzZWQgPyBhZmZpbml0eSA6IERPV05TVFJF
QU0pOwotICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlRW5kKFBvc2l0aW9uKGVuZENvbnRhaW5l
ciwgZW5kT2Zmc2V0LCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSwgU0VMX0RF
RkFVTFRfQUZGSU5JVFkpOwotICAgIFNldFNlbGVjdGlvbk9wdGlvbnMgb3B0aW9ucyA9IENsZWFy
VHlwaW5nU3R5bGU7Ci0gICAgaWYgKGNsb3NlVHlwaW5nKQotICAgICAgICBvcHRpb25zIHw9IENs
b3NlVHlwaW5nOwotICAgIHNldFNlbGVjdGlvbihWaXNpYmxlU2VsZWN0aW9uKHZpc2libGVTdGFy
dCwgdmlzaWJsZUVuZCksIG9wdGlvbnMpOworICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlU3Rh
cnQocmFuZ2UtPnN0YXJ0UG9zaXRpb24oKSwgY29sbGFwc2VkID8gYWZmaW5pdHkgOiBET1dOU1RS
RUFNKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZUVuZChyYW5nZS0+ZW5kUG9zaXRpb24o
KSwgU0VMX0RFRkFVTFRfQUZGSU5JVFkpOworICAgIHNldFNlbGVjdGlvbihWaXNpYmxlU2VsZWN0
aW9uKHZpc2libGVTdGFydCwgdmlzaWJsZUVuZCksIENsZWFyVHlwaW5nU3R5bGUgfCAoY2xvc2VU
eXBpbmcgPyBDbG9zZVR5cGluZyA6IDApKTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcAkocmV2aXNpb24gODk3
MzEpCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVQb3NpdGlvbi5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTU1MiwxNSArNTUyLDE0IEBAIFVDaGFyMzIgVmlzaWJsZVBvc2l0aW9uOjpj
aGFyYWN0ZXJBZnRlcigKICAgICBjYXNlIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNo
b3I6CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICB1bnNpZ25lZCBvZmZzZXQgPSBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4ocG9zLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKICAgICBUZXh0KiB0
ZXh0Tm9kZSA9IHN0YXRpY19jYXN0PFRleHQqPihwb3MuY29udGFpbmVyTm9kZSgpKTsKLSAgICB1
bnNpZ25lZCBvZmZzZXQgPSBwb3MuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklz
T2Zmc2V0SW5BbmNob3IgPyBwb3Mub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgOiAwOwotICAgIHVu
c2lnbmVkIGxlbmd0aCA9IHRleHROb2RlLT5sZW5ndGgoKTsKLSAgICBpZiAob2Zmc2V0ID49IGxl
bmd0aCkKKyAgICBpZiAob2Zmc2V0ID49IHRleHROb2RlLT5sZW5ndGgoKSkKICAgICAgICAgcmV0
dXJuIDA7CiAKICAgICBVQ2hhcjMyIGNoOwogICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0g
dGV4dE5vZGUtPmRhdGEoKS5jaGFyYWN0ZXJzKCk7Ci0gICAgVTE2X05FWFQoY2hhcmFjdGVycywg
b2Zmc2V0LCBsZW5ndGgsIGNoKTsKKyAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBvZmZzZXQsIHRl
eHROb2RlLT5sZW5ndGgoKSwgY2gpOwogICAgIHJldHVybiBjaDsKIH0KIApAQCAtNjQ5LDE0ICs2
NDgsMTIgQEAgUGFzc1JlZlB0cjxSYW5nZT4gbWFrZVJhbmdlKGNvbnN0IFZpc2libAogCiBWaXNp
YmxlUG9zaXRpb24gc3RhcnRWaXNpYmxlUG9zaXRpb24oY29uc3QgUmFuZ2UgKnIsIEVBZmZpbml0
eSBhZmZpbml0eSkKIHsKLSAgICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICByZXR1cm4gVmlzaWJs
ZVBvc2l0aW9uKFBvc2l0aW9uKHItPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIHItPnN0YXJ0
T2Zmc2V0KGV4Y2VwdGlvbiksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBh
ZmZpbml0eSk7CisgICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihyLT5zdGFydFBvc2l0aW9uKCks
IGFmZmluaXR5KTsKIH0KIAogVmlzaWJsZVBvc2l0aW9uIGVuZFZpc2libGVQb3NpdGlvbihjb25z
dCBSYW5nZSAqciwgRUFmZmluaXR5IGFmZmluaXR5KQogewotICAgIGludCBleGNlcHRpb24gPSAw
OwotICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24oci0+ZW5kQ29udGFpbmVyKGV4
Y2VwdGlvbiksIHItPmVuZE9mZnNldChleGNlcHRpb24pLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yKSwgYWZmaW5pdHkpOworICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oci0+
ZW5kUG9zaXRpb24oKSwgYWZmaW5pdHkpOwogfQogCiBib29sIHNldFN0YXJ0KFJhbmdlICpyLCBj
b25zdCBWaXNpYmxlUG9zaXRpb24gJnZpc2libGVQb3NpdGlvbikKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCShyZXZpc2lvbiA4OTczMSkKKysrIFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MDIsOCArNDAy
LDcgQEAgYm9vbCBpc1NwZWNpYWxFbGVtZW50KGNvbnN0IE5vZGUgKm4pCiAKIHN0YXRpYyBOb2Rl
KiBmaXJzdEluU3BlY2lhbEVsZW1lbnQoY29uc3QgUG9zaXRpb24mIHBvcykKIHsKLSAgICAvLyBG
SVhNRTogVGhpcyBiZWdpbnMgYXQgcG9zLmRlcHJlY2F0ZWROb2RlKCksIHdoaWNoIGRvZXNuJ3Qg
bmVjZXNzYXJpbHkgY29udGFpbiBwb3MgKHN1cHBvc2UgcG9zIHdhcyBbaW1nLCAwXSkuICBTZWUg
PHJkYXI6Ly9wcm9ibGVtLzUwMjc3MDI+LgotICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQg
PSBwb3MuZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIE5vZGUq
IHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuY29udGFpbmVyTm9kZSgpLT5yb290RWRpdGFibGVF
bGVtZW50KCk7CiAgICAgZm9yIChOb2RlKiBuID0gcG9zLmRlcHJlY2F0ZWROb2RlKCk7IG4gJiYg
bi0+cm9vdEVkaXRhYmxlRWxlbWVudCgpID09IHJvb3RFZGl0YWJsZUVsZW1lbnQ7IG4gPSBuLT5w
YXJlbnROb2RlKCkpCiAgICAgICAgIGlmIChpc1NwZWNpYWxFbGVtZW50KG4pKSB7CiAgICAgICAg
ICAgICBWaXNpYmxlUG9zaXRpb24gdlBvcyA9IFZpc2libGVQb3NpdGlvbihwb3MsIERPV05TVFJF
QU0pOwpAQCAtNDE4LDEyICs0MTcsMTEgQEAgc3RhdGljIE5vZGUqIGZpcnN0SW5TcGVjaWFsRWxl
bWVudChjb25zdAogCiBzdGF0aWMgTm9kZSogbGFzdEluU3BlY2lhbEVsZW1lbnQoY29uc3QgUG9z
aXRpb24mIHBvcykKIHsKLSAgICAvLyBGSVhNRTogVGhpcyBiZWdpbnMgYXQgcG9zLmRlcHJlY2F0
ZWROb2RlKCksIHdoaWNoIGRvZXNuJ3QgbmVjZXNzYXJpbHkgY29udGFpbiBwb3MgKHN1cHBvc2Ug
cG9zIHdhcyBbaW1nLCAwXSkuICBTZWUgPHJkYXI6Ly9wcm9ibGVtLzUwMjc3MDI+LgotICAgIE5v
ZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRh
YmxlRWxlbWVudCgpOworICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuY29udGFp
bmVyTm9kZSgpLT5yb290RWRpdGFibGVFbGVtZW50KCk7CiAgICAgZm9yIChOb2RlKiBuID0gcG9z
LmRlcHJlY2F0ZWROb2RlKCk7IG4gJiYgbi0+cm9vdEVkaXRhYmxlRWxlbWVudCgpID09IHJvb3RF
ZGl0YWJsZUVsZW1lbnQ7IG4gPSBuLT5wYXJlbnROb2RlKCkpCiAgICAgICAgIGlmIChpc1NwZWNp
YWxFbGVtZW50KG4pKSB7CiAgICAgICAgICAgICBWaXNpYmxlUG9zaXRpb24gdlBvcyA9IFZpc2li
bGVQb3NpdGlvbihwb3MsIERPV05TVFJFQU0pOwotICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9u
IGxhc3RJbkVsZW1lbnQgPSBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24obiwgbi0+Y2hpbGROb2Rl
Q291bnQoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciksIERPV05TVFJFQU0p
OworICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxhc3RJbkVsZW1lbnQgPSBWaXNpYmxlUG9z
aXRpb24obGFzdFBvc2l0aW9uSW5PckFmdGVyTm9kZShuKSwgRE9XTlNUUkVBTSk7CiAgICAgICAg
ICAgICBpZiAoaXNUYWJsZUVsZW1lbnQobikgJiYgdlBvcyA9PSBsYXN0SW5FbGVtZW50LnByZXZp
b3VzKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICBpZiAodlBvcyA9
PSBsYXN0SW5FbGVtZW50KQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3Vu
aXRzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5p
dHMuY3BwCShyZXZpc2lvbiA4OTczMSkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJs
ZV91bml0cy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQzNywxMiArNDM3LDEyIEBAIHN0YXRpYyBW
aXNpYmxlUG9zaXRpb24gZW5kUG9zaXRpb25Gb3JMaW4KICAgICBQb3NpdGlvbiBwb3M7CiAgICAg
aWYgKGVuZE5vZGUtPmhhc1RhZ05hbWUoYnJUYWcpKSB7CiAgICAgICAgIHBvcyA9IHBvc2l0aW9u
QmVmb3JlTm9kZShlbmROb2RlKTsKLSAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxpbmVUZXh0
Qm94KCkpIHsKLSAgICAgICAgSW5saW5lVGV4dEJveCAqZW5kVGV4dEJveCA9IHN0YXRpY19jYXN0
PElubGluZVRleHRCb3ggKj4oZW5kQm94KTsKKyAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxp
bmVUZXh0Qm94KCkgJiYgZW5kTm9kZS0+aXNUZXh0Tm9kZSgpKSB7CisgICAgICAgIElubGluZVRl
eHRCb3gqIGVuZFRleHRCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94ICo+KGVuZEJveCk7
CiAgICAgICAgIGludCBlbmRPZmZzZXQgPSBlbmRUZXh0Qm94LT5zdGFydCgpOwogICAgICAgICBp
ZiAoIWVuZFRleHRCb3gtPmlzTGluZUJyZWFrKCkpCiAgICAgICAgICAgICBlbmRPZmZzZXQgKz0g
ZW5kVGV4dEJveC0+bGVuKCk7Ci0gICAgICAgIHBvcyA9IFBvc2l0aW9uKGVuZE5vZGUsIGVuZE9m
ZnNldCwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHBvcyA9
IFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihlbmROb2RlKSwgZW5kT2Zmc2V0KTsKICAgICB9
IGVsc2UKICAgICAgICAgcG9zID0gcG9zaXRpb25BZnRlck5vZGUoZW5kTm9kZSk7CiAgICAgCkBA
IC03OTMsNiArNzkzLDcgQEAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZQYXJhZ3JhcGgoY29uc3Qg
VgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgaWYgKHItPmlzVGV4dCgpICYmIHItPmNh
cmV0TWF4UmVuZGVyZWRPZmZzZXQoKSA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChuLT5pc1Rl
eHROb2RlKCkpOwogICAgICAgICAgICAgdHlwZSA9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0
SW5BbmNob3I7CiAgICAgICAgICAgICBpZiAoc3R5bGUtPnByZXNlcnZlTmV3bGluZSgpKSB7CiAg
ICAgICAgICAgICAgICAgY29uc3QgVUNoYXIqIGNoYXJzID0gdG9SZW5kZXJUZXh0KHIpLT5jaGFy
YWN0ZXJzKCk7CkBAIC04MDAsOSArODAxLDEwIEBAIFZpc2libGVQb3NpdGlvbiBzdGFydE9mUGFy
YWdyYXBoKGNvbnN0IFYKICAgICAgICAgICAgICAgICBpbnQgbyA9IG9mZnNldDsKICAgICAgICAg
ICAgICAgICBpZiAobiA9PSBzdGFydE5vZGUgJiYgbyA8IGkpCiAgICAgICAgICAgICAgICAgICAg
IGkgPSBtYXgoMCwgbyk7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKC0taSA+PSAwKQorICAgICAg
ICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hh
cnNbaV0gPT0gJ1xuJykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9z
aXRpb24oUG9zaXRpb24obiwgaSArIDEsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNo
b3IpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxl
UG9zaXRpb24oUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KG4pLCBpICsgMSksIERPV05TVFJF
QU0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGUg
PSBuOwogICAgICAgICAgICAgb2Zmc2V0ID0gMDsKQEAgLTgxNSw5ICs4MTcsMTEgQEAgVmlzaWJs
ZVBvc2l0aW9uIHN0YXJ0T2ZQYXJhZ3JhcGgoY29uc3QgVgogICAgICAgICAgICAgbiA9IG4tPnRy
YXZlcnNlUHJldmlvdXNOb2RlUG9zdE9yZGVyKHN0YXJ0QmxvY2spOwogICAgIH0KIAotICAgIGlm
ICh0eXBlID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCisgICAgaWYgKHR5
cGUgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikgeworICAgICAgICBBU1NF
UlQodHlwZSAhPSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yIHx8ICFvZmZzZXQp
OwogICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG5vZGUsIG9mZnNldCwg
dHlwZSksIERPV05TVFJFQU0pOwotICAgIAorICAgIH0KKwogICAgIHJldHVybiBWaXNpYmxlUG9z
aXRpb24oUG9zaXRpb24obm9kZSwgdHlwZSksIERPV05TVFJFQU0pOwogfQogCkBAIC04NjcsMTQg
Kzg3MSwxNiBAQCBWaXNpYmxlUG9zaXRpb24gZW5kT2ZQYXJhZ3JhcGgoY29uc3QgVmlzCiAKICAg
ICAgICAgLy8gRklYTUU6IFdlIGF2b2lkIHJldHVybmluZyBhIHBvc2l0aW9uIHdoZXJlIHRoZSBy
ZW5kZXJlciBjYW4ndCBhY2NlcHQgdGhlIGNhcmV0LgogICAgICAgICBpZiAoci0+aXNUZXh0KCkg
JiYgci0+Y2FyZXRNYXhSZW5kZXJlZE9mZnNldCgpID4gMCkgeworICAgICAgICAgICAgQVNTRVJU
KG4tPmlzVGV4dE5vZGUoKSk7CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdG9SZW5kZXJUZXh0
KHIpLT50ZXh0TGVuZ3RoKCk7CiAgICAgICAgICAgICB0eXBlID0gUG9zaXRpb246OlBvc2l0aW9u
SXNPZmZzZXRJbkFuY2hvcjsKICAgICAgICAgICAgIGlmIChzdHlsZS0+cHJlc2VydmVOZXdsaW5l
KCkpIHsKICAgICAgICAgICAgICAgICBjb25zdCBVQ2hhciogY2hhcnMgPSB0b1JlbmRlclRleHQo
ciktPmNoYXJhY3RlcnMoKTsKICAgICAgICAgICAgICAgICBpbnQgbyA9IG4gPT0gc3RhcnROb2Rl
ID8gb2Zmc2V0IDogMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gbzsgaSA8IGxlbmd0
aDsgKytpKQorICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBvOyBpIDwgbGVuZ3RoOyArK2kp
IHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcbicpCi0gICAgICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG4sIGksIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24oc3RhdGljX2Nhc3Q8
VGV4dCo+KG4pLCBpKSwgRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAg
ICAgfQogICAgICAgICAgICAgbm9kZSA9IG47CiAgICAgICAgICAgICBvZmZzZXQgPSByLT5jYXJl
dE1heE9mZnNldCgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98844</attachid>
            <date>2011-06-27 19:11:00 -0700</date>
            <delta_ts>2011-06-28 11:32:18 -0700</delta_ts>
            <desc>Added containerText</desc>
            <filename>bug-63384-20110627191059.patch</filename>
            <type>text/plain</type>
            <size>34139</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg5ODgwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjAgQEAKKzIwMTEtMDYtMjcgIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgU3RvcCBpbnN0YW50aWF0aW5nIFBvc2l0aW9uIHdpdGggUG9zaXRp
b25Jc09mZnNldEluQW5jaG9yIGluIHZhcmlvdXMgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzg0CisKKyAgICAgICAgUmVmYWN0b3Jpbmcu
CisKKyAgICAgICAgUmVtb3ZlZCBtYW55IGlmIGNvbmRpdGlvbnMgdGhhdCBjb21wYXJlZCB0aGUg
YW5jaG9yIHR5cGUgdG8gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcgorICAgICAg
ICBiZWNhdXNlIHRoZXJlIHdlcmUgYWxzbyBjaGVja2luZyB0aGF0IGNvbnRhaW5lck5vZGUgaXMg
YSB0ZXh0IG5vZGUuCisKKyAgICAgICAgQWxzbyBhZGRlZCBQb3NpdGlvbjo6Y29udGFpbmVyVGV4
dCgpIHRvIGF2b2lkIG1hbnVhbGx5IGNhc3RpbmcgY29udGFpbmVyTm9kZSgpLgorCisgICAgICAg
ICogZG9tL1Bvc2l0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBvc2l0aW9uOjpQb3NpdGlv
bik6IEFkZGVkIGFuIGFzc2VydGlvbiB0byBlbnN1cmUgQmVmb3JlQ2hpbGRyZW4vQWZ0ZXJDaGls
ZHJlbgorICAgICAgICBhbmNob3IgdHlwZSB3b24ndCBiZSB1c2VkIGZvciBhIG5vZGUgd2hvc2Ug
Y29udGVudHMgaXMgaWdub3JlZCBieSBlZGl0aW5nLgorICAgICAgICAoV2ViQ29yZTo6UG9zaXRp
b246OmNvbnRhaW5lclRleHQpOiBBZGRlZC4KKyAgICAgICAgKiBkb20vUG9zaXRpb24uaDoKKyAg
ICAgICAgKiBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjppc05ld0xpbmVBdFBvc2l0aW9uKTogUmVtb3ZlZCBhIHJlZHVuZGFudCBjb21wYXJp
c29uIG9mIGFuY2hvciB0eXBlLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlCbG9ja0VsZW1lbnRD
b21tYW5kOjpyYW5nZUZvclBhcmFncmFwaFNwbGl0dGluZ1RleHROb2Rlc0lmTmVlZGVkKTogU2lu
Y2UgY29udGFpbmVyTm9kZQorICAgICAgICBpcyBhbHdheXMgYSB0ZXh0IG5vZGUgd2hlbiByZW5k
ZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUgcmV0dXJucyBhIHJlbmRlciBzdHlsZSwgdXNlIG5l
dyBQb3NpdGlvbgorICAgICAgICBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIFRleHQqIGFuZCBvZmZz
ZXQuCisgICAgICAgIChXZWJDb3JlOjpBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6OmVuZE9mTmV4
dFBhcmFncmFoU3BsaXR0aW5nVGV4dE5vZGVzSWZOZWVkZWQpOiBSZW1vdmVkIHJlZHVuZGFudAor
ICAgICAgICBjb21wYXJpc29uIG9mIGFuY2hvciB0eXBlIGFuZCB1c2UgbmV3IFBvc2l0aW9uIGNv
bnN0cnVjdG9yIHRoYXQgdGFrZXMgVGV4dCogYW5kIG9mZnNldC4KKyAgICAgICAgKiBlZGl0aW5n
L0FwcGx5U3R5bGVDb21tYW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5U3R5bGVDb21t
YW5kOjpzcGxpdFRleHRBdFN0YXJ0KTogUmVwbGFjZWQgYW4gYXNzZXJ0aW9uIHRoYXQgY29tcGFy
ZWQgYW5jaG9yIHR5cGUgYnkKKyAgICAgICAgYW4gYXNzZXJ0aW9uIHRoYXQgdGhlIGNvbnRhaW5l
ciBub2RlIGlzIGEgdGV4dCBub2RlOyB1c2UgbmV3IGNvbnN0cnVjdG9yLgorICAgICAgICAoV2Vi
Q29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0RW5kKTogRGl0dG87IGFsc28gYWRk
ZWQgZWFybHkgZXhpdHMgaW4gdGhlIGNhc2Ugc2NyaXB0CisgICAgICAgIG1vZGlmaWVkIERPTS4K
KyAgICAgICAgKFdlYkNvcmU6OkFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRFbGVtZW50QXRT
dGFydCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0
VGV4dEVsZW1lbnRBdEVuZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNv
bW1hbmQ6OmpvaW5DaGlsZFRleHROb2Rlcyk6IFVzZSBuZXcgY29uc3RydWN0b3IuCisgICAgICAg
ICogZWRpdGluZy9Db21wb3NpdGVFZGl0Q29tbWFuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpF
ZGl0b3I6OnJlcGxhY2VTZWxlY3RlZFRleHRJbk5vZGUpOiBDYWxscyBjb250YWluZXJUZXh0IGlu
c3RlYWQgb2YgbWFudWFsbHkgY2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRp
bmcvRWRpdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVkaXRvcjo6Y2FuRGVsZXRlUmFuZ2Up
OiBDYWxsIFJhbmdlOjpzdGFydFBvc2l0aW9uIGluc3RlYWQgb2YgbWFudWFsbHkgaW5zdGFudGlh
dGluZyBQb3NpdGlvbgorICAgICAgICBieSBjYWxsaW5nIHN0YXJ0Q29udGFpbmVyIGFuZCBzdGFy
dE9mZnNldC4KKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAg
KFdlYkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3RlZFJhbmdlKTogRGl0dG8uCisgICAg
ICAgICogZWRpdGluZy9JbnNlcnRUZXh0Q29tbWFuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJ
bnNlcnRUZXh0Q29tbWFuZDo6aW5wdXQpOiBDYWxscyBjb250YWluZXJUZXh0IGluc3RlYWQgb2Yg
bWFudWFsbHkgY2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRpbmcvUmVwbGFj
ZVNlbGVjdGlvbkNvbW1hbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVwbGFjZVNlbGVjdGlv
bkNvbW1hbmQ6OmRvQXBwbHkpOiBDYWxscyBjb250YWluZXJUZXh0IGluc3RlYWQgb2YgbWFudWFs
bHkgY2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVBvc2l0
aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbjo6Y2hhcmFjdGVyQWZ0
ZXIpOiBSZW1vdmVkIGEgcmVkdW5kYW50IGFuY2hvciB0eXBlIGNvbXBhcmlzb24uCisgICAgICAg
IChXZWJDb3JlOjpzdGFydFZpc2libGVQb3NpdGlvbik6IENhbGwgUmFuZ2U6OnN0YXJ0UG9zaXRp
b24gaW5zdGVhZCBvZiBzdGFydENvbnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgIChX
ZWJDb3JlOjplbmRWaXNpYmxlUG9zaXRpb24pOiBDYWxsIFJhbmdlOjplbmRQb3NpdGlvbiBpbnN0
ZWFkIG9mIGVuZENvbnRhaW5lciBhbmQgZW5kT2Zmc2V0LgorICAgICAgICAqIGVkaXRpbmcvaHRt
bGVkaXRpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RJblNwZWNpYWxFbGVtZW50KTog
Q2FsbCBjb250YWluZXJOb2RlKCkgdG8gYWRkcmVzcyA8cmRhcjovL3Byb2JsZW0vNTAyNzcwMj4u
CisgICAgICAgIChXZWJDb3JlOjpsYXN0SW5TcGVjaWFsRWxlbWVudCk6IERpdHRvOyB1c2UgbmV3
IGNvbnN0cnVjdG9yLgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjplbmRQb3NpdGlvbkZvckxpbmUpOiBVc2UgbmV3IGNvbnN0cnVjdG9yLgor
ICAgICAgICAoV2ViQ29yZTo6c3RhcnRPZlBhcmFncmFwaCk6IERpdHRvLgorICAgICAgICAoV2Vi
Q29yZTo6ZW5kT2ZQYXJhZ3JhcGgpOiBEaXR0by4KKwogMjAxMS0wNi0yNyAgQnJpYW4gV2VpbnN0
ZWluICA8YndlaW5zdGVpbkBhcHBsZS5jb20+CiAKICAgICAgICAgRml4IHRoZSBXZWJDb3JlIHZj
cHJvaiBmaWxlIGFmdGVyIHI4OTg1MS4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlv
bi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1Bvc2l0aW9uLmNwcAkocmV2
aXNpb24gODk4ODApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC05MSw3ICs5MSw4IEBAIFBvc2l0aW9uOjpQb3NpdGlvbihQYXNzUmVmUHRyPE5v
ZGU+IGFuY2gKIHsKICAgICBBU1NFUlQoIW1fYW5jaG9yTm9kZSB8fCAhbV9hbmNob3JOb2RlLT5p
c1NoYWRvd1Jvb3QoKSk7CiAgICAgQVNTRVJUKGFuY2hvclR5cGUgIT0gUG9zaXRpb25Jc09mZnNl
dEluQW5jaG9yKTsKLSAgICBBU1NFUlQoISgoYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQmVmb3Jl
Q2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQWZ0ZXJDaGlsZHJlbikgJiYgbV9h
bmNob3JOb2RlLT5pc1RleHROb2RlKCkpKTsKKyAgICBBU1NFUlQoISgoYW5jaG9yVHlwZSA9PSBQ
b3NpdGlvbklzQmVmb3JlQ2hpbGRyZW4gfHwgYW5jaG9yVHlwZSA9PSBQb3NpdGlvbklzQWZ0ZXJD
aGlsZHJlbikKKyAgICAgICAgICAgICAmJiAobV9hbmNob3JOb2RlLT5pc1RleHROb2RlKCkgfHwg
ZWRpdGluZ0lnbm9yZXNDb250ZW50KG1fYW5jaG9yTm9kZS5nZXQoKSkpKSk7CiB9CiAKIFBvc2l0
aW9uOjpQb3NpdGlvbihQYXNzUmVmUHRyPE5vZGU+IGFuY2hvck5vZGUsIGludCBvZmZzZXQsIEFu
Y2hvclR5cGUgYW5jaG9yVHlwZSkKQEAgLTE0OCw2ICsxNDksMjUgQEAgTm9kZSogUG9zaXRpb246
OmNvbnRhaW5lck5vZGUoKSBjb25zdAogICAgIHJldHVybiAwOwogfQogCitUZXh0KiBQb3NpdGlv
bjo6Y29udGFpbmVyVGV4dCgpIGNvbnN0Cit7CisgICAgaWYgKCFtX2FuY2hvck5vZGUgfHwgIW1f
YW5jaG9yTm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN3aXRj
aCAoYW5jaG9yVHlwZSgpKSB7CisgICAgY2FzZSBQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I6Cisg
ICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUZXh0Kj4obV9hbmNob3JOb2RlLmdldCgpKTsKKyAg
ICBjYXNlIFBvc2l0aW9uSXNCZWZvcmVBbmNob3I6CisgICAgY2FzZSBQb3NpdGlvbklzQWZ0ZXJB
bmNob3I6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgUG9zaXRpb25Jc0JlZm9yZUNoaWxk
cmVuOgorICAgIGNhc2UgUG9zaXRpb25Jc0FmdGVyQ2hpbGRyZW46CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKK30KKwogaW50
IFBvc2l0aW9uOjpjb21wdXRlT2Zmc2V0SW5Db250YWluZXJOb2RlKCkgY29uc3QKIHsKICAgICBp
ZiAoIW1fYW5jaG9yTm9kZSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5oCShyZXZpc2lvbiA4OTg4
MCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC05
Niw2ICs5Niw4IEBAIHB1YmxpYzoKICAgICAvLyBUaGVzZSBhcmUgYWx3YXlzIERPTSBjb21wbGlh
bnQgdmFsdWVzLiAgRWRpdGluZyBwb3NpdGlvbnMgbGlrZSBbaW1nLCAwXSAoYWthIFtpbWcsIGJl
Zm9yZV0pCiAgICAgLy8gd2lsbCByZXR1cm4gaW1nLT5wYXJlbnROb2RlKCkgYW5kIGltZy0+bm9k
ZUluZGV4KCkgZnJvbSB0aGVzZSBmdW5jdGlvbnMuCiAgICAgTm9kZSogY29udGFpbmVyTm9kZSgp
IGNvbnN0OyAvLyBOVUxMIGZvciBhIGJlZm9yZS9hZnRlciBwb3NpdGlvbiBhbmNob3JlZCB0byBh
IG5vZGUgd2l0aCBubyBwYXJlbnQKKyAgICBUZXh0KiBjb250YWluZXJUZXh0KCkgY29uc3Q7CisK
ICAgICBpbnQgY29tcHV0ZU9mZnNldEluQ29udGFpbmVyTm9kZSgpIGNvbnN0OyAgLy8gTyhuKSBm
b3IgYmVmb3JlL2FmdGVyLWFuY2hvcmVkIHBvc2l0aW9ucywgTygxKSBmb3IgcGFyZW50LWFuY2hv
cmVkIHBvc2l0aW9ucwogICAgIFBvc2l0aW9uIHBhcmVudEFuY2hvcmVkRXF1aXZhbGVudCgpIGNv
bnN0OyAvLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIERPTSBwb3NpdGlvbnMgdGhhdCBhbHNvIGZp
eGVzIHVwIHNvbWUgcG9zaXRpb25zIGZvciBlZGl0aW5nCiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHAJKHJldmlzaW9u
IDg5ODgwKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseUJsb2NrRWxlbWVudENvbW1h
bmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsOSArMTUwLDYgQEAgdm9pZCBBcHBseUJsb2Nr
RWxlbWVudENvbW1hbmQ6OmZvcm1hdFNlbAogCiBzdGF0aWMgYm9vbCBpc05ld0xpbmVBdFBvc2l0
aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlvbikKIHsKLSAgICBpZiAocG9zaXRpb24uYW5jaG9y
VHlwZSgpICE9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLQogICAgIE5vZGUqIHRleHROb2RlID0gcG9zaXRpb24uY29udGFpbmVyTm9k
ZSgpOwogICAgIGludCBvZmZzZXQgPSBwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsK
ICAgICBpZiAoIXRleHROb2RlIHx8ICF0ZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpIHx8IG9mZnNldCA8
IDAgfHwgb2Zmc2V0ID49IHRleHROb2RlLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkKQEAgLTE4MSw5
ICsxNzgsOCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6cmFuZ2VGb3JQCiAgICAg
c3RhcnQgPSBzdGFydE9mUGFyYWdyYXBoKGVuZE9mQ3VycmVudFBhcmFncmFwaCkuZGVlcEVxdWl2
YWxlbnQoKTsKICAgICBlbmQgPSBlbmRPZkN1cnJlbnRQYXJhZ3JhcGguZGVlcEVxdWl2YWxlbnQo
KTsKIAotICAgIFJlbmRlclN0eWxlKiBzdGFydFN0eWxlID0gcmVuZGVyU3R5bGVPZkVuY2xvc2lu
Z1RleHROb2RlKHN0YXJ0KTsKICAgICBib29sIGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlID0gZmFs
c2U7Ci0gICAgaWYgKHN0YXJ0U3R5bGUpIHsKKyAgICBpZiAoUmVuZGVyU3R5bGUqIHN0YXJ0U3R5
bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUoc3RhcnQpKSB7CiAgICAgICAgIGlz
U3RhcnRBbmRFbmRPblNhbWVOb2RlID0gcmVuZGVyU3R5bGVPZkVuY2xvc2luZ1RleHROb2RlKGVu
ZCkgJiYgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSA9PSBlbmQuZGVwcmVjYXRlZE5vZGUoKTsKICAg
ICAgICAgYm9vbCBpc1N0YXJ0QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSA9IHJlbmRl
clN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFncmFwaCkgJiYgc3RhcnQu
ZGVwcmVjYXRlZE5vZGUoKSA9PSBtX2VuZE9mTGFzdFBhcmFncmFwaC5kZXByZWNhdGVkTm9kZSgp
OwogCkBAIC0xOTQsNDUgKzE5MCw0MCBAQCB2b2lkIEFwcGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6
cmFuZ2VGb3JQCiAgICAgICAgIC8vIElmIHN0YXJ0IGlzIGluIHRoZSBtaWRkbGUgb2YgYSB0ZXh0
IG5vZGUsIHNwbGl0LgogICAgICAgICBpZiAoIXN0YXJ0U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFj
ZSgpICYmIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpID4gMCkgewogICAgICAgICAgICAg
aW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCk7Ci0gICAgICAg
ICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5kZXByZWNhdGVkTm9k
ZSgpKSwgc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgc3RhcnQgPSBmaXJzdFBvc2l0aW9uSW5P
ckJlZm9yZU5vZGUoc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgICAgICAgICBzcGxpdFRl
eHROb2RlKHN0YXJ0LmNvbnRhaW5lclRleHQoKSwgc3RhcnRPZmZzZXQpOworICAgICAgICAgICAg
c3RhcnQgPSBmaXJzdFBvc2l0aW9uSW5Ob2RlKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSk7CiAgICAg
ICAgICAgICBpZiAoaXNTdGFydEFuZEVuZE9uU2FtZU5vZGUpIHsKICAgICAgICAgICAgICAgICBB
U1NFUlQoZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpID49IHN0YXJ0T2Zmc2V0KTsKLSAgICAg
ICAgICAgICAgICBlbmQgPSBQb3NpdGlvbihlbmQuZGVwcmVjYXRlZE5vZGUoKSwgZW5kLm9mZnNl
dEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpOworICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKHN0YXJ0LmNvbnRh
aW5lclRleHQoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnRPZmZzZXQpOwog
ICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGlzU3RhcnRBbmRFbmRPZkxhc3RQYXJhZ3Jh
cGhPblNhbWVOb2RlKSB7CiAgICAgICAgICAgICAgICAgQVNTRVJUKG1fZW5kT2ZMYXN0UGFyYWdy
YXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpID49IHN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgICAg
ICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKG1fZW5kT2ZMYXN0UGFyYWdyYXBo
LmRlcHJlY2F0ZWROb2RlKCksIG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVy
Tm9kZSgpIC0gc3RhcnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uOjpQb3Np
dGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdy
YXBoID0gUG9zaXRpb24oc3RhcnQuY29udGFpbmVyVGV4dCgpLCBtX2VuZE9mTGFzdFBhcmFncmFw
aC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgIH0K
ICAgICAgICAgfQogICAgIH0KIAotICAgIFJlbmRlclN0eWxlKiBlbmRTdHlsZSA9IHJlbmRlclN0
eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShlbmQpOwotICAgIGlmIChlbmRTdHlsZSkgeworICAgIGlm
IChSZW5kZXJTdHlsZSogZW5kU3R5bGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUo
ZW5kKSkgewogICAgICAgICBib29sIGlzRW5kQW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9k
ZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFncmFwaCkg
JiYgZW5kLmRlcHJlY2F0ZWROb2RlKCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguZGVwcmVjYXRl
ZE5vZGUoKTsKICAgICAgICAgLy8gSW5jbHVkZSBcbiBhdCB0aGUgZW5kIG9mIGxpbmUgaWYgd2Un
cmUgYXQgYW4gZW1wdHkgcGFyYWdyYXBoCi0gICAgICAgIGlmIChlbmRTdHlsZS0+cHJlc2VydmVO
ZXdsaW5lKCkgJiYgc3RhcnQgPT0gZW5kCi0gICAgICAgICAgICAmJiBlbmQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkg
eworICAgICAgICBpZiAoZW5kU3R5bGUtPnByZXNlcnZlTmV3bGluZSgpICYmIHN0YXJ0ID09IGVu
ZCAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5t
YXhDaGFyYWN0ZXJPZmZzZXQoKSkgewogICAgICAgICAgICAgaW50IGVuZE9mZnNldCA9IGVuZC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKICAgICAgICAgICAgIGlmICghaXNOZXdMaW5lQXRQb3Np
dGlvbihlbmQucHJldmlvdXMoKSkgJiYgaXNOZXdMaW5lQXRQb3NpdGlvbihlbmQpKQotICAgICAg
ICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVuZC5kZXByZWNhdGVkTm9kZSgpLCBlbmRPZmZzZXQg
KyAxLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgICAgICAg
ICBlbmQgPSBQb3NpdGlvbihlbmQuY29udGFpbmVyVGV4dCgpLCBlbmRPZmZzZXQgKyAxKTsKICAg
ICAgICAgICAgIGlmIChpc0VuZEFuZEVuZE9mTGFzdFBhcmFncmFwaE9uU2FtZU5vZGUgJiYgZW5k
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpID49IG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldElu
Q29udGFpbmVyTm9kZSgpKQogICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0g
ZW5kOwogICAgICAgICB9CiAKICAgICAgICAgLy8gSWYgZW5kIGlzIGluIHRoZSBtaWRkbGUgb2Yg
YSB0ZXh0IG5vZGUsIHNwbGl0LgotICAgICAgICBpZiAoIWVuZFN0eWxlLT5jb2xsYXBzZVdoaXRl
U3BhY2UoKSAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkKLSAgICAgICAgICAgICYmIGVu
ZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8IGVuZC5jb250YWluZXJOb2RlKCktPm1heENoYXJh
Y3Rlck9mZnNldCgpKSB7Ci0gICAgICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRl
eHQqPihlbmQuZGVwcmVjYXRlZE5vZGUoKSksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7
CisgICAgICAgIGlmICghZW5kU3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQu
Y29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkgeworICAgICAgICAgICAgc3Bs
aXRUZXh0Tm9kZShlbmQuY29udGFpbmVyVGV4dCgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2Rl
KCkpOwogICAgICAgICAgICAgaWYgKGlzU3RhcnRBbmRFbmRPblNhbWVOb2RlKQotICAgICAgICAg
ICAgICAgIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbkluT3JCZWZvcmVOb2RlKGVuZC5kZXByZWNhdGVk
Tm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhcnQgPSBmaXJz
dFBvc2l0aW9uSW5PckJlZm9yZU5vZGUoZW5kLmNvbnRhaW5lck5vZGUoKS0+cHJldmlvdXNTaWJs
aW5nKCkpOwogICAgICAgICAgICAgaWYgKGlzRW5kQW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1l
Tm9kZSkgewogICAgICAgICAgICAgICAgIGlmIChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSA9PSBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpCi0gICAgICAg
ICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gbGFzdFBvc2l0aW9uSW5Ob2RlKGVu
ZC5kZXByZWNhdGVkTm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKSk7CisgICAgICAgICAgICAgICAg
ICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gbGFzdFBvc2l0aW9uSW5PckFmdGVyTm9kZShlbmQu
Y29udGFpbmVyTm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKSk7CiAgICAgICAgICAgICAgICAgZWxz
ZQotICAgICAgICAgICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKGVu
ZC5kZXByZWNhdGVkTm9kZSgpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKSAtIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwKLSAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yKTsKKyAgICAgICAgICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGgg
PSBQb3NpdGlvbihlbmQuY29udGFpbmVyVGV4dCgpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSAtIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAg
ICAgICAgICB9CiAgICAgICAgICAgICBlbmQgPSBsYXN0UG9zaXRpb25Jbk5vZGUoZW5kLmRlcHJl
Y2F0ZWROb2RlKCktPnByZXZpb3VzU2libGluZygpKTsKICAgICAgICAgfQpAQCAtMjQ4LDggKzIz
OSw3IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQKICAgICAgICAg
cmV0dXJuIGVuZE9mTmV4dFBhcmFncmFwaDsKIAogICAgIFJlZlB0cjxOb2RlPiBjb250YWluZXJO
b2RlID0gcG9zaXRpb24uY29udGFpbmVyTm9kZSgpOwotICAgIGlmICghc3R5bGUtPnByZXNlcnZl
TmV3bGluZSgpIHx8ICFwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKQotICAgICAgICB8
fCAhaXNOZXdMaW5lQXRQb3NpdGlvbihQb3NpdGlvbihjb250YWluZXJOb2RlLmdldCgpLCAwLCBQ
b3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSkpCisgICAgaWYgKCFzdHlsZS0+cHJl
c2VydmVOZXdsaW5lKCkgfHwgIXBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIHx8ICFp
c05ld0xpbmVBdFBvc2l0aW9uKGZpcnN0UG9zaXRpb25Jbk5vZGUoY29udGFpbmVyTm9kZS5nZXQo
KSkpKQogICAgICAgICByZXR1cm4gZW5kT2ZOZXh0UGFyYWdyYXBoOwogCiAgICAgLy8gXG4gYXQg
dGhlIGJlZ2lubmluZyBvZiB0aGUgdGV4dCBub2RlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUg
Y3VycmVudCBwYXJhZ3JhcGggaXMgdHJpbW1lZCBieSBtb3ZlUGFyYWdyYXBoV2l0aENsb25lcy4K
QEAgLTI1NywyMiArMjQ3LDI1IEBAIFZpc2libGVQb3NpdGlvbiBBcHBseUJsb2NrRWxlbWVudENv
bW1hbmQKICAgICAvLyBBdm9pZCB0aGlzIGJ5IHNwbGl0dGluZyAiXG4iCiAgICAgc3BsaXRUZXh0
Tm9kZShzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIDEpOwogCi0gICAg
aWYgKHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9kZSgpKSB7Cisg
ICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gc3RhcnQuY29udGFpbmVyTm9kZSgpICYmIGNv
bnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpICYmIGNvbnRhaW5lck5vZGUtPnByZXZpb3Vz
U2libGluZygpLT5pc1RleHROb2RlKCkpIHsKICAgICAgICAgQVNTRVJUKHN0YXJ0Lm9mZnNldElu
Q29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwotICAg
ICAgICBzdGFydCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpLCBz
dGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJ
bkFuY2hvcik7CisgICAgICAgIHN0YXJ0ID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KGNv
bnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJO
b2RlKCkpOwogICAgIH0KLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9z
aXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gZW5kLmNvbnRh
aW5lck5vZGUoKSkgeworICAgIGlmIChjb250YWluZXJOb2RlLmdldCgpID09IGVuZC5jb250YWlu
ZXJOb2RlKCkgJiYgY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCkgJiYgY29udGFpbmVy
Tm9kZS0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKSkgewogICAgICAgICBBU1NFUlQo
ZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5Db250YWluZXJO
b2RlKCkpOwotICAgICAgICBlbmQgPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5wcmV2aW91c1Np
YmxpbmcoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25J
c09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgZW5kID0gUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4
dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKSwgZW5kLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpKTsKICAgICB9Ci0gICAgaWYgKG1fZW5kT2ZMYXN0UGFyYWdyYXBoLmFuY2hvclR5
cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIGNvbnRhaW5lck5v
ZGUuZ2V0KCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguY29udGFpbmVyTm9kZSgpKSB7Ci0gICAg
ICAgIGlmIChtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8IHBv
c2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgbV9lbmRPZkxhc3RQ
YXJhZ3JhcGggPSBQb3NpdGlvbihjb250YWluZXJOb2RlLT5wcmV2aW91c1NpYmxpbmcoKSwgbV9l
bmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3Np
dGlvbklzT2Zmc2V0SW5BbmNob3IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtX2VuZE9m
TGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUsIG1fZW5kT2ZMYXN0UGFyYWdy
YXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgaWYgKGNvbnRhaW5lck5vZGUuZ2V0KCkgPT0gbV9lbmRPZkxhc3RQ
YXJhZ3JhcGguY29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIGlmIChtX2VuZE9mTGFzdFBhcmFn
cmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8IHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVy
Tm9kZSgpKSB7CisgICAgICAgICAgICAvLyBXZSBjYW4gb25seSBmaXggZW5kT2ZMYXN0UGFyYWdy
YXBoIGlmIHRoZSBwcmV2aW91cyBub2RlIHdhcyBzdGlsbCB0ZXh0IGFuZCBoYXNuJ3QgYmVlbiBt
b2RpZmllZCBieSBzY3JpcHQuCisgICAgICAgICAgICBpZiAoY29udGFpbmVyTm9kZS0+cHJldmlv
dXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKQorICAgICAgICAgICAgICAgICYmIHN0YXRpY19jYXN0
PHVuc2lnbmVkPihtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSkg
PD0gc3RhdGljX2Nhc3Q8VGV4dCo+KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpKS0+
bGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlv
bihzdGF0aWNfY2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCkpLCBt
X2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgbV9lbmRPZkxhc3RQYXJhZ3JhcGggPSBQb3NpdGlvbihzdGF0aWNf
Y2FzdDxUZXh0Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9m
ZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSk7CiAgICAgfQogCi0gICAgcmV0dXJuIFBvc2l0aW9u
KGNvbnRhaW5lck5vZGUuZ2V0KCksIHBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0g
MSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgcmV0dXJuIFBvc2l0
aW9uKHN0YXRpY19jYXN0PFRleHQqPihjb250YWluZXJOb2RlLmdldCgpKSwgcG9zaXRpb24ub2Zm
c2V0SW5Db250YWluZXJOb2RlKCkgLSAxKTsKIH0KIAogUGFzc1JlZlB0cjxFbGVtZW50PiBBcHBs
eUJsb2NrRWxlbWVudENvbW1hbmQ6OmNyZWF0ZUJsb2NrRWxlbWVudCgpIGNvbnN0CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAkocmV2aXNpb24g
ODk4ODApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMTExNyw2MCArMTExNyw2NSBAQCBib29sIEFwcGx5U3R5bGVDb21t
YW5kOjpub2RlRnVsbHlVbnNlbGVjCiAKIHZvaWQgQXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4
dEF0U3RhcnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewot
ICAgIEFTU0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZz
ZXRJbkFuY2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9k
ZSgpKTsKIAogICAgIFBvc2l0aW9uIG5ld0VuZDsKICAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9
PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5v
ZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihl
bmQuY29udGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cik7CisgICAgICAgIG5ld0VuZCA9IFBvc2l0aW9uKGVuZC5jb250YWluZXJUZXh0KCksIGVuZC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsK
ICAgICBlbHNlCiAgICAgICAgIG5ld0VuZCA9IGVuZDsKIAotICAgIFRleHQqIHRleHQgPSBzdGF0
aWNfY2FzdDxUZXh0Kj4oc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7CisgICAgVGV4dCogdGV4dCA9
IHN0YXJ0LmNvbnRhaW5lclRleHQoKTsKICAgICBzcGxpdFRleHROb2RlKHRleHQsIHN0YXJ0Lm9m
ZnNldEluQ29udGFpbmVyTm9kZSgpKTsKLSAgICB1cGRhdGVTdGFydEVuZChmaXJzdFBvc2l0aW9u
SW5Ob2RlKHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCkpLCBuZXdFbmQpOworICAgIHVwZGF0ZVN0YXJ0
RW5kKGZpcnN0UG9zaXRpb25Jbk5vZGUoc3RhcnQuY29udGFpbmVyTm9kZSgpKSwgbmV3RW5kKTsK
IH0KIAogdm9pZCBBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0QXRFbmQoY29uc3QgUG9zaXRp
b24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAgIEFTU0VSVChlbmQuYW5jaG9y
VHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgIEFTU0VS
VChlbmQuY29udGFpbmVyTm9kZSgpLT5pc1RleHROb2RlKCkpOwogCiAgICAgYm9vbCBzaG91bGRV
cGRhdGVTdGFydCA9IHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9k
ZSgpOwogICAgIFRleHQqIHRleHQgPSBzdGF0aWNfY2FzdDxUZXh0ICo+KGVuZC5kZXByZWNhdGVk
Tm9kZSgpKTsKICAgICBzcGxpdFRleHROb2RlKHRleHQsIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5v
ZGUoKSk7CiAKICAgICBOb2RlKiBwcmV2Tm9kZSA9IHRleHQtPnByZXZpb3VzU2libGluZygpOwot
ICAgIEFTU0VSVChwcmV2Tm9kZSk7Ci0gICAgUG9zaXRpb24gbmV3U3RhcnQgPSBzaG91bGRVcGRh
dGVTdGFydCA/IFBvc2l0aW9uKHByZXZOb2RlLCBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUo
KSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikgOiBzdGFydDsKKyAgICBpZiAo
IXByZXZOb2RlIHx8ICFwcmV2Tm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBQb3NpdGlvbiBuZXdTdGFydCA9IHNob3VsZFVwZGF0ZVN0YXJ0ID8gUG9zaXRpb24oc3Rh
dGljX2Nhc3Q8VGV4dCo+KHByZXZOb2RlKSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkp
IDogc3RhcnQ7CiAgICAgdXBkYXRlU3RhcnRFbmQobmV3U3RhcnQsIGxhc3RQb3NpdGlvbkluTm9k
ZShwcmV2Tm9kZSkpOwogfQogCiB2b2lkIEFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRFbGVt
ZW50QXRTdGFydChjb25zdCBQb3NpdGlvbiYgc3RhcnQsIGNvbnN0IFBvc2l0aW9uJiBlbmQpCiB7
Ci0gICAgQVNTRVJUKHN0YXJ0LmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yKTsKKyAgICBBU1NFUlQoc3RhcnQuY29udGFpbmVyTm9kZSgpLT5pc1RleHRO
b2RlKCkpOwogCiAgICAgUG9zaXRpb24gbmV3RW5kOwotICAgIGlmIChlbmQuYW5jaG9yVHlwZSgp
ID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgJiYgc3RhcnQuY29udGFpbmVy
Tm9kZSgpID09IGVuZC5jb250YWluZXJOb2RlKCkpCi0gICAgICAgIG5ld0VuZCA9IFBvc2l0aW9u
KGVuZC5jb250YWluZXJOb2RlKCksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yKTsKKyAgICBpZiAoc3RhcnQuY29udGFpbmVyTm9kZSgpID09IGVuZC5jb250YWluZXJOb2Rl
KCkpCisgICAgICAgIG5ld0VuZCA9IFBvc2l0aW9uKGVuZC5jb250YWluZXJUZXh0KCksIGVuZC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsK
ICAgICBlbHNlCiAgICAgICAgIG5ld0VuZCA9IGVuZDsKIAotICAgIFRleHQqIHRleHQgPSBzdGF0
aWNfY2FzdDxUZXh0Kj4oc3RhcnQuZGVwcmVjYXRlZE5vZGUoKSk7Ci0gICAgc3BsaXRUZXh0Tm9k
ZUNvbnRhaW5pbmdFbGVtZW50KHRleHQsIHN0YXJ0LmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0KCkp
OwotICAgIHVwZGF0ZVN0YXJ0RW5kKFBvc2l0aW9uKHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCktPnBh
cmVudE5vZGUoKSwgc3RhcnQuZGVwcmVjYXRlZE5vZGUoKS0+bm9kZUluZGV4KCksIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBuZXdFbmQpOworICAgIHNwbGl0VGV4dE5vZGVD
b250YWluaW5nRWxlbWVudChzdGFydC5jb250YWluZXJUZXh0KCksIHN0YXJ0Lm9mZnNldEluQ29u
dGFpbmVyTm9kZSgpKTsKKyAgICB1cGRhdGVTdGFydEVuZChwb3NpdGlvbkJlZm9yZU5vZGUoc3Rh
cnQuY29udGFpbmVyTm9kZSgpKSwgbmV3RW5kKTsKIH0KIAogdm9pZCBBcHBseVN0eWxlQ29tbWFu
ZDo6c3BsaXRUZXh0RWxlbWVudEF0RW5kKGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9z
aXRpb24mIGVuZCkKIHsKLSAgICBBU1NFUlQoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBBU1NFUlQoZW5kLmNvbnRhaW5lck5vZGUo
KS0+aXNUZXh0Tm9kZSgpKTsKIAotICAgIGJvb2wgc2hvdWxkVXBkYXRlU3RhcnQgPSBzdGFydC5h
bmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciAmJiBzdGFy
dC5jb250YWluZXJOb2RlKCkgPT0gZW5kLmNvbnRhaW5lck5vZGUoKTsKLSAgICBUZXh0KiB0ZXh0
ID0gc3RhdGljX2Nhc3Q8VGV4dCo+KGVuZC5kZXByZWNhdGVkTm9kZSgpKTsKLSAgICBzcGxpdFRl
eHROb2RlQ29udGFpbmluZ0VsZW1lbnQodGV4dCwgZW5kLmRlcHJlY2F0ZWRFZGl0aW5nT2Zmc2V0
KCkpOworICAgIGJvb2wgc2hvdWxkVXBkYXRlU3RhcnQgPSBzdGFydC5jb250YWluZXJOb2RlKCkg
PT0gZW5kLmNvbnRhaW5lck5vZGUoKTsKKyAgICBzcGxpdFRleHROb2RlQ29udGFpbmluZ0VsZW1l
bnQoZW5kLmNvbnRhaW5lclRleHQoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKwor
ICAgIE5vZGUqIHBhcmVudEVsZW1lbnQgPSBlbmQuY29udGFpbmVyTm9kZSgpLT5wYXJlbnROb2Rl
KCk7CisgICAgaWYgKCFwYXJlbnRFbGVtZW50IHx8ICFwYXJlbnRFbGVtZW50LT5wcmV2aW91c1Np
YmxpbmcoKSkKKyAgICAgICAgcmV0dXJuOworICAgIE5vZGUqIGZpcnN0VGV4dE5vZGUgPSBwYXJl
bnRFbGVtZW50LT5wcmV2aW91c1NpYmxpbmcoKS0+bGFzdENoaWxkKCk7CisgICAgaWYgKCFmaXJz
dFRleHROb2RlIHx8ICFmaXJzdFRleHROb2RlLT5pc1RleHROb2RlKCkpCisgICAgICAgIHJldHVy
bjsKIAotICAgIE5vZGUqIHByZXZOb2RlID0gdGV4dC0+cGFyZW50Tm9kZSgpLT5wcmV2aW91c1Np
YmxpbmcoKS0+bGFzdENoaWxkKCk7Ci0gICAgQVNTRVJUKHByZXZOb2RlKTsKLSAgICBQb3NpdGlv
biBuZXdTdGFydCA9IHNob3VsZFVwZGF0ZVN0YXJ0ID8gUG9zaXRpb24ocHJldk5vZGUsIHN0YXJ0
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5j
aG9yKSA6IHN0YXJ0OwotICAgIHVwZGF0ZVN0YXJ0RW5kKG5ld1N0YXJ0LCBQb3NpdGlvbihwcmV2
Tm9kZS0+cGFyZW50Tm9kZSgpLCBwcmV2Tm9kZS0+bm9kZUluZGV4KCkgKyAxLCBQb3NpdGlvbjo6
UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSk7CisgICAgUG9zaXRpb24gbmV3U3RhcnQgPSBzaG91
bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihmaXJzdFRleHROb2Rl
KSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpIDogc3RhcnQ7CisgICAgdXBkYXRlU3Rh
cnRFbmQobmV3U3RhcnQsIHBvc2l0aW9uQWZ0ZXJOb2RlKGZpcnN0VGV4dE5vZGUpKTsKIH0KIAog
Ym9vbCBBcHBseVN0eWxlQ29tbWFuZDo6c2hvdWxkU3BsaXRUZXh0RWxlbWVudChFbGVtZW50KiBl
bGVtZW50LCBFZGl0aW5nU3R5bGUqIHN0eWxlKQpAQCAtMTQ4MCw5ICsxNDg1LDkgQEAgdm9pZCBB
cHBseVN0eWxlQ29tbWFuZDo6am9pbkNoaWxkVGV4dE5vZAogICAgICAgICAgICAgVGV4dCogY2hp
bGRUZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihjaGlsZCk7CiAgICAgICAgICAgICBUZXh0KiBu
ZXh0VGV4dCA9IHN0YXRpY19jYXN0PFRleHQgKj4obmV4dCk7CiAgICAgICAgICAgICBpZiAoc3Rh
cnQuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgJiYg
bmV4dCA9PSBzdGFydC5jb250YWluZXJOb2RlKCkpCi0gICAgICAgICAgICAgICAgbmV3U3RhcnQg
PSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+bGVuZ3RoKCkgKyBzdGFydC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Cisg
ICAgICAgICAgICAgICAgbmV3U3RhcnQgPSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+
bGVuZ3RoKCkgKyBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAgICAgICAgICBp
ZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9y
ICYmIG5leHQgPT0gZW5kLmNvbnRhaW5lck5vZGUoKSkKLSAgICAgICAgICAgICAgICBuZXdFbmQg
PSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+bGVuZ3RoKCkgKyBlbmQub2Zmc2V0SW5D
b250YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAg
ICAgICAgICAgICAgIG5ld0VuZCA9IFBvc2l0aW9uKGNoaWxkVGV4dCwgY2hpbGRUZXh0LT5sZW5n
dGgoKSArIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAgICAgICAgICBTdHJpbmcg
dGV4dFRvTW92ZSA9IG5leHRUZXh0LT5kYXRhKCk7CiAgICAgICAgICAgICBpbnNlcnRUZXh0SW50
b05vZGUoY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpLCB0ZXh0VG9Nb3ZlKTsKICAgICAg
ICAgICAgIHJlbW92ZU5vZGUobmV4dCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0Nv
bXBvc2l0ZUVkaXRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmNwcAkocmV2aXNpb24gODk4ODApCisrKyBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMzIwLDcgKzMyMCw3IEBAIFBvc2l0aW9uIENvbXBvc2l0ZUVkaXRDb21tYW5kOjpyZXBsYWNl
U2UKICAgICBpZiAoc3RhcnQuY29udGFpbmVyTm9kZSgpICE9IGVuZC5jb250YWluZXJOb2RlKCkg
fHwgIXN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpIHx8IGlzVGFiU3BhblRleHRO
b2RlKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSkpCiAgICAgICAgIHJldHVybiBQb3NpdGlvbigpOwog
Ci0gICAgUmVmUHRyPFRleHQ+IHRleHROb2RlID0gc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSk7CisgICAgUmVmUHRyPFRleHQ+IHRleHROb2RlID0gc3RhcnQuY29udGFp
bmVyVGV4dCgpOwogICAgIHJlcGxhY2VUZXh0SW5Ob2RlKHRleHROb2RlLCBzdGFydC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnQub2Zm
c2V0SW5Db250YWluZXJOb2RlKCksIHRleHQpOwogCiAgICAgcmV0dXJuIFBvc2l0aW9uKHRleHRO
b2RlLnJlbGVhc2UoKSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgKyB0ZXh0Lmxlbmd0
aCgpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0VkaXRvci5jcHAJKHJldmlzaW9uIDg5ODgwKQor
KysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NjYsNyArMjY2LDcgQEAgYm9vbCBFZGl0b3I6OmNhbkRlbGV0ZVJhbmdlKFJhbmdlKiByYW5nZQog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgCiAgICAgaWYgKHJhbmdlLT5jb2xsYXBzZWQoZWMp
KSB7Ci0gICAgICAgIFZpc2libGVQb3NpdGlvbiBzdGFydChQb3NpdGlvbihzdGFydENvbnRhaW5l
ciwgcmFuZ2UtPnN0YXJ0T2Zmc2V0KGVjKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvciksIERPV05TVFJFQU0pOworICAgICAgICBWaXNpYmxlUG9zaXRpb24gc3RhcnQocmFuZ2Ut
PnN0YXJ0UG9zaXRpb24oKSwgRE9XTlNUUkVBTSk7CiAgICAgICAgIFZpc2libGVQb3NpdGlvbiBw
cmV2aW91cyA9IHN0YXJ0LnByZXZpb3VzKCk7CiAgICAgICAgIC8vIEZJWE1FOiBXZSBzb21ldGlt
ZXMgYWxsb3cgZGVsZXRpb25zIGF0IHRoZSBzdGFydCBvZiBlZGl0YWJsZSByb290cywgbGlrZSB3
aGVuIHRoZSBjYXJldCBpcyBpbiBhbiBlbXB0eSBsaXN0IGl0ZW0uCiAgICAgICAgIGlmIChwcmV2
aW91cy5pc051bGwoKSB8fCBwcmV2aW91cy5kZWVwRXF1aXZhbGVudCgpLmRlcHJlY2F0ZWROb2Rl
KCktPnJvb3RFZGl0YWJsZUVsZW1lbnQoKSAhPSBzdGFydENvbnRhaW5lci0+cm9vdEVkaXRhYmxl
RWxlbWVudCgpKQpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVjdGlvbi5j
cHAJKHJldmlzaW9uIDg5ODgwKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9GcmFtZVNlbGVj
dGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE0NjIsNDUgKzE0NjIsMjMgQEAgdm9pZCBGcmFt
ZVNlbGVjdGlvbjo6c2VsZWN0QWxsKCkKIAogYm9vbCBGcmFtZVNlbGVjdGlvbjo6c2V0U2VsZWN0
ZWRSYW5nZShSYW5nZSogcmFuZ2UsIEVBZmZpbml0eSBhZmZpbml0eSwgYm9vbCBjbG9zZVR5cGlu
ZykKIHsKLSAgICBpZiAoIXJhbmdlKQorICAgIGlmICghcmFuZ2UgfHwgIXJhbmdlLT5zdGFydENv
bnRhaW5lcigpIHx8ICFyYW5nZS0+ZW5kQ29udGFpbmVyKCkpCiAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICBBU1NFUlQocmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCktPmRvY3VtZW50KCkgPT0gcmFu
Z2UtPmVuZENvbnRhaW5lcigpLT5kb2N1bWVudCgpKTsKIAotICAgIEV4Y2VwdGlvbkNvZGUgZWMg
PSAwOwotICAgIE5vZGUqIHN0YXJ0Q29udGFpbmVyID0gcmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVj
KTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIE5vZGUqIGVuZENv
bnRhaW5lciA9IHJhbmdlLT5lbmRDb250YWluZXIoZWMpOwotICAgIGlmIChlYykKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAotICAgIEFTU0VSVChzdGFydENvbnRhaW5lcik7Ci0gICAgQVNT
RVJUKGVuZENvbnRhaW5lcik7Ci0gICAgQVNTRVJUKHN0YXJ0Q29udGFpbmVyLT5kb2N1bWVudCgp
ID09IGVuZENvbnRhaW5lci0+ZG9jdW1lbnQoKSk7Ci0gICAgCiAgICAgbV9mcmFtZS0+ZG9jdW1l
bnQoKS0+dXBkYXRlTGF5b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCk7CiAKICAgICAvLyBO
b24tY29sbGFwc2VkIHJhbmdlcyBhcmUgbm90IGFsbG93ZWQgdG8gc3RhcnQgYXQgdGhlIGVuZCBv
ZiBhIGxpbmUgdGhhdCBpcyB3cmFwcGVkLAogICAgIC8vIHRoZXkgc3RhcnQgYXQgdGhlIGJlZ2lu
bmluZyBvZiB0aGUgbmV4dCBsaW5lIGluc3RlYWQKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
ICAgICBib29sIGNvbGxhcHNlZCA9IHJhbmdlLT5jb2xsYXBzZWQoZWMpOwogICAgIGlmIChlYykK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGludCBzdGFydE9mZnNldCA9IHJhbmdl
LT5zdGFydE9mZnNldChlYyk7Ci0gICAgaWYgKGVjKQotICAgICAgICByZXR1cm4gZmFsc2U7CiAK
LSAgICBpbnQgZW5kT2Zmc2V0ID0gcmFuZ2UtPmVuZE9mZnNldChlYyk7Ci0gICAgaWYgKGVjKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCiAgICAgLy8gRklYTUU6IENhbiB3ZSBwcm92aWRl
IGV4dGVudEFmZmluaXR5PwotICAgIFZpc2libGVQb3NpdGlvbiB2aXNpYmxlU3RhcnQoUG9zaXRp
b24oc3RhcnRDb250YWluZXIsIHN0YXJ0T2Zmc2V0LCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNl
dEluQW5jaG9yKSwgY29sbGFwc2VkID8gYWZmaW5pdHkgOiBET1dOU1RSRUFNKTsKLSAgICBWaXNp
YmxlUG9zaXRpb24gdmlzaWJsZUVuZChQb3NpdGlvbihlbmRDb250YWluZXIsIGVuZE9mZnNldCwg
UG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciksIFNFTF9ERUZBVUxUX0FGRklOSVRZ
KTsKLSAgICBTZXRTZWxlY3Rpb25PcHRpb25zIG9wdGlvbnMgPSBDbGVhclR5cGluZ1N0eWxlOwot
ICAgIGlmIChjbG9zZVR5cGluZykKLSAgICAgICAgb3B0aW9ucyB8PSBDbG9zZVR5cGluZzsKLSAg
ICBzZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbih2aXNpYmxlU3RhcnQsIHZpc2libGVFbmQp
LCBvcHRpb25zKTsKKyAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0KHJhbmdlLT5zdGFy
dFBvc2l0aW9uKCksIGNvbGxhcHNlZCA/IGFmZmluaXR5IDogRE9XTlNUUkVBTSk7CisgICAgVmlz
aWJsZVBvc2l0aW9uIHZpc2libGVFbmQocmFuZ2UtPmVuZFBvc2l0aW9uKCksIFNFTF9ERUZBVUxU
X0FGRklOSVRZKTsKKyAgICBzZXRTZWxlY3Rpb24oVmlzaWJsZVNlbGVjdGlvbih2aXNpYmxlU3Rh
cnQsIHZpc2libGVFbmQpLCBDbGVhclR5cGluZ1N0eWxlIHwgKGNsb3NlVHlwaW5nID8gQ2xvc2VU
eXBpbmcgOiAwKSk7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvSW5zZXJ0VGV4dENvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2VkaXRpbmcvSW5zZXJ0VGV4dENvbW1hbmQuY3BwCShyZXZpc2lvbiA4OTg4MCkKKysrIFNv
dXJjZS9XZWJDb3JlL2VkaXRpbmcvSW5zZXJ0VGV4dENvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xNTcsNyArMTU3LDcgQEAgdm9pZCBJbnNlcnRUZXh0Q29tbWFuZDo6aW5wdXQoY29uc3Qg
U3RyaQogICAgICAgICBBU1NFUlQoc3RhcnRQb3NpdGlvbi5jb250YWluZXJOb2RlKCktPmlzVGV4
dE5vZGUoKSk7CiAgICAgICAgIGlmIChwbGFjZWhvbGRlci5pc05vdE51bGwoKSkKICAgICAgICAg
ICAgIHJlbW92ZVBsYWNlaG9sZGVyQXQocGxhY2Vob2xkZXIpOwotICAgICAgICBSZWZQdHI8VGV4
dD4gdGV4dE5vZGUgPSBzdGF0aWNfY2FzdDxUZXh0Kj4oc3RhcnRQb3NpdGlvbi5jb250YWluZXJO
b2RlKCkpOworICAgICAgICBSZWZQdHI8VGV4dD4gdGV4dE5vZGUgPSBzdGFydFBvc2l0aW9uLmNv
bnRhaW5lclRleHQoKTsKICAgICAgICAgY29uc3QgdW5zaWduZWQgb2Zmc2V0ID0gc3RhcnRQb3Np
dGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKIAogICAgICAgICBpbnNlcnRUZXh0SW50b05v
ZGUodGV4dE5vZGUsIG9mZnNldCwgdGV4dCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5n
L1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9lZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAkocmV2aXNpb24gODk4ODApCisr
KyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxhY2VTZWxlY3Rpb25Db21tYW5kLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtOTM5LDcgKzkzOSw3IEBAIHZvaWQgUmVwbGFjZVNlbGVjdGlvbkNvbW1h
bmQ6OmRvQXBwbHkoKQogICAgIC8vIHNpbmNlIGluc2VydEFzTGlzdEl0ZW1zIGFscmVhZHkgZG9l
cyB0aGUgcmlnaHQgdGhpbmcuCiAgICAgaWYgKCFtX21hdGNoU3R5bGUgJiYgIWVuY2xvc2luZ0xp
c3QoaW5zZXJ0aW9uUG9zLmNvbnRhaW5lck5vZGUoKSkgJiYgaXNTdHlsZVNwYW4oZnJhZ21lbnQu
Zmlyc3RDaGlsZCgpKSkgewogICAgICAgICBpZiAoaW5zZXJ0aW9uUG9zLmNvbnRhaW5lck5vZGUo
KS0+aXNUZXh0Tm9kZSgpICYmIGluc2VydGlvblBvcy5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAm
JiAhaW5zZXJ0aW9uUG9zLmF0TGFzdEVkaXRpbmdQb3NpdGlvbkZvck5vZGUoKSkgewotICAgICAg
ICAgICAgc3BsaXRUZXh0Tm9kZUNvbnRhaW5pbmdFbGVtZW50KHN0YXRpY19jYXN0PFRleHQqPihp
bnNlcnRpb25Qb3MuY29udGFpbmVyTm9kZSgpKSwgaW5zZXJ0aW9uUG9zLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpKTsKKyAgICAgICAgICAgIHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChp
bnNlcnRpb25Qb3MuY29udGFpbmVyVGV4dCgpLCBpbnNlcnRpb25Qb3Mub2Zmc2V0SW5Db250YWlu
ZXJOb2RlKCkpOwogICAgICAgICAgICAgaW5zZXJ0aW9uUG9zID0gZmlyc3RQb3NpdGlvbkluTm9k
ZShpbnNlcnRpb25Qb3MuY29udGFpbmVyTm9kZSgpKTsKICAgICAgICAgfQogCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVQb3NpdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZWRpdGluZy9WaXNpYmxlUG9zaXRpb24uY3BwCShyZXZpc2lvbiA4OTg4MCkK
KysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNTUyLDE1ICs1NTIsMTQgQEAgVUNoYXIzMiBWaXNpYmxlUG9zaXRpb246OmNoYXJh
Y3RlckFmdGVyKAogICAgIGNhc2UgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcjoK
ICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIFRleHQqIHRleHROb2RlID0gc3RhdGljX2Nhc3Q8
VGV4dCo+KHBvcy5jb250YWluZXJOb2RlKCkpOwotICAgIHVuc2lnbmVkIG9mZnNldCA9IHBvcy5h
bmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciA/IHBvcy5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA6IDA7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dE5v
ZGUtPmxlbmd0aCgpOwotICAgIGlmIChvZmZzZXQgPj0gbGVuZ3RoKQorICAgIHVuc2lnbmVkIG9m
ZnNldCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihwb3Mub2Zmc2V0SW5Db250YWluZXJOb2RlKCkp
OworICAgIFRleHQqIHRleHROb2RlID0gcG9zLmNvbnRhaW5lclRleHQoKTsKKyAgICBpZiAob2Zm
c2V0ID49IHRleHROb2RlLT5sZW5ndGgoKSkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBVQ2hh
cjMyIGNoOwogICAgIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzID0gdGV4dE5vZGUtPmRhdGEoKS5j
aGFyYWN0ZXJzKCk7Ci0gICAgVTE2X05FWFQoY2hhcmFjdGVycywgb2Zmc2V0LCBsZW5ndGgsIGNo
KTsKKyAgICBVMTZfTkVYVChjaGFyYWN0ZXJzLCBvZmZzZXQsIHRleHROb2RlLT5sZW5ndGgoKSwg
Y2gpOwogICAgIHJldHVybiBjaDsKIH0KIApAQCAtNjQ5LDE0ICs2NDgsMTIgQEAgUGFzc1JlZlB0
cjxSYW5nZT4gbWFrZVJhbmdlKGNvbnN0IFZpc2libAogCiBWaXNpYmxlUG9zaXRpb24gc3RhcnRW
aXNpYmxlUG9zaXRpb24oY29uc3QgUmFuZ2UgKnIsIEVBZmZpbml0eSBhZmZpbml0eSkKIHsKLSAg
ICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9u
KHItPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIHItPnN0YXJ0T2Zmc2V0KGV4Y2VwdGlvbiks
IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBhZmZpbml0eSk7CisgICAgcmV0
dXJuIFZpc2libGVQb3NpdGlvbihyLT5zdGFydFBvc2l0aW9uKCksIGFmZmluaXR5KTsKIH0KIAog
VmlzaWJsZVBvc2l0aW9uIGVuZFZpc2libGVQb3NpdGlvbihjb25zdCBSYW5nZSAqciwgRUFmZmlu
aXR5IGFmZmluaXR5KQogewotICAgIGludCBleGNlcHRpb24gPSAwOwotICAgIHJldHVybiBWaXNp
YmxlUG9zaXRpb24oUG9zaXRpb24oci0+ZW5kQ29udGFpbmVyKGV4Y2VwdGlvbiksIHItPmVuZE9m
ZnNldChleGNlcHRpb24pLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSwgYWZm
aW5pdHkpOworICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oci0+ZW5kUG9zaXRpb24oKSwgYWZm
aW5pdHkpOwogfQogCiBib29sIHNldFN0YXJ0KFJhbmdlICpyLCBjb25zdCBWaXNpYmxlUG9zaXRp
b24gJnZpc2libGVQb3NpdGlvbikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVk
aXRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVkaXRp
bmcuY3BwCShyZXZpc2lvbiA4OTg4MCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvaHRtbGVk
aXRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MDIsOCArNDAyLDcgQEAgYm9vbCBpc1NwZWNp
YWxFbGVtZW50KGNvbnN0IE5vZGUgKm4pCiAKIHN0YXRpYyBOb2RlKiBmaXJzdEluU3BlY2lhbEVs
ZW1lbnQoY29uc3QgUG9zaXRpb24mIHBvcykKIHsKLSAgICAvLyBGSVhNRTogVGhpcyBiZWdpbnMg
YXQgcG9zLmRlcHJlY2F0ZWROb2RlKCksIHdoaWNoIGRvZXNuJ3QgbmVjZXNzYXJpbHkgY29udGFp
biBwb3MgKHN1cHBvc2UgcG9zIHdhcyBbaW1nLCAwXSkuICBTZWUgPHJkYXI6Ly9wcm9ibGVtLzUw
Mjc3MDI+LgotICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuZGVwcmVjYXRlZE5v
ZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1l
bnQgPSBwb3MuY29udGFpbmVyTm9kZSgpLT5yb290RWRpdGFibGVFbGVtZW50KCk7CiAgICAgZm9y
IChOb2RlKiBuID0gcG9zLmRlcHJlY2F0ZWROb2RlKCk7IG4gJiYgbi0+cm9vdEVkaXRhYmxlRWxl
bWVudCgpID09IHJvb3RFZGl0YWJsZUVsZW1lbnQ7IG4gPSBuLT5wYXJlbnROb2RlKCkpCiAgICAg
ICAgIGlmIChpc1NwZWNpYWxFbGVtZW50KG4pKSB7CiAgICAgICAgICAgICBWaXNpYmxlUG9zaXRp
b24gdlBvcyA9IFZpc2libGVQb3NpdGlvbihwb3MsIERPV05TVFJFQU0pOwpAQCAtNDE4LDEyICs0
MTcsMTEgQEAgc3RhdGljIE5vZGUqIGZpcnN0SW5TcGVjaWFsRWxlbWVudChjb25zdAogCiBzdGF0
aWMgTm9kZSogbGFzdEluU3BlY2lhbEVsZW1lbnQoY29uc3QgUG9zaXRpb24mIHBvcykKIHsKLSAg
ICAvLyBGSVhNRTogVGhpcyBiZWdpbnMgYXQgcG9zLmRlcHJlY2F0ZWROb2RlKCksIHdoaWNoIGRv
ZXNuJ3QgbmVjZXNzYXJpbHkgY29udGFpbiBwb3MgKHN1cHBvc2UgcG9zIHdhcyBbaW1nLCAwXSku
ICBTZWUgPHJkYXI6Ly9wcm9ibGVtLzUwMjc3MDI+LgotICAgIE5vZGUqIHJvb3RFZGl0YWJsZUVs
ZW1lbnQgPSBwb3MuZGVwcmVjYXRlZE5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOworICAg
IE5vZGUqIHJvb3RFZGl0YWJsZUVsZW1lbnQgPSBwb3MuY29udGFpbmVyTm9kZSgpLT5yb290RWRp
dGFibGVFbGVtZW50KCk7CiAgICAgZm9yIChOb2RlKiBuID0gcG9zLmRlcHJlY2F0ZWROb2RlKCk7
IG4gJiYgbi0+cm9vdEVkaXRhYmxlRWxlbWVudCgpID09IHJvb3RFZGl0YWJsZUVsZW1lbnQ7IG4g
PSBuLT5wYXJlbnROb2RlKCkpCiAgICAgICAgIGlmIChpc1NwZWNpYWxFbGVtZW50KG4pKSB7CiAg
ICAgICAgICAgICBWaXNpYmxlUG9zaXRpb24gdlBvcyA9IFZpc2libGVQb3NpdGlvbihwb3MsIERP
V05TVFJFQU0pOwotICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIGxhc3RJbkVsZW1lbnQgPSBW
aXNpYmxlUG9zaXRpb24oUG9zaXRpb24obiwgbi0+Y2hpbGROb2RlQ291bnQoKSwgUG9zaXRpb246
OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciksIERPV05TVFJFQU0pOworICAgICAgICAgICAgVmlz
aWJsZVBvc2l0aW9uIGxhc3RJbkVsZW1lbnQgPSBWaXNpYmxlUG9zaXRpb24obGFzdFBvc2l0aW9u
SW5PckFmdGVyTm9kZShuKSwgRE9XTlNUUkVBTSk7CiAgICAgICAgICAgICBpZiAoaXNUYWJsZUVs
ZW1lbnQobikgJiYgdlBvcyA9PSBsYXN0SW5FbGVtZW50LnByZXZpb3VzKCkpCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIG47CiAgICAgICAgICAgICBpZiAodlBvcyA9PSBsYXN0SW5FbGVtZW50KQpJ
bmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCShyZXZpc2lvbiA4
OTg4MCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTQzNywxMiArNDM3LDEyIEBAIHN0YXRpYyBWaXNpYmxlUG9zaXRpb24gZW5k
UG9zaXRpb25Gb3JMaW4KICAgICBQb3NpdGlvbiBwb3M7CiAgICAgaWYgKGVuZE5vZGUtPmhhc1Rh
Z05hbWUoYnJUYWcpKSB7CiAgICAgICAgIHBvcyA9IHBvc2l0aW9uQmVmb3JlTm9kZShlbmROb2Rl
KTsKLSAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxpbmVUZXh0Qm94KCkpIHsKLSAgICAgICAg
SW5saW5lVGV4dEJveCAqZW5kVGV4dEJveCA9IHN0YXRpY19jYXN0PElubGluZVRleHRCb3ggKj4o
ZW5kQm94KTsKKyAgICB9IGVsc2UgaWYgKGVuZEJveC0+aXNJbmxpbmVUZXh0Qm94KCkgJiYgZW5k
Tm9kZS0+aXNUZXh0Tm9kZSgpKSB7CisgICAgICAgIElubGluZVRleHRCb3gqIGVuZFRleHRCb3gg
PSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94ICo+KGVuZEJveCk7CiAgICAgICAgIGludCBlbmRP
ZmZzZXQgPSBlbmRUZXh0Qm94LT5zdGFydCgpOwogICAgICAgICBpZiAoIWVuZFRleHRCb3gtPmlz
TGluZUJyZWFrKCkpCiAgICAgICAgICAgICBlbmRPZmZzZXQgKz0gZW5kVGV4dEJveC0+bGVuKCk7
Ci0gICAgICAgIHBvcyA9IFBvc2l0aW9uKGVuZE5vZGUsIGVuZE9mZnNldCwgUG9zaXRpb246OlBv
c2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgICAgIHBvcyA9IFBvc2l0aW9uKHN0YXRpY19j
YXN0PFRleHQqPihlbmROb2RlKSwgZW5kT2Zmc2V0KTsKICAgICB9IGVsc2UKICAgICAgICAgcG9z
ID0gcG9zaXRpb25BZnRlck5vZGUoZW5kTm9kZSk7CiAgICAgCkBAIC03OTMsNiArNzkzLDcgQEAg
VmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZQYXJhZ3JhcGgoY29uc3QgVgogICAgICAgICAgICAgYnJl
YWs7CiAKICAgICAgICAgaWYgKHItPmlzVGV4dCgpICYmIHItPmNhcmV0TWF4UmVuZGVyZWRPZmZz
ZXQoKSA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChuLT5pc1RleHROb2RlKCkpOwogICAgICAg
ICAgICAgdHlwZSA9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I7CiAgICAgICAg
ICAgICBpZiAoc3R5bGUtPnByZXNlcnZlTmV3bGluZSgpKSB7CiAgICAgICAgICAgICAgICAgY29u
c3QgVUNoYXIqIGNoYXJzID0gdG9SZW5kZXJUZXh0KHIpLT5jaGFyYWN0ZXJzKCk7CkBAIC04MDAs
OSArODAxLDEwIEBAIFZpc2libGVQb3NpdGlvbiBzdGFydE9mUGFyYWdyYXBoKGNvbnN0IFYKICAg
ICAgICAgICAgICAgICBpbnQgbyA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBpZiAobiA9PSBz
dGFydE5vZGUgJiYgbyA8IGkpCiAgICAgICAgICAgICAgICAgICAgIGkgPSBtYXgoMCwgbyk7Ci0g
ICAgICAgICAgICAgICAgd2hpbGUgKC0taSA+PSAwKQorICAgICAgICAgICAgICAgIHdoaWxlICgt
LWkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gJ1xuJykKLSAg
ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24obiwg
aSArIDEsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24o
c3RhdGljX2Nhc3Q8VGV4dCo+KG4pLCBpICsgMSksIERPV05TVFJFQU0pOworICAgICAgICAgICAg
ICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGUgPSBuOwogICAgICAgICAgICAg
b2Zmc2V0ID0gMDsKQEAgLTgxNSw5ICs4MTcsMTEgQEAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0T2ZQ
YXJhZ3JhcGgoY29uc3QgVgogICAgICAgICAgICAgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2Rl
UG9zdE9yZGVyKHN0YXJ0QmxvY2spOwogICAgIH0KIAotICAgIGlmICh0eXBlID09IFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpCisgICAgaWYgKHR5cGUgPT0gUG9zaXRpb246OlBv
c2l0aW9uSXNPZmZzZXRJbkFuY2hvcikgeworICAgICAgICBBU1NFUlQodHlwZSAhPSBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yIHx8ICFvZmZzZXQpOwogICAgICAgICByZXR1cm4g
VmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG5vZGUsIG9mZnNldCwgdHlwZSksIERPV05TVFJFQU0p
OwotICAgIAorICAgIH0KKwogICAgIHJldHVybiBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24obm9k
ZSwgdHlwZSksIERPV05TVFJFQU0pOwogfQogCkBAIC04NjcsMTQgKzg3MSwxNiBAQCBWaXNpYmxl
UG9zaXRpb24gZW5kT2ZQYXJhZ3JhcGgoY29uc3QgVmlzCiAKICAgICAgICAgLy8gRklYTUU6IFdl
IGF2b2lkIHJldHVybmluZyBhIHBvc2l0aW9uIHdoZXJlIHRoZSByZW5kZXJlciBjYW4ndCBhY2Nl
cHQgdGhlIGNhcmV0LgogICAgICAgICBpZiAoci0+aXNUZXh0KCkgJiYgci0+Y2FyZXRNYXhSZW5k
ZXJlZE9mZnNldCgpID4gMCkgeworICAgICAgICAgICAgQVNTRVJUKG4tPmlzVGV4dE5vZGUoKSk7
CiAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gdG9SZW5kZXJUZXh0KHIpLT50ZXh0TGVuZ3RoKCk7
CiAgICAgICAgICAgICB0eXBlID0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcjsK
ICAgICAgICAgICAgIGlmIChzdHlsZS0+cHJlc2VydmVOZXdsaW5lKCkpIHsKICAgICAgICAgICAg
ICAgICBjb25zdCBVQ2hhciogY2hhcnMgPSB0b1JlbmRlclRleHQociktPmNoYXJhY3RlcnMoKTsK
ICAgICAgICAgICAgICAgICBpbnQgbyA9IG4gPT0gc3RhcnROb2RlID8gb2Zmc2V0IDogMDsKLSAg
ICAgICAgICAgICAgICBmb3IgKGludCBpID0gbzsgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICAg
ICAgICAgIGZvciAoaW50IGkgPSBvOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAg
ICAgICAgaWYgKGNoYXJzW2ldID09ICdcbicpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG4sIGksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBWaXNpYmxlUG9zaXRpb24oUG9zaXRpb24oc3RhdGljX2Nhc3Q8VGV4dCo+KG4pLCBpKSwgRE9X
TlNUUkVBTSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAg
bm9kZSA9IG47CiAgICAgICAgICAgICBvZmZzZXQgPSByLT5jYXJldE1heE9mZnNldCgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98951</attachid>
            <date>2011-06-28 11:32:22 -0700</date>
            <delta_ts>2011-06-28 12:14:12 -0700</delta_ts>
            <desc>Fixed per comments</desc>
            <filename>bug-63384-20110628113220.patch</filename>
            <type>text/plain</type>
            <size>34761</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDg5OTQwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNjAgQEAKKzIwMTEtMDYtMjggIFJ5b3N1a2Ug
Tml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRs
ZXIuCisKKyAgICAgICAgU3RvcCBpbnN0YW50aWF0aW5nIFBvc2l0aW9uIHdpdGggUG9zaXRpb25J
c09mZnNldEluQW5jaG9yIGluIHZhcmlvdXMgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYzMzg0CisKKyAgICAgICAgUmVmYWN0b3JpbmcuCisK
KyAgICAgICAgUmVtb3ZlZCBtYW55IGlmIGNvbmRpdGlvbnMgdGhhdCBjb21wYXJlZCB0aGUgYW5j
aG9yIHR5cGUgdG8gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcgorICAgICAgICBi
ZWNhdXNlIHRoZXJlIHdlcmUgYWxzbyBjaGVja2luZyB0aGF0IGNvbnRhaW5lck5vZGUgaXMgYSB0
ZXh0IG5vZGUuCisKKyAgICAgICAgQWxzbyBhZGRlZCBQb3NpdGlvbjo6Y29udGFpbmVyVGV4dCgp
IHRvIGF2b2lkIG1hbnVhbGx5IGNhc3RpbmcgY29udGFpbmVyTm9kZSgpLgorCisgICAgICAgICog
ZG9tL1Bvc2l0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBvc2l0aW9uOjpQb3NpdGlvbik6
IEFkZGVkIGFuIGFzc2VydGlvbiB0byBlbnN1cmUgQmVmb3JlQ2hpbGRyZW4vQWZ0ZXJDaGlsZHJl
bgorICAgICAgICBhbmNob3IgdHlwZSB3b24ndCBiZSB1c2VkIGZvciBhIG5vZGUgd2hvc2UgY29u
dGVudHMgaXMgaWdub3JlZCBieSBlZGl0aW5nLgorICAgICAgICAoV2ViQ29yZTo6UG9zaXRpb246
OmNvbnRhaW5lclRleHQpOiBBZGRlZC4KKyAgICAgICAgKiBkb20vUG9zaXRpb24uaDoKKyAgICAg
ICAgKiBlZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50Q29tbWFuZC5jcHA6CisgICAgICAgIChXZWJD
b3JlOjppc05ld0xpbmVBdFBvc2l0aW9uKTogUmVtb3ZlZCBhIHJlZHVuZGFudCBjb21wYXJpc29u
IG9mIGFuY2hvciB0eXBlLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlCbG9ja0VsZW1lbnRDb21t
YW5kOjpyYW5nZUZvclBhcmFncmFwaFNwbGl0dGluZ1RleHROb2Rlc0lmTmVlZGVkKTogU2luY2Ug
Y29udGFpbmVyTm9kZQorICAgICAgICBpcyBhbHdheXMgYSB0ZXh0IG5vZGUgd2hlbiByZW5kZXJT
dHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUgcmV0dXJucyBhIHJlbmRlciBzdHlsZSwgdXNlIG5ldyBQ
b3NpdGlvbgorICAgICAgICBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIFRleHQqIGFuZCBvZmZzZXQu
CisgICAgICAgIChXZWJDb3JlOjpBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6OmVuZE9mTmV4dFBh
cmFncmFoU3BsaXR0aW5nVGV4dE5vZGVzSWZOZWVkZWQpOiBSZW1vdmVkIHJlZHVuZGFudAorICAg
ICAgICBjb21wYXJpc29uIG9mIGFuY2hvciB0eXBlIGFuZCB1c2UgbmV3IFBvc2l0aW9uIGNvbnN0
cnVjdG9yIHRoYXQgdGFrZXMgVGV4dCogYW5kIG9mZnNldC4KKyAgICAgICAgKiBlZGl0aW5nL0Fw
cGx5U3R5bGVDb21tYW5kLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkFwcGx5U3R5bGVDb21tYW5k
OjpzcGxpdFRleHRBdFN0YXJ0KTogUmVwbGFjZWQgYW4gYXNzZXJ0aW9uIHRoYXQgY29tcGFyZWQg
YW5jaG9yIHR5cGUgYnkKKyAgICAgICAgYW4gYXNzZXJ0aW9uIHRoYXQgdGhlIGNvbnRhaW5lciBu
b2RlIGlzIGEgdGV4dCBub2RlOyB1c2UgbmV3IGNvbnN0cnVjdG9yLgorICAgICAgICAoV2ViQ29y
ZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0RW5kKTogRGl0dG87IGFsc28gYWRkZWQg
ZWFybHkgZXhpdHMgaW4gdGhlIGNhc2Ugc2NyaXB0CisgICAgICAgIG1vZGlmaWVkIERPTS4KKyAg
ICAgICAgKFdlYkNvcmU6OkFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRFbGVtZW50QXRTdGFy
dCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4
dEVsZW1lbnRBdEVuZCk6IERpdHRvLgorICAgICAgICAoV2ViQ29yZTo6QXBwbHlTdHlsZUNvbW1h
bmQ6OmpvaW5DaGlsZFRleHROb2Rlcyk6IFVzZSBuZXcgY29uc3RydWN0b3IuCisgICAgICAgICog
ZWRpdGluZy9Db21wb3NpdGVFZGl0Q29tbWFuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFZGl0
b3I6OnJlcGxhY2VTZWxlY3RlZFRleHRJbk5vZGUpOiBDYWxscyBjb250YWluZXJUZXh0IGluc3Rl
YWQgb2YgbWFudWFsbHkgY2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRpbmcv
RWRpdG9yLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkVkaXRvcjo6Y2FuRGVsZXRlUmFuZ2UpOiBD
YWxsIFJhbmdlOjpzdGFydFBvc2l0aW9uIGluc3RlYWQgb2YgbWFudWFsbHkgaW5zdGFudGlhdGlu
ZyBQb3NpdGlvbgorICAgICAgICBieSBjYWxsaW5nIHN0YXJ0Q29udGFpbmVyIGFuZCBzdGFydE9m
ZnNldC4KKyAgICAgICAgKiBlZGl0aW5nL0ZyYW1lU2VsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkZyYW1lU2VsZWN0aW9uOjpzZXRTZWxlY3RlZFJhbmdlKTogRGl0dG8uCisgICAgICAg
ICogZWRpdGluZy9JbnNlcnRUZXh0Q29tbWFuZC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpJbnNl
cnRUZXh0Q29tbWFuZDo6aW5wdXQpOiBDYWxscyBjb250YWluZXJUZXh0IGluc3RlYWQgb2YgbWFu
dWFsbHkgY2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRpbmcvUmVwbGFjZVNl
bGVjdGlvbkNvbW1hbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6UmVwbGFjZVNlbGVjdGlvbkNv
bW1hbmQ6OmRvQXBwbHkpOiBDYWxscyBjb250YWluZXJUZXh0IGluc3RlYWQgb2YgbWFudWFsbHkg
Y2FzdGluZyBjb250YWluZXJOb2RlLgorICAgICAgICAqIGVkaXRpbmcvVmlzaWJsZVBvc2l0aW9u
LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlZpc2libGVQb3NpdGlvbjo6Y2hhcmFjdGVyQWZ0ZXIp
OiBSZW1vdmVkIGEgcmVkdW5kYW50IGFuY2hvciB0eXBlIGNvbXBhcmlzb24uCisgICAgICAgIChX
ZWJDb3JlOjpzdGFydFZpc2libGVQb3NpdGlvbik6IENhbGwgUmFuZ2U6OnN0YXJ0UG9zaXRpb24g
aW5zdGVhZCBvZiBzdGFydENvbnRhaW5lciBhbmQgc3RhcnRPZmZzZXQuCisgICAgICAgIChXZWJD
b3JlOjplbmRWaXNpYmxlUG9zaXRpb24pOiBDYWxsIFJhbmdlOjplbmRQb3NpdGlvbiBpbnN0ZWFk
IG9mIGVuZENvbnRhaW5lciBhbmQgZW5kT2Zmc2V0LgorICAgICAgICAqIGVkaXRpbmcvaHRtbGVk
aXRpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Zmlyc3RJblNwZWNpYWxFbGVtZW50KTogQ2Fs
bCBjb250YWluZXJOb2RlKCkgdG8gYWRkcmVzcyA8cmRhcjovL3Byb2JsZW0vNTAyNzcwMj4uCisg
ICAgICAgIChXZWJDb3JlOjpsYXN0SW5TcGVjaWFsRWxlbWVudCk6IERpdHRvOyB1c2UgbmV3IGNv
bnN0cnVjdG9yLgorICAgICAgICAqIGVkaXRpbmcvdmlzaWJsZV91bml0cy5jcHA6CisgICAgICAg
IChXZWJDb3JlOjplbmRQb3NpdGlvbkZvckxpbmUpOiBVc2UgbmV3IGNvbnN0cnVjdG9yLgorICAg
ICAgICAoV2ViQ29yZTo6c3RhcnRPZlBhcmFncmFwaCk6IERpdHRvLgorICAgICAgICAoV2ViQ29y
ZTo6ZW5kT2ZQYXJhZ3JhcGgpOiBEaXR0by4KKwogMjAxMS0wNi0yOCAgSm9vbmUgSHVyICA8am9v
bmUuaHVyQGNvbGxhYm9yYS5jby51az4KIAogICAgICAgICBSZXZpZXdlZCBieSBNYXJ0aW4gUm9i
aW5zb24uCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUG9zaXRpb24uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5jcHAJKHJldmlzaW9uIDg5OTQwKQorKysg
U291cmNlL1dlYkNvcmUvZG9tL1Bvc2l0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtOTEsNyAr
OTEsOCBAQCBQb3NpdGlvbjo6UG9zaXRpb24oUGFzc1JlZlB0cjxOb2RlPiBhbmNoCiB7CiAgICAg
QVNTRVJUKCFtX2FuY2hvck5vZGUgfHwgIW1fYW5jaG9yTm9kZS0+aXNTaGFkb3dSb290KCkpOwog
ICAgIEFTU0VSVChhbmNob3JUeXBlICE9IFBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7Ci0gICAg
QVNTRVJUKCEoKGFuY2hvclR5cGUgPT0gUG9zaXRpb25Jc0JlZm9yZUNoaWxkcmVuIHx8IGFuY2hv
clR5cGUgPT0gUG9zaXRpb25Jc0FmdGVyQ2hpbGRyZW4pICYmIG1fYW5jaG9yTm9kZS0+aXNUZXh0
Tm9kZSgpKSk7CisgICAgQVNTRVJUKCEoKGFuY2hvclR5cGUgPT0gUG9zaXRpb25Jc0JlZm9yZUNo
aWxkcmVuIHx8IGFuY2hvclR5cGUgPT0gUG9zaXRpb25Jc0FmdGVyQ2hpbGRyZW4pCisgICAgICAg
ICYmIChtX2FuY2hvck5vZGUtPmlzVGV4dE5vZGUoKSB8fCBlZGl0aW5nSWdub3Jlc0NvbnRlbnQo
bV9hbmNob3JOb2RlLmdldCgpKSkpKTsKIH0KIAogUG9zaXRpb246OlBvc2l0aW9uKFBhc3NSZWZQ
dHI8Tm9kZT4gYW5jaG9yTm9kZSwgaW50IG9mZnNldCwgQW5jaG9yVHlwZSBhbmNob3JUeXBlKQpA
QCAtMTQ4LDYgKzE0OSwyMyBAQCBOb2RlKiBQb3NpdGlvbjo6Y29udGFpbmVyTm9kZSgpIGNvbnN0
CiAgICAgcmV0dXJuIDA7CiB9CiAKK1RleHQqIFBvc2l0aW9uOjpjb250YWluZXJUZXh0KCkgY29u
c3QKK3sKKyAgICBzd2l0Y2ggKGFuY2hvclR5cGUoKSkgeworICAgIGNhc2UgUG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yOgorICAgICAgICAgICAgcmV0dXJuIG1fYW5jaG9yTm9kZSAmJiBtX2FuY2hv
ck5vZGUtPmlzVGV4dE5vZGUoKSA/IHN0YXRpY19jYXN0PFRleHQqPihtX2FuY2hvck5vZGUuZ2V0
KCkpIDogMDsKKyAgICBjYXNlIFBvc2l0aW9uSXNCZWZvcmVBbmNob3I6CisgICAgY2FzZSBQb3Np
dGlvbklzQWZ0ZXJBbmNob3I6CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgUG9zaXRpb25J
c0JlZm9yZUNoaWxkcmVuOgorICAgIGNhc2UgUG9zaXRpb25Jc0FmdGVyQ2hpbGRyZW46CisgICAg
ICAgIEFTU0VSVCghbV9hbmNob3JOb2RlIHx8ICFtX2FuY2hvck5vZGUtPmlzVGV4dE5vZGUoKSk7
CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAg
ICByZXR1cm4gMDsKK30KKwogaW50IFBvc2l0aW9uOjpjb21wdXRlT2Zmc2V0SW5Db250YWluZXJO
b2RlKCkgY29uc3QKIHsKICAgICBpZiAoIW1fYW5jaG9yTm9kZSkKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2RvbS9Qb3NpdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3Np
dGlvbi5oCShyZXZpc2lvbiA4OTk0MCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Qb3NpdGlvbi5o
CSh3b3JraW5nIGNvcHkpCkBAIC05Niw2ICs5Niw4IEBAIHB1YmxpYzoKICAgICAvLyBUaGVzZSBh
cmUgYWx3YXlzIERPTSBjb21wbGlhbnQgdmFsdWVzLiAgRWRpdGluZyBwb3NpdGlvbnMgbGlrZSBb
aW1nLCAwXSAoYWthIFtpbWcsIGJlZm9yZV0pCiAgICAgLy8gd2lsbCByZXR1cm4gaW1nLT5wYXJl
bnROb2RlKCkgYW5kIGltZy0+bm9kZUluZGV4KCkgZnJvbSB0aGVzZSBmdW5jdGlvbnMuCiAgICAg
Tm9kZSogY29udGFpbmVyTm9kZSgpIGNvbnN0OyAvLyBOVUxMIGZvciBhIGJlZm9yZS9hZnRlciBw
b3NpdGlvbiBhbmNob3JlZCB0byBhIG5vZGUgd2l0aCBubyBwYXJlbnQKKyAgICBUZXh0KiBjb250
YWluZXJUZXh0KCkgY29uc3Q7CisKICAgICBpbnQgY29tcHV0ZU9mZnNldEluQ29udGFpbmVyTm9k
ZSgpIGNvbnN0OyAgLy8gTyhuKSBmb3IgYmVmb3JlL2FmdGVyLWFuY2hvcmVkIHBvc2l0aW9ucywg
TygxKSBmb3IgcGFyZW50LWFuY2hvcmVkIHBvc2l0aW9ucwogICAgIFBvc2l0aW9uIHBhcmVudEFu
Y2hvcmVkRXF1aXZhbGVudCgpIGNvbnN0OyAvLyBDb252ZW5pZW5jZSBtZXRob2QgZm9yIERPTSBw
b3NpdGlvbnMgdGhhdCBhbHNvIGZpeGVzIHVwIHNvbWUgcG9zaXRpb25zIGZvciBlZGl0aW5nCiAK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvQXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5QmxvY2tFbGVtZW50
Q29tbWFuZC5jcHAJKHJldmlzaW9uIDg5OTQwKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9B
cHBseUJsb2NrRWxlbWVudENvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTAsOSArMTUw
LDYgQEAgdm9pZCBBcHBseUJsb2NrRWxlbWVudENvbW1hbmQ6OmZvcm1hdFNlbAogCiBzdGF0aWMg
Ym9vbCBpc05ld0xpbmVBdFBvc2l0aW9uKGNvbnN0IFBvc2l0aW9uJiBwb3NpdGlvbikKIHsKLSAg
ICBpZiAocG9zaXRpb24uYW5jaG9yVHlwZSgpICE9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0
SW5BbmNob3IpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIE5vZGUqIHRleHROb2RlID0g
cG9zaXRpb24uY29udGFpbmVyTm9kZSgpOwogICAgIGludCBvZmZzZXQgPSBwb3NpdGlvbi5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKTsKICAgICBpZiAoIXRleHROb2RlIHx8ICF0ZXh0Tm9kZS0+aXNU
ZXh0Tm9kZSgpIHx8IG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IHRleHROb2RlLT5tYXhDaGFyYWN0
ZXJPZmZzZXQoKSkKQEAgLTE4MSwxMSArMTc4LDEwIEBAIHZvaWQgQXBwbHlCbG9ja0VsZW1lbnRD
b21tYW5kOjpyYW5nZUZvclAKICAgICBzdGFydCA9IHN0YXJ0T2ZQYXJhZ3JhcGgoZW5kT2ZDdXJy
ZW50UGFyYWdyYXBoKS5kZWVwRXF1aXZhbGVudCgpOwogICAgIGVuZCA9IGVuZE9mQ3VycmVudFBh
cmFncmFwaC5kZWVwRXF1aXZhbGVudCgpOwogCi0gICAgUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUg
PSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUoc3RhcnQpOwogICAgIGJvb2wgaXNTdGFy
dEFuZEVuZE9uU2FtZU5vZGUgPSBmYWxzZTsKLSAgICBpZiAoc3RhcnRTdHlsZSkgewotICAgICAg
ICBpc1N0YXJ0QW5kRW5kT25TYW1lTm9kZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9k
ZShlbmQpICYmIHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCkgPT0gZW5kLmRlcHJlY2F0ZWROb2RlKCk7
Ci0gICAgICAgIGJvb2wgaXNTdGFydEFuZEVuZE9mTGFzdFBhcmFncmFwaE9uU2FtZU5vZGUgPSBy
ZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUobV9lbmRPZkxhc3RQYXJhZ3JhcGgpICYmIHN0
YXJ0LmRlcHJlY2F0ZWROb2RlKCkgPT0gbV9lbmRPZkxhc3RQYXJhZ3JhcGguZGVwcmVjYXRlZE5v
ZGUoKTsKKyAgICBpZiAoUmVuZGVyU3R5bGUqIHN0YXJ0U3R5bGUgPSByZW5kZXJTdHlsZU9mRW5j
bG9zaW5nVGV4dE5vZGUoc3RhcnQpKSB7CisgICAgICAgIGlzU3RhcnRBbmRFbmRPblNhbWVOb2Rl
ID0gcmVuZGVyU3R5bGVPZkVuY2xvc2luZ1RleHROb2RlKGVuZCkgJiYgc3RhcnQuY29udGFpbmVy
Tm9kZSgpID09IGVuZC5jb250YWluZXJOb2RlKCk7CisgICAgICAgIGJvb2wgaXNTdGFydEFuZEVu
ZE9mTGFzdFBhcmFncmFwaE9uU2FtZU5vZGUgPSByZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5v
ZGUobV9lbmRPZkxhc3RQYXJhZ3JhcGgpICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBtX2Vu
ZE9mTGFzdFBhcmFncmFwaC5jb250YWluZXJOb2RlKCk7CiAKICAgICAgICAgLy8gQXZvaWQgb2J0
YW5pbmluZyB0aGUgc3RhcnQgb2YgbmV4dCBwYXJhZ3JhcGggZm9yIHN0YXJ0CiAgICAgICAgIGlm
IChzdGFydFN0eWxlLT5wcmVzZXJ2ZU5ld2xpbmUoKSAmJiBpc05ld0xpbmVBdFBvc2l0aW9uKHN0
YXJ0KSAmJiAhaXNOZXdMaW5lQXRQb3NpdGlvbihzdGFydC5wcmV2aW91cygpKSAmJiBzdGFydC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA+IDApCkBAIC0xOTQsNDcgKzE5MCw0NCBAQCB2b2lkIEFw
cGx5QmxvY2tFbGVtZW50Q29tbWFuZDo6cmFuZ2VGb3JQCiAgICAgICAgIC8vIElmIHN0YXJ0IGlz
IGluIHRoZSBtaWRkbGUgb2YgYSB0ZXh0IG5vZGUsIHNwbGl0LgogICAgICAgICBpZiAoIXN0YXJ0
U3R5bGUtPmNvbGxhcHNlV2hpdGVTcGFjZSgpICYmIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpID4gMCkgewogICAgICAgICAgICAgaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnQub2Zmc2V0SW5D
b250YWluZXJOb2RlKCk7Ci0gICAgICAgICAgICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRl
eHQqPihzdGFydC5kZXByZWNhdGVkTm9kZSgpKSwgc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAg
c3RhcnQgPSBmaXJzdFBvc2l0aW9uSW5PckJlZm9yZU5vZGUoc3RhcnQuZGVwcmVjYXRlZE5vZGUo
KSk7CisgICAgICAgICAgICBUZXh0KiBzdGFydFRleHQgPSBzdGFydC5jb250YWluZXJUZXh0KCk7
CisgICAgICAgICAgICBzcGxpdFRleHROb2RlKHN0YXJ0VGV4dCwgc3RhcnRPZmZzZXQpOworICAg
ICAgICAgICAgc3RhcnQgPSBmaXJzdFBvc2l0aW9uSW5Ob2RlKHN0YXJ0VGV4dCk7CiAgICAgICAg
ICAgICBpZiAoaXNTdGFydEFuZEVuZE9uU2FtZU5vZGUpIHsKICAgICAgICAgICAgICAgICBBU1NF
UlQoZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpID49IHN0YXJ0T2Zmc2V0KTsKLSAgICAgICAg
ICAgICAgICBlbmQgPSBQb3NpdGlvbihlbmQuZGVwcmVjYXRlZE5vZGUoKSwgZW5kLm9mZnNldElu
Q29udGFpbmVyTm9kZSgpIC0gc3RhcnRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0
SW5BbmNob3IpOworICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKHN0YXJ0VGV4dCwgZW5k
Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgfQog
ICAgICAgICAgICAgaWYgKGlzU3RhcnRBbmRFbmRPZkxhc3RQYXJhZ3JhcGhPblNhbWVOb2RlKSB7
CiAgICAgICAgICAgICAgICAgQVNTRVJUKG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29u
dGFpbmVyTm9kZSgpID49IHN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBtX2VuZE9mTGFz
dFBhcmFncmFwaCA9IFBvc2l0aW9uKG1fZW5kT2ZMYXN0UGFyYWdyYXBoLmRlcHJlY2F0ZWROb2Rl
KCksIG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnRP
ZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gUG9zaXRpb24o
c3RhcnRUZXh0LCBtX2VuZE9mTGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAt
IHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIFJl
bmRlclN0eWxlKiBlbmRTdHlsZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdUZXh0Tm9kZShlbmQp
OwotICAgIGlmIChlbmRTdHlsZSkgeworICAgIGlmIChSZW5kZXJTdHlsZSogZW5kU3R5bGUgPSBy
ZW5kZXJTdHlsZU9mRW5jbG9zaW5nVGV4dE5vZGUoZW5kKSkgewogICAgICAgICBib29sIGlzRW5k
QW5kRW5kT2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSA9IHJlbmRlclN0eWxlT2ZFbmNsb3NpbmdU
ZXh0Tm9kZShtX2VuZE9mTGFzdFBhcmFncmFwaCkgJiYgZW5kLmRlcHJlY2F0ZWROb2RlKCkgPT0g
bV9lbmRPZkxhc3RQYXJhZ3JhcGguZGVwcmVjYXRlZE5vZGUoKTsKICAgICAgICAgLy8gSW5jbHVk
ZSBcbiBhdCB0aGUgZW5kIG9mIGxpbmUgaWYgd2UncmUgYXQgYW4gZW1wdHkgcGFyYWdyYXBoCi0g
ICAgICAgIGlmIChlbmRTdHlsZS0+cHJlc2VydmVOZXdsaW5lKCkgJiYgc3RhcnQgPT0gZW5kCi0g
ICAgICAgICAgICAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVy
Tm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkgeworICAgICAgICBpZiAoZW5kU3R5bGUtPnBy
ZXNlcnZlTmV3bGluZSgpICYmIHN0YXJ0ID09IGVuZCAmJiBlbmQub2Zmc2V0SW5Db250YWluZXJO
b2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0ZXJPZmZzZXQoKSkgewogICAg
ICAgICAgICAgaW50IGVuZE9mZnNldCA9IGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKTsKICAg
ICAgICAgICAgIGlmICghaXNOZXdMaW5lQXRQb3NpdGlvbihlbmQucHJldmlvdXMoKSkgJiYgaXNO
ZXdMaW5lQXRQb3NpdGlvbihlbmQpKQotICAgICAgICAgICAgICAgIGVuZCA9IFBvc2l0aW9uKGVu
ZC5kZXByZWNhdGVkTm9kZSgpLCBlbmRPZmZzZXQgKyAxLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09m
ZnNldEluQW5jaG9yKTsKKyAgICAgICAgICAgICAgICBlbmQgPSBQb3NpdGlvbihlbmQuY29udGFp
bmVyVGV4dCgpLCBlbmRPZmZzZXQgKyAxKTsKICAgICAgICAgICAgIGlmIChpc0VuZEFuZEVuZE9m
TGFzdFBhcmFncmFwaE9uU2FtZU5vZGUgJiYgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpID49
IG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKQogICAgICAgICAg
ICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gZW5kOwogICAgICAgICB9CiAKICAgICAgICAg
Ly8gSWYgZW5kIGlzIGluIHRoZSBtaWRkbGUgb2YgYSB0ZXh0IG5vZGUsIHNwbGl0LgotICAgICAg
ICBpZiAoIWVuZFN0eWxlLT5jb2xsYXBzZVdoaXRlU3BhY2UoKSAmJiBlbmQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCkKLSAgICAgICAgICAgICYmIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA8
IGVuZC5jb250YWluZXJOb2RlKCktPm1heENoYXJhY3Rlck9mZnNldCgpKSB7Ci0gICAgICAgICAg
ICBzcGxpdFRleHROb2RlKHN0YXRpY19jYXN0PFRleHQqPihlbmQuZGVwcmVjYXRlZE5vZGUoKSks
IGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisgICAgICAgIGlmICghZW5kU3R5bGUtPmNv
bGxhcHNlV2hpdGVTcGFjZSgpICYmIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAmJiBlbmQu
b2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBlbmQuY29udGFpbmVyTm9kZSgpLT5tYXhDaGFyYWN0
ZXJPZmZzZXQoKSkgeworICAgICAgICAgICAgUmVmUHRyPFRleHQ+IGVuZENvbnRhaW5lciA9IGVu
ZC5jb250YWluZXJUZXh0KCk7CisgICAgICAgICAgICBzcGxpdFRleHROb2RlKGVuZENvbnRhaW5l
ciwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKICAgICAgICAgICAgIGlmIChpc1N0YXJ0
QW5kRW5kT25TYW1lTm9kZSkKLSAgICAgICAgICAgICAgICBzdGFydCA9IGZpcnN0UG9zaXRpb25J
bk9yQmVmb3JlTm9kZShlbmQuZGVwcmVjYXRlZE5vZGUoKS0+cHJldmlvdXNTaWJsaW5nKCkpOwor
ICAgICAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3RQb3NpdGlvbkluT3JCZWZvcmVOb2RlKGVuZENv
bnRhaW5lci0+cHJldmlvdXNTaWJsaW5nKCkpOwogICAgICAgICAgICAgaWYgKGlzRW5kQW5kRW5k
T2ZMYXN0UGFyYWdyYXBoT25TYW1lTm9kZSkgewogICAgICAgICAgICAgICAgIGlmIChtX2VuZE9m
TGFzdFBhcmFncmFwaC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSA9PSBlbmQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCkpCi0gICAgICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0g
bGFzdFBvc2l0aW9uSW5Ob2RlKGVuZC5kZXByZWNhdGVkTm9kZSgpLT5wcmV2aW91c1NpYmxpbmco
KSk7CisgICAgICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gbGFzdFBvc2l0
aW9uSW5PckFmdGVyTm9kZShlbmRDb250YWluZXItPnByZXZpb3VzU2libGluZygpKTsKICAgICAg
ICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBo
ID0gUG9zaXRpb24oZW5kLmRlcHJlY2F0ZWROb2RlKCksIG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9m
ZnNldEluQ29udGFpbmVyTm9kZSgpIC0gZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9u
OjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAgICAgICAgICAgICAgICBtX2VuZE9m
TGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKGVuZENvbnRhaW5lciwgbV9lbmRPZkxhc3RQYXJhZ3Jh
cGgub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkp
OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5kID0gbGFzdFBvc2l0aW9uSW5Ob2RlKGVu
ZC5kZXByZWNhdGVkTm9kZSgpLT5wcmV2aW91c1NpYmxpbmcoKSk7CisgICAgICAgICAgICBlbmQg
PSBsYXN0UG9zaXRpb25Jbk5vZGUoZW5kQ29udGFpbmVyLT5wcmV2aW91c1NpYmxpbmcoKSk7CiAg
ICAgICAgIH0KICAgICB9CiB9CkBAIC0yNDcsMzIgKzI0MCwzNCBAQCBWaXNpYmxlUG9zaXRpb24g
QXBwbHlCbG9ja0VsZW1lbnRDb21tYW5kCiAgICAgaWYgKCFzdHlsZSkKICAgICAgICAgcmV0dXJu
IGVuZE9mTmV4dFBhcmFncmFwaDsKIAotICAgIFJlZlB0cjxOb2RlPiBjb250YWluZXJOb2RlID0g
cG9zaXRpb24uY29udGFpbmVyTm9kZSgpOwotICAgIGlmICghc3R5bGUtPnByZXNlcnZlTmV3bGlu
ZSgpIHx8ICFwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKQotICAgICAgICB8fCAhaXNO
ZXdMaW5lQXRQb3NpdGlvbihQb3NpdGlvbihjb250YWluZXJOb2RlLmdldCgpLCAwLCBQb3NpdGlv
bjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSkpCisgICAgUmVmUHRyPFRleHQ+IHRleHQgPSBw
b3NpdGlvbi5jb250YWluZXJUZXh0KCk7CisgICAgaWYgKCFzdHlsZS0+cHJlc2VydmVOZXdsaW5l
KCkgfHwgIXBvc2l0aW9uLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIHx8ICFpc05ld0xpbmVBdFBv
c2l0aW9uKGZpcnN0UG9zaXRpb25Jbk5vZGUodGV4dC5nZXQoKSkpKQogICAgICAgICByZXR1cm4g
ZW5kT2ZOZXh0UGFyYWdyYXBoOwogCiAgICAgLy8gXG4gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUg
dGV4dCBub2RlIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgY3VycmVudCBwYXJhZ3JhcGggaXMg
dHJpbW1lZCBieSBtb3ZlUGFyYWdyYXBoV2l0aENsb25lcy4KICAgICAvLyBJZiBlbmRPZk5leHRQ
YXJhZ3JhcGggd2FzIHBvaW50aW5nIGF0IHRoaXMgc2FtZSB0ZXh0IG5vZGUsIGVuZE9mTmV4dFBh
cmFncmFwaCB3aWxsIGJlIHNoaWZ0ZWQgYnkgb25lIHBhcmFncmFwaC4KICAgICAvLyBBdm9pZCB0
aGlzIGJ5IHNwbGl0dGluZyAiXG4iCi0gICAgc3BsaXRUZXh0Tm9kZShzdGF0aWNfY2FzdDxUZXh0
Kj4oY29udGFpbmVyTm9kZS5nZXQoKSksIDEpOworICAgIHNwbGl0VGV4dE5vZGUodGV4dCwgMSk7
CiAKLSAgICBpZiAoc3RhcnQuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zm
c2V0SW5BbmNob3IgJiYgY29udGFpbmVyTm9kZS5nZXQoKSA9PSBzdGFydC5jb250YWluZXJOb2Rl
KCkpIHsKKyAgICBpZiAodGV4dCA9PSBzdGFydC5jb250YWluZXJOb2RlKCkgJiYgdGV4dC0+cHJl
dmlvdXNTaWJsaW5nKCkgJiYgdGV4dC0+cHJldmlvdXNTaWJsaW5nKCktPmlzVGV4dE5vZGUoKSkg
ewogICAgICAgICBBU1NFUlQoc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgPCBwb3NpdGlv
bi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Ci0gICAgICAgIHN0YXJ0ID0gUG9zaXRpb24oY29u
dGFpbmVyTm9kZS0+cHJldmlvdXNTaWJsaW5nKCksIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAgc3RhcnQg
PSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4odGV4dC0+cHJldmlvdXNTaWJsaW5nKCkpLCBz
dGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAgfQotICAgIGlmIChlbmQuYW5jaG9y
VHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgJiYgY29udGFpbmVy
Tm9kZS5nZXQoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKSB7CisgICAgaWYgKHRleHQgPT0gZW5k
LmNvbnRhaW5lck5vZGUoKSAmJiB0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKSAmJiB0ZXh0LT5wcmV2
aW91c1NpYmxpbmcoKS0+aXNUZXh0Tm9kZSgpKSB7CiAgICAgICAgIEFTU0VSVChlbmQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgPCBwb3NpdGlvbi5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7Ci0g
ICAgICAgIGVuZCA9IFBvc2l0aW9uKGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpLCBl
bmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworICAgICAgICBlbmQgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4odGV4dC0+
cHJldmlvdXNTaWJsaW5nKCkpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgIH0K
LSAgICBpZiAobV9lbmRPZkxhc3RQYXJhZ3JhcGguYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQ
b3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgJiYgY29udGFpbmVyTm9kZS5nZXQoKSA9PSBtX2VuZE9m
TGFzdFBhcmFncmFwaC5jb250YWluZXJOb2RlKCkpIHsKLSAgICAgICAgaWYgKG1fZW5kT2ZMYXN0
UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9zaXRpb24ub2Zmc2V0SW5Db250
YWluZXJOb2RlKCkpCi0gICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9u
KGNvbnRhaW5lck5vZGUtPnByZXZpb3VzU2libGluZygpLCBtX2VuZE9mTGFzdFBhcmFncmFwaC5v
ZmZzZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hv
cik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1fZW5kT2ZMYXN0UGFyYWdyYXBoID0gUG9z
aXRpb24oY29udGFpbmVyTm9kZSwgbV9lbmRPZkxhc3RQYXJhZ3JhcGgub2Zmc2V0SW5Db250YWlu
ZXJOb2RlKCkgLSAxLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBp
ZiAodGV4dCA9PSBtX2VuZE9mTGFzdFBhcmFncmFwaC5jb250YWluZXJOb2RlKCkpIHsKKyAgICAg
ICAgaWYgKG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIDwgcG9z
aXRpb24ub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbiBv
bmx5IGZpeCBlbmRPZkxhc3RQYXJhZ3JhcGggaWYgdGhlIHByZXZpb3VzIG5vZGUgd2FzIHN0aWxs
IHRleHQgYW5kIGhhc24ndCBiZWVuIG1vZGlmaWVkIGJ5IHNjcmlwdC4KKyAgICAgICAgICAgIGlm
ICh0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKS0+aXNUZXh0Tm9kZSgpCisgICAgICAgICAgICAgICAg
JiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29u
dGFpbmVyTm9kZSgpKSA8PSBzdGF0aWNfY2FzdDxUZXh0Kj4odGV4dC0+cHJldmlvdXNTaWJsaW5n
KCkpLT5sZW5ndGgoKSkKKyAgICAgICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBv
c2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPih0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKSksIG1fZW5k
T2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKyAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICBtX2VuZE9mTGFzdFBhcmFncmFwaCA9IFBvc2l0aW9uKHRleHQuZ2V0KCks
IG1fZW5kT2ZMYXN0UGFyYWdyYXBoLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSk7CiAgICAg
fQogCi0gICAgcmV0dXJuIFBvc2l0aW9uKGNvbnRhaW5lck5vZGUuZ2V0KCksIHBvc2l0aW9uLm9m
ZnNldEluQ29udGFpbmVyTm9kZSgpIC0gMSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvcik7CisgICAgcmV0dXJuIFBvc2l0aW9uKHRleHQuZ2V0KCksIHBvc2l0aW9uLm9mZnNldElu
Q29udGFpbmVyTm9kZSgpIC0gMSk7CiB9CiAKIFBhc3NSZWZQdHI8RWxlbWVudD4gQXBwbHlCbG9j
a0VsZW1lbnRDb21tYW5kOjpjcmVhdGVCbG9ja0VsZW1lbnQoKSBjb25zdApJbmRleDogU291cmNl
L1dlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHAJKHJldmlzaW9uIDg5OTQw
KQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9BcHBseVN0eWxlQ29tbWFuZC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTExMTcsNjAgKzExMTcsNjUgQEAgYm9vbCBBcHBseVN0eWxlQ29tbWFuZDo6
bm9kZUZ1bGx5VW5zZWxlYwogCiB2b2lkIEFwcGx5U3R5bGVDb21tYW5kOjpzcGxpdFRleHRBdFN0
YXJ0KGNvbnN0IFBvc2l0aW9uJiBzdGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCkKIHsKLSAgICBB
U1NFUlQoc3RhcnQuYW5jaG9yVHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5B
bmNob3IpOworICAgIEFTU0VSVChzdGFydC5jb250YWluZXJOb2RlKCktPmlzVGV4dE5vZGUoKSk7
CiAKICAgICBQb3NpdGlvbiBuZXdFbmQ7CiAgICAgaWYgKGVuZC5hbmNob3JUeXBlKCkgPT0gUG9z
aXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciAmJiBzdGFydC5jb250YWluZXJOb2RlKCkg
PT0gZW5kLmNvbnRhaW5lck5vZGUoKSkKLSAgICAgICAgbmV3RW5kID0gUG9zaXRpb24oZW5kLmNv
bnRhaW5lck5vZGUoKSwgZW5kLm9mZnNldEluQ29udGFpbmVyTm9kZSgpIC0gc3RhcnQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOwor
ICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihlbmQuY29udGFpbmVyVGV4dCgpLCBlbmQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAg
ZWxzZQogICAgICAgICBuZXdFbmQgPSBlbmQ7CiAKLSAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nh
c3Q8VGV4dCo+KHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCkpOworICAgIFRleHQqIHRleHQgPSBzdGFy
dC5jb250YWluZXJUZXh0KCk7CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBzdGFydC5vZmZzZXRJ
bkNvbnRhaW5lck5vZGUoKSk7Ci0gICAgdXBkYXRlU3RhcnRFbmQoZmlyc3RQb3NpdGlvbkluTm9k
ZShzdGFydC5kZXByZWNhdGVkTm9kZSgpKSwgbmV3RW5kKTsKKyAgICB1cGRhdGVTdGFydEVuZChm
aXJzdFBvc2l0aW9uSW5Ob2RlKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSksIG5ld0VuZCk7CiB9CiAK
IHZvaWQgQXBwbHlTdHlsZUNvbW1hbmQ6OnNwbGl0VGV4dEF0RW5kKGNvbnN0IFBvc2l0aW9uJiBz
dGFydCwgY29uc3QgUG9zaXRpb24mIGVuZCkKIHsKLSAgICBBU1NFUlQoZW5kLmFuY2hvclR5cGUo
KSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICBBU1NFUlQoZW5k
LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgpKTsKIAogICAgIGJvb2wgc2hvdWxkVXBkYXRl
U3RhcnQgPSBzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJ
bkFuY2hvciAmJiBzdGFydC5jb250YWluZXJOb2RlKCkgPT0gZW5kLmNvbnRhaW5lck5vZGUoKTsK
ICAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8VGV4dCAqPihlbmQuZGVwcmVjYXRlZE5vZGUo
KSk7CiAgICAgc3BsaXRUZXh0Tm9kZSh0ZXh0LCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkp
OwogCiAgICAgTm9kZSogcHJldk5vZGUgPSB0ZXh0LT5wcmV2aW91c1NpYmxpbmcoKTsKLSAgICBB
U1NFUlQocHJldk5vZGUpOwotICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBkYXRlU3Rh
cnQgPyBQb3NpdGlvbihwcmV2Tm9kZSwgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCksIFBv
c2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpIDogc3RhcnQ7CisgICAgaWYgKCFwcmV2
Tm9kZSB8fCAhcHJldk5vZGUtPmlzVGV4dE5vZGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
UG9zaXRpb24gbmV3U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHN0YXRpY19j
YXN0PFRleHQqPihwcmV2Tm9kZSksIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0
YXJ0OwogICAgIHVwZGF0ZVN0YXJ0RW5kKG5ld1N0YXJ0LCBsYXN0UG9zaXRpb25Jbk5vZGUocHJl
dk5vZGUpKTsKIH0KIAogdm9pZCBBcHBseVN0eWxlQ29tbWFuZDo6c3BsaXRUZXh0RWxlbWVudEF0
U3RhcnQoY29uc3QgUG9zaXRpb24mIHN0YXJ0LCBjb25zdCBQb3NpdGlvbiYgZW5kKQogewotICAg
IEFTU0VSVChzdGFydC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJ
bkFuY2hvcik7CisgICAgQVNTRVJUKHN0YXJ0LmNvbnRhaW5lck5vZGUoKS0+aXNUZXh0Tm9kZSgp
KTsKIAogICAgIFBvc2l0aW9uIG5ld0VuZDsKLSAgICBpZiAoZW5kLmFuY2hvclR5cGUoKSA9PSBQ
b3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIHN0YXJ0LmNvbnRhaW5lck5vZGUo
KSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihlbmQu
Y29udGFpbmVyTm9kZSgpLCBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcik7
CisgICAgaWYgKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSA9PSBlbmQuY29udGFpbmVyTm9kZSgpKQor
ICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihlbmQuY29udGFpbmVyVGV4dCgpLCBlbmQub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgLSBzdGFydC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CiAgICAg
ZWxzZQogICAgICAgICBuZXdFbmQgPSBlbmQ7CiAKLSAgICBUZXh0KiB0ZXh0ID0gc3RhdGljX2Nh
c3Q8VGV4dCo+KHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCkpOwotICAgIHNwbGl0VGV4dE5vZGVDb250
YWluaW5nRWxlbWVudCh0ZXh0LCBzdGFydC5kZXByZWNhdGVkRWRpdGluZ09mZnNldCgpKTsKLSAg
ICB1cGRhdGVTdGFydEVuZChQb3NpdGlvbihzdGFydC5kZXByZWNhdGVkTm9kZSgpLT5wYXJlbnRO
b2RlKCksIHN0YXJ0LmRlcHJlY2F0ZWROb2RlKCktPm5vZGVJbmRleCgpLCBQb3NpdGlvbjo6UG9z
aXRpb25Jc09mZnNldEluQW5jaG9yKSwgbmV3RW5kKTsKKyAgICBzcGxpdFRleHROb2RlQ29udGFp
bmluZ0VsZW1lbnQoc3RhcnQuY29udGFpbmVyVGV4dCgpLCBzdGFydC5vZmZzZXRJbkNvbnRhaW5l
ck5vZGUoKSk7CisgICAgdXBkYXRlU3RhcnRFbmQocG9zaXRpb25CZWZvcmVOb2RlKHN0YXJ0LmNv
bnRhaW5lck5vZGUoKSksIG5ld0VuZCk7CiB9CiAKIHZvaWQgQXBwbHlTdHlsZUNvbW1hbmQ6OnNw
bGl0VGV4dEVsZW1lbnRBdEVuZChjb25zdCBQb3NpdGlvbiYgc3RhcnQsIGNvbnN0IFBvc2l0aW9u
JiBlbmQpCiB7Ci0gICAgQVNTRVJUKGVuZC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcik7CisgICAgQVNTRVJUKGVuZC5jb250YWluZXJOb2RlKCktPmlz
VGV4dE5vZGUoKSk7CiAKLSAgICBib29sIHNob3VsZFVwZGF0ZVN0YXJ0ID0gc3RhcnQuYW5jaG9y
VHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgJiYgc3RhcnQuY29u
dGFpbmVyTm9kZSgpID09IGVuZC5jb250YWluZXJOb2RlKCk7Ci0gICAgVGV4dCogdGV4dCA9IHN0
YXRpY19jYXN0PFRleHQqPihlbmQuZGVwcmVjYXRlZE5vZGUoKSk7Ci0gICAgc3BsaXRUZXh0Tm9k
ZUNvbnRhaW5pbmdFbGVtZW50KHRleHQsIGVuZC5kZXByZWNhdGVkRWRpdGluZ09mZnNldCgpKTsK
KyAgICBib29sIHNob3VsZFVwZGF0ZVN0YXJ0ID0gc3RhcnQuY29udGFpbmVyTm9kZSgpID09IGVu
ZC5jb250YWluZXJOb2RlKCk7CisgICAgc3BsaXRUZXh0Tm9kZUNvbnRhaW5pbmdFbGVtZW50KGVu
ZC5jb250YWluZXJUZXh0KCksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSk7CisKKyAgICBO
b2RlKiBwYXJlbnRFbGVtZW50ID0gZW5kLmNvbnRhaW5lck5vZGUoKS0+cGFyZW50Tm9kZSgpOwor
ICAgIGlmICghcGFyZW50RWxlbWVudCB8fCAhcGFyZW50RWxlbWVudC0+cHJldmlvdXNTaWJsaW5n
KCkpCisgICAgICAgIHJldHVybjsKKyAgICBOb2RlKiBmaXJzdFRleHROb2RlID0gcGFyZW50RWxl
bWVudC0+cHJldmlvdXNTaWJsaW5nKCktPmxhc3RDaGlsZCgpOworICAgIGlmICghZmlyc3RUZXh0
Tm9kZSB8fCAhZmlyc3RUZXh0Tm9kZS0+aXNUZXh0Tm9kZSgpKQorICAgICAgICByZXR1cm47CiAK
LSAgICBOb2RlKiBwcmV2Tm9kZSA9IHRleHQtPnBhcmVudE5vZGUoKS0+cHJldmlvdXNTaWJsaW5n
KCktPmxhc3RDaGlsZCgpOwotICAgIEFTU0VSVChwcmV2Tm9kZSk7Ci0gICAgUG9zaXRpb24gbmV3
U3RhcnQgPSBzaG91bGRVcGRhdGVTdGFydCA/IFBvc2l0aW9uKHByZXZOb2RlLCBzdGFydC5vZmZz
ZXRJbkNvbnRhaW5lck5vZGUoKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvcikg
OiBzdGFydDsKLSAgICB1cGRhdGVTdGFydEVuZChuZXdTdGFydCwgUG9zaXRpb24ocHJldk5vZGUt
PnBhcmVudE5vZGUoKSwgcHJldk5vZGUtPm5vZGVJbmRleCgpICsgMSwgUG9zaXRpb246OlBvc2l0
aW9uSXNPZmZzZXRJbkFuY2hvcikpOworICAgIFBvc2l0aW9uIG5ld1N0YXJ0ID0gc2hvdWxkVXBk
YXRlU3RhcnQgPyBQb3NpdGlvbihzdGF0aWNfY2FzdDxUZXh0Kj4oZmlyc3RUZXh0Tm9kZSksIHN0
YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpKSA6IHN0YXJ0OworICAgIHVwZGF0ZVN0YXJ0RW5k
KG5ld1N0YXJ0LCBwb3NpdGlvbkFmdGVyTm9kZShmaXJzdFRleHROb2RlKSk7CiB9CiAKIGJvb2wg
QXBwbHlTdHlsZUNvbW1hbmQ6OnNob3VsZFNwbGl0VGV4dEVsZW1lbnQoRWxlbWVudCogZWxlbWVu
dCwgRWRpdGluZ1N0eWxlKiBzdHlsZSkKQEAgLTE0ODAsOSArMTQ4NSw5IEBAIHZvaWQgQXBwbHlT
dHlsZUNvbW1hbmQ6OmpvaW5DaGlsZFRleHROb2QKICAgICAgICAgICAgIFRleHQqIGNoaWxkVGV4
dCA9IHN0YXRpY19jYXN0PFRleHQgKj4oY2hpbGQpOwogICAgICAgICAgICAgVGV4dCogbmV4dFRl
eHQgPSBzdGF0aWNfY2FzdDxUZXh0ICo+KG5leHQpOwogICAgICAgICAgICAgaWYgKHN0YXJ0LmFu
Y2hvclR5cGUoKSA9PSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yICYmIG5leHQg
PT0gc3RhcnQuY29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgICAgIG5ld1N0YXJ0ID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgc3RhcnQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpOworICAgICAg
ICAgICAgICAgIG5ld1N0YXJ0ID0gUG9zaXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0
aCgpICsgc3RhcnQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgaWYgKGVu
ZC5hbmNob3JUeXBlKCkgPT0gUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciAmJiBu
ZXh0ID09IGVuZC5jb250YWluZXJOb2RlKCkpCi0gICAgICAgICAgICAgICAgbmV3RW5kID0gUG9z
aXRpb24oY2hpbGRUZXh0LCBjaGlsZFRleHQtPmxlbmd0aCgpICsgZW5kLm9mZnNldEluQ29udGFp
bmVyTm9kZSgpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKTsKKyAgICAgICAg
ICAgICAgICBuZXdFbmQgPSBQb3NpdGlvbihjaGlsZFRleHQsIGNoaWxkVGV4dC0+bGVuZ3RoKCkg
KyBlbmQub2Zmc2V0SW5Db250YWluZXJOb2RlKCkpOwogICAgICAgICAgICAgU3RyaW5nIHRleHRU
b01vdmUgPSBuZXh0VGV4dC0+ZGF0YSgpOwogICAgICAgICAgICAgaW5zZXJ0VGV4dEludG9Ob2Rl
KGNoaWxkVGV4dCwgY2hpbGRUZXh0LT5sZW5ndGgoKSwgdGV4dFRvTW92ZSk7CiAgICAgICAgICAg
ICByZW1vdmVOb2RlKG5leHQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9Db21wb3Np
dGVFZGl0Q29tbWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRpdGluZy9D
b21wb3NpdGVFZGl0Q29tbWFuZC5jcHAJKHJldmlzaW9uIDg5OTQwKQorKysgU291cmNlL1dlYkNv
cmUvZWRpdGluZy9Db21wb3NpdGVFZGl0Q29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMy
MCw3ICszMjAsNyBAQCBQb3NpdGlvbiBDb21wb3NpdGVFZGl0Q29tbWFuZDo6cmVwbGFjZVNlCiAg
ICAgaWYgKHN0YXJ0LmNvbnRhaW5lck5vZGUoKSAhPSBlbmQuY29udGFpbmVyTm9kZSgpIHx8ICFz
dGFydC5jb250YWluZXJOb2RlKCktPmlzVGV4dE5vZGUoKSB8fCBpc1RhYlNwYW5UZXh0Tm9kZShz
dGFydC5jb250YWluZXJOb2RlKCkpKQogICAgICAgICByZXR1cm4gUG9zaXRpb24oKTsKIAotICAg
IFJlZlB0cjxUZXh0PiB0ZXh0Tm9kZSA9IHN0YXRpY19jYXN0PFRleHQqPihzdGFydC5jb250YWlu
ZXJOb2RlKCkpOworICAgIFJlZlB0cjxUZXh0PiB0ZXh0Tm9kZSA9IHN0YXJ0LmNvbnRhaW5lclRl
eHQoKTsKICAgICByZXBsYWNlVGV4dEluTm9kZSh0ZXh0Tm9kZSwgc3RhcnQub2Zmc2V0SW5Db250
YWluZXJOb2RlKCksIGVuZC5vZmZzZXRJbkNvbnRhaW5lck5vZGUoKSAtIHN0YXJ0Lm9mZnNldElu
Q29udGFpbmVyTm9kZSgpLCB0ZXh0KTsKIAogICAgIHJldHVybiBQb3NpdGlvbih0ZXh0Tm9kZS5y
ZWxlYXNlKCksIHN0YXJ0Lm9mZnNldEluQ29udGFpbmVyTm9kZSgpICsgdGV4dC5sZW5ndGgoKSk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0VkaXRvci5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvZWRpdGluZy9FZGl0b3IuY3BwCShyZXZpc2lvbiA4OTk0MCkKKysrIFNv
dXJjZS9XZWJDb3JlL2VkaXRpbmcvRWRpdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjY2LDcg
KzI2Niw3IEBAIGJvb2wgRWRpdG9yOjpjYW5EZWxldGVSYW5nZShSYW5nZSogcmFuZ2UKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogICAgIAogICAgIGlmIChyYW5nZS0+Y29sbGFwc2VkKGVjKSkgewot
ICAgICAgICBWaXNpYmxlUG9zaXRpb24gc3RhcnQoUG9zaXRpb24oc3RhcnRDb250YWluZXIsIHJh
bmdlLT5zdGFydE9mZnNldChlYyksIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3Ip
LCBET1dOU1RSRUFNKTsKKyAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHN0YXJ0KHJhbmdlLT5zdGFy
dFBvc2l0aW9uKCksIERPV05TVFJFQU0pOwogICAgICAgICBWaXNpYmxlUG9zaXRpb24gcHJldmlv
dXMgPSBzdGFydC5wcmV2aW91cygpOwogICAgICAgICAvLyBGSVhNRTogV2Ugc29tZXRpbWVzIGFs
bG93IGRlbGV0aW9ucyBhdCB0aGUgc3RhcnQgb2YgZWRpdGFibGUgcm9vdHMsIGxpa2Ugd2hlbiB0
aGUgY2FyZXQgaXMgaW4gYW4gZW1wdHkgbGlzdCBpdGVtLgogICAgICAgICBpZiAocHJldmlvdXMu
aXNOdWxsKCkgfHwgcHJldmlvdXMuZGVlcEVxdWl2YWxlbnQoKS5kZXByZWNhdGVkTm9kZSgpLT5y
b290RWRpdGFibGVFbGVtZW50KCkgIT0gc3RhcnRDb250YWluZXItPnJvb3RFZGl0YWJsZUVsZW1l
bnQoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24uY3BwCShy
ZXZpc2lvbiA4OTk0MCkKKysrIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvRnJhbWVTZWxlY3Rpb24u
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNDYyLDQ1ICsxNDYyLDIzIEBAIHZvaWQgRnJhbWVTZWxl
Y3Rpb246OnNlbGVjdEFsbCgpCiAKIGJvb2wgRnJhbWVTZWxlY3Rpb246OnNldFNlbGVjdGVkUmFu
Z2UoUmFuZ2UqIHJhbmdlLCBFQWZmaW5pdHkgYWZmaW5pdHksIGJvb2wgY2xvc2VUeXBpbmcpCiB7
Ci0gICAgaWYgKCFyYW5nZSkKKyAgICBpZiAoIXJhbmdlIHx8ICFyYW5nZS0+c3RhcnRDb250YWlu
ZXIoKSB8fCAhcmFuZ2UtPmVuZENvbnRhaW5lcigpKQogICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgQVNTRVJUKHJhbmdlLT5zdGFydENvbnRhaW5lcigpLT5kb2N1bWVudCgpID09IHJhbmdlLT5l
bmRDb250YWluZXIoKS0+ZG9jdW1lbnQoKSk7CiAKLSAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsK
LSAgICBOb2RlKiBzdGFydENvbnRhaW5lciA9IHJhbmdlLT5zdGFydENvbnRhaW5lcihlYyk7Ci0g
ICAgaWYgKGVjKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBOb2RlKiBlbmRDb250YWlu
ZXIgPSByYW5nZS0+ZW5kQ29udGFpbmVyKGVjKTsKLSAgICBpZiAoZWMpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBBU1NFUlQoc3RhcnRDb250YWluZXIpOwotICAgIEFTU0VSVChl
bmRDb250YWluZXIpOwotICAgIEFTU0VSVChzdGFydENvbnRhaW5lci0+ZG9jdW1lbnQoKSA9PSBl
bmRDb250YWluZXItPmRvY3VtZW50KCkpOwotICAgIAogICAgIG1fZnJhbWUtPmRvY3VtZW50KCkt
PnVwZGF0ZUxheW91dElnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cygpOwogCiAgICAgLy8gTm9uLWNv
bGxhcHNlZCByYW5nZXMgYXJlIG5vdCBhbGxvd2VkIHRvIHN0YXJ0IGF0IHRoZSBlbmQgb2YgYSBs
aW5lIHRoYXQgaXMgd3JhcHBlZCwKICAgICAvLyB0aGV5IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcg
b2YgdGhlIG5leHQgbGluZSBpbnN0ZWFkCisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CiAgICAg
Ym9vbCBjb2xsYXBzZWQgPSByYW5nZS0+Y29sbGFwc2VkKGVjKTsKICAgICBpZiAoZWMpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBpbnQgc3RhcnRPZmZzZXQgPSByYW5nZS0+c3Rh
cnRPZmZzZXQoZWMpOwotICAgIGlmIChlYykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAg
aW50IGVuZE9mZnNldCA9IHJhbmdlLT5lbmRPZmZzZXQoZWMpOwotICAgIGlmIChlYykKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIAogICAgIC8vIEZJWE1FOiBDYW4gd2UgcHJvdmlkZSBleHRl
bnRBZmZpbml0eT8KLSAgICBWaXNpYmxlUG9zaXRpb24gdmlzaWJsZVN0YXJ0KFBvc2l0aW9uKHN0
YXJ0Q29udGFpbmVyLCBzdGFydE9mZnNldCwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFu
Y2hvciksIGNvbGxhcHNlZCA/IGFmZmluaXR5IDogRE9XTlNUUkVBTSk7Ci0gICAgVmlzaWJsZVBv
c2l0aW9uIHZpc2libGVFbmQoUG9zaXRpb24oZW5kQ29udGFpbmVyLCBlbmRPZmZzZXQsIFBvc2l0
aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IpLCBTRUxfREVGQVVMVF9BRkZJTklUWSk7Ci0g
ICAgU2V0U2VsZWN0aW9uT3B0aW9ucyBvcHRpb25zID0gQ2xlYXJUeXBpbmdTdHlsZTsKLSAgICBp
ZiAoY2xvc2VUeXBpbmcpCi0gICAgICAgIG9wdGlvbnMgfD0gQ2xvc2VUeXBpbmc7Ci0gICAgc2V0
U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24odmlzaWJsZVN0YXJ0LCB2aXNpYmxlRW5kKSwgb3B0
aW9ucyk7CisgICAgVmlzaWJsZVBvc2l0aW9uIHZpc2libGVTdGFydChyYW5nZS0+c3RhcnRQb3Np
dGlvbigpLCBjb2xsYXBzZWQgPyBhZmZpbml0eSA6IERPV05TVFJFQU0pOworICAgIFZpc2libGVQ
b3NpdGlvbiB2aXNpYmxlRW5kKHJhbmdlLT5lbmRQb3NpdGlvbigpLCBTRUxfREVGQVVMVF9BRkZJ
TklUWSk7CisgICAgc2V0U2VsZWN0aW9uKFZpc2libGVTZWxlY3Rpb24odmlzaWJsZVN0YXJ0LCB2
aXNpYmxlRW5kKSwgQ2xlYXJUeXBpbmdTdHlsZSB8IChjbG9zZVR5cGluZyA/IENsb3NlVHlwaW5n
IDogMCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0
aW5nL0luc2VydFRleHRDb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9l
ZGl0aW5nL0luc2VydFRleHRDb21tYW5kLmNwcAkocmV2aXNpb24gODk5NDApCisrKyBTb3VyY2Uv
V2ViQ29yZS9lZGl0aW5nL0luc2VydFRleHRDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MTU3LDcgKzE1Nyw3IEBAIHZvaWQgSW5zZXJ0VGV4dENvbW1hbmQ6OmlucHV0KGNvbnN0IFN0cmkK
ICAgICAgICAgQVNTRVJUKHN0YXJ0UG9zaXRpb24uY29udGFpbmVyTm9kZSgpLT5pc1RleHROb2Rl
KCkpOwogICAgICAgICBpZiAocGxhY2Vob2xkZXIuaXNOb3ROdWxsKCkpCiAgICAgICAgICAgICBy
ZW1vdmVQbGFjZWhvbGRlckF0KHBsYWNlaG9sZGVyKTsKLSAgICAgICAgUmVmUHRyPFRleHQ+IHRl
eHROb2RlID0gc3RhdGljX2Nhc3Q8VGV4dCo+KHN0YXJ0UG9zaXRpb24uY29udGFpbmVyTm9kZSgp
KTsKKyAgICAgICAgUmVmUHRyPFRleHQ+IHRleHROb2RlID0gc3RhcnRQb3NpdGlvbi5jb250YWlu
ZXJUZXh0KCk7CiAgICAgICAgIGNvbnN0IHVuc2lnbmVkIG9mZnNldCA9IHN0YXJ0UG9zaXRpb24u
b2Zmc2V0SW5Db250YWluZXJOb2RlKCk7CiAKICAgICAgICAgaW5zZXJ0VGV4dEludG9Ob2RlKHRl
eHROb2RlLCBvZmZzZXQsIHRleHQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9SZXBs
YWNlU2VsZWN0aW9uQ29tbWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZWRp
dGluZy9SZXBsYWNlU2VsZWN0aW9uQ29tbWFuZC5jcHAJKHJldmlzaW9uIDg5OTQwKQorKysgU291
cmNlL1dlYkNvcmUvZWRpdGluZy9SZXBsYWNlU2VsZWN0aW9uQ29tbWFuZC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTkzOSw3ICs5MzksNyBAQCB2b2lkIFJlcGxhY2VTZWxlY3Rpb25Db21tYW5kOjpk
b0FwcGx5KCkKICAgICAvLyBzaW5jZSBpbnNlcnRBc0xpc3RJdGVtcyBhbHJlYWR5IGRvZXMgdGhl
IHJpZ2h0IHRoaW5nLgogICAgIGlmICghbV9tYXRjaFN0eWxlICYmICFlbmNsb3NpbmdMaXN0KGlu
c2VydGlvblBvcy5jb250YWluZXJOb2RlKCkpICYmIGlzU3R5bGVTcGFuKGZyYWdtZW50LmZpcnN0
Q2hpbGQoKSkpIHsKICAgICAgICAgaWYgKGluc2VydGlvblBvcy5jb250YWluZXJOb2RlKCktPmlz
VGV4dE5vZGUoKSAmJiBpbnNlcnRpb25Qb3Mub2Zmc2V0SW5Db250YWluZXJOb2RlKCkgJiYgIWlu
c2VydGlvblBvcy5hdExhc3RFZGl0aW5nUG9zaXRpb25Gb3JOb2RlKCkpIHsKLSAgICAgICAgICAg
IHNwbGl0VGV4dE5vZGVDb250YWluaW5nRWxlbWVudChzdGF0aWNfY2FzdDxUZXh0Kj4oaW5zZXJ0
aW9uUG9zLmNvbnRhaW5lck5vZGUoKSksIGluc2VydGlvblBvcy5vZmZzZXRJbkNvbnRhaW5lck5v
ZGUoKSk7CisgICAgICAgICAgICBzcGxpdFRleHROb2RlQ29udGFpbmluZ0VsZW1lbnQoaW5zZXJ0
aW9uUG9zLmNvbnRhaW5lclRleHQoKSwgaW5zZXJ0aW9uUG9zLm9mZnNldEluQ29udGFpbmVyTm9k
ZSgpKTsKICAgICAgICAgICAgIGluc2VydGlvblBvcyA9IGZpcnN0UG9zaXRpb25Jbk5vZGUoaW5z
ZXJ0aW9uUG9zLmNvbnRhaW5lck5vZGUoKSk7CiAgICAgICAgIH0KIApJbmRleDogU291cmNlL1dl
YkNvcmUvZWRpdGluZy9WaXNpYmxlUG9zaXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2VkaXRpbmcvVmlzaWJsZVBvc2l0aW9uLmNwcAkocmV2aXNpb24gODk5NDApCisrKyBT
b3VyY2UvV2ViQ29yZS9lZGl0aW5nL1Zpc2libGVQb3NpdGlvbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTU1MiwxNSArNTUyLDE0IEBAIFVDaGFyMzIgVmlzaWJsZVBvc2l0aW9uOjpjaGFyYWN0ZXJB
ZnRlcigKICAgICBjYXNlIFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I6CiAgICAg
ICAgIGJyZWFrOwogICAgIH0KLSAgICBUZXh0KiB0ZXh0Tm9kZSA9IHN0YXRpY19jYXN0PFRleHQq
Pihwb3MuY29udGFpbmVyTm9kZSgpKTsKLSAgICB1bnNpZ25lZCBvZmZzZXQgPSBwb3MuYW5jaG9y
VHlwZSgpID09IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3IgPyBwb3Mub2Zmc2V0
SW5Db250YWluZXJOb2RlKCkgOiAwOwotICAgIHVuc2lnbmVkIGxlbmd0aCA9IHRleHROb2RlLT5s
ZW5ndGgoKTsKLSAgICBpZiAob2Zmc2V0ID49IGxlbmd0aCkKKyAgICB1bnNpZ25lZCBvZmZzZXQg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocG9zLm9mZnNldEluQ29udGFpbmVyTm9kZSgpKTsKKyAg
ICBUZXh0KiB0ZXh0Tm9kZSA9IHBvcy5jb250YWluZXJUZXh0KCk7CisgICAgaWYgKG9mZnNldCA+
PSB0ZXh0Tm9kZS0+bGVuZ3RoKCkpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgVUNoYXIzMiBj
aDsKICAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVycyA9IHRleHROb2RlLT5kYXRhKCkuY2hhcmFj
dGVycygpOwotICAgIFUxNl9ORVhUKGNoYXJhY3RlcnMsIG9mZnNldCwgbGVuZ3RoLCBjaCk7Cisg
ICAgVTE2X05FWFQoY2hhcmFjdGVycywgb2Zmc2V0LCB0ZXh0Tm9kZS0+bGVuZ3RoKCksIGNoKTsK
ICAgICByZXR1cm4gY2g7CiB9CiAKQEAgLTY0OSwxNCArNjQ4LDEyIEBAIFBhc3NSZWZQdHI8UmFu
Z2U+IG1ha2VSYW5nZShjb25zdCBWaXNpYmwKIAogVmlzaWJsZVBvc2l0aW9uIHN0YXJ0VmlzaWJs
ZVBvc2l0aW9uKGNvbnN0IFJhbmdlICpyLCBFQWZmaW5pdHkgYWZmaW5pdHkpCiB7Ci0gICAgaW50
IGV4Y2VwdGlvbiA9IDA7Ci0gICAgcmV0dXJuIFZpc2libGVQb3NpdGlvbihQb3NpdGlvbihyLT5z
dGFydENvbnRhaW5lcihleGNlcHRpb24pLCByLT5zdGFydE9mZnNldChleGNlcHRpb24pLCBQb3Np
dGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSwgYWZmaW5pdHkpOworICAgIHJldHVybiBW
aXNpYmxlUG9zaXRpb24oci0+c3RhcnRQb3NpdGlvbigpLCBhZmZpbml0eSk7CiB9CiAKIFZpc2li
bGVQb3NpdGlvbiBlbmRWaXNpYmxlUG9zaXRpb24oY29uc3QgUmFuZ2UgKnIsIEVBZmZpbml0eSBh
ZmZpbml0eSkKIHsKLSAgICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICByZXR1cm4gVmlzaWJsZVBv
c2l0aW9uKFBvc2l0aW9uKHItPmVuZENvbnRhaW5lcihleGNlcHRpb24pLCByLT5lbmRPZmZzZXQo
ZXhjZXB0aW9uKSwgUG9zaXRpb246OlBvc2l0aW9uSXNPZmZzZXRJbkFuY2hvciksIGFmZmluaXR5
KTsKKyAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKHItPmVuZFBvc2l0aW9uKCksIGFmZmluaXR5
KTsKIH0KIAogYm9vbCBzZXRTdGFydChSYW5nZSAqciwgY29uc3QgVmlzaWJsZVBvc2l0aW9uICZ2
aXNpYmxlUG9zaXRpb24pCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0aW5n
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0aW5nLmNw
cAkocmV2aXNpb24gODk5NDApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL2h0bWxlZGl0aW5n
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDAyLDggKzQwMiw3IEBAIGJvb2wgaXNTcGVjaWFsRWxl
bWVudChjb25zdCBOb2RlICpuKQogCiBzdGF0aWMgTm9kZSogZmlyc3RJblNwZWNpYWxFbGVtZW50
KGNvbnN0IFBvc2l0aW9uJiBwb3MpCiB7Ci0gICAgLy8gRklYTUU6IFRoaXMgYmVnaW5zIGF0IHBv
cy5kZXByZWNhdGVkTm9kZSgpLCB3aGljaCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGNvbnRhaW4gcG9z
IChzdXBwb3NlIHBvcyB3YXMgW2ltZywgMF0pLiAgU2VlIDxyZGFyOi8vcHJvYmxlbS81MDI3NzAy
Pi4KLSAgICBOb2RlKiByb290RWRpdGFibGVFbGVtZW50ID0gcG9zLmRlcHJlY2F0ZWROb2RlKCkt
PnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKKyAgICBOb2RlKiByb290RWRpdGFibGVFbGVtZW50ID0g
cG9zLmNvbnRhaW5lck5vZGUoKS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwogICAgIGZvciAoTm9k
ZSogbiA9IHBvcy5kZXByZWNhdGVkTm9kZSgpOyBuICYmIG4tPnJvb3RFZGl0YWJsZUVsZW1lbnQo
KSA9PSByb290RWRpdGFibGVFbGVtZW50OyBuID0gbi0+cGFyZW50Tm9kZSgpKQogICAgICAgICBp
ZiAoaXNTcGVjaWFsRWxlbWVudChuKSkgewogICAgICAgICAgICAgVmlzaWJsZVBvc2l0aW9uIHZQ
b3MgPSBWaXNpYmxlUG9zaXRpb24ocG9zLCBET1dOU1RSRUFNKTsKQEAgLTQxOCwxMiArNDE3LDEx
IEBAIHN0YXRpYyBOb2RlKiBmaXJzdEluU3BlY2lhbEVsZW1lbnQoY29uc3QKIAogc3RhdGljIE5v
ZGUqIGxhc3RJblNwZWNpYWxFbGVtZW50KGNvbnN0IFBvc2l0aW9uJiBwb3MpCiB7Ci0gICAgLy8g
RklYTUU6IFRoaXMgYmVnaW5zIGF0IHBvcy5kZXByZWNhdGVkTm9kZSgpLCB3aGljaCBkb2Vzbid0
IG5lY2Vzc2FyaWx5IGNvbnRhaW4gcG9zIChzdXBwb3NlIHBvcyB3YXMgW2ltZywgMF0pLiAgU2Vl
IDxyZGFyOi8vcHJvYmxlbS81MDI3NzAyPi4KLSAgICBOb2RlKiByb290RWRpdGFibGVFbGVtZW50
ID0gcG9zLmRlcHJlY2F0ZWROb2RlKCktPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKKyAgICBOb2Rl
KiByb290RWRpdGFibGVFbGVtZW50ID0gcG9zLmNvbnRhaW5lck5vZGUoKS0+cm9vdEVkaXRhYmxl
RWxlbWVudCgpOwogICAgIGZvciAoTm9kZSogbiA9IHBvcy5kZXByZWNhdGVkTm9kZSgpOyBuICYm
IG4tPnJvb3RFZGl0YWJsZUVsZW1lbnQoKSA9PSByb290RWRpdGFibGVFbGVtZW50OyBuID0gbi0+
cGFyZW50Tm9kZSgpKQogICAgICAgICBpZiAoaXNTcGVjaWFsRWxlbWVudChuKSkgewogICAgICAg
ICAgICAgVmlzaWJsZVBvc2l0aW9uIHZQb3MgPSBWaXNpYmxlUG9zaXRpb24ocG9zLCBET1dOU1RS
RUFNKTsKLSAgICAgICAgICAgIFZpc2libGVQb3NpdGlvbiBsYXN0SW5FbGVtZW50ID0gVmlzaWJs
ZVBvc2l0aW9uKFBvc2l0aW9uKG4sIG4tPmNoaWxkTm9kZUNvdW50KCksIFBvc2l0aW9uOjpQb3Np
dGlvbklzT2Zmc2V0SW5BbmNob3IpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAgIFZpc2libGVQ
b3NpdGlvbiBsYXN0SW5FbGVtZW50ID0gVmlzaWJsZVBvc2l0aW9uKGxhc3RQb3NpdGlvbkluT3JB
ZnRlck5vZGUobiksIERPV05TVFJFQU0pOwogICAgICAgICAgICAgaWYgKGlzVGFibGVFbGVtZW50
KG4pICYmIHZQb3MgPT0gbGFzdEluRWxlbWVudC5wcmV2aW91cygpKQogICAgICAgICAgICAgICAg
IHJldHVybiBuOwogICAgICAgICAgICAgaWYgKHZQb3MgPT0gbGFzdEluRWxlbWVudCkKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAkocmV2aXNpb24gODk5NDAp
CisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC00MzcsMTIgKzQzNywxMiBAQCBzdGF0aWMgVmlzaWJsZVBvc2l0aW9uIGVuZFBvc2l0
aW9uRm9yTGluCiAgICAgUG9zaXRpb24gcG9zOwogICAgIGlmIChlbmROb2RlLT5oYXNUYWdOYW1l
KGJyVGFnKSkgewogICAgICAgICBwb3MgPSBwb3NpdGlvbkJlZm9yZU5vZGUoZW5kTm9kZSk7Ci0g
ICAgfSBlbHNlIGlmIChlbmRCb3gtPmlzSW5saW5lVGV4dEJveCgpKSB7Ci0gICAgICAgIElubGlu
ZVRleHRCb3ggKmVuZFRleHRCb3ggPSBzdGF0aWNfY2FzdDxJbmxpbmVUZXh0Qm94ICo+KGVuZEJv
eCk7CisgICAgfSBlbHNlIGlmIChlbmRCb3gtPmlzSW5saW5lVGV4dEJveCgpICYmIGVuZE5vZGUt
PmlzVGV4dE5vZGUoKSkgeworICAgICAgICBJbmxpbmVUZXh0Qm94KiBlbmRUZXh0Qm94ID0gc3Rh
dGljX2Nhc3Q8SW5saW5lVGV4dEJveCAqPihlbmRCb3gpOwogICAgICAgICBpbnQgZW5kT2Zmc2V0
ID0gZW5kVGV4dEJveC0+c3RhcnQoKTsKICAgICAgICAgaWYgKCFlbmRUZXh0Qm94LT5pc0xpbmVC
cmVhaygpKQogICAgICAgICAgICAgZW5kT2Zmc2V0ICs9IGVuZFRleHRCb3gtPmxlbigpOwotICAg
ICAgICBwb3MgPSBQb3NpdGlvbihlbmROb2RlLCBlbmRPZmZzZXQsIFBvc2l0aW9uOjpQb3NpdGlv
bklzT2Zmc2V0SW5BbmNob3IpOworICAgICAgICBwb3MgPSBQb3NpdGlvbihzdGF0aWNfY2FzdDxU
ZXh0Kj4oZW5kTm9kZSksIGVuZE9mZnNldCk7CiAgICAgfSBlbHNlCiAgICAgICAgIHBvcyA9IHBv
c2l0aW9uQWZ0ZXJOb2RlKGVuZE5vZGUpOwogICAgIApAQCAtNzkzLDYgKzc5Myw3IEBAIFZpc2li
bGVQb3NpdGlvbiBzdGFydE9mUGFyYWdyYXBoKGNvbnN0IFYKICAgICAgICAgICAgIGJyZWFrOwog
CiAgICAgICAgIGlmIChyLT5pc1RleHQoKSAmJiByLT5jYXJldE1heFJlbmRlcmVkT2Zmc2V0KCkg
PiAwKSB7CisgICAgICAgICAgICBBU1NFUlQobi0+aXNUZXh0Tm9kZSgpKTsKICAgICAgICAgICAg
IHR5cGUgPSBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yOwogICAgICAgICAgICAg
aWYgKHN0eWxlLT5wcmVzZXJ2ZU5ld2xpbmUoKSkgewogICAgICAgICAgICAgICAgIGNvbnN0IFVD
aGFyKiBjaGFycyA9IHRvUmVuZGVyVGV4dChyKS0+Y2hhcmFjdGVycygpOwpAQCAtODAwLDkgKzgw
MSwxMCBAQCBWaXNpYmxlUG9zaXRpb24gc3RhcnRPZlBhcmFncmFwaChjb25zdCBWCiAgICAgICAg
ICAgICAgICAgaW50IG8gPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICAgaWYgKG4gPT0gc3RhcnRO
b2RlICYmIG8gPCBpKQogICAgICAgICAgICAgICAgICAgICBpID0gbWF4KDAsIG8pOwotICAgICAg
ICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkKKyAgICAgICAgICAgICAgICB3aGlsZSAoLS1pID49
IDApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNoYXJzW2ldID09ICdcbicpCi0gICAgICAg
ICAgICAgICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG4sIGkgKyAx
LCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldEluQW5jaG9yKSwgRE9XTlNUUkVBTSk7CisgICAg
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKHN0YXRp
Y19jYXN0PFRleHQqPihuKSwgaSArIDEpLCBET1dOU1RSRUFNKTsKKyAgICAgICAgICAgICAgICB9
CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlID0gbjsKICAgICAgICAgICAgIG9mZnNl
dCA9IDA7CkBAIC04MTUsOSArODE3LDExIEBAIFZpc2libGVQb3NpdGlvbiBzdGFydE9mUGFyYWdy
YXBoKGNvbnN0IFYKICAgICAgICAgICAgIG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZVBvc3RP
cmRlcihzdGFydEJsb2NrKTsKICAgICB9CiAKLSAgICBpZiAodHlwZSA9PSBQb3NpdGlvbjo6UG9z
aXRpb25Jc09mZnNldEluQW5jaG9yKQorICAgIGlmICh0eXBlID09IFBvc2l0aW9uOjpQb3NpdGlv
bklzT2Zmc2V0SW5BbmNob3IpIHsKKyAgICAgICAgQVNTRVJUKHR5cGUgIT0gUG9zaXRpb246OlBv
c2l0aW9uSXNPZmZzZXRJbkFuY2hvciB8fCAhb2Zmc2V0KTsKICAgICAgICAgcmV0dXJuIFZpc2li
bGVQb3NpdGlvbihQb3NpdGlvbihub2RlLCBvZmZzZXQsIHR5cGUpLCBET1dOU1RSRUFNKTsKLSAg
ICAKKyAgICB9CisKICAgICByZXR1cm4gVmlzaWJsZVBvc2l0aW9uKFBvc2l0aW9uKG5vZGUsIHR5
cGUpLCBET1dOU1RSRUFNKTsKIH0KIApAQCAtODY3LDE0ICs4NzEsMTYgQEAgVmlzaWJsZVBvc2l0
aW9uIGVuZE9mUGFyYWdyYXBoKGNvbnN0IFZpcwogCiAgICAgICAgIC8vIEZJWE1FOiBXZSBhdm9p
ZCByZXR1cm5pbmcgYSBwb3NpdGlvbiB3aGVyZSB0aGUgcmVuZGVyZXIgY2FuJ3QgYWNjZXB0IHRo
ZSBjYXJldC4KICAgICAgICAgaWYgKHItPmlzVGV4dCgpICYmIHItPmNhcmV0TWF4UmVuZGVyZWRP
ZmZzZXQoKSA+IDApIHsKKyAgICAgICAgICAgIEFTU0VSVChuLT5pc1RleHROb2RlKCkpOwogICAg
ICAgICAgICAgaW50IGxlbmd0aCA9IHRvUmVuZGVyVGV4dChyKS0+dGV4dExlbmd0aCgpOwogICAg
ICAgICAgICAgdHlwZSA9IFBvc2l0aW9uOjpQb3NpdGlvbklzT2Zmc2V0SW5BbmNob3I7CiAgICAg
ICAgICAgICBpZiAoc3R5bGUtPnByZXNlcnZlTmV3bGluZSgpKSB7CiAgICAgICAgICAgICAgICAg
Y29uc3QgVUNoYXIqIGNoYXJzID0gdG9SZW5kZXJUZXh0KHIpLT5jaGFyYWN0ZXJzKCk7CiAgICAg
ICAgICAgICAgICAgaW50IG8gPSBuID09IHN0YXJ0Tm9kZSA/IG9mZnNldCA6IDA7Ci0gICAgICAg
ICAgICAgICAgZm9yIChpbnQgaSA9IG87IGkgPCBsZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAg
ICBmb3IgKGludCBpID0gbzsgaSA8IGxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAg
IGlmIChjaGFyc1tpXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZp
c2libGVQb3NpdGlvbihQb3NpdGlvbihuLCBpLCBQb3NpdGlvbjo6UG9zaXRpb25Jc09mZnNldElu
QW5jaG9yKSwgRE9XTlNUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmlz
aWJsZVBvc2l0aW9uKFBvc2l0aW9uKHN0YXRpY19jYXN0PFRleHQqPihuKSwgaSksIERPV05TVFJF
QU0pOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGUg
PSBuOwogICAgICAgICAgICAgb2Zmc2V0ID0gci0+Y2FyZXRNYXhPZmZzZXQoKTsK
</data>
<flag name="review"
          id="93325"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>