<?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>73668</bug_id>
          
          <creation_ts>2011-12-02 09:03:07 -0800</creation_ts>
          <short_desc>Upstream BlackBerry API backing store files</short_desc>
          <delta_ts>2011-12-09 18:46:35 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit API</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>73144</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Jacky Jiang">jkjiang</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dbates</cc>
    
    <cc>levin+threading</cc>
    
    <cc>manyoso</cc>
    
    <cc>rwlbuis</cc>
    
    <cc>staikos</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zimmermann</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>513815</commentid>
    <comment_count>0</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-02 09:03:07 -0800</bug_when>
    <thetext>Upstream BlackBerry API backing store implementation files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>513895</commentid>
    <comment_count>1</comment_count>
      <attachid>117648</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-02 10:21:14 -0800</bug_when>
    <thetext>Created attachment 117648
The patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>514854</commentid>
    <comment_count>2</comment_count>
      <attachid>117648</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2011-12-04 20:30:02 -0800</bug_when>
    <thetext>Comment on attachment 117648
The patch

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

Patch looks good, as I know the code, but we have too many minor issues, that another round is needed.

Jacky, please fix all comment styles (including the ones I did not highlight).

&gt; Source/WebKit/ChangeLog:156
&gt; +        (BlackBerry::WebKit::divisors):
&gt; +        (BlackBerry::WebKit::bestDivisor):
&gt; +        (BlackBerry::WebKit::BackingStoreMutexLocker::BackingStoreMutexLocker):
&gt; +        (BlackBerry::WebKit::BackingStoreMutexLocker::~BackingStoreMutexLocker):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::backingStoreRect):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::backingStoreSize):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::BackingStorePrivate):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::~BackingStorePrivate):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldDirectRenderingToWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::suspendScreenAndBackingStoreUpdates):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::resumeScreenAndBackingStoreUpdates):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::repaint):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::slowScroll):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::scroll):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::scrollingStartedHelper):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldSuppressNonVisibleRegularRenderJobs):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldPerformRenderJobs):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldPerformRegularRenderJobs):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::startRenderTimer):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::stopRenderTimer):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderOnTimer):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderOnIdle):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::willFireTimer):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::expandedContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::visibleContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::unclippedVisibleContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldMoveLeft):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldMoveRight):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldMoveUp):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::shouldMoveDown):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveX):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveY):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveLeft):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveRight):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveUp):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::canMoveDown):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::backingStoreRectForScroll):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::setBackingStoreRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::indexesForBackingStoreRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::originOfLastRenderForTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::indexOfLastRenderForTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::indexOfTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::clearAndUpdateTileOfNotRenderedRegion):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::isCurrentVisibleJob):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::scrollBackingStore):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::render):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderDirectToWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::requestLayoutIfNeeded):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderVisibleContents):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderBackingStore):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitVisibleContents):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::copyPreviousContentsToBackSurfaceOfWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::copyPreviousContentsToBackSurfaceOfTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::paintDefaultBackground):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitContents):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitTileRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blendCompositingSurface):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::clearCompositingSurface):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitHorizontalScrollbar):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitVerticalScrollbar):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::isTileVisible):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::visibleTilesRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileVisibleContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileUnclippedVisibleContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileContentsRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::resetRenderQueue):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::clearVisibleZoom):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::resetTiles):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::updateTiles):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::updateTilesForScrollOrNotRenderedRegion):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::resetTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::updateTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::mapFromTilesToTransformedContents):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::mapFromTransformedContentsToAbsoluteTileBoundaries):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::mapFromTransformedContentsToTiles):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::updateTileMatrixIfNeeded):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::contentsSizeChanged):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::scrollChanged):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::transformChanged):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::orientationChanged):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::actualVisibleSizeChanged):
&gt; +        (BlackBerry::WebKit::createVisibleTileBufferForWebPage):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::createSurfaces):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::createVisibleTileBuffer):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::originOfTile):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::minimumNumberOfTilesWide):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::minimumNumberOfTilesHigh):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::expandedContentsSize):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileWidth):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileHeight):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileSize):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::tileRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::renderContents):
&gt; +        (BlackBerry::WebKit::drawDebugRect):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::blitToWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::checkerWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::invalidateWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::clearWindow):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::isScrollingOrZooming):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::setScrollingOrZooming):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::lockBackingStore):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::unlockBackingStore):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::frontState):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::backState):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::swapState):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::windowFrontBufferState):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::windowBackBufferState):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::drawSubLayers):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::isActive):
&gt; +        (BlackBerry::WebKit::BackingStore::BackingStore):
&gt; +        (BlackBerry::WebKit::BackingStore::~BackingStore):
&gt; +        (BlackBerry::WebKit::BackingStore::createSurface):
&gt; +        (BlackBerry::WebKit::BackingStore::suspendScreenAndBackingStoreUpdates):
&gt; +        (BlackBerry::WebKit::BackingStore::resumeScreenAndBackingStoreUpdates):
&gt; +        (BlackBerry::WebKit::BackingStore::isScrollingOrZooming):
&gt; +        (BlackBerry::WebKit::BackingStore::setScrollingOrZooming):
&gt; +        (BlackBerry::WebKit::BackingStore::blitContents):
&gt; +        (BlackBerry::WebKit::BackingStore::repaint):
&gt; +        (BlackBerry::WebKit::BackingStore::hasRenderJobs):
&gt; +        (BlackBerry::WebKit::BackingStore::renderOnIdle):
&gt; +        (BlackBerry::WebKit::BackingStore::isDirectRenderingToWindow):
&gt; +        (BlackBerry::WebKit::BackingStore::defersBlit):
&gt; +        (BlackBerry::WebKit::BackingStore::setDefersBlit):
&gt; +        (BlackBerry::WebKit::BackingStore::hasBlitJobs):
&gt; +        (BlackBerry::WebKit::BackingStore::blitOnIdle):
&gt; +        * blackberry/Api/BackingStore.h: Added.
&gt; +        * blackberry/Api/BackingStore_p.h: Added.
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::BackingStoreGeometry):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::numberOfTilesWide):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::setNumberOfTilesWide):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::numberOfTilesHigh):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::setNumberOfTilesHigh):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::backingStoreOffset):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::setBackingStoreOffset):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::tileAt):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::tileMap):
&gt; +        (BlackBerry::WebKit::BackingStoreGeometry::setTileMap):
&gt; +        (BlackBerry::WebKit::BackingStoreWindowBufferState::blittedRegion):
&gt; +        (BlackBerry::WebKit::BackingStoreWindowBufferState::addBlittedRegion):
&gt; +        (BlackBerry::WebKit::BackingStoreWindowBufferState::clearBlittedRegion):
&gt; +        (BlackBerry::WebKit::BackingStoreWindowBufferState::isRendered):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::setCurrentBackingStoreOwner):
&gt; +        (BlackBerry::WebKit::BackingStorePrivate::currentBackingStoreOwner):

This whole block can be omitted since it is a new file.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:302
&gt; +    /*
&gt; +     * If immediate is true, then we&apos;re being asked to perform synchronously
&gt; +     *
&gt; +     * NOTE: WebCore::ScrollView will call this method with immediate:true and contentChanged:false.
&gt; +     * This is a special case introduced specifically for the Apple&apos;s windows port and can be safely ignored I believe.
&gt; +     *
&gt; +     * Now this method will be called from WebPagePrivate::repaint()
&gt; +     */

Lets use &quot;//&quot; comments.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:308
&gt; +        rect.inflate(1 /*dx*/, 1 /*dy*/); // account for anti-aliasing of previous rendering runs

comments start with capital letter, and dot at the end.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:483
&gt; +    // so it can determine if it is under pressure

missing &quot;.&quot; at the end.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:660
&gt; +    // Record the current backingstore rect

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:686
&gt; +    TileMap tiles; // our new tile map

instead of a comment like this, we should have a better variable name

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:687
&gt; +    TileMap leftOverTiles; // tiles that are left over

unneeded comment, given the variable name

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:690
&gt; +    // Iterate through our current tile map and add tiles that are rendered with
&gt; +    // our new backingstore rect

missing &quot;.&quot;  in the end.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:696
&gt; +        // Reset the old index

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:699
&gt; +        // Origin of last committed render for tile in transformed content coordinates

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:703
&gt; +        // If the new backing store rect contains this origin, then insert the tile there
&gt; +        // and mark it as no longer shifted. Note: Platform::IntRect::contains checks for a 1x1 rect

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:717
&gt; +                // Intersect the tile with the not rendered region to get the areas
&gt; +                // of the tile that we need to clear

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:746
&gt; +    ASSERT((int)indexesToFill.size() == leftOverTiles.size());

c-cast is to be avoided.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:759
&gt; +        // Origin of last committed render for tile in transformed content coordinates

period

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:778
&gt; +    // Checks to make sure we haven&apos;t lost any tiles

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:781
&gt; +    // Actually set state

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:787
&gt; +    // Swap the front/back state

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:835
&gt; +    // Intersect the tile with the not rendered region to get the areas
&gt; +    // of the tile that we need to clear

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:847
&gt; +        // Find the origin of this tile

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:850
&gt; +        // Map to tile coordinates

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1073
&gt; +        // FIXME: modify render to take a Vector&lt;IntRect&gt; parameter so we&apos;re not recreating
&gt; +        // GraphicsContext on the stack each time

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1076
&gt; +        // Add the newly rendered region to the tile so it can keep track for blits

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1088
&gt; +        // We will need a swap here because of the shared back buffer

ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1098
&gt; +    // Clip to the visible content including overscroll

ditto

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2431
&gt; +#if ENABLE_SCROLLBARS

Is ENABLE_SCROLLBARS really needed?

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2626
&gt; +    d-&gt;blitVisibleContents(true /* force */);

/*force*/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515062</commentid>
    <comment_count>3</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-05 07:18:34 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 117648 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=117648&amp;action=review
&gt; 
&gt; Patch looks good, as I know the code, but we have too many minor issues, that another round is needed.
&gt; 
&gt; Jacky, please fix all comment styles (including the ones I did not highlight).
&gt; 
Will do, thanks for your review Antonio!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515227</commentid>
    <comment_count>4</comment_count>
      <attachid>117904</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-05 11:12:41 -0800</bug_when>
    <thetext>Created attachment 117904
Updated patch

Updated the patch according to Antonio&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515277</commentid>
    <comment_count>5</comment_count>
      <attachid>117912</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-05 12:20:48 -0800</bug_when>
    <thetext>Created attachment 117912
Updated patch

Updated more style fixes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515382</commentid>
    <comment_count>6</comment_count>
      <attachid>117912</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-05 14:11:25 -0800</bug_when>
    <thetext>Comment on attachment 117912
Updated patch

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

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:27
&gt; +#include &quot;FloatRect.h&quot;

This include is unnecessary as GraphicsContext.h (below) includes this file.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:33
&gt; +#include &quot;PlatformString.h&quot;

This file is unnecessary as Page.h (above) includes this file.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:77
&gt; +// Compute divisor pairs.

This comment is inane. I suggest we remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:80
&gt; +// TODO: cache this and/or use a smarter algorithm.

Nit: TODO =&gt; FIXME

cache =&gt; Cache

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:84
&gt; +    for (unsigned int i = 1; i &lt;= n; ++i)

unsigned int =&gt; unsigned

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:153
&gt; +struct BackingStoreMutexLocker {

Nit: I would the keyword &quot;struct&quot; to &quot;class&quot; since we have private instance data here and then explicitly add a &quot;public:&quot; keyword.

Also, this class should be non copyable since it doesn&apos;t make sense to copy this RAII object. Using WTF_MAKE_NONCOPYABLE() defined in &lt;http://trac.webkit.org/browser/trunk/Source/JavaScriptCore/wtf/Noncopyable.h?rev=76248#L29&gt;, I would write this class to have the form:

class BackingStoreMutexLocker {
    WTF_MAKE_NONCOPYABLE(BackingStoreMutexLocker);
public:
    ...
private:
    ...
};

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:218
&gt; +    delete m_renderQueue;
&gt; +    m_renderQueue = 0;
&gt; +    delete m_renderTimer;
&gt; +    m_renderTimer = 0;

We should make both m_renderQueue and m_renderTimer OwnPtrs. Then we don&apos;t need to explicitly delete them here.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:335
&gt; +        render(rect, false /*renderContentOnly*/);

We should make render() take an enum value for its second argument instead of a boolean so that we can remove the inline comment. We can do this in a separate patch.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:656
&gt; +    // Record the current backingstore rect.

This comment is inane. Please remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:677
&gt; +    // The list of indexes we need to fill.

Ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:686
&gt; +    // our new backingstore rect.

Nit: backingstore =&gt; backing store

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:748
&gt; +        if (!(i &lt; indexesToFill.size())) {

Nit: Negating an expression or sub-expression tends to be more difficult to reason about than reading the same expression with the negation pushed through. I suggest pushing the negation through and hence write the if-statement expression as: &quot;i &gt;= indexesToFill.size()&quot; .

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:757
&gt; +        // Origin of the new index for the new backingstore rect.

Nit: backingstore =&gt; backing store

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:761
&gt; +        updateTile(originOfNew, false /*immediate*/);

Nit: We should make the second argument of updateTile() be an enum so that we don&apos;t need an inline comment. We can do this in a follow-up patch.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:763
&gt; +        // Do some bookkeeping with shifting tiles...

This comment is inane. Please remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:777
&gt; +    // Actually set state.

This comment is inane. Please remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:783
&gt; +    // Swap the front/back state.

Ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:868
&gt; +        // Find the origin of this tile.

This comment is inane. Please remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:874
&gt; +        // Check if it is current.

Ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:915
&gt; +    // Set the state.

Ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:940
&gt; +    // Request a layout now which might change the contents rect.

Ditto.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:957
&gt; +    renderContents(0 /*not needed since we&apos;re direct rendering to window*/,
&gt; +                   origin, dirtyRect);

I would write this on one line. Also, I would move the inline comment so that it&apos;s above this line and update it so that it reads:

&quot;We don&apos;t need a buffer since we&apos;re direct rendering to window.&quot;

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:980
&gt; +    // Request a layout now which might change the contents rect.

This comment is inane. Please remove it.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1206
&gt; +        clearWindow(overScrollRect,
&gt; +                    color.red(), color.green(), color.blue(), color.alpha());

Nit: I would write this on one line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>515892</commentid>
    <comment_count>7</comment_count>
      <attachid>118047</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-06 07:17:53 -0800</bug_when>
    <thetext>Created attachment 118047
Updated patch

Updated the patch according to Dan&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>517740</commentid>
    <comment_count>8</comment_count>
      <attachid>118047</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-08 13:32:58 -0800</bug_when>
    <thetext>Comment on attachment 118047
Updated patch

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

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2437
&gt; +#if OS(QNX)

Remove this if-define as it&apos;s unnecessary.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2438
&gt; +    // Store temps.

Remove this comment as it&apos;s inane.

&gt; Source/WebKit/blackberry/Api/BackingStore.h:23
&gt; +

Remove this empty line as it doesn&apos;t improve the readability of this file.

&gt; Source/WebKit/blackberry/Api/BackingStore.h:25
&gt; +#include &lt;BlackBerryPlatformGraphics.h&gt;
&gt; +#include &lt;BlackBerryPlatformPrimitives.h&gt;

As far as I can tell we neither of these includes are necessary. Instead, we should just forward declare BlackBerry::Platform::IntRect.

&gt; Source/WebKit/blackberry/Api/BackingStore_p.h:27
&gt; +

Remove this empty line as it doesn&apos;t improve the readability of this file.

&gt; Source/WebKit/blackberry/Api/BackingStore_p.h:354
&gt; +}

Please add an inline comment on this line: // namespace WebKit

&gt; Source/WebKit/blackberry/Api/BackingStore_p.h:355
&gt; +}

Please add an inline comment on this line: // namespace BlackBerry</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518369</commentid>
    <comment_count>9</comment_count>
      <attachid>118601</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-09 11:47:49 -0800</bug_when>
    <thetext>Created attachment 118601
Updated patch

Updated the patch according to Dan&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518476</commentid>
    <comment_count>10</comment_count>
      <attachid>118601</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-09 13:52:37 -0800</bug_when>
    <thetext>Comment on attachment 118601
Updated patch

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

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:1957
&gt; +void BackingStorePrivate::actualVisibleSizeChanged(const Platform::IntSize&amp; size)

We should ultimately remove this method since it has an empty implementation. We can do this in a follow up bug.

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2054
&gt; +    static int tw = 0;

I would write lines 2054-2056 as:

static int tileWidth = BlackBerry::Platform::Graphics::Screen::landscapeWidth();

&gt; Source/WebKit/blackberry/Api/BackingStore.cpp:2062
&gt; +    static int th = 0;

I would use a similar approach here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518656</commentid>
    <comment_count>11</comment_count>
      <attachid>118667</attachid>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-09 17:08:22 -0800</bug_when>
    <thetext>Created attachment 118667
Updated patch

Updated the tileWidth() and tileHeight().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518675</commentid>
    <comment_count>12</comment_count>
      <attachid>118667</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2011-12-09 17:29:59 -0800</bug_when>
    <thetext>Comment on attachment 118667
Updated patch

Thanks Jacky for the updated patch. We should look to further clean up this file and break it into smaller chunks in a follow up patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518690</commentid>
    <comment_count>13</comment_count>
    <who name="Jacky Jiang">jkjiang</who>
    <bug_when>2011-12-09 17:44:35 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (From update of attachment 118667 [details])
&gt; Thanks Jacky for the updated patch. We should look to further clean up this file and break it into smaller chunks in a follow up patch.
OK, thanks for your review Dan!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518732</commentid>
    <comment_count>14</comment_count>
      <attachid>118667</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-09 18:46:29 -0800</bug_when>
    <thetext>Comment on attachment 118667
Updated patch

Clearing flags on attachment: 118667

Committed r102514: &lt;http://trac.webkit.org/changeset/102514&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>518733</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-12-09 18:46:35 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117648</attachid>
            <date>2011-12-02 10:21:14 -0800</date>
            <delta_ts>2011-12-05 11:12:41 -0800</delta_ts>
            <desc>The patch</desc>
            <filename>73668.patch</filename>
            <type>text/plain</type>
            <size>146886</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSA5ZmIzNWU5ZjQyZDFlZjdkMjhkZDVjZTg3MzEzYzg2N2QzMWU0MTVkIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
RnJpLCAyIERlYyAyMDExIDEyOjI3OjM5IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCihCbGFja0JlcnJ5OjpXZWJL
aXQ6OmRpdmlzb3JzKToKKEJsYWNrQmVycnk6OldlYktpdDo6YmVzdERpdmlzb3IpOgooQmxhY2tC
ZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVNdXRleExvY2tlcjo6QmFja2luZ1N0b3JlTXV0ZXhM
b2NrZXIpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVNdXRleExvY2tlcjo6fkJh
Y2tpbmdTdG9yZU11dGV4TG9ja2VyKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3Jl
R2VvbWV0cnk6OmJhY2tpbmdTdG9yZVJlY3QpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5n
U3RvcmVHZW9tZXRyeTo6YmFja2luZ1N0b3JlU2l6ZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OkJhY2tpbmdTdG9yZVByaXZhdGUpOgooQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp+QmFja2luZ1N0b3JlUHJpdmF0ZSk6CihCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c3VzcGVu
ZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmVQcml2YXRlOjpyZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKToKKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVwYWludCk6CihCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNsb3dTY3JvbGwpOgooQmxhY2tCZXJy
eTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGwpOgooQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGxpbmdTdGFydGVkSGVscGVyKToKKEJsYWNr
QmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkU3VwcHJlc3NOb25WaXNp
YmxlUmVndWxhclJlbmRlckpvYnMpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQ
cml2YXRlOjpzaG91bGRQZXJmb3JtUmVuZGVySm9icyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icyk6CihCbGFj
a0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnN0YXJ0UmVuZGVyVGltZXIpOgoo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzdG9wUmVuZGVyVGltZXIp
OgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJPblRpbWVy
KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25JZGxl
KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6d2lsbEZpcmVUaW1l
cik6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmV4cGFuZGVkQ29u
dGVudHNSZWN0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dmlz
aWJsZUNvbnRlbnRzUmVjdCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZh
dGU6OnVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpC
YWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlTGVmdCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVSaWdodCk6CihCbGFja0JlcnJ5OjpXZWJL
aXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVVcCk6CihCbGFja0JlcnJ5OjpXZWJL
aXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVEb3duKToKKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVgpOgooQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjYW5Nb3ZlWSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVMZWZ0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVJpZ2h0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVVwKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZURvd24pOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5n
U3RvcmVQcml2YXRlOjpiYWNraW5nU3RvcmVSZWN0Rm9yU2Nyb2xsKToKKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2luZ1N0b3JlUmVjdCk6CihCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4ZXNGb3JCYWNraW5nU3RvcmVS
ZWN0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZ2luT2ZM
YXN0UmVuZGVyRm9yVGlsZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZh
dGU6OmluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6OmluZGV4T2ZUaWxlKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y2xlYXJBbmRVcGRhdGVUaWxlT2ZOb3RSZW5kZXJlZFJlZ2lvbik6CihC
bGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmlzQ3VycmVudFZpc2libGVK
b2IpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGxCYWNr
aW5nU3RvcmUpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5k
ZXIpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJEaXJl
Y3RUb1dpbmRvdyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
cXVlc3RMYXlvdXRJZk5lZWRlZCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVBy
aXZhdGU6OnJlbmRlclZpc2libGVDb250ZW50cyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6OnJlbmRlckJhY2tpbmdTdG9yZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMpOgooQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1
cmZhY2VPZldpbmRvdyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6
OmNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNrU3VyZmFjZU9mVGlsZSk6CihCbGFja0JlcnJ5OjpX
ZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnBhaW50RGVmYXVsdEJhY2tncm91bmQpOgooQmxh
Y2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMpOgooQmxh
Y2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VGlsZVJlY3QpOgooQmxh
Y2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpibGVuZENvbXBvc2l0aW5nU3Vy
ZmFjZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQ29t
cG9zaXRpbmdTdXJmYWNlKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0
ZTo6YmxpdEhvcml6b250YWxTY3JvbGxiYXIpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5n
U3RvcmVQcml2YXRlOjpibGl0VmVydGljYWxTY3JvbGxiYXIpOgooQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjppc1RpbGVWaXNpYmxlKToKKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dmlzaWJsZVRpbGVzUmVjdCk6CihCbGFja0JlcnJ5OjpX
ZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVWaXNpYmxlQ29udGVudHNSZWN0KToKKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVVuY2xpcHBlZFZpc2li
bGVDb250ZW50c1JlY3QpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRl
Ojp0aWxlQ29udGVudHNSZWN0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJp
dmF0ZTo6cmVzZXRSZW5kZXJRdWV1ZSk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZVByaXZhdGU6OmNsZWFyVmlzaWJsZVpvb20pOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5n
U3RvcmVQcml2YXRlOjpyZXNldFRpbGVzKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0
b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZXMpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjp1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24pOgooQmxh
Y2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZXNldFRpbGUpOgooQmxhY2tC
ZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlKToKKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1l
ZENvbnRlbnRzKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb0Fic29sdXRlVGlsZUJvdW5kYXJpZXMpOgooQmxhY2tC
ZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250
ZW50c1RvVGlsZXMpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp1
cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjpjb250ZW50c1NpemVDaGFuZ2VkKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQ2hhbmdlZCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OnRyYW5zZm9ybUNoYW5nZWQpOgooQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjpvcmllbnRhdGlvbkNoYW5nZWQpOgooQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjphY3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQpOgoo
QmxhY2tCZXJyeTo6V2ViS2l0OjpjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlckZvcldlYlBhZ2UpOgoo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjcmVhdGVTdXJmYWNlcyk6
CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNyZWF0ZVZpc2libGVU
aWxlQnVmZmVyKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6b3Jp
Z2luT2ZUaWxlKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6bWlu
aW11bU51bWJlck9mVGlsZXNXaWRlKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3Jl
UHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNIaWdoKToKKEJsYWNrQmVycnk6OldlYktpdDo6
QmFja2luZ1N0b3JlUHJpdmF0ZTo6ZXhwYW5kZWRDb250ZW50c1NpemUpOgooQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlV2lkdGgpOgooQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlSGVpZ2h0KToKKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVNpemUpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpC
YWNraW5nU3RvcmVQcml2YXRlOjp0aWxlUmVjdCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6OnJlbmRlckNvbnRlbnRzKToKKEJsYWNrQmVycnk6OldlYktpdDo6ZHJh
d0RlYnVnUmVjdCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmJs
aXRUb1dpbmRvdyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNo
ZWNrZXJXaW5kb3cpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpp
bnZhbGlkYXRlV2luZG93KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0
ZTo6Y2xlYXJXaW5kb3cpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRl
Ojppc1Njcm9sbGluZ09yWm9vbWluZyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZVByaXZhdGU6OnNldFNjcm9sbGluZ09yWm9vbWluZyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OmxvY2tCYWNraW5nU3RvcmUpOgooQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjp1bmxvY2tCYWNraW5nU3RvcmUpOgooQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpmcm9udFN0YXRlKToKKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja1N0YXRlKToKKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c3dhcFN0YXRlKToKKEJsYWNrQmVycnk6OldlYktpdDo6
QmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93RnJvbnRCdWZmZXJTdGF0ZSk6CihCbGFja0JlcnJ5
OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OndpbmRvd0JhY2tCdWZmZXJTdGF0ZSk6CihC
bGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmRyYXdTdWJMYXllcnMpOgoo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjppc0FjdGl2ZSk6CihCbGFj
a0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6QmFja2luZ1N0b3JlKToKKEJsYWNrQmVycnk6
OldlYktpdDo6QmFja2luZ1N0b3JlOjp+QmFja2luZ1N0b3JlKToKKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlOjpjcmVhdGVTdXJmYWNlKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlOjpzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyk6CihCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBk
YXRlcyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6aXNTY3JvbGxpbmdPclpv
b21pbmcpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmU6OnNldFNjcm9sbGluZ09y
Wm9vbWluZyk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6YmxpdENvbnRlbnRz
KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlOjpyZXBhaW50KToKKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlOjpoYXNSZW5kZXJKb2JzKToKKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlOjpyZW5kZXJPbklkbGUpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpC
YWNraW5nU3RvcmU6OmlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3cpOgooQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmU6OmRlZmVyc0JsaXQpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmU6OnNldERlZmVyc0JsaXQpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmU6Omhhc0JsaXRKb2JzKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlOjpibGl0
T25JZGxlKToKKiBibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaDogQWRkZWQuCiogYmxhY2ti
ZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaDogQWRkZWQuCihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZUdlb21ldHJ5OjpCYWNraW5nU3RvcmVHZW9tZXRyeSk6CihCbGFja0JlcnJ5OjpX
ZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpudW1iZXJPZlRpbGVzV2lkZSk6CihCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpzZXROdW1iZXJPZlRpbGVzV2lkZSk6
CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpudW1iZXJPZlRpbGVz
SGlnaCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpzZXROdW1i
ZXJPZlRpbGVzSGlnaCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5
OjpiYWNraW5nU3RvcmVPZmZzZXQpOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVH
ZW9tZXRyeTo6c2V0QmFja2luZ1N0b3JlT2Zmc2V0KToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlR2VvbWV0cnk6OnRpbGVBdCk6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdT
dG9yZUdlb21ldHJ5Ojp0aWxlTWFwKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3Jl
R2VvbWV0cnk6OnNldFRpbGVNYXApOgooQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVX
aW5kb3dCdWZmZXJTdGF0ZTo6YmxpdHRlZFJlZ2lvbik6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlOjphZGRCbGl0dGVkUmVnaW9uKToKKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGU6OmNsZWFyQmxpdHRlZFJl
Z2lvbik6CihCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRl
Ojppc1JlbmRlcmVkKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6
c2V0Q3VycmVudEJhY2tpbmdTdG9yZU93bmVyKToKKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y3VycmVudEJhY2tpbmdTdG9yZU93bmVyKToKLS0tCiBTb3VyY2UvV2Vi
S2l0L0NoYW5nZUxvZyAgICAgICAgICAgICAgICAgICAgICAgfCAgMTU3ICsrCiBTb3VyY2UvV2Vi
S2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAgfCAyNjMwICsrKysrKysrKysrKysr
KysrKysrKysrKysKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmgg
ICB8ICAgODUgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5o
IHwgIDM1NyArKysrCiA0IGZpbGVzIGNoYW5nZWQsIDMyMjkgaW5zZXJ0aW9ucygrKSwgMCBkZWxl
dGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBp
L0JhY2tpbmdTdG9yZS5jcHAKIGNyZWF0ZSBtb2RlIDEwMDY0NCBTb3VyY2UvV2ViS2l0L2JsYWNr
YmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNlL1dlYktp
dC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oCgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwppbmRleCAyMTE3MzVlLi5m
M2FhMTYyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2Uv
V2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2MCBAQAorMjAxMS0xMi0wMiAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVwc3RyZWFtIEJsYWNrQmVycnkgQVBJ
IGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVhbSwgdGhlIG1haW4gY29udHJpYnV0
b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJpbS5jb20+LgorCisgICAgICAgIElu
aXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAgICAgICAqIGJsYWNrYmVycnkvQXBp
L0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0Ojpk
aXZpc29ycyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OmJlc3REaXZpc29yKToKKyAg
ICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlTXV0ZXhMb2NrZXI6OkJhY2tp
bmdTdG9yZU11dGV4TG9ja2VyKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlTXV0ZXhMb2NrZXI6On5CYWNraW5nU3RvcmVNdXRleExvY2tlcik6CisgICAgICAgIChC
bGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNraW5nU3RvcmVSZWN0
KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlR2VvbWV0cnk6OmJh
Y2tpbmdTdG9yZVNpemUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjpCYWNraW5nU3RvcmVQcml2YXRlKToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6fkJhY2tpbmdTdG9yZVByaXZhdGUpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGREaXJlY3RS
ZW5kZXJpbmdUb1dpbmRvdyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdT
dG9yZVByaXZhdGU6OnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKToKKyAgICAg
ICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzdW1lU2NyZWVu
QW5kQmFja2luZ1N0b3JlVXBkYXRlcyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OnJlcGFpbnQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzbG93U2Nyb2xsKToKKyAgICAgICAgKEJsYWNrQmVycnk6
OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsKToKKyAgICAgICAgKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsaW5nU3RhcnRlZEhlbHBlcik6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3Vs
ZFN1cHByZXNzTm9uVmlzaWJsZVJlZ3VsYXJSZW5kZXJKb2JzKToKKyAgICAgICAgKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMp
OgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91
bGRQZXJmb3JtUmVndWxhclJlbmRlckpvYnMpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzdGFydFJlbmRlclRpbWVyKToKKyAgICAgICAgKEJsYWNr
QmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyKToKKyAg
ICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25U
aW1lcik6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6
OnJlbmRlck9uSWRsZSk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZVByaXZhdGU6OndpbGxGaXJlVGltZXIpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpC
YWNraW5nU3RvcmVQcml2YXRlOjpleHBhbmRlZENvbnRlbnRzUmVjdCk6CisgICAgICAgIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnZpc2libGVDb250ZW50c1JlY3Qp
OgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp1bmNs
aXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6
QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZUxlZnQpOgorICAgICAgICAoQmxhY2tCZXJy
eTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlUmlnaHQpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlVXAp
OgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91
bGRNb3ZlRG93bik6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVBy
aXZhdGU6OmNhbk1vdmVYKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y2FuTW92ZVkpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmVQcml2YXRlOjpjYW5Nb3ZlTGVmdCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJL
aXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVSaWdodCk6CisgICAgICAgIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVVcCk6CisgICAgICAgIChC
bGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVEb3duKToKKyAg
ICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja2luZ1N0
b3JlUmVjdEZvclNjcm9sbCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdT
dG9yZVByaXZhdGU6OnNldEJhY2tpbmdTdG9yZVJlY3QpOgorICAgICAgICAoQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjppbmRleGVzRm9yQmFja2luZ1N0b3JlUmVjdCk6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6Om9yaWdp
bk9mTGFzdFJlbmRlckZvclRpbGUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmVQcml2YXRlOjppbmRleE9mTGFzdFJlbmRlckZvclRpbGUpOgorICAgICAgICAoQmxh
Y2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjppbmRleE9mVGlsZSk6CisgICAg
ICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQW5kVXBk
YXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24pOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0
OjpCYWNraW5nU3RvcmVQcml2YXRlOjppc0N1cnJlbnRWaXNpYmxlSm9iKToKKyAgICAgICAgKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQmFja2luZ1N0b3Jl
KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVu
ZGVyKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6
cmVuZGVyRGlyZWN0VG9XaW5kb3cpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmVQcml2YXRlOjpyZXF1ZXN0TGF5b3V0SWZOZWVkZWQpOgorICAgICAgICAoQmxhY2tC
ZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJWaXNpYmxlQ29udGVudHMp
OgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5k
ZXJCYWNraW5nU3RvcmUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJm
YWNlT2ZXaW5kb3cpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQ
cml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZlRpbGUpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpwYWludERlZmF1bHRC
YWNrZ3JvdW5kKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJp
dmF0ZTo6YmxpdENvbnRlbnRzKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6YmxpdFRpbGVSZWN0KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZhY2UpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhckNvbXBvc2l0
aW5nU3VyZmFjZSk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVBy
aXZhdGU6OmJsaXRIb3Jpem9udGFsU2Nyb2xsYmFyKToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdFZlcnRpY2FsU2Nyb2xsYmFyKToKKyAgICAg
ICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNUaWxlVmlzaWJs
ZSk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnZp
c2libGVUaWxlc1JlY3QpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjp0aWxlVmlzaWJsZUNvbnRlbnRzUmVjdCk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVVbmNsaXBwZWRWaXNpYmxlQ29udGVu
dHNSZWN0KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0
ZTo6dGlsZUNvbnRlbnRzUmVjdCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6OnJlc2V0UmVuZGVyUXVldWUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhclZpc2libGVab29tKToKKyAgICAgICAg
KEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlcyk6Cisg
ICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRp
bGVzKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6
dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVnaW9uKToKKyAgICAgICAgKEJsYWNr
QmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlKToKKyAgICAgICAg
KEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZSk6Cisg
ICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21U
aWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9BYnNvbHV0
ZVRpbGVCb3VuZGFyaWVzKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0
b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKToKKyAgICAgICAg
KEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZU1hdHJp
eElmTmVlZGVkKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJp
dmF0ZTo6Y29udGVudHNTaXplQ2hhbmdlZCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbENoYW5nZWQpOgorICAgICAgICAoQmxhY2tCZXJy
eTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjp0cmFuc2Zvcm1DaGFuZ2VkKToKKyAgICAg
ICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZW50YXRpb25D
aGFuZ2VkKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0
ZTo6YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktp
dDo6Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKToKKyAgICAgICAgKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3JlYXRlU3VyZmFjZXMpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjcmVhdGVWaXNpYmxl
VGlsZUJ1ZmZlcik6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVBy
aXZhdGU6Om9yaWdpbk9mVGlsZSk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6Om1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSk6CisgICAgICAgIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6Om1pbmltdW1OdW1iZXJPZlRpbGVz
SGlnaCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6
OmV4cGFuZGVkQ29udGVudHNTaXplKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVdpZHRoKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVTaXplKToKKyAgICAgICAgKEJsYWNr
QmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVJlY3QpOgorICAgICAgICAo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJDb250ZW50cyk6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OmRyYXdEZWJ1Z1JlY3QpOgorICAgICAgICAo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VG9XaW5kb3cpOgor
ICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpjaGVja2Vy
V2luZG93KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0
ZTo6aW52YWxpZGF0ZVdpbmRvdyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tp
bmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNTY3JvbGxpbmdPclpvb21pbmcpOgorICAgICAgICAo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRTY3JvbGxpbmdPclpv
b21pbmcpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRl
Ojpsb2NrQmFja2luZ1N0b3JlKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dW5sb2NrQmFja2luZ1N0b3JlKToKKyAgICAgICAgKEJsYWNrQmVycnk6
OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6ZnJvbnRTdGF0ZSk6CisgICAgICAgIChCbGFj
a0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmJhY2tTdGF0ZSk6CisgICAgICAg
IChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OnN3YXBTdGF0ZSk6Cisg
ICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OndpbmRvd0Zy
b250QnVmZmVyU3RhdGUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjp3aW5kb3dCYWNrQnVmZmVyU3RhdGUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjpkcmF3U3ViTGF5ZXJzKToKKyAgICAgICAgKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNBY3RpdmUpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmU6OkJhY2tpbmdTdG9yZSk6CisgICAg
ICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6fkJhY2tpbmdTdG9yZSk6Cisg
ICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6Y3JlYXRlU3VyZmFjZSk6
CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6c3VzcGVuZFNjcmVl
bkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpC
YWNraW5nU3RvcmU6OnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmU6OmlzU2Nyb2xsaW5nT3Jab29taW5n
KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlOjpzZXRTY3JvbGxp
bmdPclpvb21pbmcpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmU6
OmJsaXRDb250ZW50cyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZTo6cmVwYWludCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6
aGFzUmVuZGVySm9icyk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZTo6cmVuZGVyT25JZGxlKToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0
b3JlOjppc0RpcmVjdFJlbmRlcmluZ1RvV2luZG93KToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlOjpkZWZlcnNCbGl0KToKKyAgICAgICAgKEJsYWNrQmVycnk6Oldl
YktpdDo6QmFja2luZ1N0b3JlOjpzZXREZWZlcnNCbGl0KToKKyAgICAgICAgKEJsYWNrQmVycnk6
OldlYktpdDo6QmFja2luZ1N0b3JlOjpoYXNCbGl0Sm9icyk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZTo6YmxpdE9uSWRsZSk6CisgICAgICAgICogYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlLmg6IEFkZGVkLgorICAgICAgICAqIGJsYWNrYmVycnkvQXBpL0Jh
Y2tpbmdTdG9yZV9wLmg6IEFkZGVkLgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNr
aW5nU3RvcmVHZW9tZXRyeTo6QmFja2luZ1N0b3JlR2VvbWV0cnkpOgorICAgICAgICAoQmxhY2tC
ZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVHZW9tZXRyeTo6bnVtYmVyT2ZUaWxlc1dpZGUpOgor
ICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVHZW9tZXRyeTo6c2V0TnVt
YmVyT2ZUaWxlc1dpZGUpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVHZW9tZXRyeTo6bnVtYmVyT2ZUaWxlc0hpZ2gpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmVHZW9tZXRyeTo6c2V0TnVtYmVyT2ZUaWxlc0hpZ2gpOgorICAgICAg
ICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVHZW9tZXRyeTo6YmFja2luZ1N0b3Jl
T2Zmc2V0KToKKyAgICAgICAgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlR2VvbWV0
cnk6OnNldEJhY2tpbmdTdG9yZU9mZnNldCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZUdlb21ldHJ5Ojp0aWxlQXQpOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2Vi
S2l0OjpCYWNraW5nU3RvcmVHZW9tZXRyeTo6dGlsZU1hcCk6CisgICAgICAgIChCbGFja0JlcnJ5
OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUdlb21ldHJ5OjpzZXRUaWxlTWFwKToKKyAgICAgICAgKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGU6OmJsaXR0ZWRS
ZWdpb24pOgorICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVXaW5kb3dC
dWZmZXJTdGF0ZTo6YWRkQmxpdHRlZFJlZ2lvbik6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJL
aXQ6OkJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlOjpjbGVhckJsaXR0ZWRSZWdpb24pOgor
ICAgICAgICAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0
ZTo6aXNSZW5kZXJlZCk6CisgICAgICAgIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9y
ZVByaXZhdGU6OnNldEN1cnJlbnRCYWNraW5nU3RvcmVPd25lcik6CisgICAgICAgIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OmN1cnJlbnRCYWNraW5nU3RvcmVPd25l
cik6CisKIDIwMTEtMTItMDEgIEphY2t5IEppYW5nICA8emhhamlhbmdAcmltLmNvbT4KIAogICAg
ICAgICBVcHN0cmVhbSB0ZXh0IGNvZGVjIGFuZCB3ZWIgc3RyaW5nIGZpbGVzIG9mIEJsYWNrQmVy
cnkgQVBJCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdT
dG9yZS5jcHAgYi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhYjhiYQotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApAQCAt
MCwwICsxLDI2MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVz
ZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9v
cgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsg
aWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAg
VVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZS5o
IgorCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0
b3JlQ29tcG9zaXRpbmdTdXJmYWNlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlVGlsZS5oIgor
I2luY2x1ZGUgIkJhY2tpbmdTdG9yZV9wLmgiCisjaW5jbHVkZSAiRmF0RmluZ2Vycy5oIiAvLyBm
b3IgREVCVUdfRkFUX0ZJTkdFUlMgZGVmaW5pdGlvbgorI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgor
I2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3Jh
cGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1
ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlN1cmZh
Y2VQb29sLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQu
aCIKKyNpbmNsdWRlICJXZWJQYWdlX3AuaCIKKyNpbmNsdWRlICJXZWJTZXR0aW5ncy5oIgorCisj
aW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNsdWRl
IDxCbGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJy
eVBsYXRmb3JtTWVzc2FnZS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2VD
bGllbnQuaD4KKworI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorI2luY2x1ZGUgPHd0Zi9N
YXRoRXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL05vdEZvdW5kLmg+CisKKyNkZWZpbmUgU1VQUFJF
U1NfTk9OX1ZJU0lCTEVfUkVHVUxBUl9SRU5ERVJfSk9CUyAwCisjZGVmaW5lIEVOQUJMRV9TQ1JP
TExCQVJTIDEKKyNkZWZpbmUgRU5BQkxFX1JFUEFJTlRPTlNDUk9MTCAxCisjZGVmaW5lIERFQlVH
X0JBQ0tJTkdTVE9SRSAwCisjZGVmaW5lIERFQlVHX1ZJU1VBTElaRSAwCisjZGVmaW5lIERFQlVH
X1RJTEVNQVRSSVggMAorI2RlZmluZSBERUJVR19DT01QT1NJVElOR19ESVJUWV9SRUdJT04gMAor
CisjaWYgVVNFKE9QRU5WRykKKyNpbmNsdWRlICJFR0xEaXNwbGF5T3BlblZHLmgiCisjaW5jbHVk
ZSAiRUdMVXRpbHMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtU2Ny
ZWVuLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsK
KwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3Q7Cit1c2luZyBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6SW50UG9pbnQ7Cit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6
ZTsKKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NvbnN0
IGludCBzX3JlbmRlclRpbWVyVGltZW91dCA9IDEuMDsKK1dlYlBhZ2UqIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnNfY3VycmVudEJhY2tpbmdTdG9yZU93bmVyID0gMDsKKworLy8gQ29tcHV0ZSBkaXZp
c29yIHBhaXJzCit0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGludD4gRGl2aXNvcjsKK3R5cGVkZWYg
VmVjdG9yPERpdmlzb3I+IERpdmlzb3JMaXN0OworLy8gVE9ETzogY2FjaGUgdGhpcyBhbmQvb3Ig
dXNlIGEgc21hcnRlciBhbGdvcml0aG0KK3N0YXRpYyBEaXZpc29yTGlzdCBkaXZpc29ycyh1bnNp
Z25lZCBuKQoreworICAgIERpdmlzb3JMaXN0IGRpdmlzb3JzOworICAgIGZvciAodW5zaWduZWQg
aW50IGkgPSAxOyBpIDw9IG47ICsraSkKKyAgICAgICAgaWYgKCEobiAlIGkpKQorICAgICAgICAg
ICAgZGl2aXNvcnMuYXBwZW5kKHN0ZDo6bWFrZV9wYWlyKGksIG4gLyBpKSk7CisgICAgcmV0dXJu
IGRpdmlzb3JzOworfQorCisvLyBDb21wdXRlIGJlc3QgZGl2aXNvciBnaXZlbiB0aGUgcmF0aW8g
ZGV0ZXJtaW5lZCBieSBzaXplCitzdGF0aWMgRGl2aXNvciBiZXN0RGl2aXNvcihQbGF0Zm9ybTo6
SW50U2l6ZSBzaXplLCBpbnQgdGlsZVdpZHRoLCBpbnQgdGlsZUhlaWdodCwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGludCBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUsIGludCBtaW5pbXVt
TnVtYmVyT2ZUaWxlc0hpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNraW5nU3Rv
cmVQcml2YXRlOjpUaWxlTWF0cml4RGlyZWN0aW9uIGRpcmVjdGlvbikKK3sKKyAgICAvLyBUaGUg
cG9pbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aWxl
cyBpbiBlYWNoCisgICAgLy8gZGltZW5zaW9uLiBXZSBkbyB0aGlzIGJ5IGxvb2tpbmcgdG8gbWF0
Y2ggdGhlIHRpbGUgbWF0cml4IHdpZHRoL2hlaWdodAorICAgIC8vIHJhdGlvIGFzIGNsb3NlbHkg
YXMgcG9zc2libGUgd2l0aCB0aGUgd2lkdGgvaGVpZ2h0IHJhdGlvIG9mIHRoZSBjb250ZW50cy4K
KyAgICAvLyBXZSBhbHNvIGxvb2sgYXQgdGhlIGRpcmVjdGlvbiBwYXNzZWQgdG8gZ2l2ZSBwcmVm
ZXJlbmNlIHRvIG9uZSBkaW1lbnNpb24KKyAgICAvLyBvdmVyIGFub3RoZXIuIFRoaXMgbWV0aG9k
IGNvdWxkIHByb2JhYmx5IGJlIG1hZGUgZmFzdGVyLCBidXQgaXQgZ2V0cyB0aGUKKyAgICAvLyBq
b2IgZG9uZS4KKyAgICBTdXJmYWNlUG9vbCogc3VyZmFjZVBvb2wgPSBTdXJmYWNlUG9vbDo6Z2xv
YmFsU3VyZmFjZVBvb2woKTsKKyAgICBBU1NFUlQoIXN1cmZhY2VQb29sLT5pc0VtcHR5KCkpOwor
CisgICAgLy8gU3RvcmUgYSBzdGF0aWMgbGlzdCBvZiBwb3NzaWJsZSBkaXZpc29ycworICAgIHN0
YXRpYyBEaXZpc29yTGlzdCBkaXZpc29yTGlzdCA9IGRpdmlzb3JzKHN1cmZhY2VQb29sLT5zaXpl
KCkpOworCisgICAgLy8gVGhlIHJhdGlvIHdlJ3JlIGxvb2tpbmcgdG8gYmVzdCBpbWl0YXRlCisg
ICAgZmxvYXQgcmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4oc2l6ZS53aWR0aCgpKSAvIHN0YXRp
Y19jYXN0PGZsb2F0PihzaXplLmhlaWdodCgpKTsKKworICAgIERpdmlzb3IgYmVzdERpdmlzb3I7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXZpc29yTGlzdC5zaXplKCk7ICsraSkgewor
ICAgICAgICBEaXZpc29yIGRpdmlzb3IgPSBkaXZpc29yTGlzdFtpXTsKKworICAgICAgICBib29s
IGRpdmlzb3JXaWR0aElzUGVyZmVjdCA9IHNpemUud2lkdGgoKSA8PSBkaXZpc29yLmZpcnN0ICog
dGlsZVdpZHRoICYmIGFicyhzaXplLndpZHRoKCkgLSBkaXZpc29yLmZpcnN0ICogdGlsZVdpZHRo
KSA8IHRpbGVXaWR0aDsKKyAgICAgICAgYm9vbCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0ID0gc2l6
ZS5oZWlnaHQoKSA8PSBkaXZpc29yLnNlY29uZCAqIHRpbGVIZWlnaHQgJiYgYWJzKHNpemUuaGVp
Z2h0KCkgLSBkaXZpc29yLnNlY29uZCAqIHRpbGVIZWlnaHQpIDwgdGlsZUhlaWdodDsKKyAgICAg
ICAgYm9vbCBkaXZpc29yV2lkdGhJc1ZhbGlkID0gZGl2aXNvci5maXJzdCA+PSBtaW5pbXVtTnVt
YmVyT2ZUaWxlc1dpZGUgfHwgZGl2aXNvcldpZHRoSXNQZXJmZWN0OworICAgICAgICBib29sIGRp
dmlzb3JIZWlnaHRJc1ZhbGlkID0gZGl2aXNvci5zZWNvbmQgPj0gbWluaW11bU51bWJlck9mVGls
ZXNIaWdoIHx8IGRpdmlzb3JIZWlnaHRJc1BlcmZlY3Q7CisgICAgICAgIGlmICghZGl2aXNvcldp
ZHRoSXNWYWxpZCB8fCAhZGl2aXNvckhlaWdodElzVmFsaWQpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBpZiAoZGl2aXNvci5maXJzdCA+IGRpdmlzb3Iuc2Vjb25kICYmIGRpcmVj
dGlvbiA9PSBCYWNraW5nU3RvcmVQcml2YXRlOjpWZXJ0aWNhbCAmJiAhZGl2aXNvckhlaWdodElz
UGVyZmVjdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkaXZpc29yLnNl
Y29uZCA+IGRpdmlzb3IuZmlyc3QgJiYgZGlyZWN0aW9uID09IEJhY2tpbmdTdG9yZVByaXZhdGU6
Okhvcml6b250YWwgJiYgIWRpdmlzb3JXaWR0aElzUGVyZmVjdCkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworCisgICAgICAgIGlmIChkaXZpc29yV2lkdGhJc1BlcmZlY3QgfHwgZGl2aXNvckhlaWdo
dElzUGVyZmVjdCkgeworICAgICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29yOyAvLyBGb3Vu
ZCBhIHBlcmZlY3QgZml0IQorI2lmIERFQlVHX1RJTEVNQVRSSVgKKyAgICAgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJiZXN0RGl2aXNvciBmb3VuZCBwZXJmZWN0IHNpemUgd2lkdGhQZXJmZWN0PSVzIGhlaWdo
dFBlcmZlY3Q9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29y
V2lkdGhJc1BlcmZlY3QgPyAidHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0ID8gInRydWUiIDogImZhbHNlIik7
CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3Rv
cmUgYmFzaXMgb2YgY29tcGFyaXNvbgorICAgICAgICBpZiAoIWJlc3REaXZpc29yLmZpcnN0ICYm
ICFiZXN0RGl2aXNvci5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJlc3REaXZpc29yID0gZGl2aXNv
cjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcGFy
ZSByYXRpb3MKKyAgICAgICAgZmxvYXQgZGlmZjEgPSBmYWJzKChzdGF0aWNfY2FzdDxmbG9hdD4o
ZGl2aXNvci5maXJzdCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGl2aXNvci5zZWNvbmQpKSAtIHJh
dGlvKTsKKyAgICAgICAgZmxvYXQgZGlmZjIgPSBmYWJzKChzdGF0aWNfY2FzdDxmbG9hdD4oYmVz
dERpdmlzb3IuZmlyc3QpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJlc3REaXZpc29yLnNlY29uZCkp
IC0gcmF0aW8pOworICAgICAgICBpZiAoZGlmZjEgPCBkaWZmMikKKyAgICAgICAgICAgIGJlc3RE
aXZpc29yID0gZGl2aXNvcjsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdERpdmlzb3I7Cit9CisK
K3N0cnVjdCBCYWNraW5nU3RvcmVNdXRleExvY2tlciB7CisgICAgQmFja2luZ1N0b3JlTXV0ZXhM
b2NrZXIoQmFja2luZ1N0b3JlUHJpdmF0ZSogYmFja2luZ1N0b3JlUHJpdmF0ZSkKKyAgICAgICAg
OiBtX2JhY2tpbmdTdG9yZVByaXZhdGUoYmFja2luZ1N0b3JlUHJpdmF0ZSkKKyAgICB7CisgICAg
ICAgIG1fYmFja2luZ1N0b3JlUHJpdmF0ZS0+bG9ja0JhY2tpbmdTdG9yZSgpOworICAgIH0KKwor
ICAgIH5CYWNraW5nU3RvcmVNdXRleExvY2tlcigpCisgICAgeworICAgICAgICBtX2JhY2tpbmdT
dG9yZVByaXZhdGUtPnVubG9ja0JhY2tpbmdTdG9yZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBCYWNraW5nU3RvcmVQcml2YXRlKiBtX2JhY2tpbmdTdG9yZVByaXZhdGU7Cit9OworCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVHZW9tZXRyeTo6YmFja2luZ1N0b3JlUmVjdCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KGJhY2tpbmdTdG9yZU9mZnNldCgp
LCBiYWNraW5nU3RvcmVTaXplKCkpOworfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBCYWNraW5nU3Rv
cmVHZW9tZXRyeTo6YmFja2luZ1N0b3JlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFBsYXRm
b3JtOjpJbnRTaXplKG51bWJlck9mVGlsZXNXaWRlKCkgKiBCYWNraW5nU3RvcmVQcml2YXRlOjp0
aWxlV2lkdGgoKSwgbnVtYmVyT2ZUaWxlc0hpZ2goKSAqIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRp
bGVIZWlnaHQoKSk7Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OkJhY2tpbmdTdG9yZVByaXZh
dGUoKQorICAgIDogbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyhmYWxzZSkKKyAgICAsIG1fc3VzcGVu
ZEJhY2tpbmdTdG9yZVVwZGF0ZXMoZmFsc2UpCisgICAgLCBtX3N1c3BlbmRSZW5kZXJKb2JzKGZh
bHNlKQorICAgICwgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMoZmFsc2UpCisgICAgLCBtX2lz
U2Nyb2xsaW5nT3Jab29taW5nKGZhbHNlKQorICAgICwgbV93ZWJQYWdlKDApCisgICAgLCBtX2Ns
aWVudCgwKQorICAgICwgbV9yZW5kZXJRdWV1ZShuZXcgUmVuZGVyUXVldWUodGhpcykpCisgICAg
LCBtX2RlZmVyc0JsaXQodHJ1ZSkKKyAgICAsIG1faGFzQmxpdEpvYnMoZmFsc2UpCisjaWYgVVNF
KE9QRU5WRykKKyAgICAsIG1fZWdsRGlzcGxheShFR0xfTk9fRElTUExBWSkKKyNlbmRpZgorICAg
ICwgbV9jdXJyZW50V2luZG93QmFja0J1ZmZlcigwKQorICAgICwgbV9wcmVmZXJyZWRUaWxlTWF0
cml4RGltZW5zaW9uKFZlcnRpY2FsKQorICAgICwgbV9ibGl0R2VuZXJhdGlvbigtMSkKK3sKKyAg
ICBtX2Zyb250U3RhdGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0
b3JlR2VvbWV0cnkpOworICAgIG1fYmFja1N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZD4obmV3IEJhY2tpbmdTdG9yZUdlb21ldHJ5KTsKKworICAgIG1fcmVuZGVyVGltZXIgPSBuZXcg
VGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4odGhpcywgJkJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
bmRlck9uVGltZXIpOworCisgICAgLy8gTmVlZCBhIHJlY3Vyc2l2ZSBtdXRleCB0byBhY2hpZXZl
IGEgZ2xvYmFsIGxvY2sKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IGF0dHI7CisgICAgcHRocmVh
ZF9tdXRleGF0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSgm
YXR0ciwgUFRIUkVBRF9NVVRFWF9SRUNVUlNJVkUpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgm
bV9tdXRleCwgJmF0dHIpOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3koJmF0dHIpOwor
CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX2JsaXRHZW5lcmF0aW9uTG9jaywgMCk7CisgICAg
cHRocmVhZF9jb25kX2luaXQoJm1fYmxpdEdlbmVyYXRpb25Db25kLCAwKTsKK30KKworQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6fkJhY2tpbmdTdG9yZVByaXZhdGUoKQoreworICAgIGRlbGV0ZSBtX3Jl
bmRlclF1ZXVlOworICAgIG1fcmVuZGVyUXVldWUgPSAwOworICAgIGRlbGV0ZSBtX3JlbmRlclRp
bWVyOworICAgIG1fcmVuZGVyVGltZXIgPSAwOworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBm
cm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2Zyb250U3Rh
dGUpOworICAgIGRlbGV0ZSBmcm9udDsKKyAgICBtX2Zyb250U3RhdGUgPSAwOworCisgICAgQmFj
a2luZ1N0b3JlR2VvbWV0cnkqIGJhY2sgPSByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdl
b21ldHJ5Kj4obV9iYWNrU3RhdGUpOworICAgIGRlbGV0ZSBiYWNrOworICAgIG1fYmFja1N0YXRl
ID0gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmbV9tdXRleCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSBjb25z
dAoreworICAgIGlmIChtX3dlYlBhZ2UtPnNldHRpbmdzKCktPmlzRGlyZWN0UmVuZGVyaW5nVG9X
aW5kb3dFbmFibGVkKCkgfHwgIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisg
ICAgY29uc3QgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUo
KTsKKyAgICBjb25zdCB1bnNpZ25lZCB0aWxlc05lY2Vzc2FyeSA9IG1pbmltdW1OdW1iZXJPZlRp
bGVzV2lkZSgpICogbWluaW11bU51bWJlck9mVGlsZXNIaWdoKCk7CisgICAgY29uc3QgdW5zaWdu
ZWQgdGlsZXNBdmFpbGFibGUgPSBjdXJyZW50U3RhdGUtPm51bWJlck9mVGlsZXNXaWRlKCkgKiBj
dXJyZW50U3RhdGUtPm51bWJlck9mVGlsZXNIaWdoKCk7CisgICAgcmV0dXJuIHRpbGVzQXZhaWxh
YmxlIDwgdGlsZXNOZWNlc3Nhcnk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3Vz
cGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKQoreworICAgIG1fc3VzcGVuZEJhY2tp
bmdTdG9yZVVwZGF0ZXMgPSB0cnVlOworCisgICAgLy8gTWFrZSBzdXJlIHRoZSB1c2VyIGludGVy
ZmFjZSB0aHJlYWQgZ2V0cyB0aGUgbWVzc2FnZSBiZWZvcmUgd2UgcHJvY2VlZAorICAgIC8vIGJl
Y2F1c2UgYmxpdENvbnRlbnRzIGNhbiBiZSBjYWxsZWQgZnJvbSB0aGlzIHRocmVhZCBhbmQgaXQg
bXVzdCBob25vcgorICAgIC8vIHRoaXMgZmxhZworICAgIG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMg
PSB0cnVlOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVz
c2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOworCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorICAgIG1fd2ViUGFnZS0+ZC0+cmVzZXRDb21wb3NpdGluZ1N1cmZh
Y2UoKTsKKyNlbmRpZgorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc3VtZVNjcmVl
bkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpSZXN1bWVVcGRhdGVPcGVyYXRp
b24gb3ApCit7CisgICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyA9IGZhbHNlOworCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlmIChvcCAhPSBCYWNraW5nU3Rv
cmU6Ok5vbmUpCisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0TmVlZHNPbmVTaG90RHJhd2luZ1N5
bmNocm9uaXphdGlvbigpOworI2VuZGlmCisKKyAgICAvLyBGb3IgdGhlIGRpcmVjdCByZW5kZXJp
bmcgY2FzZSwgdGhlcmUgaXMgbm8gc3VjaCBvcGVyYXRpb24gYXMgYmxpdCwKKyAgICAvLyB3ZSBo
YXZlIHRvIHJlbmRlciB0byBnZXQgYW55dGhpbmcgdG8gdGhlIHNjcmVlbi4KKyAgICBpZiAoc2hv
dWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSAmJiBvcCA9PSBCYWNraW5nU3RvcmU6OkJsaXQp
CisgICAgICAgIG9wID0gQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRCbGl0OworCisgICAgLy8gRG8g
c29tZSByZW5kZXJpbmcgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG9wID09IEJhY2tpbmdTdG9yZTo6
UmVuZGVyQW5kQmxpdCkKKyAgICAgICAgcmVuZGVyVmlzaWJsZUNvbnRlbnRzKHRydWUgLypyZW5k
ZXJDb250ZW50T25seSovKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXNlciBpbnRlcmZhY2Ug
dGhyZWFkIGdldHMgdGhlIG1lc3NhZ2UgYmVmb3JlIHdlIHByb2NlZWQKKyAgICAvLyBiZWNhdXNl
IGJsaXRDb250ZW50cyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVh
ZCBhbmQKKyAgICAvLyBpdCBtdXN0IGhvbm9yIHRoaXMgZmxhZworICAgIG1fc3VzcGVuZFNjcmVl
blVwZGF0ZXMgPSBmYWxzZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+c3luY1RvQ3VycmVudE1lc3NhZ2UoKTsKKworICAgIC8v
IERvIHNvbWUgYmxpdHRpbmcgaWYgbmVjZXNzYXJ5CisgICAgaWYgKChvcCA9PSBCYWNraW5nU3Rv
cmU6OkJsaXQgfHwgb3AgPT0gQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRCbGl0KSAmJiAhc2hvdWxk
RGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgYmxpdFZpc2libGVDb250ZW50cygp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlcGFpbnQoY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIHdpbmRvd1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ym9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpCit7CisjaWYgVVNFKE9QRU5WRykK
KyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVHTF9OT19ESVNQTEFZKTsKKyNlbmRpZgorCisg
ICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpCisgICAgICAgIHJldHVybjsKKwor
ICAgIC8qCisgICAgICogSWYgaW1tZWRpYXRlIGlzIHRydWUsIHRoZW4gd2UncmUgYmVpbmcgYXNr
ZWQgdG8gcGVyZm9ybSBzeW5jaHJvbm91c2x5CisgICAgICoKKyAgICAgKiBOT1RFOiBXZWJDb3Jl
OjpTY3JvbGxWaWV3IHdpbGwgY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGltbWVkaWF0ZTp0cnVlIGFu
ZCBjb250ZW50Q2hhbmdlZDpmYWxzZS4KKyAgICAgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGlu
dHJvZHVjZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgQXBwbGUncyB3aW5kb3dzIHBvcnQgYW5kIGNh
biBiZSBzYWZlbHkgaWdub3JlZCBJIGJlbGlldmUuCisgICAgICoKKyAgICAgKiBOb3cgdGhpcyBt
ZXRob2Qgd2lsbCBiZSBjYWxsZWQgZnJvbSBXZWJQYWdlUHJpdmF0ZTo6cmVwYWludCgpCisgICAg
ICovCisKKyAgICBpZiAoY29udGVudENoYW5nZWQgJiYgIXdpbmRvd1JlY3QuaXNFbXB0eSgpKSB7
CisgICAgICAgIC8vIFRoaXMgd2luZG93UmVjdCBpcyBpbiB1bnRyYW5zZm9ybWVkIGNvb3JkaW5h
dGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgYnV0CisgICAgICAgIC8vIGl0IG5lZWRzIHRv
IGJlIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB0cmFuc2Zvcm1lZCBj
b250ZW50cy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+ZC0+
bWFwVG9UcmFuc2Zvcm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3aW5k
b3dSZWN0KSk7CisgICAgICAgIHJlY3QuaW5mbGF0ZSgxIC8qZHgqLywgMSAvKmR5Ki8pOyAvLyBh
Y2NvdW50IGZvciBhbnRpLWFsaWFzaW5nIG9mIHByZXZpb3VzIHJlbmRlcmluZyBydW5zCisKKyAg
ICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24gV2Vi
Q29yZTo6LgorICAgICAgICBXZWJDb3JlOjpJbnRSZWN0IHRtcFJlY3QgPSByZWN0OworICAgICAg
ICBtX2NsaWVudC0+Y2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QodG1wUmVjdCk7CisKKyAg
ICAgICAgcmVjdCA9IHRtcFJlY3Q7CisgICAgICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICAgICAgcmVu
ZGVyKHJlY3QsIGZhbHNlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJS
ZW5kZXIsIHJlY3QpOworICAgIH0KK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzbG93
U2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKQoreworI2lmIERFQlVHX0JBQ0tJTkdT
VE9SRQorICAgIC8vIFN0YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91YmxlIHRp
bWUgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0ZWRI
ZWxwZXIoZGVsdGEpOworCisgICAgLy8gVGhpcyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNmb3Jt
ZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0LCBidXQKKyAgICAvLyBpdCBu
ZWVkcyB0byBiZSB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdHJhbnNm
b3JtZWQgY29udGVudHMuCisgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+
ZC0+bWFwVG9UcmFuc2Zvcm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3
aW5kb3dSZWN0KSk7CisKKyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIocmVjdCwg
ZmFsc2UgLypyZW5kZXJDb250ZW50T25seSovKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9yZW5k
ZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCwgcmVjdCk7Cisg
ICAgICAgIC8vIFdlIG9ubHkgYmxpdCBoZXJlIGlmIHRoZSBjbGllbnQgZGlkIG5vdCBnZW5lcmF0
ZSB0aGUgc2Nyb2xsIGFzIHRoZSBjbGllbnQKKyAgICAgICAgLy8gbm93IHN1cHBvcnRzIGJsaXR0
aW5nIGFzeW5jaHJvbm91c2x5IGR1cmluZyBzY3JvbGwgb3BlcmF0aW9ucworICAgICAgICBpZiAo
IW1fY2xpZW50LT5pc0NsaWVudEdlbmVyYXRlZFNjcm9sbCgpICYmICFzaG91bGREaXJlY3RSZW5k
ZXJpbmdUb1dpbmRvdygpKQorICAgICAgICAgICAgYmxpdFZpc2libGVDb250ZW50cygpOworICAg
IH0KKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0b3AgdGhlIHRpbWUgbWVhc3Vy
ZW1lbnQKKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7Cisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNsb3dTY3JvbGwgZWxhcHNlZD0lZiIs
IGVsYXBzZWQpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xs
KGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjbGlw
UmVjdCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgZGlyZWN0IHJlbmRlcmluZyB0aGVuIHdlIGFyZSBm
b3JjZWQgdG8gZ28gZG93biB0aGUgc2xvdyBwYXRoCisgICAgLy8gdG8gc2Nyb2xsaW5nCisgICAg
aWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgUGxhdGZvcm06
OkludFJlY3Qgdmlld3BvcnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdl
LT5kLT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICAgICAgc2xvd1Njcm9sbChkZWx0
YSwgbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNmb3JtZWQodmlld3BvcnRSZWN0KSwgdHJ1ZSAv
KmltbWVkaWF0ZSovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JBQ0tJ
TkdTVE9SRQorICAgIC8vIFN0YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91Ymxl
IHRpbWUgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0
ZWRIZWxwZXIoZGVsdGEpOworCisgICAgLy8gV2Ugb25seSBibGl0IGhlcmUgaWYgdGhlIGNsaWVu
dCBkaWQgbm90IGdlbmVyYXRlIHRoZSBzY3JvbGwgYXMgdGhlIGNsaWVudAorICAgIC8vIG5vdyBz
dXBwb3J0cyBibGl0dGluZyBhc3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlvbnMK
KyAgICBpZiAoIW1fY2xpZW50LT5pc0NsaWVudEdlbmVyYXRlZFNjcm9sbCgpKQorICAgICAgICBi
bGl0VmlzaWJsZUNvbnRlbnRzKCk7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICAvLyBT
dG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50CisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJl
bnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGwgZHg9JWQsIGR5PSVkIGVsYXBzZWQ9JWYiLCBkZWx0YS53aWR0aCgpLCBkZWx0YS5oZWlnaHQo
KSwgZWxhcHNlZCk7CisjZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGxpbmdTdGFydGVkSGVscGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSkKK3sKKyAg
ICAvLyBOb3RpZnkgdGhlIHJlbmRlciBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBzaHVmZmxlIGFjY29y
ZGluZ2x5CisgICAgbV9yZW5kZXJRdWV1ZS0+dXBkYXRlU29ydERpcmVjdGlvbihkZWx0YS53aWR0
aCgpLCBkZWx0YS5oZWlnaHQoKSk7CisgICAgbV9yZW5kZXJRdWV1ZS0+dmlzaWJsZUNvbnRlbnRD
aGFuZ2VkKHZpc2libGVDb250ZW50c1JlY3QoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhlIGFjdHVh
bCBiYWNraW5nc3RvcmUKKyAgICBzY3JvbGxCYWNraW5nU3RvcmUoZGVsdGEud2lkdGgoKSwgZGVs
dGEuaGVpZ2h0KCkpOworCisgICAgLy8gQWRkIGFueSBuZXdseSB2aXNpYmxlIHRpbGVzIHRoYXQg
aGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IHJlbmRlcmVkIHRvIHRoZSBxdWV1ZQorICAgIC8vIGFu
ZCBjaGVjayBpZiB0aGUgdGlsZSB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBieSByZWd1bGFyIHJl
bmRlciBqb2IKKyAgICB1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24oKTsK
K30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRTdXBwcmVzc05vblZpc2libGVS
ZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7CisjaWYgU1VQUFJFU1NfTk9OX1ZJU0lCTEVfUkVH
VUxBUl9SRU5ERVJfSk9CUworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICAvLyBBbHdheXMg
c3VwcHJlc3Mgd2hlbiBsb2FkaW5nIGFzIHRoaXMgZHJhc3RpY2FsbHkgZGVjcmVhc2VzIHBhZ2Ug
bG9hZGluZworICAgIC8vIHRpbWUuLi4KKyAgICByZXR1cm4gbV9jbGllbnQtPmlzTG9hZGluZygp
OworI2VuZGlmCit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkUGVyZm9ybVJl
bmRlckpvYnMoKSBjb25zdAoreworICAgIHJldHVybiAobV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8
fCBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSAmJiAhbV9zdXNwZW5kUmVuZGVySm9i
cyAmJiAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhbV9yZW5kZXJRdWV1ZS0+aXNF
bXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OnNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkgJiYgIW1fc3VzcGVuZFJlZ3VsYXJSZW5k
ZXJKb2JzOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0YXJ0UmVuZGVyVGltZXIo
KQoreworICAgIC8vIENhbGxlZCB3aGVuIHJlbmRlciBxdWV1ZSBoYXMgYSBuZXcgam9iIGFkZGVk
CisgICAgaWYgKG1fcmVuZGVyVGltZXItPmlzQWN0aXZlKCkgfHwgbV9yZW5kZXJRdWV1ZS0+aXNF
bXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpKQorICAgICAgICByZXR1cm47CisKKyNp
ZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6
c3RhcnRSZW5kZXJUaW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgor
ICAgIG1fcmVuZGVyVGltZXItPnN0YXJ0T25lU2hvdChzX3JlbmRlclRpbWVyVGltZW91dCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyKCkKK3sKKyAgICBp
ZiAoIW1fcmVuZGVyVGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IENhbGxlZCB3aGVuIHdlIHJlbmRlciBzb21ldGhpbmcgdG8gcmVzdGFydAorI2lmIERFQlVHX0JB
Q0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzdG9wUmVuZGVy
VGltZXIgdGltZT0lZiIsIFdURjo6Y3VycmVudFRpbWUoKSk7CisjZW5kaWYKKyAgICBtX3JlbmRl
clRpbWVyLT5zdG9wKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25U
aW1lcihXZWJDb3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPiopCit7CisgICAgLy8gVGhp
cyB0aW1lciBpcyBhIHRoaXJkIG1ldGhvZCBvZiBzdGFydGluZyBhIHJlbmRlciBvcGVyYXRpb24g
dGhhdCBpcyBhIGNhdGNoLWFsbC4gSWYgbW9yZQorICAgIC8vIHRoYW4gc19yZW5kZXJUaW1lclRp
bWVvdXQgZWxhcHNlcyB3aXRoIG5vIHJlbmRlcmluZyB0YWtpbmcgcGxhY2UgYW5kIHJlbmRlciBq
b2JzIGluIHRoZSBxdWV1ZSwgdGhlbgorICAgIC8vIHJlbmRlck9uVGltZXIgd2lsbCBiZSBjYWxs
ZWQgd2hpY2ggd2lsbCBhY3R1YWxseSByZW5kZXIuCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVu
ZGVySm9icygpKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25UaW1lciB0aW1lPSVmIiwg
V1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIHdoaWxlIChtX3JlbmRlclF1ZXVlLT5o
YXNDdXJyZW50VmlzaWJsZVpvb21Kb2IoKSB8fCBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50Vmlz
aWJsZVNjcm9sbEpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3VzcGVu
ZFJlZ3VsYXJSZW5kZXJKb2JzKTsKKworICAgIGlmICghc2hvdWxkUGVyZm9ybVJlZ3VsYXJSZW5k
ZXJKb2JzKCkgfHwgIW1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRSZWd1bGFyUmVuZGVySm9iKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlckFsbEN1cnJlbnRS
ZWd1bGFyUmVuZGVySm9icygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRl
ck9uSWRsZSgpCit7CisgICAgQVNTRVJUKHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkpOworCisg
ICAgLy8gTGV0IHRoZSByZW5kZXIgcXVldWUga25vdyB0aGF0IHdlIGVudGVyZWQgYSBuZXcgZXZl
bnQgcXVldWUgY3ljbGUKKyAgICAvLyBzbyBpdCBjYW4gZGV0ZXJtaW5lIGlmIGl0IGlzIHVuZGVy
IHByZXNzdXJlCisgICAgbV9yZW5kZXJRdWV1ZS0+ZXZlbnRRdWV1ZUN5Y2xlZCgpOworCisjaWYg
REVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
bmRlck9uSWRsZSIpOworI2VuZGlmCisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3Vz
cGVuZFJlZ3VsYXJSZW5kZXJKb2JzKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjp3
aWxsRmlyZVRpbWVyKCkKK3sKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93IHRoYXQg
d2UgZW50ZXJlZCBhIG5ldyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNhbiBkZXRl
cm1pbmUgaWYgaXQgaXMgdW5kZXIgcHJlc3N1cmUKKyAgICBtX3JlbmRlclF1ZXVlLT5ldmVudFF1
ZXVlQ3ljbGVkKCk7CisKKyAgICBpZiAoIXNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygp
IHx8ICFtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpIHx8ICFtX3Jl
bmRlclF1ZXVlLT5jdXJyZW50UmVndWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpKQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjp3aWxsRmlyZVRpbWVyIik7CisjZW5kaWYKKworICAg
IC8vIFdlJ3ZlIGRldGVjdGVkIHRoYXQgdGhlIHJlZ3VsYXIgcmVuZGVyIGpvYnMgYXJlIGNvbWlu
ZyB1bmRlciBwcmVzc3VyZSBsaWtlbHkKKyAgICAvLyBkdWUgdG8gdGltZXJzIGZpcmluZyBwcm9k
dWNpbmcgaW52YWxpZGF0aW9uIGpvYnMgYW5kIG91ciBlZmZvcnRzIHRvIGJyZWFrIHRoZW0KKyAg
ICAvLyB1cCBpbnRvIGJpdGUgc2l6ZSBwaWVjZXMgaGFzIHByb2R1Y2VkIGEgc2l0dWF0aW9uIHdo
ZXJlIHdlIGNhbiBub3QgY29tcGxldGUKKyAgICAvLyBhIGJhdGNoIG9mIHRoZW0gYmVmb3JlIHJl
Y2VpdmluZyBtb3JlIHRoYXQgaW50ZXJzZWN0IHRoZW0gd2hpY2ggY2F1c2VzIHVzCisgICAgLy8g
dG8gc3RhcnQgdGhlIGJhdGNoIG92ZXIuIFRvIG1pdGlnYXRlIHRoaXMgd2UgaGF2ZSB0byBlbXB0
eSB0aGUgY3VycmVudCBiYXRjaAorICAgIC8vIHdoZW4gdGhpcyBpcyBkZXRlY3RlZC4KKworICAg
IC8vIFdlIHN0aWxsIHdhbnQgdG8gcGVyZm9ybSBwcmlvcml0eSBqb2JzIGZpcnN0IHRvIGF2b2lk
IHJlZHVuZGFudCBwYWludHMuCisgICAgd2hpbGUgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRW
aXNpYmxlWm9vbUpvYigpIHx8IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlU2Nyb2xs
Sm9iKCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9zdXNwZW5kUmVndWxhclJl
bmRlckpvYnMpOworCisgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRSZWd1bGFyUmVu
ZGVySm9iKCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlckFsbEN1cnJlbnRSZWd1bGFy
UmVuZGVySm9icygpOworCisgICAgLy8gTGV0IHRoZSBjYWxsZXIgeWllbGQgYW5kIHJlc2NoZWR1
bGUgdGhlIHRpbWVyLgorICAgIHJldHVybiBmYWxzZTsKK30KKworUGxhdGZvcm06OkludFJlY3Qg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6ZXhwYW5kZWRDb250ZW50c1JlY3QoKSBjb25zdAoreworICAg
IHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGV4cGFu
ZGVkQ29udGVudHNTaXplKCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQ
cml2YXRlOjp2aXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW50ZXJz
ZWN0aW9uKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QoKSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgw
LCAwKSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpKTsKK30KKworUGxhdGZv
cm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRz
UmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVD
b250ZW50c1JlY3QoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3Zl
TGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJh
Y2tpbmdTdG9yZVJlY3QueCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLngoKQorICAgICAgICAg
ICAgJiYgYmFja2luZ1N0b3JlUmVjdC54KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLngoKTsK
K30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlUmlnaHQoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNh
bk1vdmVYKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0
LnJpZ2h0KCkgPCB2aXNpYmxlQ29udGVudHNSZWN0KCkucmlnaHQoKQorICAgICAgICAgICAgJiYg
YmFja2luZ1N0b3JlUmVjdC5yaWdodCgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5yaWdodCgp
OworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVVcChjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2Fu
TW92ZVkoYmFja2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3Qu
eSgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLnkoKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC55KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLnkoKTsKK30KKworYm9vbCBCYWNr
aW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
YmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2FuTW92ZVkoYmFja2luZ1N0
b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkgPCB2aXNp
YmxlQ29udGVudHNSZWN0KCkuYm90dG9tKCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJl
Y3QuYm90dG9tKCkgPCBleHBhbmRlZENvbnRlbnRzUmVjdCgpLmJvdHRvbSgpOworfQorCitib29s
IEJhY2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVYKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBi
YWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0Lndp
ZHRoKCkgPiB2aXNpYmxlQ29udGVudHNSZWN0KCkud2lkdGgoKTsKK30KKworYm9vbCBCYWNraW5n
U3RvcmVQcml2YXRlOjpjYW5Nb3ZlWShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSA+
IHZpc2libGVDb250ZW50c1JlY3QoKS5oZWlnaHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjYW5Nb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QK
K3sKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRl
bnRzUmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4
cGFuZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKC10aWxlV2lk
dGgoKSwgMCk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA+PSB2aXNpYmxl
Q29udGVudHNSZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgp
ID49IGNvbnRlbnRzUmVjdC54KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2Fu
TW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7
CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRDb250
ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUodGlsZVdpZHRoKCksIDApOwor
ICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LngoKSA8PSB2aXNpYmxlQ29udGVudHNSZWN0Lngo
KQorICAgICAgICAgICAgJiYgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8PSBjb250ZW50c1Jl
Y3QucmlnaHQoKQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSAtIGNv
bnRlbnRzUmVjdC5yaWdodCgpKSA8IHRpbGVXaWR0aCgpKTsKK30KKworYm9vbCBCYWNraW5nU3Rv
cmVQcml2YXRlOjpjYW5Nb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0
Cit7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7CisgICAg
UGxhdGZvcm06OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2libGVDb250
ZW50c1JlY3QoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0aGlzLT5l
eHBhbmRlZENvbnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCAtdGls
ZUhlaWdodCgpKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA+PSB2aXNp
YmxlQ29udGVudHNSZWN0LmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0
LnkoKSA+PSBjb250ZW50c1JlY3QueSgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6
OmNhbk1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAg
IFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0
KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRD
b250ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgp
KTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC55KCkgPD0gdmlzaWJsZUNvbnRlbnRzUmVj
dC55KCkKKyAgICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgpIDw9IGNvbnRl
bnRzUmVjdC5ib3R0b20oKQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QuYm90dG9t
KCkgLSBjb250ZW50c1JlY3QuYm90dG9tKCkpIDwgdGlsZUhlaWdodCgpKTsKK30KKworUGxhdGZv
cm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja2luZ1N0b3JlUmVjdEZvclNjcm9s
bChpbnQgZGVsdGFYLCBpbnQgZGVsdGFZLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkg
Y29uc3QKK3sKKyAgICAvLyBUaGUgY3VycmVudCByZWN0CisgICAgUGxhdGZvcm06OkludFJlY3Qg
YmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7CisKKyAgICAvLyBUaGlzIG1ldGhvZCB1c2VzIHRoZSBk
ZWx0YSB2YWx1ZXMgdG8gZGVzY3JpYmUgdGhlIGJhY2tpbmdzdG9yZSByZWN0CisgICAgLy8gZ2l2
ZW4gdGhlIGN1cnJlbnQgc2Nyb2xsIGRpcmVjdGlvbiBhbmQgdGhlIHZpZXdwb3J0IHBvc2l0aW9u
LiBIb3dldmVyLAorICAgIC8vIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2l0aCBubyBkZWx0
YXMgd2hhdHNvZXZlciBmb3IgaW5zdGFuY2Ugd2hlbgorICAgIC8vIHRoZSBjb250ZW50cyBzaXpl
IGNoYW5nZXMgb3IgdGhlIG9yaWVudGF0aW9uIGNoYW5nZXMuIEluIHRoaXMgY2FzZSwgd2UKKyAg
ICAvLyB3YW50IHRvIHVzZSB0aGUgcHJldmlvdXMgc2Nyb2xsIGRpcmVjdGlvbiB0byBkZXNjcmli
ZSB0aGUgYmFja2luZ3N0b3JlCisgICAgLy8gcmVjdC4gVGhpcyB3aWxsIHJlc3VsdCBpbiBsZXNz
IGNoZWNrZXJib2FyZC4KKyAgICBpZiAoIWRlbHRhWCAmJiAhZGVsdGFZKSB7CisgICAgICAgIGRl
bHRhWCA9IG1fcHJldmlvdXNEZWx0YS53aWR0aCgpOworICAgICAgICBkZWx0YVkgPSBtX3ByZXZp
b3VzRGVsdGEuaGVpZ2h0KCk7CisgICAgfQorICAgIG1fcHJldmlvdXNEZWx0YSA9IFBsYXRmb3Jt
OjpJbnRTaXplKGRlbHRhWCwgZGVsdGFZKTsKKworICAgIC8vIFJldHVybiB0byBvcmlnaW4gaWYg
bmVlZCBiZQorICAgIGlmICghY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkgJiYgYmFja2luZ1N0
b3JlUmVjdC54KCkpCisgICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WCgwKTsKKworICAgIGlm
ICghY2FuTW92ZVkoYmFja2luZ1N0b3JlUmVjdCkgJiYgYmFja2luZ1N0b3JlUmVjdC55KCkpCisg
ICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WSgwKTsKKworICAgIC8vIE1vdmUgdGhlIHJlY3Qg
bGVmdAorICAgIHdoaWxlIChzaG91bGRNb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSB8fCAoZGVs
dGFYID4gMCAmJiBjYW5Nb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QubW92ZSgtdGlsZVdpZHRoKCksIDApOworCisgICAgLy8gTW92ZSB0aGUgcmVj
dCByaWdodAorICAgIHdoaWxlIChzaG91bGRNb3ZlUmlnaHQoYmFja2luZ1N0b3JlUmVjdCkgfHwg
KGRlbHRhWCA8IDAgJiYgY2FuTW92ZVJpZ2h0KGJhY2tpbmdTdG9yZVJlY3QpKSkKKyAgICAgICAg
YmFja2luZ1N0b3JlUmVjdC5tb3ZlKHRpbGVXaWR0aCgpLCAwKTsKKworICAgIC8vIE1vdmUgdGhl
IHJlY3QgdXAKKyAgICB3aGlsZSAoc2hvdWxkTW92ZVVwKGJhY2tpbmdTdG9yZVJlY3QpIHx8IChk
ZWx0YVkgPiAwICYmIGNhbk1vdmVVcChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QubW92ZSgwLCAtdGlsZUhlaWdodCgpKTsKKworICAgIC8vIE1vdmUgdGhlIHJl
Y3QgZG93bgorICAgIHdoaWxlIChzaG91bGRNb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSB8fCAo
ZGVsdGFZIDwgMCAmJiBjYW5Nb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJh
Y2tpbmdTdG9yZVJlY3QubW92ZSgwLCB0aWxlSGVpZ2h0KCkpOworCisgICAgcmV0dXJuIGJhY2tp
bmdTdG9yZVJlY3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2luZ1N0
b3JlUmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkKK3sKKyAg
ICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
ICghaXNBY3RpdmUoKSkgeworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNob3VsZFJlc2V0VGls
ZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSZWNv
cmQgdGhlIGN1cnJlbnQgYmFja2luZ3N0b3JlIHJlY3QKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBj
dXJyZW50QmFja2luZ1N0b3JlUmVjdCA9IGZyb250U3RhdGUoKS0+YmFja2luZ1N0b3JlUmVjdCgp
OworCisgICAgaWYgKGJhY2tpbmdTdG9yZVJlY3QgPT0gY3VycmVudEJhY2tpbmdTdG9yZVJlY3Qp
CisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX1RJTEVNQVRSSVgKKyAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAi
QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2luZ1N0b3JlUmVjdCBjaGFuZ2VkIGZyb20gKCVk
LCVkICVkeCVkKSB0byAoJWQsJWQgJWR4JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJhY2tpbmdTdG9yZVJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgYmFja2luZ1N0b3JlUmVjdC55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNr
aW5nU3RvcmVSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNraW5n
U3RvcmVSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkq
IGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBj
dXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIC8vIFRoZSBsaXN0IG9mIGluZGV4ZXMgd2Ug
bmVlZCB0byBmaWxsCisgICAgVGlsZUluZGV4TGlzdCBpbmRleGVzVG9GaWxsID0gaW5kZXhlc0Zv
ckJhY2tpbmdTdG9yZVJlY3QoYmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICBBU1NFUlQoKGludClp
bmRleGVzVG9GaWxsLnNpemUoKSA9PSBjdXJyZW50TWFwLnNpemUoKSk7CisKKyAgICBUaWxlTWFw
IHRpbGVzOyAvLyBvdXIgbmV3IHRpbGUgbWFwCisgICAgVGlsZU1hcCBsZWZ0T3ZlclRpbGVzOyAv
LyB0aWxlcyB0aGF0IGFyZSBsZWZ0IG92ZXIKKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBvdXIg
Y3VycmVudCB0aWxlIG1hcCBhbmQgYWRkIHRpbGVzIHRoYXQgYXJlIHJlbmRlcmVkIHdpdGgKKyAg
ICAvLyBvdXIgbmV3IGJhY2tpbmdzdG9yZSByZWN0CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0
b3IgdGlsZU1hcEVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gdGlsZU1hcEVuZDsgKytp
dCkgeworICAgICAgICBUaWxlSW5kZXggb2xkSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJh
Y2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOworCisgICAgICAgIC8vIFJlc2V0IHRo
ZSBvbGQgaW5kZXgKKyAgICAgICAgcmVzZXRUaWxlKG9sZEluZGV4LCB0aWxlLCBmYWxzZSAvKnJl
c2V0QmFja2dyb3VuZCovKTsKKworICAgICAgICAvLyBPcmlnaW4gb2YgbGFzdCBjb21taXR0ZWQg
cmVuZGVyIGZvciB0aWxlIGluIHRyYW5zZm9ybWVkIGNvbnRlbnQgY29vcmRpbmF0ZXMKKyAgICAg
ICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mTGFzdFJlbmRlckZvclRpbGUo
b2xkSW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KTsKKworICAgICAgICAvLyBJ
ZiB0aGUgbmV3IGJhY2tpbmcgc3RvcmUgcmVjdCBjb250YWlucyB0aGlzIG9yaWdpbiwgdGhlbiBp
bnNlcnQgdGhlIHRpbGUgdGhlcmUKKyAgICAgICAgLy8gYW5kIG1hcmsgaXQgYXMgbm8gbG9uZ2Vy
IHNoaWZ0ZWQuIE5vdGU6IFBsYXRmb3JtOjpJbnRSZWN0Ojpjb250YWlucyBjaGVja3MgZm9yIGEg
MXgxIHJlY3QKKyAgICAgICAgLy8gYmVsb3cgYW5kIHRvIHRoZSByaWdodCBvZiB0aGUgb3JpZ2lu
IHNvIGl0IGlzIGNvcnJlY3QgdXNhZ2UgaGVyZS4KKyAgICAgICAgaWYgKGJhY2tpbmdTdG9yZVJl
Y3QuY29udGFpbnMob3JpZ2luKSkgeworICAgICAgICAgICAgVGlsZUluZGV4IG5ld0luZGV4ID0g
aW5kZXhPZlRpbGUob3JpZ2luLCBiYWNraW5nU3RvcmVSZWN0KTsKKyAgICAgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IHJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICAgICAgICAgIGlmICht
X3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic1ByZXZpb3VzbHlBdHRlbXB0ZWRCdXROb3RS
ZW5kZXJlZChyZWN0KSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZW5kZXIgcXVldWUg
cHJldmlvdXNseSB0cmllZCB0byByZW5kZXIgdGhpcyB0aWxlLCBidXQgdGhlCisgICAgICAgICAg
ICAgICAgLy8gYmFja2luZ3N0b3JlIHdhc24ndCBpbiB0aGUgY29ycmVjdCBwbGFjZSBvciB0aGUg
dGlsZSB3YXNuJ3QgdmlzaWJsZQorICAgICAgICAgICAgICAgIC8vIGF0IHRoZSB0aW1lIHRoZW4g
d2UgY2FuJ3Qgc2ltcGx5IHJlc3RvcmUgdGhlIHRpbGUgc2luY2UgdGhlIGNvbnRlbnQKKyAgICAg
ICAgICAgICAgICAvLyBpcyBub3cgaW52YWxpZCBhcyBmYXIgYXMgV2ViS2l0IGlzIGNvbmNlcm5l
ZC4gSW5zdGVhZCwgd2UgY2xlYXIKKyAgICAgICAgICAgICAgICAvLyB0aGUgdGlsZSBoZXJlIG9m
IHRoZSByZWdpb24gYW5kIHRoZW4gcHV0IHRoZSB0aWxlIGluIHRoZSByZW5kZXIKKyAgICAgICAg
ICAgICAgICAvLyBxdWV1ZSBhZ2Fpbi4KKworICAgICAgICAgICAgICAgIC8vIEludGVyc2VjdCB0
aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQgcmVnaW9uIHRvIGdldCB0aGUgYXJlYXMKKyAg
ICAgICAgICAgICAgICAvLyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQgdG8gY2xlYXIKKyAgICAg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdpb24g
PSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucyhtX3JlbmRlclF1ZXVl
LT5yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVkUmVnaW9uKCksIHJlY3QpOworICAgICAgICAg
ICAgICAgIGNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24obmV3SW5kZXgsIHRp
bGUsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvbiwgYmFja2luZ1N0b3JlUmVjdCk7CisjaWYgREVCVUdf
QkFDS0lOR1NUT1JFCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9
IHRpbGVOb3RSZW5kZXJlZFJlZ2lvbi5leHRlbnRzKCk7CisgICAgICAgICAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNh
bCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tpbmdTdG9yZVJlY3QgZGlkIGNsZWFyIHRp
bGUgJWQsJWQgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZXh0ZW50cy54KCksIGV4dGVudHMueSgpLCBleHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVpZ2h0
KCkpOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE1h
cmsgYXMgbmVlZGluZyB1cGRhdGUKKyAgICAgICAgICAgICAgICBpZiAoIXRpbGUtPmZyb250QnVm
ZmVyKCktPmlzUmVuZGVyZWQoKQorICAgICAgICAgICAgICAgICAgICAmJiAhaXNDdXJyZW50Vmlz
aWJsZUpvYihuZXdJbmRleCwgdGlsZSwgYmFja2luZ1N0b3JlUmVjdCkpCisgICAgICAgICAgICAg
ICAgICAgIHVwZGF0ZVRpbGUob3JpZ2luLCBmYWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICAgICAg
ICAgIH0KKworICAgICAgICAgICAgLy8gRG8gc29tZSBib29ra2VlcGluZyB3aXRoIHNoaWZ0aW5n
IHRpbGVzLi4uCisgICAgICAgICAgICB0aWxlLT5jbGVhclNoaWZ0KCk7CisgICAgICAgICAgICB0
aWxlLT5zZXRDb21taXR0ZWQodHJ1ZSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpID0gaW5kZXhl
c1RvRmlsbC5maW5kKG5ld0luZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVChpICE9IFdURjo6bm90
Rm91bmQpOworICAgICAgICAgICAgaW5kZXhlc1RvRmlsbC5yZW1vdmUoaSk7CisgICAgICAgICAg
ICB0aWxlcy5hZGQobmV3SW5kZXgsIHRpbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gU3RvcmUgdGhpcyB0aWxlIGFuZCBpbmRleCBzbyB3ZSBjYW4gYWRkIGl0IHRvIHRoZSBy
ZW1haW5pbmcgbGVmdCBvdmVyIHNwb3RzLi4uCisgICAgICAgICAgICBsZWZ0T3ZlclRpbGVzLmFk
ZChvbGRJbmRleCwgdGlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoKGludClp
bmRleGVzVG9GaWxsLnNpemUoKSA9PSBsZWZ0T3ZlclRpbGVzLnNpemUoKSk7CisgICAgc2l6ZV90
IGkgPSAwOworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGxlZnRPdmVyRW5kID0gbGVmdE92
ZXJUaWxlcy5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGVm
dE92ZXJUaWxlcy5iZWdpbigpOyBpdCAhPSBsZWZ0T3ZlckVuZDsgKytpdCkgeworICAgICAgICBU
aWxlSW5kZXggb2xkSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUq
IHRpbGUgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoIShpIDwgaW5kZXhlc1RvRmlsbC5zaXpl
KCkpKSB7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisKKyAgICAgICAgVGlsZUluZGV4IG5ld0luZGV4ID0gaW5kZXhlc1Rv
RmlsbC5hdChpKTsKKworICAgICAgICAvLyBPcmlnaW4gb2YgbGFzdCBjb21taXR0ZWQgcmVuZGVy
IGZvciB0aWxlIGluIHRyYW5zZm9ybWVkIGNvbnRlbnQgY29vcmRpbmF0ZXMKKyAgICAgICAgUGxh
dGZvcm06OkludFBvaW50IG9yaWdpbk9mT2xkID0gb3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShv
bGRJbmRleCwgdGlsZSwgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QpOworICAgICAgICAvLyBPcmln
aW4gb2YgdGhlIG5ldyBpbmRleCBmb3IgdGhlIG5ldyBiYWNraW5nc3RvcmUgcmVjdAorICAgICAg
ICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZOZXcgPSBvcmlnaW5PZlRpbGUobmV3SW5kZXgs
IGJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUK
KyAgICAgICAgdXBkYXRlVGlsZShvcmlnaW5PZk5ldywgZmFsc2UgLyppbW1lZGlhdGUqLyk7CisK
KyAgICAgICAgLy8gRG8gc29tZSBib29ra2VlcGluZyB3aXRoIHNoaWZ0aW5nIHRpbGVzLi4uCisg
ICAgICAgIHRpbGUtPmNsZWFyU2hpZnQoKTsKKyAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKGZh
bHNlKTsKKyAgICAgICAgdGlsZS0+c2V0SG9yaXpvbnRhbFNoaWZ0KChvcmlnaW5PZk9sZC54KCkg
LSBvcmlnaW5PZk5ldy54KCkpIC8gdGlsZVdpZHRoKCkpOworICAgICAgICB0aWxlLT5zZXRWZXJ0
aWNhbFNoaWZ0KChvcmlnaW5PZk9sZC55KCkgLSBvcmlnaW5PZk5ldy55KCkpIC8gdGlsZUhlaWdo
dCgpKTsKKworICAgICAgICB0aWxlcy5hZGQobmV3SW5kZXgsIHRpbGUpOworCisgICAgICAgICsr
aTsKKyAgICB9CisKKyAgICAvLyBDaGVja3MgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbG9zdCBh
bnkgdGlsZXMKKyAgICBBU1NFUlQoY3VycmVudE1hcC5zaXplKCkgPT0gdGlsZXMuc2l6ZSgpKTsK
KworICAgIC8vIEFjdHVhbGx5IHNldCBzdGF0ZQorICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJP
ZlRpbGVzV2lkZShiYWNraW5nU3RvcmVSZWN0LndpZHRoKCkgLyB0aWxlV2lkdGgoKSk7CisgICAg
YmFja1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNIaWdoKGJhY2tpbmdTdG9yZVJlY3QuaGVpZ2h0
KCkgLyB0aWxlSGVpZ2h0KCkpOworICAgIGJhY2tTdGF0ZSgpLT5zZXRCYWNraW5nU3RvcmVPZmZz
ZXQoYmFja2luZ1N0b3JlUmVjdC5sb2NhdGlvbigpKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0VGls
ZU1hcCh0aWxlcyk7CisKKyAgICAvLyBTd2FwIHRoZSBmcm9udC9iYWNrIHN0YXRlCisgICAgc3dh
cFN0YXRlKCk7Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVJbmRleExpc3QgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6aW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgVGlsZUluZGV4TGlzdCBp
bmRleGVzOworICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGJhY2tpbmdTdG9yZVJlY3Qud2lk
dGgoKSAvIHRpbGVXaWR0aCgpOworICAgIGludCBudW1iZXJPZlRpbGVzSGlnaCA9IGJhY2tpbmdT
dG9yZVJlY3QuaGVpZ2h0KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkg
PCBudW1iZXJPZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwg
bnVtYmVyT2ZUaWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4KHgs
IHkpOworICAgICAgICAgICAgaW5kZXhlcy5hcHBlbmQoaW5kZXgpOworICAgICAgICB9CisgICAg
fQorICAgIHJldHVybiBpbmRleGVzOworfQorCitQbGF0Zm9ybTo6SW50UG9pbnQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6b3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmIGlu
ZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3Jp
Z2luT2ZUaWxlKGluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShpbmRleCwgdGlsZSksIGJhY2tpbmdT
dG9yZVJlY3QpOworfQorCitUaWxlSW5kZXggQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW5kZXhPZkxh
c3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUq
IHRpbGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFRpbGVJbmRleChpbmRleC5pKCkgKyB0aWxlLT5o
b3Jpem9udGFsU2hpZnQoKSwgaW5kZXguaigpICsgdGlsZS0+dmVydGljYWxTaGlmdCgpKTsKK30K
KworVGlsZUluZGV4IEJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4T2ZUaWxlKGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25z
dAoreworICAgIGludCBvZmZzZXRYID0gb3JpZ2luLngoKSAtIGJhY2tpbmdTdG9yZVJlY3QueCgp
OworICAgIGludCBvZmZzZXRZID0gb3JpZ2luLnkoKSAtIGJhY2tpbmdTdG9yZVJlY3QueSgpOwor
ICAgIGlmIChvZmZzZXRYKQorICAgICAgICBvZmZzZXRYID0gb2Zmc2V0WCAvIHRpbGVXaWR0aCgp
OworICAgIGlmIChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0gb2Zmc2V0WSAvIHRpbGVIZWln
aHQoKTsKKyAgICByZXR1cm4gVGlsZUluZGV4KG9mZnNldFgsIG9mZnNldFkpOworfQorCit2b2lk
IEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdp
b24oY29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgdGlsZU5vdFJlbmRlcmVkUmVnaW9uLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0LAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJvb2wgdXBkYXRlKQoreworICAgIC8vIEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3Qg
cmVuZGVyZWQgcmVnaW9uIHRvIGdldCB0aGUgYXJlYXMKKyAgICAvLyBvZiB0aGUgdGlsZSB0aGF0
IHdlIG5lZWQgdG8gY2xlYXIKKyAgICBJbnRSZWN0TGlzdCB0aWxlTm90UmVuZGVyZWRSZWdpb25S
ZWN0cyA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgUGxhdGZvcm06OkludFJlY3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCA9IHRpbGVOb3RS
ZW5kZXJlZFJlZ2lvblJlY3RzLmF0KGkpOworICAgICAgICAvLyBDbGVhciB0aGUgcmVuZGVyIHF1
ZXVlIG9mIHRoaXMgcmVjdAorICAgICAgICBtX3JlbmRlclF1ZXVlLT5jbGVhcih0aWxlTm90UmVu
ZGVyZWRSZWdpb25SZWN0LCB0cnVlIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKKworICAg
ICAgICBpZiAodXBkYXRlKSB7CisgICAgICAgICAgICAvLyBBZGQgaXQgYWdhaW4gYXMgYSByZWd1
bGFyIHJlbmRlciBqb2IKKyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVu
ZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpOworICAg
ICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgb3JpZ2luIG9mIHRoaXMgdGlsZQorICAgICAg
ICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gb3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5n
U3RvcmVSZWN0KTsKKworICAgICAgICAvLyBNYXAgdG8gdGlsZSBjb29yZGluYXRlcworICAgICAg
ICB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgp
KTsKKworICAgICAgICAvLyBDbGVhciB0aGUgdGlsZSBvZiB0aGlzIHJlZ2lvbgorICAgICAgICB0
aWxlLT5mcm9udEJ1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3QpOworICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdp
b24odGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7CisgICAgfQorfQorCitib29sIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmlzQ3VycmVudFZpc2libGVKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCwg
QmFja2luZ1N0b3JlVGlsZSogdGlsZSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdT
dG9yZVJlY3QpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHdob2xlIHJlY3Qg
aXMgaW4gdGhlIHF1ZXVlCisgICAgUGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0ID0gUGxhdGZv
cm06OkludFJlY3Qob3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5nU3RvcmVSZWN0KSwgdGlsZVNp
emUoKSk7CisgICAgaWYgKG1fcmVuZGVyUXVldWUtPmlzQ3VycmVudFZpc2libGVTY3JvbGxKb2Io
d2hvbGVSZWN0KSB8fCBtX3JlbmRlclF1ZXVlLT5pc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9iQ29t
cGxldGVkKHdob2xlUmVjdCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gU2Vjb25k
IGNoZWNrIGlmIHRoZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBub24tcmVuZGVyZWQgcmVnaW9u
IGFyZSBpbiB0aGUgcmVndWxhciBxdWV1ZQorICAgIGJvb2wgaXNDdXJyZW50ID0gdHJ1ZTsgLy8g
aXQgaXMgdHJ1ZSB1bnRpbCBpdCBpc24ndCA6KQorCisgICAgSW50UmVjdExpc3QgdGlsZU5vdFJl
bmRlcmVkUmVnaW9uUmVjdHMgPSB0aWxlLT5mcm9udEJ1ZmZlcigpLT5ub3RSZW5kZXJlZFJlZ2lv
bigpLnJlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlTm90UmVuZGVyZWRS
ZWdpb25SZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxl
Tm90UmVuZGVyZWRSZWdpb25SZWN0ID0gdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMuYXQoaSk7
CisgICAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbiBvZiB0aGlzIHRpbGUKKyAgICAgICAgUGxhdGZv
cm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3JlUmVj
dCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVz
CisgICAgICAgIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QubW92ZShvcmlnaW4ueCgpLCBvcmln
aW4ueSgpKTsKKworICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBjdXJyZW50CisgICAgICAgIGlz
Q3VycmVudCA9IG1fcmVuZGVyUXVldWUtPmlzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IodGlsZU5v
dFJlbmRlcmVkUmVnaW9uUmVjdCkgPyBpc0N1cnJlbnQgOiBmYWxzZTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gaXNDdXJyZW50OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbEJh
Y2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKQoreworICAgIGlmICghbV93ZWJQYWdl
LT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7
CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bih0cnVl
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBvdXIgbmV3IHBy
ZWZlcnJlZCBtYXRyaXggZGltZW5zaW9uCisgICAgaWYgKGRlbHRhWCB8fCBkZWx0YVkpCisgICAg
ICAgIG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lvbiA9IGFicyhkZWx0YVgpID4gYWJzKGRl
bHRhWSkgPyBIb3Jpem9udGFsIDogVmVydGljYWw7CisKKyAgICAvLyBDYWxjdWxhdGUgb3VyIHBy
ZWZlcnJlZCBtYXRyaXggZ2VvbWV0cnkKKyAgICBEaXZpc29yIGRpdmlzb3IgPSBiZXN0RGl2aXNv
cihleHBhbmRlZENvbnRlbnRzU2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCksIG1pbmltdW1OdW1iZXJPZlRpbGVz
SGlnaCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkVGls
ZU1hdHJpeERpbWVuc2lvbik7CisKKyNpZiBERUJVR19USUxFTUFUUklYCisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwg
IkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbEJhY2tpbmdTdG9yZSBkaXZpc29yICVkeCVkIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3IuZmlyc3QsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBkaXZpc29yLnNlY29uZCk7CisjZW5kaWYKKworICAgIC8vIEluaXRpYWxp
emUgYSByZWN0IHdpdGggdGhhdCBuZXcgZ2VvbWV0cnkKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBi
YWNraW5nU3RvcmVSZWN0KDAsIDAsIGRpdmlzb3IuZmlyc3QgKiB0aWxlV2lkdGgoKSwgZGl2aXNv
ci5zZWNvbmQgKiB0aWxlSGVpZ2h0KCkpOworCisgICAgLy8gU2Nyb2xsIHRoYXQgcmVjdCBzbyB0
aGF0IGl0IGZpdHMgb3VyIGNvbnRlbnRzIGFuZCB2aWV3cG9ydCBhbmQgc2Nyb2xsIGRlbHRhCisg
ICAgYmFja2luZ1N0b3JlUmVjdCA9IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoZGVsdGFYLCBk
ZWx0YVksIGJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgQVNTRVJUKCFiYWNraW5nU3RvcmVSZWN0
LmlzRW1wdHkoKSk7CisKKyAgICAvLyBTZXQgdGhlIHN0YXRlCisgICAgc2V0QmFja2luZ1N0b3Jl
UmVjdChiYWNraW5nU3RvcmVSZWN0KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpy
ZW5kZXIoY29uc3QgSW50UmVjdExpc3QmIHJlY3RMaXN0LCBib29sIHJlbmRlckNvbnRlbnRPbmx5
KQoreworICAgIC8vIEZJWE1FOiBXZSBjeWNsZSB0aHJvdWdoIG9uZSBieSBvbmUgYW5kIG9ubHkg
YmxpdCB0aGUgY29udGVudHMgYXQgdGhlIGVuZC4KKyAgICAvLyBUaGlzIGNhbiBiZSBpbXByb3Zl
ZCB1cG9uIGlmIHdlIGhhZCBhIG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyB0aGF0
CisgICAgLy8gdG9vayBhIHNldCBvZiByZWN0cyBhbmQgZGVjb21wb3NlZCB0aGVtIGFwcHJvcHJp
YXRlbHkKKyAgICBib29sIHJlbmRlcmVkID0gZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAgICAgcmVuZGVyZWQgPSByZW5kZXIocmVj
dExpc3QuYXQoaSksIHRydWUpID8gdHJ1ZSA6IHJlbmRlcmVkOworCisgICAgaWYgKHJlbmRlcmVk
ICYmICFyZW5kZXJDb250ZW50T25seSkgeworICAgICAgICBpZiAoIXNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGludmFsaWRhdGVXaW5kb3coKTsKKyAgICB9CisKKyAgICBy
ZXR1cm4gcmVuZGVyZWQ7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyRGly
ZWN0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsIGJvb2wgcmVuZGVyQ29u
dGVudE9ubHkpCit7CisgICAgLy8gUmVxdWVzdCBhIGxheW91dCBub3cgd2hpY2ggbWlnaHQgY2hh
bmdlIHRoZSBjb250ZW50cyByZWN0CisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSByZWN0OworICAgIGRpcnR5UmVjdC5pbnRl
cnNlY3QodW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKworICAgIGlmIChkaXJ0eVJl
Y3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCBzY3JlZW5SZWN0ID0gbV9jbGllbnQtPm1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9U
cmFuc2Zvcm1lZFZpZXdwb3J0KGRpcnR5UmVjdCk7CisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0
ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisgICAgY29weVByZXZpb3VzQ29u
dGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKworICAgIHBhaW50RGVmYXVsdEJhY2tncm91
bmQoZGlydHlSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCB0cnVlIC8qZmx1c2gqLyk7CisK
KyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gdW5jbGlwcGVkVmlzaWJsZUNv
bnRlbnRzUmVjdCgpLmxvY2F0aW9uKCk7CisgICAgcmVuZGVyQ29udGVudHMoMCAvKm5vdCBuZWVk
ZWQgc2luY2Ugd2UncmUgZGlyZWN0IHJlbmRlcmluZyB0byB3aW5kb3cqLywKKyAgICAgICAgICAg
ICAgICAgICBvcmlnaW4sIGRpcnR5UmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCkt
PmFkZEJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19TVVJGQUNFCisgICAgaWYgKG1fd2ViUGFn
ZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpICE9IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlKSB7CisgICAgICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IGNsaXBwZWRSZWN0ID0gaW50ZXJzZWN0aW9uKGRpcnR5UmVjdCwgdmlzaWJsZUNv
bnRlbnRzUmVjdCgpKTsKKyAgICAgICAgYmxlbmRDb21wb3NpdGluZ1N1cmZhY2UoY2xpcHBlZFJl
Y3QpOworICAgIH0KKyNlbmRpZgorCisgICAgYm9vbCBzaG91bGRJbnZhbGlkYXRlID0gIW1fc3Vz
cGVuZFNjcmVlblVwZGF0ZXMgJiYgIXJlbmRlckNvbnRlbnRPbmx5OworICAgIGlmICghc2hvdWxk
SW52YWxpZGF0ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpbnZhbGlkYXRlV2luZG93
KHNjcmVlblJlY3QpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnJlbmRlcihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwgYm9vbCByZW5kZXJD
b250ZW50T25seSkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlcXVlc3QgYSBsYXlvdXQgbm93IHdoaWNoIG1pZ2h0
IGNoYW5nZSB0aGUgY29udGVudHMgcmVjdAorICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOwor
CisgICAgaWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHJldHVy
biByZW5kZXJEaXJlY3RUb1dpbmRvdyhyZWN0LCByZW5kZXJDb250ZW50T25seSk7CisKKyAgICBU
aWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1Rp
bGVzKHJlY3QpOworICAgIGlmICh0aWxlUmVjdExpc3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlciByZWN0PSgl
ZCwlZCAlZHglZCksIHJlbmRlckNvbnRlbnRPbmx5PSVzLCBtX3N1c3BlbmRCYWNraW5nU3RvcmVV
cGRhdGVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZW5kZXJDb250ZW50T25seSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID8gInRydWUiIDogImZh
bHNlIik7CisjZW5kaWYKKworICAgIGJvb2wgYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdX
aW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9
PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZTsKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7Cisg
ICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eUNvbnRlbnRzUmVjdDsKKyAgICBib29sIHNob3VsZEJsaXQg
PSAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhcmVuZGVyQ29udGVudE9ubHk7Cisg
ICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJl
Y3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRDb250ZW50
c1NpemUoKSk7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3Qgdmlld3BvcnRSZWN0ID0gUGxh
dGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNm
b3JtZWRWaWV3cG9ydFNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVS
ZWN0TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVS
ZWN0TGlzdFtpXTsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7Cisg
ICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7
CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50TWFwLmdldChpbmRleCk7
CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSB0aWxlIHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRl
cywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRz
IGNvb3JkaW5hdGVzCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IG1hcEZy
b21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisKKyAgICAgICAgLy8gSWYg
d2UncmUgbm90IHlldCBjb21taXR0ZWQsIHRoZW4gY29tbWl0IG5vdyBieSBjbGVhcmluZyB0aGUg
cmVuZGVyZWQgcmVnaW9uCisgICAgICAgIC8vIGFuZCBzZXR0aW5nIHRoZSBjb21taXR0ZWQgZmxh
ZyBhcyB3ZWxsIGFzIGNsZWFyaW5nIHRoZSBzaGlmdAorICAgICAgICBpZiAoIXRpbGUtPmlzQ29t
bWl0dGVkKCkpIHsKKyAgICAgICAgICAgIHRpbGUtPnNldENvbW1pdHRlZCh0cnVlKTsKKyAgICAg
ICAgICAgIHRpbGUtPmZyb250QnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAg
ICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAgICAg
ICAgICAgdGlsZS0+Y2xlYXJTaGlmdCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgdGhl
IHRpbGUgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgd2UgYXJl
IHBhaW50aW5nIG9uIGl0CisgICAgICAgIC8vIHRoZW4gaXQgaGFzbid0IGJlZW4gZ2l2ZW4gYSBk
ZWZhdWx0IGJhY2tncm91bmQgeWV0IHNvIHRoYXQgd2UgY2FuIHNhdmUgdGltZSBkdXJpbmcKKyAg
ICAgICAgLy8gc3RhcnR1cC4gVGhhdCdzIHdoeSB3ZSBhcmUgZG9pbmcgaXQgaGVyZSBpbnN0ZWFk
Li4uCisgICAgICAgIGlmICghdGlsZS0+YmFja2dyb3VuZFBhaW50ZWQoKSkKKyAgICAgICAgICAg
IHRpbGUtPnBhaW50QmFja2dyb3VuZCgpOworCisgICAgICAgIC8vIFBhaW50IGRlZmF1bHQgYmFj
a2dyb3VuZCBpZiBjb250ZW50cyByZWN0IGlzIGVtcHR5CisgICAgICAgIGlmICghZXhwYW5kZWRD
b250ZW50c1JlY3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBz
aG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQgcmVuZGVyIHRoZSBjb250ZW50CisgICAg
ICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGV4cGFuZGVkQ29udGVudHNSZWN0KCkpOworCisg
ICAgICAgICAgICBkaXJ0eVRpbGVSZWN0LmludGVyc2VjdCh0aWxlQ29udGVudHNSZWN0KGluZGV4
LCBleHBhbmRlZENvbnRlbnRzUmVjdCgpLCBjdXJyZW50U3RhdGUpKTsKKworICAgICAgICAgICAg
Ly8gV2UgcHJvYmFibHkgaGF2ZSBleHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVudHMgc2l6ZSBp
cyBzbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgorICAg
ICAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgIH0KKworICAgICAgICBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZh
Y2VPZlRpbGUoZGlydHlUaWxlUmVjdCwgdGlsZSk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIG5hdGl2ZUJ1ZmZlcgorICAgICAgICAgICAgPSB0aWxl
LT5iYWNrQnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpOworCisgICAgICAgIGlmIChibGl0dGluZ0Rp
cmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9s
b2NrKCZtX2JsaXRHZW5lcmF0aW9uTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobV9ibGl0R2Vu
ZXJhdGlvbiA9PSB0aWxlLT5iYWNrQnVmZmVyKCktPmJsaXRHZW5lcmF0aW9uKCkpIHsKKyAgICAg
ICAgICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbV9ibGl0R2VuZXJh
dGlvbkNvbmQsICZtX2JsaXRHZW5lcmF0aW9uTG9jaywgJm1fY3VycmVudEJsaXRFbmQpOworICAg
ICAgICAgICAgICAgIGlmIChlcnIgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgICAg
ICsrbV9ibGl0R2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICAg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAiY29uZF90aW1lZHdhaXQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKyAg
ICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBtb2RpZnkgcmVuZGVyIHRvIHRha2UgYSBWZWN0
b3I8SW50UmVjdD4gcGFyYW1ldGVyIHNvIHdlJ3JlIG5vdCByZWNyZWF0aW5nCisgICAgICAgIC8v
IEdyYXBoaWNzQ29udGV4dCBvbiB0aGUgc3RhY2sgZWFjaCB0aW1lCisgICAgICAgIHJlbmRlckNv
bnRlbnRzKG5hdGl2ZUJ1ZmZlciwgb3JpZ2luT2ZUaWxlKGluZGV4KSwgZGlydHlSZWN0KTsKKwor
ICAgICAgICAvLyBBZGQgdGhlIG5ld2x5IHJlbmRlcmVkIHJlZ2lvbiB0byB0aGUgdGlsZSBzbyBp
dCBjYW4ga2VlcCB0cmFjayBmb3IgYmxpdHMKKyAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5h
ZGRSZW5kZXJlZFJlZ2lvbihkaXJ0eVRpbGVSZWN0KTsKKworICAgICAgICAvLyBDaGVjayBpZiB0
aGUgY29udGVudHMgZm9yIHRoaXMgdGlsZSdzIGJhY2tidWZmZXIgYXJlIHZhbGlkIHdoZW4KKyAg
ICAgICAgLy8gY29tcGFyZWQgdG8gdGhlIGZyb250IGJ1ZmZlcgorICAgICAgICBib29sIGJhY2tC
dWZmZXJJc1ZhbGlkID0gdGlsZS0+YmFja0J1ZmZlcigpLT5pc1JlbmRlcmVkKHRpbGUtPmZyb250
QnVmZmVyKCktPnJlbmRlcmVkUmVnaW9uKCkpOworCisgICAgICAgIC8vIE91ciBjdXJyZW50IGRl
c2lnbiBkZW1hbmRzIHRoYXQgdGhlIGJhY2tidWZmZXIgaXMgdmFsaWQgYWZ0ZXIgYW55CisgICAg
ICAgIC8vIHJlbmRlcmluZyBvcGVyYXRpb24gc28gYXNzZXJ0IHRoYXQgaGVyZS4gSWYgd2UgaGl0
IHRoaXMgYXNzZXJ0IHdlCisgICAgICAgIC8vIGtub3cgdGhhdCB3ZSdyZSBkb2luZyBzb21ldGhp
bmcgYmFkIHRoYXQgd2lsbCByZXN1bHQgaW4gYXJ0aWZhY3RzLgorICAgICAgICBBU1NFUlQoYmFj
a0J1ZmZlcklzVmFsaWQpOworCisgICAgICAgIC8vIFdlIHdpbGwgbmVlZCBhIHN3YXAgaGVyZSBi
ZWNhdXNlIG9mIHRoZSBzaGFyZWQgYmFjayBidWZmZXIKKyAgICAgICAgaWYgKGJhY2tCdWZmZXJJ
c1ZhbGlkKSB7CisgICAgICAgICAgICB0aWxlLT5zd2FwQnVmZmVycygpOworICAgICAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCkt
PnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7CisgICAgICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCkt
PmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpcnR5Q29udGVu
dHNSZWN0ID0gUGxhdGZvcm06OnVuaW9uT2ZSZWN0cyhkaXJ0eUNvbnRlbnRzUmVjdCwgZGlydHlS
ZWN0KTsKKyAgICB9CisKKyAgICAvLyBDbGlwIHRvIHRoZSB2aXNpYmxlIGNvbnRlbnQgaW5jbHVk
aW5nIG92ZXJzY3JvbGwKKyAgICBkaXJ0eUNvbnRlbnRzUmVjdC5pbnRlcnNlY3QodW5jbGlwcGVk
VmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICBpZiAoZGlydHlDb250ZW50c1JlY3QuaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghc2hvdWxkQmxpdCkKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisKKyAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVxdWVzdExheW91dElmTmVl
ZGVkKCkgY29uc3QKK3sKKyAgICBtX3dlYlBhZ2UtPmQtPnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlclZpc2libGVDb250ZW50cyhi
b29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlbmRlclJl
Y3QgPSBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpID8gdmlzaWJsZUNvbnRlbnRzUmVj
dCgpIDogdmlzaWJsZVRpbGVzUmVjdCgpOworCisgICAgcmVuZGVyKHJlbmRlclJlY3QsIHJlbmRl
ckNvbnRlbnRPbmx5KTsKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhcihyZW5kZXJSZWN0LCB0cnVl
IC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2
YXRlOjpyZW5kZXJCYWNraW5nU3RvcmUoYm9vbCByZW5kZXJDb250ZW50T25seSkKK3sKKyAgICBy
ZW5kZXIoZnJvbnRTdGF0ZSgpLT5iYWNraW5nU3RvcmVSZWN0KCksIHJlbmRlckNvbnRlbnRPbmx5
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzKGJv
b2wgZm9yY2UpCit7CisgICAgLy8gQmxpdHRpbmcgbXVzdCBuZXZlciBoYXBwZW4gZm9yIGRpcmVj
dCByZW5kZXJpbmcgY2FzZS4KKyAgICBBU1NFUlQoIXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2lu
ZG93KCkpOworCisgICAgaWYgKG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMpIHsKKyAgICAgICAgLy8g
QXZvaWQgY2xpZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIHVwZGF0ZXMgc3VzcGVuZGVk
CisgICAgICAgIGlmIChmb3JjZSkKKyAgICAgICAgICAgIG1faGFzQmxpdEpvYnMgPSBmYWxzZTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7
CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2Fn
ZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgJkJhY2tpbmdT
dG9yZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMsIHRoaXMsIGZvcmNlKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBibGl0Q29udGVudHMobV93ZWJQYWdlLT5jbGllbnQoKS0+
dXNlckludGVyZmFjZUJsaXR0ZWREZXN0aW5hdGlvblJlY3QoKSwKKyAgICAgICAgICAgICAgICAg
bV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNS
ZWN0KCksCisgICAgICAgICAgICAgICAgIGZvcmNlKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpCit7Cisg
ICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcHJldmlvdXNDb250ZW50c1JlZ2lvbgorICAgICAg
ICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMod2luZG93RnJvbnRC
dWZmZXJTdGF0ZSgpLT5ibGl0dGVkUmVnaW9uKCksIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5i
bGl0dGVkUmVnaW9uKCkpOworCisgICAgaWYgKHByZXZpb3VzQ29udGVudHNSZWdpb24uaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3co
KS0+Y29weUZyb21Gcm9udFRvQmFjayhwcmV2aW91c0NvbnRlbnRzUmVnaW9uKTsKKyAgICB3aW5k
b3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihwcmV2aW91c0NvbnRlbnRzUmVn
aW9uKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50
c1RvQmFja1N1cmZhY2VPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIHByZXZpb3VzQ29udGVudHNSZWdpb24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJl
Z2lvbjo6c3VidHJhY3RSZWdpb25zKHRpbGUtPmZyb250QnVmZmVyKCktPnJlbmRlcmVkUmVnaW9u
KCksIHJlY3QpOworCisgICAgSW50UmVjdExpc3QgcHJldmlvdXNDb250ZW50c1JlY3RzID0gcHJl
dmlvdXNDb250ZW50c1JlZ2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cHJldmlvdXNDb250ZW50c1JlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHByZXZpb3VzQ29udGVudHNSZWN0ID0gcHJldmlvdXNDb250ZW50c1JlY3RzLmF0KGkp
OworICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmFkZFJlbmRlcmVkUmVnaW9uKHByZXZpb3Vz
Q29udGVudHNSZWN0KTsKKworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OmJsaXRUb0J1ZmZlcigKKyAgICAgICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+bmF0aXZlQnVm
ZmVyKCksIHByZXZpb3VzQ29udGVudHNSZWN0LAorICAgICAgICAgICAgdGlsZS0+ZnJvbnRCdWZm
ZXIoKS0+bmF0aXZlQnVmZmVyKCksIHByZXZpb3VzQ29udGVudHNSZWN0KTsKKyAgICB9Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cGFpbnREZWZhdWx0QmFja2dyb3VuZChjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgm
IHRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgZmx1c2gpCit7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29u
dGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBt
X3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworICAgIFBsYXRmb3JtOjpJ
bnRQb2ludCBvcmlnaW4gPSBjb250ZW50cy5sb2NhdGlvbigpOworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGNvbnRlbnRzQ2xpcHBlZCA9IGNvbnRlbnRzOworCisgICAgLy8gV2UgaGF2ZSB0byBwYWlu
dCB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGluIHRoZSBjYXNlIG9mIG92ZXJ6b29tIGFuZAorICAg
IC8vIG1ha2Ugc3VyZSBpdCBpcyBpbnZhbGlkYXRlZC4KKyAgICBDb2xvciBjb2xvcihtX3dlYlBh
Z2UtPnNldHRpbmdzKCktPm92ZXJab29tQ29sb3IoKSk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbiBvdmVyU2Nyb2xsUmVnaW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMoUGxhdGZvcm06OkludFJlY3QoY29udGVudHNDbGlwcGVk
KSwgY29udGVudHNSZWN0KTsKKworICAgIEludFJlY3RMaXN0IG92ZXJTY3JvbGxSZWN0cyA9IG92
ZXJTY3JvbGxSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG92ZXJT
Y3JvbGxSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBvdmVy
U2Nyb2xsUmVjdCA9IG92ZXJTY3JvbGxSZWN0cy5hdChpKTsKKyAgICAgICAgb3ZlclNjcm9sbFJl
Y3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworICAgICAgICBvdmVyU2Nyb2xsUmVj
dCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3Qob3ZlclNjcm9sbFJlY3QpOworCisgICAgICAgIGlm
ICghdHJhbnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAvLyBCZWNhdXNl
IG9mIHJvdW5kaW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgb3ZlclNjcm9sbFJlY3QgY291bGQgYmUg
b2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgICAgIC8vIHRoYW4gdGhlIHN1cmZhY2Ugc2l6ZSBv
ZiB0aGUgd2luZG93LiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAg
ICAgIC8vIGl0IHRvIGVuc3VyZSB0aGF0IGNhbid0IGhhcHBlbi4KKyAgICAgICAgICAgIG92ZXJT
Y3JvbGxSZWN0LmludGVyc2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQo
MCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBjbGVhcldpbmRvdyhvdmVyU2Nyb2xsUmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgY29sb3IucmVkKCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgY29s
b3IuYWxwaGEoKSk7CisgICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRD
b250ZW50cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sK
KyAgICAvLyBCbGl0dGluZyBtdXN0IG5ldmVyIGhhcHBlbiBmb3IgZGlyZWN0IHJlbmRlcmluZyBj
YXNlLgorICAgIC8vIFVzZSBpbnZhbGlkYXRlV2luZG93KCkgaW5zdGVhZC4KKyAgICBBU1NFUlQo
IXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpOworCisgICAgaWYgKCFtX3dlYlBhZ2Ut
PmlzVmlzaWJsZSgpIHx8IG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMgfHwgIWlzQWN0aXZlKCkpIHsK
KyAgICAgICAgLy8gQXZvaWQgY2xpZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIGJsaXQg
aXMgaW1wb3NzaWJsZQorICAgICAgICBpZiAoZm9yY2UpCisgICAgICAgICAgICBtX2hhc0JsaXRK
b2JzID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUJsYWNrQmVy
cnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJl
bnRUaHJlYWQoKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAg
ICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMsIHRoaXMsIGRzdFJlY3QsIHNy
Y1JlY3QsIGZvcmNlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobV9kZWZl
cnNCbGl0ICYmICFmb3JjZSkgeworICAgICAgICBtX2hhc0JsaXRKb2JzID0gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIG1faGFzQmxpdEpvYnMgPSBmYWxzZTsKKworICAgIEJh
Y2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgY29u
c3QgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJlY3QoUGxh
dGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRDb250ZW50c1NpemUo
KSk7CisKKyNpZiBERUJVR19WSVNVQUxJWkUKKyAgICAvLyBTdWJzdGl0dXRlIGEgZGVidWdSZWN0
IHRoYXQgY29uc2lzdHMgb2YgdGhlIHVuaW9uIG9mIHRoZSBiYWNraW5nc3RvcmUgcmVjdAorICAg
IC8vIGFuZCB0aGUgdWkgdGhyZWFkIHZpZXdwb3J0IHJlY3QgaW5zdGVhZCBvZiB0aGUgbm9ybWFs
IHNvdXJjZSByZWN0IHNvIHdlCisgICAgLy8gY2FuIHZpc3VhbGl6ZSB0aGUgZW50aXJlIGJhY2tp
bmdzdG9yZSBhbmQgd2hhdCBpdCBpcyBkb2luZyB3aGVuIHdlCisgICAgLy8gc2Nyb2xsIGFuZCB6
b29tIQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9u
IFdlYkNvcmU6Oi4KKyAgICBXZWJDb3JlOjpJbnRSZWN0IGRlYnVnUmVjdCA9IGN1cnJlbnRTdGF0
ZS0+YmFja2luZ1N0b3JlUmVjdCgpOworICAgIGRlYnVnUmVjdC51bml0ZShtX3dlYlBhZ2UtPmNs
aWVudCgpLT51c2VySW50ZXJmYWNlQmxpdHRlZFZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAg
aWYgKGRlYnVnUmVjdC53aWR0aCgpIDwgZGVidWdSZWN0LmhlaWdodCgpKQorICAgICAgICBkZWJ1
Z1JlY3Quc2V0V2lkdGgoY2VpbChkb3VibGUoc3JjUmVjdC53aWR0aCgpKSAqIChkb3VibGUoZGVi
dWdSZWN0LmhlaWdodCgpKSAvIHNyY1JlY3QuaGVpZ2h0KCkpKSk7CisgICAgaWYgKGRlYnVnUmVj
dC5oZWlnaHQoKSA8IGRlYnVnUmVjdC53aWR0aCgpKQorICAgICAgICBkZWJ1Z1JlY3Quc2V0SGVp
Z2h0KGNlaWwoZG91YmxlKHNyY1JlY3QuaGVpZ2h0KCkpICogKGRvdWJsZShkZWJ1Z1JlY3Qud2lk
dGgoKSkgLyBzcmNSZWN0LndpZHRoKCkpKSk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVu
dHMgPSBkZWJ1Z1JlY3Q7CisjZWxzZQorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzID0g
c3JjUmVjdDsKKyNlbmRpZgorCisgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNp
dGVseSBkZXBlbmQgb24gV2ViQ29yZTo6LgorICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IHRyYW5z
Zm9ybWF0aW9uID0gVHJhbnNmb3JtYXRpb25NYXRyaXg6OnJlY3RUb1JlY3QoCisgICAgICAgIEZs
b2F0UmVjdChGbG9hdFBvaW50KDAuMCwgMC4wKSwgV2ViQ29yZTo6SW50U2l6ZShjb250ZW50cy5z
aXplKCkpKSwgV2ViQ29yZTo6SW50UmVjdChkc3RSZWN0KSk7CisKKyAgICBib29sIGJsaXR0aW5n
RGlyZWN0bHlUb0NvbXBvc2l0aW5nV2luZG93ID0gbV93ZWJQYWdlLT5kLT5tX2NsaWVudC0+d2lu
ZG93KCktPndpbmRvd1VzYWdlKCkgPT0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpX
aW5kb3c6OkdMRVMyVXNhZ2U7CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAg
IEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9zaXRpbmdTdXJmYWNlID0KKyAg
ICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFj
ZSgpOworCisgICAgaWYgKCFibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykKKyAg
ICAgICAgZHJhd1N1YkxheWVycygpOworI2VuZGlmCisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVBy
aXZhdGU6OmJsaXRDb250ZW50cyBkc3RSZWN0PSglZCwlZCAlZHglZCkgc3JjUmVjdD0oJWQsJWQg
JWR4JWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFJlY3QueCgpLCBkc3RSZWN0
LnkoKSwgZHN0UmVjdC53aWR0aCgpLCBkc3RSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc3JjUmVjdC54KCksIHNyY1JlY3QueSgpLCBzcmNSZWN0LndpZHRoKCksIHNy
Y1JlY3QuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2lu
ID0gY29udGVudHMubG9jYXRpb24oKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c0Ns
aXBwZWQgPSBjb250ZW50czsKKworICAgIHBhaW50RGVmYXVsdEJhY2tncm91bmQoY29udGVudHMs
IHRyYW5zZm9ybWF0aW9uLCBmYWxzZSAvKmZsdXNoKi8pOworCisgICAgVGlsZU1hcCBjdXJyZW50
TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICAvLyBEb24ndCBjbGlwIHRvIGNv
bnRlbnRzIGlmIGl0IGlzIGVtcHR5IHNvIHdlIGNhbiBzdGlsbCBwYWludCBkZWZhdWx0IGJhY2tn
cm91bmQKKyAgICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGVu
dHNDbGlwcGVkLmludGVyc2VjdChjb250ZW50c1JlY3QpOworICAgICAgICBpZiAoY29udGVudHND
bGlwcGVkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uIGNvbnRlbnRzUmVnaW9uID0gY29udGVudHNDbGlwcGVkOworICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBiYWNraW5nU3RvcmVSZWdpb24gPSBjdXJyZW50U3RhdGUt
PmJhY2tpbmdTdG9yZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gY2hl
Y2tlcmVkUmVnaW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0
cmFjdFJlZ2lvbnMoY29udGVudHNSZWdpb24sIGJhY2tpbmdTdG9yZVJlZ2lvbik7CisKKyAgICAg
ICAgLy8gQmxpdCBjaGVja2VyZWQgdG8gdGhvc2UgcGFydHMgdGhhdCBhcmUgbm90IGNvdmVyZWQg
YnkgdGhlIGJhY2tpbmdTdG9yZVJlY3QKKyAgICAgICAgSW50UmVjdExpc3QgY2hlY2tlcmVkUmVj
dHMgPSBjaGVja2VyZWRSZWdpb24ucmVjdHMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBjaGVja2VyZWRSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgUGxhdGZvcm06
OkludFJlY3QgZHN0UmVjdCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QoUGxhdGZvcm06OkludFJl
Y3QoCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50KGNoZWNrZXJlZFJlY3RzLmF0
KGkpLngoKSAtIG9yaWdpbi54KCksIGNoZWNrZXJlZFJlY3RzLmF0KGkpLnkoKSAtIG9yaWdpbi55
KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyZWRSZWN0cy5h
dChpKS5zaXplKCkpKTsKKyAgICAgICAgICAgIGNoZWNrZXJXaW5kb3coZHN0UmVjdCwgY2hlY2tl
cmVkUmVjdHMuYXQoaSkubG9jYXRpb24oKSwgdHJhbnNmb3JtYXRpb24uYSgpKTsKKyAgICAgICAg
fQorICAgIH0KKworICAgIFZlY3RvcjxUaWxlQnVmZmVyKj4gYmxpdHRlZFRpbGVzOworCisgICAg
Ly8gR2V0IHRoZSBsaXN0IG9mIHRpbGUgcmVjdHMgdGhhdCBtYWtldXAgdGhlIGNvbnRlbnQKKyAg
ICBUaWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNU
b1RpbGVzKGNvbnRlbnRzQ2xpcHBlZCwgY3VycmVudFN0YXRlKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRpbGVSZWN0TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBUaWxlUmVjdCB0
aWxlUmVjdCA9IHRpbGVSZWN0TGlzdFtpXTsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGls
ZVJlY3QuZmlyc3Q7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB0
aWxlUmVjdC5zZWNvbmQ7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50
TWFwLmdldChpbmRleCk7CisgICAgICAgIFRpbGVCdWZmZXIqIHRpbGVCdWZmZXIgPSB0aWxlLT5m
cm9udEJ1ZmZlcigpOworCisgICAgICAgIC8vIFRoaXMgZGlydHkgcmVjdCBpcyBpbiB0aWxlIGNv
b3JkaW5hdGVzLCBidXQgaXQgbmVlZHMgdG8gYmUgaW4KKyAgICAgICAgLy8gdHJhbnNmb3JtZWQg
Y29udGVudHMgY29vcmRpbmF0ZXMKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0
CisgICAgICAgICAgICA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVj
dCwgY3VycmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIC8vIERvbid0
IGNsaXAgdG8gY29udGVudHMgaWYgaXQgaXMgZW1wdHkgc28gd2UgY2FuIHN0aWxsIHBhaW50IGRl
ZmF1bHQgYmFja2dyb3VuZAorICAgICAgICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6
ZSBhbmQgYmxpdAorICAgICAgICAgICAgZGlydHlSZWN0LmludGVyc2VjdChjb250ZW50c1JlY3Qp
OworCisgICAgICAgICAgICAvLyBXZSBwcm9iYWJseSBoYXZlIGV4dHJhIHRpbGVzIHNpbmNlIHRo
ZSBjb250ZW50cyBzaXplIGlzIHNvIHNtYWxsLgorICAgICAgICAgICAgLy8gU2F2ZSBzb21lIGN5
Y2xlcyBoZXJlLi4uCisgICAgICAgICAgICBpZiAoZGlydHlSZWN0LmlzRW1wdHkoKSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdywgdGhpcyBk
aXJ0eSByZWN0IGlzIGluIHRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZQor
ICAgICAgICAvLyB0cmFuc2Zvcm1lZCBjb250ZW50cywgYnV0IHVsdGltYXRlbHkgaXQgbmVlZHMg
dG8gYmUgdHJhbnNmb3JtZWQKKyAgICAgICAgLy8gY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhl
IHZpZXdwb3J0LgorICAgICAgICBkaXJ0eVJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55
KCkpOworCisgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgorICAgICAgICBpZiAo
ZGlydHlSZWN0LmlzRW1wdHkoKSB8fCBkaXJ0eVRpbGVSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIFRpbGVSZWN0IHdob2xlVGlsZVJlY3Q7CisgICAgICAg
IHdob2xlVGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgd2hvbGVUaWxlUmVjdC5zZWNv
bmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB3aG9sZVJl
Y3QKKyAgICAgICAgICAgID0gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHdob2xl
VGlsZVJlY3QsIGN1cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKKworICAgICAgICBi
b29sIGNvbW1pdHRlZCA9IHRpbGUtPmlzQ29tbWl0dGVkKCk7CisgICAgICAgIGJvb2wgcmVuZGVy
ZWQgPSB0aWxlQnVmZmVyLT5pc1JlbmRlcmVkKGRpcnR5VGlsZVJlY3QpOworICAgICAgICBib29s
IHBhaW50Q2hlY2tlcmVkID0gIWNvbW1pdHRlZCB8fCAhcmVuZGVyZWQ7CisKKyAgICAgICAgaWYg
KHBhaW50Q2hlY2tlcmVkKSB7CisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJl
Y3RUID0gdHJhbnNmb3JtYXRpb24ubWFwUmVjdChkaXJ0eVJlY3QpOworCisgICAgICAgICAgICBp
ZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEJl
Y2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMgcG9zc2libGUgdGhhdCBkaXJ0eVJlY3QgY291bGQgYmUg
b2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSBzdXJmYWNlIHNp
emUgb2YgdGhlIGRzdCBidWZmZXIuIFdlIHByZXZlbnQgdGhpcyBoZXJlLCBieSBjbGFtcGluZwor
ICAgICAgICAgICAgICAgIC8vIGl0IHRvIGVuc3VyZSB0aGF0IGNhbid0IGhhcHBlbi4KKyAgICAg
ICAgICAgICAgICBkaXJ0eVJlY3RULmludGVyc2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9y
bTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNl
U2l6ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50
UG9pbnQgY29udGVudHNPcmlnaW4oZGlydHlSZWN0LngoKSArIG9yaWdpbi54KCksIGRpcnR5UmVj
dC55KCkgKyBvcmlnaW4ueSgpKTsKKyAgICAgICAgICAgIGNoZWNrZXJXaW5kb3coZGlydHlSZWN0
VCwgY29udGVudHNPcmlnaW4sIHRyYW5zZm9ybWF0aW9uLmEoKSk7CisgICAgICAgIH0KKworICAg
ICAgICAvLyBCbGl0IHRoZSB2aXNpYmxlIGJ1ZmZlciBoZXJlIGlmIHdlIGhhdmUgdmlzaWJsZSB6
b29tIGpvYnMKKyAgICAgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9v
bUpvYigpKSB7CisKKyAgICAgICAgICAgIC8vIE5lZWRzIHRvIGJlIGluIHNhbWUgY29vcmRpbmF0
ZSBzeXN0ZW0gYXMgZGlydHlSZWN0CisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNp
YmxlVGlsZUJ1ZmZlclJlY3QgPSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdDsKKyAgICAgICAgICAg
IHZpc2libGVUaWxlQnVmZmVyUmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7CisK
KyAgICAgICAgICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGVUaWxlQnVmZmVyUmVjdAorICAgICAg
ICAgICAgZGlydHlSZWN0LmludGVyc2VjdCh2aXNpYmxlVGlsZUJ1ZmZlclJlY3QpOworCisgICAg
ICAgICAgICAvLyBDbGlwIHRvIHRoZSBkaXJ0eVJlY3QKKyAgICAgICAgICAgIHZpc2libGVUaWxl
QnVmZmVyUmVjdC5pbnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCFkaXJ0
eVJlY3QuaXNFbXB0eSgpICYmICF2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdmlzaWJsZVRpbGVCdWZmZXIKKyAgICAg
ICAgICAgICAgICAgICAgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+dmlzaWJs
ZVRpbGVCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQodmlzaWJsZVRpbGVCdWZmZXIt
PnNpemUoKSA9PSB2aXNpYmxlQ29udGVudHNSZWN0KCkuc2l6ZSgpKTsKKworICAgICAgICAgICAg
ICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgd2l0aCB0aGUgdmlzYmxl
IHRpbGUgYnVmZmVyCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVu
Y2UgPSBvcmlnaW4gLSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAg
ICAgICAgICAgIFBsYXRmb3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRp
ZmZlcmVuY2UueCgpLCBkaWZmZXJlbmNlLnkoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXAg
dG8gdGhlIHZpc2libGVUaWxlQnVmZmVyIGNvb3JkaW5hdGVzCisgICAgICAgICAgICAgICAgUGxh
dGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHZpc2libGVUaWxlQnVmZmVyUmVjdDsKKyAg
ICAgICAgICAgICAgICBkaXJ0eVRpbGVSZWN0Lm1vdmUob2Zmc2V0LndpZHRoKCksIG9mZnNldC5o
ZWlnaHQoKSk7CisKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3RU
ID0gdHJhbnNmb3JtYXRpb24ubWFwUmVjdChkaXJ0eVJlY3QpOworCisgICAgICAgICAgICAgICAg
aWYgKCF0cmFuc2Zvcm1hdGlvbi5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Ly8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBjb3Vs
ZCBiZSBvZmYtYnktb25lIGxhcmdlcgorICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSBz
dXJmYWNlIHNpemUgb2YgdGhlIGRzdCBidWZmZXIuIFdlIHByZXZlbnQgdGhpcyBoZXJlLCBieSBj
bGFtcGluZworICAgICAgICAgICAgICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBo
YXBwZW4uCisgICAgICAgICAgICAgICAgICAgIGRpcnR5UmVjdFQuaW50ZXJzZWN0KFBsYXRmb3Jt
OjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+
d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICAgICBibGl0VG9XaW5kb3coZGlydHlSZWN0VCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdmlzaWJsZVRpbGVCdWZmZXItPmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eVRpbGVSZWN0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmYWxzZSAvKmJsZW5kKi8sIDI1NSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSBpZiAoY29tbWl0dGVkKSB7CisgICAgICAgICAgICAvLyBJbnRlcnNlY3Qg
dGhlIHJlbmRlcmVkIHJlZ2lvbgorICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24g
cmVuZGVyZWRSZWdpb24gPSB0aWxlQnVmZmVyLT5yZW5kZXJlZFJlZ2lvbigpOworICAgICAgICAg
ICAgSW50UmVjdExpc3QgZGlydHlSZW5kZXJlZFJlY3RzID0gcmVuZGVyZWRSZWdpb24ucmVjdHMo
KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlydHlSZW5kZXJlZFJlY3Rz
LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAg
ICAgICAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgICAgICAgICB0aWxl
UmVjdC5zZWNvbmQgPSBpbnRlcnNlY3Rpb24oZGlydHlUaWxlUmVjdCwgZGlydHlSZW5kZXJlZFJl
Y3RzLmF0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVJlY3Quc2Vjb25kLmlzRW1wdHko
KSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8gQmxp
dCB0aGUgcmVuZGVyZWQgcGFydHMKKyAgICAgICAgICAgICAgICBibGl0VGlsZVJlY3QodGlsZUJ1
ZmZlciwgdGlsZVJlY3QsIG9yaWdpbiwgdHJhbnNmb3JtYXRpb24sIGN1cnJlbnRTdGF0ZSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBibGl0dGVkVGlsZXMuYXBwZW5kKHRpbGVCdWZmZXIp
OworICAgICAgICB9CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
ICAgIGlmIChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBX
ZWJDb3JlOjpGbG9hdFJlY3QgY29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJh
bnNmb3JtZWRGbG9hdFJlY3QoCisgICAgICAgICAgICBXZWJDb3JlOjpGbG9hdFJlY3QoV2ViQ29y
ZTo6SW50UmVjdChjb250ZW50cykpKTsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5kcmF3U3ViTGF5
ZXJzKGRzdFJlY3QsIGNvbnRlbnRzUmVjdCk7CisgICAgfSBlbHNlIGlmIChjb21wb3NpdGluZ1N1
cmZhY2UpCisgICAgICAgIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGRzdFJlY3QpOworCisjZW5k
aWYKKworI2lmIEVOQUJMRV9TQ1JPTExCQVJTCisgICAgaWYgKGlzU2Nyb2xsaW5nT3Jab29taW5n
KCkgJiYgbV9jbGllbnQtPmlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgaWYgKG1fY2xpZW50LT5z
Y3JvbGxzSG9yaXpvbnRhbGx5KCkpCisgICAgICAgICAgICBibGl0SG9yaXpvbnRhbFNjcm9sbGJh
cihvcmlnaW4pOworICAgICAgICBpZiAobV9jbGllbnQtPnNjcm9sbHNWZXJ0aWNhbGx5KCkpCisg
ICAgICAgICAgICBibGl0VmVydGljYWxTY3JvbGxiYXIob3JpZ2luKTsKKyAgICB9CisjZW5kaWYK
KworI2lmIERFQlVHX1ZJU1VBTElaRQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhw
bGljaXRlbHkgZGVwZW5kIG9uIFdlYkNvcmU6Oi4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OkJ1ZmZlciogd2luZG93QnVmZmVyID0KKyAgICAgICAgbV93ZWJQYWdlLT5jbGll
bnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6RHJhd2FibGUqIGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpsb2NrQnVmZmVyRHJhd2FibGUod2luZG93QnVmZmVyKTsKKyAgICBQ
bGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPQor
ICAgICAgICBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y3JlYXRlUGxhdGZvcm1H
cmFwaGljc0NvbnRleHQoYnVmZmVyRHJhd2FibGUpOworICAgIEdyYXBoaWNzQ29udGV4dCBncmFw
aGljc0NvbnRleHQoYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworICAgIEZsb2F0UmVj
dCB3a1ZpZXdwb3J0ID0gRmxvYXRSZWN0KHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgRmxv
YXRSZWN0IHVpVmlld3BvcnQgPSBGbG9hdFJlY3QobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlcklu
dGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIHdrVmlld3BvcnQubW92
ZSgtY29udGVudHMueCgpLCAtY29udGVudHMueSgpKTsKKyAgICB1aVZpZXdwb3J0Lm1vdmUoLWNv
bnRlbnRzLngoKSwgLWNvbnRlbnRzLnkoKSk7CisKKyAgICBncmFwaGljc0NvbnRleHQuc2F2ZSgp
OworCisgICAgLy8gRHJhdyBhIGJsdWUgcmVjdCBmb3IgdGhlIHdlYmtpdCB0aHJlYWQgdmlld3Bv
cnQKKyAgICBncmFwaGljc0NvbnRleHQuc2V0U3Ryb2tlQ29sb3IoV2ViQ29yZTo6Q29sb3IoMCwg
MCwgMjU1KSwgV2ViQ29yZTo6Q29sb3JTcGFjZURldmljZVJHQik7CisgICAgZ3JhcGhpY3NDb250
ZXh0LnN0cm9rZVJlY3QodHJhbnNmb3JtYXRpb24ubWFwUmVjdCh3a1ZpZXdwb3J0KSwgMS4wKTsK
KworICAgIC8vIERyYXcgYSByZWQgcmVjdCBmb3IgdGhlIHVpIHRocmVhZCB2aWV3cG9ydAorICAg
IGdyYXBoaWNzQ29udGV4dC5zZXRTdHJva2VDb2xvcihXZWJDb3JlOjpDb2xvcigyNTUsIDAsIDAp
LCBXZWJDb3JlOjpDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBncmFwaGljc0NvbnRleHQuc3Ry
b2tlUmVjdCh0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHVpVmlld3BvcnQpLCAxLjApOworCisgICAg
Z3JhcGhpY3NDb250ZXh0LnJlc3RvcmUoKTsKKworICAgIGRlbGV0ZSBidWZmZXJQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dDsKKyAgICByZWxlYXNlQnVmZmVyRHJhd2FibGUod2luZG93QnVmZmVyKTsK
KyNlbmRpZgorCisgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0KTsKKworICAgIGlmIChibGl0
dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBwdGhyZWFkX211dGV4
X2xvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKworICAgICAgICArK21fYmxpdEdlbmVyYXRp
b247CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYmxpdHRlZFRpbGVzLnNp
emUoKTsgKytpKQorICAgICAgICAgICAgYmxpdHRlZFRpbGVzW2ldLT5zZXRCbGl0R2VuZXJhdGlv
bihtX2JsaXRHZW5lcmF0aW9uKTsKKworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxU
SU1FLCAmbV9jdXJyZW50QmxpdEVuZCk7CisgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZfbnNl
YyArPSAzMCAqIDEwMDAgKiAxMDAwOworICAgICAgICBpZiAobV9jdXJyZW50QmxpdEVuZC50dl9u
c2VjID49IDEwMDAwMDAwMDBMKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRCbGl0RW5kLnR2X3Nl
YyAgKz0gMTsKKyAgICAgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZfbnNlYyAtPSAxMDAwMDAw
MDAwTDsKKyAgICAgICAgfQorCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2JsaXRH
ZW5lcmF0aW9uTG9jayk7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1fYmxpdEdlbmVy
YXRpb25Db25kKTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVBy
aXZhdGU6OmJsaXRUaWxlUmVjdChUaWxlQnVmZmVyKiB0aWxlQnVmZmVyLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGlsZVJlY3QmIHRp
bGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKQoreworICAgIGlmICgh
bV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIFBs
YXRmb3JtOjpJbnRSZWN0KCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0
ID0gdGlsZVJlY3Quc2Vjb25kOworCisgICAgLy8gVGhpcyBkaXJ0eSByZWN0IGlzIGluIHRpbGUg
Y29vcmRpbmF0ZXMsIGJ1dCBpdCBuZWVkcyB0byBiZSBpbgorICAgIC8vIHRyYW5zZm9ybWVkIGNv
bnRlbnRzIGNvb3JkaW5hdGVzCisgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0ID0gbWFw
RnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBzdGF0ZS0+YmFja2luZ1N0
b3JlUmVjdCgpKTsKKworICAgIC8vIE5vdywgdGhpcyBkaXJ0eSByZWN0IGlzIGluIHRyYW5zZm9y
bWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZQorICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRl
bnRzLCBidXQgdWx0aW1hdGVseSBpdCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZAorICAgIC8vIGNv
b3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgICBkaXJ0eVJlY3QubW92ZSgt
b3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworICAgIGRpcnR5UmVjdCA9IG1hdHJpeC5tYXBSZWN0
KGRpcnR5UmVjdCk7CisKKyAgICBpZiAoIW1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAg
Ly8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBjb3Vs
ZCBiZSBvZmYtYnktb25lIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSBzdXJmYWNlIHNpemUg
b2YgdGhlIGRzdCBidWZmZXIuIFdlIHByZXZlbnQgdGhpcyBoZXJlLCBieSBjbGFtcGluZworICAg
ICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgIGRpcnR5UmVj
dC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBt
X3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgIH0KKwor
ICAgIEFTU0VSVCghZGlydHlSZWN0LmlzRW1wdHkoKSk7CisgICAgQVNTRVJUKCFkaXJ0eVRpbGVS
ZWN0LmlzRW1wdHkoKSk7CisgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkgfHwgZGlydHlUaWxl
UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisg
ICAgYmxpdFRvV2luZG93KGRpcnR5UmVjdCwgdGlsZUJ1ZmZlci0+bmF0aXZlQnVmZmVyKCksIGRp
cnR5VGlsZVJlY3QsCisgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxlbmQqLywgMjU1KTsKKyAg
ICByZXR1cm4gZGlydHlSZWN0OworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5H
KQordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGVuZENvbXBvc2l0aW5nU3VyZmFjZShjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCkKK3sKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBs
YXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJl
YWQoKSkgeworICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2lu
Z1N0b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdl
Q2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJhY2tpbmdTdG9yZVBy
aXZhdGUsIFBsYXRmb3JtOjpJbnRSZWN0PigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZhY2UsIHRoaXMsIGRzdFJlY3QpKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKworICAgIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSog
Y29tcG9zaXRpbmdTdXJmYWNlID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQ
b29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpOworCisgICAgaWYgKCFjb21wb3NpdGluZ1N1cmZh
Y2UgfHwgIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFdl
YkNvcmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzID0gbV93
ZWJQYWdlLT5kLT5sYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzLmhvbGVQdW5jaFJlY3RTaXplKCk7IGkrKykg
eworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBob2xlUHVuY2hSZWN0ID0gbGFzdENvbXBvc2l0
aW5nUmVzdWx0cy5ob2xlUHVuY2hSZWN0KGkpOworCisgICAgICAgIGhvbGVQdW5jaFJlY3QuaW50
ZXJzZWN0KGRzdFJlY3QpOworICAgICAgICBob2xlUHVuY2hSZWN0LmludGVyc2VjdChQbGF0Zm9y
bTo6SW50UmVjdCgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQ
YWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKworICAgICAgICBpZiAo
IWhvbGVQdW5jaFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgY2xlYXJXaW5kb3coaG9sZVB1
bmNoUmVjdCwgMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgQ29tcG9zaXRpbmdTdXJmYWNlQnVm
ZmVyKiBmcm9udEJ1ZmZlciA9IGNvbXBvc2l0aW5nU3VyZmFjZS0+ZnJvbnRCdWZmZXIoKTsKKwor
ICAgIEludFJlY3RMaXN0IHJlY3RzID0gbGFzdENvbXBvc2l0aW5nUmVzdWx0cy5kaXJ0eVJlZ2lv
bi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgcmVjdHNbaV0uaW50ZXJzZWN0KGRzdFJlY3QpOworI2lmIERFQlVHX0NPTVBP
U0lUSU5HX0RJUlRZX1JFR0lPTgorICAgICAgICBjbGVhckJ1ZmZlcihtX3dlYlBhZ2UtPmNsaWVu
dCgpLT53aW5kb3coKS0+YnVmZmVyKCksIHJlY3RzW2ldLCAyNTUsIDAsIDAsIDEyOCk7CisjZW5k
aWYKKyAgICAgICAgYmxpdFRvV2luZG93KHJlY3RzW2ldLCBmcm9udEJ1ZmZlci0+bmF0aXZlQnVm
ZmVyKCksIHJlY3RzW2ldLCB0cnVlIC8qYmxlbmQqLywgMjU1KTsKKyAgICB9Cit9CisKK3ZvaWQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJDb21wb3NpdGluZ1N1cmZhY2UoKQoreworICAgIEJh
Y2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9zaXRpbmdTdXJmYWNlID0KKyAgICAg
ICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgp
OworCisgICAgaWYgKCFjb21wb3NpdGluZ1N1cmZhY2UpCisgICAgICAgIHJldHVybjsKKworICAg
IENvbXBvc2l0aW5nU3VyZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGluZ1N1cmZh
Y2UtPmZyb250QnVmZmVyKCk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpj
bGVhckJ1ZmZlcihmcm9udEJ1ZmZlci0+bmF0aXZlQnVmZmVyKCksIFBsYXRmb3JtOjpJbnRSZWN0
KFBsYXRmb3JtOjpJbnRQb2ludCgpLCBmcm9udEJ1ZmZlci0+c3VyZmFjZVNpemUoKSksIDAsIDAs
IDAsIDApOworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0SG9yaXpvbnRhbFNjcm9sbGJhcihjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmIHNjcm9sbFBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdlLT5p
c1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fY2xpZW50LT5zY3Jv
bGxzSG9yaXpvbnRhbGx5KCkpOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd0hvcml6
b250YWxTY3JvbGxiYXIoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmVy
dGljYWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbikK
K3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIEFTU0VSVChtX2NsaWVudC0+c2Nyb2xsc1ZlcnRpY2FsbHkoKSk7CisKKyAgICBtX3dlYlBh
Z2UtPmNsaWVudCgpLT5kcmF3VmVydGljYWxTY3JvbGxiYXIoKTsKK30KKworYm9vbCBCYWNraW5n
U3RvcmVQcml2YXRlOjppc1RpbGVWaXNpYmxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNvbnN0
Cit7CisgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsK
KyAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIHJldHVybiBtYXBG
cm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpLmludGVyc2VjdHModmlzaWJs
ZUNvbnRlbnRzUmVjdCgpKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc1RpbGVW
aXNpYmxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luKSBjb25zdAoreworICAgIHJl
dHVybiBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW4sIHRpbGVTaXplKCkpLmludGVyc2VjdHModmlz
aWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6dmlzaWJsZVRpbGVzUmVjdCgpIGNvbnN0Cit7CisgICAgQmFja2luZ1N0b3JlR2Vv
bWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRN
YXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJl
Y3Q7CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsK
KyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAg
IHRpbGVSZWN0LmZpcnN0ID0gaXQtPmZpcnN0OworICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSB0
aGlzLT50aWxlUmVjdCgpOworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlID0gbWFwRnJv
bVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KTsKKyAgICAgICAgaWYgKHRpbGUu
aW50ZXJzZWN0cyh2aXNpYmxlQ29udGVudHNSZWN0KCkpKQorICAgICAgICAgICAgcmVjdCA9IFBs
YXRmb3JtOjp1bmlvbk9mUmVjdHMocmVjdCwgdGlsZSk7CisgICAgfQorICAgIHJldHVybiByZWN0
OworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlVmlzaWJs
ZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIGlmICgh
aXNUaWxlVmlzaWJsZShpbmRleCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgp
OworCisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIHZpc2libGVDb250ZW50c1Jl
Y3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVV
bmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNvbnN0
Cit7CisgICAgaWYgKCFpc1RpbGVWaXNpYmxlKGluZGV4KSkKKyAgICAgICAgcmV0dXJuIFBsYXRm
b3JtOjpJbnRSZWN0KCk7CisKKyAgICByZXR1cm4gdGlsZUNvbnRlbnRzUmVjdChpbmRleCwgdW5j
bGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cykgY29uc3QKK3sKKyAgICByZXR1cm4g
dGlsZUNvbnRlbnRzUmVjdChpbmRleCwgY29udGVudHMsIGZyb250U3RhdGUoKSk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50c1JlY3QoY29u
c3QgVGlsZUluZGV4JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFj
a2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKSBjb25zdAoreworICAgIFRpbGVSZWN0TGlzdCB0aWxl
UmVjdExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29udGVudHMsIHN0
YXRlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVSZWN0TGlzdC5zaXplKCk7ICsr
aSkgeworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlzdFtpXTsKKyAgICAg
ICAgaWYgKGluZGV4ID09IHRpbGVSZWN0LmZpcnN0KQorICAgICAgICAgICAgcmV0dXJuIHRpbGVS
ZWN0LnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRSZW5kZXJRdWV1ZSgpCit7CisgICAgbV9y
ZW5kZXJRdWV1ZS0+cmVzZXQoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVh
clZpc2libGVab29tKCkKK3sKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhclZpc2libGVab29tKCk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlcyhib29sIHJlc2V0QmFj
a2dyb3VuZCkKK3sKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJv
bnRTdGF0ZSgpOworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1h
cCgpOworCisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQo
KTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIHJlc2V0VGlsZShpdC0+Zmlyc3QsIGl0LT5z
ZWNvbmQsIHJlc2V0QmFja2dyb3VuZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
dXBkYXRlVGlsZXMoYm9vbCB1cGRhdGVWaXNpYmxlLCBib29sIGltbWVkaWF0ZSkKK3sKKyAgICBp
ZiAoIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEJhY2tpbmdTdG9yZUdlb21l
dHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFw
ID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBUaWxlTWFwOjpjb25zdF9pdGVyYXRv
ciBlbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBi
b29sIGlzVmlzaWJsZSA9IGlzVGlsZVZpc2libGUoaXQtPmZpcnN0KTsKKyAgICAgICAgaWYgKCF1
cGRhdGVWaXNpYmxlICYmIGlzVmlzaWJsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAg
ICB1cGRhdGVUaWxlKGl0LT5maXJzdCwgaW1tZWRpYXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVnaW9u
KGJvb2wgY2hlY2tMb2FkaW5nKQoreworICAgIC8vIFRoaXMgbWV0aG9kIGxvb2tzIGF0IGFsbCB0
aGUgdGlsZXMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGJ1dCBub3QgY29tcGxldGVseQorICAg
IC8vIHJlbmRlcmVkIG9yIHdlIGFyZSBsb2FkaW5nLCB0aGVuIGl0IHVwZGF0ZXMgdGhlbS4gRm9y
IGFsbCB0aWxlcywgdmlzaWJsZSBhbmQKKyAgICAvLyBub24tdmlzaWJsZSwgaWYgYSBwcmV2aW91
cyBhdHRlbXB0IHdhcyBtYWRlIHRvIHJlbmRlciB0aGVtIGR1cmluZyBhIHJlZ3VsYXIKKyAgICAv
LyByZW5kZXIgam9iLCBidXQgdGhleSB3ZXJlIG5vdCB2aXNpYmxlIGF0IHRoZSB0aW1lLCB0aGVu
IHVwZGF0ZSB0aGVtIGFuZCBpZgorICAgIC8vIHRoZXkgYXJlIGN1cnJlbnRseSB2aXNpYmxlLCBy
ZXNldCB0aGVtLgorCisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZy
b250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVN
YXAoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gY3VycmVudFN0
YXRlLT5iYWNraW5nU3RvcmVSZWN0KCk7CisKKyAgICBib29sIGlzTG9hZGluZyA9IG1fY2xpZW50
LT5sb2FkU3RhdGUoKSA9PSBXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVkOworICAgIGJvb2wgZm9y
Y2VWaXNpYmxlID0gY2hlY2tMb2FkaW5nICYmIGlzTG9hZGluZzsKKworICAgIFRpbGVNYXA6OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGl0LT5maXJzdDsKKyAgICAgICAgQmFja2luZ1N0
b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgaXNWaXNpYmxlID0gaXNU
aWxlVmlzaWJsZShpbmRleCk7CisgICAgICAgIC8vIFRoZSByZWN0IGluIHRyYW5zZm9ybWVkIGNv
bnRlbnRzIGNvb3JkaW5hdGVzCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3Qob3JpZ2lu
T2ZUaWxlKGluZGV4KSwgdGlsZVNpemUoKSk7CisgICAgICAgIGlmICh0aWxlLT5pc0NvbW1pdHRl
ZCgpCisgICAgICAgICAgICAmJiBtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic1ByZXZp
b3VzbHlBdHRlbXB0ZWRCdXROb3RSZW5kZXJlZChyZWN0KSkgeworICAgICAgICAgICAgLy8gSWYg
dGhlIHJlbmRlciBxdWV1ZSBwcmV2aW91c2x5IHRyaWVkIHRvIHJlbmRlciB0aGlzIHRpbGUsIGJ1
dCB0aGUKKyAgICAgICAgICAgIC8vIHRpbGUgd2Fzbid0IHZpc2libGUgYXQgdGhlIHRpbWUgd2Ug
Y2FuJ3Qgc2ltcGx5IHJlc3RvcmUgdGhlIHRpbGUKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBj
b250ZW50IGlzIG5vdyBpbnZhbGlkIGFzIGZhciBhcyBXZWJLaXQgaXMgY29uY2VybmVkLgorICAg
ICAgICAgICAgLy8gSW5zdGVhZCwgd2UgY2xlYXIgdGhhdCBwYXJ0IG9mIHRoZSB0aWxlIGlmIGl0
IGlzIHZpc2libGUgYW5kIHRoZW4KKyAgICAgICAgICAgIC8vIHB1dCB0aGUgdGlsZSBpbiB0aGUg
cmVuZGVyIHF1ZXVlIGFnYWluLgorICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSkgeworICAgICAg
ICAgICAgICAgIC8vIEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQgcmVn
aW9uIHRvIGdldCB0aGUgYXJlYXMKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGlsZSB0aGF0
IHdlIG5lZWQgdG8gY2xlYXIKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lv
biB0aWxlTm90UmVuZGVyZWRSZWdpb24KKyAgICAgICAgICAgICAgICAgICAgPSBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucygKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJKb2JzTm90UmVuZGVyZWRSZWdpb24oKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgICAgICAgICAgICAgIGNsZWFyQW5kVXBk
YXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZU5vdFJlbmRlcmVkUmVnaW9u
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YmFja2luZ1N0b3JlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGZhbHNlIC8qdXBkYXRlKi8pOworI2lmIERFQlVHX0JBQ0tJTkdTVE9S
RQorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGV4dGVudHMgPSB0aWxlTm90UmVu
ZGVyZWRSZWdpb24uZXh0ZW50cygpOworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsCisgICAgICAg
ICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlc0ZvclNjcm9sbCBk
aWQgY2xlYXIgdGlsZSAlZCwlZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAgIGV4dGVudHMu
eCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53aWR0aCgpLCBleHRlbnRzLmhlaWdodCgpKTsKKyNl
bmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlVGlsZShpbmRleCwgZmFsc2Ug
LyppbW1lZGlhdGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNWaXNpYmxlCisgICAgICAgICAg
ICAmJiAoZm9yY2VWaXNpYmxlIHx8ICF0aWxlLT5mcm9udEJ1ZmZlcigpLT5pc1JlbmRlcmVkKHRp
bGVWaXNpYmxlQ29udGVudHNSZWN0KGluZGV4KSkpCisgICAgICAgICAgICAmJiAhaXNDdXJyZW50
VmlzaWJsZUpvYihpbmRleCwgdGlsZSwgYmFja2luZ1N0b3JlUmVjdCkpCisgICAgICAgICAgICB1
cGRhdGVUaWxlKGluZGV4LCBmYWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICB9Cit9CisKK3ZvaWQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIEJh
Y2tpbmdTdG9yZVRpbGUqIHRpbGUsIGJvb2wgcmVzZXRCYWNrZ3JvdW5kKQoreworICAgIGlmICgh
bV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFpc0Fj
dGl2ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRUaWxlc1doZW5T
aG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRpbGVSZWN0IHRpbGVS
ZWN0OworICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAgdGlsZVJlY3Quc2Vjb25kID0g
dGhpcy0+dGlsZVJlY3QoKTsKKyAgICAvLyBPbmx5IGNsZWFyIHJlZ3VsYXIgcmVuZGVyIGpvYnMg
aWYgd2UncmUgY2xlYXJpbmcgdGhlIGJhY2tncm91bmQgdG9vCisgICAgbV9yZW5kZXJRdWV1ZS0+
Y2xlYXIobWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KSwgcmVzZXRC
YWNrZ3JvdW5kIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKKyAgICBpZiAocmVzZXRCYWNr
Z3JvdW5kKQorICAgICAgICB0aWxlLT5yZXNldCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnVwZGF0ZVRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgYm9vbCBpbW1lZGlhdGUp
Cit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBUaWxlUmVj
dCB0aWxlUmVjdDsKKyAgICB0aWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgIHRpbGVSZWN0LnNl
Y29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgdXBkYXRlUmVj
dCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisgICAgUmVu
ZGVyUXVldWU6OkpvYlR5cGUgam9iVHlwZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpID8gUmVuZGVy
UXVldWU6OlZpc2libGVTY3JvbGwgOiBSZW5kZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9sbDsKKyAg
ICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAvKnJlbmRl
ckNvbnRlbnRPbmx5Ki8pOworICAgIGVsc2UKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9R
dWV1ZShqb2JUeXBlLCB1cGRhdGVSZWN0KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRl
Ojp1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luLCBib29sIGltbWVk
aWF0ZSkKK3sKKyAgICBpZiAoIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IHVwZGF0ZVJlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW4sIHRp
bGVTaXplKCkpOworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBpc1RpbGVWaXNp
YmxlKG9yaWdpbikgPyBSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCA6IFJlbmRlclF1ZXVlOjpO
b25WaXNpYmxlU2Nyb2xsOworICAgIGlmIChpbW1lZGlhdGUpCisgICAgICAgIHJlbmRlcih1cGRh
dGVSZWN0LCB0cnVlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgZWxzZQorICAgICAgICBt
X3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKGpvYlR5cGUsIHVwZGF0ZVJlY3QpOworfQorCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVGlsZXNUb1RyYW5zZm9y
bWVkQ29udGVudHMoY29uc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3QmIHRpbGVSZWN0
KSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMo
dGlsZVJlY3QsIGZyb250U3RhdGUoKS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKK30KKworUGxhdGZv
cm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1l
ZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0JiB0aWxlUmVjdCwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAg
VGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3Qg
cmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKyAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSB0aWxlIGlu
Y2x1ZGluZyB0aGUgYmFja2luZyBzdG9yZSBvZmZzZXQKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50
UG9pbnQgb3JpZ2luT2ZUaWxlID0gdGhpcy0+b3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5nU3Rv
cmVSZWN0KTsKKyAgICByZWN0Lm1vdmUob3JpZ2luT2ZUaWxlLngoKSwgb3JpZ2luT2ZUaWxlLnko
KSk7CisgICAgcmV0dXJuIHJlY3Q7Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0
TGlzdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvQWJz
b2x1dGVUaWxlQm91bmRhcmllcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QK
K3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkgfHwgIWlzQWN0aXZlKCkpIHsKKyAg
ICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBUaWxlUmVjdExpc3Qo
KTsKKyAgICB9CisKKyAgICBUaWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0OworICAgIGludCBmaXJz
dFhPZmZzZXQgPSByZWN0LngoKSAvIHRpbGVXaWR0aCgpOworICAgIGludCBmaXJzdFlPZmZzZXQg
PSByZWN0LnkoKSAvIHRpbGVIZWlnaHQoKTsKKyAgICBpbnQgbGFzdFhPZmZzZXQgPSAocmVjdC5y
aWdodCgpIC0gMSkgLyB0aWxlV2lkdGgoKTsKKyAgICBpbnQgbGFzdFlPZmZzZXQgPSAocmVjdC5i
b3R0b20oKSAtIDEpIC8gdGlsZUhlaWdodCgpOworICAgIGZvciAoaW50IGkgPSBmaXJzdFhPZmZz
ZXQ7IGkgPD0gbGFzdFhPZmZzZXQ7ICsraSkgeworICAgICAgICBmb3IgKGludCBqID0gZmlyc3RZ
T2Zmc2V0OyBqIDw9IGxhc3RZT2Zmc2V0OyArK2opIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBk
c3RYID0gKGkgPT0gZmlyc3RYT2Zmc2V0KSA/IHJlY3QueCgpIDogaSAqIHRpbGVXaWR0aCgpOwor
ICAgICAgICAgICAgY29uc3QgaW50IGRzdFkgPSAoaiA9PSBmaXJzdFlPZmZzZXQpID8gcmVjdC55
KCkgOiBqICogdGlsZUhlaWdodCgpOworICAgICAgICAgICAgY29uc3QgaW50IGRzdFJpZ2h0ID0g
KGkgPT0gbGFzdFhPZmZzZXQpID8gcmVjdC5yaWdodCgpIDogKGkgKyAxKSAqIHRpbGVXaWR0aCgp
OworICAgICAgICAgICAgY29uc3QgaW50IGRzdEJvdHRvbSA9IChqID09IGxhc3RZT2Zmc2V0KSA/
IHJlY3QuYm90dG9tKCkgOiAoaiArIDEpICogdGlsZUhlaWdodCgpOworICAgICAgICAgICAgY29u
c3QgaW50IHNyY1ggPSBkc3RYICUgdGlsZVdpZHRoKCk7CisgICAgICAgICAgICBjb25zdCBpbnQg
c3JjWSA9IGRzdFkgJSB0aWxlSGVpZ2h0KCk7CisgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVj
dDsKKyAgICAgICAgICAgIHRpbGVSZWN0LmZpcnN0ID0gVGlsZUluZGV4KGksIGopOworICAgICAg
ICAgICAgdGlsZVJlY3Quc2Vjb25kID0gUGxhdGZvcm06OkludFJlY3Qoc3JjWCwgc3JjWSwgZHN0
UmlnaHQgLSBkc3RYLCBkc3RCb3R0b20gLSBkc3RZKTsKKyAgICAgICAgICAgIHRpbGVSZWN0TGlz
dC5hcHBlbmQodGlsZVJlY3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0aWxlUmVj
dExpc3Q7Cit9CisKKworQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3RMaXN0IEJhY2tpbmdT
dG9yZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRyYW5zZm9y
bWVkQ29udGVudHNUb1RpbGVzKHJlY3QsIGZyb250U3RhdGUoKSk7Cit9CisKK0JhY2tpbmdTdG9y
ZVByaXZhdGU6OlRpbGVSZWN0TGlzdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNm
b3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsIEJhY2tp
bmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3QKK3sKKyAgICBUaWxlTWFwIHRpbGVNYXAgPSBz
dGF0ZS0+dGlsZU1hcCgpOworCisgICAgVGlsZVJlY3RMaXN0IHRpbGVSZWN0TGlzdDsKKyAgICBU
aWxlTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSB0aWxlTWFwLmVuZCgpOworICAgIGZvciAoVGls
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSB0aWxlTWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJhY2tp
bmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOworCisgICAgICAgIC8vIE5lZWQgdG8gbWFw
IHRoZSByZWN0IHRvIHRpbGUgY29vcmRpbmF0ZXMKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qg
ciA9IHJlY3Q7CisKKyAgICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgdGlsZSBpbmNsdWRpbmcg
dGhlIGJhY2tpbmcgc3RvcmUgb2Zmc2V0CisgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCBvcmlnaW5PZlRpbGUgPSB0aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgsIHN0YXRlLT5iYWNraW5n
U3RvcmVSZWN0KCkpOworCisgICAgICAgIHIubW92ZSgtKG9yaWdpbk9mVGlsZS54KCkpLCAtKG9y
aWdpbk9mVGlsZS55KCkpKTsKKworICAgICAgICAvLyBEbyB3ZSBpbnRlcnNlY3QgdGhlIGN1cnJl
bnQgdGlsZSBvciBubz8KKyAgICAgICAgci5pbnRlcnNlY3QodGlsZS0+cmVjdCgpKTsKKyAgICAg
ICAgaWYgKHIuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8g
SWYgd2UgZG8gYXBwZW5kIHRvIGxpc3QgYW5kIFZvaWxhIQorICAgICAgICBUaWxlUmVjdCB0aWxl
UmVjdDsKKyAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgdGlsZVJlY3Qu
c2Vjb25kID0gcjsKKyAgICAgICAgdGlsZVJlY3RMaXN0LmFwcGVuZCh0aWxlUmVjdCk7CisgICAg
fQorICAgIHJldHVybiB0aWxlUmVjdExpc3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6dXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCkKK3sKKyAgICAvLyBUaGlzIHdpbGwgdXBkYXRl
IHRoZSB0aWxlIG1hdHJpeAorICAgIHNjcm9sbEJhY2tpbmdTdG9yZSgwLCAwKTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjb250ZW50c1NpemVDaGFuZ2VkKGNvbnN0IFBsYXRmb3Jt
OjpJbnRTaXplJikKK3sKKyAgICB1cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQoKTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGxDaGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRQ
b2ludCYpCit7CisgICAgLy8gRklYTUU6IE5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZT8KK30KKwor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjp0cmFuc2Zvcm1DaGFuZ2VkKCkKK3sKKyAgICBpZiAo
IW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghaXNB
Y3RpdmUoKSkgeworICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZXNldCgpOworICAgICAgICBtX3Jl
bmRlclF1ZXVlLT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpWaXNpYmxlWm9vbSwgdmlzaWJsZUNv
bnRlbnRzUmVjdCgpKTsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRTaG91bGRSZXNldFRpbGVz
V2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmFja2luZ1N0
b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1
cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIGJvb2wgaGFzQ3VycmVu
dFZpc2libGVab29tSm9iID0gbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZpc2libGVab29tSm9i
KCk7CisgICAgYm9vbCBpc0xvYWRpbmcgPSBtX2NsaWVudC0+aXNMb2FkaW5nKCk7CisgICAgaWYg
KGlzTG9hZGluZykgeworICAgICAgICBpZiAoIWhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYikKKyAg
ICAgICAgICAgIG1fdmlzaWJsZVRpbGVCdWZmZXJSZWN0ID0gdmlzaWJsZUNvbnRlbnRzUmVjdCgp
OyAvLyBjYWNoZSB0aGlzIGZvciBibGl0VmlzaWJsZUNvbnRlbnRzCisKKyAgICAgICAgLy8gQWRk
IHRoZSBjdXJyZW50bHkgdmlzaWJsZSB0aWxlcyB0byB0aGUgcmVuZGVyIHF1ZXVlIGFzIHZpc2li
bGUgem9vbSBqb2JzCisgICAgICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3QgPSBtYXBGcm9t
VHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXModmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0ID0gdGlsZVJlY3RMaXN0W2ldOworICAgICAgICAg
ICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgICAgICAgICBQbGF0Zm9y
bTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOworICAgICAgICAgICAg
QmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0KGluZGV4KTsKKworICAgICAg
ICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgd2hvbGUgcmVjdAorICAgICAgICAgICAgdGlsZVJlY3Qu
c2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHdob2xlUmVjdCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7
CisgICAgICAgICAgICBtX3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpWaXNp
YmxlWm9vbSwgd2hvbGVSZWN0KTsKKworICAgICAgICAgICAgLy8gQ29weSB0aGUgdmlzaWJsZSBj
b250ZW50cyBpbnRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlciBpZiB3ZSBkb24ndCBoYXZlCisgICAg
ICAgICAgICAvLyBhbnkgY3VycmVudCB2aXNpYmxlIHpvb20gam9icworICAgICAgICAgICAgaWYg
KCFoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IpIHsKKyAgICAgICAgICAgICAgICAvLyBNYXAgdG8g
dGhlIGRlc3RpbmF0aW9uJ3MgY29vcmRpbmF0ZSBzeXN0ZW0KKyAgICAgICAgICAgICAgICBQbGF0
Zm9ybTo6SW50UG9pbnQgZGlmZmVyZW5jZSA9IHRoaXMtPm9yaWdpbk9mVGlsZShpbmRleCkgLSBt
X3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAgICAgICAgICAgIFBsYXRm
b3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRpZmZlcmVuY2UueCgpLCBk
aWZmZXJlbmNlLnkoKSk7CisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlS
ZWN0ID0gZGlydHlUaWxlUmVjdDsKKyAgICAgICAgICAgICAgICBkaXJ0eVJlY3QubW92ZShvZmZz
ZXQud2lkdGgoKSwgb2Zmc2V0LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgIEJhY2tpbmdT
dG9yZVRpbGUqIHZpc2libGVUaWxlQnVmZmVyCisgICAgICAgICAgICAgICAgICAgID0gU3VyZmFj
ZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPnZpc2libGVUaWxlQnVmZmVyKCk7CisgICAgICAg
ICAgICAgICAgQVNTRVJUKHZpc2libGVUaWxlQnVmZmVyLT5zaXplKCkgPT0gUGxhdGZvcm06Oklu
dFNpemUobV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKSk7CisgICAgICAg
ICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIoCisg
ICAgICAgICAgICAgICAgICAgIHZpc2libGVUaWxlQnVmZmVyLT5mcm9udEJ1ZmZlcigpLT5uYXRp
dmVCdWZmZXIoKSwgZGlydHlSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aWxlLT5mcm9udEJ1
ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwgZGlydHlUaWxlUmVjdCk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZXNldCgpOworICAgIHJlc2V0
VGlsZXModHJ1ZSAvKnJlc2V0QmFja2dyb3VuZCovKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpvcmllbnRhdGlvbkNoYW5nZWQoKQoreworICAgIHVwZGF0ZVRpbGVNYXRyaXhJZk5l
ZWRlZCgpOworICAgIGNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7Cit9CisKK3ZvaWQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJ
bnRTaXplJiBzaXplKQoreworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZl
ckZvcldlYlBhZ2UoV2ViUGFnZVByaXZhdGUqIHBhZ2UpCit7CisgICAgQVNTRVJUKHBhZ2UpOwor
ICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNl
UG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplVmlzaWJsZVRpbGVCdWZmZXIocGFn
ZS0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6Y3JlYXRlU3VyZmFjZXMoKQoreworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJy
ZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVu
dFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBBU1NFUlQoY3VycmVudE1hcC5pc0VtcHR5KCkpOwor
CisgICAgaWYgKG1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpIHsKKyAgICAgICAgLy8gVGhpcyBtZXRo
b2QgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiBzZXR0aW5nIHVwIGEgbmV3IHdlYiBw
YWdlIGluc3RhbmNlIGFuZAorICAgICAgICAvLyBiZWZvcmUgc2FpZCBpbnN0YW5jZSBpcyBtYWRl
IHZpc2libGUgc28gYXMgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBkZWZpbml0aW9uIG9mIHdlYgor
ICAgICAgICAvLyBwYWdlIHZpc2liaWxpdHkuIFRoYXQgaXMsIGEgd2ViIHBhZ2UgaXMgc2FpZCB0
byBiZSB2aXNpYmxlIHdoZW4gZXhwbGljaXRseSBtYWRlIHZpc2libGUuCisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgU3VyZmFjZVBv
b2wqIHN1cmZhY2VQb29sID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCk7CisgICAg
c3VyZmFjZVBvb2wtPmluaXRpYWxpemUodGlsZVNpemUoKSk7CisKKyAgICBpZiAoc3VyZmFjZVBv
b2wtPmlzRW1wdHkoKSkgLy8gc2V0dGluZ3Mgc3BlY2lmeSAwIHRpbGVzIC8gbm8gYmFja2luZyBz
dG9yZQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBEaXZpc29yIGRpdmlzb3IgPSBiZXN0
RGl2aXNvcihleHBhbmRlZENvbnRlbnRzU2l6ZSgpLCB0aWxlV2lkdGgoKSwgdGlsZUhlaWdodCgp
LCBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUoKSwgbWluaW11bU51bWJlck9mVGlsZXNIaWdoKCks
IG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lvbik7CisKKyAgICBpbnQgbnVtYmVyT2ZUaWxl
c1dpZGUgPSBkaXZpc29yLmZpcnN0OworICAgIGludCBudW1iZXJPZlRpbGVzSGlnaCA9IGRpdmlz
b3Iuc2Vjb25kOworCisgICAgY29uc3QgU3VyZmFjZVBvb2w6OlRpbGVMaXN0IHRpbGVMaXN0ID0g
c3VyZmFjZVBvb2wtPnRpbGVMaXN0KCk7CisgICAgQVNTRVJUKChpbnQpdGlsZUxpc3Quc2l6ZSgp
ID49IChudW1iZXJPZlRpbGVzV2lkZSAqIG51bWJlck9mVGlsZXNIaWdoKSk7CisKKyAgICBUaWxl
TWFwIHRpbGVzOyAvLyBvdXIgbmV3IHRpbGUgbWFwCisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBu
dW1iZXJPZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVt
YmVyT2ZUaWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4KHgsIHkp
OworICAgICAgICAgICAgdGlsZXMuYWRkKGluZGV4LCB0aWxlTGlzdC5hdCh4ICsgeSAqIG51bWJl
ck9mVGlsZXNXaWRlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdGhlIGluaXRp
YWwgc3RhdGUgb2YgdGhlIGJhY2tpbmdzdG9yZSBnZW9tZXRyeQorICAgIGJhY2tTdGF0ZSgpLT5z
ZXROdW1iZXJPZlRpbGVzV2lkZShkaXZpc29yLmZpcnN0KTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0
TnVtYmVyT2ZUaWxlc0hpZ2goZGl2aXNvci5zZWNvbmQpOworICAgIGJhY2tTdGF0ZSgpLT5zZXRU
aWxlTWFwKHRpbGVzKTsKKworICAgIC8vIFN3YXAgYmFjay9mcm9udCBzdGF0ZQorICAgIHN3YXBT
dGF0ZSgpOworCisgICAgY3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKG1fd2ViUGFn
ZS0+ZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3JlYXRlVmlzaWJsZVRpbGVC
dWZmZXIoKQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQ
YWdlKG1fd2ViUGFnZS0+ZCk7Cit9CisKK1BsYXRmb3JtOjpJbnRQb2ludCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gb3JpZ2luT2ZUaWxlKGluZGV4LCBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJl
Y3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRQb2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmln
aW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRQb2lu
dChiYWNraW5nU3RvcmVSZWN0LngoKSArIChpbmRleC5pKCkgKiB0aWxlV2lkdGgoKSksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVSZWN0LnkoKSArIChpbmRleC5q
KCkgKiB0aWxlSGVpZ2h0KCkpKTsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1pbmlt
dW1OdW1iZXJPZlRpbGVzV2lkZSgpIGNvbnN0Cit7CisgICAgLy8gVGhlIG1pbmltdW0gbnVtYmVy
IG9mIHRpbGVzIHdpZGUgcmVxdWlyZWQgdG8gZmlsbCB0aGUgdmlld3BvcnQgKyAxIHRpbGUgZXh0
cmEgdG8gYWxsb3cgc2Nyb2xsaW5nCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYo
bV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkud2lkdGgoKSAvIHN0YXRpY19jYXN0
PGZsb2F0Pih0aWxlV2lkdGgoKSkpKSArIDE7Cit9CisKK2ludCBCYWNraW5nU3RvcmVQcml2YXRl
OjptaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKSBjb25zdAoreworICAgIC8vIFRoZSBtaW5pbXVt
IG51bWJlciBvZiB0aWxlcyBoaWdoIHJlcXVpcmVkIHRvIGZpbGwgdGhlIHZpZXdwb3J0ICsgMSB0
aWxlIGV4dHJhIHRvIGFsbG93IHNjcm9sbGluZworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+
KGNlaWxmKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpLmhlaWdodCgpIC8gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KHRpbGVIZWlnaHQoKSkpKSArIDE7Cit9CisKK1BsYXRmb3JtOjpJbnRT
aXplIEJhY2tpbmdTdG9yZVByaXZhdGU6OmV4cGFuZGVkQ29udGVudHNTaXplKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkuZXhwYW5kZWRU
byhtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK2ludCBCYWNraW5n
U3RvcmVQcml2YXRlOjp0aWxlV2lkdGgoKQoreworICAgIHN0YXRpYyBpbnQgdHcgPSAwOworICAg
IGlmICghdHcpCisgICAgICAgIHR3ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpT
Y3JlZW46OmxhbmRzY2FwZVdpZHRoKCk7CisgICAgcmV0dXJuIHR3OworfQorCitpbnQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCgpCit7CisgICAgc3RhdGljIGludCB0aCA9IDA7Cisg
ICAgaWYgKCF0aCkKKyAgICAgICAgdGggPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OlNjcmVlbjo6bGFuZHNjYXBlSGVpZ2h0KCk7CisgICAgcmV0dXJuIHRoOworfQorCitQbGF0Zm9y
bTo6SW50U2l6ZSBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlU2l6ZSgpCit7CisgICAgcmV0dXJu
IFBsYXRmb3JtOjpJbnRTaXplKHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCkpOworfQorCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlUmVjdCgpCit7CisgICAgcmV0
dXJuIFBsYXRmb3JtOjpJbnRSZWN0KDAsIDAsIHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCkpOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlckNvbnRlbnRzKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiB0aWxlQnVmZmVyLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHN1cmZh
Y2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50c1JlY3QpIGNvbnN0Cit7CisgICAgLy8gSWYgdGls
ZUJ1ZmZlciA9PSAwLCB3ZSByZW5kZXIgZGlyZWN0bHkgdG8gdGhlIHdpbmRvdy4KKyAgICBpZiAo
IW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkgJiYgdGlsZUJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJDb250ZW50cyB0aWxlQnVmZmVy
PTB4JXggc3VyZmFjZU9mZnNldD0oJWQsJWQpIGNvbnRlbnRzUmVjdD0oJWQsJWQgJWR4JWQpIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVCdWZmZXIsIHN1cmZhY2VPZmZzZXQueCgp
LCBzdXJmYWNlT2Zmc2V0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRz
UmVjdC54KCksIGNvbnRlbnRzUmVjdC55KCksIGNvbnRlbnRzUmVjdC53aWR0aCgpLCBjb250ZW50
c1JlY3QuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICAvLyBJdCBpcyB1cCB0byBjYWxsZXJzIG9m
IHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gbGF5b3V0IHRoZW1zZWx2ZXMhCisgICAgQVNTRVJUKCFt
X3dlYlBhZ2UtPmQtPm1haW5GcmFtZSgpLT52aWV3KCktPm5lZWRzTGF5b3V0KCkpOworCisgICAg
UGxhdGZvcm06OkludFNpemUgY29udGVudHNTaXplID0gbV9jbGllbnQtPmNvbnRlbnRzU2l6ZSgp
OworICAgIENvbG9yIGJhY2tncm91bmRDb2xvcihtX3dlYlBhZ2UtPnNldHRpbmdzKCktPmJhY2tn
cm91bmRDb2xvcigpKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVm
ZmVyKiB0YXJnZXRCdWZmZXIgPSB0aWxlQnVmZmVyCisgICAgICAgID8gdGlsZUJ1ZmZlcgorICAg
ICAgICA6IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKworICAgIGlm
IChjb250ZW50c1NpemUuaXNFbXB0eSgpCisgICAgICAgIHx8ICFQbGF0Zm9ybTo6SW50UmVjdChQ
bGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6
ZSgpKS5jb250YWlucyhjb250ZW50c1JlY3QpCisgICAgICAgIHx8IGJhY2tncm91bmRDb2xvci5o
YXNBbHBoYSgpKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBhcmVhIGlmIGl0J3Mgbm90IGZ1bGx5
IGNvdmVyZWQgYnkgKG9wYXF1ZSkgY29udGVudHMuCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpJbnRSZWN0IGNsZWFyUmVjdCA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0KAor
ICAgICAgICAgICAgY29udGVudHNSZWN0LngoKSAtIHN1cmZhY2VPZmZzZXQueCgpLCBjb250ZW50
c1JlY3QueSgpIC0gc3VyZmFjZU9mZnNldC55KCksCisgICAgICAgICAgICBjb250ZW50c1JlY3Qu
d2lkdGgoKSwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKworICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFyQnVmZmVyKHRhcmdldEJ1ZmZlciwgY2xlYXJSZWN0LAor
ICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLnJlZCgpLCBiYWNrZ3JvdW5kQ29sb3IuZ3JlZW4o
KSwKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5ibHVlKCksIGJhY2tncm91bmRDb2xvci5h
bHBoYSgpKTsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNTaXplLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIG1fd2Vi
UGFnZS0+ZC0+Y29tbWl0Um9vdExheWVySWZOZWVkZWQoKTsKKyNlbmRpZgorCisgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpEcmF3YWJsZSogYnVmZmVyRHJhd2FibGUgPQorICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmxvY2tCdWZmZXJEcmF3YWJsZSh0
YXJnZXRCdWZmZXIpOworCisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGJ1ZmZlclBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0ID0gYnVmZmVyRHJhd2FibGUKKyAgICAgICAgPyBTdXJmYWNlUG9v
bDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQoYnVm
ZmVyRHJhd2FibGUpCisgICAgICAgIDogMDsKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCog
dGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPSBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dAorICAgICAgICA/IGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0CisgICAgICAgIDog
U3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmxvY2tUaWxlUmVuZGVyaW5nU3VyZmFj
ZSgpOworCisgICAgQVNTRVJUKHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KTsKKworICAg
IHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dCh0YXJnZXRQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCk7CisKKyAgICAgICAgLy8gQmVsaWV2ZSBpdCBvciBub3QgdGhpcyBp
cyBpbXBvcnRhbnQgc2luY2UgdGhlIFdlYktpdCBTa2lhIGJhY2tlbmQKKyAgICAgICAgLy8gZG9l
c24ndCBzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgdW5sZXNzIHlvdSBjYWxsIHNhdmUgZmlyc3Qg
OlAKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnNhdmUoKTsKKworICAgICAgICAvLyBUcmFuc2xh
dGUgY29udGV4dCBhY2NvcmRpbmcgdG8gb2Zmc2V0CisgICAgICAgIGdyYXBoaWNzQ29udGV4dC50
cmFuc2xhdGUoLXN1cmZhY2VPZmZzZXQueCgpLCAtc3VyZmFjZU9mZnNldC55KCkpOworCisgICAg
ICAgIC8vIEFkZCBvdXIgdHJhbnNmb3JtYXRpb24gbWF0cml4IGFzIHRoZSBnbG9iYWwgdHJhbnNm
b3JtCisgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZpbmVUcmFuc2Zvcm0oCisgICAgICAgICAg
ICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4KCktPmEoKSwKKyAgICAgICAgICAg
IG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+YigpLAorICAgICAgICAgICAg
bV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLT5jKCksCisgICAgICAgICAgICBt
X3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4KCktPmQoKSwKKyAgICAgICAgICAgIG1f
d2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+ZSgpLAorICAgICAgICAgICAgbV93
ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLT5mKCkpOworICAgICAgICBncmFwaGlj
c0NvbnRleHQuY29uY2F0Q1RNKGFmZmluZVRyYW5zZm9ybSk7CisKKyAgICAgICAgLy8gTm93IHRo
YXQgdGhlIG1hdHJpeCBpcyBhcHBsaWVkIHdlIG5lZWQgdW50cmFuZm9ybWVkIGNvbnRlbnRzIGNv
b3JkaW5hdGVzCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHVudHJhbnNmb3JtZWRDb250ZW50
c1JlY3QgPSBtX3dlYlBhZ2UtPmQtPm1hcEZyb21UcmFuc2Zvcm1lZChjb250ZW50c1JlY3QpOwor
CisgICAgICAgIC8vIFdlIGV4dHJhY3QgZnJvbSB0aGUgY29udGVudHNSZWN0IGJ1dCBkcmF3IGEg
c2xpZ2h0bHkgbGFyZ2VyIHJlZ2lvbiB0aGFuCisgICAgICAgIC8vIHdlIHdlcmUgdG9sZCB0bywg
aW4gb3JkZXIgdG8gYXZvaWQgcGl4ZWxzIGJlaW5nIHJlbmRlcmVkIG9ubHkgcGFydGlhbGx5Lgor
ICAgICAgICBjb25zdCBpbnQgYXRMZWFzdE9uZURldmljZVBpeGVsID0KKyAgICAgICAgICAgIHN0
YXRpY19jYXN0PGludD4oY2VpbGYoMS4wIC8gbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1h
dHJpeCgpLT5hKCkpKTsKKyAgICAgICAgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdC5pbmZsYXRl
KGF0TGVhc3RPbmVEZXZpY2VQaXhlbCwgYXRMZWFzdE9uZURldmljZVBpeGVsKTsKKworICAgICAg
ICAvLyBNYWtlIHN1cmUgdGhlIHVudHJhbnNmb3JtZWQgcmVjdGFuZ2xlIGZvciB0aGUgKHNsaWdo
dGx5IGxhcmdlciB0aGFuCisgICAgICAgIC8vIGluaXRpYWxseSByZXF1ZXN0ZWQpIHJlcGFpbnRl
ZCByZWdpb24gaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHBhZ2UuCisgICAgICAgIHVudHJh
bnNmb3JtZWRDb250ZW50c1JlY3QuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3Jt
OjpJbnRQb2ludCgwLCAwKSwgY29udGVudHNTaXplKSk7CisKKyAgICAgICAgLy8gU29tZSBXZWJL
aXQgcGFpbnRpbmcgYmFja2VuZHMgKmNvdWdoKiBTa2lhICpjb3VnaCogZG9uJ3Qgc2V0IHRoaXMg
YXV0b21hdGljYWxseQorICAgICAgICAvLyB0byB0aGUgZGlydHlSZWN0IHNvIGRvIHNvIGhlcmUg
ZXhwbGljaXRseQorICAgICAgICBncmFwaGljc0NvbnRleHQuY2xpcCh1bnRyYW5zZm9ybWVkQ29u
dGVudHNSZWN0KTsKKworICAgICAgICAvLyBUYWtlIGNhcmUgb2YgcG9zc2libGUgbGVmdCBvdmVy
ZmxvdyBvbiBSVEwgcGFnZS4KKyAgICAgICAgaWYgKGludCBsZWZ0T3ZlckZsb3cgPSBtX2NsaWVu
dC0+ZnJhbWUoKS0+dmlldygpLT5taW5pbXVtU2Nyb2xsUG9zaXRpb24oKS54KCkpIHsKKyAgICAg
ICAgICAgIHVudHJhbnNmb3JtZWRDb250ZW50c1JlY3QubW92ZShsZWZ0T3ZlckZsb3csIDApOwor
ICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnRyYW5zbGF0ZSgtbGVmdE92ZXJGbG93LCAwKTsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIExldCBXZWJDb3JlIHJlbmRlciB0aGUgcGFnZSBjb250
ZW50cyBpbnRvIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICAgIG1fY2xpZW50LT5mcmFtZSgp
LT52aWV3KCktPnBhaW50Q29udGVudHMoJmdyYXBoaWNzQ29udGV4dCwgdW50cmFuc2Zvcm1lZENv
bnRlbnRzUmVjdCk7CisKKyNpZiBFTkFCTEUoSU5TUEVDVE9SKQorICAgICAgICBpZiAobV93ZWJQ
YWdlLT5kLT5tX3BhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZW5hYmxlZCgpKSB7CisgICAg
ICAgICAgICBXZWJDb3JlOjpJbnRQb2ludCBzY3JvbGxQb3NpdGlvbiA9IG1fY2xpZW50LT5mcmFt
ZSgpLT52aWV3KCktPnNjcm9sbFBvc2l0aW9uKCk7CisgICAgICAgICAgICBncmFwaGljc0NvbnRl
eHQudHJhbnNsYXRlKHNjcm9sbFBvc2l0aW9uLngoKSwgc2Nyb2xsUG9zaXRpb24ueSgpKTsKKyAg
ICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmRy
YXdOb2RlSGlnaGxpZ2h0KGdyYXBoaWNzQ29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisg
ICAgICAgIGdyYXBoaWNzQ29udGV4dC5yZXN0b3JlKCk7CisgICAgfQorCisgICAgLy8gR3JhYiB0
aGUgcmVxdWVzdGVkIHJlZ2lvbiBmcm9tIHRoZSBkcmF3aW5nIHN1cmZhY2UgaW50byB0aGUgdGls
ZSBpbWFnZS4KKyNpZiBVU0UoT1BFTlZHKQorICAgIHN1cmZhY2UtPm1ha2VDdXJyZW50KCk7Cisj
ZW5kaWYKKworICAgIGRlbGV0ZSBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDsKKworICAg
IGlmIChidWZmZXJEcmF3YWJsZSkKKyAgICAgICAgcmVsZWFzZUJ1ZmZlckRyYXdhYmxlKHRhcmdl
dEJ1ZmZlcik7CisgICAgZWxzZSB7CisgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCBk
c3RQb2ludChjb250ZW50c1JlY3QueCgpIC0gc3VyZmFjZU9mZnNldC54KCksCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50c1JlY3QueSgpIC0gc3VyZmFj
ZU9mZnNldC55KCkpOworICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCBkc3RSZWN0KGRz
dFBvaW50LCBjb250ZW50c1JlY3Quc2l6ZSgpKTsKKyAgICAgICAgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3Qgc3JjUmVjdCA9IGRzdFJlY3Q7CisKKyAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGly
ZWN0bHkgZHJhdyB0byB0aGUgYnVmZmVyLCBjb3B5IGZyb20gdGhlIGRyYXdpbmcgc3VyZmFjZS4K
KyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPnJlbGVhc2VUaWxlUmVu
ZGVyaW5nU3VyZmFjZSh0YXJnZXRQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCk7CisgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6YmxpdFRvQnVmZmVyKHRhcmdldEJ1ZmZlciwg
ZHN0UmVjdCwgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpkcmF3aW5nU3VyZmFjZSgp
LCBzcmNSZWN0KTsKKyAgICB9Cit9CisKKyNpZiBERUJVR19GQVRfRklOR0VSUworc3RhdGljIHZv
aWQgZHJhd0RlYnVnUmVjdChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciog
ZHN0QnVmZmVyLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIHNyY1JlY3QsIHVuc2lnbmVkIGNoYXIgcmVkLCB1bnNpZ25lZCBjaGFyIGdy
ZWVuLCB1bnNpZ25lZCBjaGFyIGJsdWUpCit7CisgICAgUGxhdGZvcm06OkludFJlY3QgZHJhd1Jl
Y3Qoc3JjUmVjdCk7CisgICAgZHJhd1JlY3QuaW50ZXJzZWN0KGRzdFJlY3QpOworICAgIGlmICgh
ZHJhd1JlY3QuaXNFbXB0eSgpKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OmNsZWFyQnVmZmVyKGRzdEJ1ZmZlciwgZHJhd1JlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIDEy
OCk7Cit9CisjZW5kaWYKKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VG9XaW5kb3co
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1
ZmZlciogc3JjQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBib29sIGJsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciBnbG9iYWxBbHBoYSkKK3sKKyAgICBBU1NFUlQoQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlz
Q3VycmVudFRocmVhZCgpKTsKKworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJC
bGl0dGVkUmVnaW9uKGRzdFJlY3QpOworICAgIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRC
bGl0dGVkUmVnaW9uKGRzdFJlY3QpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5i
dWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsKKyAgICBBU1NFUlQoc3JjQnVmZmVyKTsK
KyAgICBpZiAoIWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwg
Y291bGRuJ3QgYmxpdFRvV2luZG93Iik7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OkJsZW5kTW9kZSBibGVuZE1vZGUgPSBibGVuZAorICAgICAgICA/IEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6U291cmNlT3ZlcgorICAgICAgICA6IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6U291cmNlQ29weTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6YmxpdFRvQnVmZmVyKGRzdEJ1ZmZlciwgZHN0UmVjdCwgc3JjQnVmZmVyLCBz
cmNSZWN0LCBibGVuZE1vZGUsIGdsb2JhbEFscGhhKTsKKworI2lmIERFQlVHX0ZBVF9GSU5HRVJT
CisgICAgZHJhd0RlYnVnUmVjdChkc3RCdWZmZXIsIGRzdFJlY3QsIEZhdEZpbmdlcnM6Om1fZGVi
dWdGYXRGaW5nZXJSZWN0LCAyMTAsIDIxMCwgMjUwKTsKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1
ZmZlciwgZHN0UmVjdCwgUGxhdGZvcm06OkludFJlY3QoRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZp
bmdlckNsaWNrUG9zaXRpb24sIFBsYXRmb3JtOjpJbnRTaXplKDMsIDMpKSwgMCwgMCwgMCk7Cisg
ICAgZHJhd0RlYnVnUmVjdChkc3RCdWZmZXIsIGRzdFJlY3QsIFBsYXRmb3JtOjpJbnRSZWN0KEZh
dEZpbmdlcnM6Om1fZGVidWdGYXRGaW5nZXJBZGp1c3RlZFBvc2l0aW9uLCBQbGF0Zm9ybTo6SW50
U2l6ZSg1LCA1KSksIDEwMCwgMTAwLCAxMDApOworI2VuZGlmCisKK30KKwordm9pZCBCYWNraW5n
U3RvcmVQcml2YXRlOjpjaGVja2VyV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RS
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYgY29udGVudHNPcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZG91YmxlIGNvbnRlbnRzU2NhbGUpCit7CisgICAgQVNTRVJUKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1
cnJlbnRUaHJlYWQoKSk7CisKKyAgICB3aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxp
dHRlZFJlZ2lvbihkc3RSZWN0KTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxp
dHRlZFJlZ2lvbihkc3RSZWN0KTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGlj
czo6QnVmZmVyKiBkc3RCdWZmZXIgPSBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+YnVm
ZmVyKCk7CisgICAgQVNTRVJUKGRzdEJ1ZmZlcik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsV2FybiwgIkVtcHR5IHdpbmRvdyBidWZmZXIsIGNvdWxkbid0IGNoZWNrZXJXaW5kb3ciKTsK
KworICAgIENvbG9yIGNvbG9yKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+YmFja2dyb3VuZENvbG9y
KCkpOworICAgIHVuc2lnbmVkIGNoYXIgYWxwaGEgPSBjb2xvci5hbHBoYSgpOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2hlY2tlckJ1ZmZlcihkc3RCdWZmZXIsIGRzdFJl
Y3QsIGNvbnRlbnRzT3JpZ2luLCBjb250ZW50c1NjYWxlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6aW52YWxpZGF0ZVdpbmRvdygpCit7CisgICAgLy8gR3JhYiBhIHJl
Y3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBjdXJyZW50IHRocmVhZAorICAgIGlmIChCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50
VGhyZWFkKCkpCisgICAgICAgIGludmFsaWRhdGVXaW5kb3cobV93ZWJQYWdlLT5jbGllbnQoKS0+
dXNlckludGVyZmFjZUJsaXR0ZWREZXN0aW5hdGlvblJlY3QoKSk7CisgICAgZWxzZQorICAgICAg
ICBpbnZhbGlkYXRlV2luZG93KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgw
LCAwKSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0JiBkc3QpCit7CisgICAgaWYgKGRzdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdl
Q2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dp
bmRvdygpKSB7CisgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgc3luYyBpbiBvcmRlciB0byBz
d2FwIHRoZSByZWNlbnRseSBkcmF3biB0aGluZy4uLgorICAgICAgICAvLyBUaGlzIHdpbGwgb25s
eSBiZSBjYWxsZWQgZnJvbSBXZWJLaXQgdGhyZWFkIGR1cmluZyBkaXJlY3QgcmVuZGVyaW5nLgor
ICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJp
dmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKyAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCkt
PmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rpb25UeXBlLCBCYWNraW5nU3RvcmVQcml2YXRl
LCBQbGF0Zm9ybTo6SW50UmVjdD4oCisgICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZh
dGU6OmludmFsaWRhdGVXaW5kb3csIHRoaXMsIGRzdCkpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Omxv
ZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVBy
aXZhdGU6OmludmFsaWRhdGVXaW5kb3cgZHN0ID0gJXMiLCBkc3QudG9TdHJpbmcoKS51dGY4KCku
ZGF0YSgpKTsKKyNlbmRpZgorCisgICAgLy8gU2luY2Ugb3VyIHdpbmRvdyBtYXkgYWxzbyBiZSBk
b3VibGUgYnVmZmVyZWQsIHdlIG5lZWQgdG8gYWxzbyBjb3B5IHRoZQorICAgIC8vIGZyb250IGJ1
ZmZlcidzIGNvbnRlbnRzIHRvIHRoZSBiYWNrIGJ1ZmZlciBiZWZvcmUgd2Ugc3dhcCB0aGVtLiBJ
dCBpcworICAgIC8vIGFuYWxvZ291cyB0byB3aGF0IHdlIGRvIHdpdGggb3VyIGRvdWJsZSBidWZm
ZXJlZCB0aWxlcyBieSBjYWxsaW5nCisgICAgLy8gY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tp
bmdTdXJmYWNlT2ZUaWxlKCkuIEl0IG9ubHkgYWZmZWN0cyBwYXJ0aWFsCisgICAgLy8gc2NyZWVu
IHVwZGF0ZXMgc2luY2Ugd2hlbiB3ZSBhcmUgc2Nyb2xsaW5nIG9yIHpvb21pbmcsIHRoZSB3aG9s
ZSB3aW5kb3cKKyAgICAvLyBpcyBpbnZhbGlkYXRlZCBhbnl3YXlzIGFuZCBubyBjb3B5aW5nIGlz
IG5lZWRlZC4KKyAgICBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygp
OworCisgICAgUGxhdGZvcm06OkludFJlY3QgZHN0UmVjdCA9IGRzdDsKKworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IHZpZXdwb3J0UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50
LT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICBkc3RSZWN0LmludGVyc2VjdCh2aWV3
cG9ydFJlY3QpOworCisgICAgaWYgKGRzdFJlY3Qud2lkdGgoKSA8PSAwIHx8IGRzdFJlY3QuaGVp
Z2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3cgcG9zdGlu
ZyA9ICVzIiwgZHN0UmVjdC50b1N0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworI2VuZGlmCisKKyAg
ICBtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyID0gKG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXIg
KyAxKSAlIDI7CisgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnBvc3QoZHN0UmVj
dCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3coKQoreworICAg
IGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xp
ZW50KCktPmlzQ3VycmVudFRocmVhZCgpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRv
dygpKSB7CisgICAgICAgIHR5cGVkZWYgdm9pZCAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5n
U3RvcmVQcml2YXRlOjoqRnVuY3Rpb25UeXBlKSgpOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdl
KAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNz
YWdlPEZ1bmN0aW9uVHlwZSwgQmFja2luZ1N0b3JlUHJpdmF0ZT4oCisgICAgICAgICAgICAgICAg
JkJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93LCB0aGlzKSk7CisgICAgICAgIHJldHVy
bjsKKyAgICB9CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciog
ZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAg
IEFTU0VSVChkc3RCdWZmZXIpOworICAgIGlmICghZHN0QnVmZmVyKQorICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJF
bXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBjbGVhcldpbmRvdyIpOworCisgICAgd2luZG93
RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oKTsKKyAgICB3aW5kb3dCYWNr
QnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAg
ICAgUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3co
KS0+c3VyZmFjZVNpemUoKSkpOworCisgICAgQ29sb3IgY29sb3IobV93ZWJQYWdlLT5zZXR0aW5n
cygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpjbGVhckJ1ZmZlcihkc3RCdWZmZXIsCisgICAgICAgIGNvbG9yLnJlZCgpLCBjb2xvci5n
cmVlbigpLCBjb2xvci5ibHVlKCksIGNvbG9yLmFscGhhKCkpOworfQorCit2b2lkIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmNsZWFyV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJlZCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBncmVl
biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBi
bHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
IGFscGhhKQoreworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpICYmICFzaG91bGREaXJlY3RS
ZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIHR5cGVkZWYgdm9pZCAoQmxhY2tCZXJyeTo6
V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjoqRnVuY3Rpb25UeXBlKShjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVz
c2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxs
TWVzc2FnZTxGdW5jdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVj
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
PigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3csIHRo
aXMsIHJlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVm
ZmVyID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VS
VChkc3RCdWZmZXIpOworICAgIGlmICghZHN0QnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3
aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBjbGVhcldpbmRvdyIpOworCisgICAgd2luZG93RnJvbnRC
dWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24ocmVjdCk7CisgICAgd2luZG93QmFja0J1
ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24ocmVjdCk7CisKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFyQnVmZmVyKGRzdEJ1ZmZlciwgcmVjdCwgcmVkLCBncmVl
biwgYmx1ZSwgYWxwaGEpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmlzU2Nyb2xs
aW5nT3Jab29taW5nKCkgY29uc3QKK3sKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2Nr
ZXIoY29uc3RfY2FzdDxCYWNraW5nU3RvcmVQcml2YXRlKj4odGhpcykpOworICAgIHJldHVybiBt
X2lzU2Nyb2xsaW5nT3Jab29taW5nOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNl
dFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNjcm9sbGluZ09yWm9vbWluZywgYm9vbCBzaG91bGRC
bGl0KQoreworICAgIHsKKyAgICAgICAgQmFja2luZ1N0b3JlTXV0ZXhMb2NrZXIgbG9ja2VyKHRo
aXMpOworICAgICAgICBtX2lzU2Nyb2xsaW5nT3Jab29taW5nID0gc2Nyb2xsaW5nT3Jab29taW5n
OworICAgIH0KKworI2lmICFFTkFCTEVfUkVQQUlOVE9OU0NST0xMCisgICAgbV9zdXNwZW5kUmVu
ZGVySm9icyA9IHNjcm9sbGluZ09yWm9vbWluZzsgLy8gU3VzcGVuZCB0aGUgcmVuZGVyaW5nIG9m
IGV2ZXJ5dGhpbmcKKyNlbmRpZgorCisgICAgaWYgKCFtX3dlYlBhZ2UtPnNldHRpbmdzKCktPnNo
b3VsZFJlbmRlckFuaW1hdGlvbnNPblNjcm9sbE9yWm9vbSgpKQorICAgICAgICBtX3N1c3BlbmRS
ZWd1bGFyUmVuZGVySm9icyA9IHNjcm9sbGluZ09yWm9vbWluZzsgLy8gU3VzcGVuZCB0aGUgcmVu
ZGVyaW5nIG9mIGFuaW1hdGlvbnMKKworICAgIC8vIENsZWFyIHRoaXMgZmxhZyBzaW5jZSB3ZSBk
b24ndCBjYXJlIGlmIHRoZSByZW5kZXIgcXVldWUgaXMgdW5kZXIgcHJlc3N1cmUKKyAgICAvLyBv
ciBub3Qgc2luY2Ugd2UgYXJlIHNjcm9sbGluZyBhbmQgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8g
bm90IGxhZyB0aGFuCisgICAgLy8gaXQgaXMgdG8gZW5zdXJlIGFuaW1hdGlvbnMgYWNoaWV2ZSBi
ZXR0ZXIgZnJhbWVyYXRlcyEKKyAgICBpZiAoc2Nyb2xsaW5nT3Jab29taW5nKQorICAgICAgICBt
X3JlbmRlclF1ZXVlLT5zZXRDdXJyZW50UmVndWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3Vy
ZShmYWxzZSk7CisjaWYgRU5BQkxFX1NDUk9MTEJBUlMKKyAgICBlbHNlIGlmIChzaG91bGRCbGl0
ICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBibGl0VmlzaWJs
ZUNvbnRlbnRzKCk7CisjZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpsb2Nr
QmFja2luZ1N0b3JlKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbXV0ZXgpOworfQor
Cit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVubG9ja0JhY2tpbmdTdG9yZSgpCit7CisgICAg
cHRocmVhZF9tdXRleF91bmxvY2soJm1fbXV0ZXgpOworfQorCitCYWNraW5nU3RvcmVHZW9tZXRy
eSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6ZnJvbnRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHJlaW50ZXJwcmV0X2Nhc3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2Zyb250U3RhdGUpOwor
fQorCitCYWNraW5nU3RvcmVHZW9tZXRyeSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja1N0YXRl
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3RvcmVHZW9t
ZXRyeSo+KG1fYmFja1N0YXRlKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzd2Fw
U3RhdGUoKQoreworI2lmIE9TKFFOWCkKKyAgICAvLyBzdG9yZSB0ZW1wcworICAgIHVuc2lnbmVk
IGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oZnJvbnRTdGF0ZSgpKTsKKyAgICB1
bnNpZ25lZCBiYWNrID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oYmFja1N0YXRlKCkpOwor
CisgICAgLy8gYXRvbWljIGNoYW5nZQorICAgIF9zbXBfeGNoZygmbV9mcm9udFN0YXRlLCBiYWNr
KTsKKyAgICBfc21wX3hjaGcoJm1fYmFja1N0YXRlLCBmcm9udCk7CisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJl
bnRNZXNzYWdlKCk7CisjZWxzZQorI2Vycm9yICJpbXBsZW1lbnQgbWUhIgorI2VuZGlmCit9CisK
K0JhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlKiBCYWNraW5nU3RvcmVQcml2YXRlOjp3aW5k
b3dGcm9udEJ1ZmZlclN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1fd2luZG93QnVmZmVy
U3RhdGVbKG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXIgKyAxKSAlIDJdOworfQorCitCYWNraW5n
U3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93QmFja0J1
ZmZlclN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJm1fd2luZG93QnVmZmVyU3RhdGVbbV9j
dXJyZW50V2luZG93QmFja0J1ZmZlcl07Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmRyYXdTdWJMYXllcnMoKQoreworICAg
IEFTU0VSVChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VD
bGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9zdXNwZW5kQmFja2luZ1N0b3Jl
VXBkYXRlcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUGxhdGZvcm06OkludFJlY3Qg
ZHN0ID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWREZXN0aW5hdGlv
blJlY3QoKTsKKyAgICBpZiAoZHN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgUGxhdGZvcm06OkludFJlY3Qgc3JjID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlcklu
dGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCk7CisgICAgV2ViQ29yZTo6RmxvYXRS
ZWN0IGNvbnRlbnRzUmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRS
ZWN0KAorICAgICAgICBXZWJDb3JlOjpGbG9hdFJlY3QoV2ViQ29yZTo6SW50UmVjdChzcmMpKSk7
CisgICAgcmV0dXJuIG1fd2ViUGFnZS0+ZC0+ZHJhd1N1YkxheWVycyhkc3QsIGNvbnRlbnRzUmVj
dCk7Cit9CisjZW5kaWYKKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc0FjdGl2ZSgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNfY3VycmVudEJhY2tpbmdT
dG9yZU93bmVyID09IG1fd2ViUGFnZSAmJiAhU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29s
KCktPmlzRW1wdHkoKTsKK30KKworQmFja2luZ1N0b3JlOjpCYWNraW5nU3RvcmUoV2ViUGFnZSog
d2ViUGFnZSwgQmFja2luZ1N0b3JlQ2xpZW50KiBjbGllbnQpCisgICAgOiBkKG5ldyBCYWNraW5n
U3RvcmVQcml2YXRlKQoreworICAgIGQtPm1fd2ViUGFnZSA9IHdlYlBhZ2U7CisgICAgZC0+bV9j
bGllbnQgPSBjbGllbnQ7Cit9CisKK0JhY2tpbmdTdG9yZTo6fkJhY2tpbmdTdG9yZSgpCit7Cisg
ICAgZGVsZXRlIGQ7CisgICAgZCA9IDA7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpjcmVhdGVT
dXJmYWNlKCkKK3sKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlm
ICghaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
Ojppbml0aWFsaXplKCk7CisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisKKyNp
ZiBVU0UoT1BFTlZHKQorICAgIGQtPm1fZWdsRGlzcGxheSA9IEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6ZWdsRGlzcGxheSgpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSB1c2lu
ZyBPcGVuVkcKKyAgICBlZ2xCaW5kQVBJKEVHTF9PUEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdM
X05PX0VSUk9SKCk7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpzZXRDdXJyZW50RGlzcGxheShk
LT5tX2VnbERpc3BsYXkpOworI2VuZGlmCisKKyAgICAvLyBUcmlnZ2VycyBjcmVhdGlvbiBvZiBz
dXJmYWNlcyBpbiBiYWNraW5nc3RvcmUKKyAgICBkLT5jcmVhdGVTdXJmYWNlcygpOworCisjaWYg
VVNFKE9QRU5WRykKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpjdXJyZW50KCktPnNoYXJlZFBsYXRm
b3JtU3VyZmFjZSgpLT5tYWtlQ3VycmVudCgpOworI2VuZGlmCisKKyAgICAvLyBGb2N1c2luZyB0
aGUgV2ViUGFnZSB0cmlnZ2VycyBhIHJlcGFpbnQsIHNvIHdoaWxlIHdlIHdhbnQgaXQgdG8gYmUK
KyAgICAvLyBmb2N1c2VkIGluaXRpYWxseSB0aGlzIGhhcyB0byBoYXBwZW4gYWZ0ZXIgY3JlYXRp
b24gb2YgdGhlIHN1cmZhY2UuCisgICAgZC0+bV93ZWJQYWdlLT5zZXRGb2N1c2VkKHRydWUpOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZTo6c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0
ZXMoKQoreworICAgIGQtPnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVz
KFJlc3VtZVVwZGF0ZU9wZXJhdGlvbiBvcCkKK3sKKyAgICBkLT5yZXN1bWVTY3JlZW5BbmRCYWNr
aW5nU3RvcmVVcGRhdGVzKG9wKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmU6OmlzU2Nyb2xsaW5n
T3Jab29taW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+aXNTY3JvbGxpbmdPclpvb21pbmco
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNldFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNj
cm9sbGluZ09yWm9vbWluZykKK3sKKyAgICBkLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoc2Nyb2xs
aW5nT3Jab29taW5nKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OmJsaXRDb250ZW50cyhjb25z
dCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzKQoreworICAgIC8vIEJsaXR0aW5nIGR1cmlu
ZyBkaXJlY3QgcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICBpZiAoaXNEaXJlY3RSZW5k
ZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIkJhY2tpbmdTdG9yZTo6YmxpdENvbnRlbnRzIG9wZXJhdGlvbiBub3Qgc3Vw
cG9ydGVkIGluIGRpcmVjdCByZW5kZXJpbmcgbW9kZSIpOworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgZC0+YmxpdENvbnRlbnRzKGRzdFJlY3QsIGNvbnRlbnRzKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmU6OnJlcGFpbnQoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRlbnRDaGFuZ2VkLCBib29sIGlt
bWVkaWF0ZSkKK3sKKyAgICBkLT5yZXBhaW50KFBsYXRmb3JtOjpJbnRSZWN0KHgsIHksIHdpZHRo
LCBoZWlnaHQpLCBjb250ZW50Q2hhbmdlZCwgaW1tZWRpYXRlKTsKK30KKworYm9vbCBCYWNraW5n
U3RvcmU6Omhhc1JlbmRlckpvYnMoKSBjb25zdAoreworICAgIHJldHVybiBkLT5zaG91bGRQZXJm
b3JtUmVuZGVySm9icygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6cmVuZGVyT25JZGxlKCkK
K3sKKyAgICBkLT5yZW5kZXJPbklkbGUoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmU6OmlzRGly
ZWN0UmVuZGVyaW5nVG9XaW5kb3coKSBjb25zdAoreworICAgIEJhY2tpbmdTdG9yZU11dGV4TG9j
a2VyIGxvY2tlcihkKTsKKyAgICByZXR1cm4gZC0+c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5k
b3coKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmU6OmRlZmVyc0JsaXQoKSBjb25zdAoreworICAg
ICAgICByZXR1cm4gZC0+bV9kZWZlcnNCbGl0OworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6c2V0
RGVmZXJzQmxpdChib29sIGIpCit7CisgICAgICAgIGQtPm1fZGVmZXJzQmxpdCA9IGI7Cit9CisK
K2Jvb2wgQmFja2luZ1N0b3JlOjpoYXNCbGl0Sm9icygpIGNvbnN0Cit7CisgICAgLy8gTm9ybWFs
bHksIHRoaXMgd291bGQgYmUgY2FsbGVkIGZyb20gdGhlIGNvbXBvc2l0aW5nIHRocmVhZCwKKyAg
ICAvLyBhbmQgdGhlIGZsYWcgaXMgc2V0IG9uIHRoZSBjb21wb3NpdGluZyB0aHJlYWQsIHNvIG5v
IG5lZWQgZm9yCisgICAgLy8gc3luY2hyb25pemF0aW9uLgorICAgIHJldHVybiBkLT5tX2hhc0Js
aXRKb2JzOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6YmxpdE9uSWRsZSgpCit7CisgICAgZC0+
YmxpdFZpc2libGVDb250ZW50cyh0cnVlIC8qIGZvcmNlICovKTsKK30KKworfQorfQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaCBiL1NvdXJj
ZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uYjIxM2RiMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmgKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIEJh
Y2tpbmdTdG9yZV9oCisjZGVmaW5lIEJhY2tpbmdTdG9yZV9oCisKKyNpbmNsdWRlICJCbGFja0Jl
cnJ5R2xvYmFsLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HcmFwaGljcy5oPgor
I2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybVByaW1pdGl2ZXMuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworY2xhc3MgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEZsb2F0UG9pbnQ7
CitjbGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBHTEVTMkNvbnRleHQ7
CitjbGFzcyBJbnRSZWN0OworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2Ug
V2ViS2l0IHsKKworY2xhc3MgV2ViUGFnZTsKK2NsYXNzIFdlYlBhZ2VQcml2YXRlOworY2xhc3Mg
QmFja2luZ1N0b3JlUHJpdmF0ZTsKK2NsYXNzIEJhY2tpbmdTdG9yZUNsaWVudDsKKworY2xhc3Mg
QkxBQ0tCRVJSWV9FWFBPUlQgQmFja2luZ1N0b3JlIHsKK3B1YmxpYzoKKyAgICBlbnVtIFJlc3Vt
ZVVwZGF0ZU9wZXJhdGlvbiB7IE5vbmUsIEJsaXQsIFJlbmRlckFuZEJsaXQgfTsKKyAgICBCYWNr
aW5nU3RvcmUoV2ViUGFnZSosIEJhY2tpbmdTdG9yZUNsaWVudCopOworICAgIHZpcnR1YWwgfkJh
Y2tpbmdTdG9yZSgpOworCisgICAgdm9pZCBjcmVhdGVTdXJmYWNlKCk7CisKKyAgICB2b2lkIHN1
c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7CisgICAgdm9pZCByZXN1bWVTY3Jl
ZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKFJlc3VtZVVwZGF0ZU9wZXJhdGlvbik7CisKKyAgICBi
b29sIGlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTY3JvbGxpbmdP
clpvb21pbmcoYm9vbCk7CisKKyAgICB2b2lkIGJsaXRDb250ZW50cyhjb25zdCBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFJlY3QmIGNvbnRlbnRzKTsKKyAgICB2b2lkIHJlcGFpbnQoaW50IHgsIGludCB5LCBpbnQg
d2lkdGgsIGludCBoZWlnaHQsIGJvb2wgY29udGVudENoYW5nZWQsIGJvb2wgaW1tZWRpYXRlKTsK
KworICAgIGJvb2wgaGFzUmVuZGVySm9icygpIGNvbnN0OworICAgIHZvaWQgcmVuZGVyT25JZGxl
KCk7CisKKyAgICAvLyBJbiB0aGUgZGVmZXJzIGJsaXQgbW9kZSwgYW55IGJsaXQgcmVxdWVzdHMg
d2lsbCBqdXN0IHJldHVybiBlYXJseSwgYW5kCisgICAgLy8gYSBibGl0IGpvYiB3aWxsIGJlIHF1
ZXVlZCB0aGF0IGlzIGV4ZWN1dGVkIGJ5IGNhbGxpbmcgYmxpdE9uSWRsZSgpLgorICAgIGJvb2wg
ZGVmZXJzQmxpdCgpIGNvbnN0OworICAgIHZvaWQgc2V0RGVmZXJzQmxpdChib29sKTsKKworICAg
IGJvb2wgaGFzQmxpdEpvYnMoKSBjb25zdDsKKyAgICB2b2lkIGJsaXRPbklkbGUoKTsKKworICAg
IGJvb2wgaXNEaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpIGNvbnN0OworCitwcml2YXRlOgorICAg
IGZyaWVuZCBjbGFzcyBCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZUNsaWVudDsKKyAg
ICBmcmllbmQgY2xhc3MgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlOworICAgIGZyaWVuZCBj
bGFzcyBCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2VQcml2YXRlOyAvLyBGSVhNRTogRm9yIG5v
dywgd2UgZXhwb3NlIG91ciBpbnRlcm5hbHMgdG8gV2ViUGFnZVByaXZhdGUuIFNlZSBQUiAjMTIw
MzAxLgorICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpDaHJvbWVDbGllbnRCbGFja0JlcnJ5Owor
ICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7Cisg
ICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkdMRVMyQ29udGV4dDsKKyAgICBCYWNraW5nU3RvcmVQ
cml2YXRlICpkOworfTsKK30KK30KKworI2VuZGlmIC8vIEJhY2tpbmdTdG9yZV9oCmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmggYi9Tb3Vy
Y2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmgKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5YTdlMAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaApAQCAtMCwwICsxLDM1NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24g
TGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVz
c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVi
bGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRv
IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJl
ZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZu
ZGVmIEJhY2tpbmdTdG9yZV9wX2gKKyNkZWZpbmUgQmFja2luZ1N0b3JlX3BfaAorCisjaW5jbHVk
ZSAiQmFja2luZ1N0b3JlLmgiCisjaW5jbHVkZSAiUmVuZGVyUXVldWUuaCIKKyNpbmNsdWRlICJU
aWxlSW5kZXguaCIKKyNpbmNsdWRlICJUaWxlSW5kZXhIYXNoLmgiCisjaW5jbHVkZSAiVGltZXIu
aCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8
QmxhY2tCZXJyeVBsYXRmb3JtR3VhcmRlZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1h
cC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworI2lmIFVTRShPUEVOVkcpCisjaW5jbHVk
ZSA8ZWdsLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworY2xhc3MgSW50UmVjdDsKK2NsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4OworfQor
CituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgQmFj
a2luZ1N0b3JlVGlsZTsKK2NsYXNzIFRpbGVCdWZmZXI7CitjbGFzcyBXZWJQYWdlOworY2xhc3Mg
QmFja2luZ1N0b3JlQ2xpZW50OworCit0eXBlZGVmIFdURjo6SGFzaE1hcDxUaWxlSW5kZXgsIEJh
Y2tpbmdTdG9yZVRpbGUqPiBUaWxlTWFwOworY2xhc3MgQmFja2luZ1N0b3JlR2VvbWV0cnkgewor
cHVibGljOgorICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KCkKKyAgICAgICAgOiBtX251bWJlck9m
VGlsZXNXaWRlKDApCisgICAgICAgICwgbV9udW1iZXJPZlRpbGVzSGlnaCgwKQorICAgIHsKKyAg
ICB9CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0KCkgY29uc3Q7Cisg
ICAgUGxhdGZvcm06OkludFNpemUgYmFja2luZ1N0b3JlU2l6ZSgpIGNvbnN0OworCisgICAgaW50
IG51bWJlck9mVGlsZXNXaWRlKCkgY29uc3QgeyByZXR1cm4gbV9udW1iZXJPZlRpbGVzV2lkZTsg
fQorICAgIHZvaWQgc2V0TnVtYmVyT2ZUaWxlc1dpZGUoaW50IG51bWJlck9mVGlsZXNXaWRlKSB7
IG1fbnVtYmVyT2ZUaWxlc1dpZGUgPSBudW1iZXJPZlRpbGVzV2lkZTsgfQorICAgIGludCBudW1i
ZXJPZlRpbGVzSGlnaCgpIGNvbnN0IHsgcmV0dXJuIG1fbnVtYmVyT2ZUaWxlc0hpZ2g7IH0KKyAg
ICB2b2lkIHNldE51bWJlck9mVGlsZXNIaWdoKGludCBudW1iZXJPZlRpbGVzSGlnaCkgeyBtX251
bWJlck9mVGlsZXNIaWdoID0gbnVtYmVyT2ZUaWxlc0hpZ2g7IH0KKyAgICBQbGF0Zm9ybTo6SW50
UG9pbnQgYmFja2luZ1N0b3JlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9iYWNraW5nU3RvcmVP
ZmZzZXQ7IH0KKyAgICB2b2lkIHNldEJhY2tpbmdTdG9yZU9mZnNldChjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIG9mZnNldCkgeyBtX2JhY2tpbmdTdG9yZU9mZnNldCA9IG9mZnNldDsgfQorICAg
IEJhY2tpbmdTdG9yZVRpbGUqIHRpbGVBdChUaWxlSW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJu
IG1fdGlsZU1hcC5nZXQoaW5kZXgpOyB9CisgICAgY29uc3QgVGlsZU1hcCYgdGlsZU1hcCgpIGNv
bnN0IHsgcmV0dXJuIG1fdGlsZU1hcDsgfQorICAgIHZvaWQgc2V0VGlsZU1hcChjb25zdCBUaWxl
TWFwJiB0aWxlTWFwKSB7IG1fdGlsZU1hcCA9IHRpbGVNYXA7IH0KKworICBwcml2YXRlOgorICAg
IGludCBtX251bWJlck9mVGlsZXNXaWRlOworICAgIGludCBtX251bWJlck9mVGlsZXNIaWdoOwor
ICAgIFBsYXRmb3JtOjpJbnRQb2ludCBtX2JhY2tpbmdTdG9yZU9mZnNldDsKKyAgICBUaWxlTWFw
IG1fdGlsZU1hcDsKK307CisKK2NsYXNzIEJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlIHsK
K3B1YmxpYzoKKyAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBibGl0dGVkUmVnaW9uKCkgY29u
c3QgeyByZXR1cm4gbV9ibGl0dGVkUmVnaW9uOyB9CisgICAgdm9pZCBhZGRCbGl0dGVkUmVnaW9u
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiByZWdpb24pCisgICAgeworICAgICAgICBt
X2JsaXR0ZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6dW5pb25SZWdpb25zKG1f
YmxpdHRlZFJlZ2lvbiwgcmVnaW9uKTsKKyAgICB9CisgICAgdm9pZCBjbGVhckJsaXR0ZWRSZWdp
b24oY29uc3QgUGxhdGZvcm06OkludFJlY3RSZWdpb24mIHJlZ2lvbikKKyAgICB7CisgICAgICAg
IG1fYmxpdHRlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lv
bnMobV9ibGl0dGVkUmVnaW9uLCByZWdpb24pOworICAgIH0KKyAgICB2b2lkIGNsZWFyQmxpdHRl
ZFJlZ2lvbigpIHsgbV9ibGl0dGVkUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsg
fQorCisgICAgYm9vbCBpc1JlbmRlcmVkKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc2Nyb2xs
UG9zaXRpb24sIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiBjb250ZW50cykgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RS
ZWdpb25zKGNvbnRlbnRzLCBtX2JsaXR0ZWRSZWdpb24pLmlzRW1wdHkoKTsKKyAgICB9CisKKyAg
cHJpdmF0ZToKKyAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBtX2JsaXR0ZWRSZWdpb247Cit9
OworCitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlIDogcHVibGljIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpHdWFyZGVkUG9pbnRlckJhc2UgeworcHVibGljOgorICAgIGVudW0gVGlsZU1hdHJpeERp
cmVjdGlvbiB7IEhvcml6b250YWwsIFZlcnRpY2FsIH07CisgICAgQmFja2luZ1N0b3JlUHJpdmF0
ZSgpOworICAgIH5CYWNraW5nU3RvcmVQcml2YXRlKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRo
ZXIgZGlyZWN0IHJlbmRlcmluZyBpcyBleHBsaWNpdGx5IHR1cm5lZCBvbiBvciBpcworICAgIC8v
IHJlcXVpcmVkIGJlY2F1c2UgdGhlIHN1cmZhY2UgcG9vbCBpcyBub3QgbGFyZ2UgZW5vdWdoIHRv
IG1lZXQKKyAgICAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgcmVxdWlyZWQgdG8gc2Ny
b2xsLgorICAgIGJvb2wgc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSBjb25zdDsKKwor
ICAgIC8vIFN1c3BlbmRzIGFsbCBzY3JlZW4gdXBkYXRlcyBzbyB0aGF0ICdibGl0Q29udGVudHMn
IGlzIGRpc2FibGVkLgorICAgIHZvaWQgc3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0
ZXMoKTsKKworICAgIC8vIFJlc3VtZXMgYWxsIHNjcmVlbiB1cGRhdGVzIHNvIHRoYXQgJ2JsaXRD
b250ZW50cycgaXMgZW5hYmxlZC4KKyAgICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9y
ZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpSZXN1bWVVcGRhdGVPcGVyYXRpb24pOworCisgICAgLy8g
VGhlIGZ1bmN0aW9ucyByZXBhaW50KCksIHNsb3dTY3JvbGwoKSwgc2Nyb2xsKCksIHNjcm9sbGlu
Z1N0YXJ0ZWRIZWxwZXIoKSBhcmUKKyAgICAvLyBjYWxsZWQgZnJvbSBvdXRzaWRlIFdlYktpdCBh
bmQgd2l0aGluIFdlYktpdCB2aWEgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2b2lkIHJl
cGFpbnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgY29udGVudENo
YW5nZWQsIGJvb2wgaW1tZWRpYXRlKTsKKworICAgIHZvaWQgc2xvd1Njcm9sbChjb25zdCBQbGF0
Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiB3aW5kb3dSZWN0
LCBib29sIGltbWVkaWF0ZSk7CisKKyAgICB2b2lkIHNjcm9sbChjb25zdCBQbGF0Zm9ybTo6SW50
U2l6ZSYgZGVsdGEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGNsaXBSZWN0KTsKKyAgICB2b2lkIHNjcm9sbGluZ1N0YXJ0
ZWRIZWxwZXIoY29uc3QgUGxhdGZvcm06OkludFNpemUmIGRlbHRhKTsKKworICAgIGJvb2wgc2hv
dWxkU3VwcHJlc3NOb25WaXNpYmxlUmVndWxhclJlbmRlckpvYnMoKSBjb25zdDsKKyAgICBib29s
IHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkgY29uc3Q7CisgICAgYm9vbCBzaG91bGRQZXJmb3Jt
UmVndWxhclJlbmRlckpvYnMoKSBjb25zdDsKKyAgICB2b2lkIHN0YXJ0UmVuZGVyVGltZXIoKTsK
KyAgICB2b2lkIHN0b3BSZW5kZXJUaW1lcigpOworICAgIHZvaWQgcmVuZGVyT25UaW1lcihXZWJD
b3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPiopOworICAgIHZvaWQgcmVuZGVyT25JZGxl
KCk7CisgICAgYm9vbCB3aWxsRmlyZVRpbWVyKCk7CisKKyAgICAvLyBTZXQgb2YgaGVscGVyIG1l
dGhvZHMgZm9yIHRoZSBzY3JvbGxCYWNraW5nU3RvcmUoKSBtZXRob2QuCisgICAgUGxhdGZvcm06
OkludFJlY3QgY29udGVudHNSZWN0KCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgZXhw
YW5kZWRDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxl
Q29udGVudHNSZWN0KCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgdW5jbGlwcGVkVmlz
aWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkTW92ZUxlZnQoY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIHNob3VsZE1vdmVSaWdodChjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkTW92ZVVwKGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlRG93bihjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2FuTW92ZVgoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNhbk1vdmVZKGNvbnN0IFBsYXRmb3Jt
OjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBjYW5Nb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6
SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2FuTW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBjYW5Nb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmKSBjb25zdDsKKyAgICBib29sIGNhbk1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JikgY29uc3Q7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0Rm9yU2Ny
b2xsKGludCBkZWx0YVgsIGludCBkZWx0YVksIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgdm9pZCBzZXRCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
Jik7CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPFRpbGVJbmRleD4gVGlsZUluZGV4TGlzdDsK
KyAgICBUaWxlSW5kZXhMaXN0IGluZGV4ZXNGb3JCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFBsYXRm
b3JtOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZM
YXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmLCBCYWNraW5nU3RvcmVUaWxlKiwgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0OworCisgICAgVGls
ZUluZGV4IGluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmLCBCYWNraW5n
U3RvcmVUaWxlKikgY29uc3Q7CisgICAgVGlsZUluZGV4IGluZGV4T2ZUaWxlKGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYgb3JpZ2luLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3Q7CisgICAgdm9pZCBjbGVhckFuZFVwZGF0ZVRpbGVPZk5vdFJlbmRlcmVk
UmVnaW9uKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbiYsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVS
ZWN0LCBib29sIHVwZGF0ZSA9IHRydWUpOworICAgIGJvb2wgaXNDdXJyZW50VmlzaWJsZUpvYihj
b25zdCBUaWxlSW5kZXgmLCBCYWNraW5nU3RvcmVUaWxlKiwgY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0OworCisgICAgLy8gUmVzcG9uc2libGUgZm9yIHNj
cm9sbGluZyB0aGUgYmFja2luZyBzdG9yZSBhbmQgdXBkYXRpbmcgdGhlCisgICAgLy8gdGlsZSBt
YXRyaXggZ2VvbWV0cnkuCisgICAgdm9pZCBzY3JvbGxCYWNraW5nU3RvcmUoaW50IGRlbHRhWCwg
aW50IGRlbHRhWSk7CisKKyAgICAvLyBSZW5kZXIgdGhlIHRpbGVzIGRpcnR5IHJlY3RzIGFuZCBi
bGl0IHRvIHRoZSBzY3JlZW4uCisgICAgYm9vbCByZW5kZXJEaXJlY3RUb1dpbmRvdyhjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpOworICAgIGJvb2wgcmVu
ZGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCByZW5kZXJDb250ZW50T25seSk7Cisg
ICAgYm9vbCByZW5kZXIoY29uc3QgSW50UmVjdExpc3QmLCBib29sIHJlbmRlckNvbnRlbnRPbmx5
KTsKKworICAgIC8vIENhbGxlZCBieSB0aGUgcmVuZGVyIHF1ZXVlIHRvIGVuc3VyZSB0aGF0IHRo
ZSBxdWV1ZSBpcyBpbiBhCisgICAgLy8gY29uc3RhbnQgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcg
YSByZW5kZXIgam9iLgorICAgIHZvaWQgcmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3Q7CisK
KyAgICAvLyBIZWxwZXIgcmVuZGVyIG1ldGhvZHMuCisgICAgdm9pZCByZW5kZXJWaXNpYmxlQ29u
dGVudHMoYm9vbCByZW5kZXJDb250ZW50T25seSA9IGZhbHNlKTsKKyAgICB2b2lkIHJlbmRlckJh
Y2tpbmdTdG9yZShib29sIHJlbmRlckNvbnRlbnRPbmx5ID0gZmFsc2UpOworICAgIHZvaWQgYmxp
dFZpc2libGVDb250ZW50cyhib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgLy8gQXNzdW1lcyB0
aGUgcmVjdCB0byBiZSBpbiB3aW5kb3cvdmlld3BvcnQgY29vcmRpbmF0ZXMuCisgICAgdm9pZCBj
b3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpOworICAgIHZvaWQgY29w
eVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0JiwgQmFja2luZ1N0b3JlVGlsZSopOworICAgIHZvaWQgcGFpbnREZWZhdWx0QmFja2dyb3Vu
ZChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMsIGNvbnN0IFdlYkNvcmU6OlRyYW5z
Zm9ybWF0aW9uTWF0cml4JiwgYm9vbCBmbHVzaCk7CisgICAgdm9pZCBibGl0Q29udGVudHMoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBj
b250ZW50cywgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKyAgICB2b2lkIGJsaXRPbklkbGUoKTsKKwor
ICAgIHR5cGVkZWYgc3RkOjpwYWlyPFRpbGVJbmRleCwgUGxhdGZvcm06OkludFJlY3Q+IFRpbGVS
ZWN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJsaXRUaWxlUmVjdChUaWxlQnVmZmVyKiwgY29u
c3QgVGlsZVJlY3QmLCBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmLCBjb25zdCBXZWJDb3JlOjpU
cmFuc2Zvcm1hdGlvbk1hdHJpeCYsIEJhY2tpbmdTdG9yZUdlb21ldHJ5Kik7CisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgdm9pZCBibGVuZENvbXBvc2l0aW5nU3VyZmFj
ZShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCk7CisgICAgdm9pZCBjbGVhckNvbXBv
c2l0aW5nU3VyZmFjZSgpOworICAgIGJvb2wgZHJhd1N1YkxheWVycygpOworI2VuZGlmCisKKyAg
ICB2b2lkIGJsaXRIb3Jpem9udGFsU2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYp
OworICAgIHZvaWQgYmxpdFZlcnRpY2FsU2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSB0aWxlIGluZGV4IGlzIGN1cnJlbnRs
eSB2aXNpYmxlIG9yIG5vdC4KKyAgICBib29sIGlzVGlsZVZpc2libGUoY29uc3QgVGlsZUluZGV4
JikgY29uc3Q7CisgICAgYm9vbCBpc1RpbGVWaXNpYmxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyBhIHJlY3QgdGhhdCBpcyB0aGUgdW5pb24gb2Yg
YWxsIHRpbGVzIHRoYXQgYXJlIHZpc2libGUuCisgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJs
ZVRpbGVzUmVjdCgpIGNvbnN0OworCisgICAgLy8gVXNlZCB0byBjbGlwIHRvIHRoZSB2aXNpYmxl
IGNvbnRlbnQgZm9yIGluc3RhbmNlLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVWaXNpYmxl
Q29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYpIGNvbnN0OworCisgICAgLy8gVXNlZCB0byBj
bGlwIHRvIHRoZSB1bmNsaXBwZWQgdmlzaWJsZSBjb250ZW50IGZvciBpbnN0YW5jZSB3aGljaCBp
bmNsdWRlcyBvdmVyc2Nyb2xsLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVVbmNsaXBwZWRW
aXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYpIGNvbnN0OworCisgICAgLy8gVXNl
ZCB0byBjbGlwIHRvIHRoZSBjb250ZW50cyBmb3IgaW5zdGFuY2UuCisgICAgUGxhdGZvcm06Oklu
dFJlY3QgdGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6
SW50UmVjdCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVDb250ZW50c1JlY3Qo
Y29uc3QgVGlsZUluZGV4JiwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVH
ZW9tZXRyeSogc3RhdGUpIGNvbnN0OworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgV2ViUGFn
ZSBvbmNlIGxvYWQgaXMgY29tbWl0dGVkIHRvIHJlc2V0IHRoZSByZW5kZXIgcXVldWUuCisgICAg
dm9pZCByZXNldFJlbmRlclF1ZXVlKCk7CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgRnJhbWVM
b2FkZXJDbGllbnQgdGhhdCBleHBsaWNpdGx5IHBhaW50cyBvbiBmaXJzdCB2aXNpYmxlIGxheW91
dC4KKyAgICB2b2lkIGNsZWFyVmlzaWJsZVpvb20oKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVk
IGJ5IFdlYlBhZ2Ugb25jZSBsb2FkIGlzIGNvbW1pdHRlZCB0byByZXNldCBhbGwgdGhlIHRpbGVz
LgorICAgIHZvaWQgcmVzZXRUaWxlcyhib29sIHJlc2V0QmFja2dyb3VuZCk7CisKKyAgICAvLyBU
aGlzIGlzIGNhbGxlZCBieSBXZWJQYWdlIGFmdGVyIGxvYWQgaXMgY29tcGxldGUgdG8gdXBkYXRl
IGFsbCB0aGUgdGlsZXMuCisgICAgdm9pZCB1cGRhdGVUaWxlcyhib29sIHVwZGF0ZVZpc2libGUs
IGJvb2wgaW1tZWRpYXRlKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzY3JvbGwg
YW5kIGJ5IHRoZSByZW5kZXIgcXVldWUuCisgICAgdm9pZCB1cGRhdGVUaWxlc0ZvclNjcm9sbE9y
Tm90UmVuZGVyZWRSZWdpb24oYm9vbCBjaGVja0xvYWRpbmcgPSB0cnVlKTsKKworICAgIC8vIFJl
c2V0IGFuIGluZGl2aWR1YWwgdGlsZS4KKyAgICB2b2lkIHJlc2V0VGlsZShjb25zdCBUaWxlSW5k
ZXgmLCBCYWNraW5nU3RvcmVUaWxlKiwgYm9vbCByZXNldEJhY2tncm91bmQpOworCisgICAgLy8g
VXBkYXRlIGFuIGluZGl2aWR1YWwgdGlsZS4KKyAgICB2b2lkIHVwZGF0ZVRpbGUoY29uc3QgVGls
ZUluZGV4JiwgYm9vbCBpbW1lZGlhdGUpOworICAgIHZvaWQgdXBkYXRlVGlsZShjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmLCBib29sIGltbWVkaWF0ZSk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVj
dCBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMoY29uc3QgVGlsZVJlY3QmKSBjb25z
dDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVu
dHMoY29uc3QgVGlsZVJlY3QmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworCisg
ICAgdHlwZWRlZiBXVEY6OlZlY3RvcjxUaWxlUmVjdD4gVGlsZVJlY3RMaXN0OworICAgIFRpbGVS
ZWN0TGlzdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvQWJzb2x1dGVUaWxlQm91bmRhcmll
cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIFRpbGVSZWN0TGlzdCBtYXBG
cm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBj
b25zdDsKKyAgICBUaWxlUmVjdExpc3QgbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVz
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgQmFja2luZ1N0b3JlR2VvbWV0cnkqKSBjb25zdDsK
KworICAgIHZvaWQgdXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCk7CisKKyAgICAvLyBDYWxsZWQg
YnkgV2ViUGFnZVByaXZhdGU6Om5vdGlmeVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZC4K
KyAgICB2b2lkIGNvbnRlbnRzU2l6ZUNoYW5nZWQoY29uc3QgUGxhdGZvcm06OkludFNpemUmKTsK
KworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3JtZWRTY3Jv
bGxDaGFuZ2VkLgorICAgIHZvaWQgc2Nyb2xsQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQmKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJwYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3Jt
Q2hhbmdlZC4KKyAgICB2b2lkIHRyYW5zZm9ybUNoYW5nZWQoKTsKKworICAgIC8vIENhbGxlZCBi
eSBXZWJwYWdlUHJpdmF0ZTo6YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkLgorICAgIHZvaWQgYWN0
dWFsVmlzaWJsZVNpemVDaGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJik7CisKKyAgICAv
LyBDYWxsZWQgYnkgV2ViUGFnZVByaXZhdGU6OnNldFNjcmVlblJvdGF0ZWQuCisgICAgdm9pZCBv
cmllbnRhdGlvbkNoYW5nZWQoKTsKKworICAgIC8vIFNldHMgdGhlIGdlb21ldHJ5IG9mIHRoZSB0
aWxlIG1hdHJpeC4KKyAgICB2b2lkIHNldEdlb21ldHJ5T2ZUaWxlTWF0cml4KGludCBudW1iZXJP
ZlRpbGVzV2lkZSwgaW50IG51bWJlck9mVGlsZXNIaWdoKTsKKworICAgIC8vIENyZWF0ZSB0aGUg
c3VyZmFjZXMgb2YgdGhlIGJhY2tpbmcgc3RvcmUuCisgICAgdm9pZCBjcmVhdGVTdXJmYWNlcygp
OworICAgIHZvaWQgY3JlYXRlVmlzaWJsZVRpbGVCdWZmZXIoKTsKKworICAgIC8vIFZhcmlvdXMg
Y2FsY3VsYXRpb25zIG9mIHF1YW50aXRpZXMgcmVsZXZhbnQgdG8gYmFja2luZyBzdG9yZS4KKyAg
ICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYpIGNvbnN0
OworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4Jiwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBpbnQgbWluaW11bU51bWJlck9m
VGlsZXNXaWRlKCkgY29uc3Q7CisgICAgaW50IG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpIGNv
bnN0OworICAgIFBsYXRmb3JtOjpJbnRTaXplIGV4cGFuZGVkQ29udGVudHNTaXplKCkgY29uc3Q7
CisKKyAgICAvLyBUaGUgdGlsZSBnZW9tZXRyeSBtZXRob2RzIGFyZSBhbGwgc3RhdGljIGZ1bmN0
aW9uLgorICAgIHN0YXRpYyBpbnQgdGlsZVdpZHRoKCk7CisgICAgc3RhdGljIGludCB0aWxlSGVp
Z2h0KCk7CisgICAgc3RhdGljIFBsYXRmb3JtOjpJbnRTaXplIHRpbGVTaXplKCk7CisgICAgc3Rh
dGljIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVSZWN0KCk7CisKKyAgICAvLyBUaGlzIHRha2VzIHRy
YW5zZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgIHZvaWQgcmVuZGVyQ29udGVudHMo
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqLCBjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIHN1cmZhY2VPZmZzZXQsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50
c1JlY3QpIGNvbnN0OworCisgICAgdm9pZCBibGl0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGRzdFJlY3QsIGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVm
ZmVyKiBzcmNCdWZmZXIsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LCBib29sIGJs
ZW5kLCB1bnNpZ25lZCBjaGFyIGdsb2JhbEFscGhhKTsKKyAgICB2b2lkIGNoZWNrZXJXaW5kb3co
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCYgY29udGVudHNPcmlnaW4sIGRvdWJsZSBjb250ZW50c1NjYWxlKTsKKworICAgIHZvaWQgaW52
YWxpZGF0ZVdpbmRvdygpOworICAgIHZvaWQgaW52YWxpZGF0ZVdpbmRvdyhjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgZHN0KTsKKyAgICB2b2lkIGNsZWFyV2luZG93KCk7CisgICAgdm9pZCBjbGVh
cldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsIHVuc2lnbmVkIGNoYXIgcmVkLCB1bnNp
Z25lZCBjaGFyIGdyZWVuLCB1bnNpZ25lZCBjaGFyIGJsdWUsIHVuc2lnbmVkIGNoYXIgYWxwaGEg
PSAyNTUpOworCisgICAgYm9vbCBpc1Njcm9sbGluZ09yWm9vbWluZygpIGNvbnN0OworICAgIHZv
aWQgc2V0U2Nyb2xsaW5nT3Jab29taW5nKGJvb2wgc2Nyb2xsaW5nT3Jab29taW5nLCBib29sIHNo
b3VsZEJsaXQgPSB0cnVlKTsKKworICAgIHZvaWQgbG9ja0JhY2tpbmdTdG9yZSgpOworICAgIHZv
aWQgdW5sb2NrQmFja2luZ1N0b3JlKCk7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogZnJv
bnRTdGF0ZSgpIGNvbnN0OworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBiYWNrU3RhdGUoKSBj
b25zdDsKKyAgICB2b2lkIHN3YXBTdGF0ZSgpOworCisgICAgQmFja2luZ1N0b3JlV2luZG93QnVm
ZmVyU3RhdGUqIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKSBjb25zdDsKKyAgICBCYWNraW5nU3Rv
cmVXaW5kb3dCdWZmZXJTdGF0ZSogd2luZG93QmFja0J1ZmZlclN0YXRlKCkgY29uc3Q7CisKKyAg
ICBzdGF0aWMgdm9pZCBzZXRDdXJyZW50QmFja2luZ1N0b3JlT3duZXIoV2ViUGFnZSogd2ViUGFn
ZSkgeyBCYWNraW5nU3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9IHdl
YlBhZ2U7IH0KKyAgICBzdGF0aWMgV2ViUGFnZSogY3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkg
eyByZXR1cm4gQmFja2luZ1N0b3JlUHJpdmF0ZTo6c19jdXJyZW50QmFja2luZ1N0b3JlT3duZXI7
IH0KKyAgICBib29sIGlzQWN0aXZlKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgV2ViUGFnZSogc19j
dXJyZW50QmFja2luZ1N0b3JlT3duZXI7CisKKyAgICBib29sIG1fc3VzcGVuZFNjcmVlblVwZGF0
ZXM7CisgICAgYm9vbCBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzOworCisgICAgYm9vbCBt
X3N1c3BlbmRSZW5kZXJKb2JzOworICAgIGJvb2wgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnM7
CisgICAgYm9vbCBtX2lzU2Nyb2xsaW5nT3Jab29taW5nOworICAgIFdlYlBhZ2UqIG1fd2ViUGFn
ZTsKKyAgICBCYWNraW5nU3RvcmVDbGllbnQqIG1fY2xpZW50OworICAgIFJlbmRlclF1ZXVlKiBt
X3JlbmRlclF1ZXVlOworICAgIG11dGFibGUgUGxhdGZvcm06OkludFNpemUgbV9wcmV2aW91c0Rl
bHRhOworCisgICAgYm9vbCBtX2RlZmVyc0JsaXQ7CisgICAgYm9vbCBtX2hhc0JsaXRKb2JzOwor
CisjaWYgVVNFKE9QRU5WRykKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheTsKKyNlbmRpZgor
ICAgIG11dGFibGUgdW5zaWduZWQgbV9mcm9udFN0YXRlOworICAgIG11dGFibGUgdW5zaWduZWQg
bV9iYWNrU3RhdGU7CisKKyAgICB1bnNpZ25lZCBtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyOwor
ICAgIG11dGFibGUgQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUgbV93aW5kb3dCdWZmZXJT
dGF0ZVsyXTsKKworICAgIFRpbGVNYXRyaXhEaXJlY3Rpb24gbV9wcmVmZXJyZWRUaWxlTWF0cml4
RGltZW5zaW9uOworCisgICAgUGxhdGZvcm06OkludFJlY3QgbV92aXNpYmxlVGlsZUJ1ZmZlclJl
Y3Q7CisKKyAgICAvLyBMYXN0IHJlc29ydCB0aW1lciBmb3IgcmVuZGVyaW5nCisgICAgV2ViQ29y
ZTo6VGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4qIG1fcmVuZGVyVGltZXI7CisKKyAgICBwdGhy
ZWFkX211dGV4X3QgbV9tdXRleDsKKworICAgIGludCBtX2JsaXRHZW5lcmF0aW9uOworICAgIHB0
aHJlYWRfbXV0ZXhfdCBtX2JsaXRHZW5lcmF0aW9uTG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBt
X2JsaXRHZW5lcmF0aW9uQ29uZDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbV9jdXJyZW50QmxpdEVu
ZDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBCYWNraW5nU3RvcmVfcF9oCi0tIAoxLjcuNwoK
</data>
<flag name="review"
          id="117149"
          type_id="1"
          status="-"
          setter="tonikitoo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117904</attachid>
            <date>2011-12-05 11:12:41 -0800</date>
            <delta_ts>2011-12-05 11:19:37 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>73668-2.patch</filename>
            <type>text/plain</type>
            <size>128102</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSAyOGVkYWQ3Y2E4ZmZjNGU5YjlkZmY0NTRjMmY5OGFkODY4NDgxODk2IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
RnJpLCAyIERlYyAyMDExIDEyOjI3OjM5IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCiogYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlLmg6IEFkZGVkLgoqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICB8ICAgMTYgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3Bw
IHwgMjYyNiArKysrKysrKysrKysrKysrKysrKysrKysrCiBTb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL0JhY2tpbmdTdG9yZS5oICAgfCAgIDg1ICsKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaCB8ICAzNTcgKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDg0
IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCiBjcmVhdGUgbW9kZSAxMDA2
NDQgU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaAoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggMjExNzM1ZS4uMDM0NThmMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMS0xMi0wMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQVBJIGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVh
bSwgdGhlIG1haW4gY29udHJpYnV0b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJp
bS5jb20+LgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAg
ICAgICAqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oOiBBZGRlZC4KKwogMjAxMS0xMi0wMSAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFVwc3RyZWFtIHRleHQgY29kZWMgYW5k
IHdlYiBzdHJpbmcgZmlsZXMgb2YgQmxhY2tCZXJyeSBBUEkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi41MTc0N2E4Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjYyNiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlLmgiCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVD
bGllbnQuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UuaCIKKyNp
bmNsdWRlICJCYWNraW5nU3RvcmVUaWxlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3AuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiIC8vIGZvciBERUJVR19GQVRfRklOR0VSUyBkZWZpbml0
aW9uCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRl
ICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJ
bnNwZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3VyZmFjZVBvb2wuaCIKKyNpbmNsdWRlICJXZWJQYWdl
LmgiCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldlYlBhZ2VfcC5oIgor
I2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1F
eGVjdXRhYmxlTWVzc2FnZS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUludFJlY3RS
ZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1NZXNzYWdlLmg+CisjaW5jbHVk
ZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5oPgorCisjaW5jbHVkZSA8d3RmL0N1
cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYv
Tm90Rm91bmQuaD4KKworI2RlZmluZSBTVVBQUkVTU19OT05fVklTSUJMRV9SRUdVTEFSX1JFTkRF
Ul9KT0JTIDAKKyNkZWZpbmUgRU5BQkxFX1NDUk9MTEJBUlMgMQorI2RlZmluZSBFTkFCTEVfUkVQ
QUlOVE9OU0NST0xMIDEKKyNkZWZpbmUgREVCVUdfQkFDS0lOR1NUT1JFIDAKKyNkZWZpbmUgREVC
VUdfVklTVUFMSVpFIDAKKyNkZWZpbmUgREVCVUdfVElMRU1BVFJJWCAwCisjZGVmaW5lIERFQlVH
X0NPTVBPU0lUSU5HX0RJUlRZX1JFR0lPTiAwCisKKyNpZiBVU0UoT1BFTlZHKQorI2luY2x1ZGUg
IkVHTERpc3BsYXlPcGVuVkcuaCIKKyNpbmNsdWRlICJFR0xVdGlscy5oIgorI2VuZGlmCisKKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6SW50UmVjdDsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRQb2ludDsKK3VzaW5n
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplOworCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7
CituYW1lc3BhY2UgV2ViS2l0IHsKKworY29uc3QgaW50IHNfcmVuZGVyVGltZXJUaW1lb3V0ID0g
MS4wOworV2ViUGFnZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6c19jdXJyZW50QmFja2luZ1N0b3Jl
T3duZXIgPSAwOworCisvLyBDb21wdXRlIGRpdmlzb3IgcGFpcnMKK3R5cGVkZWYgc3RkOjpwYWly
PGludCwgaW50PiBEaXZpc29yOwordHlwZWRlZiBWZWN0b3I8RGl2aXNvcj4gRGl2aXNvckxpc3Q7
CisvLyBUT0RPOiBjYWNoZSB0aGlzIGFuZC9vciB1c2UgYSBzbWFydGVyIGFsZ29yaXRobQorc3Rh
dGljIERpdmlzb3JMaXN0IGRpdmlzb3JzKHVuc2lnbmVkIG4pCit7CisgICAgRGl2aXNvckxpc3Qg
ZGl2aXNvcnM7CisgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDE7IGkgPD0gbjsgKytpKQorICAg
ICAgICBpZiAoIShuICUgaSkpCisgICAgICAgICAgICBkaXZpc29ycy5hcHBlbmQoc3RkOjptYWtl
X3BhaXIoaSwgbiAvIGkpKTsKKyAgICByZXR1cm4gZGl2aXNvcnM7Cit9CisKKy8vIENvbXB1dGUg
YmVzdCBkaXZpc29yIGdpdmVuIHRoZSByYXRpbyBkZXRlcm1pbmVkIGJ5IHNpemUKK3N0YXRpYyBE
aXZpc29yIGJlc3REaXZpc29yKFBsYXRmb3JtOjpJbnRTaXplIHNpemUsIGludCB0aWxlV2lkdGgs
IGludCB0aWxlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbmltdW1O
dW1iZXJPZlRpbGVzV2lkZSwgaW50IG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgIEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVNYXRyaXhEaXJlY3Rp
b24gZGlyZWN0aW9uKQoreworICAgIC8vIFRoZSBwb2ludCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRv
IGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHRpbGVzIGluIGVhY2gKKyAgICAvLyBkaW1lbnNpb24u
IFdlIGRvIHRoaXMgYnkgbG9va2luZyB0byBtYXRjaCB0aGUgdGlsZSBtYXRyaXggd2lkdGgvaGVp
Z2h0CisgICAgLy8gcmF0aW8gYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB3aXRoIHRoZSB3aWR0aC9o
ZWlnaHQgcmF0aW8gb2YgdGhlIGNvbnRlbnRzLgorICAgIC8vIFdlIGFsc28gbG9vayBhdCB0aGUg
ZGlyZWN0aW9uIHBhc3NlZCB0byBnaXZlIHByZWZlcmVuY2UgdG8gb25lIGRpbWVuc2lvbgorICAg
IC8vIG92ZXIgYW5vdGhlci4gVGhpcyBtZXRob2QgY291bGQgcHJvYmFibHkgYmUgbWFkZSBmYXN0
ZXIsIGJ1dCBpdCBnZXRzIHRoZQorICAgIC8vIGpvYiBkb25lLgorICAgIFN1cmZhY2VQb29sKiBz
dXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpOworICAgIEFTU0VS
VCghc3VyZmFjZVBvb2wtPmlzRW1wdHkoKSk7CisKKyAgICAvLyBTdG9yZSBhIHN0YXRpYyBsaXN0
IG9mIHBvc3NpYmxlIGRpdmlzb3JzCisgICAgc3RhdGljIERpdmlzb3JMaXN0IGRpdmlzb3JMaXN0
ID0gZGl2aXNvcnMoc3VyZmFjZVBvb2wtPnNpemUoKSk7CisKKyAgICAvLyBUaGUgcmF0aW8gd2Un
cmUgbG9va2luZyB0byBiZXN0IGltaXRhdGUKKyAgICBmbG9hdCByYXRpbyA9IHN0YXRpY19jYXN0
PGZsb2F0PihzaXplLndpZHRoKCkpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemUuaGVpZ2h0KCkp
OworCisgICAgRGl2aXNvciBiZXN0RGl2aXNvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGRpdmlzb3JMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERpdmlzb3IgZGl2aXNvciA9IGRp
dmlzb3JMaXN0W2ldOworCisgICAgICAgIGJvb2wgZGl2aXNvcldpZHRoSXNQZXJmZWN0ID0gc2l6
ZS53aWR0aCgpIDw9IGRpdmlzb3IuZmlyc3QgKiB0aWxlV2lkdGggJiYgYWJzKHNpemUud2lkdGgo
KSAtIGRpdmlzb3IuZmlyc3QgKiB0aWxlV2lkdGgpIDwgdGlsZVdpZHRoOworICAgICAgICBib29s
IGRpdmlzb3JIZWlnaHRJc1BlcmZlY3QgPSBzaXplLmhlaWdodCgpIDw9IGRpdmlzb3Iuc2Vjb25k
ICogdGlsZUhlaWdodCAmJiBhYnMoc2l6ZS5oZWlnaHQoKSAtIGRpdmlzb3Iuc2Vjb25kICogdGls
ZUhlaWdodCkgPCB0aWxlSGVpZ2h0OworICAgICAgICBib29sIGRpdmlzb3JXaWR0aElzVmFsaWQg
PSBkaXZpc29yLmZpcnN0ID49IG1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSB8fCBkaXZpc29yV2lk
dGhJc1BlcmZlY3Q7CisgICAgICAgIGJvb2wgZGl2aXNvckhlaWdodElzVmFsaWQgPSBkaXZpc29y
LnNlY29uZCA+PSBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2ggfHwgZGl2aXNvckhlaWdodElzUGVy
ZmVjdDsKKyAgICAgICAgaWYgKCFkaXZpc29yV2lkdGhJc1ZhbGlkIHx8ICFkaXZpc29ySGVpZ2h0
SXNWYWxpZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkaXZpc29yLmZp
cnN0ID4gZGl2aXNvci5zZWNvbmQgJiYgZGlyZWN0aW9uID09IEJhY2tpbmdTdG9yZVByaXZhdGU6
OlZlcnRpY2FsICYmICFkaXZpc29ySGVpZ2h0SXNQZXJmZWN0KQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgaWYgKGRpdmlzb3Iuc2Vjb25kID4gZGl2aXNvci5maXJzdCAmJiBkaXJl
Y3Rpb24gPT0gQmFja2luZ1N0b3JlUHJpdmF0ZTo6SG9yaXpvbnRhbCAmJiAhZGl2aXNvcldpZHRo
SXNQZXJmZWN0KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGRpdmlzb3JX
aWR0aElzUGVyZmVjdCB8fCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0KSB7CisgICAgICAgICAgICBi
ZXN0RGl2aXNvciA9IGRpdmlzb3I7IC8vIEZvdW5kIGEgcGVyZmVjdCBmaXQhCisjaWYgREVCVUdf
VElMRU1BVFJJWAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgImJlc3REaXZpc29yIGZvdW5kIHBlcmZl
Y3Qgc2l6ZSB3aWR0aFBlcmZlY3Q9JXMgaGVpZ2h0UGVyZmVjdD0lcyIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3JXaWR0aElzUGVyZmVjdCA/ICJ0cnVlIiA6ICJm
YWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3JIZWlnaHRJ
c1BlcmZlY3QgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBiYXNpcyBvZiBjb21wYXJpc29uCisgICAg
ICAgIGlmICghYmVzdERpdmlzb3IuZmlyc3QgJiYgIWJlc3REaXZpc29yLnNlY29uZCkgeworICAg
ICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29yOworICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBDb21wYXJlIHJhdGlvcworICAgICAgICBmbG9hdCBkaWZm
MSA9IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihkaXZpc29yLmZpcnN0KSAvIHN0YXRpY19jYXN0
PGZsb2F0PihkaXZpc29yLnNlY29uZCkpIC0gcmF0aW8pOworICAgICAgICBmbG9hdCBkaWZmMiA9
IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihiZXN0RGl2aXNvci5maXJzdCkgLyBzdGF0aWNfY2Fz
dDxmbG9hdD4oYmVzdERpdmlzb3Iuc2Vjb25kKSkgLSByYXRpbyk7CisgICAgICAgIGlmIChkaWZm
MSA8IGRpZmYyKQorICAgICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29yOworICAgIH0KKwor
ICAgIHJldHVybiBiZXN0RGl2aXNvcjsKK30KKworc3RydWN0IEJhY2tpbmdTdG9yZU11dGV4TG9j
a2VyIHsKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlcihCYWNraW5nU3RvcmVQcml2YXRlKiBi
YWNraW5nU3RvcmVQcml2YXRlKQorICAgICAgICA6IG1fYmFja2luZ1N0b3JlUHJpdmF0ZShiYWNr
aW5nU3RvcmVQcml2YXRlKQorICAgIHsKKyAgICAgICAgbV9iYWNraW5nU3RvcmVQcml2YXRlLT5s
b2NrQmFja2luZ1N0b3JlKCk7CisgICAgfQorCisgICAgfkJhY2tpbmdTdG9yZU11dGV4TG9ja2Vy
KCkKKyAgICB7CisgICAgICAgIG1fYmFja2luZ1N0b3JlUHJpdmF0ZS0+dW5sb2NrQmFja2luZ1N0
b3JlKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhY2tpbmdTdG9yZVByaXZhdGUqIG1fYmFj
a2luZ1N0b3JlUHJpdmF0ZTsKK307CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZUdl
b21ldHJ5OjpiYWNraW5nU3RvcmVSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06
OkludFJlY3QoYmFja2luZ1N0b3JlT2Zmc2V0KCksIGJhY2tpbmdTdG9yZVNpemUoKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRTaXplIEJhY2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNraW5nU3RvcmVTaXpl
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFNpemUobnVtYmVyT2ZUaWxlc1dp
ZGUoKSAqIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVXaWR0aCgpLCBudW1iZXJPZlRpbGVzSGln
aCgpICogQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCgpKTsKK30KKworQmFja2luZ1N0
b3JlUHJpdmF0ZTo6QmFja2luZ1N0b3JlUHJpdmF0ZSgpCisgICAgOiBtX3N1c3BlbmRTY3JlZW5V
cGRhdGVzKGZhbHNlKQorICAgICwgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyhmYWxzZSkK
KyAgICAsIG1fc3VzcGVuZFJlbmRlckpvYnMoZmFsc2UpCisgICAgLCBtX3N1c3BlbmRSZWd1bGFy
UmVuZGVySm9icyhmYWxzZSkKKyAgICAsIG1faXNTY3JvbGxpbmdPclpvb21pbmcoZmFsc2UpCisg
ICAgLCBtX3dlYlBhZ2UoMCkKKyAgICAsIG1fY2xpZW50KDApCisgICAgLCBtX3JlbmRlclF1ZXVl
KG5ldyBSZW5kZXJRdWV1ZSh0aGlzKSkKKyAgICAsIG1fZGVmZXJzQmxpdCh0cnVlKQorICAgICwg
bV9oYXNCbGl0Sm9icyhmYWxzZSkKKyNpZiBVU0UoT1BFTlZHKQorICAgICwgbV9lZ2xEaXNwbGF5
KEVHTF9OT19ESVNQTEFZKQorI2VuZGlmCisgICAgLCBtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVy
KDApCisgICAgLCBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24oVmVydGljYWwpCisgICAg
LCBtX2JsaXRHZW5lcmF0aW9uKC0xKQoreworICAgIG1fZnJvbnRTdGF0ZSA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dW5zaWduZWQ+KG5ldyBCYWNraW5nU3RvcmVHZW9tZXRyeSk7CisgICAgbV9iYWNrU3Rh
dGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0b3JlR2VvbWV0cnkp
OworCisgICAgbV9yZW5kZXJUaW1lciA9IG5ldyBUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPih0
aGlzLCAmQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25UaW1lcik7CisKKyAgICAvLyBOZWVk
IGEgcmVjdXJzaXZlIG11dGV4IHRvIGFjaGlldmUgYSBnbG9iYWwgbG9jaworICAgIHB0aHJlYWRf
bXV0ZXhhdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyAg
ICBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lW
RSk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZtX211dGV4LCAmYXR0cik7CisgICAgcHRocmVh
ZF9tdXRleGF0dHJfZGVzdHJveSgmYXR0cik7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1f
YmxpdEdlbmVyYXRpb25Mb2NrLCAwKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9ibGl0R2Vu
ZXJhdGlvbkNvbmQsIDApOworfQorCitCYWNraW5nU3RvcmVQcml2YXRlOjp+QmFja2luZ1N0b3Jl
UHJpdmF0ZSgpCit7CisgICAgZGVsZXRlIG1fcmVuZGVyUXVldWU7CisgICAgbV9yZW5kZXJRdWV1
ZSA9IDA7CisgICAgZGVsZXRlIG1fcmVuZGVyVGltZXI7CisgICAgbV9yZW5kZXJUaW1lciA9IDA7
CisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDxCYWNr
aW5nU3RvcmVHZW9tZXRyeSo+KG1fZnJvbnRTdGF0ZSk7CisgICAgZGVsZXRlIGZyb250OworICAg
IG1fZnJvbnRTdGF0ZSA9IDA7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogYmFjayA9IHJl
aW50ZXJwcmV0X2Nhc3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2JhY2tTdGF0ZSk7CisgICAg
ZGVsZXRlIGJhY2s7CisgICAgbV9iYWNrU3RhdGUgPSAwOworCisgICAgcHRocmVhZF9tdXRleF9k
ZXN0cm95KCZtX211dGV4KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRE
aXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgaWYgKG1fd2ViUGFnZS0+c2V0
dGluZ3MoKS0+aXNEaXJlY3RSZW5kZXJpbmdUb1dpbmRvd0VuYWJsZWQoKSB8fCAhaXNBY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBCYWNraW5nU3RvcmVHZW9tZXRy
eSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IHVuc2lnbmVkIHRpbGVz
TmVjZXNzYXJ5ID0gbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgKiBtaW5pbXVtTnVtYmVyT2ZU
aWxlc0hpZ2goKTsKKyAgICBjb25zdCB1bnNpZ25lZCB0aWxlc0F2YWlsYWJsZSA9IGN1cnJlbnRT
dGF0ZS0+bnVtYmVyT2ZUaWxlc1dpZGUoKSAqIGN1cnJlbnRTdGF0ZS0+bnVtYmVyT2ZUaWxlc0hp
Z2goKTsKKyAgICByZXR1cm4gdGlsZXNBdmFpbGFibGUgPCB0aWxlc05lY2Vzc2FyeTsKK30KKwor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBk
YXRlcygpCit7CisgICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyA9IHRydWU7CisKKyAg
ICAvLyBNYWtlIHN1cmUgdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCBnZXRzIHRoZSBtZXNzYWdl
IGJlZm9yZSB3ZSBwcm9jZWVkCisgICAgLy8gYmVjYXVzZSBibGl0Q29udGVudHMgY2FuIGJlIGNh
bGxlZCBmcm9tIHRoaXMgdGhyZWFkIGFuZCBpdCBtdXN0IGhvbm9yCisgICAgLy8gdGhpcyBmbGFn
CisgICAgbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyA9IHRydWU7CisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRN
ZXNzYWdlKCk7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgbV93ZWJQ
YWdlLT5kLT5yZXNldENvbXBvc2l0aW5nU3VyZmFjZSgpOworI2VuZGlmCit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNr
aW5nU3RvcmU6OlJlc3VtZVVwZGF0ZU9wZXJhdGlvbiBvcCkKK3sKKyAgICBtX3N1c3BlbmRCYWNr
aW5nU3RvcmVVcGRhdGVzID0gZmFsc2U7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisgICAgaWYgKG9wICE9IEJhY2tpbmdTdG9yZTo6Tm9uZSkKKyAgICAgICAgbV93ZWJQYWdl
LT5kLT5zZXROZWVkc09uZVNob3REcmF3aW5nU3luY2hyb25pemF0aW9uKCk7CisjZW5kaWYKKwor
ICAgIC8vIEZvciB0aGUgZGlyZWN0IHJlbmRlcmluZyBjYXNlLCB0aGVyZSBpcyBubyBzdWNoIG9w
ZXJhdGlvbiBhcyBibGl0LAorICAgIC8vIHdlIGhhdmUgdG8gcmVuZGVyIHRvIGdldCBhbnl0aGlu
ZyB0byB0aGUgc2NyZWVuLgorICAgIGlmIChzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygp
ICYmIG9wID09IEJhY2tpbmdTdG9yZTo6QmxpdCkKKyAgICAgICAgb3AgPSBCYWNraW5nU3RvcmU6
OlJlbmRlckFuZEJsaXQ7CisKKyAgICAvLyBEbyBzb21lIHJlbmRlcmluZyBpZiBuZWNlc3NhcnkK
KyAgICBpZiAob3AgPT0gQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRCbGl0KQorICAgICAgICByZW5k
ZXJWaXNpYmxlQ29udGVudHModHJ1ZSAvKnJlbmRlckNvbnRlbnRPbmx5Ki8pOworCisgICAgLy8g
TWFrZSBzdXJlIHRoZSB1c2VyIGludGVyZmFjZSB0aHJlYWQgZ2V0cyB0aGUgbWVzc2FnZSBiZWZv
cmUgd2UgcHJvY2VlZAorICAgIC8vIGJlY2F1c2UgYmxpdENvbnRlbnRzIGNhbiBiZSBjYWxsZWQg
ZnJvbSB0aGUgdXNlciBpbnRlcmZhY2UgdGhyZWFkIGFuZAorICAgIC8vIGl0IG11c3QgaG9ub3Ig
dGhpcyBmbGFnCisgICAgbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyA9IGZhbHNlOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5j
VG9DdXJyZW50TWVzc2FnZSgpOworCisgICAgLy8gRG8gc29tZSBibGl0dGluZyBpZiBuZWNlc3Nh
cnkKKyAgICBpZiAoKG9wID09IEJhY2tpbmdTdG9yZTo6QmxpdCB8fCBvcCA9PSBCYWNraW5nU3Rv
cmU6OlJlbmRlckFuZEJsaXQpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQor
ICAgICAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6cmVwYWludChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgd2luZG93UmVjdCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNvbnRlbnRDaGFuZ2VkLCBib29sIGlt
bWVkaWF0ZSkKK3sKKyNpZiBVU0UoT1BFTlZHKQorICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0g
RUdMX05PX0RJU1BMQVkpOworI2VuZGlmCisKKyAgICBpZiAobV9zdXNwZW5kQmFja2luZ1N0b3Jl
VXBkYXRlcykKKyAgICAgICAgcmV0dXJuOworCisgICAgIC8vIElmIGltbWVkaWF0ZSBpcyB0cnVl
LCB0aGVuIHdlJ3JlIGJlaW5nIGFza2VkIHRvIHBlcmZvcm0gc3luY2hyb25vdXNseS4KKyAgICAg
Ly8gTk9URTogV2ViQ29yZTo6U2Nyb2xsVmlldyB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBp
bW1lZGlhdGU6dHJ1ZSBhbmQgY29udGVudENoYW5nZWQ6ZmFsc2UuCisgICAgIC8vIFRoaXMgaXMg
YSBzcGVjaWFsIGNhc2UgaW50cm9kdWNlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBBcHBsZSdzIHdp
bmRvd3MgcG9ydCBhbmQgY2FuIGJlIHNhZmVseSBpZ25vcmVkIEkgYmVsaWV2ZS4KKyAgICAgLy8g
Tm93IHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGZyb20gV2ViUGFnZVByaXZhdGU6OnJlcGFp
bnQoKS4KKworICAgIGlmIChjb250ZW50Q2hhbmdlZCAmJiAhd2luZG93UmVjdC5pc0VtcHR5KCkp
IHsKKyAgICAgICAgLy8gVGhpcyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNmb3JtZWQgY29vcmRp
bmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0LCBidXQKKyAgICAgICAgLy8gaXQgbmVlZHMg
dG8gYmUgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybWVk
IGNvbnRlbnRzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCByZWN0ID0gbV93ZWJQYWdlLT5k
LT5tYXBUb1RyYW5zZm9ybWVkKG1fY2xpZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHdp
bmRvd1JlY3QpKTsKKyAgICAgICAgcmVjdC5pbmZsYXRlKDEgLypkeCovLCAxIC8qZHkqLyk7IC8v
IEFjY291bnQgZm9yIGFudGktYWxpYXNpbmcgb2YgcHJldmlvdXMgcmVuZGVyaW5nIHJ1bnMuCisK
KyAgICAgICAgLy8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24g
V2ViQ29yZTo6LgorICAgICAgICBXZWJDb3JlOjpJbnRSZWN0IHRtcFJlY3QgPSByZWN0OworICAg
ICAgICBtX2NsaWVudC0+Y2xpcFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QodG1wUmVjdCk7CisK
KyAgICAgICAgcmVjdCA9IHRtcFJlY3Q7CisgICAgICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICAgICAg
cmVuZGVyKHJlY3QsIGZhbHNlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3Vs
YXJSZW5kZXIsIHJlY3QpOworICAgIH0KK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpz
bG93U2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKQoreworI2lmIERFQlVHX0JBQ0tJ
TkdTVE9SRQorICAgIC8vIFN0YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91Ymxl
IHRpbWUgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0
ZWRIZWxwZXIoZGVsdGEpOworCisgICAgLy8gVGhpcyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNm
b3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0LCBidXQKKyAgICAvLyBp
dCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdHJh
bnNmb3JtZWQgY29udGVudHMuCisgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFn
ZS0+ZC0+bWFwVG9UcmFuc2Zvcm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50
cyh3aW5kb3dSZWN0KSk7CisKKyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIocmVj
dCwgZmFsc2UgLypyZW5kZXJDb250ZW50T25seSovKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9y
ZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCwgcmVjdCk7
CisgICAgICAgIC8vIFdlIG9ubHkgYmxpdCBoZXJlIGlmIHRoZSBjbGllbnQgZGlkIG5vdCBnZW5l
cmF0ZSB0aGUgc2Nyb2xsIGFzIHRoZSBjbGllbnQKKyAgICAgICAgLy8gbm93IHN1cHBvcnRzIGJs
aXR0aW5nIGFzeW5jaHJvbm91c2x5IGR1cmluZyBzY3JvbGwgb3BlcmF0aW9ucworICAgICAgICBp
ZiAoIW1fY2xpZW50LT5pc0NsaWVudEdlbmVyYXRlZFNjcm9sbCgpICYmICFzaG91bGREaXJlY3RS
ZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICAgICAgYmxpdFZpc2libGVDb250ZW50cygpOwor
ICAgIH0KKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0b3AgdGhlIHRpbWUgbWVh
c3VyZW1lbnQKKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9n
TGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNsb3dTY3JvbGwgZWxhcHNlZD0l
ZiIsIGVsYXBzZWQpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Ny
b2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBj
bGlwUmVjdCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgZGlyZWN0IHJlbmRlcmluZyB0aGVuIHdlIGFy
ZSBmb3JjZWQgdG8gZ28gZG93biB0aGUgc2xvdyBwYXRoCisgICAgLy8gdG8gc2Nyb2xsaW5nCisg
ICAgaWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgUGxhdGZv
cm06OkludFJlY3Qgdmlld3BvcnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQ
YWdlLT5kLT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICAgICAgc2xvd1Njcm9sbChk
ZWx0YSwgbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNmb3JtZWQodmlld3BvcnRSZWN0KSwgdHJ1
ZSAvKmltbWVkaWF0ZSovKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JB
Q0tJTkdTVE9SRQorICAgIC8vIFN0YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91
YmxlIHRpbWUgPSBXVEY6OmN1cnJlbnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0
YXJ0ZWRIZWxwZXIoZGVsdGEpOworCisgICAgLy8gV2Ugb25seSBibGl0IGhlcmUgaWYgdGhlIGNs
aWVudCBkaWQgbm90IGdlbmVyYXRlIHRoZSBzY3JvbGwgYXMgdGhlIGNsaWVudAorICAgIC8vIG5v
dyBzdXBwb3J0cyBibGl0dGluZyBhc3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlv
bnMKKyAgICBpZiAoIW1fY2xpZW50LT5pc0NsaWVudEdlbmVyYXRlZFNjcm9sbCgpKQorICAgICAg
ICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICAv
LyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50CisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1
cnJlbnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpz
Y3JvbGwgZHg9JWQsIGR5PSVkIGVsYXBzZWQ9JWYiLCBkZWx0YS53aWR0aCgpLCBkZWx0YS5oZWln
aHQoKSwgZWxhcHNlZCk7CisjZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpz
Y3JvbGxpbmdTdGFydGVkSGVscGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSkKK3sK
KyAgICAvLyBOb3RpZnkgdGhlIHJlbmRlciBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBzaHVmZmxlIGFj
Y29yZGluZ2x5CisgICAgbV9yZW5kZXJRdWV1ZS0+dXBkYXRlU29ydERpcmVjdGlvbihkZWx0YS53
aWR0aCgpLCBkZWx0YS5oZWlnaHQoKSk7CisgICAgbV9yZW5kZXJRdWV1ZS0+dmlzaWJsZUNvbnRl
bnRDaGFuZ2VkKHZpc2libGVDb250ZW50c1JlY3QoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhlIGFj
dHVhbCBiYWNraW5nc3RvcmUKKyAgICBzY3JvbGxCYWNraW5nU3RvcmUoZGVsdGEud2lkdGgoKSwg
ZGVsdGEuaGVpZ2h0KCkpOworCisgICAgLy8gQWRkIGFueSBuZXdseSB2aXNpYmxlIHRpbGVzIHRo
YXQgaGF2ZSBub3QgYmVlbiBwcmV2aW91c2x5IHJlbmRlcmVkIHRvIHRoZSBxdWV1ZQorICAgIC8v
IGFuZCBjaGVjayBpZiB0aGUgdGlsZSB3YXMgcHJldmlvdXNseSByZW5kZXJlZCBieSByZWd1bGFy
IHJlbmRlciBqb2IKKyAgICB1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24o
KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRTdXBwcmVzc05vblZpc2li
bGVSZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7CisjaWYgU1VQUFJFU1NfTk9OX1ZJU0lCTEVf
UkVHVUxBUl9SRU5ERVJfSk9CUworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICAvLyBBbHdh
eXMgc3VwcHJlc3Mgd2hlbiBsb2FkaW5nIGFzIHRoaXMgZHJhc3RpY2FsbHkgZGVjcmVhc2VzIHBh
Z2UgbG9hZGluZworICAgIC8vIHRpbWUuLi4KKyAgICByZXR1cm4gbV9jbGllbnQtPmlzTG9hZGlu
ZygpOworI2VuZGlmCit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkUGVyZm9y
bVJlbmRlckpvYnMoKSBjb25zdAoreworICAgIHJldHVybiAobV93ZWJQYWdlLT5pc1Zpc2libGUo
KSB8fCBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSAmJiAhbV9zdXNwZW5kUmVuZGVy
Sm9icyAmJiAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhbV9yZW5kZXJRdWV1ZS0+
aXNFbXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdT
dG9yZVByaXZhdGU6OnNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkgJiYgIW1fc3VzcGVuZFJlZ3VsYXJS
ZW5kZXJKb2JzOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0YXJ0UmVuZGVyVGlt
ZXIoKQoreworICAgIC8vIENhbGxlZCB3aGVuIHJlbmRlciBxdWV1ZSBoYXMgYSBuZXcgam9iIGFk
ZGVkCisgICAgaWYgKG1fcmVuZGVyVGltZXItPmlzQWN0aXZlKCkgfHwgbV9yZW5kZXJRdWV1ZS0+
aXNFbXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpKQorICAgICAgICByZXR1cm47CisK
KyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0
ZTo6c3RhcnRSZW5kZXJUaW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRp
ZgorICAgIG1fcmVuZGVyVGltZXItPnN0YXJ0T25lU2hvdChzX3JlbmRlclRpbWVyVGltZW91dCk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyKCkKK3sKKyAg
ICBpZiAoIW1fcmVuZGVyVGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIENhbGxlZCB3aGVuIHdlIHJlbmRlciBzb21ldGhpbmcgdG8gcmVzdGFydAorI2lmIERFQlVH
X0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzdG9wUmVu
ZGVyVGltZXIgdGltZT0lZiIsIFdURjo6Y3VycmVudFRpbWUoKSk7CisjZW5kaWYKKyAgICBtX3Jl
bmRlclRpbWVyLT5zdG9wKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVy
T25UaW1lcihXZWJDb3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPiopCit7CisgICAgLy8g
VGhpcyB0aW1lciBpcyBhIHRoaXJkIG1ldGhvZCBvZiBzdGFydGluZyBhIHJlbmRlciBvcGVyYXRp
b24gdGhhdCBpcyBhIGNhdGNoLWFsbC4gSWYgbW9yZQorICAgIC8vIHRoYW4gc19yZW5kZXJUaW1l
clRpbWVvdXQgZWxhcHNlcyB3aXRoIG5vIHJlbmRlcmluZyB0YWtpbmcgcGxhY2UgYW5kIHJlbmRl
ciBqb2JzIGluIHRoZSBxdWV1ZSwgdGhlbgorICAgIC8vIHJlbmRlck9uVGltZXIgd2lsbCBiZSBj
YWxsZWQgd2hpY2ggd2lsbCBhY3R1YWxseSByZW5kZXIuCisgICAgaWYgKCFzaG91bGRQZXJmb3Jt
UmVuZGVySm9icygpKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25UaW1lciB0aW1lPSVm
IiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIHdoaWxlIChtX3JlbmRlclF1ZXVl
LT5oYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IoKSB8fCBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50
VmlzaWJsZVNjcm9sbEpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3Vz
cGVuZFJlZ3VsYXJSZW5kZXJKb2JzKTsKKworICAgIGlmICghc2hvdWxkUGVyZm9ybVJlZ3VsYXJS
ZW5kZXJKb2JzKCkgfHwgIW1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRSZWd1bGFyUmVuZGVySm9i
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlckFsbEN1cnJl
bnRSZWd1bGFyUmVuZGVySm9icygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
bmRlck9uSWRsZSgpCit7CisgICAgQVNTRVJUKHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkpOwor
CisgICAgLy8gTGV0IHRoZSByZW5kZXIgcXVldWUga25vdyB0aGF0IHdlIGVudGVyZWQgYSBuZXcg
ZXZlbnQgcXVldWUgY3ljbGUKKyAgICAvLyBzbyBpdCBjYW4gZGV0ZXJtaW5lIGlmIGl0IGlzIHVu
ZGVyIHByZXNzdXJlCisgICAgbV9yZW5kZXJRdWV1ZS0+ZXZlbnRRdWV1ZUN5Y2xlZCgpOworCisj
aWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6
OnJlbmRlck9uSWRsZSIpOworI2VuZGlmCisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1f
c3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRl
Ojp3aWxsRmlyZVRpbWVyKCkKK3sKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93IHRo
YXQgd2UgZW50ZXJlZCBhIG5ldyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNhbiBk
ZXRlcm1pbmUgaWYgaXQgaXMgdW5kZXIgcHJlc3N1cmUuCisgICAgbV9yZW5kZXJRdWV1ZS0+ZXZl
bnRRdWV1ZUN5Y2xlZCgpOworCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVndWxhclJlbmRlckpv
YnMoKSB8fCAhbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IoKSB8fCAh
bV9yZW5kZXJRdWV1ZS0+Y3VycmVudFJlZ3VsYXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1cmUo
KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2lsbEZpcmVUaW1lciIpOworI2VuZGlmCisK
KyAgICAvLyBXZSd2ZSBkZXRlY3RlZCB0aGF0IHRoZSByZWd1bGFyIHJlbmRlciBqb2JzIGFyZSBj
b21pbmcgdW5kZXIgcHJlc3N1cmUgbGlrZWx5CisgICAgLy8gZHVlIHRvIHRpbWVycyBmaXJpbmcg
cHJvZHVjaW5nIGludmFsaWRhdGlvbiBqb2JzIGFuZCBvdXIgZWZmb3J0cyB0byBicmVhayB0aGVt
CisgICAgLy8gdXAgaW50byBiaXRlIHNpemUgcGllY2VzIGhhcyBwcm9kdWNlZCBhIHNpdHVhdGlv
biB3aGVyZSB3ZSBjYW4gbm90IGNvbXBsZXRlCisgICAgLy8gYSBiYXRjaCBvZiB0aGVtIGJlZm9y
ZSByZWNlaXZpbmcgbW9yZSB0aGF0IGludGVyc2VjdCB0aGVtIHdoaWNoIGNhdXNlcyB1cworICAg
IC8vIHRvIHN0YXJ0IHRoZSBiYXRjaCBvdmVyLiBUbyBtaXRpZ2F0ZSB0aGlzIHdlIGhhdmUgdG8g
ZW1wdHkgdGhlIGN1cnJlbnQgYmF0Y2gKKyAgICAvLyB3aGVuIHRoaXMgaXMgZGV0ZWN0ZWQuCisK
KyAgICAvLyBXZSBzdGlsbCB3YW50IHRvIHBlcmZvcm0gcHJpb3JpdHkgam9icyBmaXJzdCB0byBh
dm9pZCByZWR1bmRhbnQgcGFpbnRzLgorICAgIHdoaWxlIChtX3JlbmRlclF1ZXVlLT5oYXNDdXJy
ZW50VmlzaWJsZVpvb21Kb2IoKSB8fCBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50VmlzaWJsZVNj
cm9sbEpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3VzcGVuZFJlZ3Vs
YXJSZW5kZXJKb2JzKTsKKworICAgIGlmIChtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxh
clJlbmRlckpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXJBbGxDdXJyZW50UmVn
dWxhclJlbmRlckpvYnMoKTsKKworICAgIC8vIExldCB0aGUgY2FsbGVyIHlpZWxkIGFuZCByZXNj
aGVkdWxlIHRoZSB0aW1lci4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BsYXRmb3JtOjpJbnRS
ZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmV4cGFuZGVkQ29udGVudHNSZWN0KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBl
eHBhbmRlZENvbnRlbnRzU2l6ZSgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGlu
dGVyc2VjdGlvbihtX2NsaWVudC0+dHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9p
bnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKSk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnVuY2xpcHBlZFZpc2libGVDb250
ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+dHJhbnNmb3JtZWRWaXNp
YmxlQ29udGVudHNSZWN0KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxk
TW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0
Cit7CisgICAgcmV0dXJuIGNhbk1vdmVYKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAm
JiBiYWNraW5nU3RvcmVSZWN0LngoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS54KCkKKyAgICAg
ICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgpID4gZXhwYW5kZWRDb250ZW50c1JlY3QoKS54
KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZVJpZ2h0KGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJldHVy
biBjYW5Nb3ZlWChiYWNraW5nU3RvcmVSZWN0KQorICAgICAgICAgICAgJiYgYmFja2luZ1N0b3Jl
UmVjdC5yaWdodCgpIDwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpLnJpZ2h0KCkKKyAgICAgICAgICAg
ICYmIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8IGV4cGFuZGVkQ29udGVudHNSZWN0KCkucmln
aHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlVXAoY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGNhbk1vdmVZKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVS
ZWN0LnkoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS55KCkKKyAgICAgICAgICAgICYmIGJhY2tp
bmdTdG9yZVJlY3QueSgpID4gZXhwYW5kZWRDb250ZW50c1JlY3QoKS55KCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZURvd24oY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVZKGJhY2tp
bmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgpIDwg
dmlzaWJsZUNvbnRlbnRzUmVjdCgpLmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3Rv
cmVSZWN0LmJvdHRvbSgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5ib3R0b20oKTsKK30KKwor
Ym9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVj
dC53aWR0aCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLndpZHRoKCk7Cit9CisKK2Jvb2wgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tp
bmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuaGVpZ2h0
KCkgPiB2aXNpYmxlQ29udGVudHNSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y2FuTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNv
bnN0Cit7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7Cisg
ICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2libGVD
b250ZW50c1JlY3QoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0aGlz
LT5leHBhbmRlZENvbnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgtdGls
ZVdpZHRoKCksIDApOworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPj0gdmlz
aWJsZUNvbnRlbnRzUmVjdC5yaWdodCgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0
LngoKSA+PSBjb250ZW50c1JlY3QueCgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6
OmNhbk1vdmVSaWdodChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0Zm9y
bTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRzUmVj
dCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFuZGVk
Q29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKHRpbGVXaWR0aCgpLCAw
KTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC54KCkgPD0gdmlzaWJsZUNvbnRlbnRzUmVj
dC54KCkKKyAgICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPD0gY29udGVu
dHNSZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkg
LSBjb250ZW50c1JlY3QucmlnaHQoKSkgPCB0aWxlV2lkdGgoKSk7Cit9CisKK2Jvb2wgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVVwKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBj
b25zdAoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0Owor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxl
Q29udGVudHNSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhp
cy0+ZXhwYW5kZWRDb250ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwg
LXRpbGVIZWlnaHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkgPj0g
dmlzaWJsZUNvbnRlbnRzUmVjdC5ib3R0b20oKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0b3Jl
UmVjdC55KCkgPj0gY29udGVudHNSZWN0LnkoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjpjYW5Nb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRz
UmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFu
ZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKDAsIHRpbGVIZWln
aHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QueSgpIDw9IHZpc2libGVDb250ZW50
c1JlY3QueSgpCisgICAgICAgICAgICAmJiAoYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA8PSBj
b250ZW50c1JlY3QuYm90dG9tKCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0LmJv
dHRvbSgpIC0gY29udGVudHNSZWN0LmJvdHRvbSgpKSA8IHRpbGVIZWlnaHQoKSk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmJhY2tpbmdTdG9yZVJlY3RGb3JT
Y3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJl
Y3QpIGNvbnN0Cit7CisgICAgLy8gVGhlIGN1cnJlbnQgcmVjdAorICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworCisgICAgLy8gVGhpcyBtZXRob2QgdXNlcyB0
aGUgZGVsdGEgdmFsdWVzIHRvIGRlc2NyaWJlIHRoZSBiYWNraW5nc3RvcmUgcmVjdAorICAgIC8v
IGdpdmVuIHRoZSBjdXJyZW50IHNjcm9sbCBkaXJlY3Rpb24gYW5kIHRoZSB2aWV3cG9ydCBwb3Np
dGlvbi4gSG93ZXZlciwKKyAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGggbm8g
ZGVsdGFzIHdoYXRzb2V2ZXIgZm9yIGluc3RhbmNlIHdoZW4KKyAgICAvLyB0aGUgY29udGVudHMg
c2l6ZSBjaGFuZ2VzIG9yIHRoZSBvcmllbnRhdGlvbiBjaGFuZ2VzLiBJbiB0aGlzIGNhc2UsIHdl
CisgICAgLy8gd2FudCB0byB1c2UgdGhlIHByZXZpb3VzIHNjcm9sbCBkaXJlY3Rpb24gdG8gZGVz
Y3JpYmUgdGhlIGJhY2tpbmdzdG9yZQorICAgIC8vIHJlY3QuIFRoaXMgd2lsbCByZXN1bHQgaW4g
bGVzcyBjaGVja2VyYm9hcmQuCisgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgeworICAgICAg
ICBkZWx0YVggPSBtX3ByZXZpb3VzRGVsdGEud2lkdGgoKTsKKyAgICAgICAgZGVsdGFZID0gbV9w
cmV2aW91c0RlbHRhLmhlaWdodCgpOworICAgIH0KKyAgICBtX3ByZXZpb3VzRGVsdGEgPSBQbGF0
Zm9ybTo6SW50U2l6ZShkZWx0YVgsIGRlbHRhWSk7CisKKyAgICAvLyBSZXR1cm4gdG8gb3JpZ2lu
IGlmIG5lZWQgYmUKKyAgICBpZiAoIWNhbk1vdmVYKGJhY2tpbmdTdG9yZVJlY3QpICYmIGJhY2tp
bmdTdG9yZVJlY3QueCgpKQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0LnNldFgoMCk7CisKKyAg
ICBpZiAoIWNhbk1vdmVZKGJhY2tpbmdTdG9yZVJlY3QpICYmIGJhY2tpbmdTdG9yZVJlY3QueSgp
KQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0LnNldFkoMCk7CisKKyAgICAvLyBNb3ZlIHRoZSBy
ZWN0IGxlZnQKKyAgICB3aGlsZSAoc2hvdWxkTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVjdCkgfHwg
KGRlbHRhWCA+IDAgJiYgY2FuTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVjdCkpKQorICAgICAgICBi
YWNraW5nU3RvcmVSZWN0Lm1vdmUoLXRpbGVXaWR0aCgpLCAwKTsKKworICAgIC8vIE1vdmUgdGhl
IHJlY3QgcmlnaHQKKyAgICB3aGlsZSAoc2hvdWxkTW92ZVJpZ2h0KGJhY2tpbmdTdG9yZVJlY3Qp
IHx8IChkZWx0YVggPCAwICYmIGNhbk1vdmVSaWdodChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAg
ICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSh0aWxlV2lkdGgoKSwgMCk7CisKKyAgICAvLyBNb3Zl
IHRoZSByZWN0IHVwCisgICAgd2hpbGUgKHNob3VsZE1vdmVVcChiYWNraW5nU3RvcmVSZWN0KSB8
fCAoZGVsdGFZID4gMCAmJiBjYW5Nb3ZlVXAoYmFja2luZ1N0b3JlUmVjdCkpKQorICAgICAgICBi
YWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgLXRpbGVIZWlnaHQoKSk7CisKKyAgICAvLyBNb3ZlIHRo
ZSByZWN0IGRvd24KKyAgICB3aGlsZSAoc2hvdWxkTW92ZURvd24oYmFja2luZ1N0b3JlUmVjdCkg
fHwgKGRlbHRhWSA8IDAgJiYgY2FuTW92ZURvd24oYmFja2luZ1N0b3JlUmVjdCkpKQorICAgICAg
ICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgpKTsKKworICAgIHJldHVybiBi
YWNraW5nU3RvcmVSZWN0OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tp
bmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpCit7
CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRTaG91bGRSZXNl
dFRpbGVzV2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8g
UmVjb3JkIHRoZSBjdXJyZW50IGJhY2tpbmdzdG9yZSByZWN0LgorICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0ID0gZnJvbnRTdGF0ZSgpLT5iYWNraW5nU3RvcmVS
ZWN0KCk7CisKKyAgICBpZiAoYmFja2luZ1N0b3JlUmVjdCA9PSBjdXJyZW50QmFja2luZ1N0b3Jl
UmVjdCkKKyAgICAgICAgcmV0dXJuOworCisjaWYgREVCVUdfVElMRU1BVFJJWAorICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRCYWNraW5nU3RvcmVSZWN0IGNoYW5nZWQgZnJv
bSAoJWQsJWQgJWR4JWQpIHRvICglZCwlZCAlZHglZCkiLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QueCgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QueSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LmhlaWdodCgpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC54KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiYWNraW5nU3RvcmVSZWN0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJh
Y2tpbmdTdG9yZVJlY3QuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICBCYWNraW5nU3RvcmVHZW9t
ZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAgY3VycmVudE1h
cCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgLy8gVGhlIGxpc3Qgb2YgaW5kZXhl
cyB3ZSBuZWVkIHRvIGZpbGwKKyAgICBUaWxlSW5kZXhMaXN0IGluZGV4ZXNUb0ZpbGwgPSBpbmRl
eGVzRm9yQmFja2luZ1N0b3JlUmVjdChiYWNraW5nU3RvcmVSZWN0KTsKKworICAgIEFTU0VSVChz
dGF0aWNfY2FzdDxpbnQ+KGluZGV4ZXNUb0ZpbGwuc2l6ZSgpKSA9PSBjdXJyZW50TWFwLnNpemUo
KSk7CisKKyAgICBUaWxlTWFwIG5ld1RpbGVNYXA7CisgICAgVGlsZU1hcCBsZWZ0T3ZlclRpbGVz
OworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIG91ciBjdXJyZW50IHRpbGUgbWFwIGFuZCBhZGQg
dGlsZXMgdGhhdCBhcmUgcmVuZGVyZWQgd2l0aAorICAgIC8vIG91ciBuZXcgYmFja2luZ3N0b3Jl
IHJlY3QuCisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgdGlsZU1hcEVuZCA9IGN1cnJlbnRN
YXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRN
YXAuYmVnaW4oKTsgaXQgIT0gdGlsZU1hcEVuZDsgKytpdCkgeworICAgICAgICBUaWxlSW5kZXgg
b2xkSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBp
dC0+c2Vjb25kOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBvbGQgaW5kZXguCisgICAgICAgIHJl
c2V0VGlsZShvbGRJbmRleCwgdGlsZSwgZmFsc2UgLypyZXNldEJhY2tncm91bmQqLyk7CisKKyAg
ICAgICAgLy8gT3JpZ2luIG9mIGxhc3QgY29tbWl0dGVkIHJlbmRlciBmb3IgdGlsZSBpbiB0cmFu
c2Zvcm1lZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQg
b3JpZ2luID0gb3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShvbGRJbmRleCwgdGlsZSwgY3VycmVu
dEJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIElmIHRoZSBuZXcgYmFja2luZyBzdG9y
ZSByZWN0IGNvbnRhaW5zIHRoaXMgb3JpZ2luLCB0aGVuIGluc2VydCB0aGUgdGlsZSB0aGVyZQor
ICAgICAgICAvLyBhbmQgbWFyayBpdCBhcyBubyBsb25nZXIgc2hpZnRlZC4gTm90ZTogUGxhdGZv
cm06OkludFJlY3Q6OmNvbnRhaW5zIGNoZWNrcyBmb3IgYSAxeDEgcmVjdAorICAgICAgICAvLyBi
ZWxvdyBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBvcmlnaW4gc28gaXQgaXMgY29ycmVjdCB1c2Fn
ZSBoZXJlLgorICAgICAgICBpZiAoYmFja2luZ1N0b3JlUmVjdC5jb250YWlucyhvcmlnaW4pKSB7
CisgICAgICAgICAgICBUaWxlSW5kZXggbmV3SW5kZXggPSBpbmRleE9mVGlsZShvcmlnaW4sIGJh
Y2tpbmdTdG9yZVJlY3QpOworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdChvcmln
aW4sIHRpbGVTaXplKCkpOworICAgICAgICAgICAgaWYgKG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJS
ZW5kZXJKb2JzUHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKHJlY3QpKSB7CisgICAg
ICAgICAgICAgICAgLy8gSWYgdGhlIHJlbmRlciBxdWV1ZSBwcmV2aW91c2x5IHRyaWVkIHRvIHJl
bmRlciB0aGlzIHRpbGUsIGJ1dCB0aGUKKyAgICAgICAgICAgICAgICAvLyBiYWNraW5nc3RvcmUg
d2Fzbid0IGluIHRoZSBjb3JyZWN0IHBsYWNlIG9yIHRoZSB0aWxlIHdhc24ndCB2aXNpYmxlCisg
ICAgICAgICAgICAgICAgLy8gYXQgdGhlIHRpbWUgdGhlbiB3ZSBjYW4ndCBzaW1wbHkgcmVzdG9y
ZSB0aGUgdGlsZSBzaW5jZSB0aGUgY29udGVudAorICAgICAgICAgICAgICAgIC8vIGlzIG5vdyBp
bnZhbGlkIGFzIGZhciBhcyBXZWJLaXQgaXMgY29uY2VybmVkLiBJbnN0ZWFkLCB3ZSBjbGVhcgor
ICAgICAgICAgICAgICAgIC8vIHRoZSB0aWxlIGhlcmUgb2YgdGhlIHJlZ2lvbiBhbmQgdGhlbiBw
dXQgdGhlIHRpbGUgaW4gdGhlIHJlbmRlcgorICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGFnYWlu
LgorCisgICAgICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSB0aWxlIHdpdGggdGhlIG5vdCBy
ZW5kZXJlZCByZWdpb24gdG8gZ2V0IHRoZSBhcmVhcworICAgICAgICAgICAgICAgIC8vIG9mIHRo
ZSB0aWxlIHRoYXQgd2UgbmVlZCB0byBjbGVhci4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJl
Z2lvbjo6aW50ZXJzZWN0UmVnaW9ucyhtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic05v
dFJlbmRlcmVkUmVnaW9uKCksIHJlY3QpOworICAgICAgICAgICAgICAgIGNsZWFyQW5kVXBkYXRl
VGlsZU9mTm90UmVuZGVyZWRSZWdpb24obmV3SW5kZXgsIHRpbGUsIHRpbGVOb3RSZW5kZXJlZFJl
Z2lvbiwgYmFja2luZ1N0b3JlUmVjdCk7CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgICAg
ICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lv
bi5leHRlbnRzKCk7CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OnNldEJhY2tpbmdTdG9yZVJlY3QgZGlkIGNsZWFyIHRpbGUgJWQsJWQgJWR4JWQiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50cy54KCksIGV4dGVudHMu
eSgpLCBleHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVpZ2h0KCkpOworI2VuZGlmCisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUK
KyAgICAgICAgICAgICAgICBpZiAoIXRpbGUtPmZyb250QnVmZmVyKCktPmlzUmVuZGVyZWQoKQor
ICAgICAgICAgICAgICAgICAgICAmJiAhaXNDdXJyZW50VmlzaWJsZUpvYihuZXdJbmRleCwgdGls
ZSwgYmFja2luZ1N0b3JlUmVjdCkpCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVRpbGUob3Jp
Z2luLCBmYWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
Ly8gRG8gc29tZSBib29ra2VlcGluZyB3aXRoIHNoaWZ0aW5nIHRpbGVzLi4uCisgICAgICAgICAg
ICB0aWxlLT5jbGVhclNoaWZ0KCk7CisgICAgICAgICAgICB0aWxlLT5zZXRDb21taXR0ZWQodHJ1
ZSk7CisKKyAgICAgICAgICAgIHNpemVfdCBpID0gaW5kZXhlc1RvRmlsbC5maW5kKG5ld0luZGV4
KTsKKyAgICAgICAgICAgIEFTU0VSVChpICE9IFdURjo6bm90Rm91bmQpOworICAgICAgICAgICAg
aW5kZXhlc1RvRmlsbC5yZW1vdmUoaSk7CisgICAgICAgICAgICBuZXdUaWxlTWFwLmFkZChuZXdJ
bmRleCwgdGlsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBTdG9yZSB0aGlz
IHRpbGUgYW5kIGluZGV4IHNvIHdlIGNhbiBhZGQgaXQgdG8gdGhlIHJlbWFpbmluZyBsZWZ0IG92
ZXIgc3BvdHMuLi4KKyAgICAgICAgICAgIGxlZnRPdmVyVGlsZXMuYWRkKG9sZEluZGV4LCB0aWxl
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KGluZGV4
ZXNUb0ZpbGwuc2l6ZSgpKSA9PSBsZWZ0T3ZlclRpbGVzLnNpemUoKSk7CisgICAgc2l6ZV90IGkg
PSAwOworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGxlZnRPdmVyRW5kID0gbGVmdE92ZXJU
aWxlcy5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbGVmdE92
ZXJUaWxlcy5iZWdpbigpOyBpdCAhPSBsZWZ0T3ZlckVuZDsgKytpdCkgeworICAgICAgICBUaWxl
SW5kZXggb2xkSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRp
bGUgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoIShpIDwgaW5kZXhlc1RvRmlsbC5zaXplKCkp
KSB7CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisKKyAgICAgICAgVGlsZUluZGV4IG5ld0luZGV4ID0gaW5kZXhlc1RvRmls
bC5hdChpKTsKKworICAgICAgICAvLyBPcmlnaW4gb2YgbGFzdCBjb21taXR0ZWQgcmVuZGVyIGZv
ciB0aWxlIGluIHRyYW5zZm9ybWVkIGNvbnRlbnQgY29vcmRpbmF0ZXMuCisgICAgICAgIFBsYXRm
b3JtOjpJbnRQb2ludCBvcmlnaW5PZk9sZCA9IG9yaWdpbk9mTGFzdFJlbmRlckZvclRpbGUob2xk
SW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KTsKKyAgICAgICAgLy8gT3JpZ2lu
IG9mIHRoZSBuZXcgaW5kZXggZm9yIHRoZSBuZXcgYmFja2luZ3N0b3JlIHJlY3QuCisgICAgICAg
IFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZk5ldyA9IG9yaWdpbk9mVGlsZShuZXdJbmRleCwg
YmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8gTWFyayBhcyBuZWVkaW5nIHVwZGF0ZS4K
KyAgICAgICAgdXBkYXRlVGlsZShvcmlnaW5PZk5ldywgZmFsc2UgLyppbW1lZGlhdGUqLyk7CisK
KyAgICAgICAgLy8gRG8gc29tZSBib29ra2VlcGluZyB3aXRoIHNoaWZ0aW5nIHRpbGVzLi4uCisg
ICAgICAgIHRpbGUtPmNsZWFyU2hpZnQoKTsKKyAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKGZh
bHNlKTsKKyAgICAgICAgdGlsZS0+c2V0SG9yaXpvbnRhbFNoaWZ0KChvcmlnaW5PZk9sZC54KCkg
LSBvcmlnaW5PZk5ldy54KCkpIC8gdGlsZVdpZHRoKCkpOworICAgICAgICB0aWxlLT5zZXRWZXJ0
aWNhbFNoaWZ0KChvcmlnaW5PZk9sZC55KCkgLSBvcmlnaW5PZk5ldy55KCkpIC8gdGlsZUhlaWdo
dCgpKTsKKworICAgICAgICBuZXdUaWxlTWFwLmFkZChuZXdJbmRleCwgdGlsZSk7CisKKyAgICAg
ICAgKytpOworICAgIH0KKworICAgIC8vIENoZWNrcyB0byBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBs
b3N0IGFueSB0aWxlcy4KKyAgICBBU1NFUlQoY3VycmVudE1hcC5zaXplKCkgPT0gbmV3VGlsZU1h
cC5zaXplKCkpOworCisgICAgLy8gQWN0dWFsbHkgc2V0IHN0YXRlLgorICAgIGJhY2tTdGF0ZSgp
LT5zZXROdW1iZXJPZlRpbGVzV2lkZShiYWNraW5nU3RvcmVSZWN0LndpZHRoKCkgLyB0aWxlV2lk
dGgoKSk7CisgICAgYmFja1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNIaWdoKGJhY2tpbmdTdG9y
ZVJlY3QuaGVpZ2h0KCkgLyB0aWxlSGVpZ2h0KCkpOworICAgIGJhY2tTdGF0ZSgpLT5zZXRCYWNr
aW5nU3RvcmVPZmZzZXQoYmFja2luZ1N0b3JlUmVjdC5sb2NhdGlvbigpKTsKKyAgICBiYWNrU3Rh
dGUoKS0+c2V0VGlsZU1hcChuZXdUaWxlTWFwKTsKKworICAgIC8vIFN3YXAgdGhlIGZyb250L2Jh
Y2sgc3RhdGUuCisgICAgc3dhcFN0YXRlKCk7Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRp
bGVJbmRleExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJl
Y3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7Cisg
ICAgVGlsZUluZGV4TGlzdCBpbmRleGVzOworICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGJh
Y2tpbmdTdG9yZVJlY3Qud2lkdGgoKSAvIHRpbGVXaWR0aCgpOworICAgIGludCBudW1iZXJPZlRp
bGVzSGlnaCA9IGJhY2tpbmdTdG9yZVJlY3QuaGVpZ2h0KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAg
Zm9yIChpbnQgeSA9IDA7IHkgPCBudW1iZXJPZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZv
ciAoaW50IHggPSAwOyB4IDwgbnVtYmVyT2ZUaWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAg
VGlsZUluZGV4IGluZGV4KHgsIHkpOworICAgICAgICAgICAgaW5kZXhlcy5hcHBlbmQoaW5kZXgp
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbmRleGVzOworfQorCitQbGF0Zm9ybTo6
SW50UG9pbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShj
b25zdCBUaWxlSW5kZXgmIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QK
K3sKKyAgICByZXR1cm4gb3JpZ2luT2ZUaWxlKGluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShpbmRl
eCwgdGlsZSksIGJhY2tpbmdTdG9yZVJlY3QpOworfQorCitUaWxlSW5kZXggQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6aW5kZXhPZkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgs
IEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFRpbGVJbmRleChp
bmRleC5pKCkgKyB0aWxlLT5ob3Jpem9udGFsU2hpZnQoKSwgaW5kZXguaigpICsgdGlsZS0+dmVy
dGljYWxTaGlmdCgpKTsKK30KKworVGlsZUluZGV4IEJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4
T2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNr
aW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIGludCBvZmZzZXRYID0gb3JpZ2luLngoKSAtIGJh
Y2tpbmdTdG9yZVJlY3QueCgpOworICAgIGludCBvZmZzZXRZID0gb3JpZ2luLnkoKSAtIGJhY2tp
bmdTdG9yZVJlY3QueSgpOworICAgIGlmIChvZmZzZXRYKQorICAgICAgICBvZmZzZXRYID0gb2Zm
c2V0WCAvIHRpbGVXaWR0aCgpOworICAgIGlmIChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0g
b2Zmc2V0WSAvIHRpbGVIZWlnaHQoKTsKKyAgICByZXR1cm4gVGlsZUluZGV4KG9mZnNldFgsIG9m
ZnNldFkpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQW5kVXBkYXRlVGls
ZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3Jl
VGlsZSogdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgdGlsZU5v
dFJlbmRlcmVkUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5n
U3RvcmVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgdXBkYXRlKQoreworICAgIC8vIEludGVyc2VjdCB0aGUg
dGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQgcmVnaW9uIHRvIGdldCB0aGUgYXJlYXMKKyAgICAv
LyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQgdG8gY2xlYXIuCisgICAgSW50UmVjdExpc3QgdGls
ZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMgPSB0aWxlTm90UmVuZGVyZWRSZWdpb24ucmVjdHMoKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3RzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3QgPSB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5hdChpKTsKKyAgICAgICAgLy8g
Q2xlYXIgdGhlIHJlbmRlciBxdWV1ZSBvZiB0aGlzIHJlY3QuCisgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmNsZWFyKHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QsIHRydWUgLypjbGVhclJlZ3VsYXJS
ZW5kZXJKb2JzKi8pOworCisgICAgICAgIGlmICh1cGRhdGUpIHsKKyAgICAgICAgICAgIC8vIEFk
ZCBpdCBhZ2FpbiBhcyBhIHJlZ3VsYXIgcmVuZGVyIGpvYi4KKyAgICAgICAgICAgIG1fcmVuZGVy
UXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIHRpbGVOb3RSZW5k
ZXJlZFJlZ2lvblJlY3QpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCB0aGUgb3JpZ2lu
IG9mIHRoaXMgdGlsZS4KKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdp
bk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRp
bGUgY29vcmRpbmF0ZXMuCisgICAgICAgIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QubW92ZSgt
b3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworCisgICAgICAgIC8vIENsZWFyIHRoZSB0aWxlIG9m
IHRoaXMgcmVnaW9uLgorICAgICAgICB0aWxlLT5mcm9udEJ1ZmZlcigpLT5jbGVhclJlbmRlcmVk
UmVnaW9uKHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpOworICAgICAgICB0aWxlLT5iYWNrQnVm
ZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24odGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7Cisg
ICAgfQorfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmlzQ3VycmVudFZpc2libGVKb2Io
Y29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgLy8gRmlyc3Qg
Y2hlY2sgaWYgdGhlIHdob2xlIHJlY3QgaXMgaW4gdGhlIHF1ZXVlCisgICAgUGxhdGZvcm06Oklu
dFJlY3Qgd2hvbGVSZWN0ID0gUGxhdGZvcm06OkludFJlY3Qob3JpZ2luT2ZUaWxlKGluZGV4LCBi
YWNraW5nU3RvcmVSZWN0KSwgdGlsZVNpemUoKSk7CisgICAgaWYgKG1fcmVuZGVyUXVldWUtPmlz
Q3VycmVudFZpc2libGVTY3JvbGxKb2Iod2hvbGVSZWN0KSB8fCBtX3JlbmRlclF1ZXVlLT5pc0N1
cnJlbnRWaXNpYmxlU2Nyb2xsSm9iQ29tcGxldGVkKHdob2xlUmVjdCkpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgLy8gU2Vjb25kIGNoZWNrIGlmIHRoZSBpbmRpdmlkdWFsIHBhcnRzIG9m
IHRoZSBub24tcmVuZGVyZWQgcmVnaW9uIGFyZSBpbiB0aGUgcmVndWxhciBxdWV1ZQorICAgIGJv
b2wgaXNDdXJyZW50ID0gdHJ1ZTsgLy8gaXQgaXMgdHJ1ZSB1bnRpbCBpdCBpc24ndCA6KQorCisg
ICAgSW50UmVjdExpc3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMgPSB0aWxlLT5mcm9udEJ1
ZmZlcigpLT5ub3RSZW5kZXJlZFJlZ2lvbigpLnJlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5zaXplKCk7ICsraSkgeworICAgICAg
ICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0ID0gdGlsZU5vdFJl
bmRlcmVkUmVnaW9uUmVjdHMuYXQoaSk7CisgICAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbiBvZiB0
aGlzIHRpbGUKKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGls
ZShpbmRleCwgYmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRyYW5zZm9y
bWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzCisgICAgICAgIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJl
Y3QubW92ZShvcmlnaW4ueCgpLCBvcmlnaW4ueSgpKTsKKworICAgICAgICAvLyBDaGVjayBpZiBp
dCBpcyBjdXJyZW50CisgICAgICAgIGlzQ3VycmVudCA9IG1fcmVuZGVyUXVldWUtPmlzQ3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2IodGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCkgPyBpc0N1cnJlbnQg
OiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gaXNDdXJyZW50OworfQorCit2b2lkIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnNjcm9sbEJhY2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZ
KQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxk
UmVzZXRUaWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIENhbGN1bGF0ZSBvdXIgbmV3IHByZWZlcnJlZCBtYXRyaXggZGltZW5zaW9uCisgICAgaWYg
KGRlbHRhWCB8fCBkZWx0YVkpCisgICAgICAgIG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lv
biA9IGFicyhkZWx0YVgpID4gYWJzKGRlbHRhWSkgPyBIb3Jpem9udGFsIDogVmVydGljYWw7CisK
KyAgICAvLyBDYWxjdWxhdGUgb3VyIHByZWZlcnJlZCBtYXRyaXggZ2VvbWV0cnkKKyAgICBEaXZp
c29yIGRpdmlzb3IgPSBiZXN0RGl2aXNvcihleHBhbmRlZENvbnRlbnRzU2l6ZSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bU51bWJlck9mVGlsZXNXaWRl
KCksIG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lvbik7CisKKyNpZiBERUJVR19U
SUxFTUFUUklYCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbEJhY2tp
bmdTdG9yZSBkaXZpc29yICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlz
b3IuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yLnNlY29uZCk7Cisj
ZW5kaWYKKworICAgIC8vIEluaXRpYWxpemUgYSByZWN0IHdpdGggdGhhdCBuZXcgZ2VvbWV0cnkK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0KDAsIDAsIGRpdmlzb3IuZmly
c3QgKiB0aWxlV2lkdGgoKSwgZGl2aXNvci5zZWNvbmQgKiB0aWxlSGVpZ2h0KCkpOworCisgICAg
Ly8gU2Nyb2xsIHRoYXQgcmVjdCBzbyB0aGF0IGl0IGZpdHMgb3VyIGNvbnRlbnRzIGFuZCB2aWV3
cG9ydCBhbmQgc2Nyb2xsIGRlbHRhCisgICAgYmFja2luZ1N0b3JlUmVjdCA9IGJhY2tpbmdTdG9y
ZVJlY3RGb3JTY3JvbGwoZGVsdGFYLCBkZWx0YVksIGJhY2tpbmdTdG9yZVJlY3QpOworCisgICAg
QVNTRVJUKCFiYWNraW5nU3RvcmVSZWN0LmlzRW1wdHkoKSk7CisKKyAgICAvLyBTZXQgdGhlIHN0
YXRlCisgICAgc2V0QmFja2luZ1N0b3JlUmVjdChiYWNraW5nU3RvcmVSZWN0KTsKK30KKworYm9v
bCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXIoY29uc3QgSW50UmVjdExpc3QmIHJlY3RMaXN0
LCBib29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIC8vIEZJWE1FOiBXZSBjeWNsZSB0aHJv
dWdoIG9uZSBieSBvbmUgYW5kIG9ubHkgYmxpdCB0aGUgY29udGVudHMgYXQgdGhlIGVuZC4KKyAg
ICAvLyBUaGlzIGNhbiBiZSBpbXByb3ZlZCB1cG9uIGlmIHdlIGhhZCBhIG1hcEZyb21UcmFuc2Zv
cm1lZENvbnRlbnRzVG9UaWxlcyB0aGF0CisgICAgLy8gdG9vayBhIHNldCBvZiByZWN0cyBhbmQg
ZGVjb21wb3NlZCB0aGVtIGFwcHJvcHJpYXRlbHkKKyAgICBib29sIHJlbmRlcmVkID0gZmFsc2U7
CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAg
ICAgcmVuZGVyZWQgPSByZW5kZXIocmVjdExpc3QuYXQoaSksIHRydWUpID8gdHJ1ZSA6IHJlbmRl
cmVkOworCisgICAgaWYgKHJlbmRlcmVkICYmICFyZW5kZXJDb250ZW50T25seSkgeworICAgICAg
ICBpZiAoIXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0
VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludmFsaWRhdGVX
aW5kb3coKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZWQ7Cit9CisKK2Jvb2wgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6cmVuZGVyRGlyZWN0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIHJlY3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgLy8gUmVxdWVzdCBhIGxh
eW91dCBub3cgd2hpY2ggbWlnaHQgY2hhbmdlIHRoZSBjb250ZW50cyByZWN0CisgICAgcmVxdWVz
dExheW91dElmTmVlZGVkKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSBy
ZWN0OworICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QodW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVj
dCgpKTsKKworICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBzY3JlZW5SZWN0ID0gbV9jbGllbnQtPm1hcEZy
b21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGRpcnR5UmVjdCk7Cisg
ICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oc2NyZWVuUmVj
dCk7CisgICAgY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKwor
ICAgIHBhaW50RGVmYXVsdEJhY2tncm91bmQoZGlydHlSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCgpLCB0cnVlIC8qZmx1c2gqLyk7CisKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgb3Jp
Z2luID0gdW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpLmxvY2F0aW9uKCk7CisgICAgcmVu
ZGVyQ29udGVudHMoMCAvKm5vdCBuZWVkZWQgc2luY2Ugd2UncmUgZGlyZWN0IHJlbmRlcmluZyB0
byB3aW5kb3cqLywKKyAgICAgICAgICAgICAgICAgICBvcmlnaW4sIGRpcnR5UmVjdCk7CisgICAg
d2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19T
VVJGQUNFCisgICAgaWYgKG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dV
c2FnZSgpICE9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVz
YWdlKSB7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNsaXBwZWRSZWN0ID0gaW50ZXJzZWN0
aW9uKGRpcnR5UmVjdCwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAgYmxlbmRDb21w
b3NpdGluZ1N1cmZhY2UoY2xpcHBlZFJlY3QpOworICAgIH0KKyNlbmRpZgorCisgICAgYm9vbCBz
aG91bGRJbnZhbGlkYXRlID0gIW1fc3VzcGVuZFNjcmVlblVwZGF0ZXMgJiYgIXJlbmRlckNvbnRl
bnRPbmx5OworICAgIGlmICghc2hvdWxkSW52YWxpZGF0ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7
CisKKyAgICBpbnZhbGlkYXRlV2luZG93KHNjcmVlblJlY3QpOworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgcmVjdCwgYm9vbCByZW5kZXJDb250ZW50T25seSkKK3sKKyAgICBpZiAoIW1fd2ViUGFn
ZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlcXVlc3Qg
YSBsYXlvdXQgbm93IHdoaWNoIG1pZ2h0IGNoYW5nZSB0aGUgY29udGVudHMgcmVjdAorICAgIHJl
cXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisgICAgaWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkpCisgICAgICAgIHJldHVybiByZW5kZXJEaXJlY3RUb1dpbmRvdyhyZWN0LCByZW5k
ZXJDb250ZW50T25seSk7CisKKyAgICBUaWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJv
bVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKHJlY3QpOworICAgIGlmICh0aWxlUmVjdExpc3Qu
aXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyNpZiBERUJVR19CQUNLSU5HU1RP
UkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9y
ZVByaXZhdGU6OnJlbmRlciByZWN0PSglZCwlZCAlZHglZCksIHJlbmRlckNvbnRlbnRPbmx5PSVz
LCBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID0gJXMiLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJDb250ZW50T25seSA/ICJ0cnVlIiA6
ICJmYWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N1c3BlbmRCYWNraW5nU3Rv
cmVVcGRhdGVzID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKworICAgIGJvb2wgYmxpdHRp
bmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53
aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OldpbmRvdzo6R0xFUzJVc2FnZTsKKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50
U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0
YXRlLT50aWxlTWFwKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eUNvbnRlbnRzUmVj
dDsKKyAgICBib29sIHNob3VsZEJsaXQgPSAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAm
JiAhcmVuZGVyQ29udGVudE9ubHk7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29udGVu
dHNSZWN0ID0gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2Ns
aWVudC0+dHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSk7CisgICAgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3Qgdmlld3BvcnRSZWN0ID0gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50
KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7CisKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHRpbGVSZWN0TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBU
aWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlzdFtpXTsKKyAgICAgICAgVGlsZUluZGV4IGlu
ZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGls
ZVJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUg
PSBjdXJyZW50TWFwLmdldChpbmRleCk7CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSB0aWxlIHJl
Y3QgaXMgaW4gdGlsZSBjb29yZGluYXRlcywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgICAg
IC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzCisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IGRpcnR5UmVjdCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxl
UmVjdCk7CisKKyAgICAgICAgLy8gSWYgd2UncmUgbm90IHlldCBjb21taXR0ZWQsIHRoZW4gY29t
bWl0IG5vdyBieSBjbGVhcmluZyB0aGUgcmVuZGVyZWQgcmVnaW9uCisgICAgICAgIC8vIGFuZCBz
ZXR0aW5nIHRoZSBjb21taXR0ZWQgZmxhZyBhcyB3ZWxsIGFzIGNsZWFyaW5nIHRoZSBzaGlmdAor
ICAgICAgICBpZiAoIXRpbGUtPmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgIHRpbGUtPnNl
dENvbW1pdHRlZCh0cnVlKTsKKyAgICAgICAgICAgIHRpbGUtPmZyb250QnVmZmVyKCktPmNsZWFy
UmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+Y2xlYXJS
ZW5kZXJlZFJlZ2lvbigpOworICAgICAgICAgICAgdGlsZS0+Y2xlYXJTaGlmdCgpOworICAgICAg
ICB9CisKKyAgICAgICAgLy8gSWYgdGhlIHRpbGUgaGFzIGJlZW4gY3JlYXRlZCwgYnV0IHRoaXMg
aXMgdGhlIGZpcnN0IHRpbWUgd2UgYXJlIHBhaW50aW5nIG9uIGl0CisgICAgICAgIC8vIHRoZW4g
aXQgaGFzbid0IGJlZW4gZ2l2ZW4gYSBkZWZhdWx0IGJhY2tncm91bmQgeWV0IHNvIHRoYXQgd2Ug
Y2FuIHNhdmUgdGltZSBkdXJpbmcKKyAgICAgICAgLy8gc3RhcnR1cC4gVGhhdCdzIHdoeSB3ZSBh
cmUgZG9pbmcgaXQgaGVyZSBpbnN0ZWFkLi4uCisgICAgICAgIGlmICghdGlsZS0+YmFja2dyb3Vu
ZFBhaW50ZWQoKSkKKyAgICAgICAgICAgIHRpbGUtPnBhaW50QmFja2dyb3VuZCgpOworCisgICAg
ICAgIC8vIFBhaW50IGRlZmF1bHQgYmFja2dyb3VuZCBpZiBjb250ZW50cyByZWN0IGlzIGVtcHR5
CisgICAgICAgIGlmICghZXhwYW5kZWRDb250ZW50c1JlY3QoKS5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIC8vIE90aGVyd2lzZSB3ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQg
cmVuZGVyIHRoZSBjb250ZW50CisgICAgICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGV4cGFu
ZGVkQ29udGVudHNSZWN0KCkpOworCisgICAgICAgICAgICBkaXJ0eVRpbGVSZWN0LmludGVyc2Vj
dCh0aWxlQ29udGVudHNSZWN0KGluZGV4LCBleHBhbmRlZENvbnRlbnRzUmVjdCgpLCBjdXJyZW50
U3RhdGUpKTsKKworICAgICAgICAgICAgLy8gV2UgcHJvYmFibHkgaGF2ZSBleHRyYSB0aWxlcyBz
aW5jZSB0aGUgY29udGVudHMgc2l6ZSBpcyBzbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIFNhdmUg
c29tZSBjeWNsZXMgaGVyZS4uLgorICAgICAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb3B5UHJl
dmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZlRpbGUoZGlydHlUaWxlUmVjdCwgdGlsZSk7CisK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIG5hdGl2ZUJ1
ZmZlcgorICAgICAgICAgICAgPSB0aWxlLT5iYWNrQnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpOwor
CisgICAgICAgIGlmIChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAg
ICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2JsaXRHZW5lcmF0aW9uTG9jayk7CisgICAg
ICAgICAgICB3aGlsZSAobV9ibGl0R2VuZXJhdGlvbiA9PSB0aWxlLT5iYWNrQnVmZmVyKCktPmJs
aXRHZW5lcmF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9jb25k
X3RpbWVkd2FpdCgmbV9ibGl0R2VuZXJhdGlvbkNvbmQsICZtX2JsaXRHZW5lcmF0aW9uTG9jaywg
Jm1fY3VycmVudEJsaXRFbmQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVRJTUVET1VU
KSB7CisgICAgICAgICAgICAgICAgICAgICsrbV9ibGl0R2VuZXJhdGlvbjsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChl
cnIpIHsKKyAgICAgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZF90aW1lZHdhaXQgZmFpbGVkICglcykiLCBz
dHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1f
YmxpdEdlbmVyYXRpb25Mb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZJWE1FOiBtb2Rp
ZnkgcmVuZGVyIHRvIHRha2UgYSBWZWN0b3I8SW50UmVjdD4gcGFyYW1ldGVyIHNvIHdlJ3JlIG5v
dCByZWNyZWF0aW5nCisgICAgICAgIC8vIEdyYXBoaWNzQ29udGV4dCBvbiB0aGUgc3RhY2sgZWFj
aCB0aW1lLgorICAgICAgICByZW5kZXJDb250ZW50cyhuYXRpdmVCdWZmZXIsIG9yaWdpbk9mVGls
ZShpbmRleCksIGRpcnR5UmVjdCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBuZXdseSByZW5kZXJl
ZCByZWdpb24gdG8gdGhlIHRpbGUgc28gaXQgY2FuIGtlZXAgdHJhY2sgZm9yIGJsaXRzLgorICAg
ICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmFkZFJlbmRlcmVkUmVnaW9uKGRpcnR5VGlsZVJlY3Qp
OworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50cyBmb3IgdGhpcyB0aWxlJ3MgYmFj
a2J1ZmZlciBhcmUgdmFsaWQgd2hlbgorICAgICAgICAvLyBjb21wYXJlZCB0byB0aGUgZnJvbnQg
YnVmZmVyCisgICAgICAgIGJvb2wgYmFja0J1ZmZlcklzVmFsaWQgPSB0aWxlLT5iYWNrQnVmZmVy
KCktPmlzUmVuZGVyZWQodGlsZS0+ZnJvbnRCdWZmZXIoKS0+cmVuZGVyZWRSZWdpb24oKSk7CisK
KyAgICAgICAgLy8gT3VyIGN1cnJlbnQgZGVzaWduIGRlbWFuZHMgdGhhdCB0aGUgYmFja2J1ZmZl
ciBpcyB2YWxpZCBhZnRlciBhbnkKKyAgICAgICAgLy8gcmVuZGVyaW5nIG9wZXJhdGlvbiBzbyBh
c3NlcnQgdGhhdCBoZXJlLiBJZiB3ZSBoaXQgdGhpcyBhc3NlcnQgd2UKKyAgICAgICAgLy8ga25v
dyB0aGF0IHdlJ3JlIGRvaW5nIHNvbWV0aGluZyBiYWQgdGhhdCB3aWxsIHJlc3VsdCBpbiBhcnRp
ZmFjdHMuCisgICAgICAgIEFTU0VSVChiYWNrQnVmZmVySXNWYWxpZCk7CisKKyAgICAgICAgLy8g
V2Ugd2lsbCBuZWVkIGEgc3dhcCBoZXJlIGJlY2F1c2Ugb2YgdGhlIHNoYXJlZCBiYWNrIGJ1ZmZl
ci4KKyAgICAgICAgaWYgKGJhY2tCdWZmZXJJc1ZhbGlkKSB7CisgICAgICAgICAgICB0aWxlLT5z
d2FwQnVmZmVycygpOworICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7CisgICAg
ICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAg
ICAgfQorCisgICAgICAgIGRpcnR5Q29udGVudHNSZWN0ID0gUGxhdGZvcm06OnVuaW9uT2ZSZWN0
cyhkaXJ0eUNvbnRlbnRzUmVjdCwgZGlydHlSZWN0KTsKKyAgICB9CisKKyAgICAvLyBDbGlwIHRv
IHRoZSB2aXNpYmxlIGNvbnRlbnQgaW5jbHVkaW5nIG92ZXJzY3JvbGwuCisgICAgZGlydHlDb250
ZW50c1JlY3QuaW50ZXJzZWN0KHVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAg
aWYgKGRpcnR5Q29udGVudHNSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICBpZiAoIXNob3VsZEJsaXQpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgYmxpdFZp
c2libGVDb250ZW50cygpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OnJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpIGNvbnN0Cit7CisgICAgbV93ZWJQYWdl
LT5kLT5yZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2
YXRlOjpyZW5kZXJWaXNpYmxlQ29udGVudHMoYm9vbCByZW5kZXJDb250ZW50T25seSkKK3sKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCByZW5kZXJSZWN0ID0gc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9X
aW5kb3coKSA/IHZpc2libGVDb250ZW50c1JlY3QoKSA6IHZpc2libGVUaWxlc1JlY3QoKTsKKwor
ICAgIHJlbmRlcihyZW5kZXJSZWN0LCByZW5kZXJDb250ZW50T25seSk7CisgICAgbV9yZW5kZXJR
dWV1ZS0+Y2xlYXIocmVuZGVyUmVjdCwgdHJ1ZSAvKmNsZWFyUmVndWxhclJlbmRlckpvYnMqLyk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyQmFja2luZ1N0b3JlKGJvb2wg
cmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgcmVuZGVyKGZyb250U3RhdGUoKS0+YmFja2luZ1N0
b3JlUmVjdCgpLCByZW5kZXJDb250ZW50T25seSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6YmxpdFZpc2libGVDb250ZW50cyhib29sIGZvcmNlKQoreworICAgIC8vIEJsaXR0aW5n
IG11c3QgbmV2ZXIgaGFwcGVuIGZvciBkaXJlY3QgcmVuZGVyaW5nIGNhc2UuCisgICAgQVNTRVJU
KCFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKTsKKworICAgIGlmIChtX3N1c3BlbmRT
Y3JlZW5VcGRhdGVzKSB7CisgICAgICAgIC8vIEF2b2lkIGNsaWVudCBnb2luZyBpbnRvIGJ1c3kg
bG9vcCB3aGlsZSB1cGRhdGVzIHN1c3BlbmRlZAorICAgICAgICBpZiAoZm9yY2UpCisgICAgICAg
ICAgICBtX2hhc0JsaXRKb2JzID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNs
aWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAor
ICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdl
KAorICAgICAgICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRl
bnRzLCB0aGlzLCBmb3JjZSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmxpdENv
bnRlbnRzKG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRp
b25SZWN0KCksCisgICAgICAgICAgICAgICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRl
cmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpLAorICAgICAgICAgICAgICAgICBmb3Jj
ZSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZpb3VzQ29udGVudHNU
b0JhY2tTdXJmYWNlT2ZXaW5kb3coKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHBy
ZXZpb3VzQ29udGVudHNSZWdpb24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
c3VidHJhY3RSZWdpb25zKHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigp
LCB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigpKTsKKworICAgIGlmIChw
cmV2aW91c0NvbnRlbnRzUmVnaW9uLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPmNvcHlGcm9tRnJvbnRUb0JhY2socHJldmlv
dXNDb250ZW50c1JlZ2lvbik7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0
ZWRSZWdpb24ocHJldmlvdXNDb250ZW50c1JlZ2lvbik7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6Y29weVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZUaWxlKGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSkK
K3sKKyAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBwcmV2aW91c0NvbnRlbnRzUmVnaW9uCisg
ICAgICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyh0aWxlLT5m
cm9udEJ1ZmZlcigpLT5yZW5kZXJlZFJlZ2lvbigpLCByZWN0KTsKKworICAgIEludFJlY3RMaXN0
IHByZXZpb3VzQ29udGVudHNSZWN0cyA9IHByZXZpb3VzQ29udGVudHNSZWdpb24ucmVjdHMoKTsK
KyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZXZpb3VzQ29udGVudHNSZWN0cy5zaXplKCk7
ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBwcmV2aW91c0NvbnRlbnRzUmVjdCA9
IHByZXZpb3VzQ29udGVudHNSZWN0cy5hdChpKTsKKyAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigp
LT5hZGRSZW5kZXJlZFJlZ2lvbihwcmV2aW91c0NvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIoCisgICAgICAgICAgICB0
aWxlLT5iYWNrQnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91c0NvbnRlbnRzUmVjdCwK
KyAgICAgICAgICAgIHRpbGUtPmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91
c0NvbnRlbnRzUmVjdCk7CisgICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnBh
aW50RGVmYXVsdEJhY2tncm91bmQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdl
YkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiB0cmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoKQoreworICAg
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0
KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZENvbnRl
bnRzU2l6ZSgpKTsKKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gY29udGVudHMubG9j
YXRpb24oKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c0NsaXBwZWQgPSBjb250ZW50
czsKKworICAgIC8vIFdlIGhhdmUgdG8gcGFpbnQgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpbiB0
aGUgY2FzZSBvZiBvdmVyem9vbSBhbmQKKyAgICAvLyBtYWtlIHN1cmUgaXQgaXMgaW52YWxpZGF0
ZWQuCisgICAgQ29sb3IgY29sb3IobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5vdmVyWm9vbUNvbG9y
KCkpOworCisgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gb3ZlclNjcm9sbFJlZ2lvbgorICAg
ICAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKFBsYXRm
b3JtOjpJbnRSZWN0KGNvbnRlbnRzQ2xpcHBlZCksIGNvbnRlbnRzUmVjdCk7CisKKyAgICBJbnRS
ZWN0TGlzdCBvdmVyU2Nyb2xsUmVjdHMgPSBvdmVyU2Nyb2xsUmVnaW9uLnJlY3RzKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdmVyU2Nyb2xsUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgUGxhdGZvcm06OkludFJlY3Qgb3ZlclNjcm9sbFJlY3QgPSBvdmVyU2Nyb2xsUmVjdHMu
YXQoaSk7CisgICAgICAgIG92ZXJTY3JvbGxSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4u
eSgpKTsKKyAgICAgICAgb3ZlclNjcm9sbFJlY3QgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KG92
ZXJTY3JvbGxSZWN0KTsKKworICAgICAgICBpZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHko
KSkgeworICAgICAgICAgICAgLy8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0
aGF0IG92ZXJTY3JvbGxSZWN0IGNvdWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAg
ICAvLyB0aGFuIHRoZSBzdXJmYWNlIHNpemUgb2YgdGhlIHdpbmRvdy4gV2UgcHJldmVudCB0aGlz
IGhlcmUsIGJ5IGNsYW1waW5nCisgICAgICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4n
dCBoYXBwZW4uCisgICAgICAgICAgICBvdmVyU2Nyb2xsUmVjdC5pbnRlcnNlY3QoUGxhdGZvcm06
OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53
aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJXaW5k
b3cob3ZlclNjcm9sbFJlY3QsCisgICAgICAgICAgICAgICAgICAgIGNvbG9yLnJlZCgpLCBjb2xv
ci5ncmVlbigpLCBjb2xvci5ibHVlKCksIGNvbG9yLmFscGhhKCkpOworICAgIH0KK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMoY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gQmxpdHRpbmcgbXVzdCBuZXZlciBo
YXBwZW4gZm9yIGRpcmVjdCByZW5kZXJpbmcgY2FzZS4KKyAgICAvLyBVc2UgaW52YWxpZGF0ZVdp
bmRvdygpIGluc3RlYWQuCisgICAgQVNTRVJUKCFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRv
dygpKTsKKworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCBtX3N1c3BlbmRTY3Jl
ZW5VcGRhdGVzIHx8ICFpc0FjdGl2ZSgpKSB7CisgICAgICAgIC8vIEF2b2lkIGNsaWVudCBnb2lu
ZyBpbnRvIGJ1c3kgbG9vcCB3aGlsZSBibGl0IGlzIGltcG9zc2libGUKKyAgICAgICAgaWYgKGZv
cmNlKQorICAgICAgICAgICAgbV9oYXNCbGl0Sm9icyA9IGZhbHNlOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3Bh
dGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRo
b2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3JlUHJpdmF0ZTo6Ymxp
dENvbnRlbnRzLCB0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBmb3JjZSkpOworICAgICAgICByZXR1
cm47CisgICAgfQorCisgICAgaWYgKG1fZGVmZXJzQmxpdCAmJiAhZm9yY2UpIHsKKyAgICAgICAg
bV9oYXNCbGl0Sm9icyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtX2hh
c0JsaXRKb2JzID0gZmFsc2U7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0
YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRz
UmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV9jbGll
bnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworCisjaWYgREVCVUdfVklTVUFMSVpFCisg
ICAgLy8gU3Vic3RpdHV0ZSBhIGRlYnVnUmVjdCB0aGF0IGNvbnNpc3RzIG9mIHRoZSB1bmlvbiBv
ZiB0aGUgYmFja2luZ3N0b3JlIHJlY3QKKyAgICAvLyBhbmQgdGhlIHVpIHRocmVhZCB2aWV3cG9y
dCByZWN0IGluc3RlYWQgb2YgdGhlIG5vcm1hbCBzb3VyY2UgcmVjdCBzbyB3ZQorICAgIC8vIGNh
biB2aXN1YWxpemUgdGhlIGVudGlyZSBiYWNraW5nc3RvcmUgYW5kIHdoYXQgaXQgaXMgZG9pbmcg
d2hlbiB3ZQorICAgIC8vIHNjcm9sbCBhbmQgem9vbSEKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91
bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjouCisgICAgV2ViQ29yZTo6SW50
UmVjdCBkZWJ1Z1JlY3QgPSBjdXJyZW50U3RhdGUtPmJhY2tpbmdTdG9yZVJlY3QoKTsKKyAgICBk
ZWJ1Z1JlY3QudW5pdGUobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWRW
aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIGlmIChkZWJ1Z1JlY3Qud2lkdGgoKSA8IGRlYnVn
UmVjdC5oZWlnaHQoKSkKKyAgICAgICAgZGVidWdSZWN0LnNldFdpZHRoKGNlaWwoZG91YmxlKHNy
Y1JlY3Qud2lkdGgoKSkgKiAoZG91YmxlKGRlYnVnUmVjdC5oZWlnaHQoKSkgLyBzcmNSZWN0Lmhl
aWdodCgpKSkpOworICAgIGlmIChkZWJ1Z1JlY3QuaGVpZ2h0KCkgPCBkZWJ1Z1JlY3Qud2lkdGgo
KSkKKyAgICAgICAgZGVidWdSZWN0LnNldEhlaWdodChjZWlsKGRvdWJsZShzcmNSZWN0LmhlaWdo
dCgpKSAqIChkb3VibGUoZGVidWdSZWN0LndpZHRoKCkpIC8gc3JjUmVjdC53aWR0aCgpKSkpOwor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzID0gZGVidWdSZWN0OworI2Vsc2UKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBjb250ZW50cyA9IHNyY1JlY3Q7CisjZW5kaWYKKworICAgIC8vIEZJ
WE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9uIFdlYkNvcmU6Oi4KKyAg
ICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1hdGlvbiA9IFRyYW5zZm9ybWF0aW9uTWF0
cml4OjpyZWN0VG9SZWN0KAorICAgICAgICBGbG9hdFJlY3QoRmxvYXRQb2ludCgwLjAsIDAuMCks
IFdlYkNvcmU6OkludFNpemUoY29udGVudHMuc2l6ZSgpKSksIFdlYkNvcmU6OkludFJlY3QoZHN0
UmVjdCkpOworCisgICAgYm9vbCBibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdyA9
IG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOworI2lmIFVTRShB
Q0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZh
Y2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJm
YWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlmICghYmxpdHRpbmdEaXJl
Y3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpCisgICAgICAgIGRyYXdTdWJMYXllcnMoKTsKKyNlbmRp
ZgorCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Omxv
ZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMgZHN0UmVjdD0o
JWQsJWQgJWR4JWQpIHNyY1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgoKSwgZHN0UmVj
dC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlY3QueCgpLCBzcmNS
ZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisg
ICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IGNvbnRlbnRzLmxvY2F0aW9uKCk7CisgICAg
UGxhdGZvcm06OkludFJlY3QgY29udGVudHNDbGlwcGVkID0gY29udGVudHM7CisKKyAgICBwYWlu
dERlZmF1bHRCYWNrZ3JvdW5kKGNvbnRlbnRzLCB0cmFuc2Zvcm1hdGlvbiwgZmFsc2UgLypmbHVz
aCovKTsKKworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgp
OworCisgICAgLy8gRG9uJ3QgY2xpcCB0byBjb250ZW50cyBpZiBpdCBpcyBlbXB0eSBzbyB3ZSBj
YW4gc3RpbGwgcGFpbnQgZGVmYXVsdCBiYWNrZ3JvdW5kCisgICAgaWYgKCFjb250ZW50c1JlY3Qu
aXNFbXB0eSgpKSB7CisgICAgICAgIGNvbnRlbnRzQ2xpcHBlZC5pbnRlcnNlY3QoY29udGVudHNS
ZWN0KTsKKyAgICAgICAgaWYgKGNvbnRlbnRzQ2xpcHBlZC5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ICAgIGludmFsaWRhdGVXaW5kb3coZHN0UmVjdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAg
ICAgIH0KKworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBjb250ZW50c1JlZ2lvbiA9
IGNvbnRlbnRzQ2xpcHBlZDsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gYmFja2lu
Z1N0b3JlUmVnaW9uID0gY3VycmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCk7CisgICAgICAg
IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIGNoZWNrZXJlZFJlZ2lvbgorICAgICAgICAgICAgPSBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKGNvbnRlbnRzUmVnaW9uLCBi
YWNraW5nU3RvcmVSZWdpb24pOworCisgICAgICAgIC8vIEJsaXQgY2hlY2tlcmVkIHRvIHRob3Nl
IHBhcnRzIHRoYXQgYXJlIG5vdCBjb3ZlcmVkIGJ5IHRoZSBiYWNraW5nU3RvcmVSZWN0CisgICAg
ICAgIEludFJlY3RMaXN0IGNoZWNrZXJlZFJlY3RzID0gY2hlY2tlcmVkUmVnaW9uLnJlY3RzKCk7
CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hlY2tlcmVkUmVjdHMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRzdFJlY3QgPSB0cmFuc2Zvcm1h
dGlvbi5tYXBSZWN0KFBsYXRmb3JtOjpJbnRSZWN0KAorICAgICAgICAgICAgICAgIFBsYXRmb3Jt
OjpJbnRQb2ludChjaGVja2VyZWRSZWN0cy5hdChpKS54KCkgLSBvcmlnaW4ueCgpLCBjaGVja2Vy
ZWRSZWN0cy5hdChpKS55KCkgLSBvcmlnaW4ueSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY2hlY2tlcmVkUmVjdHMuYXQoaSkuc2l6ZSgpKSk7CisgICAgICAgICAgICBj
aGVja2VyV2luZG93KGRzdFJlY3QsIGNoZWNrZXJlZFJlY3RzLmF0KGkpLmxvY2F0aW9uKCksIHRy
YW5zZm9ybWF0aW9uLmEoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBWZWN0b3I8VGlsZUJ1
ZmZlcio+IGJsaXR0ZWRUaWxlczsKKworICAgIC8vIEdldCB0aGUgbGlzdCBvZiB0aWxlIHJlY3Rz
IHRoYXQgbWFrZXVwIHRoZSBjb250ZW50CisgICAgVGlsZVJlY3RMaXN0IHRpbGVSZWN0TGlzdCA9
IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb250ZW50c0NsaXBwZWQsIGN1cnJl
bnRTdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3QgPSB0aWxlUmVjdExpc3RbaV07Cisg
ICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAgICAgICBQbGF0Zm9y
bTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOworICAgICAgICBCYWNr
aW5nU3RvcmVUaWxlKiB0aWxlID0gY3VycmVudE1hcC5nZXQoaW5kZXgpOworICAgICAgICBUaWxl
QnVmZmVyKiB0aWxlQnVmZmVyID0gdGlsZS0+ZnJvbnRCdWZmZXIoKTsKKworICAgICAgICAvLyBU
aGlzIGRpcnR5IHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRlcywgYnV0IGl0IG5lZWRzIHRvIGJl
IGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzCisgICAgICAg
IFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdAorICAgICAgICAgICAgPSBtYXBGcm9tVGlsZXNU
b1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QsIGN1cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3Jl
UmVjdCgpKTsKKworICAgICAgICAvLyBEb24ndCBjbGlwIHRvIGNvbnRlbnRzIGlmIGl0IGlzIGVt
cHR5IHNvIHdlIGNhbiBzdGlsbCBwYWludCBkZWZhdWx0IGJhY2tncm91bmQKKyAgICAgICAgaWYg
KCFjb250ZW50c1JlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBPdGhlcndpc2Ugd2Ug
c2hvdWxkIGNsaXAgdGhlIGNvbnRlbnRzIHNpemUgYW5kIGJsaXQKKyAgICAgICAgICAgIGRpcnR5
UmVjdC5pbnRlcnNlY3QoY29udGVudHNSZWN0KTsKKworICAgICAgICAgICAgLy8gV2UgcHJvYmFi
bHkgaGF2ZSBleHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVudHMgc2l6ZSBpcyBzbyBzbWFsbC4K
KyAgICAgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgorICAgICAgICAgICAgaWYg
KGRpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IH0KKworICAgICAgICAvLyBOb3csIHRoaXMgZGlydHkgcmVjdCBpcyBpbiB0cmFuc2Zvcm1lZCBj
b29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgLy8gdHJhbnNmb3JtZWQgY29udGVu
dHMsIGJ1dCB1bHRpbWF0ZWx5IGl0IG5lZWRzIHRvIGJlIHRyYW5zZm9ybWVkCisgICAgICAgIC8v
IGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgICAgICAgZGlydHlSZWN0
Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKworICAgICAgICAvLyBTYXZlIHNvbWUg
Y3ljbGVzIGhlcmUuLi4KKyAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkgfHwgZGlydHlU
aWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBUaWxl
UmVjdCB3aG9sZVRpbGVSZWN0OworICAgICAgICB3aG9sZVRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7
CisgICAgICAgIHdob2xlVGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAg
ICAgUGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0CisgICAgICAgICAgICA9IG1hcEZyb21UaWxl
c1RvVHJhbnNmb3JtZWRDb250ZW50cyh3aG9sZVRpbGVSZWN0LCBjdXJyZW50U3RhdGUtPmJhY2tp
bmdTdG9yZVJlY3QoKSk7CisKKyAgICAgICAgYm9vbCBjb21taXR0ZWQgPSB0aWxlLT5pc0NvbW1p
dHRlZCgpOworICAgICAgICBib29sIHJlbmRlcmVkID0gdGlsZUJ1ZmZlci0+aXNSZW5kZXJlZChk
aXJ0eVRpbGVSZWN0KTsKKyAgICAgICAgYm9vbCBwYWludENoZWNrZXJlZCA9ICFjb21taXR0ZWQg
fHwgIXJlbmRlcmVkOworCisgICAgICAgIGlmIChwYWludENoZWNrZXJlZCkgeworICAgICAgICAg
ICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3Qo
ZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1hdGlvbi5pc0lkZW50aXR5
KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHJvdW5kaW5nIGl0IGlzIHBvc3Np
YmxlIHRoYXQgZGlydHlSZWN0IGNvdWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAg
ICAgICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2
ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAgICAgICAgICAvLyBpdCB0byBlbnN1
cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgICAgICAgICAgZGlydHlSZWN0VC5pbnRlcnNl
Y3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2Ut
PmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50IGNvbnRlbnRzT3JpZ2luKGRpcnR5UmVj
dC54KCkgKyBvcmlnaW4ueCgpLCBkaXJ0eVJlY3QueSgpICsgb3JpZ2luLnkoKSk7CisgICAgICAg
ICAgICBjaGVja2VyV2luZG93KGRpcnR5UmVjdFQsIGNvbnRlbnRzT3JpZ2luLCB0cmFuc2Zvcm1h
dGlvbi5hKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmxpdCB0aGUgdmlzaWJsZSBidWZm
ZXIgaGVyZSBpZiB3ZSBoYXZlIHZpc2libGUgem9vbSBqb2JzCisgICAgICAgIGlmIChtX3JlbmRl
clF1ZXVlLT5oYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IoKSkgeworCisgICAgICAgICAgICAvLyBO
ZWVkcyB0byBiZSBpbiBzYW1lIGNvb3JkaW5hdGUgc3lzdGVtIGFzIGRpcnR5UmVjdAorICAgICAg
ICAgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJsZVRpbGVCdWZmZXJSZWN0ID0gbV92aXNpYmxl
VGlsZUJ1ZmZlclJlY3Q7CisgICAgICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlclJlY3QubW92ZSgt
b3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworCisgICAgICAgICAgICAvLyBDbGlwIHRvIHRoZSB2
aXNpYmxlVGlsZUJ1ZmZlclJlY3QKKyAgICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3Qodmlz
aWJsZVRpbGVCdWZmZXJSZWN0KTsKKworICAgICAgICAgICAgLy8gQ2xpcCB0byB0aGUgZGlydHlS
ZWN0CisgICAgICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuaW50ZXJzZWN0KGRpcnR5UmVj
dCk7CisKKyAgICAgICAgICAgIGlmICghZGlydHlSZWN0LmlzRW1wdHkoKSAmJiAhdmlzaWJsZVRp
bGVCdWZmZXJSZWN0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEJhY2tpbmdTdG9yZVRp
bGUqIHZpc2libGVUaWxlQnVmZmVyCisgICAgICAgICAgICAgICAgICAgID0gU3VyZmFjZVBvb2w6
Omdsb2JhbFN1cmZhY2VQb29sKCktPnZpc2libGVUaWxlQnVmZmVyKCk7CisgICAgICAgICAgICAg
ICAgQVNTRVJUKHZpc2libGVUaWxlQnVmZmVyLT5zaXplKCkgPT0gdmlzaWJsZUNvbnRlbnRzUmVj
dCgpLnNpemUoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgb2Zmc2V0IG9mIHRoZSBjdXJy
ZW50IHZpZXdwb3J0IHdpdGggdGhlIHZpc2JsZSB0aWxlIGJ1ZmZlcgorICAgICAgICAgICAgICAg
IFBsYXRmb3JtOjpJbnRQb2ludCBkaWZmZXJlbmNlID0gb3JpZ2luIC0gbV92aXNpYmxlVGlsZUJ1
ZmZlclJlY3QubG9jYXRpb24oKTsKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBv
ZmZzZXQgPSBQbGF0Zm9ybTo6SW50U2l6ZShkaWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkp
OworCisgICAgICAgICAgICAgICAgLy8gTWFwIHRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlciBjb29y
ZGluYXRlcworICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3Qg
PSB2aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisgICAgICAgICAgICAgICAgZGlydHlUaWxlUmVjdC5t
b3ZlKG9mZnNldC53aWR0aCgpLCBvZmZzZXQuaGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAg
UGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QoZGly
dHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGlmICghdHJhbnNmb3JtYXRpb24uaXNJZGVudGl0
eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMg
cG9zc2libGUgdGhhdCBkaXJ0eVJlY3QgY291bGQgYmUgb2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAg
ICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVy
LiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAgICAgICAgICAgICAg
Ly8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICBk
aXJ0eVJlY3RULmludGVyc2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQo
MCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7Cisg
ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYmxpdFRvV2luZG93KGRpcnR5UmVj
dFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2libGVUaWxlQnVmZmVyLT5mcm9u
dEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ZGlydHlUaWxlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypibGVu
ZCovLCAyNTUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbW1pdHRlZCkg
eworICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSByZW5kZXJlZCByZWdpb24KKyAgICAgICAg
ICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHJlbmRlcmVkUmVnaW9uID0gdGlsZUJ1ZmZlci0+
cmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgICAgIEludFJlY3RMaXN0IGRpcnR5UmVuZGVyZWRS
ZWN0cyA9IHJlbmRlcmVkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IGRpcnR5UmVuZGVyZWRSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAg
ICAgIFRpbGVSZWN0IHRpbGVSZWN0OworICAgICAgICAgICAgICAgIHRpbGVSZWN0LmZpcnN0ID0g
aW5kZXg7CisgICAgICAgICAgICAgICAgdGlsZVJlY3Quc2Vjb25kID0gaW50ZXJzZWN0aW9uKGRp
cnR5VGlsZVJlY3QsIGRpcnR5UmVuZGVyZWRSZWN0cy5hdChpKSk7CisgICAgICAgICAgICAgICAg
aWYgKHRpbGVSZWN0LnNlY29uZC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgICAgIC8vIEJsaXQgdGhlIHJlbmRlcmVkIHBhcnRzCisgICAgICAg
ICAgICAgICAgYmxpdFRpbGVSZWN0KHRpbGVCdWZmZXIsIHRpbGVSZWN0LCBvcmlnaW4sIHRyYW5z
Zm9ybWF0aW9uLCBjdXJyZW50U3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxp
dHRlZFRpbGVzLmFwcGVuZCh0aWxlQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVT
RShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBpZiAoYmxpdHRpbmdEaXJlY3RseVRvQ29t
cG9zaXRpbmdXaW5kb3cpIHsKKyAgICAgICAgV2ViQ29yZTo6RmxvYXRSZWN0IGNvbnRlbnRzUmVj
dCA9IG1fd2ViUGFnZS0+ZC0+bWFwRnJvbVRyYW5zZm9ybWVkRmxvYXRSZWN0KAorICAgICAgICAg
ICAgV2ViQ29yZTo6RmxvYXRSZWN0KFdlYkNvcmU6OkludFJlY3QoY29udGVudHMpKSk7CisgICAg
ICAgIG1fd2ViUGFnZS0+ZC0+ZHJhd1N1YkxheWVycyhkc3RSZWN0LCBjb250ZW50c1JlY3QpOwor
ICAgIH0gZWxzZSBpZiAoY29tcG9zaXRpbmdTdXJmYWNlKQorICAgICAgICBibGVuZENvbXBvc2l0
aW5nU3VyZmFjZShkc3RSZWN0KTsKKworI2VuZGlmCisKKyNpZiBFTkFCTEVfU0NST0xMQkFSUwor
ICAgIGlmIChpc1Njcm9sbGluZ09yWm9vbWluZygpICYmIG1fY2xpZW50LT5pc01haW5GcmFtZSgp
KSB7CisgICAgICAgIGlmIChtX2NsaWVudC0+c2Nyb2xsc0hvcml6b250YWxseSgpKQorICAgICAg
ICAgICAgYmxpdEhvcml6b250YWxTY3JvbGxiYXIob3JpZ2luKTsKKyAgICAgICAgaWYgKG1fY2xp
ZW50LT5zY3JvbGxzVmVydGljYWxseSgpKQorICAgICAgICAgICAgYmxpdFZlcnRpY2FsU2Nyb2xs
YmFyKG9yaWdpbik7CisgICAgfQorI2VuZGlmCisKKyNpZiBERUJVR19WSVNVQUxJWkUKKyAgICAv
LyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjou
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHdpbmRvd0J1ZmZl
ciA9CisgICAgICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkRyYXdhYmxlKiBidWZmZXJEcmF3YWJs
ZSA9CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6bG9ja0J1ZmZlckRy
YXdhYmxlKHdpbmRvd0J1ZmZlcik7CisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGJ1ZmZl
clBsYXRmb3JtR3JhcGhpY3NDb250ZXh0ID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1
cmZhY2VQb29sKCktPmNyZWF0ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxl
KTsKKyAgICBHcmFwaGljc0NvbnRleHQgZ3JhcGhpY3NDb250ZXh0KGJ1ZmZlclBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0KTsKKyAgICBGbG9hdFJlY3Qgd2tWaWV3cG9ydCA9IEZsb2F0UmVjdCh2aXNp
YmxlQ29udGVudHNSZWN0KCkpOworICAgIEZsb2F0UmVjdCB1aVZpZXdwb3J0ID0gRmxvYXRSZWN0
KG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRz
UmVjdCgpKTsKKyAgICB3a1ZpZXdwb3J0Lm1vdmUoLWNvbnRlbnRzLngoKSwgLWNvbnRlbnRzLnko
KSk7CisgICAgdWlWaWV3cG9ydC5tb3ZlKC1jb250ZW50cy54KCksIC1jb250ZW50cy55KCkpOwor
CisgICAgZ3JhcGhpY3NDb250ZXh0LnNhdmUoKTsKKworICAgIC8vIERyYXcgYSBibHVlIHJlY3Qg
Zm9yIHRoZSB3ZWJraXQgdGhyZWFkIHZpZXdwb3J0CisgICAgZ3JhcGhpY3NDb250ZXh0LnNldFN0
cm9rZUNvbG9yKFdlYkNvcmU6OkNvbG9yKDAsIDAsIDI1NSksIFdlYkNvcmU6OkNvbG9yU3BhY2VE
ZXZpY2VSR0IpOworICAgIGdyYXBoaWNzQ29udGV4dC5zdHJva2VSZWN0KHRyYW5zZm9ybWF0aW9u
Lm1hcFJlY3Qod2tWaWV3cG9ydCksIDEuMCk7CisKKyAgICAvLyBEcmF3IGEgcmVkIHJlY3QgZm9y
IHRoZSB1aSB0aHJlYWQgdmlld3BvcnQKKyAgICBncmFwaGljc0NvbnRleHQuc2V0U3Ryb2tlQ29s
b3IoV2ViQ29yZTo6Q29sb3IoMjU1LCAwLCAwKSwgV2ViQ29yZTo6Q29sb3JTcGFjZURldmljZVJH
Qik7CisgICAgZ3JhcGhpY3NDb250ZXh0LnN0cm9rZVJlY3QodHJhbnNmb3JtYXRpb24ubWFwUmVj
dCh1aVZpZXdwb3J0KSwgMS4wKTsKKworICAgIGdyYXBoaWNzQ29udGV4dC5yZXN0b3JlKCk7CisK
KyAgICBkZWxldGUgYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQ7CisgICAgcmVsZWFzZUJ1
ZmZlckRyYXdhYmxlKHdpbmRvd0J1ZmZlcik7CisjZW5kaWYKKworICAgIGludmFsaWRhdGVXaW5k
b3coZHN0UmVjdCk7CisKKyAgICBpZiAoYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5k
b3cpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2JsaXRHZW5lcmF0aW9uTG9jayk7
CisKKyAgICAgICAgKyttX2JsaXRHZW5lcmF0aW9uOworICAgICAgICBmb3IgKHVuc2lnbmVkIGlu
dCBpID0gMDsgaSA8IGJsaXR0ZWRUaWxlcy5zaXplKCk7ICsraSkKKyAgICAgICAgICAgIGJsaXR0
ZWRUaWxlc1tpXS0+c2V0QmxpdEdlbmVyYXRpb24obV9ibGl0R2VuZXJhdGlvbik7CisKKyAgICAg
ICAgY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJm1fY3VycmVudEJsaXRFbmQpOworICAg
ICAgICBtX2N1cnJlbnRCbGl0RW5kLnR2X25zZWMgKz0gMzAgKiAxMDAwICogMTAwMDsKKyAgICAg
ICAgaWYgKG1fY3VycmVudEJsaXRFbmQudHZfbnNlYyA+PSAxMDAwMDAwMDAwTCkgeworICAgICAg
ICAgICAgbV9jdXJyZW50QmxpdEVuZC50dl9zZWMgICs9IDE7CisgICAgICAgICAgICBtX2N1cnJl
bnRCbGl0RW5kLnR2X25zZWMgLT0gMTAwMDAwMDAwMEw7CisgICAgICAgIH0KKworICAgICAgICBw
dGhyZWFkX211dGV4X3VubG9jaygmbV9ibGl0R2VuZXJhdGlvbkxvY2spOworICAgICAgICBwdGhy
ZWFkX2NvbmRfc2lnbmFsKCZtX2JsaXRHZW5lcmF0aW9uQ29uZCk7CisgICAgfQorfQorCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VGlsZVJlY3QoVGlsZUJ1ZmZl
ciogdGlsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IFRpbGVSZWN0JiB0aWxlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYg
b3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tpbmdTdG9yZUdl
b21ldHJ5KiBzdGF0ZSkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkgfHwgIWlz
QWN0aXZlKCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgUGxh
dGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKworICAgIC8v
IFRoaXMgZGlydHkgcmVjdCBpcyBpbiB0aWxlIGNvb3JkaW5hdGVzLCBidXQgaXQgbmVlZHMgdG8g
YmUgaW4KKyAgICAvLyB0cmFuc2Zvcm1lZCBjb250ZW50cyBjb29yZGluYXRlcworICAgIFBsYXRm
b3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50
cyh0aWxlUmVjdCwgc3RhdGUtPmJhY2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAvLyBOb3csIHRo
aXMgZGlydHkgcmVjdCBpcyBpbiB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0
aGUKKyAgICAvLyB0cmFuc2Zvcm1lZCBjb250ZW50cywgYnV0IHVsdGltYXRlbHkgaXQgbmVlZHMg
dG8gYmUgdHJhbnNmb3JtZWQKKyAgICAvLyBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmll
d3BvcnQuCisgICAgZGlydHlSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKyAg
ICBkaXJ0eVJlY3QgPSBtYXRyaXgubWFwUmVjdChkaXJ0eVJlY3QpOworCisgICAgaWYgKCFtYXRy
aXguaXNJZGVudGl0eSgpKSB7CisgICAgICAgIC8vIEJlY2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMg
cG9zc2libGUgdGhhdCBkaXJ0eVJlY3QgY291bGQgYmUgb2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAg
ICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50
IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2Fu
J3QgaGFwcGVuLgorICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0
KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCkt
PnN1cmZhY2VTaXplKCkpKTsKKyAgICB9CisKKyAgICBBU1NFUlQoIWRpcnR5UmVjdC5pc0VtcHR5
KCkpOworICAgIEFTU0VSVCghZGlydHlUaWxlUmVjdC5pc0VtcHR5KCkpOworICAgIGlmIChkaXJ0
eVJlY3QuaXNFbXB0eSgpIHx8IGRpcnR5VGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gUGxhdGZvcm06OkludFJlY3QoKTsKKworICAgIGJsaXRUb1dpbmRvdyhkaXJ0eVJlY3QsIHRp
bGVCdWZmZXItPm5hdGl2ZUJ1ZmZlcigpLCBkaXJ0eVRpbGVSZWN0LAorICAgICAgICAgICAgICAg
ICBmYWxzZSAvKmJsZW5kKi8sIDI1NSk7CisgICAgcmV0dXJuIGRpcnR5UmVjdDsKK30KKworI2lm
IFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
YmxlbmRDb21wb3NpdGluZ1N1cmZhY2UoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3Qp
Cit7CisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1l
c3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgdHlwZWRlZiB2b2lk
IChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUp
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
Ojp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisg
ICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8
RnVuY3Rpb25UeXBlLCBCYWNraW5nU3RvcmVQcml2YXRlLCBQbGF0Zm9ybTo6SW50UmVjdD4oCisg
ICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmJsZW5kQ29tcG9zaXRpbmdTdXJm
YWNlLCB0aGlzLCBkc3RSZWN0KSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCYWNr
aW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAg
IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsK
KworICAgIGlmICghY29tcG9zaXRpbmdTdXJmYWNlIHx8ICFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJDb3JlOjpMYXllclJlbmRlcmluZ1Jlc3VsdHMg
bGFzdENvbXBvc2l0aW5nUmVzdWx0cyA9IG1fd2ViUGFnZS0+ZC0+bGFzdENvbXBvc2l0aW5nUmVz
dWx0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGFzdENvbXBvc2l0aW5nUmVzdWx0
cy5ob2xlUHVuY2hSZWN0U2l6ZSgpOyBpKyspIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qg
aG9sZVB1bmNoUmVjdCA9IGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMuaG9sZVB1bmNoUmVjdChpKTsK
KworICAgICAgICBob2xlUHVuY2hSZWN0LmludGVyc2VjdChkc3RSZWN0KTsKKyAgICAgICAgaG9s
ZVB1bmNoUmVjdC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoCisgICAgICAgICAgICBQbGF0
Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJm
YWNlU2l6ZSgpKSk7CisKKyAgICAgICAgaWYgKCFob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAg
ICAgICAgICAgIGNsZWFyV2luZG93KGhvbGVQdW5jaFJlY3QsIDAsIDAsIDAsIDApOworICAgIH0K
KworICAgIENvbXBvc2l0aW5nU3VyZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGlu
Z1N1cmZhY2UtPmZyb250QnVmZmVyKCk7CisKKyAgICBJbnRSZWN0TGlzdCByZWN0cyA9IGxhc3RD
b21wb3NpdGluZ1Jlc3VsdHMuZGlydHlSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHJlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHJlY3RzW2ldLmludGVyc2Vj
dChkc3RSZWN0KTsKKyNpZiBERUJVR19DT01QT1NJVElOR19ESVJUWV9SRUdJT04KKyAgICAgICAg
Y2xlYXJCdWZmZXIobV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpLCByZWN0
c1tpXSwgMjU1LCAwLCAwLCAxMjgpOworI2VuZGlmCisgICAgICAgIGJsaXRUb1dpbmRvdyhyZWN0
c1tpXSwgZnJvbnRCdWZmZXItPm5hdGl2ZUJ1ZmZlcigpLCByZWN0c1tpXSwgdHJ1ZSAvKmJsZW5k
Ki8sIDI1NSk7CisgICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQ29t
cG9zaXRpbmdTdXJmYWNlKCkKK3sKKyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2Uq
IGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNl
UG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlmICghY29tcG9zaXRpbmdTdXJm
YWNlKQorICAgICAgICByZXR1cm47CisKKyAgICBDb21wb3NpdGluZ1N1cmZhY2VCdWZmZXIqIGZy
b250QnVmZmVyID0gY29tcG9zaXRpbmdTdXJmYWNlLT5mcm9udEJ1ZmZlcigpOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZnJvbnRCdWZmZXItPm5hdGl2
ZUJ1ZmZlcigpLCBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoKSwgZnJvbnRC
dWZmZXItPnN1cmZhY2VTaXplKCkpLCAwLCAwLCAwLCAwKTsKK30KKyNlbmRpZiAvLyBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdEhv
cml6b250YWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlv
bikKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIEFTU0VSVChtX2NsaWVudC0+c2Nyb2xsc0hvcml6b250YWxseSgpKTsKKworICAgIG1f
d2ViUGFnZS0+Y2xpZW50KCktPmRyYXdIb3Jpem9udGFsU2Nyb2xsYmFyKCk7Cit9CisKK3ZvaWQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdFZlcnRpY2FsU2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3Jt
OjpJbnRQb2ludCYgc2Nyb2xsUG9zaXRpb24pCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlz
aWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQobV9jbGllbnQtPnNjcm9sbHNW
ZXJ0aWNhbGx5KCkpOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd1ZlcnRpY2FsU2Ny
b2xsYmFyKCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNUaWxlVmlzaWJsZShj
b25zdCBUaWxlSW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIFRpbGVSZWN0IHRpbGVSZWN0Owor
ICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAgdGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+
dGlsZVJlY3QoKTsKKyAgICByZXR1cm4gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRz
KHRpbGVSZWN0KS5pbnRlcnNlY3RzKHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNUaWxlVmlzaWJsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQmIG9yaWdpbikgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3Qob3JpZ2lu
LCB0aWxlU2l6ZSgpKS5pbnRlcnNlY3RzKHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnZpc2libGVUaWxlc1JlY3QoKSBj
b25zdAoreworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0
YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7
CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCByZWN0OworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJh
dG9yIGVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
IFRpbGVSZWN0IHRpbGVSZWN0OworICAgICAgICB0aWxlUmVjdC5maXJzdCA9IGl0LT5maXJzdDsK
KyAgICAgICAgdGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAgICAgUGxh
dGZvcm06OkludFJlY3QgdGlsZSA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0
aWxlUmVjdCk7CisgICAgICAgIGlmICh0aWxlLmludGVyc2VjdHModmlzaWJsZUNvbnRlbnRzUmVj
dCgpKSkKKyAgICAgICAgICAgIHJlY3QgPSBQbGF0Zm9ybTo6dW5pb25PZlJlY3RzKHJlY3QsIHRp
bGUpOworICAgIH0KKyAgICByZXR1cm4gcmVjdDsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4
JiBpbmRleCkgY29uc3QKK3sKKyAgICBpZiAoIWlzVGlsZVZpc2libGUoaW5kZXgpKQorICAgICAg
ICByZXR1cm4gUGxhdGZvcm06OkludFJlY3QoKTsKKworICAgIHJldHVybiB0aWxlQ29udGVudHNS
ZWN0KGluZGV4LCB2aXNpYmxlQ29udGVudHNSZWN0KCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVj
dCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlVW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdChj
b25zdCBUaWxlSW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIGlmICghaXNUaWxlVmlzaWJsZShp
bmRleCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgcmV0dXJu
IHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIHVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoKSk7
Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50
c1JlY3QoY29uc3QgVGlsZUluZGV4JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29u
dGVudHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIGNvbnRl
bnRzLCBmcm9udFN0YXRlKCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQ
cml2YXRlOjp0aWxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29u
c3QKK3sKKyAgICBUaWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RpbGVzKGNvbnRlbnRzLCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCB0aWxlUmVjdExpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJl
Y3QgPSB0aWxlUmVjdExpc3RbaV07CisgICAgICAgIGlmIChpbmRleCA9PSB0aWxlUmVjdC5maXJz
dCkKKyAgICAgICAgICAgIHJldHVybiB0aWxlUmVjdC5zZWNvbmQ7CisgICAgfQorICAgIHJldHVy
biBQbGF0Zm9ybTo6SW50UmVjdCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
c2V0UmVuZGVyUXVldWUoKQoreworICAgIG1fcmVuZGVyUXVldWUtPnJlc2V0KCk7Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJWaXNpYmxlWm9vbSgpCit7CisgICAgbV9yZW5k
ZXJRdWV1ZS0+Y2xlYXJWaXNpYmxlWm9vbSgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZh
dGU6OnJlc2V0VGlsZXMoYm9vbCByZXNldEJhY2tncm91bmQpCit7CisgICAgQmFja2luZ1N0b3Jl
R2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJl
bnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFRpbGVNYXA6OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAg
ICByZXNldFRpbGUoaXQtPmZpcnN0LCBpdC0+c2Vjb25kLCByZXNldEJhY2tncm91bmQpOworfQor
Cit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJs
ZSwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0
ZSgpOworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOwor
CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsKKyAg
ICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgYm9vbCBpc1Zpc2libGUgPSBpc1RpbGVWaXNpYmxl
KGl0LT5maXJzdCk7CisgICAgICAgIGlmICghdXBkYXRlVmlzaWJsZSAmJiBpc1Zpc2libGUpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgdXBkYXRlVGlsZShpdC0+Zmlyc3QsIGltbWVk
aWF0ZSk7CisgICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVz
Rm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbihib29sIGNoZWNrTG9hZGluZykKK3sKKyAgICAv
LyBUaGlzIG1ldGhvZCBsb29rcyBhdCBhbGwgdGhlIHRpbGVzIGFuZCBpZiB0aGV5IGFyZSB2aXNp
YmxlLCBidXQgbm90IGNvbXBsZXRlbHkKKyAgICAvLyByZW5kZXJlZCBvciB3ZSBhcmUgbG9hZGlu
ZywgdGhlbiBpdCB1cGRhdGVzIHRoZW0uIEZvciBhbGwgdGlsZXMsIHZpc2libGUgYW5kCisgICAg
Ly8gbm9uLXZpc2libGUsIGlmIGEgcHJldmlvdXMgYXR0ZW1wdCB3YXMgbWFkZSB0byByZW5kZXIg
dGhlbSBkdXJpbmcgYSByZWd1bGFyCisgICAgLy8gcmVuZGVyIGpvYiwgYnV0IHRoZXkgd2VyZSBu
b3QgdmlzaWJsZSBhdCB0aGUgdGltZSwgdGhlbiB1cGRhdGUgdGhlbSBhbmQgaWYKKyAgICAvLyB0
aGV5IGFyZSBjdXJyZW50bHkgdmlzaWJsZSwgcmVzZXQgdGhlbS4KKworICAgIEJhY2tpbmdTdG9y
ZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJy
ZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisgICAgUGxhdGZvcm06OkludFJlY3Qg
YmFja2luZ1N0b3JlUmVjdCA9IGN1cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpOworCisg
ICAgYm9vbCBpc0xvYWRpbmcgPSBtX2NsaWVudC0+bG9hZFN0YXRlKCkgPT0gV2ViUGFnZVByaXZh
dGU6OkNvbW1pdHRlZDsKKyAgICBib29sIGZvcmNlVmlzaWJsZSA9IGNoZWNrTG9hZGluZyAmJiBp
c0xvYWRpbmc7CisKKyAgICBUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBjdXJyZW50TWFw
LmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjdXJyZW50TWFw
LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBp
dC0+Zmlyc3Q7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOwor
ICAgICAgICBib29sIGlzVmlzaWJsZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpOworICAgICAgICAv
LyBUaGUgcmVjdCBpbiB0cmFuc2Zvcm1lZCBjb250ZW50cyBjb29yZGluYXRlcworICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCByZWN0KG9yaWdpbk9mVGlsZShpbmRleCksIHRpbGVTaXplKCkpOwor
ICAgICAgICBpZiAodGlsZS0+aXNDb21taXR0ZWQoKQorICAgICAgICAgICAgJiYgbV9yZW5kZXJR
dWV1ZS0+cmVndWxhclJlbmRlckpvYnNQcmV2aW91c2x5QXR0ZW1wdGVkQnV0Tm90UmVuZGVyZWQo
cmVjdCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSByZW5kZXIgcXVldWUgcHJldmlvdXNseSB0
cmllZCB0byByZW5kZXIgdGhpcyB0aWxlLCBidXQgdGhlCisgICAgICAgICAgICAvLyB0aWxlIHdh
c24ndCB2aXNpYmxlIGF0IHRoZSB0aW1lIHdlIGNhbid0IHNpbXBseSByZXN0b3JlIHRoZSB0aWxl
CisgICAgICAgICAgICAvLyBzaW5jZSB0aGUgY29udGVudCBpcyBub3cgaW52YWxpZCBhcyBmYXIg
YXMgV2ViS2l0IGlzIGNvbmNlcm5lZC4KKyAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGNsZWFy
IHRoYXQgcGFydCBvZiB0aGUgdGlsZSBpZiBpdCBpcyB2aXNpYmxlIGFuZCB0aGVuCisgICAgICAg
ICAgICAvLyBwdXQgdGhlIHRpbGUgaW4gdGhlIHJlbmRlciBxdWV1ZSBhZ2Fpbi4KKyAgICAgICAg
ICAgIGlmIChpc1Zpc2libGUpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnRlcnNlY3QgdGhlIHRp
bGUgd2l0aCB0aGUgbm90IHJlbmRlcmVkIHJlZ2lvbiB0byBnZXQgdGhlIGFyZWFzCisgICAgICAg
ICAgICAgICAgLy8gb2YgdGhlIHRpbGUgdGhhdCB3ZSBuZWVkIHRvIGNsZWFyCisgICAgICAgICAg
ICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gdGlsZU5vdFJlbmRlcmVkUmVnaW9uCisgICAg
ICAgICAgICAgICAgICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OmludGVyc2VjdFJlZ2lv
bnMoCisgICAgICAgICAgICAgICAgICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVy
Sm9ic05vdFJlbmRlcmVkUmVnaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0KTsK
KyAgICAgICAgICAgICAgICBjbGVhckFuZFVwZGF0ZVRpbGVPZk5vdFJlbmRlcmVkUmVnaW9uKGlu
ZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHRpbGVOb3RSZW5kZXJlZFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZVJlY3QsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnVwZGF0
ZSovKTsKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCBleHRlbnRzID0gdGlsZU5vdFJlbmRlcmVkUmVnaW9uLmV4dGVudHMoKTsKKyAgICAg
ICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dXBkYXRlVGlsZXNGb3JTY3JvbGwgZGlkIGNsZWFyIHRpbGUgJWQsJWQgJWR4JWQiLAor
ICAgICAgICAgICAgICAgICAgICBleHRlbnRzLngoKSwgZXh0ZW50cy55KCksIGV4dGVudHMud2lk
dGgoKSwgZXh0ZW50cy5oZWlnaHQoKSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHVwZGF0ZVRpbGUoaW5kZXgsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworICAgICAgICB9IGVs
c2UgaWYgKGlzVmlzaWJsZQorICAgICAgICAgICAgJiYgKGZvcmNlVmlzaWJsZSB8fCAhdGlsZS0+
ZnJvbnRCdWZmZXIoKS0+aXNSZW5kZXJlZCh0aWxlVmlzaWJsZUNvbnRlbnRzUmVjdChpbmRleCkp
KQorICAgICAgICAgICAgJiYgIWlzQ3VycmVudFZpc2libGVKb2IoaW5kZXgsIHRpbGUsIGJhY2tp
bmdTdG9yZVJlY3QpKQorICAgICAgICAgICAgdXBkYXRlVGlsZShpbmRleCwgZmFsc2UgLyppbW1l
ZGlhdGUqLyk7CisgICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc2V0VGls
ZShjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLCBib29sIHJl
c2V0QmFja2dyb3VuZCkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBtX3dlYlBhZ2Ut
PmQtPnNldFNob3VsZFJlc2V0VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICBUaWxlUmVjdCB0aWxlUmVjdDsKKyAgICB0aWxlUmVjdC5maXJzdCA9IGlu
ZGV4OworICAgIHRpbGVSZWN0LnNlY29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgLy8gT25s
eSBjbGVhciByZWd1bGFyIHJlbmRlciBqb2JzIGlmIHdlJ3JlIGNsZWFyaW5nIHRoZSBiYWNrZ3Jv
dW5kIHRvbworICAgIG1fcmVuZGVyUXVldWUtPmNsZWFyKG1hcEZyb21UaWxlc1RvVHJhbnNmb3Jt
ZWRDb250ZW50cyh0aWxlUmVjdCksIHJlc2V0QmFja2dyb3VuZCAvKmNsZWFyUmVndWxhclJlbmRl
ckpvYnMqLyk7CisgICAgaWYgKHJlc2V0QmFja2dyb3VuZCkKKyAgICAgICAgdGlsZS0+cmVzZXQo
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlKGNvbnN0IFRpbGVJ
bmRleCYgaW5kZXgsIGJvb2wgaW1tZWRpYXRlKQoreworICAgIGlmICghaXNBY3RpdmUoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmly
c3QgPSBpbmRleDsKKyAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAg
IFBsYXRmb3JtOjpJbnRSZWN0IHVwZGF0ZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVk
Q29udGVudHModGlsZVJlY3QpOworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBp
c1RpbGVWaXNpYmxlKGluZGV4KSA/IFJlbmRlclF1ZXVlOjpWaXNpYmxlU2Nyb2xsIDogUmVuZGVy
UXVldWU6Ok5vblZpc2libGVTY3JvbGw7CisgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgcmVu
ZGVyKHVwZGF0ZVJlY3QsIHRydWUgLypyZW5kZXJDb250ZW50T25seSovKTsKKyAgICBlbHNlCisg
ICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoam9iVHlwZSwgdXBkYXRlUmVjdCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZShjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmIG9yaWdpbiwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB1cGRhdGVSZWN0ID0g
UGxhdGZvcm06OkludFJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICBSZW5kZXJRdWV1ZTo6
Sm9iVHlwZSBqb2JUeXBlID0gaXNUaWxlVmlzaWJsZShvcmlnaW4pID8gUmVuZGVyUXVldWU6OlZp
c2libGVTY3JvbGwgOiBSZW5kZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9sbDsKKyAgICBpZiAoaW1t
ZWRpYXRlKQorICAgICAgICByZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAvKnJlbmRlckNvbnRlbnRP
bmx5Ki8pOworICAgIGVsc2UKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShqb2JU
eXBlLCB1cGRhdGVSZWN0KTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9y
ZVByaXZhdGU6OlRpbGVSZWN0JiB0aWxlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJv
bVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBmcm9udFN0YXRlKCktPmJhY2tp
bmdTdG9yZVJlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZh
dGU6Om1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpUaWxlUmVjdCYgdGlsZVJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNr
aW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZp
cnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7CisgICAg
Ly8gVGhlIG9yaWdpbiBvZiB0aGUgdGlsZSBpbmNsdWRpbmcgdGhlIGJhY2tpbmcgc3RvcmUgb2Zm
c2V0CisgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbk9mVGlsZSA9IHRoaXMtPm9y
aWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3JlUmVjdCk7CisgICAgcmVjdC5tb3ZlKG9yaWdp
bk9mVGlsZS54KCksIG9yaWdpbk9mVGlsZS55KCkpOworICAgIHJldHVybiByZWN0OworfQorCitC
YWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFw
RnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb0Fic29sdXRlVGlsZUJvdW5kYXJpZXMoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlz
aWJsZSgpIHx8ICFpc0FjdGl2ZSgpKSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICByZXR1cm4gVGlsZVJlY3RMaXN0KCk7CisgICAgfQorCisgICAgVGlsZVJlY3RMaXN0
IHRpbGVSZWN0TGlzdDsKKyAgICBpbnQgZmlyc3RYT2Zmc2V0ID0gcmVjdC54KCkgLyB0aWxlV2lk
dGgoKTsKKyAgICBpbnQgZmlyc3RZT2Zmc2V0ID0gcmVjdC55KCkgLyB0aWxlSGVpZ2h0KCk7Cisg
ICAgaW50IGxhc3RYT2Zmc2V0ID0gKHJlY3QucmlnaHQoKSAtIDEpIC8gdGlsZVdpZHRoKCk7Cisg
ICAgaW50IGxhc3RZT2Zmc2V0ID0gKHJlY3QuYm90dG9tKCkgLSAxKSAvIHRpbGVIZWlnaHQoKTsK
KyAgICBmb3IgKGludCBpID0gZmlyc3RYT2Zmc2V0OyBpIDw9IGxhc3RYT2Zmc2V0OyArK2kpIHsK
KyAgICAgICAgZm9yIChpbnQgaiA9IGZpcnN0WU9mZnNldDsgaiA8PSBsYXN0WU9mZnNldDsgKytq
KSB7CisgICAgICAgICAgICBjb25zdCBpbnQgZHN0WCA9IChpID09IGZpcnN0WE9mZnNldCkgPyBy
ZWN0LngoKSA6IGkgKiB0aWxlV2lkdGgoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RZID0g
KGogPT0gZmlyc3RZT2Zmc2V0KSA/IHJlY3QueSgpIDogaiAqIHRpbGVIZWlnaHQoKTsKKyAgICAg
ICAgICAgIGNvbnN0IGludCBkc3RSaWdodCA9IChpID09IGxhc3RYT2Zmc2V0KSA/IHJlY3Qucmln
aHQoKSA6IChpICsgMSkgKiB0aWxlV2lkdGgoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RC
b3R0b20gPSAoaiA9PSBsYXN0WU9mZnNldCkgPyByZWN0LmJvdHRvbSgpIDogKGogKyAxKSAqIHRp
bGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBzcmNYID0gZHN0WCAlIHRpbGVXaWR0
aCgpOworICAgICAgICAgICAgY29uc3QgaW50IHNyY1kgPSBkc3RZICUgdGlsZUhlaWdodCgpOwor
ICAgICAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAgICAgICB0aWxlUmVjdC5maXJz
dCA9IFRpbGVJbmRleChpLCBqKTsKKyAgICAgICAgICAgIHRpbGVSZWN0LnNlY29uZCA9IFBsYXRm
b3JtOjpJbnRSZWN0KHNyY1gsIHNyY1ksIGRzdFJpZ2h0IC0gZHN0WCwgZHN0Qm90dG9tIC0gZHN0
WSk7CisgICAgICAgICAgICB0aWxlUmVjdExpc3QuYXBwZW5kKHRpbGVSZWN0KTsKKyAgICAgICAg
fQorICAgIH0KKyAgICByZXR1cm4gdGlsZVJlY3RMaXN0OworfQorCisKK0JhY2tpbmdTdG9yZVBy
aXZhdGU6OlRpbGVSZWN0TGlzdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNmb3Jt
ZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhyZWN0LCBmcm9u
dFN0YXRlKCkpOworfQorCitCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdExpc3QgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiByZWN0LCBCYWNraW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpIGNvbnN0
Cit7CisgICAgVGlsZU1hcCB0aWxlTWFwID0gc3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFRpbGVS
ZWN0TGlzdCB0aWxlUmVjdExpc3Q7CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
dGlsZU1hcC5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGls
ZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4
ID0gaXQtPmZpcnN0OworICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29u
ZDsKKworICAgICAgICAvLyBOZWVkIHRvIG1hcCB0aGUgcmVjdCB0byB0aWxlIGNvb3JkaW5hdGVz
CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHIgPSByZWN0OworCisgICAgICAgIC8vIFRoZSBv
cmlnaW4gb2YgdGhlIHRpbGUgaW5jbHVkaW5nIHRoZSBiYWNraW5nIHN0b3JlIG9mZnNldAorICAg
ICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZUaWxlID0gdGhpcy0+b3JpZ2lu
T2ZUaWxlKGluZGV4LCBzdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKKworICAgICAgICByLm1v
dmUoLShvcmlnaW5PZlRpbGUueCgpKSwgLShvcmlnaW5PZlRpbGUueSgpKSk7CisKKyAgICAgICAg
Ly8gRG8gd2UgaW50ZXJzZWN0IHRoZSBjdXJyZW50IHRpbGUgb3Igbm8/CisgICAgICAgIHIuaW50
ZXJzZWN0KHRpbGUtPnJlY3QoKSk7CisgICAgICAgIGlmIChyLmlzRW1wdHkoKSkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIElmIHdlIGRvIGFwcGVuZCB0byBsaXN0IGFuZCBW
b2lsYSEKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAgIHRpbGVSZWN0LmZpcnN0
ID0gaW5kZXg7CisgICAgICAgIHRpbGVSZWN0LnNlY29uZCA9IHI7CisgICAgICAgIHRpbGVSZWN0
TGlzdC5hcHBlbmQodGlsZVJlY3QpOworICAgIH0KKyAgICByZXR1cm4gdGlsZVJlY3RMaXN0Owor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVNYXRyaXhJZk5lZWRlZCgp
Cit7CisgICAgLy8gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgdGlsZSBtYXRyaXgKKyAgICBzY3JvbGxC
YWNraW5nU3RvcmUoMCwgMCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29udGVu
dHNTaXplQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYpCit7CisgICAgdXBkYXRlVGls
ZU1hdHJpeElmTmVlZGVkKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xs
Q2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKQoreworICAgIC8vIEZJWE1FOiBOZWVk
IHRvIGRvIGFueXRoaW5nIGhlcmU/Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dHJh
bnNmb3JtQ2hhbmdlZCgpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV9yZW5kZXJR
dWV1ZS0+cmVzZXQoKTsKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJR
dWV1ZTo6VmlzaWJsZVpvb20sIHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgICAgIG1fd2Vi
UGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRUaWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBm
cm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxl
TWFwKCk7CisKKyAgICBib29sIGhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYiA9IG1fcmVuZGVyUXVl
dWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYigpOworICAgIGJvb2wgaXNMb2FkaW5nID0gbV9j
bGllbnQtPmlzTG9hZGluZygpOworICAgIGlmIChpc0xvYWRpbmcpIHsKKyAgICAgICAgaWYgKCFo
YXNDdXJyZW50VmlzaWJsZVpvb21Kb2IpCisgICAgICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVy
UmVjdCA9IHZpc2libGVDb250ZW50c1JlY3QoKTsgLy8gY2FjaGUgdGhpcyBmb3IgYmxpdFZpc2li
bGVDb250ZW50cworCisgICAgICAgIC8vIEFkZCB0aGUgY3VycmVudGx5IHZpc2libGUgdGlsZXMg
dG8gdGhlIHJlbmRlciBxdWV1ZSBhcyB2aXNpYmxlIHpvb20gam9icworICAgICAgICBUaWxlUmVj
dExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKHZp
c2libGVDb250ZW50c1JlY3QoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGls
ZVJlY3RMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9
IHRpbGVSZWN0TGlzdFtpXTsKKyAgICAgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0
LmZpcnN0OworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRp
bGVSZWN0LnNlY29uZDsKKyAgICAgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJy
ZW50TWFwLmdldChpbmRleCk7CisKKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHdob2xl
IHJlY3QKKyAgICAgICAgICAgIHRpbGVSZWN0LnNlY29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7Cisg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB3aG9sZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1Ry
YW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpOworICAgICAgICAgICAgbV9yZW5kZXJRdWV1ZS0+
YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVpvb20sIHdob2xlUmVjdCk7CisKKyAgICAg
ICAgICAgIC8vIENvcHkgdGhlIHZpc2libGUgY29udGVudHMgaW50byB0aGUgdmlzaWJsZVRpbGVC
dWZmZXIgaWYgd2UgZG9uJ3QgaGF2ZQorICAgICAgICAgICAgLy8gYW55IGN1cnJlbnQgdmlzaWJs
ZSB6b29tIGpvYnMKKyAgICAgICAgICAgIGlmICghaGFzQ3VycmVudFZpc2libGVab29tSm9iKSB7
CisgICAgICAgICAgICAgICAgLy8gTWFwIHRvIHRoZSBkZXN0aW5hdGlvbidzIGNvb3JkaW5hdGUg
c3lzdGVtCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVuY2UgPSB0
aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgpIC0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QubG9jYXRp
b24oKTsKKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBvZmZzZXQgPSBQbGF0Zm9y
bTo6SW50U2l6ZShkaWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkpOworICAgICAgICAgICAg
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IGRpcnR5VGlsZVJlY3Q7CisgICAgICAg
ICAgICAgICAgZGlydHlSZWN0Lm1vdmUob2Zmc2V0LndpZHRoKCksIG9mZnNldC5oZWlnaHQoKSk7
CisKKyAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB2aXNpYmxlVGlsZUJ1ZmZlcgor
ICAgICAgICAgICAgICAgICAgICA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT52
aXNpYmxlVGlsZUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIEFTU0VSVCh2aXNpYmxlVGlsZUJ1
ZmZlci0+c2l6ZSgpID09IFBsYXRmb3JtOjpJbnRTaXplKG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3Jt
ZWRWaWV3cG9ydFNpemUoKSkpOworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6YmxpdFRvQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGls
ZUJ1ZmZlci0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5UmVjdCwKKyAgICAg
ICAgICAgICAgICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5
VGlsZVJlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9yZW5k
ZXJRdWV1ZS0+cmVzZXQoKTsKKyAgICByZXNldFRpbGVzKHRydWUgLypyZXNldEJhY2tncm91bmQq
Lyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZW50YXRpb25DaGFuZ2VkKCkK
K3sKKyAgICB1cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQoKTsKKyAgICBjcmVhdGVWaXNpYmxlVGls
ZUJ1ZmZlcigpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmFjdHVhbFZpc2libGVT
aXplQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgc2l6ZSkKK3sKK30KKworc3RhdGlj
IHZvaWQgY3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKFdlYlBhZ2VQcml2YXRlKiBw
YWdlKQoreworICAgIEFTU0VSVChwYWdlKTsKKyAgICBTdXJmYWNlUG9vbCogc3VyZmFjZVBvb2wg
PSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKTsKKyAgICBzdXJmYWNlUG9vbC0+aW5p
dGlhbGl6ZVZpc2libGVUaWxlQnVmZmVyKHBhZ2UtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNyZWF0ZVN1cmZhY2VzKCkKK3sKKyAg
ICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAg
IFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgQVNT
RVJUKGN1cnJlbnRNYXAuaXNFbXB0eSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2UtPmlzVmlzaWJs
ZSgpKSB7CisgICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGFzIHBh
cnQgb2Ygc2V0dGluZyB1cCBhIG5ldyB3ZWIgcGFnZSBpbnN0YW5jZSBhbmQKKyAgICAgICAgLy8g
YmVmb3JlIHNhaWQgaW5zdGFuY2UgaXMgbWFkZSB2aXNpYmxlIHNvIGFzIHRvIGVuc3VyZSBhIGNv
bnNpc3RlbnQgZGVmaW5pdGlvbiBvZiB3ZWIKKyAgICAgICAgLy8gcGFnZSB2aXNpYmlsaXR5LiBU
aGF0IGlzLCBhIHdlYiBwYWdlIGlzIHNhaWQgdG8gYmUgdmlzaWJsZSB3aGVuIGV4cGxpY2l0bHkg
bWFkZSB2aXNpYmxlLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29s
OjpnbG9iYWxTdXJmYWNlUG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplKHRpbGVT
aXplKCkpOworCisgICAgaWYgKHN1cmZhY2VQb29sLT5pc0VtcHR5KCkpIC8vIHNldHRpbmdzIHNw
ZWNpZnkgMCB0aWxlcyAvIG5vIGJhY2tpbmcgc3RvcmUKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y29uc3QgRGl2aXNvciBkaXZpc29yID0gYmVzdERpdmlzb3IoZXhwYW5kZWRDb250ZW50c1NpemUo
KSwgdGlsZVdpZHRoKCksIHRpbGVIZWlnaHQoKSwgbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCks
IG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpLCBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNp
b24pOworCisgICAgaW50IG51bWJlck9mVGlsZXNXaWRlID0gZGl2aXNvci5maXJzdDsKKyAgICBp
bnQgbnVtYmVyT2ZUaWxlc0hpZ2ggPSBkaXZpc29yLnNlY29uZDsKKworICAgIGNvbnN0IFN1cmZh
Y2VQb29sOjpUaWxlTGlzdCB0aWxlTGlzdCA9IHN1cmZhY2VQb29sLT50aWxlTGlzdCgpOworICAg
IEFTU0VSVCgoaW50KXRpbGVMaXN0LnNpemUoKSA+PSAobnVtYmVyT2ZUaWxlc1dpZGUgKiBudW1i
ZXJPZlRpbGVzSGlnaCkpOworCisgICAgVGlsZU1hcCB0aWxlczsgLy8gb3VyIG5ldyB0aWxlIG1h
cAorICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtYmVyT2ZUaWxlc0hpZ2g7ICsreSkgeworICAg
ICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bWJlck9mVGlsZXNXaWRlOyArK3gpIHsKKyAgICAg
ICAgICAgIFRpbGVJbmRleCBpbmRleCh4LCB5KTsKKyAgICAgICAgICAgIHRpbGVzLmFkZChpbmRl
eCwgdGlsZUxpc3QuYXQoeCArIHkgKiBudW1iZXJPZlRpbGVzV2lkZSkpOworICAgICAgICB9Cisg
ICAgfQorCisgICAgLy8gU2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBiYWNraW5nc3RvcmUg
Z2VvbWV0cnkKKyAgICBiYWNrU3RhdGUoKS0+c2V0TnVtYmVyT2ZUaWxlc1dpZGUoZGl2aXNvci5m
aXJzdCk7CisgICAgYmFja1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNIaWdoKGRpdmlzb3Iuc2Vj
b25kKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0VGlsZU1hcCh0aWxlcyk7CisKKyAgICAvLyBTd2Fw
IGJhY2svZnJvbnQgc3RhdGUKKyAgICBzd2FwU3RhdGUoKTsKKworICAgIGNyZWF0ZVZpc2libGVU
aWxlQnVmZmVyRm9yV2ViUGFnZShtX3dlYlBhZ2UtPmQpOworfQorCit2b2lkIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OmNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCkKK3sKKyAgICBpZiAoIW1fd2ViUGFn
ZS0+aXNWaXNpYmxlKCkgfHwgIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNy
ZWF0ZVZpc2libGVUaWxlQnVmZmVyRm9yV2ViUGFnZShtX3dlYlBhZ2UtPmQpOworfQorCitQbGF0
Zm9ybTo6SW50UG9pbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZ2luT2ZUaWxlKGNvbnN0IFRp
bGVJbmRleCYgaW5kZXgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG9yaWdpbk9mVGlsZShpbmRleCwg
ZnJvbnRTdGF0ZSgpLT5iYWNraW5nU3RvcmVSZWN0KCkpOworfQorCitQbGF0Zm9ybTo6SW50UG9p
bnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZ2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5k
ZXgsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAorewor
ICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UG9pbnQoYmFja2luZ1N0b3JlUmVjdC54KCkgKyAoaW5k
ZXguaSgpICogdGlsZVdpZHRoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFj
a2luZ1N0b3JlUmVjdC55KCkgKyAoaW5kZXguaigpICogdGlsZUhlaWdodCgpKSk7Cit9CisKK2lu
dCBCYWNraW5nU3RvcmVQcml2YXRlOjptaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdAor
eworICAgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiB0aWxlcyB3aWRlIHJlcXVpcmVkIHRvIGZp
bGwgdGhlIHZpZXdwb3J0ICsgMSB0aWxlIGV4dHJhIHRvIGFsbG93IHNjcm9sbGluZworICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdwb3J0
U2l6ZSgpLndpZHRoKCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odGlsZVdpZHRoKCkpKSkgKyAxOwor
fQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNIaWdoKCkg
Y29uc3QKK3sKKyAgICAvLyBUaGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgaGlnaCByZXF1aXJl
ZCB0byBmaWxsIHRoZSB2aWV3cG9ydCArIDEgdGlsZSBleHRyYSB0byBhbGxvdyBzY3JvbGxpbmcK
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihtX2NsaWVudC0+dHJhbnNmb3JtZWRW
aWV3cG9ydFNpemUoKS5oZWlnaHQoKSAvIHN0YXRpY19jYXN0PGZsb2F0Pih0aWxlSGVpZ2h0KCkp
KSkgKyAxOworfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBCYWNraW5nU3RvcmVQcml2YXRlOjpleHBh
bmRlZENvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZSgpLmV4cGFuZGVkVG8obV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3Bv
cnRTaXplKCkpOworfQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVdpZHRoKCkKK3sK
KyAgICBzdGF0aWMgaW50IHR3ID0gMDsKKyAgICBpZiAoIXR3KQorICAgICAgICB0dyA9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2NhcGVXaWR0aCgpOworICAg
IHJldHVybiB0dzsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVIZWlnaHQoKQor
eworICAgIHN0YXRpYyBpbnQgdGggPSAwOworICAgIGlmICghdGgpCisgICAgICAgIHRoID0gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmxhbmRzY2FwZUhlaWdodCgpOwor
ICAgIHJldHVybiB0aDsKK30KKworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6dGlsZVNpemUoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50U2l6ZSh0aWxlV2lkdGgo
KSwgdGlsZUhlaWdodCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dGlsZVJlY3QoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgwLCAwLCB0
aWxlV2lkdGgoKSwgdGlsZUhlaWdodCgpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRl
OjpyZW5kZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciog
dGlsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBzdXJmYWNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHNS
ZWN0KSBjb25zdAoreworICAgIC8vIElmIHRpbGVCdWZmZXIgPT0gMCwgd2UgcmVuZGVyIGRpcmVj
dGx5IHRvIHRoZSB3aW5kb3cuCisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpICYmIHRp
bGVCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
Q3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0
ZTo6cmVuZGVyQ29udGVudHMgdGlsZUJ1ZmZlcj0weCV4IHN1cmZhY2VPZmZzZXQ9KCVkLCVkKSBj
b250ZW50c1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aWxlQnVmZmVyLCBzdXJmYWNlT2Zmc2V0LngoKSwgc3VyZmFjZU9mZnNldC55KCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb250ZW50c1JlY3QueCgpLCBjb250ZW50c1JlY3QueSgpLCBj
b250ZW50c1JlY3Qud2lkdGgoKSwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisg
ICAgLy8gSXQgaXMgdXAgdG8gY2FsbGVycyBvZiB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGxheW91
dCB0aGVtc2VsdmVzIQorICAgIEFTU0VSVCghbV93ZWJQYWdlLT5kLT5tYWluRnJhbWUoKS0+dmll
dygpLT5uZWVkc0xheW91dCgpKTsKKworICAgIFBsYXRmb3JtOjpJbnRTaXplIGNvbnRlbnRzU2l6
ZSA9IG1fY2xpZW50LT5jb250ZW50c1NpemUoKTsKKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3Io
bV93ZWJQYWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogdGFyZ2V0QnVmZmVyID0gdGlsZUJ1ZmZl
cgorICAgICAgICA/IHRpbGVCdWZmZXIKKyAgICAgICAgOiBtX3dlYlBhZ2UtPmNsaWVudCgpLT53
aW5kb3coKS0+YnVmZmVyKCk7CisKKyAgICBpZiAoY29udGVudHNTaXplLmlzRW1wdHkoKQorICAg
ICAgICB8fCAhUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2Ns
aWVudC0+dHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSkuY29udGFpbnMoY29udGVudHNSZWN0KQor
ICAgICAgICB8fCBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSkgeworICAgICAgICAvLyBDbGVh
ciB0aGUgYXJlYSBpZiBpdCdzIG5vdCBmdWxseSBjb3ZlcmVkIGJ5IChvcGFxdWUpIGNvbnRlbnRz
LgorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCBjbGVhclJlY3QgPSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgICAgIGNvbnRlbnRzUmVjdC54KCkg
LSBzdXJmYWNlT2Zmc2V0LngoKSwgY29udGVudHNSZWN0LnkoKSAtIHN1cmZhY2VPZmZzZXQueSgp
LAorICAgICAgICAgICAgY29udGVudHNSZWN0LndpZHRoKCksIGNvbnRlbnRzUmVjdC5oZWlnaHQo
KSk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZl
cih0YXJnZXRCdWZmZXIsIGNsZWFyUmVjdCwKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5y
ZWQoKSwgYmFja2dyb3VuZENvbG9yLmdyZWVuKCksCisgICAgICAgICAgICBiYWNrZ3JvdW5kQ29s
b3IuYmx1ZSgpLCBiYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSk7CisgICAgfQorCisgICAgaWYgKGNv
bnRlbnRzU2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBtX3dlYlBhZ2UtPmQtPmNvbW1pdFJvb3RMYXllcklmTmVl
ZGVkKCk7CisjZW5kaWYKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6RHJh
d2FibGUqIGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpsb2NrQnVmZmVyRHJhd2FibGUodGFyZ2V0QnVmZmVyKTsKKworICAgIFBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0KiBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCA9IGJ1ZmZlckRy
YXdhYmxlCisgICAgICAgID8gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNyZWF0
ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxlKQorICAgICAgICA6IDA7Cisg
ICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
ID0gYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQKKyAgICAgICAgPyBidWZmZXJQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dAorICAgICAgICA6IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9v
bCgpLT5sb2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKTsKKworICAgIEFTU0VSVCh0YXJnZXRQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dCk7CisKKyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBn
cmFwaGljc0NvbnRleHQodGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworCisgICAgICAg
IC8vIEJlbGlldmUgaXQgb3Igbm90IHRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBXZWJLaXQg
U2tpYSBiYWNrZW5kCisgICAgICAgIC8vIGRvZXNuJ3Qgc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRl
IHVubGVzcyB5b3UgY2FsbCBzYXZlIGZpcnN0IDpQCisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5z
YXZlKCk7CisKKyAgICAgICAgLy8gVHJhbnNsYXRlIGNvbnRleHQgYWNjb3JkaW5nIHRvIG9mZnNl
dAorICAgICAgICBncmFwaGljc0NvbnRleHQudHJhbnNsYXRlKC1zdXJmYWNlT2Zmc2V0LngoKSwg
LXN1cmZhY2VPZmZzZXQueSgpKTsKKworICAgICAgICAvLyBBZGQgb3VyIHRyYW5zZm9ybWF0aW9u
IG1hdHJpeCBhcyB0aGUgZ2xvYmFsIHRyYW5zZm9ybQorICAgICAgICBBZmZpbmVUcmFuc2Zvcm0g
YWZmaW5lVHJhbnNmb3JtKAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlv
bk1hdHJpeCgpLT5hKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9u
TWF0cml4KCktPmIoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25N
YXRyaXgoKS0+YygpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1h
dHJpeCgpLT5kKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0
cml4KCktPmUoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRy
aXgoKS0+ZigpKTsKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LmNvbmNhdENUTShhZmZpbmVUcmFu
c2Zvcm0pOworCisgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBtYXRyaXggaXMgYXBwbGllZCB3ZSBu
ZWVkIHVudHJhbmZvcm1lZCBjb250ZW50cyBjb29yZGluYXRlcworICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9t
VHJhbnNmb3JtZWQoY29udGVudHNSZWN0KTsKKworICAgICAgICAvLyBXZSBleHRyYWN0IGZyb20g
dGhlIGNvbnRlbnRzUmVjdCBidXQgZHJhdyBhIHNsaWdodGx5IGxhcmdlciByZWdpb24gdGhhbgor
ICAgICAgICAvLyB3ZSB3ZXJlIHRvbGQgdG8sIGluIG9yZGVyIHRvIGF2b2lkIHBpeGVscyBiZWlu
ZyByZW5kZXJlZCBvbmx5IHBhcnRpYWxseS4KKyAgICAgICAgY29uc3QgaW50IGF0TGVhc3RPbmVE
ZXZpY2VQaXhlbCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKDEuMCAvIG1f
d2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+YSgpKSk7CisgICAgICAgIHVudHJh
bnNmb3JtZWRDb250ZW50c1JlY3QuaW5mbGF0ZShhdExlYXN0T25lRGV2aWNlUGl4ZWwsIGF0TGVh
c3RPbmVEZXZpY2VQaXhlbCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1bnRyYW5zZm9y
bWVkIHJlY3RhbmdsZSBmb3IgdGhlIChzbGlnaHRseSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBp
bml0aWFsbHkgcmVxdWVzdGVkKSByZXBhaW50ZWQgcmVnaW9uIGlzIHdpdGhpbiB0aGUgYm91bmRz
IG9mIHRoZSBwYWdlLgorICAgICAgICB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0LmludGVyc2Vj
dChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGNvbnRlbnRzU2l6
ZSkpOworCisgICAgICAgIC8vIFNvbWUgV2ViS2l0IHBhaW50aW5nIGJhY2tlbmRzICpjb3VnaCog
U2tpYSAqY291Z2gqIGRvbid0IHNldCB0aGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gdG8g
dGhlIGRpcnR5UmVjdCBzbyBkbyBzbyBoZXJlIGV4cGxpY2l0bHkKKyAgICAgICAgZ3JhcGhpY3ND
b250ZXh0LmNsaXAodW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgLy8gVGFr
ZSBjYXJlIG9mIHBvc3NpYmxlIGxlZnQgb3ZlcmZsb3cgb24gUlRMIHBhZ2UuCisgICAgICAgIGlm
IChpbnQgbGVmdE92ZXJGbG93ID0gbV9jbGllbnQtPmZyYW1lKCktPnZpZXcoKS0+bWluaW11bVNj
cm9sbFBvc2l0aW9uKCkueCgpKSB7CisgICAgICAgICAgICB1bnRyYW5zZm9ybWVkQ29udGVudHNS
ZWN0Lm1vdmUobGVmdE92ZXJGbG93LCAwKTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC50
cmFuc2xhdGUoLWxlZnRPdmVyRmxvdywgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMZXQg
V2ViQ29yZSByZW5kZXIgdGhlIHBhZ2UgY29udGVudHMgaW50byB0aGUgZHJhd2luZyBzdXJmYWNl
LgorICAgICAgICBtX2NsaWVudC0+ZnJhbWUoKS0+dmlldygpLT5wYWludENvbnRlbnRzKCZncmFw
aGljc0NvbnRleHQsIHVudHJhbnNmb3JtZWRDb250ZW50c1JlY3QpOworCisjaWYgRU5BQkxFKElO
U1BFQ1RPUikKKyAgICAgICAgaWYgKG1fd2ViUGFnZS0+ZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250
cm9sbGVyKCktPmVuYWJsZWQoKSkgeworICAgICAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgc2Ny
b2xsUG9zaXRpb24gPSBtX2NsaWVudC0+ZnJhbWUoKS0+dmlldygpLT5zY3JvbGxQb3NpdGlvbigp
OworICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnRyYW5zbGF0ZShzY3JvbGxQb3NpdGlvbi54
KCksIHNjcm9sbFBvc2l0aW9uLnkoKSk7CisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPm1fcGFn
ZS0+aW5zcGVjdG9yQ29udHJvbGxlcigpLT5kcmF3Tm9kZUhpZ2hsaWdodChncmFwaGljc0NvbnRl
eHQpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBncmFwaGljc0NvbnRleHQucmVzdG9y
ZSgpOworICAgIH0KKworICAgIC8vIEdyYWIgdGhlIHJlcXVlc3RlZCByZWdpb24gZnJvbSB0aGUg
ZHJhd2luZyBzdXJmYWNlIGludG8gdGhlIHRpbGUgaW1hZ2UuCisjaWYgVVNFKE9QRU5WRykKKyAg
ICBzdXJmYWNlLT5tYWtlQ3VycmVudCgpOworI2VuZGlmCisKKyAgICBkZWxldGUgYnVmZmVyUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQ7CisKKyAgICBpZiAoYnVmZmVyRHJhd2FibGUpCisgICAgICAg
IHJlbGVhc2VCdWZmZXJEcmF3YWJsZSh0YXJnZXRCdWZmZXIpOworICAgIGVsc2UgeworICAgICAg
ICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgZHN0UG9pbnQoY29udGVudHNSZWN0LngoKSAtIHN1
cmZhY2VPZmZzZXQueCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29udGVudHNSZWN0LnkoKSAtIHN1cmZhY2VPZmZzZXQueSgpKTsKKyAgICAgICAgY29uc3Qg
UGxhdGZvcm06OkludFJlY3QgZHN0UmVjdChkc3RQb2ludCwgY29udGVudHNSZWN0LnNpemUoKSk7
CisgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0IHNyY1JlY3QgPSBkc3RSZWN0OworCisg
ICAgICAgIC8vIElmIHdlIGNvdWxkbid0IGRpcmVjdGx5IGRyYXcgdG8gdGhlIGJ1ZmZlciwgY29w
eSBmcm9tIHRoZSBkcmF3aW5nIHN1cmZhY2UuCisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpLT5yZWxlYXNlVGlsZVJlbmRlcmluZ1N1cmZhY2UodGFyZ2V0UGxhdGZvcm1H
cmFwaGljc0NvbnRleHQpOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OmJsaXRUb0J1ZmZlcih0YXJnZXRCdWZmZXIsIGRzdFJlY3QsIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6ZHJhd2luZ1N1cmZhY2UoKSwgc3JjUmVjdCk7CisgICAgfQorfQorCisjaWYg
REVCVUdfRkFUX0ZJTkdFUlMKK3N0YXRpYyB2b2lkIGRyYXdEZWJ1Z1JlY3QoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciwgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGRzdFJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LCB1bnNpZ25l
ZCBjaGFyIHJlZCwgdW5zaWduZWQgY2hhciBncmVlbiwgdW5zaWduZWQgY2hhciBibHVlKQorewor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRyYXdSZWN0KHNyY1JlY3QpOworICAgIGRyYXdSZWN0Lmlu
dGVyc2VjdChkc3RSZWN0KTsKKyAgICBpZiAoIWRyYXdSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZlcihkc3RCdWZmZXIsIGRy
YXdSZWN0LCByZWQsIGdyZWVuLCBibHVlLCAxMjgpOworfQorI2VuZGlmCisKK3ZvaWQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6YmxpdFRvV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RS
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHNyY0J1ZmZlciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNS
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBibGVuZCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZ2xv
YmFsQWxwaGEpCit7CisgICAgQVNTRVJUKEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJm
YWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgICB3aW5k
b3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsKKyAgICB3
aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsKKworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBkc3RCdWZmZXIgPSBtX3dl
YlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+YnVmZmVyKCk7CisgICAgQVNTRVJUKGRzdEJ1ZmZl
cik7CisgICAgQVNTRVJUKHNyY0J1ZmZlcik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAgICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
V2FybiwgIkVtcHR5IHdpbmRvdyBidWZmZXIsIGNvdWxkbid0IGJsaXRUb1dpbmRvdyIpOworCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCbGVuZE1vZGUgYmxlbmRNb2RlID0g
YmxlbmQKKyAgICAgICAgPyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNvdXJjZU92
ZXIKKyAgICAgICAgOiBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNvdXJjZUNvcHk7
CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmJsaXRUb0J1ZmZlcihkc3RC
dWZmZXIsIGRzdFJlY3QsIHNyY0J1ZmZlciwgc3JjUmVjdCwgYmxlbmRNb2RlLCBnbG9iYWxBbHBo
YSk7CisKKyNpZiBERUJVR19GQVRfRklOR0VSUworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVy
LCBkc3RSZWN0LCBGYXRGaW5nZXJzOjptX2RlYnVnRmF0RmluZ2VyUmVjdCwgMjEwLCAyMTAsIDI1
MCk7CisgICAgZHJhd0RlYnVnUmVjdChkc3RCdWZmZXIsIGRzdFJlY3QsIFBsYXRmb3JtOjpJbnRS
ZWN0KEZhdEZpbmdlcnM6Om1fZGVidWdGYXRGaW5nZXJDbGlja1Bvc2l0aW9uLCBQbGF0Zm9ybTo6
SW50U2l6ZSgzLCAzKSksIDAsIDAsIDApOworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVyLCBk
c3RSZWN0LCBQbGF0Zm9ybTo6SW50UmVjdChGYXRGaW5nZXJzOjptX2RlYnVnRmF0RmluZ2VyQWRq
dXN0ZWRQb3NpdGlvbiwgUGxhdGZvcm06OkludFNpemUoNSwgNSkpLCAxMDAsIDEwMCwgMTAwKTsK
KyNlbmRpZgorCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2hlY2tlcldpbmRvdyhj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIGNvbnRlbnRzT3JpZ2lu
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb250ZW50
c1NjYWxlKQoreworICAgIEFTU0VSVChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgd2luZG93
RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisgICAgd2lu
ZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQ
YWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIp
OworICAgIGlmICghZHN0QnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9n
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVy
LCBjb3VsZG4ndCBjaGVja2VyV2luZG93Iik7CisKKyAgICBDb2xvciBjb2xvcihtX3dlYlBhZ2Ut
PnNldHRpbmdzKCktPmJhY2tncm91bmRDb2xvcigpKTsKKyAgICB1bnNpZ25lZCBjaGFyIGFscGhh
ID0gY29sb3IuYWxwaGEoKTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNo
ZWNrZXJCdWZmZXIoZHN0QnVmZmVyLCBkc3RSZWN0LCBjb250ZW50c09yaWdpbiwgY29udGVudHNT
Y2FsZSwgYWxwaGEpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVX
aW5kb3coKQoreworICAgIC8vIEdyYWIgYSByZWN0IGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVu
dCB0aHJlYWQKKyAgICBpZiAoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJl
YWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKQorICAgICAgICBpbnZhbGlkYXRl
V2luZG93KG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRp
b25SZWN0KCkpOworICAgIGVsc2UKKyAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhQbGF0Zm9ybTo6
SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSgpKSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW52YWxpZGF0
ZVdpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0KQoreworICAgIGlmIChkc3QuaXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3Jt
Ojp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSAm
JiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICAvLyBUaGlzIG5l
ZWRzIHRvIGJlIHN5bmMgaW4gb3JkZXIgdG8gc3dhcCB0aGUgcmVjZW50bHkgZHJhd24gdGhpbmcu
Li4KKyAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGZyb20gV2ViS2l0IHRocmVh
ZCBkdXJpbmcgZGlyZWN0IHJlbmRlcmluZy4KKyAgICAgICAgdHlwZWRlZiB2b2lkIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUpKGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0Jik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50
ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaFN5bmNNZXNzYWdlKAorICAgICAg
ICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlPEZ1bmN0
aW9uVHlwZSwgQmFja2luZ1N0b3JlUHJpdmF0ZSwgUGxhdGZvcm06OkludFJlY3Q+KAorICAgICAg
ICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2luZG93LCB0aGlzLCBk
c3QpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQor
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xl
dmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2luZG93IGRzdCA9
ICVzIiwgZHN0LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgIC8vIFNp
bmNlIG91ciB3aW5kb3cgbWF5IGFsc28gYmUgZG91YmxlIGJ1ZmZlcmVkLCB3ZSBuZWVkIHRvIGFs
c28gY29weSB0aGUKKyAgICAvLyBmcm9udCBidWZmZXIncyBjb250ZW50cyB0byB0aGUgYmFjayBi
dWZmZXIgYmVmb3JlIHdlIHN3YXAgdGhlbS4gSXQgaXMKKyAgICAvLyBhbmFsb2dvdXMgdG8gd2hh
dCB3ZSBkbyB3aXRoIG91ciBkb3VibGUgYnVmZmVyZWQgdGlsZXMgYnkgY2FsbGluZworICAgIC8v
IGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNraW5nU3VyZmFjZU9mVGlsZSgpLiBJdCBvbmx5IGFm
ZmVjdHMgcGFydGlhbAorICAgIC8vIHNjcmVlbiB1cGRhdGVzIHNpbmNlIHdoZW4gd2UgYXJlIHNj
cm9sbGluZyBvciB6b29taW5nLCB0aGUgd2hvbGUgd2luZG93CisgICAgLy8gaXMgaW52YWxpZGF0
ZWQgYW55d2F5cyBhbmQgbm8gY29weWluZyBpcyBuZWVkZWQuCisgICAgY29weVByZXZpb3VzQ29u
dGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRz
dFJlY3QgPSBkc3Q7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aWV3cG9ydFJlY3QoUGxhdGZv
cm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7
CisgICAgZHN0UmVjdC5pbnRlcnNlY3Qodmlld3BvcnRSZWN0KTsKKworICAgIGlmIChkc3RSZWN0
LndpZHRoKCkgPD0gMCB8fCBkc3RSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAgIHJldHVybjsK
KworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2
YXRlOjppbnZhbGlkYXRlV2luZG93IHBvc3RpbmcgPSAlcyIsIGRzdFJlY3QudG9TdHJpbmcoKS51
dGY4KCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgbV9jdXJyZW50V2luZG93QmFja0J1ZmZlciA9
IChtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyICsgMSkgJSAyOworICAgIG1fd2ViUGFnZS0+Y2xp
ZW50KCktPndpbmRvdygpLT5wb3N0KGRzdFJlY3QpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OmNsZWFyV2luZG93KCkKK3sKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1
c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSAmJiAh
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICB0eXBlZGVmIHZvaWQg
KEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSko
KTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNz
YWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJhY2tpbmdTdG9y
ZVByaXZhdGU+KAorICAgICAgICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhcldp
bmRvdywgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFnZS0+Y2xpZW50
KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsKKyAgICBpZiAo
IWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwgY291bGRuJ3Qg
Y2xlYXJXaW5kb3ciKTsKKworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0
dGVkUmVnaW9uKCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdp
b24oUGxhdGZvcm06OkludFJlY3QoCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwg
bV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKworICAgIENv
bG9yIGNvbG9yKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+YmFja2dyb3VuZENvbG9yKCkpOworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZHN0QnVmZmVyLAor
ICAgICAgICBjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgpLCBjb2xvci5h
bHBoYSgpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhcldpbmRvdyhjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSkKK3sKKyAgICBpZiAoIUJsYWNrQmVy
cnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJl
bnRUaHJlYWQoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAg
ICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6
KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg
Y2hhcik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFk
TWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rpb25UeXBlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tpbmdT
dG9yZVByaXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcj4oCisgICAgICAgICAgICAgICAgJkJhY2tpbmdT
dG9yZVByaXZhdGU6OmNsZWFyV2luZG93LCB0aGlzLCByZWN0LCByZWQsIGdyZWVuLCBibHVlLCBh
bHBoYSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPndp
bmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsKKyAgICBpZiAoIWRzdEJ1
ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwgY291bGRuJ3QgY2xlYXJX
aW5kb3ciKTsKKworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVn
aW9uKHJlY3QpOworICAgIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9u
KHJlY3QpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZl
cihkc3RCdWZmZXIsIHJlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30KKworYm9vbCBC
YWNraW5nU3RvcmVQcml2YXRlOjppc1Njcm9sbGluZ09yWm9vbWluZygpIGNvbnN0Cit7CisgICAg
QmFja2luZ1N0b3JlTXV0ZXhMb2NrZXIgbG9ja2VyKGNvbnN0X2Nhc3Q8QmFja2luZ1N0b3JlUHJp
dmF0ZSo+KHRoaXMpKTsKKyAgICByZXR1cm4gbV9pc1Njcm9sbGluZ09yWm9vbWluZzsKK30KKwor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRTY3JvbGxpbmdPclpvb21pbmcoYm9vbCBzY3Jv
bGxpbmdPclpvb21pbmcsIGJvb2wgc2hvdWxkQmxpdCkKK3sKKyAgICB7CisgICAgICAgIEJhY2tp
bmdTdG9yZU11dGV4TG9ja2VyIGxvY2tlcih0aGlzKTsKKyAgICAgICAgbV9pc1Njcm9sbGluZ09y
Wm9vbWluZyA9IHNjcm9sbGluZ09yWm9vbWluZzsKKyAgICB9CisKKyNpZiAhRU5BQkxFX1JFUEFJ
TlRPTlNDUk9MTAorICAgIG1fc3VzcGVuZFJlbmRlckpvYnMgPSBzY3JvbGxpbmdPclpvb21pbmc7
IC8vIFN1c3BlbmQgdGhlIHJlbmRlcmluZyBvZiBldmVyeXRoaW5nCisjZW5kaWYKKworICAgIGlm
ICghbV93ZWJQYWdlLT5zZXR0aW5ncygpLT5zaG91bGRSZW5kZXJBbmltYXRpb25zT25TY3JvbGxP
clpvb20oKSkKKyAgICAgICAgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMgPSBzY3JvbGxpbmdP
clpvb21pbmc7IC8vIFN1c3BlbmQgdGhlIHJlbmRlcmluZyBvZiBhbmltYXRpb25zCisKKyAgICAv
LyBDbGVhciB0aGlzIGZsYWcgc2luY2Ugd2UgZG9uJ3QgY2FyZSBpZiB0aGUgcmVuZGVyIHF1ZXVl
IGlzIHVuZGVyIHByZXNzdXJlCisgICAgLy8gb3Igbm90IHNpbmNlIHdlIGFyZSBzY3JvbGxpbmcg
YW5kIGl0IGlzIG1vcmUgaW1wb3J0YW50IHRvIG5vdCBsYWcgdGhhbgorICAgIC8vIGl0IGlzIHRv
IGVuc3VyZSBhbmltYXRpb25zIGFjaGlldmUgYmV0dGVyIGZyYW1lcmF0ZXMhCisgICAgaWYgKHNj
cm9sbGluZ09yWm9vbWluZykKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+c2V0Q3VycmVudFJlZ3Vs
YXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1cmUoZmFsc2UpOworI2lmIEVOQUJMRV9TQ1JPTExC
QVJTCisgICAgZWxzZSBpZiAoc2hvdWxkQmxpdCAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9X
aW5kb3coKSkKKyAgICAgICAgYmxpdFZpc2libGVDb250ZW50cygpOworI2VuZGlmCit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bG9ja0JhY2tpbmdTdG9yZSgpCit7CisgICAgcHRocmVh
ZF9tdXRleF9sb2NrKCZtX211dGV4KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjp1
bmxvY2tCYWNraW5nU3RvcmUoKQoreworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4
KTsKK30KKworQmFja2luZ1N0b3JlR2VvbWV0cnkqIEJhY2tpbmdTdG9yZVByaXZhdGU6OmZyb250
U3RhdGUoKSBjb25zdAoreworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9y
ZUdlb21ldHJ5Kj4obV9mcm9udFN0YXRlKTsKK30KKworQmFja2luZ1N0b3JlR2VvbWV0cnkqIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OmJhY2tTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlaW50
ZXJwcmV0X2Nhc3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2JhY2tTdGF0ZSk7Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3dhcFN0YXRlKCkKK3sKKyNpZiBPUyhRTlgpCisgICAg
Ly8gc3RvcmUgdGVtcHMKKyAgICB1bnNpZ25lZCBmcm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5z
aWduZWQ+KGZyb250U3RhdGUoKSk7CisgICAgdW5zaWduZWQgYmFjayA9IHJlaW50ZXJwcmV0X2Nh
c3Q8dW5zaWduZWQ+KGJhY2tTdGF0ZSgpKTsKKworICAgIC8vIGF0b21pYyBjaGFuZ2UKKyAgICBf
c21wX3hjaGcoJm1fZnJvbnRTdGF0ZSwgYmFjayk7CisgICAgX3NtcF94Y2hnKCZtX2JhY2tTdGF0
ZSwgZnJvbnQpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFk
TWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOworI2Vsc2UKKyNlcnJvciAi
aW1wbGVtZW50IG1lISIKKyNlbmRpZgorfQorCitCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0
ZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlWyhtX2N1cnJlbnRXaW5kb3dCYWNrQnVm
ZmVyICsgMSkgJSAyXTsKK30KKworQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUqIEJhY2tp
bmdTdG9yZVByaXZhdGU6OndpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlW21fY3VycmVudFdpbmRvd0JhY2tCdWZmZXJdOworfQor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjpkcmF3U3ViTGF5ZXJzKCkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsK
KyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2Fn
ZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRzdCA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPnVz
ZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCk7CisgICAgaWYgKGRzdC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHNyYyA9
IG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRz
UmVjdCgpOworICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBjb250ZW50c1JlY3QgPSBtX3dlYlBhZ2Ut
PmQtPm1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0UmVjdCgKKyAgICAgICAgV2ViQ29yZTo6RmxvYXRS
ZWN0KFdlYkNvcmU6OkludFJlY3Qoc3JjKSkpOworICAgIHJldHVybiBtX3dlYlBhZ2UtPmQtPmRy
YXdTdWJMYXllcnMoZHN0LCBjb250ZW50c1JlY3QpOworfQorI2VuZGlmCisKK2Jvb2wgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6aXNBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBCYWNraW5nU3Rv
cmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9PSBtX3dlYlBhZ2UgJiYgIVN1
cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5pc0VtcHR5KCk7Cit9CisKK0JhY2tpbmdT
dG9yZTo6QmFja2luZ1N0b3JlKFdlYlBhZ2UqIHdlYlBhZ2UsIEJhY2tpbmdTdG9yZUNsaWVudCog
Y2xpZW50KQorICAgIDogZChuZXcgQmFja2luZ1N0b3JlUHJpdmF0ZSkKK3sKKyAgICBkLT5tX3dl
YlBhZ2UgPSB3ZWJQYWdlOworICAgIGQtPm1fY2xpZW50ID0gY2xpZW50OworfQorCitCYWNraW5n
U3RvcmU6On5CYWNraW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBkOworICAgIGQgPSAwOworfQor
Cit2b2lkIEJhY2tpbmdTdG9yZTo6Y3JlYXRlU3VyZmFjZSgpCit7CisgICAgc3RhdGljIGJvb2wg
aW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6aW5pdGlhbGl6ZSgpOworICAgICAgICBpbml0
aWFsaXplZCA9IHRydWU7CisgICAgfQorCisjaWYgVVNFKE9QRU5WRykKKyAgICBkLT5tX2VnbERp
c3BsYXkgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmVnbERpc3BsYXkoKTsKKwor
ICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgT3BlblZHCisgICAgZWdsQmluZEFQSShFR0xf
T1BFTlZHX0FQSSk7CisgICAgQVNTRVJUX0VHTF9OT19FUlJPUigpOworCisgICAgRUdMRGlzcGxh
eU9wZW5WRzo6c2V0Q3VycmVudERpc3BsYXkoZC0+bV9lZ2xEaXNwbGF5KTsKKyNlbmRpZgorCisg
ICAgLy8gVHJpZ2dlcnMgY3JlYXRpb24gb2Ygc3VyZmFjZXMgaW4gYmFja2luZ3N0b3JlCisgICAg
ZC0+Y3JlYXRlU3VyZmFjZXMoKTsKKworI2lmIFVTRShPUEVOVkcpCisgICAgRUdMRGlzcGxheU9w
ZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9ybVN1cmZhY2UoKS0+bWFrZUN1cnJlbnQoKTsK
KyNlbmRpZgorCisgICAgLy8gRm9jdXNpbmcgdGhlIFdlYlBhZ2UgdHJpZ2dlcnMgYSByZXBhaW50
LCBzbyB3aGlsZSB3ZSB3YW50IGl0IHRvIGJlCisgICAgLy8gZm9jdXNlZCBpbml0aWFsbHkgdGhp
cyBoYXMgdG8gaGFwcGVuIGFmdGVyIGNyZWF0aW9uIG9mIHRoZSBzdXJmYWNlLgorICAgIGQtPm1f
d2ViUGFnZS0+c2V0Rm9jdXNlZCh0cnVlKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OnN1c3Bl
bmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCkKK3sKKyAgICBkLT5zdXNwZW5kU2NyZWVu
QW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6cmVzdW1l
U2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhSZXN1bWVVcGRhdGVPcGVyYXRpb24gb3ApCit7
CisgICAgZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhvcCk7Cit9CisKK2Jv
b2wgQmFja2luZ1N0b3JlOjppc1Njcm9sbGluZ09yWm9vbWluZygpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGQtPmlzU2Nyb2xsaW5nT3Jab29taW5nKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpz
ZXRTY3JvbGxpbmdPclpvb21pbmcoYm9vbCBzY3JvbGxpbmdPclpvb21pbmcpCit7CisgICAgZC0+
c2V0U2Nyb2xsaW5nT3Jab29taW5nKHNjcm9sbGluZ09yWm9vbWluZyk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlOjpibGl0Q29udGVudHMoY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJl
Y3QmIGRzdFJlY3QsIGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50
cykKK3sKKyAgICAvLyBCbGl0dGluZyBkdXJpbmcgZGlyZWN0IHJlbmRlcmluZyBpcyBub3Qgc3Vw
cG9ydGVkCisgICAgaWYgKGlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmU6OmJs
aXRDb250ZW50cyBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBkaXJlY3QgcmVuZGVyaW5nIG1v
ZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGQtPmJsaXRDb250ZW50cyhkc3RS
ZWN0LCBjb250ZW50cyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXBhaW50KGludCB4LCBp
bnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ym9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAgZC0+cmVwYWludChQ
bGF0Zm9ybTo6SW50UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgY29udGVudENoYW5nZWQsIGlt
bWVkaWF0ZSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjpoYXNSZW5kZXJKb2JzKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZC0+c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmU6OnJlbmRlck9uSWRsZSgpCit7CisgICAgZC0+cmVuZGVyT25JZGxlKCk7Cit9
CisKK2Jvb2wgQmFja2luZ1N0b3JlOjppc0RpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkgY29uc3QK
K3sKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoZCk7CisgICAgcmV0dXJuIGQt
PnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3Jl
OjpkZWZlcnNCbGl0KCkgY29uc3QKK3sKKyAgICAgICAgcmV0dXJuIGQtPm1fZGVmZXJzQmxpdDsK
K30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNldERlZmVyc0JsaXQoYm9vbCBiKQoreworICAgICAg
ICBkLT5tX2RlZmVyc0JsaXQgPSBiOworfQorCitib29sIEJhY2tpbmdTdG9yZTo6aGFzQmxpdEpv
YnMoKSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkIGJlIGNhbGxlZCBmcm9t
IHRoZSBjb21wb3NpdGluZyB0aHJlYWQsCisgICAgLy8gYW5kIHRoZSBmbGFnIGlzIHNldCBvbiB0
aGUgY29tcG9zaXRpbmcgdGhyZWFkLCBzbyBubyBuZWVkIGZvcgorICAgIC8vIHN5bmNocm9uaXph
dGlvbi4KKyAgICByZXR1cm4gZC0+bV9oYXNCbGl0Sm9iczsKK30KKwordm9pZCBCYWNraW5nU3Rv
cmU6OmJsaXRPbklkbGUoKQoreworICAgIGQtPmJsaXRWaXNpYmxlQ29udGVudHModHJ1ZSAvKmZv
cmNlKi8pOworfQorCit9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkv
QXBpL0JhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5n
U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEzZGIwCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUu
aApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgQmFja2luZ1N0
b3JlX2gKKworI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworI2luY2x1ZGUgPEJsYWNr
QmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtUHJp
bWl0aXZlcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDaHJvbWVDbGllbnRCbGFj
a0JlcnJ5OworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEZyYW1lTG9hZGVyQ2xpZW50QmxhY2tC
ZXJyeTsKK2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7Cit9CisKK25hbWVzcGFj
ZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQYWdlOworY2xh
c3MgV2ViUGFnZVByaXZhdGU7CitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlOworY2xhc3MgQmFj
a2luZ1N0b3JlQ2xpZW50OworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBCYWNraW5nU3RvcmUg
eworcHVibGljOgorICAgIGVudW0gUmVzdW1lVXBkYXRlT3BlcmF0aW9uIHsgTm9uZSwgQmxpdCwg
UmVuZGVyQW5kQmxpdCB9OworICAgIEJhY2tpbmdTdG9yZShXZWJQYWdlKiwgQmFja2luZ1N0b3Jl
Q2xpZW50Kik7CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlKCk7CisKKyAgICB2b2lkIGNyZWF0
ZVN1cmZhY2UoKTsKKworICAgIHZvaWQgc3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0
ZXMoKTsKKyAgICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoUmVzdW1l
VXBkYXRlT3BlcmF0aW9uKTsKKworICAgIGJvb2wgaXNTY3JvbGxpbmdPclpvb21pbmcoKSBjb25z
dDsKKyAgICB2b2lkIHNldFNjcm9sbGluZ09yWm9vbWluZyhib29sKTsKKworICAgIHZvaWQgYmxp
dENvbnRlbnRzKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0JiBkc3RSZWN0LCBj
b25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMpOworICAgIHZvaWQg
cmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBjb250ZW50
Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgYm9vbCBoYXNSZW5kZXJKb2JzKCkgY29u
c3Q7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKworICAgIC8vIEluIHRoZSBkZWZlcnMgYmxp
dCBtb2RlLCBhbnkgYmxpdCByZXF1ZXN0cyB3aWxsIGp1c3QgcmV0dXJuIGVhcmx5LCBhbmQKKyAg
ICAvLyBhIGJsaXQgam9iIHdpbGwgYmUgcXVldWVkIHRoYXQgaXMgZXhlY3V0ZWQgYnkgY2FsbGlu
ZyBibGl0T25JZGxlKCkuCisgICAgYm9vbCBkZWZlcnNCbGl0KCkgY29uc3Q7CisgICAgdm9pZCBz
ZXREZWZlcnNCbGl0KGJvb2wpOworCisgICAgYm9vbCBoYXNCbGl0Sm9icygpIGNvbnN0OworICAg
IHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgYm9vbCBpc0RpcmVjdFJlbmRlcmluZ1RvV2luZG93
KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6OldlYktp
dDo6QmFja2luZ1N0b3JlQ2xpZW50OworICAgIGZyaWVuZCBjbGFzcyBCbGFja0JlcnJ5OjpXZWJL
aXQ6OldlYlBhZ2U7CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFn
ZVByaXZhdGU7IC8vIEZJWE1FOiBGb3Igbm93LCB3ZSBleHBvc2Ugb3VyIGludGVybmFscyB0byBX
ZWJQYWdlUHJpdmF0ZS4gU2VlIFBSICMxMjAzMDEuCisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6
OkNocm9tZUNsaWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6OkZyYW1l
TG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6R0xFUzJD
b250ZXh0OworICAgIEJhY2tpbmdTdG9yZVByaXZhdGUgKmQ7Cit9OworfQorfQorCisjZW5kaWYg
Ly8gQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9B
cGkvQmFja2luZ1N0b3JlX3AuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2lu
Z1N0b3JlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTlhN2UwCi0t
LSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3Rv
cmVfcC5oCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEw
LCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX3BfaAorI2RlZmluZSBC
YWNraW5nU3RvcmVfcF9oCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmUuaCIKKyNpbmNsdWRlICJS
ZW5kZXJRdWV1ZS5oIgorI2luY2x1ZGUgIlRpbGVJbmRleC5oIgorI2luY2x1ZGUgIlRpbGVJbmRl
eEhhc2guaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HdWFyZGVkUG9pbnRl
ci5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgor
CisjaWYgVVNFKE9QRU5WRykKKyNpbmNsdWRlIDxlZ2wuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8
cHRocmVhZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBJbnRSZWN0OworY2xhc3Mg
VHJhbnNmb3JtYXRpb25NYXRyaXg7Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVz
cGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNraW5nU3RvcmVUaWxlOworY2xhc3MgVGlsZUJ1ZmZl
cjsKK2NsYXNzIFdlYlBhZ2U7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CisKK3R5cGVkZWYg
V1RGOjpIYXNoTWFwPFRpbGVJbmRleCwgQmFja2luZ1N0b3JlVGlsZSo+IFRpbGVNYXA7CitjbGFz
cyBCYWNraW5nU3RvcmVHZW9tZXRyeSB7CitwdWJsaWM6CisgICAgQmFja2luZ1N0b3JlR2VvbWV0
cnkoKQorICAgICAgICA6IG1fbnVtYmVyT2ZUaWxlc1dpZGUoMCkKKyAgICAgICAgLCBtX251bWJl
ck9mVGlsZXNIaWdoKDApCisgICAgeworICAgIH0KKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJh
Y2tpbmdTdG9yZVJlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50U2l6ZSBiYWNraW5nU3Rv
cmVTaXplKCkgY29uc3Q7CisKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdCB7IHJl
dHVybiBtX251bWJlck9mVGlsZXNXaWRlOyB9CisgICAgdm9pZCBzZXROdW1iZXJPZlRpbGVzV2lk
ZShpbnQgbnVtYmVyT2ZUaWxlc1dpZGUpIHsgbV9udW1iZXJPZlRpbGVzV2lkZSA9IG51bWJlck9m
VGlsZXNXaWRlOyB9CisgICAgaW50IG51bWJlck9mVGlsZXNIaWdoKCkgY29uc3QgeyByZXR1cm4g
bV9udW1iZXJPZlRpbGVzSGlnaDsgfQorICAgIHZvaWQgc2V0TnVtYmVyT2ZUaWxlc0hpZ2goaW50
IG51bWJlck9mVGlsZXNIaWdoKSB7IG1fbnVtYmVyT2ZUaWxlc0hpZ2ggPSBudW1iZXJPZlRpbGVz
SGlnaDsgfQorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBiYWNraW5nU3RvcmVPZmZzZXQoKSBjb25z
dCB7IHJldHVybiBtX2JhY2tpbmdTdG9yZU9mZnNldDsgfQorICAgIHZvaWQgc2V0QmFja2luZ1N0
b3JlT2Zmc2V0KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb2Zmc2V0KSB7IG1fYmFja2luZ1N0
b3JlT2Zmc2V0ID0gb2Zmc2V0OyB9CisgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZUF0KFRpbGVJ
bmRleCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwLmdldChpbmRleCk7IH0KKyAgICBj
b25zdCBUaWxlTWFwJiB0aWxlTWFwKCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwOyB9CisgICAg
dm9pZCBzZXRUaWxlTWFwKGNvbnN0IFRpbGVNYXAmIHRpbGVNYXApIHsgbV90aWxlTWFwID0gdGls
ZU1hcDsgfQorCisgIHByaXZhdGU6CisgICAgaW50IG1fbnVtYmVyT2ZUaWxlc1dpZGU7CisgICAg
aW50IG1fbnVtYmVyT2ZUaWxlc0hpZ2g7CisgICAgUGxhdGZvcm06OkludFBvaW50IG1fYmFja2lu
Z1N0b3JlT2Zmc2V0OworICAgIFRpbGVNYXAgbV90aWxlTWFwOworfTsKKworY2xhc3MgQmFja2lu
Z1N0b3JlV2luZG93QnVmZmVyU3RhdGUgeworcHVibGljOgorICAgIFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIGJsaXR0ZWRSZWdpb24oKSBjb25zdCB7IHJldHVybiBtX2JsaXR0ZWRSZWdpb247IH0K
KyAgICB2b2lkIGFkZEJsaXR0ZWRSZWdpb24oY29uc3QgUGxhdGZvcm06OkludFJlY3RSZWdpb24m
IHJlZ2lvbikKKyAgICB7CisgICAgICAgIG1fYmxpdHRlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRS
ZWN0UmVnaW9uOjp1bmlvblJlZ2lvbnMobV9ibGl0dGVkUmVnaW9uLCByZWdpb24pOworICAgIH0K
KyAgICB2b2lkIGNsZWFyQmxpdHRlZFJlZ2lvbihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lv
biYgcmVnaW9uKQorICAgIHsKKyAgICAgICAgbV9ibGl0dGVkUmVnaW9uID0gUGxhdGZvcm06Oklu
dFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX2JsaXR0ZWRSZWdpb24sIHJlZ2lvbik7Cisg
ICAgfQorICAgIHZvaWQgY2xlYXJCbGl0dGVkUmVnaW9uKCkgeyBtX2JsaXR0ZWRSZWdpb24gPSBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOyB9CisKKyAgICBib29sIGlzUmVuZGVyZWQoY29uc3Qg
UGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgY29uc3QgUGxhdGZvcm06OkludFJl
Y3RSZWdpb24mIGNvbnRlbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFBsYXRmb3Jt
OjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMoY29udGVudHMsIG1fYmxpdHRlZFJlZ2lv
bikuaXNFbXB0eSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIG1fYmxpdHRlZFJlZ2lvbjsKK307CisKK2NsYXNzIEJhY2tpbmdTdG9yZVByaXZhdGUg
OiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okd1YXJkZWRQb2ludGVyQmFzZSB7CitwdWJs
aWM6CisgICAgZW51bSBUaWxlTWF0cml4RGlyZWN0aW9uIHsgSG9yaXpvbnRhbCwgVmVydGljYWwg
fTsKKyAgICBCYWNraW5nU3RvcmVQcml2YXRlKCk7CisgICAgfkJhY2tpbmdTdG9yZVByaXZhdGUo
KTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkaXJlY3QgcmVuZGVyaW5nIGlzIGV4cGxpY2l0
bHkgdHVybmVkIG9uIG9yIGlzCisgICAgLy8gcmVxdWlyZWQgYmVjYXVzZSB0aGUgc3VyZmFjZSBw
b29sIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gbWVldAorICAgIC8vIHRoZSBtaW5pbXVtIG51bWJl
ciBvZiB0aWxlcyByZXF1aXJlZCB0byBzY3JvbGwuCisgICAgYm9vbCBzaG91bGREaXJlY3RSZW5k
ZXJpbmdUb1dpbmRvdygpIGNvbnN0OworCisgICAgLy8gU3VzcGVuZHMgYWxsIHNjcmVlbiB1cGRh
dGVzIHNvIHRoYXQgJ2JsaXRDb250ZW50cycgaXMgZGlzYWJsZWQuCisgICAgdm9pZCBzdXNwZW5k
U2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gUmVzdW1lcyBhbGwgc2Ny
ZWVuIHVwZGF0ZXMgc28gdGhhdCAnYmxpdENvbnRlbnRzJyBpcyBlbmFibGVkLgorICAgIHZvaWQg
cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlc3VtZVVw
ZGF0ZU9wZXJhdGlvbik7CisKKyAgICAvLyBUaGUgZnVuY3Rpb25zIHJlcGFpbnQoKSwgc2xvd1Nj
cm9sbCgpLCBzY3JvbGwoKSwgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcigpIGFyZQorICAgIC8vIGNh
bGxlZCBmcm9tIG91dHNpZGUgV2ViS2l0IGFuZCB3aXRoaW4gV2ViS2l0IHZpYSBDaHJvbWVDbGll
bnRCbGFja0JlcnJ5LgorICAgIHZvaWQgcmVwYWludChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
d2luZG93UmVjdCwgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAg
dm9pZCBzbG93U2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKTsKKworICAgIHZvaWQg
c2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIHNjcm9sbFZpZXdSZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY2xpcFJlY3Qp
OworICAgIHZvaWQgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcihjb25zdCBQbGF0Zm9ybTo6SW50U2l6
ZSYgZGVsdGEpOworCisgICAgYm9vbCBzaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1bGFyUmVu
ZGVySm9icygpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSBjb25z
dDsKKyAgICBib29sIHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0OworICAg
IHZvaWQgc3RhcnRSZW5kZXJUaW1lcigpOworICAgIHZvaWQgc3RvcFJlbmRlclRpbWVyKCk7Cisg
ICAgdm9pZCByZW5kZXJPblRpbWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdTdG9yZVByaXZhdGU+
Kik7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKyAgICBib29sIHdpbGxGaXJlVGltZXIoKTsK
KworICAgIC8vIFNldCBvZiBoZWxwZXIgbWV0aG9kcyBmb3IgdGhlIHNjcm9sbEJhY2tpbmdTdG9y
ZSgpIG1ldGhvZC4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QoKSBjb25zdDsK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBleHBhbmRlZENvbnRlbnRzUmVjdCgpIGNvbnN0OworICAg
IFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB1bmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7CisgICAg
Ym9vbCBzaG91bGRNb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAg
IGJvb2wgc2hvdWxkTW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7Cisg
ICAgYm9vbCBzaG91bGRNb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAg
ICBib29sIHNob3VsZE1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7Cisg
ICAgYm9vbCBjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJv
b2wgY2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNh
bk1vdmVMZWZ0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBjYW5N
b3ZlUmlnaHQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNhbk1v
dmVVcChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2FuTW92ZURv
d24oY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICB2b2lkIHNldEJhY2tpbmdTdG9yZVJl
Y3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKworICAgIHR5cGVkZWYgV1RGOjpWZWN0b3I8
VGlsZUluZGV4PiBUaWxlSW5kZXhMaXN0OworICAgIFRpbGVJbmRleExpc3QgaW5kZXhlc0ZvckJh
Y2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKworICAgIFBs
YXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRl
eCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3Q7CisKKyAgICBUaWxlSW5kZXggaW5kZXhPZkxhc3RSZW5kZXJGb3JUaWxl
KGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqKSBjb25zdDsKKyAgICBUaWxlSW5k
ZXggaW5kZXhPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sIGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdDsKKyAgICB2b2lkIGNsZWFy
QW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3QgVGlsZUluZGV4JiwgQmFja2lu
Z1N0b3JlVGlsZSosIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiwgY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QsIGJvb2wgdXBkYXRlID0gdHJ1ZSk7CisgICAg
Ym9vbCBpc0N1cnJlbnRWaXNpYmxlSm9iKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRp
bGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3Q7CisK
KyAgICAvLyBSZXNwb25zaWJsZSBmb3Igc2Nyb2xsaW5nIHRoZSBiYWNraW5nIHN0b3JlIGFuZCB1
cGRhdGluZyB0aGUKKyAgICAvLyB0aWxlIG1hdHJpeCBnZW9tZXRyeS4KKyAgICB2b2lkIHNjcm9s
bEJhY2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKTsKKworICAgIC8vIFJlbmRlciB0
aGUgdGlsZXMgZGlydHkgcmVjdHMgYW5kIGJsaXQgdG8gdGhlIHNjcmVlbi4KKyAgICBib29sIHJl
bmRlckRpcmVjdFRvV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCByZW5kZXJD
b250ZW50T25seSk7CisgICAgYm9vbCByZW5kZXIoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBi
b29sIHJlbmRlckNvbnRlbnRPbmx5KTsKKyAgICBib29sIHJlbmRlcihjb25zdCBJbnRSZWN0TGlz
dCYsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpOworCisgICAgLy8gQ2FsbGVkIGJ5IHRoZSByZW5k
ZXIgcXVldWUgdG8gZW5zdXJlIHRoYXQgdGhlIHF1ZXVlIGlzIGluIGEKKyAgICAvLyBjb25zdGFu
dCBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHJlbmRlciBqb2IuCisgICAgdm9pZCByZXF1ZXN0
TGF5b3V0SWZOZWVkZWQoKSBjb25zdDsKKworICAgIC8vIEhlbHBlciByZW5kZXIgbWV0aG9kcy4K
KyAgICB2b2lkIHJlbmRlclZpc2libGVDb250ZW50cyhib29sIHJlbmRlckNvbnRlbnRPbmx5ID0g
ZmFsc2UpOworICAgIHZvaWQgcmVuZGVyQmFja2luZ1N0b3JlKGJvb2wgcmVuZGVyQ29udGVudE9u
bHkgPSBmYWxzZSk7CisgICAgdm9pZCBibGl0VmlzaWJsZUNvbnRlbnRzKGJvb2wgZm9yY2UgPSBm
YWxzZSk7CisKKyAgICAvLyBBc3N1bWVzIHRoZSByZWN0IHRvIGJlIGluIHdpbmRvdy92aWV3cG9y
dCBjb29yZGluYXRlcy4KKyAgICB2b2lkIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNrU3VyZmFj
ZU9mV2luZG93KCk7CisgICAgdm9pZCBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VP
ZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVUaWxlKik7CisgICAg
dm9pZCBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250
ZW50cywgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBib29sIGZsdXNoKTsK
KyAgICB2b2lkIGJsaXRDb250ZW50cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLCBib29sIGZvcmNlID0gZmFsc2UpOwor
ICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8VGlsZUluZGV4
LCBQbGF0Zm9ybTo6SW50UmVjdD4gVGlsZVJlY3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmxp
dFRpbGVSZWN0KFRpbGVCdWZmZXIqLCBjb25zdCBUaWxlUmVjdCYsIGNvbnN0IFBsYXRmb3JtOjpJ
bnRQb2ludCYsIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiwgQmFja2luZ1N0
b3JlR2VvbWV0cnkqKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2
b2lkIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RS
ZWN0KTsKKyAgICB2b2lkIGNsZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCk7CisgICAgYm9vbCBkcmF3
U3ViTGF5ZXJzKCk7CisjZW5kaWYKKworICAgIHZvaWQgYmxpdEhvcml6b250YWxTY3JvbGxiYXIo
Y29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBibGl0VmVydGljYWxTY3JvbGxi
YXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIg
dGhlIHRpbGUgaW5kZXggaXMgY3VycmVudGx5IHZpc2libGUgb3Igbm90LgorICAgIGJvb2wgaXNU
aWxlVmlzaWJsZShjb25zdCBUaWxlSW5kZXgmKSBjb25zdDsKKyAgICBib29sIGlzVGlsZVZpc2li
bGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGEg
cmVjdCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBhbGwgdGlsZXMgdGhhdCBhcmUgdmlzaWJsZS4KKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlVGlsZXNSZWN0KCkgY29uc3Q7CisKKyAgICAvLyBV
c2VkIHRvIGNsaXAgdG8gdGhlIHZpc2libGUgY29udGVudCBmb3IgaW5zdGFuY2UuCisgICAgUGxh
dGZvcm06OkludFJlY3QgdGlsZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4Jikg
Y29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIHVuY2xpcHBlZCB2aXNpYmxlIGNv
bnRlbnQgZm9yIGluc3RhbmNlIHdoaWNoIGluY2x1ZGVzIG92ZXJzY3JvbGwuCisgICAgUGxhdGZv
cm06OkludFJlY3QgdGlsZVVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUlu
ZGV4JikgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIGNvbnRlbnRzIGZvciBp
bnN0YW5jZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlQ29udGVudHNSZWN0KGNvbnN0IFRp
bGVJbmRleCYsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgUGxhdGZvcm06
OkludFJlY3QgdGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYsIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3Q7CisKKyAgICAv
LyBUaGlzIGlzIGNhbGxlZCBieSBXZWJQYWdlIG9uY2UgbG9hZCBpcyBjb21taXR0ZWQgdG8gcmVz
ZXQgdGhlIHJlbmRlciBxdWV1ZS4KKyAgICB2b2lkIHJlc2V0UmVuZGVyUXVldWUoKTsKKyAgICAv
LyBUaGlzIGlzIGNhbGxlZCBieSBGcmFtZUxvYWRlckNsaWVudCB0aGF0IGV4cGxpY2l0bHkgcGFp
bnRzIG9uIGZpcnN0IHZpc2libGUgbGF5b3V0LgorICAgIHZvaWQgY2xlYXJWaXNpYmxlWm9vbSgp
OworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgV2ViUGFnZSBvbmNlIGxvYWQgaXMgY29tbWl0
dGVkIHRvIHJlc2V0IGFsbCB0aGUgdGlsZXMuCisgICAgdm9pZCByZXNldFRpbGVzKGJvb2wgcmVz
ZXRCYWNrZ3JvdW5kKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFdlYlBhZ2UgYWZ0ZXIg
bG9hZCBpcyBjb21wbGV0ZSB0byB1cGRhdGUgYWxsIHRoZSB0aWxlcy4KKyAgICB2b2lkIHVwZGF0
ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgLy8gVGhp
cyBpcyBjYWxsZWQgZHVyaW5nIHNjcm9sbCBhbmQgYnkgdGhlIHJlbmRlciBxdWV1ZS4KKyAgICB2
b2lkIHVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbihib29sIGNoZWNrTG9h
ZGluZyA9IHRydWUpOworCisgICAgLy8gUmVzZXQgYW4gaW5kaXZpZHVhbCB0aWxlLgorICAgIHZv
aWQgcmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBib29sIHJl
c2V0QmFja2dyb3VuZCk7CisKKyAgICAvLyBVcGRhdGUgYW4gaW5kaXZpZHVhbCB0aWxlLgorICAg
IHZvaWQgdXBkYXRlVGlsZShjb25zdCBUaWxlSW5kZXgmLCBib29sIGltbWVkaWF0ZSk7CisgICAg
dm9pZCB1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYsIGJvb2wgaW1tZWRpYXRl
KTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250
ZW50cyhjb25zdCBUaWxlUmVjdCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IG1hcEZy
b21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYsIGNvbnN0IFBsYXRm
b3JtOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPFRpbGVSZWN0
PiBUaWxlUmVjdExpc3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRl
bnRzVG9BYnNvbHV0ZVRpbGVCb3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIFRpbGVSZWN0TGlzdCBtYXBGcm9t
VHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNr
aW5nU3RvcmVHZW9tZXRyeSopIGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVUaWxlTWF0cml4SWZO
ZWVkZWQoKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNm
b3JtZWRDb250ZW50c1NpemVDaGFuZ2VkLgorICAgIHZvaWQgY29udGVudHNTaXplQ2hhbmdlZChj
b25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYlBhZ2VQcml2
YXRlOjpub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQuCisgICAgdm9pZCBzY3JvbGxDaGFu
Z2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYnBh
Z2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1DaGFuZ2VkLgorICAgIHZvaWQgdHJhbnNmb3JtQ2hh
bmdlZCgpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjphY3R1YWxWaXNpYmxl
U2l6ZUNoYW5nZWQuCisgICAgdm9pZCBhY3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQoY29uc3QgUGxh
dGZvcm06OkludFNpemUmKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6c2V0
U2NyZWVuUm90YXRlZC4KKyAgICB2b2lkIG9yaWVudGF0aW9uQ2hhbmdlZCgpOworCisgICAgLy8g
U2V0cyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgbWF0cml4LgorICAgIHZvaWQgc2V0R2VvbWV0
cnlPZlRpbGVNYXRyaXgoaW50IG51bWJlck9mVGlsZXNXaWRlLCBpbnQgbnVtYmVyT2ZUaWxlc0hp
Z2gpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdXJmYWNlcyBvZiB0aGUgYmFja2luZyBzdG9yZS4K
KyAgICB2b2lkIGNyZWF0ZVN1cmZhY2VzKCk7CisgICAgdm9pZCBjcmVhdGVWaXNpYmxlVGlsZUJ1
ZmZlcigpOworCisgICAgLy8gVmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgcXVhbnRpdGllcyByZWxl
dmFudCB0byBiYWNraW5nIHN0b3JlLgorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZlRp
bGUoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdp
bk9mVGlsZShjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0
OworICAgIGludCBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdDsKKyAgICBpbnQgbWlu
aW11bU51bWJlck9mVGlsZXNIaWdoKCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFNpemUgZXhw
YW5kZWRDb250ZW50c1NpemUoKSBjb25zdDsKKworICAgIC8vIFRoZSB0aWxlIGdlb21ldHJ5IG1l
dGhvZHMgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb24uCisgICAgc3RhdGljIGludCB0aWxlV2lkdGgo
KTsKKyAgICBzdGF0aWMgaW50IHRpbGVIZWlnaHQoKTsKKyAgICBzdGF0aWMgUGxhdGZvcm06Oklu
dFNpemUgdGlsZVNpemUoKTsKKyAgICBzdGF0aWMgUGxhdGZvcm06OkludFJlY3QgdGlsZVJlY3Qo
KTsKKworICAgIC8vIFRoaXMgdGFrZXMgdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRpbmF0ZXMu
CisgICAgdm9pZCByZW5kZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OkJ1ZmZlciosIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3VyZmFjZU9mZnNldCwgY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGJsaXRU
b1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHNyY0J1ZmZlciwgY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIHNyY1JlY3QsIGJvb2wgYmxlbmQsIHVuc2lnbmVkIGNoYXIgZ2xvYmFsQWxwaGEp
OworICAgIHZvaWQgY2hlY2tlcldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVj
dCwgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBjb250ZW50c09yaWdpbiwgZG91YmxlIGNvbnRl
bnRzU2NhbGUpOworCisgICAgdm9pZCBpbnZhbGlkYXRlV2luZG93KCk7CisgICAgdm9pZCBpbnZh
bGlkYXRlV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpOworICAgIHZvaWQgY2xl
YXJXaW5kb3coKTsKKyAgICB2b2lkIGNsZWFyV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiwgdW5zaWduZWQgY2hhciByZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVuc2lnbmVkIGNoYXIg
Ymx1ZSwgdW5zaWduZWQgY2hhciBhbHBoYSA9IDI1NSk7CisKKyAgICBib29sIGlzU2Nyb2xsaW5n
T3Jab29taW5nKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTY3JvbGxpbmdPclpvb21pbmcoYm9vbCBz
Y3JvbGxpbmdPclpvb21pbmcsIGJvb2wgc2hvdWxkQmxpdCA9IHRydWUpOworCisgICAgdm9pZCBs
b2NrQmFja2luZ1N0b3JlKCk7CisgICAgdm9pZCB1bmxvY2tCYWNraW5nU3RvcmUoKTsKKworICAg
IEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBmcm9udFN0YXRlKCkgY29uc3Q7CisgICAgQmFja2luZ1N0
b3JlR2VvbWV0cnkqIGJhY2tTdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3dhcFN0YXRlKCk7CisK
KyAgICBCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSogd2luZG93RnJvbnRCdWZmZXJTdGF0
ZSgpIGNvbnN0OworICAgIEJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlKiB3aW5kb3dCYWNr
QnVmZmVyU3RhdGUoKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIHNldEN1cnJlbnRCYWNraW5n
U3RvcmVPd25lcihXZWJQYWdlKiB3ZWJQYWdlKSB7IEJhY2tpbmdTdG9yZVByaXZhdGU6OnNfY3Vy
cmVudEJhY2tpbmdTdG9yZU93bmVyID0gd2ViUGFnZTsgfQorICAgIHN0YXRpYyBXZWJQYWdlKiBj
dXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSB7IHJldHVybiBCYWNraW5nU3RvcmVQcml2YXRlOjpz
X2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsgfQorICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsK
KworICAgIHN0YXRpYyBXZWJQYWdlKiBzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsKKworICAg
IGJvb2wgbV9zdXNwZW5kU2NyZWVuVXBkYXRlczsKKyAgICBib29sIG1fc3VzcGVuZEJhY2tpbmdT
dG9yZVVwZGF0ZXM7CisKKyAgICBib29sIG1fc3VzcGVuZFJlbmRlckpvYnM7CisgICAgYm9vbCBt
X3N1c3BlbmRSZWd1bGFyUmVuZGVySm9iczsKKyAgICBib29sIG1faXNTY3JvbGxpbmdPclpvb21p
bmc7CisgICAgV2ViUGFnZSogbV93ZWJQYWdlOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogbV9j
bGllbnQ7CisgICAgUmVuZGVyUXVldWUqIG1fcmVuZGVyUXVldWU7CisgICAgbXV0YWJsZSBQbGF0
Zm9ybTo6SW50U2l6ZSBtX3ByZXZpb3VzRGVsdGE7CisKKyAgICBib29sIG1fZGVmZXJzQmxpdDsK
KyAgICBib29sIG1faGFzQmxpdEpvYnM7CisKKyNpZiBVU0UoT1BFTlZHKQorICAgIEVHTERpc3Bs
YXkgbV9lZ2xEaXNwbGF5OworI2VuZGlmCisgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2Zyb250U3Rh
dGU7CisgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2JhY2tTdGF0ZTsKKworICAgIHVuc2lnbmVkIG1f
Y3VycmVudFdpbmRvd0JhY2tCdWZmZXI7CisgICAgbXV0YWJsZSBCYWNraW5nU3RvcmVXaW5kb3dC
dWZmZXJTdGF0ZSBtX3dpbmRvd0J1ZmZlclN0YXRlWzJdOworCisgICAgVGlsZU1hdHJpeERpcmVj
dGlvbiBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb247CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdDsKKworICAgIC8vIExhc3QgcmVzb3J0IHRpbWVy
IGZvciByZW5kZXJpbmcKKyAgICBXZWJDb3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPiog
bV9yZW5kZXJUaW1lcjsKKworICAgIHB0aHJlYWRfbXV0ZXhfdCBtX211dGV4OworCisgICAgaW50
IG1fYmxpdEdlbmVyYXRpb247CisgICAgcHRocmVhZF9tdXRleF90IG1fYmxpdEdlbmVyYXRpb25M
b2NrOworICAgIHB0aHJlYWRfY29uZF90IG1fYmxpdEdlbmVyYXRpb25Db25kOworICAgIHN0cnVj
dCB0aW1lc3BlYyBtX2N1cnJlbnRCbGl0RW5kOworfTsKK30KK30KKworI2VuZGlmIC8vIEJhY2tp
bmdTdG9yZV9wX2gKLS0gCjEuNy43Cgo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>117912</attachid>
            <date>2011-12-05 12:20:48 -0800</date>
            <delta_ts>2011-12-06 07:16:36 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>73668-2.patch</filename>
            <type>text/plain</type>
            <size>128172</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSBiODNkN2VmNWIzNzhjYzY0NzE3N2ZiZTViZDRjM2FmMTBjZDcxZDg4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
RnJpLCAyIERlYyAyMDExIDEyOjI3OjM5IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCiogYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlLmg6IEFkZGVkLgoqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICB8ICAgMTYgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3Bw
IHwgMjYyNiArKysrKysrKysrKysrKysrKysrKysrKysrCiBTb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL0JhY2tpbmdTdG9yZS5oICAgfCAgIDg1ICsKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaCB8ICAzNTcgKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDg0
IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCiBjcmVhdGUgbW9kZSAxMDA2
NDQgU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaAoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggMjExNzM1ZS4uMDM0NThmMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMS0xMi0wMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQVBJIGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVh
bSwgdGhlIG1haW4gY29udHJpYnV0b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJp
bS5jb20+LgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAg
ICAgICAqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oOiBBZGRlZC4KKwogMjAxMS0xMi0wMSAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFVwc3RyZWFtIHRleHQgY29kZWMgYW5k
IHdlYiBzdHJpbmcgZmlsZXMgb2YgQmxhY2tCZXJyeSBBUEkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi44NWIyNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjYyNiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlLmgiCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVD
bGllbnQuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UuaCIKKyNp
bmNsdWRlICJCYWNraW5nU3RvcmVUaWxlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3AuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVk
ZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0Nv
bnRleHQuaCIKKyNpbmNsdWRlICJJbnNwZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUGFn
ZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3VyZmFjZVBvb2wu
aCIKKyNpbmNsdWRlICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2lu
Y2x1ZGUgIldlYlBhZ2VfcC5oIgorI2luY2x1ZGUgIldlYlNldHRpbmdzLmgiCisKKyNpbmNsdWRl
IDxCbGFja0JlcnJ5UGxhdGZvcm1FeGVjdXRhYmxlTWVzc2FnZS5oPgorI2luY2x1ZGUgPEJsYWNr
QmVycnlQbGF0Zm9ybUludFJlY3RSZWdpb24uaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZv
cm1NZXNzYWdlLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTWVzc2FnZUNsaWVudC5o
PgorCisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CisjaW5jbHVkZSA8d3RmL01hdGhFeHRy
YXMuaD4KKyNpbmNsdWRlIDx3dGYvTm90Rm91bmQuaD4KKworI2RlZmluZSBTVVBQUkVTU19OT05f
VklTSUJMRV9SRUdVTEFSX1JFTkRFUl9KT0JTIDAKKyNkZWZpbmUgRU5BQkxFX1NDUk9MTEJBUlMg
MQorI2RlZmluZSBFTkFCTEVfUkVQQUlOVE9OU0NST0xMIDEKKyNkZWZpbmUgREVCVUdfQkFDS0lO
R1NUT1JFIDAKKyNkZWZpbmUgREVCVUdfVklTVUFMSVpFIDAKKyNkZWZpbmUgREVCVUdfVElMRU1B
VFJJWCAwCisjZGVmaW5lIERFQlVHX0NPTVBPU0lUSU5HX0RJUlRZX1JFR0lPTiAwCisKKyNpZiBV
U0UoT1BFTlZHKQorI2luY2x1ZGUgIkVHTERpc3BsYXlPcGVuVkcuaCIKKyNpbmNsdWRlICJFR0xV
dGlscy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1TY3JlZW4uaD4K
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit1c2lu
ZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdDsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpJbnRQb2ludDsKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRTaXplOworCitu
YW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworY29uc3QgaW50IHNf
cmVuZGVyVGltZXJUaW1lb3V0ID0gMS4wOworV2ViUGFnZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6
c19jdXJyZW50QmFja2luZ1N0b3JlT3duZXIgPSAwOworCisvLyBDb21wdXRlIGRpdmlzb3IgcGFp
cnMuCit0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGludD4gRGl2aXNvcjsKK3R5cGVkZWYgVmVjdG9y
PERpdmlzb3I+IERpdmlzb3JMaXN0OworLy8gVE9ETzogY2FjaGUgdGhpcyBhbmQvb3IgdXNlIGEg
c21hcnRlciBhbGdvcml0aG0uCitzdGF0aWMgRGl2aXNvckxpc3QgZGl2aXNvcnModW5zaWduZWQg
bikKK3sKKyAgICBEaXZpc29yTGlzdCBkaXZpc29yczsKKyAgICBmb3IgKHVuc2lnbmVkIGludCBp
ID0gMTsgaSA8PSBuOyArK2kpCisgICAgICAgIGlmICghKG4gJSBpKSkKKyAgICAgICAgICAgIGRp
dmlzb3JzLmFwcGVuZChzdGQ6Om1ha2VfcGFpcihpLCBuIC8gaSkpOworICAgIHJldHVybiBkaXZp
c29yczsKK30KKworLy8gQ29tcHV0ZSBiZXN0IGRpdmlzb3IgZ2l2ZW4gdGhlIHJhdGlvIGRldGVy
bWluZWQgYnkgc2l6ZS4KK3N0YXRpYyBEaXZpc29yIGJlc3REaXZpc29yKFBsYXRmb3JtOjpJbnRT
aXplIHNpemUsIGludCB0aWxlV2lkdGgsIGludCB0aWxlSGVpZ2h0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgaW50IG1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSwgaW50IG1pbmltdW1OdW1i
ZXJPZlRpbGVzSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OlRpbGVNYXRyaXhEaXJlY3Rpb24gZGlyZWN0aW9uKQoreworICAgIC8vIFRoZSBwb2lu
dCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIHRpbGVzIGlu
IGVhY2gKKyAgICAvLyBkaW1lbnNpb24uIFdlIGRvIHRoaXMgYnkgbG9va2luZyB0byBtYXRjaCB0
aGUgdGlsZSBtYXRyaXggd2lkdGgvaGVpZ2h0CisgICAgLy8gcmF0aW8gYXMgY2xvc2VseSBhcyBw
b3NzaWJsZSB3aXRoIHRoZSB3aWR0aC9oZWlnaHQgcmF0aW8gb2YgdGhlIGNvbnRlbnRzLgorICAg
IC8vIFdlIGFsc28gbG9vayBhdCB0aGUgZGlyZWN0aW9uIHBhc3NlZCB0byBnaXZlIHByZWZlcmVu
Y2UgdG8gb25lIGRpbWVuc2lvbgorICAgIC8vIG92ZXIgYW5vdGhlci4gVGhpcyBtZXRob2QgY291
bGQgcHJvYmFibHkgYmUgbWFkZSBmYXN0ZXIsIGJ1dCBpdCBnZXRzIHRoZQorICAgIC8vIGpvYiBk
b25lLgorICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpOworICAgIEFTU0VSVCghc3VyZmFjZVBvb2wtPmlzRW1wdHkoKSk7CisKKyAg
ICAvLyBTdG9yZSBhIHN0YXRpYyBsaXN0IG9mIHBvc3NpYmxlIGRpdmlzb3JzLgorICAgIHN0YXRp
YyBEaXZpc29yTGlzdCBkaXZpc29yTGlzdCA9IGRpdmlzb3JzKHN1cmZhY2VQb29sLT5zaXplKCkp
OworCisgICAgLy8gVGhlIHJhdGlvIHdlJ3JlIGxvb2tpbmcgdG8gYmVzdCBpbWl0YXRlLgorICAg
IGZsb2F0IHJhdGlvID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemUud2lkdGgoKSkgLyBzdGF0aWNf
Y2FzdDxmbG9hdD4oc2l6ZS5oZWlnaHQoKSk7CisKKyAgICBEaXZpc29yIGJlc3REaXZpc29yOwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGl2aXNvckxpc3Quc2l6ZSgpOyArK2kpIHsKKyAg
ICAgICAgRGl2aXNvciBkaXZpc29yID0gZGl2aXNvckxpc3RbaV07CisKKyAgICAgICAgYm9vbCBk
aXZpc29yV2lkdGhJc1BlcmZlY3QgPSBzaXplLndpZHRoKCkgPD0gZGl2aXNvci5maXJzdCAqIHRp
bGVXaWR0aCAmJiBhYnMoc2l6ZS53aWR0aCgpIC0gZGl2aXNvci5maXJzdCAqIHRpbGVXaWR0aCkg
PCB0aWxlV2lkdGg7CisgICAgICAgIGJvb2wgZGl2aXNvckhlaWdodElzUGVyZmVjdCA9IHNpemUu
aGVpZ2h0KCkgPD0gZGl2aXNvci5zZWNvbmQgKiB0aWxlSGVpZ2h0ICYmIGFicyhzaXplLmhlaWdo
dCgpIC0gZGl2aXNvci5zZWNvbmQgKiB0aWxlSGVpZ2h0KSA8IHRpbGVIZWlnaHQ7CisgICAgICAg
IGJvb2wgZGl2aXNvcldpZHRoSXNWYWxpZCA9IGRpdmlzb3IuZmlyc3QgPj0gbWluaW11bU51bWJl
ck9mVGlsZXNXaWRlIHx8IGRpdmlzb3JXaWR0aElzUGVyZmVjdDsKKyAgICAgICAgYm9vbCBkaXZp
c29ySGVpZ2h0SXNWYWxpZCA9IGRpdmlzb3Iuc2Vjb25kID49IG1pbmltdW1OdW1iZXJPZlRpbGVz
SGlnaCB8fCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0OworICAgICAgICBpZiAoIWRpdmlzb3JXaWR0
aElzVmFsaWQgfHwgIWRpdmlzb3JIZWlnaHRJc1ZhbGlkKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgaWYgKGRpdmlzb3IuZmlyc3QgPiBkaXZpc29yLnNlY29uZCAmJiBkaXJlY3Rp
b24gPT0gQmFja2luZ1N0b3JlUHJpdmF0ZTo6VmVydGljYWwgJiYgIWRpdmlzb3JIZWlnaHRJc1Bl
cmZlY3QpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoZGl2aXNvci5zZWNv
bmQgPiBkaXZpc29yLmZpcnN0ICYmIGRpcmVjdGlvbiA9PSBCYWNraW5nU3RvcmVQcml2YXRlOjpI
b3Jpem9udGFsICYmICFkaXZpc29yV2lkdGhJc1BlcmZlY3QpCisgICAgICAgICAgICBjb250aW51
ZTsKKworICAgICAgICBpZiAoZGl2aXNvcldpZHRoSXNQZXJmZWN0IHx8IGRpdmlzb3JIZWlnaHRJ
c1BlcmZlY3QpIHsKKyAgICAgICAgICAgIGJlc3REaXZpc29yID0gZGl2aXNvcjsgLy8gRm91bmQg
YSBwZXJmZWN0IGZpdCEKKyNpZiBERUJVR19USUxFTUFUUklYCisgICAgICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2Fs
LCAiYmVzdERpdmlzb3IgZm91bmQgcGVyZmVjdCBzaXplIHdpZHRoUGVyZmVjdD0lcyBoZWlnaHRQ
ZXJmZWN0PSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2aXNvcldp
ZHRoSXNQZXJmZWN0ID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgZGl2aXNvckhlaWdodElzUGVyZmVjdCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwor
I2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3Jl
IGJhc2lzIG9mIGNvbXBhcmlzb24uCisgICAgICAgIGlmICghYmVzdERpdmlzb3IuZmlyc3QgJiYg
IWJlc3REaXZpc29yLnNlY29uZCkgeworICAgICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29y
OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21wYXJl
IHJhdGlvcy4KKyAgICAgICAgZmxvYXQgZGlmZjEgPSBmYWJzKChzdGF0aWNfY2FzdDxmbG9hdD4o
ZGl2aXNvci5maXJzdCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZGl2aXNvci5zZWNvbmQpKSAtIHJh
dGlvKTsKKyAgICAgICAgZmxvYXQgZGlmZjIgPSBmYWJzKChzdGF0aWNfY2FzdDxmbG9hdD4oYmVz
dERpdmlzb3IuZmlyc3QpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJlc3REaXZpc29yLnNlY29uZCkp
IC0gcmF0aW8pOworICAgICAgICBpZiAoZGlmZjEgPCBkaWZmMikKKyAgICAgICAgICAgIGJlc3RE
aXZpc29yID0gZGl2aXNvcjsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdERpdmlzb3I7Cit9CisK
K3N0cnVjdCBCYWNraW5nU3RvcmVNdXRleExvY2tlciB7CisgICAgQmFja2luZ1N0b3JlTXV0ZXhM
b2NrZXIoQmFja2luZ1N0b3JlUHJpdmF0ZSogYmFja2luZ1N0b3JlUHJpdmF0ZSkKKyAgICAgICAg
OiBtX2JhY2tpbmdTdG9yZVByaXZhdGUoYmFja2luZ1N0b3JlUHJpdmF0ZSkKKyAgICB7CisgICAg
ICAgIG1fYmFja2luZ1N0b3JlUHJpdmF0ZS0+bG9ja0JhY2tpbmdTdG9yZSgpOworICAgIH0KKwor
ICAgIH5CYWNraW5nU3RvcmVNdXRleExvY2tlcigpCisgICAgeworICAgICAgICBtX2JhY2tpbmdT
dG9yZVByaXZhdGUtPnVubG9ja0JhY2tpbmdTdG9yZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAg
ICBCYWNraW5nU3RvcmVQcml2YXRlKiBtX2JhY2tpbmdTdG9yZVByaXZhdGU7Cit9OworCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVHZW9tZXRyeTo6YmFja2luZ1N0b3JlUmVjdCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KGJhY2tpbmdTdG9yZU9mZnNldCgp
LCBiYWNraW5nU3RvcmVTaXplKCkpOworfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBCYWNraW5nU3Rv
cmVHZW9tZXRyeTo6YmFja2luZ1N0b3JlU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFBsYXRm
b3JtOjpJbnRTaXplKG51bWJlck9mVGlsZXNXaWRlKCkgKiBCYWNraW5nU3RvcmVQcml2YXRlOjp0
aWxlV2lkdGgoKSwgbnVtYmVyT2ZUaWxlc0hpZ2goKSAqIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRp
bGVIZWlnaHQoKSk7Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OkJhY2tpbmdTdG9yZVByaXZh
dGUoKQorICAgIDogbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyhmYWxzZSkKKyAgICAsIG1fc3VzcGVu
ZEJhY2tpbmdTdG9yZVVwZGF0ZXMoZmFsc2UpCisgICAgLCBtX3N1c3BlbmRSZW5kZXJKb2JzKGZh
bHNlKQorICAgICwgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMoZmFsc2UpCisgICAgLCBtX2lz
U2Nyb2xsaW5nT3Jab29taW5nKGZhbHNlKQorICAgICwgbV93ZWJQYWdlKDApCisgICAgLCBtX2Ns
aWVudCgwKQorICAgICwgbV9yZW5kZXJRdWV1ZShuZXcgUmVuZGVyUXVldWUodGhpcykpCisgICAg
LCBtX2RlZmVyc0JsaXQodHJ1ZSkKKyAgICAsIG1faGFzQmxpdEpvYnMoZmFsc2UpCisjaWYgVVNF
KE9QRU5WRykKKyAgICAsIG1fZWdsRGlzcGxheShFR0xfTk9fRElTUExBWSkKKyNlbmRpZgorICAg
ICwgbV9jdXJyZW50V2luZG93QmFja0J1ZmZlcigwKQorICAgICwgbV9wcmVmZXJyZWRUaWxlTWF0
cml4RGltZW5zaW9uKFZlcnRpY2FsKQorICAgICwgbV9ibGl0R2VuZXJhdGlvbigtMSkKK3sKKyAg
ICBtX2Zyb250U3RhdGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0
b3JlR2VvbWV0cnkpOworICAgIG1fYmFja1N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25l
ZD4obmV3IEJhY2tpbmdTdG9yZUdlb21ldHJ5KTsKKworICAgIG1fcmVuZGVyVGltZXIgPSBuZXcg
VGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4odGhpcywgJkJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
bmRlck9uVGltZXIpOworCisgICAgLy8gTmVlZCBhIHJlY3Vyc2l2ZSBtdXRleCB0byBhY2hpZXZl
IGEgZ2xvYmFsIGxvY2suCisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworICAgIHB0aHJl
YWRfbXV0ZXhhdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUo
JmF0dHIsIFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQo
Jm1fbXV0ZXgsICZhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsK
KworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9ibGl0R2VuZXJhdGlvbkxvY2ssIDApOworICAg
IHB0aHJlYWRfY29uZF9pbml0KCZtX2JsaXRHZW5lcmF0aW9uQ29uZCwgMCk7Cit9CisKK0JhY2tp
bmdTdG9yZVByaXZhdGU6On5CYWNraW5nU3RvcmVQcml2YXRlKCkKK3sKKyAgICBkZWxldGUgbV9y
ZW5kZXJRdWV1ZTsKKyAgICBtX3JlbmRlclF1ZXVlID0gMDsKKyAgICBkZWxldGUgbV9yZW5kZXJU
aW1lcjsKKyAgICBtX3JlbmRlclRpbWVyID0gMDsKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSog
ZnJvbnQgPSByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdlb21ldHJ5Kj4obV9mcm9udFN0
YXRlKTsKKyAgICBkZWxldGUgZnJvbnQ7CisgICAgbV9mcm9udFN0YXRlID0gMDsKKworICAgIEJh
Y2tpbmdTdG9yZUdlb21ldHJ5KiBiYWNrID0gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3RvcmVH
ZW9tZXRyeSo+KG1fYmFja1N0YXRlKTsKKyAgICBkZWxldGUgYmFjazsKKyAgICBtX2JhY2tTdGF0
ZSA9IDA7CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbXV0ZXgpOworfQorCitib29s
IEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkgY29u
c3QKK3sKKyAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5pc0RpcmVjdFJlbmRlcmluZ1Rv
V2luZG93RW5hYmxlZCgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgIGNvbnN0IEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRl
KCk7CisgICAgY29uc3QgdW5zaWduZWQgdGlsZXNOZWNlc3NhcnkgPSBtaW5pbXVtTnVtYmVyT2ZU
aWxlc1dpZGUoKSAqIG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpOworICAgIGNvbnN0IHVuc2ln
bmVkIHRpbGVzQXZhaWxhYmxlID0gY3VycmVudFN0YXRlLT5udW1iZXJPZlRpbGVzV2lkZSgpICog
Y3VycmVudFN0YXRlLT5udW1iZXJPZlRpbGVzSGlnaCgpOworICAgIHJldHVybiB0aWxlc0F2YWls
YWJsZSA8IHRpbGVzTmVjZXNzYXJ5OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN1
c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCkKK3sKKyAgICBtX3N1c3BlbmRCYWNr
aW5nU3RvcmVVcGRhdGVzID0gdHJ1ZTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXNlciBpbnRl
cmZhY2UgdGhyZWFkIGdldHMgdGhlIG1lc3NhZ2UgYmVmb3JlIHdlIHByb2NlZWQKKyAgICAvLyBi
ZWNhdXNlIGJsaXRDb250ZW50cyBjYW4gYmUgY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQgYW5kIGl0
IG11c3QgaG9ub3IKKyAgICAvLyB0aGlzIGZsYWcuCisgICAgbV9zdXNwZW5kU2NyZWVuVXBkYXRl
cyA9IHRydWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRN
ZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpCisgICAgbV93ZWJQYWdlLT5kLT5yZXNldENvbXBvc2l0aW5nU3Vy
ZmFjZSgpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzdW1lU2Ny
ZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlc3VtZVVwZGF0ZU9wZXJh
dGlvbiBvcCkKK3sKKyAgICBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID0gZmFsc2U7CisK
KyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKG9wICE9IEJhY2tpbmdT
dG9yZTo6Tm9uZSkKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXROZWVkc09uZVNob3REcmF3aW5n
U3luY2hyb25pemF0aW9uKCk7CisjZW5kaWYKKworICAgIC8vIEZvciB0aGUgZGlyZWN0IHJlbmRl
cmluZyBjYXNlLCB0aGVyZSBpcyBubyBzdWNoIG9wZXJhdGlvbiBhcyBibGl0LAorICAgIC8vIHdl
IGhhdmUgdG8gcmVuZGVyIHRvIGdldCBhbnl0aGluZyB0byB0aGUgc2NyZWVuLgorICAgIGlmIChz
aG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpICYmIG9wID09IEJhY2tpbmdTdG9yZTo6Qmxp
dCkKKyAgICAgICAgb3AgPSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQ7CisKKyAgICAvLyBE
byBzb21lIHJlbmRlcmluZyBpZiBuZWNlc3NhcnkuCisgICAgaWYgKG9wID09IEJhY2tpbmdTdG9y
ZTo6UmVuZGVyQW5kQmxpdCkKKyAgICAgICAgcmVuZGVyVmlzaWJsZUNvbnRlbnRzKHRydWUgLypy
ZW5kZXJDb250ZW50T25seSovKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXNlciBpbnRlcmZh
Y2UgdGhyZWFkIGdldHMgdGhlIG1lc3NhZ2UgYmVmb3JlIHdlIHByb2NlZWQKKyAgICAvLyBiZWNh
dXNlIGJsaXRDb250ZW50cyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIHVzZXIgaW50ZXJmYWNlIHRo
cmVhZCBhbmQKKyAgICAvLyBpdCBtdXN0IGhvbm9yIHRoaXMgZmxhZy4KKyAgICBtX3N1c3BlbmRT
Y3JlZW5VcGRhdGVzID0gZmFsc2U7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7CisKKyAg
ICAvLyBEbyBzb21lIGJsaXR0aW5nIGlmIG5lY2Vzc2FyeS4KKyAgICBpZiAoKG9wID09IEJhY2tp
bmdTdG9yZTo6QmxpdCB8fCBvcCA9PSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQpICYmICFz
aG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBibGl0VmlzaWJsZUNvbnRl
bnRzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVwYWludChjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgd2luZG93UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBib29sIGNvbnRlbnRDaGFuZ2VkLCBib29sIGltbWVkaWF0ZSkKK3sKKyNpZiBVU0UoT1BF
TlZHKQorICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpOworI2VuZGlm
CisKKyAgICBpZiAobV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcykKKyAgICAgICAgcmV0dXJu
OworCisgICAgIC8vIElmIGltbWVkaWF0ZSBpcyB0cnVlLCB0aGVuIHdlJ3JlIGJlaW5nIGFza2Vk
IHRvIHBlcmZvcm0gc3luY2hyb25vdXNseS4KKyAgICAgLy8gTk9URTogV2ViQ29yZTo6U2Nyb2xs
VmlldyB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBpbW1lZGlhdGU6dHJ1ZSBhbmQgY29udGVu
dENoYW5nZWQ6ZmFsc2UuCisgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgaW50cm9kdWNl
ZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBBcHBsZSdzIHdpbmRvd3MgcG9ydCBhbmQgY2FuIGJlIHNh
ZmVseSBpZ25vcmVkIEkgYmVsaWV2ZS4KKyAgICAgLy8gTm93IHRoaXMgbWV0aG9kIHdpbGwgYmUg
Y2FsbGVkIGZyb20gV2ViUGFnZVByaXZhdGU6OnJlcGFpbnQoKS4KKworICAgIGlmIChjb250ZW50
Q2hhbmdlZCAmJiAhd2luZG93UmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gVGhpcyB3aW5k
b3dSZWN0IGlzIGluIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHZp
ZXdwb3J0LCBidXQKKyAgICAgICAgLy8gaXQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQgY29vcmRp
bmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybWVkIGNvbnRlbnRzLgorICAgICAgICBQbGF0
Zm9ybTo6SW50UmVjdCByZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBUb1RyYW5zZm9ybWVkKG1fY2xp
ZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHdpbmRvd1JlY3QpKTsKKyAgICAgICAgcmVj
dC5pbmZsYXRlKDEgLypkeCovLCAxIC8qZHkqLyk7IC8vIEFjY291bnQgZm9yIGFudGktYWxpYXNp
bmcgb2YgcHJldmlvdXMgcmVuZGVyaW5nIHJ1bnMuCisKKyAgICAgICAgLy8gRklYTUU6IFRoaXMg
c2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24gV2ViQ29yZTo6LgorICAgICAgICBXZWJD
b3JlOjpJbnRSZWN0IHRtcFJlY3QgPSByZWN0OworICAgICAgICBtX2NsaWVudC0+Y2xpcFRvVHJh
bnNmb3JtZWRDb250ZW50c1JlY3QodG1wUmVjdCk7CisKKyAgICAgICAgcmVjdCA9IHRtcFJlY3Q7
CisgICAgICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAg
ICAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICAgICAgcmVuZGVyKHJlY3QsIGZhbHNlIC8qcmVu
ZGVyQ29udGVudE9ubHkqLyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIHJlY3QpOworICAgIH0K
K30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzbG93U2Nyb2xsKGNvbnN0IFBsYXRmb3Jt
OjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsIGJv
b2wgaW1tZWRpYXRlKQoreworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0YXJ0IHRo
ZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91YmxlIHRpbWUgPSBXVEY6OmN1cnJlbnRUaW1l
KCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoZGVsdGEpOworCisgICAg
Ly8gVGhpcyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRp
dmUgdG8gdGhlIHZpZXdwb3J0LCBidXQKKyAgICAvLyBpdCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1l
ZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdHJhbnNmb3JtZWQgY29udGVudHMuCisgICAg
UGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwVG9UcmFuc2Zvcm1lZCht
X2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3aW5kb3dSZWN0KSk7CisKKyAgICBp
ZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIocmVjdCwgZmFsc2UgLypyZW5kZXJDb250ZW50
T25seSovKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShS
ZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCwgcmVjdCk7CisgICAgICAgIC8vIFdlIG9ubHkgYmxp
dCBoZXJlIGlmIHRoZSBjbGllbnQgZGlkIG5vdCBnZW5lcmF0ZSB0aGUgc2Nyb2xsIGFzIHRoZSBj
bGllbnQKKyAgICAgICAgLy8gbm93IHN1cHBvcnRzIGJsaXR0aW5nIGFzeW5jaHJvbm91c2x5IGR1
cmluZyBzY3JvbGwgb3BlcmF0aW9ucy4KKyAgICAgICAgaWYgKCFtX2NsaWVudC0+aXNDbGllbnRH
ZW5lcmF0ZWRTY3JvbGwoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAg
ICAgICAgICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9CisKKyNpZiBERUJVR19CQUNL
SU5HU1RPUkUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRvdWJsZSBl
bGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6c2xvd1Njcm9sbCBlbGFwc2VkPSVmIiwgZWxhcHNlZCk7CisjZW5kaWYK
K30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGwoY29uc3QgUGxhdGZvcm06Oklu
dFNpemUmIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIHNjcm9sbFZpZXdSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNsaXBSZWN0KQoreworICAgIC8vIElm
IHdlIGFyZSBkaXJlY3QgcmVuZGVyaW5nIHRoZW4gd2UgYXJlIGZvcmNlZCB0byBnbyBkb3duIHRo
ZSBzbG93IHBhdGgKKyAgICAvLyB0byBzY3JvbGxpbmcuCisgICAgaWYgKHNob3VsZERpcmVjdFJl
bmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qgdmlld3BvcnRS
ZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSgpKTsKKyAgICAgICAgc2xvd1Njcm9sbChkZWx0YSwgbV93ZWJQYWdlLT5kLT5t
YXBGcm9tVHJhbnNmb3JtZWQodmlld3BvcnRSZWN0KSwgdHJ1ZSAvKmltbWVkaWF0ZSovKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91YmxlIHRpbWUgPSBXVEY6OmN1cnJl
bnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoZGVsdGEpOwor
CisgICAgLy8gV2Ugb25seSBibGl0IGhlcmUgaWYgdGhlIGNsaWVudCBkaWQgbm90IGdlbmVyYXRl
IHRoZSBzY3JvbGwgYXMgdGhlIGNsaWVudAorICAgIC8vIG5vdyBzdXBwb3J0cyBibGl0dGluZyBh
c3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuCisgICAgaWYgKCFtX2NsaWVu
dC0+aXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoKSkKKyAgICAgICAgYmxpdFZpc2libGVDb250ZW50
cygpOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgLy8gU3RvcCB0aGUgdGltZSBtZWFz
dXJlbWVudC4KKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9n
TGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbCBkeD0lZCwgZHk9JWQg
ZWxhcHNlZD0lZiIsIGRlbHRhLndpZHRoKCksIGRlbHRhLmhlaWdodCgpLCBlbGFwc2VkKTsKKyNl
bmRpZgorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbGluZ1N0YXJ0ZWRIZWxw
ZXIoY29uc3QgUGxhdGZvcm06OkludFNpemUmIGRlbHRhKQoreworICAgIC8vIE5vdGlmeSB0aGUg
cmVuZGVyIHF1ZXVlIHNvIHRoYXQgaXQgY2FuIHNodWZmbGUgYWNjb3JkaW5nbHkuCisgICAgbV9y
ZW5kZXJRdWV1ZS0+dXBkYXRlU29ydERpcmVjdGlvbihkZWx0YS53aWR0aCgpLCBkZWx0YS5oZWln
aHQoKSk7CisgICAgbV9yZW5kZXJRdWV1ZS0+dmlzaWJsZUNvbnRlbnRDaGFuZ2VkKHZpc2libGVD
b250ZW50c1JlY3QoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhlIGFjdHVhbCBiYWNraW5nc3RvcmUu
CisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKGRlbHRhLndpZHRoKCksIGRlbHRhLmhlaWdodCgpKTsK
KworICAgIC8vIEFkZCBhbnkgbmV3bHkgdmlzaWJsZSB0aWxlcyB0aGF0IGhhdmUgbm90IGJlZW4g
cHJldmlvdXNseSByZW5kZXJlZCB0byB0aGUgcXVldWUKKyAgICAvLyBhbmQgY2hlY2sgaWYgdGhl
IHRpbGUgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgYnkgcmVndWxhciByZW5kZXIgam9iLgorICAg
IHVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbigpOworfQorCitib29sIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZFN1cHByZXNzTm9uVmlzaWJsZVJlZ3VsYXJSZW5kZXJK
b2JzKCkgY29uc3QKK3sKKyNpZiBTVVBQUkVTU19OT05fVklTSUJMRV9SRUdVTEFSX1JFTkRFUl9K
T0JTCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIC8vIEFsd2F5cyBzdXBwcmVzcyB3aGVu
IGxvYWRpbmcgYXMgdGhpcyBkcmFzdGljYWxseSBkZWNyZWFzZXMgcGFnZSBsb2FkaW5nCisgICAg
Ly8gdGltZS4uLgorICAgIHJldHVybiBtX2NsaWVudC0+aXNMb2FkaW5nKCk7CisjZW5kaWYKK30K
KworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRQZXJmb3JtUmVuZGVySm9icygpIGNv
bnN0Cit7CisgICAgcmV0dXJuIChtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8IHNob3VsZERpcmVj
dFJlbmRlcmluZ1RvV2luZG93KCkpICYmICFtX3N1c3BlbmRSZW5kZXJKb2JzICYmICFtX3N1c3Bl
bmRCYWNraW5nU3RvcmVVcGRhdGVzICYmICFtX3JlbmRlclF1ZXVlLT5pc0VtcHR5KCFtX3N1c3Bl
bmRSZWd1bGFyUmVuZGVySm9icyk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hv
dWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2hvdWxk
UGVyZm9ybVJlbmRlckpvYnMoKSAmJiAhbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnM7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RhcnRSZW5kZXJUaW1lcigpCit7CisgICAgLy8g
Q2FsbGVkIHdoZW4gcmVuZGVyIHF1ZXVlIGhhcyBhIG5ldyBqb2IgYWRkZWQuCisgICAgaWYgKG1f
cmVuZGVyVGltZXItPmlzQWN0aXZlKCkgfHwgbV9yZW5kZXJRdWV1ZS0+aXNFbXB0eSghbV9zdXNw
ZW5kUmVndWxhclJlbmRlckpvYnMpKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19CQUNL
SU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RhcnRSZW5kZXJU
aW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIG1fcmVuZGVy
VGltZXItPnN0YXJ0T25lU2hvdChzX3JlbmRlclRpbWVyVGltZW91dCk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyKCkKK3sKKyAgICBpZiAoIW1fcmVuZGVy
VGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENhbGxlZCB3aGVu
IHdlIHJlbmRlciBzb21ldGhpbmcgdG8gcmVzdGFydC4KKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyIHRpbWU9
JWYiLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworI2VuZGlmCisgICAgbV9yZW5kZXJUaW1lci0+c3Rv
cCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlck9uVGltZXIoV2ViQ29y
ZTo6VGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4qKQoreworICAgIC8vIFRoaXMgdGltZXIgaXMg
YSB0aGlyZCBtZXRob2Qgb2Ygc3RhcnRpbmcgYSByZW5kZXIgb3BlcmF0aW9uIHRoYXQgaXMgYSBj
YXRjaC1hbGwuIElmIG1vcmUKKyAgICAvLyB0aGFuIHNfcmVuZGVyVGltZXJUaW1lb3V0IGVsYXBz
ZXMgd2l0aCBubyByZW5kZXJpbmcgdGFraW5nIHBsYWNlIGFuZCByZW5kZXIgam9icyBpbiB0aGUg
cXVldWUsIHRoZW4KKyAgICAvLyByZW5kZXJPblRpbWVyIHdpbGwgYmUgY2FsbGVkIHdoaWNoIHdp
bGwgYWN0dWFsbHkgcmVuZGVyLgorICAgIGlmICghc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSkK
KyAgICAgICAgcmV0dXJuOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwg
IkJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlck9uVGltZXIgdGltZT0lZiIsIFdURjo6Y3VycmVu
dFRpbWUoKSk7CisjZW5kaWYKKyAgICB3aGlsZSAobV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZp
c2libGVab29tSm9iKCkgfHwgbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZpc2libGVTY3JvbGxK
b2IoKSkKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+cmVuZGVyKCFtX3N1c3BlbmRSZWd1bGFyUmVu
ZGVySm9icyk7CisKKyAgICBpZiAoIXNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIHx8
ICFtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXJBbGxDdXJyZW50UmVndWxhclJlbmRl
ckpvYnMoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJPbklkbGUoKQor
eworICAgIEFTU0VSVChzaG91bGRQZXJmb3JtUmVuZGVySm9icygpKTsKKworICAgIC8vIExldCB0
aGUgcmVuZGVyIHF1ZXVlIGtub3cgdGhhdCB3ZSBlbnRlcmVkIGEgbmV3IGV2ZW50IHF1ZXVlIGN5
Y2xlCisgICAgLy8gc28gaXQgY2FuIGRldGVybWluZSBpZiBpdCBpcyB1bmRlciBwcmVzc3VyZS4K
KyAgICBtX3JlbmRlclF1ZXVlLT5ldmVudFF1ZXVlQ3ljbGVkKCk7CisKKyNpZiBERUJVR19CQUNL
SU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25JZGxl
Iik7CisjZW5kaWYKKworICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9zdXNwZW5kUmVndWxh
clJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OndpbGxGaXJlVGlt
ZXIoKQoreworICAgIC8vIExldCB0aGUgcmVuZGVyIHF1ZXVlIGtub3cgdGhhdCB3ZSBlbnRlcmVk
IGEgbmV3IGV2ZW50IHF1ZXVlIGN5Y2xlCisgICAgLy8gc28gaXQgY2FuIGRldGVybWluZSBpZiBp
dCBpcyB1bmRlciBwcmVzc3VyZS4KKyAgICBtX3JlbmRlclF1ZXVlLT5ldmVudFF1ZXVlQ3ljbGVk
KCk7CisKKyAgICBpZiAoIXNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIHx8ICFtX3Jl
bmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpIHx8ICFtX3JlbmRlclF1ZXVl
LT5jdXJyZW50UmVndWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpKQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNr
aW5nU3RvcmVQcml2YXRlOjp3aWxsRmlyZVRpbWVyIik7CisjZW5kaWYKKworICAgIC8vIFdlJ3Zl
IGRldGVjdGVkIHRoYXQgdGhlIHJlZ3VsYXIgcmVuZGVyIGpvYnMgYXJlIGNvbWluZyB1bmRlciBw
cmVzc3VyZSBsaWtlbHkKKyAgICAvLyBkdWUgdG8gdGltZXJzIGZpcmluZyBwcm9kdWNpbmcgaW52
YWxpZGF0aW9uIGpvYnMgYW5kIG91ciBlZmZvcnRzIHRvIGJyZWFrIHRoZW0KKyAgICAvLyB1cCBp
bnRvIGJpdGUgc2l6ZSBwaWVjZXMgaGFzIHByb2R1Y2VkIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGNh
biBub3QgY29tcGxldGUKKyAgICAvLyBhIGJhdGNoIG9mIHRoZW0gYmVmb3JlIHJlY2VpdmluZyBt
b3JlIHRoYXQgaW50ZXJzZWN0IHRoZW0gd2hpY2ggY2F1c2VzIHVzCisgICAgLy8gdG8gc3RhcnQg
dGhlIGJhdGNoIG92ZXIuIFRvIG1pdGlnYXRlIHRoaXMgd2UgaGF2ZSB0byBlbXB0eSB0aGUgY3Vy
cmVudCBiYXRjaAorICAgIC8vIHdoZW4gdGhpcyBpcyBkZXRlY3RlZC4KKworICAgIC8vIFdlIHN0
aWxsIHdhbnQgdG8gcGVyZm9ybSBwcmlvcml0eSBqb2JzIGZpcnN0IHRvIGF2b2lkIHJlZHVuZGFu
dCBwYWludHMuCisgICAgd2hpbGUgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9v
bUpvYigpIHx8IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9iKCkpCisg
ICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMp
OworCisgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRSZWd1bGFyUmVuZGVySm9iKCkp
CisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVuZGVySm9i
cygpOworCisgICAgLy8gTGV0IHRoZSBjYWxsZXIgeWllbGQgYW5kIHJlc2NoZWR1bGUgdGhlIHRp
bWVyLgorICAgIHJldHVybiBmYWxzZTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6ZXhwYW5kZWRDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBQ
bGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGV4cGFuZGVkQ29udGVu
dHNTaXplKCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp2
aXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW50ZXJzZWN0aW9uKG1f
Y2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QoKSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV9j
bGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpKTsKK30KKworUGxhdGZvcm06OkludFJl
Y3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1Jl
Y3QoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlTGVmdChjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9y
ZVJlY3QueCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLngoKQorICAgICAgICAgICAgJiYgYmFj
a2luZ1N0b3JlUmVjdC54KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLngoKTsKK30KKworYm9v
bCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlUmlnaHQoY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVYKGJh
Y2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkg
PCB2aXNpYmxlQ29udGVudHNSZWN0KCkucmlnaHQoKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC5yaWdodCgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5yaWdodCgpOworfQorCiti
b29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVVcChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2FuTW92ZVkoYmFj
a2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueSgpID4gdmlz
aWJsZUNvbnRlbnRzUmVjdCgpLnkoKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0b3JlUmVjdC55
KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLnkoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpzaG91bGRNb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2FuTW92ZVkoYmFja2luZ1N0b3JlUmVjdCkK
KyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkgPCB2aXNpYmxlQ29udGVu
dHNSZWN0KCkuYm90dG9tKCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9t
KCkgPCBleHBhbmRlZENvbnRlbnRzUmVjdCgpLmJvdHRvbSgpOworfQorCitib29sIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmNhbk1vdmVYKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3Rv
cmVSZWN0KSBjb25zdAoreworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LndpZHRoKCkgPiB2
aXNpYmxlQ29udGVudHNSZWN0KCkud2lkdGgoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjpjYW5Nb3ZlWShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSA+IHZpc2libGVD
b250ZW50c1JlY3QoKS5oZWlnaHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpj
YW5Nb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0Zm9ybTo6
SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRzUmVjdCgp
OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFuZGVkQ29u
dGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKC10aWxlV2lkdGgoKSwgMCk7
CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA+PSB2aXNpYmxlQ29udGVudHNS
ZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgpID49IGNvbnRl
bnRzUmVjdC54KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVJpZ2h0
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZp
c2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7CisgICAgUGxh
dGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRDb250ZW50c1JlY3Qo
KTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUodGlsZVdpZHRoKCksIDApOworICAgIHJldHVy
biBiYWNraW5nU3RvcmVSZWN0LngoKSA8PSB2aXNpYmxlQ29udGVudHNSZWN0LngoKQorICAgICAg
ICAgICAgJiYgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8PSBjb250ZW50c1JlY3QucmlnaHQo
KQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSAtIGNvbnRlbnRzUmVj
dC5yaWdodCgpKSA8IHRpbGVXaWR0aCgpKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRl
OjpjYW5Nb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAg
UGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7CisgICAgUGxhdGZvcm06
OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2libGVDb250ZW50c1JlY3Qo
KTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0aGlzLT5leHBhbmRlZENv
bnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCAtdGlsZUhlaWdodCgp
KTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA+PSB2aXNpYmxlQ29udGVu
dHNSZWN0LmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LnkoKSA+PSBj
b250ZW50c1JlY3QueSgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVE
b3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7CisgICAg
UGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRDb250ZW50c1Jl
Y3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgpKTsKKyAgICBy
ZXR1cm4gYmFja2luZ1N0b3JlUmVjdC55KCkgPD0gdmlzaWJsZUNvbnRlbnRzUmVjdC55KCkKKyAg
ICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgpIDw9IGNvbnRlbnRzUmVjdC5i
b3R0b20oKQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkgLSBjb250
ZW50c1JlY3QuYm90dG9tKCkpIDwgdGlsZUhlaWdodCgpKTsKK30KKworUGxhdGZvcm06OkludFJl
Y3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja2luZ1N0b3JlUmVjdEZvclNjcm9sbChpbnQgZGVs
dGFYLCBpbnQgZGVsdGFZLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICAvLyBUaGUgY3VycmVudCByZWN0LgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdT
dG9yZVJlY3QgPSByZWN0OworCisgICAgLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgZGVsdGEgdmFs
dWVzIHRvIGRlc2NyaWJlIHRoZSBiYWNraW5nc3RvcmUgcmVjdAorICAgIC8vIGdpdmVuIHRoZSBj
dXJyZW50IHNjcm9sbCBkaXJlY3Rpb24gYW5kIHRoZSB2aWV3cG9ydCBwb3NpdGlvbi4gSG93ZXZl
ciwKKyAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGggbm8gZGVsdGFzIHdoYXRz
b2V2ZXIgZm9yIGluc3RhbmNlIHdoZW4KKyAgICAvLyB0aGUgY29udGVudHMgc2l6ZSBjaGFuZ2Vz
IG9yIHRoZSBvcmllbnRhdGlvbiBjaGFuZ2VzLiBJbiB0aGlzIGNhc2UsIHdlCisgICAgLy8gd2Fu
dCB0byB1c2UgdGhlIHByZXZpb3VzIHNjcm9sbCBkaXJlY3Rpb24gdG8gZGVzY3JpYmUgdGhlIGJh
Y2tpbmdzdG9yZQorICAgIC8vIHJlY3QuIFRoaXMgd2lsbCByZXN1bHQgaW4gbGVzcyBjaGVja2Vy
Ym9hcmQuCisgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgeworICAgICAgICBkZWx0YVggPSBt
X3ByZXZpb3VzRGVsdGEud2lkdGgoKTsKKyAgICAgICAgZGVsdGFZID0gbV9wcmV2aW91c0RlbHRh
LmhlaWdodCgpOworICAgIH0KKyAgICBtX3ByZXZpb3VzRGVsdGEgPSBQbGF0Zm9ybTo6SW50U2l6
ZShkZWx0YVgsIGRlbHRhWSk7CisKKyAgICAvLyBSZXR1cm4gdG8gb3JpZ2luIGlmIG5lZWQgYmUu
CisgICAgaWYgKCFjYW5Nb3ZlWChiYWNraW5nU3RvcmVSZWN0KSAmJiBiYWNraW5nU3RvcmVSZWN0
LngoKSkKKyAgICAgICAgYmFja2luZ1N0b3JlUmVjdC5zZXRYKDApOworCisgICAgaWYgKCFjYW5N
b3ZlWShiYWNraW5nU3RvcmVSZWN0KSAmJiBiYWNraW5nU3RvcmVSZWN0LnkoKSkKKyAgICAgICAg
YmFja2luZ1N0b3JlUmVjdC5zZXRZKDApOworCisgICAgLy8gTW92ZSB0aGUgcmVjdCBsZWZ0Lgor
ICAgIHdoaWxlIChzaG91bGRNb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSB8fCAoZGVsdGFYID4g
MCAmJiBjYW5Nb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tpbmdTdG9y
ZVJlY3QubW92ZSgtdGlsZVdpZHRoKCksIDApOworCisgICAgLy8gTW92ZSB0aGUgcmVjdCByaWdo
dC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZVJpZ2h0KGJhY2tpbmdTdG9yZVJlY3QpIHx8IChkZWx0
YVggPCAwICYmIGNhbk1vdmVSaWdodChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QubW92ZSh0aWxlV2lkdGgoKSwgMCk7CisKKyAgICAvLyBNb3ZlIHRoZSByZWN0
IHVwLgorICAgIHdoaWxlIChzaG91bGRNb3ZlVXAoYmFja2luZ1N0b3JlUmVjdCkgfHwgKGRlbHRh
WSA+IDAgJiYgY2FuTW92ZVVwKGJhY2tpbmdTdG9yZVJlY3QpKSkKKyAgICAgICAgYmFja2luZ1N0
b3JlUmVjdC5tb3ZlKDAsIC10aWxlSGVpZ2h0KCkpOworCisgICAgLy8gTW92ZSB0aGUgcmVjdCBk
b3duLgorICAgIHdoaWxlIChzaG91bGRNb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSB8fCAoZGVs
dGFZIDwgMCAmJiBjYW5Nb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QubW92ZSgwLCB0aWxlSGVpZ2h0KCkpOworCisgICAgcmV0dXJuIGJhY2tpbmdT
dG9yZVJlY3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2luZ1N0b3Jl
UmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkKK3sKKyAgICBp
ZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICgh
aXNBY3RpdmUoKSkgeworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNob3VsZFJlc2V0VGlsZXNX
aGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBSZWNvcmQg
dGhlIGN1cnJlbnQgYmFja2luZ3N0b3JlIHJlY3QuCisgICAgUGxhdGZvcm06OkludFJlY3QgY3Vy
cmVudEJhY2tpbmdTdG9yZVJlY3QgPSBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKTsK
KworICAgIGlmIChiYWNraW5nU3RvcmVSZWN0ID09IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KQor
ICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19USUxFTUFUUklYCisgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJh
Y2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tpbmdTdG9yZVJlY3QgY2hhbmdlZCBmcm9tICglZCwl
ZCAlZHglZCkgdG8gKCVkLCVkICVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBj
dXJyZW50QmFja2luZ1N0b3JlUmVjdC54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBj
dXJyZW50QmFja2luZ1N0b3JlUmVjdC55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBj
dXJyZW50QmFja2luZ1N0b3JlUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiYWNraW5nU3RvcmVSZWN0LngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGJhY2tpbmdTdG9yZVJlY3QueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2lu
Z1N0b3JlUmVjdC53aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2luZ1N0
b3JlUmVjdC5oZWlnaHQoKSk7CisjZW5kaWYKKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBj
dXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3Vy
cmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICAvLyBUaGUgbGlzdCBvZiBpbmRleGVzIHdlIG5l
ZWQgdG8gZmlsbC4KKyAgICBUaWxlSW5kZXhMaXN0IGluZGV4ZXNUb0ZpbGwgPSBpbmRleGVzRm9y
QmFja2luZ1N0b3JlUmVjdChiYWNraW5nU3RvcmVSZWN0KTsKKworICAgIEFTU0VSVChzdGF0aWNf
Y2FzdDxpbnQ+KGluZGV4ZXNUb0ZpbGwuc2l6ZSgpKSA9PSBjdXJyZW50TWFwLnNpemUoKSk7CisK
KyAgICBUaWxlTWFwIG5ld1RpbGVNYXA7CisgICAgVGlsZU1hcCBsZWZ0T3ZlclRpbGVzOworCisg
ICAgLy8gSXRlcmF0ZSB0aHJvdWdoIG91ciBjdXJyZW50IHRpbGUgbWFwIGFuZCBhZGQgdGlsZXMg
dGhhdCBhcmUgcmVuZGVyZWQgd2l0aAorICAgIC8vIG91ciBuZXcgYmFja2luZ3N0b3JlIHJlY3Qu
CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgdGlsZU1hcEVuZCA9IGN1cnJlbnRNYXAuZW5k
KCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVn
aW4oKTsgaXQgIT0gdGlsZU1hcEVuZDsgKytpdCkgeworICAgICAgICBUaWxlSW5kZXggb2xkSW5k
ZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vj
b25kOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBvbGQgaW5kZXguCisgICAgICAgIHJlc2V0VGls
ZShvbGRJbmRleCwgdGlsZSwgZmFsc2UgLypyZXNldEJhY2tncm91bmQqLyk7CisKKyAgICAgICAg
Ly8gT3JpZ2luIG9mIGxhc3QgY29tbWl0dGVkIHJlbmRlciBmb3IgdGlsZSBpbiB0cmFuc2Zvcm1l
ZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2lu
ID0gb3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShvbGRJbmRleCwgdGlsZSwgY3VycmVudEJhY2tp
bmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIElmIHRoZSBuZXcgYmFja2luZyBzdG9yZSByZWN0
IGNvbnRhaW5zIHRoaXMgb3JpZ2luLCB0aGVuIGluc2VydCB0aGUgdGlsZSB0aGVyZQorICAgICAg
ICAvLyBhbmQgbWFyayBpdCBhcyBubyBsb25nZXIgc2hpZnRlZC4gTm90ZTogUGxhdGZvcm06Oklu
dFJlY3Q6OmNvbnRhaW5zIGNoZWNrcyBmb3IgYSAxeDEgcmVjdAorICAgICAgICAvLyBiZWxvdyBh
bmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBvcmlnaW4gc28gaXQgaXMgY29ycmVjdCB1c2FnZSBoZXJl
LgorICAgICAgICBpZiAoYmFja2luZ1N0b3JlUmVjdC5jb250YWlucyhvcmlnaW4pKSB7CisgICAg
ICAgICAgICBUaWxlSW5kZXggbmV3SW5kZXggPSBpbmRleE9mVGlsZShvcmlnaW4sIGJhY2tpbmdT
dG9yZVJlY3QpOworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdChvcmlnaW4sIHRp
bGVTaXplKCkpOworICAgICAgICAgICAgaWYgKG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJK
b2JzUHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKHJlY3QpKSB7CisgICAgICAgICAg
ICAgICAgLy8gSWYgdGhlIHJlbmRlciBxdWV1ZSBwcmV2aW91c2x5IHRyaWVkIHRvIHJlbmRlciB0
aGlzIHRpbGUsIGJ1dCB0aGUKKyAgICAgICAgICAgICAgICAvLyBiYWNraW5nc3RvcmUgd2Fzbid0
IGluIHRoZSBjb3JyZWN0IHBsYWNlIG9yIHRoZSB0aWxlIHdhc24ndCB2aXNpYmxlCisgICAgICAg
ICAgICAgICAgLy8gYXQgdGhlIHRpbWUgdGhlbiB3ZSBjYW4ndCBzaW1wbHkgcmVzdG9yZSB0aGUg
dGlsZSBzaW5jZSB0aGUgY29udGVudAorICAgICAgICAgICAgICAgIC8vIGlzIG5vdyBpbnZhbGlk
IGFzIGZhciBhcyBXZWJLaXQgaXMgY29uY2VybmVkLiBJbnN0ZWFkLCB3ZSBjbGVhcgorICAgICAg
ICAgICAgICAgIC8vIHRoZSB0aWxlIGhlcmUgb2YgdGhlIHJlZ2lvbiBhbmQgdGhlbiBwdXQgdGhl
IHRpbGUgaW4gdGhlIHJlbmRlcgorICAgICAgICAgICAgICAgIC8vIHF1ZXVlIGFnYWluLgorCisg
ICAgICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSB0aWxlIHdpdGggdGhlIG5vdCByZW5kZXJl
ZCByZWdpb24gdG8gZ2V0IHRoZSBhcmVhcworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0aWxl
IHRoYXQgd2UgbmVlZCB0byBjbGVhci4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6
aW50ZXJzZWN0UmVnaW9ucyhtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRl
cmVkUmVnaW9uKCksIHJlY3QpOworICAgICAgICAgICAgICAgIGNsZWFyQW5kVXBkYXRlVGlsZU9m
Tm90UmVuZGVyZWRSZWdpb24obmV3SW5kZXgsIHRpbGUsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvbiwg
YmFja2luZ1N0b3JlUmVjdCk7CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgICAgICAgICAg
ICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lvbi5leHRl
bnRzKCk7CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNl
dEJhY2tpbmdTdG9yZVJlY3QgZGlkIGNsZWFyIHRpbGUgJWQsJWQgJWR4JWQiLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50cy54KCksIGV4dGVudHMueSgpLCBl
eHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVpZ2h0KCkpOworI2VuZGlmCisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUuCisgICAg
ICAgICAgICAgICAgaWYgKCF0aWxlLT5mcm9udEJ1ZmZlcigpLT5pc1JlbmRlcmVkKCkKKyAgICAg
ICAgICAgICAgICAgICAgJiYgIWlzQ3VycmVudFZpc2libGVKb2IobmV3SW5kZXgsIHRpbGUsIGJh
Y2tpbmdTdG9yZVJlY3QpKQorICAgICAgICAgICAgICAgICAgICB1cGRhdGVUaWxlKG9yaWdpbiwg
ZmFsc2UgLyppbW1lZGlhdGUqLyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERv
IHNvbWUgYm9va2tlZXBpbmcgd2l0aCBzaGlmdGluZyB0aWxlcy4uLgorICAgICAgICAgICAgdGls
ZS0+Y2xlYXJTaGlmdCgpOworICAgICAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKHRydWUpOwor
CisgICAgICAgICAgICBzaXplX3QgaSA9IGluZGV4ZXNUb0ZpbGwuZmluZChuZXdJbmRleCk7Cisg
ICAgICAgICAgICBBU1NFUlQoaSAhPSBXVEY6Om5vdEZvdW5kKTsKKyAgICAgICAgICAgIGluZGV4
ZXNUb0ZpbGwucmVtb3ZlKGkpOworICAgICAgICAgICAgbmV3VGlsZU1hcC5hZGQobmV3SW5kZXgs
IHRpbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gU3RvcmUgdGhpcyB0aWxl
IGFuZCBpbmRleCBzbyB3ZSBjYW4gYWRkIGl0IHRvIHRoZSByZW1haW5pbmcgbGVmdCBvdmVyIHNw
b3RzLi4uCisgICAgICAgICAgICBsZWZ0T3ZlclRpbGVzLmFkZChvbGRJbmRleCwgdGlsZSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8aW50PihpbmRleGVzVG9G
aWxsLnNpemUoKSkgPT0gbGVmdE92ZXJUaWxlcy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsK
KyAgICBUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBsZWZ0T3ZlckVuZCA9IGxlZnRPdmVyVGlsZXMu
ZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGxlZnRPdmVyVGls
ZXMuYmVnaW4oKTsgaXQgIT0gbGVmdE92ZXJFbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4
IG9sZEluZGV4ID0gaXQtPmZpcnN0OworICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0g
aXQtPnNlY29uZDsKKyAgICAgICAgaWYgKCEoaSA8IGluZGV4ZXNUb0ZpbGwuc2l6ZSgpKSkgewor
ICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorCisgICAgICAgIFRpbGVJbmRleCBuZXdJbmRleCA9IGluZGV4ZXNUb0ZpbGwuYXQo
aSk7CisKKyAgICAgICAgLy8gT3JpZ2luIG9mIGxhc3QgY29tbWl0dGVkIHJlbmRlciBmb3IgdGls
ZSBpbiB0cmFuc2Zvcm1lZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6
SW50UG9pbnQgb3JpZ2luT2ZPbGQgPSBvcmlnaW5PZkxhc3RSZW5kZXJGb3JUaWxlKG9sZEluZGV4
LCB0aWxlLCBjdXJyZW50QmFja2luZ1N0b3JlUmVjdCk7CisgICAgICAgIC8vIE9yaWdpbiBvZiB0
aGUgbmV3IGluZGV4IGZvciB0aGUgbmV3IGJhY2tpbmdzdG9yZSByZWN0LgorICAgICAgICBQbGF0
Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZOZXcgPSBvcmlnaW5PZlRpbGUobmV3SW5kZXgsIGJhY2tp
bmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUuCisgICAg
ICAgIHVwZGF0ZVRpbGUob3JpZ2luT2ZOZXcsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworCisgICAg
ICAgIC8vIERvIHNvbWUgYm9va2tlZXBpbmcgd2l0aCBzaGlmdGluZyB0aWxlcy4uLgorICAgICAg
ICB0aWxlLT5jbGVhclNoaWZ0KCk7CisgICAgICAgIHRpbGUtPnNldENvbW1pdHRlZChmYWxzZSk7
CisgICAgICAgIHRpbGUtPnNldEhvcml6b250YWxTaGlmdCgob3JpZ2luT2ZPbGQueCgpIC0gb3Jp
Z2luT2ZOZXcueCgpKSAvIHRpbGVXaWR0aCgpKTsKKyAgICAgICAgdGlsZS0+c2V0VmVydGljYWxT
aGlmdCgob3JpZ2luT2ZPbGQueSgpIC0gb3JpZ2luT2ZOZXcueSgpKSAvIHRpbGVIZWlnaHQoKSk7
CisKKyAgICAgICAgbmV3VGlsZU1hcC5hZGQobmV3SW5kZXgsIHRpbGUpOworCisgICAgICAgICsr
aTsKKyAgICB9CisKKyAgICAvLyBDaGVja3MgdG8gbWFrZSBzdXJlIHdlIGhhdmVuJ3QgbG9zdCBh
bnkgdGlsZXMuCisgICAgQVNTRVJUKGN1cnJlbnRNYXAuc2l6ZSgpID09IG5ld1RpbGVNYXAuc2l6
ZSgpKTsKKworICAgIC8vIEFjdHVhbGx5IHNldCBzdGF0ZS4KKyAgICBiYWNrU3RhdGUoKS0+c2V0
TnVtYmVyT2ZUaWxlc1dpZGUoYmFja2luZ1N0b3JlUmVjdC53aWR0aCgpIC8gdGlsZVdpZHRoKCkp
OworICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzSGlnaChiYWNraW5nU3RvcmVSZWN0
LmhlaWdodCgpIC8gdGlsZUhlaWdodCgpKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0QmFja2luZ1N0
b3JlT2Zmc2V0KGJhY2tpbmdTdG9yZVJlY3QubG9jYXRpb24oKSk7CisgICAgYmFja1N0YXRlKCkt
PnNldFRpbGVNYXAobmV3VGlsZU1hcCk7CisKKyAgICAvLyBTd2FwIHRoZSBmcm9udC9iYWNrIHN0
YXRlLgorICAgIHN3YXBTdGF0ZSgpOworfQorCitCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlSW5k
ZXhMaXN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4ZXNGb3JCYWNraW5nU3RvcmVSZWN0KGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIFRp
bGVJbmRleExpc3QgaW5kZXhlczsKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc1dpZGUgPSBiYWNraW5n
U3RvcmVSZWN0LndpZHRoKCkgLyB0aWxlV2lkdGgoKTsKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc0hp
Z2ggPSBiYWNraW5nU3RvcmVSZWN0LmhlaWdodCgpIC8gdGlsZUhlaWdodCgpOworICAgIGZvciAo
aW50IHkgPSAwOyB5IDwgbnVtYmVyT2ZUaWxlc0hpZ2g7ICsreSkgeworICAgICAgICBmb3IgKGlu
dCB4ID0gMDsgeCA8IG51bWJlck9mVGlsZXNXaWRlOyArK3gpIHsKKyAgICAgICAgICAgIFRpbGVJ
bmRleCBpbmRleCh4LCB5KTsKKyAgICAgICAgICAgIGluZGV4ZXMuYXBwZW5kKGluZGV4KTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaW5kZXhlczsKK30KKworUGxhdGZvcm06OkludFBv
aW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om9yaWdpbk9mTGFzdFJlbmRlckZvclRpbGUoY29uc3Qg
VGlsZUluZGV4JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG9yaWdpbk9mVGlsZShpbmRleE9mTGFzdFJlbmRlckZvclRpbGUoaW5kZXgsIHRp
bGUpLCBiYWNraW5nU3RvcmVSZWN0KTsKK30KKworVGlsZUluZGV4IEJhY2tpbmdTdG9yZVByaXZh
dGU6OmluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBCYWNr
aW5nU3RvcmVUaWxlKiB0aWxlKSBjb25zdAoreworICAgIHJldHVybiBUaWxlSW5kZXgoaW5kZXgu
aSgpICsgdGlsZS0+aG9yaXpvbnRhbFNoaWZ0KCksIGluZGV4LmooKSArIHRpbGUtPnZlcnRpY2Fs
U2hpZnQoKSk7Cit9CisKK1RpbGVJbmRleCBCYWNraW5nU3RvcmVQcml2YXRlOjppbmRleE9mVGls
ZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3QKK3sKKyAgICBpbnQgb2Zmc2V0WCA9IG9yaWdpbi54KCkgLSBiYWNraW5n
U3RvcmVSZWN0LngoKTsKKyAgICBpbnQgb2Zmc2V0WSA9IG9yaWdpbi55KCkgLSBiYWNraW5nU3Rv
cmVSZWN0LnkoKTsKKyAgICBpZiAob2Zmc2V0WCkKKyAgICAgICAgb2Zmc2V0WCA9IG9mZnNldFgg
LyB0aWxlV2lkdGgoKTsKKyAgICBpZiAob2Zmc2V0WSkKKyAgICAgICAgb2Zmc2V0WSA9IG9mZnNl
dFkgLyB0aWxlSGVpZ2h0KCk7CisgICAgcmV0dXJuIFRpbGVJbmRleChvZmZzZXRYLCBvZmZzZXRZ
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhckFuZFVwZGF0ZVRpbGVPZk5v
dFJlbmRlcmVkUmVnaW9uKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUq
IHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3RSZWdpb24mIHRpbGVOb3RSZW5k
ZXJlZFJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3Jl
UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBib29sIHVwZGF0ZSkKK3sKKyAgICAvLyBJbnRlcnNlY3QgdGhlIHRpbGUg
d2l0aCB0aGUgbm90IHJlbmRlcmVkIHJlZ2lvbiB0byBnZXQgdGhlIGFyZWFzCisgICAgLy8gb2Yg
dGhlIHRpbGUgdGhhdCB3ZSBuZWVkIHRvIGNsZWFyLgorICAgIEludFJlY3RMaXN0IHRpbGVOb3RS
ZW5kZXJlZFJlZ2lvblJlY3RzID0gdGlsZU5vdFJlbmRlcmVkUmVnaW9uLnJlY3RzKCk7CisgICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5zaXplKCk7
ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlTm90UmVuZGVyZWRSZWdpb25S
ZWN0ID0gdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMuYXQoaSk7CisgICAgICAgIC8vIENsZWFy
IHRoZSByZW5kZXIgcXVldWUgb2YgdGhpcyByZWN0LgorICAgICAgICBtX3JlbmRlclF1ZXVlLT5j
bGVhcih0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0LCB0cnVlIC8qY2xlYXJSZWd1bGFyUmVuZGVy
Sm9icyovKTsKKworICAgICAgICBpZiAodXBkYXRlKSB7CisgICAgICAgICAgICAvLyBBZGQgaXQg
YWdhaW4gYXMgYSByZWd1bGFyIHJlbmRlciBqb2IuCisgICAgICAgICAgICBtX3JlbmRlclF1ZXVl
LT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpSZWd1bGFyUmVuZGVyLCB0aWxlTm90UmVuZGVyZWRS
ZWdpb25SZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbiBvZiB0
aGlzIHRpbGUuCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4gPSBvcmlnaW5PZlRp
bGUoaW5kZXgsIGJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIE1hcCB0byB0aWxlIGNv
b3JkaW5hdGVzLgorICAgICAgICB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0Lm1vdmUoLW9yaWdp
bi54KCksIC1vcmlnaW4ueSgpKTsKKworICAgICAgICAvLyBDbGVhciB0aGUgdGlsZSBvZiB0aGlz
IHJlZ2lvbi4KKyAgICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lv
bih0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0KTsKKyAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigp
LT5jbGVhclJlbmRlcmVkUmVnaW9uKHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpOworICAgIH0K
K30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc0N1cnJlbnRWaXNpYmxlSm9iKGNvbnN0
IFRpbGVJbmRleCYgaW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUsIGNvbnN0IFBsYXRmb3Jt
OjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIC8vIEZpcnN0IGNoZWNr
IGlmIHRoZSB3aG9sZSByZWN0IGlzIGluIHRoZSBxdWV1ZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVj
dCB3aG9sZVJlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW5PZlRpbGUoaW5kZXgsIGJhY2tp
bmdTdG9yZVJlY3QpLCB0aWxlU2l6ZSgpKTsKKyAgICBpZiAobV9yZW5kZXJRdWV1ZS0+aXNDdXJy
ZW50VmlzaWJsZVNjcm9sbEpvYih3aG9sZVJlY3QpIHx8IG1fcmVuZGVyUXVldWUtPmlzQ3VycmVu
dFZpc2libGVTY3JvbGxKb2JDb21wbGV0ZWQod2hvbGVSZWN0KSkKKyAgICAgICAgcmV0dXJuIHRy
dWU7CisKKyAgICAvLyBTZWNvbmQgY2hlY2sgaWYgdGhlIGluZGl2aWR1YWwgcGFydHMgb2YgdGhl
IG5vbi1yZW5kZXJlZCByZWdpb24gYXJlIGluIHRoZSByZWd1bGFyIHF1ZXVlLgorICAgIGJvb2wg
aXNDdXJyZW50ID0gdHJ1ZTsgLy8gSXQgaXMgdHJ1ZSB1bnRpbCBpdCBpc24ndCA6KQorCisgICAg
SW50UmVjdExpc3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMgPSB0aWxlLT5mcm9udEJ1ZmZl
cigpLT5ub3RSZW5kZXJlZFJlZ2lvbigpLnJlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0ID0gdGlsZU5vdFJlbmRl
cmVkUmVnaW9uUmVjdHMuYXQoaSk7CisgICAgICAgIC8vIEZpbmQgdGhlIG9yaWdpbiBvZiB0aGlz
IHRpbGUuCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4gPSBvcmlnaW5PZlRpbGUo
aW5kZXgsIGJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgICAgIC8vIE1hcCB0byB0cmFuc2Zvcm1l
ZCBjb250ZW50cyBjb29yZGluYXRlcy4KKyAgICAgICAgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVj
dC5tb3ZlKG9yaWdpbi54KCksIG9yaWdpbi55KCkpOworCisgICAgICAgIC8vIENoZWNrIGlmIGl0
IGlzIGN1cnJlbnQuCisgICAgICAgIGlzQ3VycmVudCA9IG1fcmVuZGVyUXVldWUtPmlzQ3VycmVu
dFJlZ3VsYXJSZW5kZXJKb2IodGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCkgPyBpc0N1cnJlbnQg
OiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gaXNDdXJyZW50OworfQorCit2b2lkIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnNjcm9sbEJhY2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZ
KQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxk
UmVzZXRUaWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIENhbGN1bGF0ZSBvdXIgbmV3IHByZWZlcnJlZCBtYXRyaXggZGltZW5zaW9uLgorICAgIGlm
IChkZWx0YVggfHwgZGVsdGFZKQorICAgICAgICBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNp
b24gPSBhYnMoZGVsdGFYKSA+IGFicyhkZWx0YVkpID8gSG9yaXpvbnRhbCA6IFZlcnRpY2FsOwor
CisgICAgLy8gQ2FsY3VsYXRlIG91ciBwcmVmZXJyZWQgbWF0cml4IGdlb21ldHJ5LgorICAgIERp
dmlzb3IgZGl2aXNvciA9IGJlc3REaXZpc29yKGV4cGFuZGVkQ29udGVudHNTaXplKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZVdpZHRoKCksIHRpbGVIZWlnaHQoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dp
ZGUoKSwgbWluaW11bU51bWJlck9mVGlsZXNIaWdoKCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGltZW5zaW9uKTsKKworI2lmIERFQlVH
X1RJTEVNQVRSSVgKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQmFj
a2luZ1N0b3JlIGRpdmlzb3IgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2
aXNvci5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3Iuc2Vjb25kKTsK
KyNlbmRpZgorCisgICAgLy8gSW5pdGlhbGl6ZSBhIHJlY3Qgd2l0aCB0aGF0IG5ldyBnZW9tZXRy
eS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0KDAsIDAsIGRpdmlzb3Iu
Zmlyc3QgKiB0aWxlV2lkdGgoKSwgZGl2aXNvci5zZWNvbmQgKiB0aWxlSGVpZ2h0KCkpOworCisg
ICAgLy8gU2Nyb2xsIHRoYXQgcmVjdCBzbyB0aGF0IGl0IGZpdHMgb3VyIGNvbnRlbnRzIGFuZCB2
aWV3cG9ydCBhbmQgc2Nyb2xsIGRlbHRhLgorICAgIGJhY2tpbmdTdG9yZVJlY3QgPSBiYWNraW5n
U3RvcmVSZWN0Rm9yU2Nyb2xsKGRlbHRhWCwgZGVsdGFZLCBiYWNraW5nU3RvcmVSZWN0KTsKKwor
ICAgIEFTU0VSVCghYmFja2luZ1N0b3JlUmVjdC5pc0VtcHR5KCkpOworCisgICAgLy8gU2V0IHRo
ZSBzdGF0ZS4KKyAgICBzZXRCYWNraW5nU3RvcmVSZWN0KGJhY2tpbmdTdG9yZVJlY3QpOworfQor
Citib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBJbnRSZWN0TGlzdCYgcmVj
dExpc3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgLy8gRklYTUU6IFdlIGN5Y2xl
IHRocm91Z2ggb25lIGJ5IG9uZSBhbmQgb25seSBibGl0IHRoZSBjb250ZW50cyBhdCB0aGUgZW5k
LgorICAgIC8vIFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24gaWYgd2UgaGFkIGEgbWFwRnJvbVRy
YW5zZm9ybWVkQ29udGVudHNUb1RpbGVzIHRoYXQKKyAgICAvLyB0b29rIGEgc2V0IG9mIHJlY3Rz
IGFuZCBkZWNvbXBvc2VkIHRoZW0gYXBwcm9wcmlhdGVseS4KKyAgICBib29sIHJlbmRlcmVkID0g
ZmFsc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0TGlzdC5zaXplKCk7ICsraSkK
KyAgICAgICAgcmVuZGVyZWQgPSByZW5kZXIocmVjdExpc3QuYXQoaSksIHRydWUpID8gdHJ1ZSA6
IHJlbmRlcmVkOworCisgICAgaWYgKHJlbmRlcmVkICYmICFyZW5kZXJDb250ZW50T25seSkgewor
ICAgICAgICBpZiAoIXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAg
ICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludmFs
aWRhdGVXaW5kb3coKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZWQ7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyRGlyZWN0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIHJlY3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgLy8gUmVxdWVz
dCBhIGxheW91dCBub3cgd2hpY2ggbWlnaHQgY2hhbmdlIHRoZSBjb250ZW50cyByZWN0LgorICAg
IHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOworCisgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlS
ZWN0ID0gcmVjdDsKKyAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KHVuY2xpcHBlZFZpc2libGVDb250
ZW50c1JlY3QoKSk7CisKKyAgICBpZiAoZGlydHlSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgUGxhdGZvcm06OkludFJlY3Qgc2NyZWVuUmVjdCA9IG1fY2xpZW50
LT5tYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVHJhbnNmb3JtZWRWaWV3cG9ydChkaXJ0eVJl
Y3QpOworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKHNj
cmVlblJlY3QpOworICAgIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNrU3VyZmFjZU9mV2luZG93
KCk7CisKKyAgICBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGRpcnR5UmVjdCwgVHJhbnNmb3JtYXRp
b25NYXRyaXgoKSwgdHJ1ZSAvKmZsdXNoKi8pOworCisgICAgY29uc3QgUGxhdGZvcm06OkludFBv
aW50IG9yaWdpbiA9IHVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoKS5sb2NhdGlvbigpOwor
ICAgIHJlbmRlckNvbnRlbnRzKDAgLypub3QgbmVlZGVkIHNpbmNlIHdlJ3JlIGRpcmVjdCByZW5k
ZXJpbmcgdG8gd2luZG93Ki8sCisgICAgICAgICAgICAgICAgICAgb3JpZ2luLCBkaXJ0eVJlY3Qp
OworICAgIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9uKHNjcmVlblJl
Y3QpOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKSAmJiBFTkFCTEVfQ09NUE9T
SVRJTkdfU1VSRkFDRQorICAgIGlmIChtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+
d2luZG93VXNhZ2UoKSAhPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6
R0xFUzJVc2FnZSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBjbGlwcGVkUmVjdCA9IGlu
dGVyc2VjdGlvbihkaXJ0eVJlY3QsIHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgICAgIGJs
ZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGNsaXBwZWRSZWN0KTsKKyAgICB9CisjZW5kaWYKKworICAg
IGJvb2wgc2hvdWxkSW52YWxpZGF0ZSA9ICFtX3N1c3BlbmRTY3JlZW5VcGRhdGVzICYmICFyZW5k
ZXJDb250ZW50T25seTsKKyAgICBpZiAoIXNob3VsZEludmFsaWRhdGUpCisgICAgICAgIHJldHVy
biB0cnVlOworCisgICAgaW52YWxpZGF0ZVdpbmRvdyhzY3JlZW5SZWN0KTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXIoY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIHJlY3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgaWYgKCFt
X3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBS
ZXF1ZXN0IGEgbGF5b3V0IG5vdyB3aGljaCBtaWdodCBjaGFuZ2UgdGhlIGNvbnRlbnRzIHJlY3Qu
CisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAoc2hvdWxkRGlyZWN0UmVu
ZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlckRpcmVjdFRvV2luZG93KHJl
Y3QsIHJlbmRlckNvbnRlbnRPbmx5KTsKKworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3Qg
PSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMocmVjdCk7CisgICAgaWYgKHRpbGVS
ZWN0TGlzdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmIERFQlVHX0JB
Q0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyIHJlY3Q9KCVkLCVkICVkeCVkKSwgcmVuZGVyQ29udGVu
dE9ubHk9JXMsIG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMgPSAlcyIsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5o
ZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckNvbnRlbnRPbmx5ID8g
InRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VzcGVuZEJh
Y2tpbmdTdG9yZVVwZGF0ZXMgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyNlbmRpZgorCisgICAgYm9v
bCBibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdyA9IG1fd2ViUGFnZS0+ZC0+bV9j
bGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpH
cmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOworCisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkq
IGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBj
dXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5Q29u
dGVudHNSZWN0OworICAgIGJvb2wgc2hvdWxkQmxpdCA9ICFtX3N1c3BlbmRCYWNraW5nU3RvcmVV
cGRhdGVzICYmICFyZW5kZXJDb250ZW50T25seTsKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCBjb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwg
MCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsKKyAgICBjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCB2aWV3cG9ydFJlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6
SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsKKwor
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZVJlY3RMaXN0LnNpemUoKTsgKytpKSB7Cisg
ICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0ID0gdGlsZVJlY3RMaXN0W2ldOworICAgICAgICBUaWxl
SW5kZXggaW5kZXggPSB0aWxlUmVjdC5maXJzdDsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qg
ZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKyAgICAgICAgQmFja2luZ1N0b3JlVGls
ZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0KGluZGV4KTsKKworICAgICAgICAvLyBUaGlzIGRpcnR5
IHRpbGUgcmVjdCBpcyBpbiB0aWxlIGNvb3JkaW5hdGVzLCBidXQgaXQgbmVlZHMgdG8gYmUgaW4K
KyAgICAgICAgLy8gdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRpbmF0ZXMuCisgICAgICAgIFBs
YXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250
ZW50cyh0aWxlUmVjdCk7CisKKyAgICAgICAgLy8gSWYgd2UncmUgbm90IHlldCBjb21taXR0ZWQs
IHRoZW4gY29tbWl0IG5vdyBieSBjbGVhcmluZyB0aGUgcmVuZGVyZWQgcmVnaW9uCisgICAgICAg
IC8vIGFuZCBzZXR0aW5nIHRoZSBjb21taXR0ZWQgZmxhZyBhcyB3ZWxsIGFzIGNsZWFyaW5nIHRo
ZSBzaGlmdC4KKyAgICAgICAgaWYgKCF0aWxlLT5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAg
ICB0aWxlLT5zZXRDb21taXR0ZWQodHJ1ZSk7CisgICAgICAgICAgICB0aWxlLT5mcm9udEJ1ZmZl
cigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgICAgICB0aWxlLT5iYWNrQnVmZmVy
KCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgICAgIHRpbGUtPmNsZWFyU2hpZnQo
KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB0aWxlIGhhcyBiZWVuIGNyZWF0ZWQs
IGJ1dCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBwYWludGluZyBvbiBpdAorICAgICAg
ICAvLyB0aGVuIGl0IGhhc24ndCBiZWVuIGdpdmVuIGEgZGVmYXVsdCBiYWNrZ3JvdW5kIHlldCBz
byB0aGF0IHdlIGNhbiBzYXZlIHRpbWUgZHVyaW5nCisgICAgICAgIC8vIHN0YXJ0dXAuIFRoYXQn
cyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgaW5zdGVhZC4uLgorICAgICAgICBpZiAoIXRpbGUt
PmJhY2tncm91bmRQYWludGVkKCkpCisgICAgICAgICAgICB0aWxlLT5wYWludEJhY2tncm91bmQo
KTsKKworICAgICAgICAvLyBQYWludCBkZWZhdWx0IGJhY2tncm91bmQgaWYgY29udGVudHMgcmVj
dCBpcyBlbXB0eS4KKyAgICAgICAgaWYgKCFleHBhbmRlZENvbnRlbnRzUmVjdCgpLmlzRW1wdHko
KSkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHNob3VsZCBjbGlwIHRoZSBjb250ZW50
cyBzaXplIGFuZCByZW5kZXIgdGhlIGNvbnRlbnQuCisgICAgICAgICAgICBkaXJ0eVJlY3QuaW50
ZXJzZWN0KGV4cGFuZGVkQ29udGVudHNSZWN0KCkpOworCisgICAgICAgICAgICBkaXJ0eVRpbGVS
ZWN0LmludGVyc2VjdCh0aWxlQ29udGVudHNSZWN0KGluZGV4LCBleHBhbmRlZENvbnRlbnRzUmVj
dCgpLCBjdXJyZW50U3RhdGUpKTsKKworICAgICAgICAgICAgLy8gV2UgcHJvYmFibHkgaGF2ZSBl
eHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVudHMgc2l6ZSBpcyBzbyBzbWFsbC4KKyAgICAgICAg
ICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgorICAgICAgICAgICAgaWYgKGRpcnR5UmVj
dC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAg
ICAgICBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZlRpbGUoZGlydHlUaWxlUmVj
dCwgdGlsZSk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZm
ZXIqIG5hdGl2ZUJ1ZmZlcgorICAgICAgICAgICAgPSB0aWxlLT5iYWNrQnVmZmVyKCktPm5hdGl2
ZUJ1ZmZlcigpOworCisgICAgICAgIGlmIChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dp
bmRvdykgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX2JsaXRHZW5lcmF0aW9u
TG9jayk7CisgICAgICAgICAgICB3aGlsZSAobV9ibGl0R2VuZXJhdGlvbiA9PSB0aWxlLT5iYWNr
QnVmZmVyKCktPmJsaXRHZW5lcmF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgZXJyID0g
cHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbV9ibGl0R2VuZXJhdGlvbkNvbmQsICZtX2JsaXRHZW5l
cmF0aW9uTG9jaywgJm1fY3VycmVudEJsaXRFbmQpOworICAgICAgICAgICAgICAgIGlmIChlcnIg
PT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgICAgICsrbV9ibGl0R2VuZXJhdGlvbjsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZF90aW1lZHdhaXQgZmFp
bGVkICglcykiLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRocmVhZF9tdXRl
eF91bmxvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v
IEZJWE1FOiBtb2RpZnkgcmVuZGVyIHRvIHRha2UgYSBWZWN0b3I8SW50UmVjdD4gcGFyYW1ldGVy
IHNvIHdlJ3JlIG5vdCByZWNyZWF0aW5nCisgICAgICAgIC8vIEdyYXBoaWNzQ29udGV4dCBvbiB0
aGUgc3RhY2sgZWFjaCB0aW1lLgorICAgICAgICByZW5kZXJDb250ZW50cyhuYXRpdmVCdWZmZXIs
IG9yaWdpbk9mVGlsZShpbmRleCksIGRpcnR5UmVjdCk7CisKKyAgICAgICAgLy8gQWRkIHRoZSBu
ZXdseSByZW5kZXJlZCByZWdpb24gdG8gdGhlIHRpbGUgc28gaXQgY2FuIGtlZXAgdHJhY2sgZm9y
IGJsaXRzLgorICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmFkZFJlbmRlcmVkUmVnaW9uKGRp
cnR5VGlsZVJlY3QpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBjb250ZW50cyBmb3IgdGhp
cyB0aWxlJ3MgYmFja2J1ZmZlciBhcmUgdmFsaWQgd2hlbgorICAgICAgICAvLyBjb21wYXJlZCB0
byB0aGUgZnJvbnQgYnVmZmVyLgorICAgICAgICBib29sIGJhY2tCdWZmZXJJc1ZhbGlkID0gdGls
ZS0+YmFja0J1ZmZlcigpLT5pc1JlbmRlcmVkKHRpbGUtPmZyb250QnVmZmVyKCktPnJlbmRlcmVk
UmVnaW9uKCkpOworCisgICAgICAgIC8vIE91ciBjdXJyZW50IGRlc2lnbiBkZW1hbmRzIHRoYXQg
dGhlIGJhY2tidWZmZXIgaXMgdmFsaWQgYWZ0ZXIgYW55CisgICAgICAgIC8vIHJlbmRlcmluZyBv
cGVyYXRpb24gc28gYXNzZXJ0IHRoYXQgaGVyZS4gSWYgd2UgaGl0IHRoaXMgYXNzZXJ0IHdlCisg
ICAgICAgIC8vIGtub3cgdGhhdCB3ZSdyZSBkb2luZyBzb21ldGhpbmcgYmFkIHRoYXQgd2lsbCBy
ZXN1bHQgaW4gYXJ0aWZhY3RzLgorICAgICAgICBBU1NFUlQoYmFja0J1ZmZlcklzVmFsaWQpOwor
CisgICAgICAgIC8vIFdlIHdpbGwgbmVlZCBhIHN3YXAgaGVyZSBiZWNhdXNlIG9mIHRoZSBzaGFy
ZWQgYmFjayBidWZmZXIuCisgICAgICAgIGlmIChiYWNrQnVmZmVySXNWYWxpZCkgeworICAgICAg
ICAgICAgdGlsZS0+c3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVz
c2FnZSgpOworICAgICAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVn
aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBkaXJ0eUNvbnRlbnRzUmVjdCA9IFBsYXRmb3Jt
Ojp1bmlvbk9mUmVjdHMoZGlydHlDb250ZW50c1JlY3QsIGRpcnR5UmVjdCk7CisgICAgfQorCisg
ICAgLy8gQ2xpcCB0byB0aGUgdmlzaWJsZSBjb250ZW50IGluY2x1ZGluZyBvdmVyc2Nyb2xsLgor
ICAgIGRpcnR5Q29udGVudHNSZWN0LmludGVyc2VjdCh1bmNsaXBwZWRWaXNpYmxlQ29udGVudHNS
ZWN0KCkpOworICAgIGlmIChkaXJ0eUNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiB0cnVlOworCisgICAgaWYgKCFzaG91bGRCbGl0KQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KworICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBjb25zdAorewor
ICAgIG1fd2ViUGFnZS0+ZC0+cmVxdWVzdExheW91dElmTmVlZGVkKCk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyVmlzaWJsZUNvbnRlbnRzKGJvb2wgcmVuZGVyQ29udGVu
dE9ubHkpCit7CisgICAgUGxhdGZvcm06OkludFJlY3QgcmVuZGVyUmVjdCA9IHNob3VsZERpcmVj
dFJlbmRlcmluZ1RvV2luZG93KCkgPyB2aXNpYmxlQ29udGVudHNSZWN0KCkgOiB2aXNpYmxlVGls
ZXNSZWN0KCk7CisKKyAgICByZW5kZXIocmVuZGVyUmVjdCwgcmVuZGVyQ29udGVudE9ubHkpOwor
ICAgIG1fcmVuZGVyUXVldWUtPmNsZWFyKHJlbmRlclJlY3QsIHRydWUgLypjbGVhclJlZ3VsYXJS
ZW5kZXJKb2JzKi8pOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlckJhY2tp
bmdTdG9yZShib29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIHJlbmRlcihmcm9udFN0YXRl
KCktPmJhY2tpbmdTdG9yZVJlY3QoKSwgcmVuZGVyQ29udGVudE9ubHkpOworfQorCit2b2lkIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMoYm9vbCBmb3JjZSkKK3sKKyAg
ICAvLyBCbGl0dGluZyBtdXN0IG5ldmVyIGhhcHBlbiBmb3IgZGlyZWN0IHJlbmRlcmluZyBjYXNl
LgorICAgIEFTU0VSVCghc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSk7CisKKyAgICBp
ZiAobV9zdXNwZW5kU2NyZWVuVXBkYXRlcykgeworICAgICAgICAvLyBBdm9pZCBjbGllbnQgZ29p
bmcgaW50byBidXN5IGxvb3Agd2hpbGUgdXBkYXRlcyBzdXNwZW5kZWQuCisgICAgICAgIGlmIChm
b3JjZSkKKyAgICAgICAgICAgIG1faGFzQmxpdEpvYnMgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7CisgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNw
YXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0
aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmJs
aXRWaXNpYmxlQ29udGVudHMsIHRoaXMsIGZvcmNlKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBibGl0Q29udGVudHMobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJs
aXR0ZWREZXN0aW5hdGlvblJlY3QoKSwKKyAgICAgICAgICAgICAgICAgbV93ZWJQYWdlLT5jbGll
bnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCksCisgICAgICAg
ICAgICAgICAgIGZvcmNlKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjb3B5UHJl
dmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpCit7CisgICAgUGxhdGZvcm06Oklu
dFJlY3RSZWdpb24gcHJldmlvdXNDb250ZW50c1JlZ2lvbgorICAgICAgICA9IFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMod2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5i
bGl0dGVkUmVnaW9uKCksIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5ibGl0dGVkUmVnaW9uKCkp
OworCisgICAgaWYgKHByZXZpb3VzQ29udGVudHNSZWdpb24uaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+Y29weUZyb21Gcm9u
dFRvQmFjayhwcmV2aW91c0NvbnRlbnRzUmVnaW9uKTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3Rh
dGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihwcmV2aW91c0NvbnRlbnRzUmVnaW9uKTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VP
ZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNraW5nU3Rv
cmVUaWxlKiB0aWxlKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHByZXZpb3VzQ29u
dGVudHNSZWdpb24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RS
ZWdpb25zKHRpbGUtPmZyb250QnVmZmVyKCktPnJlbmRlcmVkUmVnaW9uKCksIHJlY3QpOworCisg
ICAgSW50UmVjdExpc3QgcHJldmlvdXNDb250ZW50c1JlY3RzID0gcHJldmlvdXNDb250ZW50c1Jl
Z2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJldmlvdXNDb250ZW50
c1JlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHByZXZpb3Vz
Q29udGVudHNSZWN0ID0gcHJldmlvdXNDb250ZW50c1JlY3RzLmF0KGkpOworICAgICAgICB0aWxl
LT5iYWNrQnVmZmVyKCktPmFkZFJlbmRlcmVkUmVnaW9uKHByZXZpb3VzQ29udGVudHNSZWN0KTsK
KworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmJsaXRUb0J1ZmZlcigK
KyAgICAgICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIHByZXZpb3Vz
Q29udGVudHNSZWN0LAorICAgICAgICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVm
ZmVyKCksIHByZXZpb3VzQ29udGVudHNSZWN0KTsKKyAgICB9Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6cGFpbnREZWZhdWx0QmFja2dyb3VuZChjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9ybWF0aW9u
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wg
Zmx1c2gpCit7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gUGxh
dGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmQtPnRy
YW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4g
PSBjb250ZW50cy5sb2NhdGlvbigpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzQ2xp
cHBlZCA9IGNvbnRlbnRzOworCisgICAgLy8gV2UgaGF2ZSB0byBwYWludCB0aGUgZGVmYXVsdCBi
YWNrZ3JvdW5kIGluIHRoZSBjYXNlIG9mIG92ZXJ6b29tIGFuZAorICAgIC8vIG1ha2Ugc3VyZSBp
dCBpcyBpbnZhbGlkYXRlZC4KKyAgICBDb2xvciBjb2xvcihtX3dlYlBhZ2UtPnNldHRpbmdzKCkt
Pm92ZXJab29tQ29sb3IoKSk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBvdmVyU2Ny
b2xsUmVnaW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFj
dFJlZ2lvbnMoUGxhdGZvcm06OkludFJlY3QoY29udGVudHNDbGlwcGVkKSwgY29udGVudHNSZWN0
KTsKKworICAgIEludFJlY3RMaXN0IG92ZXJTY3JvbGxSZWN0cyA9IG92ZXJTY3JvbGxSZWdpb24u
cmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG92ZXJTY3JvbGxSZWN0cy5zaXpl
KCk7ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBvdmVyU2Nyb2xsUmVjdCA9IG92
ZXJTY3JvbGxSZWN0cy5hdChpKTsKKyAgICAgICAgb3ZlclNjcm9sbFJlY3QubW92ZSgtb3JpZ2lu
LngoKSwgLW9yaWdpbi55KCkpOworICAgICAgICBvdmVyU2Nyb2xsUmVjdCA9IHRyYW5zZm9ybWF0
aW9uLm1hcFJlY3Qob3ZlclNjcm9sbFJlY3QpOworCisgICAgICAgIGlmICghdHJhbnNmb3JtYXRp
b24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHJvdW5kaW5nIGl0
IGlzIHBvc3NpYmxlIHRoYXQgb3ZlclNjcm9sbFJlY3QgY291bGQgYmUgb2ZmLWJ5LW9uZSBsYXJn
ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gdGhlIHN1cmZhY2Ugc2l6ZSBvZiB0aGUgd2luZG93LiBX
ZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAgICAgIC8vIGl0IHRvIGVu
c3VyZSB0aGF0IGNhbid0IGhhcHBlbi4KKyAgICAgICAgICAgIG92ZXJTY3JvbGxSZWN0LmludGVy
c2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFn
ZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7CisgICAgICAgIH0KKworICAg
ICAgICBjbGVhcldpbmRvdyhvdmVyU2Nyb2xsUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgY29s
b3IucmVkKCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgY29sb3IuYWxwaGEoKSk7Cisg
ICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRDb250ZW50cyhjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBCbGl0dGlu
ZyBtdXN0IG5ldmVyIGhhcHBlbiBmb3IgZGlyZWN0IHJlbmRlcmluZyBjYXNlLgorICAgIC8vIFVz
ZSBpbnZhbGlkYXRlV2luZG93KCkgaW5zdGVhZC4KKyAgICBBU1NFUlQoIXNob3VsZERpcmVjdFJl
bmRlcmluZ1RvV2luZG93KCkpOworCisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8
IG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMgfHwgIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgLy8gQXZv
aWQgY2xpZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIGJsaXQgaXMgaW1wb3NzaWJsZS4K
KyAgICAgICAgaWYgKGZvcmNlKQorICAgICAgICAgICAgbV9oYXNCbGl0Sm9icyA9IGZhbHNlOwor
ICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdl
Q2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0
b3JlUHJpdmF0ZTo6YmxpdENvbnRlbnRzLCB0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBmb3JjZSkp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fZGVmZXJzQmxpdCAmJiAhZm9y
Y2UpIHsKKyAgICAgICAgbV9oYXNCbGl0Sm9icyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICBtX2hhc0JsaXRKb2JzID0gZmFsc2U7CisKKyAgICBCYWNraW5nU3RvcmVHZW9t
ZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0IGNvbnRlbnRzUmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2lu
dCgwLCAwKSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworCisjaWYgREVC
VUdfVklTVUFMSVpFCisgICAgLy8gU3Vic3RpdHV0ZSBhIGRlYnVnUmVjdCB0aGF0IGNvbnNpc3Rz
IG9mIHRoZSB1bmlvbiBvZiB0aGUgYmFja2luZ3N0b3JlIHJlY3QKKyAgICAvLyBhbmQgdGhlIHVp
IHRocmVhZCB2aWV3cG9ydCByZWN0IGluc3RlYWQgb2YgdGhlIG5vcm1hbCBzb3VyY2UgcmVjdCBz
byB3ZQorICAgIC8vIGNhbiB2aXN1YWxpemUgdGhlIGVudGlyZSBiYWNraW5nc3RvcmUgYW5kIHdo
YXQgaXQgaXMgZG9pbmcgd2hlbiB3ZQorICAgIC8vIHNjcm9sbCBhbmQgem9vbSEKKyAgICAvLyBG
SVhNRTogVGhpcyBzaG91bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjouCisg
ICAgV2ViQ29yZTo6SW50UmVjdCBkZWJ1Z1JlY3QgPSBjdXJyZW50U3RhdGUtPmJhY2tpbmdTdG9y
ZVJlY3QoKTsKKyAgICBkZWJ1Z1JlY3QudW5pdGUobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlcklu
dGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIGlmIChkZWJ1Z1JlY3Qu
d2lkdGgoKSA8IGRlYnVnUmVjdC5oZWlnaHQoKSkKKyAgICAgICAgZGVidWdSZWN0LnNldFdpZHRo
KGNlaWwoZG91YmxlKHNyY1JlY3Qud2lkdGgoKSkgKiAoZG91YmxlKGRlYnVnUmVjdC5oZWlnaHQo
KSkgLyBzcmNSZWN0LmhlaWdodCgpKSkpOworICAgIGlmIChkZWJ1Z1JlY3QuaGVpZ2h0KCkgPCBk
ZWJ1Z1JlY3Qud2lkdGgoKSkKKyAgICAgICAgZGVidWdSZWN0LnNldEhlaWdodChjZWlsKGRvdWJs
ZShzcmNSZWN0LmhlaWdodCgpKSAqIChkb3VibGUoZGVidWdSZWN0LndpZHRoKCkpIC8gc3JjUmVj
dC53aWR0aCgpKSkpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzID0gZGVidWdSZWN0
OworI2Vsc2UKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50cyA9IHNyY1JlY3Q7CisjZW5k
aWYKKworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9u
IFdlYkNvcmU6Oi4KKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1hdGlvbiA9IFRy
YW5zZm9ybWF0aW9uTWF0cml4OjpyZWN0VG9SZWN0KAorICAgICAgICBGbG9hdFJlY3QoRmxvYXRQ
b2ludCgwLjAsIDAuMCksIFdlYkNvcmU6OkludFNpemUoY29udGVudHMuc2l6ZSgpKSksIFdlYkNv
cmU6OkludFJlY3QoZHN0UmVjdCkpOworCisgICAgYm9vbCBibGl0dGluZ0RpcmVjdGx5VG9Db21w
b3NpdGluZ1dpbmRvdyA9IG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dV
c2FnZSgpID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVz
YWdlOworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBCYWNraW5nU3RvcmVD
b21wb3NpdGluZ1N1cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQ
b29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlm
ICghYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpCisgICAgICAgIGRyYXdTdWJM
YXllcnMoKTsKKyNlbmRpZgorCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29u
dGVudHMgZHN0UmVjdD0oJWQsJWQgJWR4JWQpIHNyY1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qu
d2lkdGgoKSwgZHN0UmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNy
Y1JlY3QueCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgp
KTsKKyNlbmRpZgorCisgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IGNvbnRlbnRzLmxv
Y2F0aW9uKCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNDbGlwcGVkID0gY29udGVu
dHM7CisKKyAgICBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGNvbnRlbnRzLCB0cmFuc2Zvcm1hdGlv
biwgZmFsc2UgLypmbHVzaCovKTsKKworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRT
dGF0ZS0+dGlsZU1hcCgpOworCisgICAgLy8gRG9uJ3QgY2xpcCB0byBjb250ZW50cyBpZiBpdCBp
cyBlbXB0eSBzbyB3ZSBjYW4gc3RpbGwgcGFpbnQgZGVmYXVsdCBiYWNrZ3JvdW5kLgorICAgIGlm
ICghY29udGVudHNSZWN0LmlzRW1wdHkoKSkgeworICAgICAgICBjb250ZW50c0NsaXBwZWQuaW50
ZXJzZWN0KGNvbnRlbnRzUmVjdCk7CisgICAgICAgIGlmIChjb250ZW50c0NsaXBwZWQuaXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlV2luZG93KGRzdFJlY3QpOworICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24g
Y29udGVudHNSZWdpb24gPSBjb250ZW50c0NsaXBwZWQ7CisgICAgICAgIFBsYXRmb3JtOjpJbnRS
ZWN0UmVnaW9uIGJhY2tpbmdTdG9yZVJlZ2lvbiA9IGN1cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3Jl
UmVjdCgpOworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBjaGVja2VyZWRSZWdpb24K
KyAgICAgICAgICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhj
b250ZW50c1JlZ2lvbiwgYmFja2luZ1N0b3JlUmVnaW9uKTsKKworICAgICAgICAvLyBCbGl0IGNo
ZWNrZXJlZCB0byB0aG9zZSBwYXJ0cyB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgYmFja2lu
Z1N0b3JlUmVjdC4KKyAgICAgICAgSW50UmVjdExpc3QgY2hlY2tlcmVkUmVjdHMgPSBjaGVja2Vy
ZWRSZWdpb24ucmVjdHMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGVja2Vy
ZWRSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZHN0
UmVjdCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QoUGxhdGZvcm06OkludFJlY3QoCisgICAgICAg
ICAgICAgICAgUGxhdGZvcm06OkludFBvaW50KGNoZWNrZXJlZFJlY3RzLmF0KGkpLngoKSAtIG9y
aWdpbi54KCksIGNoZWNrZXJlZFJlY3RzLmF0KGkpLnkoKSAtIG9yaWdpbi55KCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyZWRSZWN0cy5hdChpKS5zaXplKCkp
KTsKKyAgICAgICAgICAgIGNoZWNrZXJXaW5kb3coZHN0UmVjdCwgY2hlY2tlcmVkUmVjdHMuYXQo
aSkubG9jYXRpb24oKSwgdHJhbnNmb3JtYXRpb24uYSgpKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIFZlY3RvcjxUaWxlQnVmZmVyKj4gYmxpdHRlZFRpbGVzOworCisgICAgLy8gR2V0IHRoZSBs
aXN0IG9mIHRpbGUgcmVjdHMgdGhhdCBtYWtldXAgdGhlIGNvbnRlbnQuCisgICAgVGlsZVJlY3RM
aXN0IHRpbGVSZWN0TGlzdCA9IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb250
ZW50c0NsaXBwZWQsIGN1cnJlbnRTdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0
aWxlUmVjdExpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3QgPSB0
aWxlUmVjdExpc3RbaV07CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0
OworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vj
b25kOworICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gY3VycmVudE1hcC5nZXQoaW5k
ZXgpOworICAgICAgICBUaWxlQnVmZmVyKiB0aWxlQnVmZmVyID0gdGlsZS0+ZnJvbnRCdWZmZXIo
KTsKKworICAgICAgICAvLyBUaGlzIGRpcnR5IHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRlcywg
YnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNv
b3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QKKyAgICAgICAg
ICAgID0gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBjdXJyZW50
U3RhdGUtPmJhY2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAgICAgLy8gRG9uJ3QgY2xpcCB0byBj
b250ZW50cyBpZiBpdCBpcyBlbXB0eSBzbyB3ZSBjYW4gc3RpbGwgcGFpbnQgZGVmYXVsdCBiYWNr
Z3JvdW5kLgorICAgICAgICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ICAgIC8vIE90aGVyd2lzZSB3ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQgYmxp
dC4KKyAgICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QoY29udGVudHNSZWN0KTsKKworICAg
ICAgICAgICAgLy8gV2UgcHJvYmFibHkgaGF2ZSBleHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVu
dHMgc2l6ZSBpcyBzbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVy
ZS4uLgorICAgICAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHRoaXMgZGlydHkgcmVj
dCBpcyBpbiB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAg
Ly8gdHJhbnNmb3JtZWQgY29udGVudHMsIGJ1dCB1bHRpbWF0ZWx5IGl0IG5lZWRzIHRvIGJlIHRy
YW5zZm9ybWVkCisgICAgICAgIC8vIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9y
dC4KKyAgICAgICAgZGlydHlSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKwor
ICAgICAgICAvLyBTYXZlIHNvbWUgY3ljbGVzIGhlcmUuLi4KKyAgICAgICAgaWYgKGRpcnR5UmVj
dC5pc0VtcHR5KCkgfHwgZGlydHlUaWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250
aW51ZTsKKworICAgICAgICBUaWxlUmVjdCB3aG9sZVRpbGVSZWN0OworICAgICAgICB3aG9sZVRp
bGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAgICAgIHdob2xlVGlsZVJlY3Quc2Vjb25kID0gdGhp
cy0+dGlsZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0CisgICAg
ICAgICAgICA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh3aG9sZVRpbGVSZWN0
LCBjdXJyZW50U3RhdGUtPmJhY2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAgICAgYm9vbCBjb21t
aXR0ZWQgPSB0aWxlLT5pc0NvbW1pdHRlZCgpOworICAgICAgICBib29sIHJlbmRlcmVkID0gdGls
ZUJ1ZmZlci0+aXNSZW5kZXJlZChkaXJ0eVRpbGVSZWN0KTsKKyAgICAgICAgYm9vbCBwYWludENo
ZWNrZXJlZCA9ICFjb21taXR0ZWQgfHwgIXJlbmRlcmVkOworCisgICAgICAgIGlmIChwYWludENo
ZWNrZXJlZCkgeworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9IHRy
YW5zZm9ybWF0aW9uLm1hcFJlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCF0cmFu
c2Zvcm1hdGlvbi5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9m
IHJvdW5kaW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgZGlydHlSZWN0IGNvdWxkIGJlIG9mZi1ieS1v
bmUgbGFyZ2VyCisgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBzaXplIG9mIHRo
ZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAg
ICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgICAgICAg
ICAgZGlydHlSZWN0VC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBv
aW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50IGNv
bnRlbnRzT3JpZ2luKGRpcnR5UmVjdC54KCkgKyBvcmlnaW4ueCgpLCBkaXJ0eVJlY3QueSgpICsg
b3JpZ2luLnkoKSk7CisgICAgICAgICAgICBjaGVja2VyV2luZG93KGRpcnR5UmVjdFQsIGNvbnRl
bnRzT3JpZ2luLCB0cmFuc2Zvcm1hdGlvbi5hKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8g
QmxpdCB0aGUgdmlzaWJsZSBidWZmZXIgaGVyZSBpZiB3ZSBoYXZlIHZpc2libGUgem9vbSBqb2Jz
LgorICAgICAgICBpZiAobV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZpc2libGVab29tSm9iKCkp
IHsKKworICAgICAgICAgICAgLy8gTmVlZHMgdG8gYmUgaW4gc2FtZSBjb29yZGluYXRlIHN5c3Rl
bSBhcyBkaXJ0eVJlY3QuCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlVGls
ZUJ1ZmZlclJlY3QgPSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdDsKKyAgICAgICAgICAgIHZpc2li
bGVUaWxlQnVmZmVyUmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7CisKKyAgICAg
ICAgICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGVUaWxlQnVmZmVyUmVjdC4KKyAgICAgICAgICAg
IGRpcnR5UmVjdC5pbnRlcnNlY3QodmlzaWJsZVRpbGVCdWZmZXJSZWN0KTsKKworICAgICAgICAg
ICAgLy8gQ2xpcCB0byB0aGUgZGlydHlSZWN0LgorICAgICAgICAgICAgdmlzaWJsZVRpbGVCdWZm
ZXJSZWN0LmludGVyc2VjdChkaXJ0eVJlY3QpOworCisgICAgICAgICAgICBpZiAoIWRpcnR5UmVj
dC5pc0VtcHR5KCkgJiYgIXZpc2libGVUaWxlQnVmZmVyUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB2aXNpYmxlVGlsZUJ1ZmZlcgorICAgICAgICAg
ICAgICAgICAgICA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT52aXNpYmxlVGls
ZUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIEFTU0VSVCh2aXNpYmxlVGlsZUJ1ZmZlci0+c2l6
ZSgpID09IHZpc2libGVDb250ZW50c1JlY3QoKS5zaXplKCkpOworCisgICAgICAgICAgICAgICAg
Ly8gVGhlIG9mZnNldCBvZiB0aGUgY3VycmVudCB2aWV3cG9ydCB3aXRoIHRoZSB2aXNibGUgdGls
ZSBidWZmZXIuCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVuY2Ug
PSBvcmlnaW4gLSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAgICAg
ICAgICAgIFBsYXRmb3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRpZmZl
cmVuY2UueCgpLCBkaWZmZXJlbmNlLnkoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXAgdG8g
dGhlIHZpc2libGVUaWxlQnVmZmVyIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB2aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisgICAg
ICAgICAgICAgICAgZGlydHlUaWxlUmVjdC5tb3ZlKG9mZnNldC53aWR0aCgpLCBvZmZzZXQuaGVp
Z2h0KCkpOworCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9
IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGlm
ICghdHJhbnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8v
IEJlY2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMgcG9zc2libGUgdGhhdCBkaXJ0eVJlY3QgY291bGQg
YmUgb2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgc3Vy
ZmFjZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xh
bXBpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFw
cGVuLgorICAgICAgICAgICAgICAgICAgICBkaXJ0eVJlY3RULmludGVyc2VjdChQbGF0Zm9ybTo6
SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndp
bmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAgICAgYmxpdFRvV2luZG93KGRpcnR5UmVjdFQsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZpc2libGVUaWxlQnVmZmVyLT5mcm9udEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlydHlUaWxlUmVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZmFsc2UgLypibGVuZCovLCAyNTUpOworICAgICAgICAgICAgfQorICAg
ICAgICB9IGVsc2UgaWYgKGNvbW1pdHRlZCkgeworICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRo
ZSByZW5kZXJlZCByZWdpb24uCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBy
ZW5kZXJlZFJlZ2lvbiA9IHRpbGVCdWZmZXItPnJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgICAg
ICBJbnRSZWN0TGlzdCBkaXJ0eVJlbmRlcmVkUmVjdHMgPSByZW5kZXJlZFJlZ2lvbi5yZWN0cygp
OworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXJ0eVJlbmRlcmVkUmVjdHMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdDsKKyAgICAg
ICAgICAgICAgICB0aWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgICAgICAgICAgICAgIHRpbGVS
ZWN0LnNlY29uZCA9IGludGVyc2VjdGlvbihkaXJ0eVRpbGVSZWN0LCBkaXJ0eVJlbmRlcmVkUmVj
dHMuYXQoaSkpOworICAgICAgICAgICAgICAgIGlmICh0aWxlUmVjdC5zZWNvbmQuaXNFbXB0eSgp
KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBCbGl0
IHRoZSByZW5kZXJlZCBwYXJ0cy4KKyAgICAgICAgICAgICAgICBibGl0VGlsZVJlY3QodGlsZUJ1
ZmZlciwgdGlsZVJlY3QsIG9yaWdpbiwgdHJhbnNmb3JtYXRpb24sIGN1cnJlbnRTdGF0ZSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBibGl0dGVkVGlsZXMuYXBwZW5kKHRpbGVCdWZmZXIp
OworICAgICAgICB9CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
ICAgIGlmIChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBX
ZWJDb3JlOjpGbG9hdFJlY3QgY29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJh
bnNmb3JtZWRGbG9hdFJlY3QoCisgICAgICAgICAgICBXZWJDb3JlOjpGbG9hdFJlY3QoV2ViQ29y
ZTo6SW50UmVjdChjb250ZW50cykpKTsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5kcmF3U3ViTGF5
ZXJzKGRzdFJlY3QsIGNvbnRlbnRzUmVjdCk7CisgICAgfSBlbHNlIGlmIChjb21wb3NpdGluZ1N1
cmZhY2UpCisgICAgICAgIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGRzdFJlY3QpOworCisjZW5k
aWYKKworI2lmIEVOQUJMRV9TQ1JPTExCQVJTCisgICAgaWYgKGlzU2Nyb2xsaW5nT3Jab29taW5n
KCkgJiYgbV9jbGllbnQtPmlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgaWYgKG1fY2xpZW50LT5z
Y3JvbGxzSG9yaXpvbnRhbGx5KCkpCisgICAgICAgICAgICBibGl0SG9yaXpvbnRhbFNjcm9sbGJh
cihvcmlnaW4pOworICAgICAgICBpZiAobV9jbGllbnQtPnNjcm9sbHNWZXJ0aWNhbGx5KCkpCisg
ICAgICAgICAgICBibGl0VmVydGljYWxTY3JvbGxiYXIob3JpZ2luKTsKKyAgICB9CisjZW5kaWYK
KworI2lmIERFQlVHX1ZJU1VBTElaRQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhw
bGljaXRlbHkgZGVwZW5kIG9uIFdlYkNvcmU6Oi4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OkJ1ZmZlciogd2luZG93QnVmZmVyID0KKyAgICAgICAgbV93ZWJQYWdlLT5jbGll
bnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6RHJhd2FibGUqIGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpsb2NrQnVmZmVyRHJhd2FibGUod2luZG93QnVmZmVyKTsKKyAgICBQ
bGF0Zm9ybUdyYXBoaWNzQ29udGV4dCogYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPQor
ICAgICAgICBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y3JlYXRlUGxhdGZvcm1H
cmFwaGljc0NvbnRleHQoYnVmZmVyRHJhd2FibGUpOworICAgIEdyYXBoaWNzQ29udGV4dCBncmFw
aGljc0NvbnRleHQoYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworICAgIEZsb2F0UmVj
dCB3a1ZpZXdwb3J0ID0gRmxvYXRSZWN0KHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgRmxv
YXRSZWN0IHVpVmlld3BvcnQgPSBGbG9hdFJlY3QobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlcklu
dGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIHdrVmlld3BvcnQubW92
ZSgtY29udGVudHMueCgpLCAtY29udGVudHMueSgpKTsKKyAgICB1aVZpZXdwb3J0Lm1vdmUoLWNv
bnRlbnRzLngoKSwgLWNvbnRlbnRzLnkoKSk7CisKKyAgICBncmFwaGljc0NvbnRleHQuc2F2ZSgp
OworCisgICAgLy8gRHJhdyBhIGJsdWUgcmVjdCBmb3IgdGhlIHdlYmtpdCB0aHJlYWQgdmlld3Bv
cnQuCisgICAgZ3JhcGhpY3NDb250ZXh0LnNldFN0cm9rZUNvbG9yKFdlYkNvcmU6OkNvbG9yKDAs
IDAsIDI1NSksIFdlYkNvcmU6OkNvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGdyYXBoaWNzQ29u
dGV4dC5zdHJva2VSZWN0KHRyYW5zZm9ybWF0aW9uLm1hcFJlY3Qod2tWaWV3cG9ydCksIDEuMCk7
CisKKyAgICAvLyBEcmF3IGEgcmVkIHJlY3QgZm9yIHRoZSB1aSB0aHJlYWQgdmlld3BvcnQuCisg
ICAgZ3JhcGhpY3NDb250ZXh0LnNldFN0cm9rZUNvbG9yKFdlYkNvcmU6OkNvbG9yKDI1NSwgMCwg
MCksIFdlYkNvcmU6OkNvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGdyYXBoaWNzQ29udGV4dC5z
dHJva2VSZWN0KHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QodWlWaWV3cG9ydCksIDEuMCk7CisKKyAg
ICBncmFwaGljc0NvbnRleHQucmVzdG9yZSgpOworCisgICAgZGVsZXRlIGJ1ZmZlclBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0OworICAgIHJlbGVhc2VCdWZmZXJEcmF3YWJsZSh3aW5kb3dCdWZmZXIp
OworI2VuZGlmCisKKyAgICBpbnZhbGlkYXRlV2luZG93KGRzdFJlY3QpOworCisgICAgaWYgKGJs
aXR0aW5nRGlyZWN0bHlUb0NvbXBvc2l0aW5nV2luZG93KSB7CisgICAgICAgIHB0aHJlYWRfbXV0
ZXhfbG9jaygmbV9ibGl0R2VuZXJhdGlvbkxvY2spOworCisgICAgICAgICsrbV9ibGl0R2VuZXJh
dGlvbjsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBibGl0dGVkVGlsZXMu
c2l6ZSgpOyArK2kpCisgICAgICAgICAgICBibGl0dGVkVGlsZXNbaV0tPnNldEJsaXRHZW5lcmF0
aW9uKG1fYmxpdEdlbmVyYXRpb24pOworCisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVB
TFRJTUUsICZtX2N1cnJlbnRCbGl0RW5kKTsKKyAgICAgICAgbV9jdXJyZW50QmxpdEVuZC50dl9u
c2VjICs9IDMwICogMTAwMCAqIDEwMDA7CisgICAgICAgIGlmIChtX2N1cnJlbnRCbGl0RW5kLnR2
X25zZWMgPj0gMTAwMDAwMDAwMEwpIHsKKyAgICAgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZf
c2VjICArPSAxOworICAgICAgICAgICAgbV9jdXJyZW50QmxpdEVuZC50dl9uc2VjIC09IDEwMDAw
MDAwMDBMOworICAgICAgICB9CisKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fYmxp
dEdlbmVyYXRpb25Mb2NrKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbV9ibGl0R2Vu
ZXJhdGlvbkNvbmQpOworICAgIH0KK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6YmxpdFRpbGVSZWN0KFRpbGVCdWZmZXIqIHRpbGVCdWZmZXIsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaWxlUmVjdCYg
dGlsZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9y
bWF0aW9uTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpCit7CisgICAgaWYg
KCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm4g
UGxhdGZvcm06OkludFJlY3QoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJl
Y3QgPSB0aWxlUmVjdC5zZWNvbmQ7CisKKyAgICAvLyBUaGlzIGRpcnR5IHJlY3QgaXMgaW4gdGls
ZSBjb29yZGluYXRlcywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgLy8gdHJhbnNmb3JtZWQg
Y29udGVudHMgY29vcmRpbmF0ZXMuCisgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0ID0g
bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBzdGF0ZS0+YmFja2lu
Z1N0b3JlUmVjdCgpKTsKKworICAgIC8vIE5vdywgdGhpcyBkaXJ0eSByZWN0IGlzIGluIHRyYW5z
Zm9ybWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZQorICAgIC8vIHRyYW5zZm9ybWVkIGNv
bnRlbnRzLCBidXQgdWx0aW1hdGVseSBpdCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZAorICAgIC8v
IGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgICBkaXJ0eVJlY3QubW92
ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworICAgIGRpcnR5UmVjdCA9IG1hdHJpeC5tYXBS
ZWN0KGRpcnR5UmVjdCk7CisKKyAgICBpZiAoIW1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAg
ICAgLy8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBj
b3VsZCBiZSBvZmYtYnktb25lIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSBzdXJmYWNlIHNp
emUgb2YgdGhlIGRzdCBidWZmZXIuIFdlIHByZXZlbnQgdGhpcyBoZXJlLCBieSBjbGFtcGluZwor
ICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgIGRpcnR5
UmVjdC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDAp
LCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgIH0K
KworICAgIEFTU0VSVCghZGlydHlSZWN0LmlzRW1wdHkoKSk7CisgICAgQVNTRVJUKCFkaXJ0eVRp
bGVSZWN0LmlzRW1wdHkoKSk7CisgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkgfHwgZGlydHlU
aWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOwor
CisgICAgYmxpdFRvV2luZG93KGRpcnR5UmVjdCwgdGlsZUJ1ZmZlci0+bmF0aXZlQnVmZmVyKCks
IGRpcnR5VGlsZVJlY3QsCisgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxlbmQqLywgMjU1KTsK
KyAgICByZXR1cm4gZGlydHlSZWN0OworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lU
SU5HKQordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGVuZENvbXBvc2l0aW5nU3VyZmFjZShj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCkKK3sKKyAgICBpZiAoIUJsYWNrQmVycnk6
OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRU
aHJlYWQoKSkgeworICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFj
a2luZ1N0b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
KTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNz
YWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJhY2tpbmdTdG9y
ZVByaXZhdGUsIFBsYXRmb3JtOjpJbnRSZWN0PigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0
b3JlUHJpdmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZhY2UsIHRoaXMsIGRzdFJlY3QpKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFj
ZSogY29tcG9zaXRpbmdTdXJmYWNlID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZh
Y2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpOworCisgICAgaWYgKCFjb21wb3NpdGluZ1N1
cmZhY2UgfHwgIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IFdlYkNvcmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzID0g
bV93ZWJQYWdlLT5kLT5sYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCk7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzLmhvbGVQdW5jaFJlY3RTaXplKCk7IGkr
KykgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBob2xlUHVuY2hSZWN0ID0gbGFzdENvbXBv
c2l0aW5nUmVzdWx0cy5ob2xlUHVuY2hSZWN0KGkpOworCisgICAgICAgIGhvbGVQdW5jaFJlY3Qu
aW50ZXJzZWN0KGRzdFJlY3QpOworICAgICAgICBob2xlUHVuY2hSZWN0LmludGVyc2VjdChQbGF0
Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93
ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKworICAgICAgICBp
ZiAoIWhvbGVQdW5jaFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgY2xlYXJXaW5kb3coaG9s
ZVB1bmNoUmVjdCwgMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgQ29tcG9zaXRpbmdTdXJmYWNl
QnVmZmVyKiBmcm9udEJ1ZmZlciA9IGNvbXBvc2l0aW5nU3VyZmFjZS0+ZnJvbnRCdWZmZXIoKTsK
KworICAgIEludFJlY3RMaXN0IHJlY3RzID0gbGFzdENvbXBvc2l0aW5nUmVzdWx0cy5kaXJ0eVJl
Z2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgcmVjdHNbaV0uaW50ZXJzZWN0KGRzdFJlY3QpOworI2lmIERFQlVHX0NP
TVBPU0lUSU5HX0RJUlRZX1JFR0lPTgorICAgICAgICBjbGVhckJ1ZmZlcihtX3dlYlBhZ2UtPmNs
aWVudCgpLT53aW5kb3coKS0+YnVmZmVyKCksIHJlY3RzW2ldLCAyNTUsIDAsIDAsIDEyOCk7Cisj
ZW5kaWYKKyAgICAgICAgYmxpdFRvV2luZG93KHJlY3RzW2ldLCBmcm9udEJ1ZmZlci0+bmF0aXZl
QnVmZmVyKCksIHJlY3RzW2ldLCB0cnVlIC8qYmxlbmQqLywgMjU1KTsKKyAgICB9Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJDb21wb3NpdGluZ1N1cmZhY2UoKQoreworICAg
IEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9zaXRpbmdTdXJmYWNlID0KKyAg
ICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFj
ZSgpOworCisgICAgaWYgKCFjb21wb3NpdGluZ1N1cmZhY2UpCisgICAgICAgIHJldHVybjsKKwor
ICAgIENvbXBvc2l0aW5nU3VyZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGluZ1N1
cmZhY2UtPmZyb250QnVmZmVyKCk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpjbGVhckJ1ZmZlcihmcm9udEJ1ZmZlci0+bmF0aXZlQnVmZmVyKCksIFBsYXRmb3JtOjpJbnRS
ZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgpLCBmcm9udEJ1ZmZlci0+c3VyZmFjZVNpemUoKSksIDAs
IDAsIDAsIDApOworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0SG9yaXpvbnRhbFNjcm9sbGJhcihjb25zdCBQ
bGF0Zm9ybTo6SW50UG9pbnQmIHNjcm9sbFBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdl
LT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fY2xpZW50LT5z
Y3JvbGxzSG9yaXpvbnRhbGx5KCkpOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd0hv
cml6b250YWxTY3JvbGxiYXIoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0
VmVydGljYWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlv
bikKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIEFTU0VSVChtX2NsaWVudC0+c2Nyb2xsc1ZlcnRpY2FsbHkoKSk7CisKKyAgICBtX3dl
YlBhZ2UtPmNsaWVudCgpLT5kcmF3VmVydGljYWxTY3JvbGxiYXIoKTsKK30KKworYm9vbCBCYWNr
aW5nU3RvcmVQcml2YXRlOjppc1RpbGVWaXNpYmxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNv
bnN0Cit7CisgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRl
eDsKKyAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIHJldHVybiBt
YXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpLmludGVyc2VjdHModmlz
aWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc1Rp
bGVWaXNpYmxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luKSBjb25zdAoreworICAg
IHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW4sIHRpbGVTaXplKCkpLmludGVyc2VjdHMo
dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6dmlzaWJsZVRpbGVzUmVjdCgpIGNvbnN0Cit7CisgICAgQmFja2luZ1N0b3Jl
R2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJl
bnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHJlY3Q7CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQo
KTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAg
ICAgIHRpbGVSZWN0LmZpcnN0ID0gaXQtPmZpcnN0OworICAgICAgICB0aWxlUmVjdC5zZWNvbmQg
PSB0aGlzLT50aWxlUmVjdCgpOworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlID0gbWFw
RnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KTsKKyAgICAgICAgaWYgKHRp
bGUuaW50ZXJzZWN0cyh2aXNpYmxlQ29udGVudHNSZWN0KCkpKQorICAgICAgICAgICAgcmVjdCA9
IFBsYXRmb3JtOjp1bmlvbk9mUmVjdHMocmVjdCwgdGlsZSk7CisgICAgfQorICAgIHJldHVybiBy
ZWN0OworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlVmlz
aWJsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIGlm
ICghaXNUaWxlVmlzaWJsZShpbmRleCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVj
dCgpOworCisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIHZpc2libGVDb250ZW50
c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRp
bGVVbmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNv
bnN0Cit7CisgICAgaWYgKCFpc1RpbGVWaXNpYmxlKGluZGV4KSkKKyAgICAgICAgcmV0dXJuIFBs
YXRmb3JtOjpJbnRSZWN0KCk7CisKKyAgICByZXR1cm4gdGlsZUNvbnRlbnRzUmVjdChpbmRleCwg
dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3Qg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGlu
ZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cykgY29uc3QKK3sKKyAgICByZXR1
cm4gdGlsZUNvbnRlbnRzUmVjdChpbmRleCwgY29udGVudHMsIGZyb250U3RhdGUoKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50c1JlY3Qo
Y29uc3QgVGlsZUluZGV4JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
QmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKSBjb25zdAoreworICAgIFRpbGVSZWN0TGlzdCB0
aWxlUmVjdExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29udGVudHMs
IHN0YXRlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVSZWN0TGlzdC5zaXplKCk7
ICsraSkgeworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlzdFtpXTsKKyAg
ICAgICAgaWYgKGluZGV4ID09IHRpbGVSZWN0LmZpcnN0KQorICAgICAgICAgICAgcmV0dXJuIHRp
bGVSZWN0LnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRSZW5kZXJRdWV1ZSgpCit7CisgICAg
bV9yZW5kZXJRdWV1ZS0+cmVzZXQoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpj
bGVhclZpc2libGVab29tKCkKK3sKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhclZpc2libGVab29t
KCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlcyhib29sIHJlc2V0
QmFja2dyb3VuZCkKK3sKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0g
ZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGls
ZU1hcCgpOworCisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5l
bmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIHJlc2V0VGlsZShpdC0+Zmlyc3QsIGl0
LT5zZWNvbmQsIHJlc2V0QmFja2dyb3VuZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6dXBkYXRlVGlsZXMoYm9vbCB1cGRhdGVWaXNpYmxlLCBib29sIGltbWVkaWF0ZSkKK3sKKyAg
ICBpZiAoIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEJhY2tpbmdTdG9yZUdl
b21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50
TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBUaWxlTWFwOjpjb25zdF9pdGVy
YXRvciBlbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAg
ICBib29sIGlzVmlzaWJsZSA9IGlzVGlsZVZpc2libGUoaXQtPmZpcnN0KTsKKyAgICAgICAgaWYg
KCF1cGRhdGVWaXNpYmxlICYmIGlzVmlzaWJsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICB1cGRhdGVUaWxlKGl0LT5maXJzdCwgaW1tZWRpYXRlKTsKKyAgICB9Cit9CisKK3ZvaWQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVn
aW9uKGJvb2wgY2hlY2tMb2FkaW5nKQoreworICAgIC8vIFRoaXMgbWV0aG9kIGxvb2tzIGF0IGFs
bCB0aGUgdGlsZXMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGJ1dCBub3QgY29tcGxldGVseQor
ICAgIC8vIHJlbmRlcmVkIG9yIHdlIGFyZSBsb2FkaW5nLCB0aGVuIGl0IHVwZGF0ZXMgdGhlbS4g
Rm9yIGFsbCB0aWxlcywgdmlzaWJsZSBhbmQKKyAgICAvLyBub24tdmlzaWJsZSwgaWYgYSBwcmV2
aW91cyBhdHRlbXB0IHdhcyBtYWRlIHRvIHJlbmRlciB0aGVtIGR1cmluZyBhIHJlZ3VsYXIKKyAg
ICAvLyByZW5kZXIgam9iLCBidXQgdGhleSB3ZXJlIG5vdCB2aXNpYmxlIGF0IHRoZSB0aW1lLCB0
aGVuIHVwZGF0ZSB0aGVtIGFuZCBpZgorICAgIC8vIHRoZXkgYXJlIGN1cnJlbnRseSB2aXNpYmxl
LCByZXNldCB0aGVtLgorCisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9
IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRp
bGVNYXAoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gY3VycmVu
dFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCk7CisKKyAgICBib29sIGlzTG9hZGluZyA9IG1fY2xp
ZW50LT5sb2FkU3RhdGUoKSA9PSBXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVkOworICAgIGJvb2wg
Zm9yY2VWaXNpYmxlID0gY2hlY2tMb2FkaW5nICYmIGlzTG9hZGluZzsKKworICAgIFRpbGVNYXA6
OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFw
Ojpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGl0LT5maXJzdDsKKyAgICAgICAgQmFja2lu
Z1N0b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgaXNWaXNpYmxlID0g
aXNUaWxlVmlzaWJsZShpbmRleCk7CisgICAgICAgIC8vIFRoZSByZWN0IGluIHRyYW5zZm9ybWVk
IGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCByZWN0KG9y
aWdpbk9mVGlsZShpbmRleCksIHRpbGVTaXplKCkpOworICAgICAgICBpZiAodGlsZS0+aXNDb21t
aXR0ZWQoKQorICAgICAgICAgICAgJiYgbV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNQ
cmV2aW91c2x5QXR0ZW1wdGVkQnV0Tm90UmVuZGVyZWQocmVjdCkpIHsKKyAgICAgICAgICAgIC8v
IElmIHRoZSByZW5kZXIgcXVldWUgcHJldmlvdXNseSB0cmllZCB0byByZW5kZXIgdGhpcyB0aWxl
LCBidXQgdGhlCisgICAgICAgICAgICAvLyB0aWxlIHdhc24ndCB2aXNpYmxlIGF0IHRoZSB0aW1l
IHdlIGNhbid0IHNpbXBseSByZXN0b3JlIHRoZSB0aWxlCisgICAgICAgICAgICAvLyBzaW5jZSB0
aGUgY29udGVudCBpcyBub3cgaW52YWxpZCBhcyBmYXIgYXMgV2ViS2l0IGlzIGNvbmNlcm5lZC4K
KyAgICAgICAgICAgIC8vIEluc3RlYWQsIHdlIGNsZWFyIHRoYXQgcGFydCBvZiB0aGUgdGlsZSBp
ZiBpdCBpcyB2aXNpYmxlIGFuZCB0aGVuCisgICAgICAgICAgICAvLyBwdXQgdGhlIHRpbGUgaW4g
dGhlIHJlbmRlciBxdWV1ZSBhZ2Fpbi4KKyAgICAgICAgICAgIGlmIChpc1Zpc2libGUpIHsKKyAg
ICAgICAgICAgICAgICAvLyBJbnRlcnNlY3QgdGhlIHRpbGUgd2l0aCB0aGUgbm90IHJlbmRlcmVk
IHJlZ2lvbiB0byBnZXQgdGhlIGFyZWFzCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHRpbGUg
dGhhdCB3ZSBuZWVkIHRvIGNsZWFyLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uIHRpbGVOb3RSZW5kZXJlZFJlZ2lvbgorICAgICAgICAgICAgICAgICAgICA9IFBsYXRm
b3JtOjpJbnRSZWN0UmVnaW9uOjppbnRlcnNlY3RSZWdpb25zKAorICAgICAgICAgICAgICAgICAg
ICAgICAgbV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbigp
LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgICAgICAgICAgICAgY2xlYXJB
bmRVcGRhdGVUaWxlT2ZOb3RSZW5kZXJlZFJlZ2lvbihpbmRleCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlTm90UmVuZGVyZWRS
ZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBiYWNraW5nU3RvcmVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyp1cGRhdGUqLyk7CisjaWYgREVCVUdfQkFDS0lO
R1NUT1JFCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IHRpbGVO
b3RSZW5kZXJlZFJlZ2lvbi5leHRlbnRzKCk7CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAg
ICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVzRm9yU2Ny
b2xsIGRpZCBjbGVhciB0aWxlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXh0
ZW50cy54KCksIGV4dGVudHMueSgpLCBleHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVpZ2h0KCkp
OworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVUaWxlKGluZGV4LCBm
YWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1Zpc2libGUKKyAgICAg
ICAgICAgICYmIChmb3JjZVZpc2libGUgfHwgIXRpbGUtPmZyb250QnVmZmVyKCktPmlzUmVuZGVy
ZWQodGlsZVZpc2libGVDb250ZW50c1JlY3QoaW5kZXgpKSkKKyAgICAgICAgICAgICYmICFpc0N1
cnJlbnRWaXNpYmxlSm9iKGluZGV4LCB0aWxlLCBiYWNraW5nU3RvcmVSZWN0KSkKKyAgICAgICAg
ICAgIHVwZGF0ZVRpbGUoaW5kZXgsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworICAgIH0KK30KKwor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZXNldFRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRl
eCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwgYm9vbCByZXNldEJhY2tncm91bmQpCit7CisgICAg
aWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
IWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRTaG91bGRSZXNldFRpbGVz
V2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVGlsZVJlY3Qg
dGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICB0aWxlUmVjdC5zZWNv
bmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIC8vIE9ubHkgY2xlYXIgcmVndWxhciByZW5kZXIg
am9icyBpZiB3ZSdyZSBjbGVhcmluZyB0aGUgYmFja2dyb3VuZCB0b28uCisgICAgbV9yZW5kZXJR
dWV1ZS0+Y2xlYXIobWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KSwg
cmVzZXRCYWNrZ3JvdW5kIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKKyAgICBpZiAocmVz
ZXRCYWNrZ3JvdW5kKQorICAgICAgICB0aWxlLT5yZXNldCgpOworfQorCit2b2lkIEJhY2tpbmdT
dG9yZVByaXZhdGU6OnVwZGF0ZVRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgYm9vbCBpbW1l
ZGlhdGUpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBU
aWxlUmVjdCB0aWxlUmVjdDsKKyAgICB0aWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgIHRpbGVS
ZWN0LnNlY29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgdXBk
YXRlUmVjdCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7Cisg
ICAgUmVuZGVyUXVldWU6OkpvYlR5cGUgam9iVHlwZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpID8g
UmVuZGVyUXVldWU6OlZpc2libGVTY3JvbGwgOiBSZW5kZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9s
bDsKKyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAv
KnJlbmRlckNvbnRlbnRPbmx5Ki8pOworICAgIGVsc2UKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+
YWRkVG9RdWV1ZShqb2JUeXBlLCB1cGRhdGVSZWN0KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQ
cml2YXRlOjp1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luLCBib29s
IGltbWVkaWF0ZSkKK3sKKyAgICBpZiAoIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IHVwZGF0ZVJlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChvcmln
aW4sIHRpbGVTaXplKCkpOworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBpc1Rp
bGVWaXNpYmxlKG9yaWdpbikgPyBSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCA6IFJlbmRlclF1
ZXVlOjpOb25WaXNpYmxlU2Nyb2xsOworICAgIGlmIChpbW1lZGlhdGUpCisgICAgICAgIHJlbmRl
cih1cGRhdGVSZWN0LCB0cnVlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgZWxzZQorICAg
ICAgICBtX3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKGpvYlR5cGUsIHVwZGF0ZVJlY3QpOworfQor
CitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVGlsZXNUb1Ry
YW5zZm9ybWVkQ29udGVudHMoY29uc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3QmIHRp
bGVSZWN0KSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29u
dGVudHModGlsZVJlY3QsIGZyb250U3RhdGUoKS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKK30KKwor
UGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVzVG9UcmFu
c2Zvcm1lZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0JiB0aWxl
UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7
CisgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgUGxhdGZvcm06Oklu
dFJlY3QgcmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKyAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSB0
aWxlIGluY2x1ZGluZyB0aGUgYmFja2luZyBzdG9yZSBvZmZzZXQuCisgICAgY29uc3QgUGxhdGZv
cm06OkludFBvaW50IG9yaWdpbk9mVGlsZSA9IHRoaXMtPm9yaWdpbk9mVGlsZShpbmRleCwgYmFj
a2luZ1N0b3JlUmVjdCk7CisgICAgcmVjdC5tb3ZlKG9yaWdpbk9mVGlsZS54KCksIG9yaWdpbk9m
VGlsZS55KCkpOworICAgIHJldHVybiByZWN0OworfQorCitCYWNraW5nU3RvcmVQcml2YXRlOjpU
aWxlUmVjdExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVu
dHNUb0Fic29sdXRlVGlsZUJvdW5kYXJpZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3Qp
IGNvbnN0Cit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFpc0FjdGl2ZSgp
KSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gVGlsZVJl
Y3RMaXN0KCk7CisgICAgfQorCisgICAgVGlsZVJlY3RMaXN0IHRpbGVSZWN0TGlzdDsKKyAgICBp
bnQgZmlyc3RYT2Zmc2V0ID0gcmVjdC54KCkgLyB0aWxlV2lkdGgoKTsKKyAgICBpbnQgZmlyc3RZ
T2Zmc2V0ID0gcmVjdC55KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAgaW50IGxhc3RYT2Zmc2V0ID0g
KHJlY3QucmlnaHQoKSAtIDEpIC8gdGlsZVdpZHRoKCk7CisgICAgaW50IGxhc3RZT2Zmc2V0ID0g
KHJlY3QuYm90dG9tKCkgLSAxKSAvIHRpbGVIZWlnaHQoKTsKKyAgICBmb3IgKGludCBpID0gZmly
c3RYT2Zmc2V0OyBpIDw9IGxhc3RYT2Zmc2V0OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9
IGZpcnN0WU9mZnNldDsgaiA8PSBsYXN0WU9mZnNldDsgKytqKSB7CisgICAgICAgICAgICBjb25z
dCBpbnQgZHN0WCA9IChpID09IGZpcnN0WE9mZnNldCkgPyByZWN0LngoKSA6IGkgKiB0aWxlV2lk
dGgoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RZID0gKGogPT0gZmlyc3RZT2Zmc2V0KSA/
IHJlY3QueSgpIDogaiAqIHRpbGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RS
aWdodCA9IChpID09IGxhc3RYT2Zmc2V0KSA/IHJlY3QucmlnaHQoKSA6IChpICsgMSkgKiB0aWxl
V2lkdGgoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RCb3R0b20gPSAoaiA9PSBsYXN0WU9m
ZnNldCkgPyByZWN0LmJvdHRvbSgpIDogKGogKyAxKSAqIHRpbGVIZWlnaHQoKTsKKyAgICAgICAg
ICAgIGNvbnN0IGludCBzcmNYID0gZHN0WCAlIHRpbGVXaWR0aCgpOworICAgICAgICAgICAgY29u
c3QgaW50IHNyY1kgPSBkc3RZICUgdGlsZUhlaWdodCgpOworICAgICAgICAgICAgVGlsZVJlY3Qg
dGlsZVJlY3Q7CisgICAgICAgICAgICB0aWxlUmVjdC5maXJzdCA9IFRpbGVJbmRleChpLCBqKTsK
KyAgICAgICAgICAgIHRpbGVSZWN0LnNlY29uZCA9IFBsYXRmb3JtOjpJbnRSZWN0KHNyY1gsIHNy
Y1ksIGRzdFJpZ2h0IC0gZHN0WCwgZHN0Qm90dG9tIC0gZHN0WSk7CisgICAgICAgICAgICB0aWxl
UmVjdExpc3QuYXBwZW5kKHRpbGVSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4g
dGlsZVJlY3RMaXN0OworfQorCisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0TGlzdCBC
YWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21U
cmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhyZWN0LCBmcm9udFN0YXRlKCkpOworfQorCitCYWNr
aW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJv
bVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0
LCBCYWNraW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpIGNvbnN0Cit7CisgICAgVGlsZU1hcCB0aWxl
TWFwID0gc3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3Q7
CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gdGlsZU1hcC5lbmQoKTsKKyAgICBm
b3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGlsZU1hcC5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gaXQtPmZpcnN0OworICAgICAg
ICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29uZDsKKworICAgICAgICAvLyBOZWVk
IHRvIG1hcCB0aGUgcmVjdCB0byB0aWxlIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCByID0gcmVjdDsKKworICAgICAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSB0aWxlIGlu
Y2x1ZGluZyB0aGUgYmFja2luZyBzdG9yZSBvZmZzZXQuCisgICAgICAgIGNvbnN0IFBsYXRmb3Jt
OjpJbnRQb2ludCBvcmlnaW5PZlRpbGUgPSB0aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgsIHN0YXRl
LT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIHIubW92ZSgtKG9yaWdpbk9mVGlsZS54
KCkpLCAtKG9yaWdpbk9mVGlsZS55KCkpKTsKKworICAgICAgICAvLyBEbyB3ZSBpbnRlcnNlY3Qg
dGhlIGN1cnJlbnQgdGlsZSBvciBubz8KKyAgICAgICAgci5pbnRlcnNlY3QodGlsZS0+cmVjdCgp
KTsKKyAgICAgICAgaWYgKHIuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgLy8gSWYgd2UgZG8gYXBwZW5kIHRvIGxpc3QgYW5kIFZvaWxhIQorICAgICAgICBUaWxl
UmVjdCB0aWxlUmVjdDsKKyAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAg
dGlsZVJlY3Quc2Vjb25kID0gcjsKKyAgICAgICAgdGlsZVJlY3RMaXN0LmFwcGVuZCh0aWxlUmVj
dCk7CisgICAgfQorICAgIHJldHVybiB0aWxlUmVjdExpc3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCkKK3sKKyAgICAvLyBUaGlzIHdp
bGwgdXBkYXRlIHRoZSB0aWxlIG1hdHJpeC4KKyAgICBzY3JvbGxCYWNraW5nU3RvcmUoMCwgMCk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdlZChjb25z
dCBQbGF0Zm9ybTo6SW50U2l6ZSYpCit7CisgICAgdXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQ2hhbmdlZChjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmKQoreworICAgIC8vIEZJWE1FOiBOZWVkIHRvIGRvIGFueXRoaW5nIGhl
cmU/Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dHJhbnNmb3JtQ2hhbmdlZCgpCit7
CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+cmVzZXQoKTsKKyAg
ICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVpvb20s
IHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxk
UmVzZXRUaWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAg
VGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBib29s
IGhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYiA9IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNp
YmxlWm9vbUpvYigpOworICAgIGJvb2wgaXNMb2FkaW5nID0gbV9jbGllbnQtPmlzTG9hZGluZygp
OworICAgIGlmIChpc0xvYWRpbmcpIHsKKyAgICAgICAgaWYgKCFoYXNDdXJyZW50VmlzaWJsZVpv
b21Kb2IpCisgICAgICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdCA9IHZpc2libGVDb250
ZW50c1JlY3QoKTsgLy8gQ2FjaGUgdGhpcyBmb3IgYmxpdFZpc2libGVDb250ZW50cy4KKworICAg
ICAgICAvLyBBZGQgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHRpbGVzIHRvIHRoZSByZW5kZXIgcXVl
dWUgYXMgdmlzaWJsZSB6b29tIGpvYnMuCisgICAgICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExp
c3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXModmlzaWJsZUNvbnRlbnRzUmVj
dCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0ID0gdGlsZVJlY3RMaXN0W2ld
OworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgICAg
ICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOwor
ICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0KGluZGV4
KTsKKworICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgd2hvbGUgcmVjdC4KKyAgICAgICAg
ICAgIHRpbGVSZWN0LnNlY29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgICAgICAgICBQbGF0
Zm9ybTo6SW50UmVjdCB3aG9sZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVu
dHModGlsZVJlY3QpOworICAgICAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5k
ZXJRdWV1ZTo6VmlzaWJsZVpvb20sIHdob2xlUmVjdCk7CisKKyAgICAgICAgICAgIC8vIENvcHkg
dGhlIHZpc2libGUgY29udGVudHMgaW50byB0aGUgdmlzaWJsZVRpbGVCdWZmZXIgaWYgd2UgZG9u
J3QgaGF2ZQorICAgICAgICAgICAgLy8gYW55IGN1cnJlbnQgdmlzaWJsZSB6b29tIGpvYnMuCisg
ICAgICAgICAgICBpZiAoIWhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYikgeworICAgICAgICAgICAg
ICAgIC8vIE1hcCB0byB0aGUgZGVzdGluYXRpb24ncyBjb29yZGluYXRlIHN5c3RlbS4KKyAgICAg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgZGlmZmVyZW5jZSA9IHRoaXMtPm9yaWdpbk9m
VGlsZShpbmRleCkgLSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAg
ICAgICAgICAgIFBsYXRmb3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRp
ZmZlcmVuY2UueCgpLCBkaWZmZXJlbmNlLnkoKSk7CisgICAgICAgICAgICAgICAgUGxhdGZvcm06
OkludFJlY3QgZGlydHlSZWN0ID0gZGlydHlUaWxlUmVjdDsKKyAgICAgICAgICAgICAgICBkaXJ0
eVJlY3QubW92ZShvZmZzZXQud2lkdGgoKSwgb2Zmc2V0LmhlaWdodCgpKTsKKworICAgICAgICAg
ICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHZpc2libGVUaWxlQnVmZmVyCisgICAgICAgICAgICAg
ICAgICAgID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPnZpc2libGVUaWxlQnVm
ZmVyKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUKHZpc2libGVUaWxlQnVmZmVyLT5zaXplKCkg
PT0gUGxhdGZvcm06OkludFNpemUobV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6
ZSgpKSk7CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpi
bGl0VG9CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHZpc2libGVUaWxlQnVmZmVyLT5mcm9u
dEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwgZGlydHlSZWN0LAorICAgICAgICAgICAgICAgICAg
ICB0aWxlLT5mcm9udEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwgZGlydHlUaWxlUmVjdCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZXNl
dCgpOworICAgIHJlc2V0VGlsZXModHJ1ZSAvKnJlc2V0QmFja2dyb3VuZCovKTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmllbnRhdGlvbkNoYW5nZWQoKQoreworICAgIHVwZGF0
ZVRpbGVNYXRyaXhJZk5lZWRlZCgpOworICAgIGNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJiBzaXplKQoreworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVW
aXNpYmxlVGlsZUJ1ZmZlckZvcldlYlBhZ2UoV2ViUGFnZVByaXZhdGUqIHBhZ2UpCit7CisgICAg
QVNTRVJUKHBhZ2UpOworICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29s
OjpnbG9iYWxTdXJmYWNlUG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplVmlzaWJs
ZVRpbGVCdWZmZXIocGFnZS0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK3ZvaWQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y3JlYXRlU3VyZmFjZXMoKQoreworICAgIEJhY2tpbmdTdG9y
ZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJy
ZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBBU1NFUlQoY3VycmVudE1h
cC5pc0VtcHR5KCkpOworCisgICAgaWYgKG1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpIHsKKyAgICAg
ICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiBzZXR0aW5n
IHVwIGEgbmV3IHdlYiBwYWdlIGluc3RhbmNlIGFuZAorICAgICAgICAvLyBiZWZvcmUgc2FpZCBp
bnN0YW5jZSBpcyBtYWRlIHZpc2libGUgc28gYXMgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBkZWZp
bml0aW9uIG9mIHdlYgorICAgICAgICAvLyBwYWdlIHZpc2liaWxpdHkuIFRoYXQgaXMsIGEgd2Vi
IHBhZ2UgaXMgc2FpZCB0byBiZSB2aXNpYmxlIHdoZW4gZXhwbGljaXRseSBtYWRlIHZpc2libGUu
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgU3VyZmFjZVBvb2wqIHN1cmZhY2VQb29sID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZh
Y2VQb29sKCk7CisgICAgc3VyZmFjZVBvb2wtPmluaXRpYWxpemUodGlsZVNpemUoKSk7CisKKyAg
ICBpZiAoc3VyZmFjZVBvb2wtPmlzRW1wdHkoKSkgLy8gU2V0dGluZ3Mgc3BlY2lmeSAwIHRpbGVz
IC8gbm8gYmFja2luZyBzdG9yZS4KKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgRGl2aXNv
ciBkaXZpc29yID0gYmVzdERpdmlzb3IoZXhwYW5kZWRDb250ZW50c1NpemUoKSwgdGlsZVdpZHRo
KCksIHRpbGVIZWlnaHQoKSwgbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCksIG1pbmltdW1OdW1i
ZXJPZlRpbGVzSGlnaCgpLCBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24pOworCisgICAg
aW50IG51bWJlck9mVGlsZXNXaWRlID0gZGl2aXNvci5maXJzdDsKKyAgICBpbnQgbnVtYmVyT2ZU
aWxlc0hpZ2ggPSBkaXZpc29yLnNlY29uZDsKKworICAgIGNvbnN0IFN1cmZhY2VQb29sOjpUaWxl
TGlzdCB0aWxlTGlzdCA9IHN1cmZhY2VQb29sLT50aWxlTGlzdCgpOworICAgIEFTU0VSVChzdGF0
aWNfY2FzdDxpbnQ+KHRpbGVMaXN0LnNpemUoKSkgPj0gKG51bWJlck9mVGlsZXNXaWRlICogbnVt
YmVyT2ZUaWxlc0hpZ2gpKTsKKworICAgIFRpbGVNYXAgbmV3VGlsZU1hcDsKKyAgICBmb3IgKGlu
dCB5ID0gMDsgeSA8IG51bWJlck9mVGlsZXNIaWdoOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQg
eCA9IDA7IHggPCBudW1iZXJPZlRpbGVzV2lkZTsgKyt4KSB7CisgICAgICAgICAgICBUaWxlSW5k
ZXggaW5kZXgoeCwgeSk7CisgICAgICAgICAgICBuZXdUaWxlTWFwLmFkZChpbmRleCwgdGlsZUxp
c3QuYXQoeCArIHkgKiBudW1iZXJPZlRpbGVzV2lkZSkpOworICAgICAgICB9CisgICAgfQorCisg
ICAgLy8gU2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBiYWNraW5nc3RvcmUgZ2VvbWV0cnku
CisgICAgYmFja1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNXaWRlKGRpdmlzb3IuZmlyc3QpOwor
ICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzSGlnaChkaXZpc29yLnNlY29uZCk7Cisg
ICAgYmFja1N0YXRlKCktPnNldFRpbGVNYXAobmV3VGlsZU1hcCk7CisKKyAgICAvLyBTd2FwIGJh
Y2svZnJvbnQgc3RhdGUuCisgICAgc3dhcFN0YXRlKCk7CisKKyAgICBjcmVhdGVWaXNpYmxlVGls
ZUJ1ZmZlckZvcldlYlBhZ2UobV93ZWJQYWdlLT5kKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlcigpCit7CisgICAgaWYgKCFtX3dlYlBhZ2Ut
PmlzVmlzaWJsZSgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjcmVh
dGVWaXNpYmxlVGlsZUJ1ZmZlckZvcldlYlBhZ2UobV93ZWJQYWdlLT5kKTsKK30KKworUGxhdGZv
cm06OkludFBvaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om9yaWdpbk9mVGlsZShjb25zdCBUaWxl
SW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBvcmlnaW5PZlRpbGUoaW5kZXgsIGZy
b250U3RhdGUoKS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFBvaW50
IEJhY2tpbmdTdG9yZVByaXZhdGU6Om9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4
LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gUGxhdGZvcm06OkludFBvaW50KGJhY2tpbmdTdG9yZVJlY3QueCgpICsgKGluZGV4
LmkoKSAqIHRpbGVXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QueSgpICsgKGluZGV4LmooKSAqIHRpbGVIZWlnaHQoKSkpOworfQorCitpbnQg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgY29uc3QKK3sK
KyAgICAvLyBUaGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgd2lkZSByZXF1aXJlZCB0byBmaWxs
IHRoZSB2aWV3cG9ydCArIDEgdGlsZSBleHRyYSB0byBhbGxvdyBzY3JvbGxpbmcuCisgICAgcmV0
dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYobV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRT
aXplKCkud2lkdGgoKSAvIHN0YXRpY19jYXN0PGZsb2F0Pih0aWxlV2lkdGgoKSkpKSArIDE7Cit9
CisKK2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjptaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKSBj
b25zdAoreworICAgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiB0aWxlcyBoaWdoIHJlcXVpcmVk
IHRvIGZpbGwgdGhlIHZpZXdwb3J0ICsgMSB0aWxlIGV4dHJhIHRvIGFsbG93IHNjcm9sbGluZy4K
KyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihtX2NsaWVudC0+dHJhbnNmb3JtZWRW
aWV3cG9ydFNpemUoKS5oZWlnaHQoKSAvIHN0YXRpY19jYXN0PGZsb2F0Pih0aWxlSGVpZ2h0KCkp
KSkgKyAxOworfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBCYWNraW5nU3RvcmVQcml2YXRlOjpleHBh
bmRlZENvbnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zv
cm1lZENvbnRlbnRzU2l6ZSgpLmV4cGFuZGVkVG8obV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3Bv
cnRTaXplKCkpOworfQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVdpZHRoKCkKK3sK
KyAgICBzdGF0aWMgaW50IHR3ID0gMDsKKyAgICBpZiAoIXR3KQorICAgICAgICB0dyA9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2NhcGVXaWR0aCgpOworICAg
IHJldHVybiB0dzsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVIZWlnaHQoKQor
eworICAgIHN0YXRpYyBpbnQgdGggPSAwOworICAgIGlmICghdGgpCisgICAgICAgIHRoID0gQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmxhbmRzY2FwZUhlaWdodCgpOwor
ICAgIHJldHVybiB0aDsKK30KKworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6dGlsZVNpemUoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50U2l6ZSh0aWxlV2lkdGgo
KSwgdGlsZUhlaWdodCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dGlsZVJlY3QoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgwLCAwLCB0
aWxlV2lkdGgoKSwgdGlsZUhlaWdodCgpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRl
OjpyZW5kZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciog
dGlsZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBzdXJmYWNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHNS
ZWN0KSBjb25zdAoreworICAgIC8vIElmIHRpbGVCdWZmZXIgPT0gMCwgd2UgcmVuZGVyIGRpcmVj
dGx5IHRvIHRoZSB3aW5kb3cuCisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpICYmIHRp
bGVCdWZmZXIpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVs
Q3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0
ZTo6cmVuZGVyQ29udGVudHMgdGlsZUJ1ZmZlcj0weCV4IHN1cmZhY2VPZmZzZXQ9KCVkLCVkKSBj
b250ZW50c1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0
aWxlQnVmZmVyLCBzdXJmYWNlT2Zmc2V0LngoKSwgc3VyZmFjZU9mZnNldC55KCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb250ZW50c1JlY3QueCgpLCBjb250ZW50c1JlY3QueSgpLCBj
b250ZW50c1JlY3Qud2lkdGgoKSwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisg
ICAgLy8gSXQgaXMgdXAgdG8gY2FsbGVycyBvZiB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGxheW91
dCB0aGVtc2VsdmVzIQorICAgIEFTU0VSVCghbV93ZWJQYWdlLT5kLT5tYWluRnJhbWUoKS0+dmll
dygpLT5uZWVkc0xheW91dCgpKTsKKworICAgIFBsYXRmb3JtOjpJbnRTaXplIGNvbnRlbnRzU2l6
ZSA9IG1fY2xpZW50LT5jb250ZW50c1NpemUoKTsKKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3Io
bV93ZWJQYWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogdGFyZ2V0QnVmZmVyID0gdGlsZUJ1ZmZl
cgorICAgICAgICA/IHRpbGVCdWZmZXIKKyAgICAgICAgOiBtX3dlYlBhZ2UtPmNsaWVudCgpLT53
aW5kb3coKS0+YnVmZmVyKCk7CisKKyAgICBpZiAoY29udGVudHNTaXplLmlzRW1wdHkoKQorICAg
ICAgICB8fCAhUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2Ns
aWVudC0+dHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSkuY29udGFpbnMoY29udGVudHNSZWN0KQor
ICAgICAgICB8fCBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSkgeworICAgICAgICAvLyBDbGVh
ciB0aGUgYXJlYSBpZiBpdCdzIG5vdCBmdWxseSBjb3ZlcmVkIGJ5IChvcGFxdWUpIGNvbnRlbnRz
LgorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCBjbGVhclJlY3QgPSBCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgICAgIGNvbnRlbnRzUmVjdC54KCkg
LSBzdXJmYWNlT2Zmc2V0LngoKSwgY29udGVudHNSZWN0LnkoKSAtIHN1cmZhY2VPZmZzZXQueSgp
LAorICAgICAgICAgICAgY29udGVudHNSZWN0LndpZHRoKCksIGNvbnRlbnRzUmVjdC5oZWlnaHQo
KSk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZl
cih0YXJnZXRCdWZmZXIsIGNsZWFyUmVjdCwKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5y
ZWQoKSwgYmFja2dyb3VuZENvbG9yLmdyZWVuKCksCisgICAgICAgICAgICBiYWNrZ3JvdW5kQ29s
b3IuYmx1ZSgpLCBiYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSk7CisgICAgfQorCisgICAgaWYgKGNv
bnRlbnRzU2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFVTRShBQ0NFTEVS
QVRFRF9DT01QT1NJVElORykKKyAgICBtX3dlYlBhZ2UtPmQtPmNvbW1pdFJvb3RMYXllcklmTmVl
ZGVkKCk7CisjZW5kaWYKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6RHJh
d2FibGUqIGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpsb2NrQnVmZmVyRHJhd2FibGUodGFyZ2V0QnVmZmVyKTsKKworICAgIFBsYXRmb3Jt
R3JhcGhpY3NDb250ZXh0KiBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCA9IGJ1ZmZlckRy
YXdhYmxlCisgICAgICAgID8gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNyZWF0
ZVBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxlKQorICAgICAgICA6IDA7Cisg
ICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
ID0gYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQKKyAgICAgICAgPyBidWZmZXJQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dAorICAgICAgICA6IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9v
bCgpLT5sb2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKTsKKworICAgIEFTU0VSVCh0YXJnZXRQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dCk7CisKKyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBn
cmFwaGljc0NvbnRleHQodGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworCisgICAgICAg
IC8vIEJlbGlldmUgaXQgb3Igbm90IHRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBXZWJLaXQg
U2tpYSBiYWNrZW5kCisgICAgICAgIC8vIGRvZXNuJ3Qgc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRl
IHVubGVzcyB5b3UgY2FsbCBzYXZlIGZpcnN0IDpQCisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5z
YXZlKCk7CisKKyAgICAgICAgLy8gVHJhbnNsYXRlIGNvbnRleHQgYWNjb3JkaW5nIHRvIG9mZnNl
dC4KKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnRyYW5zbGF0ZSgtc3VyZmFjZU9mZnNldC54KCks
IC1zdXJmYWNlT2Zmc2V0LnkoKSk7CisKKyAgICAgICAgLy8gQWRkIG91ciB0cmFuc2Zvcm1hdGlv
biBtYXRyaXggYXMgdGhlIGdsb2JhbCB0cmFuc2Zvcm0uCisgICAgICAgIEFmZmluZVRyYW5zZm9y
bSBhZmZpbmVUcmFuc2Zvcm0oCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0
aW9uTWF0cml4KCktPmEoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRp
b25NYXRyaXgoKS0+YigpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlv
bk1hdHJpeCgpLT5jKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9u
TWF0cml4KCktPmQoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25N
YXRyaXgoKS0+ZSgpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1h
dHJpeCgpLT5mKCkpOworICAgICAgICBncmFwaGljc0NvbnRleHQuY29uY2F0Q1RNKGFmZmluZVRy
YW5zZm9ybSk7CisKKyAgICAgICAgLy8gTm93IHRoYXQgdGhlIG1hdHJpeCBpcyBhcHBsaWVkIHdl
IG5lZWQgdW50cmFuZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9y
bTo6SW50UmVjdCB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBG
cm9tVHJhbnNmb3JtZWQoY29udGVudHNSZWN0KTsKKworICAgICAgICAvLyBXZSBleHRyYWN0IGZy
b20gdGhlIGNvbnRlbnRzUmVjdCBidXQgZHJhdyBhIHNsaWdodGx5IGxhcmdlciByZWdpb24gdGhh
bgorICAgICAgICAvLyB3ZSB3ZXJlIHRvbGQgdG8sIGluIG9yZGVyIHRvIGF2b2lkIHBpeGVscyBi
ZWluZyByZW5kZXJlZCBvbmx5IHBhcnRpYWxseS4KKyAgICAgICAgY29uc3QgaW50IGF0TGVhc3RP
bmVEZXZpY2VQaXhlbCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKDEuMCAv
IG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+YSgpKSk7CisgICAgICAgIHVu
dHJhbnNmb3JtZWRDb250ZW50c1JlY3QuaW5mbGF0ZShhdExlYXN0T25lRGV2aWNlUGl4ZWwsIGF0
TGVhc3RPbmVEZXZpY2VQaXhlbCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1bnRyYW5z
Zm9ybWVkIHJlY3RhbmdsZSBmb3IgdGhlIChzbGlnaHRseSBsYXJnZXIgdGhhbgorICAgICAgICAv
LyBpbml0aWFsbHkgcmVxdWVzdGVkKSByZXBhaW50ZWQgcmVnaW9uIGlzIHdpdGhpbiB0aGUgYm91
bmRzIG9mIHRoZSBwYWdlLgorICAgICAgICB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0LmludGVy
c2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGNvbnRlbnRz
U2l6ZSkpOworCisgICAgICAgIC8vIFNvbWUgV2ViS2l0IHBhaW50aW5nIGJhY2tlbmRzICpjb3Vn
aCogU2tpYSAqY291Z2gqIGRvbid0IHNldCB0aGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8g
dG8gdGhlIGRpcnR5UmVjdCBzbyBkbyBzbyBoZXJlIGV4cGxpY2l0bHkuCisgICAgICAgIGdyYXBo
aWNzQ29udGV4dC5jbGlwKHVudHJhbnNmb3JtZWRDb250ZW50c1JlY3QpOworCisgICAgICAgIC8v
IFRha2UgY2FyZSBvZiBwb3NzaWJsZSBsZWZ0IG92ZXJmbG93IG9uIFJUTCBwYWdlLgorICAgICAg
ICBpZiAoaW50IGxlZnRPdmVyRmxvdyA9IG1fY2xpZW50LT5mcmFtZSgpLT52aWV3KCktPm1pbmlt
dW1TY3JvbGxQb3NpdGlvbigpLngoKSkgeworICAgICAgICAgICAgdW50cmFuc2Zvcm1lZENvbnRl
bnRzUmVjdC5tb3ZlKGxlZnRPdmVyRmxvdywgMCk7CisgICAgICAgICAgICBncmFwaGljc0NvbnRl
eHQudHJhbnNsYXRlKC1sZWZ0T3ZlckZsb3csIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8g
TGV0IFdlYkNvcmUgcmVuZGVyIHRoZSBwYWdlIGNvbnRlbnRzIGludG8gdGhlIGRyYXdpbmcgc3Vy
ZmFjZS4KKyAgICAgICAgbV9jbGllbnQtPmZyYW1lKCktPnZpZXcoKS0+cGFpbnRDb250ZW50cygm
Z3JhcGhpY3NDb250ZXh0LCB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0KTsKKworI2lmIEVOQUJM
RShJTlNQRUNUT1IpCisgICAgICAgIGlmIChtX3dlYlBhZ2UtPmQtPm1fcGFnZS0+aW5zcGVjdG9y
Q29udHJvbGxlcigpLT5lbmFibGVkKCkpIHsKKyAgICAgICAgICAgIFdlYkNvcmU6OkludFBvaW50
IHNjcm9sbFBvc2l0aW9uID0gbV9jbGllbnQtPmZyYW1lKCktPnZpZXcoKS0+c2Nyb2xsUG9zaXRp
b24oKTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC50cmFuc2xhdGUoc2Nyb2xsUG9zaXRp
b24ueCgpLCBzY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT5t
X3BhZ2UtPmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ3JhcGhpY3ND
b250ZXh0KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnJl
c3RvcmUoKTsKKyAgICB9CisKKyAgICAvLyBHcmFiIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGZyb20g
dGhlIGRyYXdpbmcgc3VyZmFjZSBpbnRvIHRoZSB0aWxlIGltYWdlLgorI2lmIFVTRShPUEVOVkcp
CisgICAgc3VyZmFjZS0+bWFrZUN1cnJlbnQoKTsKKyNlbmRpZgorCisgICAgZGVsZXRlIGJ1ZmZl
clBsYXRmb3JtR3JhcGhpY3NDb250ZXh0OworCisgICAgaWYgKGJ1ZmZlckRyYXdhYmxlKQorICAg
ICAgICByZWxlYXNlQnVmZmVyRHJhd2FibGUodGFyZ2V0QnVmZmVyKTsKKyAgICBlbHNlIHsKKyAg
ICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50IGRzdFBvaW50KGNvbnRlbnRzUmVjdC54KCkg
LSBzdXJmYWNlT2Zmc2V0LngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnRlbnRzUmVjdC55KCkgLSBzdXJmYWNlT2Zmc2V0LnkoKSk7CisgICAgICAgIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0IGRzdFJlY3QoZHN0UG9pbnQsIGNvbnRlbnRzUmVjdC5zaXpl
KCkpOworICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCBzcmNSZWN0ID0gZHN0UmVjdDsK
KworICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkaXJlY3RseSBkcmF3IHRvIHRoZSBidWZmZXIs
IGNvcHkgZnJvbSB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAgICBTdXJmYWNlUG9vbDo6Z2xv
YmFsU3VyZmFjZVBvb2woKS0+cmVsZWFzZVRpbGVSZW5kZXJpbmdTdXJmYWNlKHRhcmdldFBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0KTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpibGl0VG9CdWZmZXIodGFyZ2V0QnVmZmVyLCBkc3RSZWN0LCBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OmRyYXdpbmdTdXJmYWNlKCksIHNyY1JlY3QpOworICAgIH0KK30KKwor
I2lmIERFQlVHX0ZBVF9GSU5HRVJTCitzdGF0aWMgdm9pZCBkcmF3RGVidWdSZWN0KEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBkc3RCdWZmZXIsIGNvbnN0IFBsYXRmb3Jt
OjpJbnRSZWN0JiBkc3RSZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVjdCwgdW5z
aWduZWQgY2hhciByZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVuc2lnbmVkIGNoYXIgYmx1ZSkK
K3sKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkcmF3UmVjdChzcmNSZWN0KTsKKyAgICBkcmF3UmVj
dC5pbnRlcnNlY3QoZHN0UmVjdCk7CisgICAgaWYgKCFkcmF3UmVjdC5pc0VtcHR5KCkpCisgICAg
ICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZHN0QnVmZmVy
LCBkcmF3UmVjdCwgcmVkLCBncmVlbiwgYmx1ZSwgMTI4KTsKK30KKyNlbmRpZgorCit2b2lkIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OmJsaXRUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
ZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBzcmNCdWZmZXIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
c3JjUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmxl
bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
IGdsb2JhbEFscGhhKQoreworICAgIEFTU0VSVChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlcklu
dGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworCisgICAg
d2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7Cisg
ICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0g
bV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RC
dWZmZXIpOworICAgIEFTU0VSVChzcmNCdWZmZXIpOworICAgIGlmICghZHN0QnVmZmVyKQorICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBibGl0VG9XaW5kb3ciKTsK
KworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QmxlbmRNb2RlIGJsZW5kTW9k
ZSA9IGJsZW5kCisgICAgICAgID8gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTb3Vy
Y2VPdmVyCisgICAgICAgIDogQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTb3VyY2VD
b3B5OworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIo
ZHN0QnVmZmVyLCBkc3RSZWN0LCBzcmNCdWZmZXIsIHNyY1JlY3QsIGJsZW5kTW9kZSwgZ2xvYmFs
QWxwaGEpOworCisjaWYgREVCVUdfRkFUX0ZJTkdFUlMKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1
ZmZlciwgZHN0UmVjdCwgRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZpbmdlclJlY3QsIDIxMCwgMjEw
LCAyNTApOworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVyLCBkc3RSZWN0LCBQbGF0Zm9ybTo6
SW50UmVjdChGYXRGaW5nZXJzOjptX2RlYnVnRmF0RmluZ2VyQ2xpY2tQb3NpdGlvbiwgUGxhdGZv
cm06OkludFNpemUoMywgMykpLCAwLCAwLCAwKTsKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1ZmZl
ciwgZHN0UmVjdCwgUGxhdGZvcm06OkludFJlY3QoRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZpbmdl
ckFkanVzdGVkUG9zaXRpb24sIFBsYXRmb3JtOjpJbnRTaXplKDUsIDUpKSwgMTAwLCAxMDAsIDEw
MCk7CisjZW5kaWYKKworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNoZWNrZXJXaW5k
b3coY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBjb250ZW50c09y
aWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29u
dGVudHNTY2FsZSkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIHdp
bmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKGRzdFJlY3QpOworICAg
IHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9uKGRzdFJlY3QpOworCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1f
d2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVm
ZmVyKTsKKyAgICBpZiAoIWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1
ZmZlciwgY291bGRuJ3QgY2hlY2tlcldpbmRvdyIpOworCisgICAgQ29sb3IgY29sb3IobV93ZWJQ
YWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgdW5zaWduZWQgY2hhciBh
bHBoYSA9IGNvbG9yLmFscGhhKCk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpjaGVja2VyQnVmZmVyKGRzdEJ1ZmZlciwgZHN0UmVjdCwgY29udGVudHNPcmlnaW4sIGNvbnRl
bnRzU2NhbGUsIGFscGhhKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlk
YXRlV2luZG93KCkKK3sKKyAgICAvLyBHcmFiIGEgcmVjdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1
cnJlbnQgdGhyZWFkLgorICAgIGlmIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpCisgICAgICAgIGludmFs
aWRhdGVXaW5kb3cobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWREZXN0
aW5hdGlvblJlY3QoKSk7CisgICAgZWxzZQorICAgICAgICBpbnZhbGlkYXRlV2luZG93KFBsYXRm
b3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV9jbGllbnQtPnRyYW5zZm9y
bWVkVmlld3BvcnRTaXplKCkpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjppbnZh
bGlkYXRlV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpCit7CisgICAgaWYgKGRz
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxh
dGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVh
ZCgpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIC8vIFRo
aXMgbmVlZHMgdG8gYmUgc3luYyBpbiBvcmRlciB0byBzd2FwIHRoZSByZWNlbnRseSBkcmF3biB0
aGluZy4uLgorICAgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgZnJvbSBXZWJLaXQg
dGhyZWFkIGR1cmluZyBkaXJlY3QgcmVuZGVyaW5nLgorICAgICAgICB0eXBlZGVmIHZvaWQgKEJs
YWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisg
ICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8
RnVuY3Rpb25UeXBlLCBCYWNraW5nU3RvcmVQcml2YXRlLCBQbGF0Zm9ybTo6SW50UmVjdD4oCisg
ICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3csIHRo
aXMsIGRzdCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgREVCVUdfQkFDS0lOR1NU
T1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3cg
ZHN0ID0gJXMiLCBkc3QudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAg
Ly8gU2luY2Ugb3VyIHdpbmRvdyBtYXkgYWxzbyBiZSBkb3VibGUgYnVmZmVyZWQsIHdlIG5lZWQg
dG8gYWxzbyBjb3B5IHRoZQorICAgIC8vIGZyb250IGJ1ZmZlcidzIGNvbnRlbnRzIHRvIHRoZSBi
YWNrIGJ1ZmZlciBiZWZvcmUgd2Ugc3dhcCB0aGVtLiBJdCBpcworICAgIC8vIGFuYWxvZ291cyB0
byB3aGF0IHdlIGRvIHdpdGggb3VyIGRvdWJsZSBidWZmZXJlZCB0aWxlcyBieSBjYWxsaW5nCisg
ICAgLy8gY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tpbmdTdXJmYWNlT2ZUaWxlKCkuIEl0IG9u
bHkgYWZmZWN0cyBwYXJ0aWFsCisgICAgLy8gc2NyZWVuIHVwZGF0ZXMgc2luY2Ugd2hlbiB3ZSBh
cmUgc2Nyb2xsaW5nIG9yIHpvb21pbmcsIHRoZSB3aG9sZSB3aW5kb3cKKyAgICAvLyBpcyBpbnZh
bGlkYXRlZCBhbnl3YXlzIGFuZCBubyBjb3B5aW5nIGlzIG5lZWRlZC4KKyAgICBjb3B5UHJldmlv
dXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpOworCisgICAgUGxhdGZvcm06OkludFJl
Y3QgZHN0UmVjdCA9IGRzdDsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpZXdwb3J0UmVjdChQ
bGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6
ZSgpKTsKKyAgICBkc3RSZWN0LmludGVyc2VjdCh2aWV3cG9ydFJlY3QpOworCisgICAgaWYgKGRz
dFJlY3Qud2lkdGgoKSA8PSAwIHx8IGRzdFJlY3QuaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0
dXJuOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9y
ZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3cgcG9zdGluZyA9ICVzIiwgZHN0UmVjdC50b1N0cmlu
ZygpLnV0ZjgoKS5kYXRhKCkpOworI2VuZGlmCisKKyAgICBtX2N1cnJlbnRXaW5kb3dCYWNrQnVm
ZmVyID0gKG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXIgKyAxKSAlIDI7CisgICAgbV93ZWJQYWdl
LT5jbGllbnQoKS0+d2luZG93KCktPnBvc3QoZHN0UmVjdCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3coKQoreworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgp
ICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIHR5cGVkZWYg
dm9pZCAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjoqRnVuY3Rpb25U
eXBlKSgpOworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVh
ZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlPEZ1bmN0aW9uVHlwZSwgQmFja2lu
Z1N0b3JlUHJpdmF0ZT4oCisgICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmNs
ZWFyV2luZG93LCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5j
bGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIpOworICAg
IGlmICghZHN0QnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3Vs
ZG4ndCBjbGVhcldpbmRvdyIpOworCisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVh
ckJsaXR0ZWRSZWdpb24oKTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRl
ZFJlZ2lvbihQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50KDAs
IDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworCisg
ICAgQ29sb3IgY29sb3IobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZlcihkc3RCdWZm
ZXIsCisgICAgICAgIGNvbG9yLnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIGNv
bG9yLmFscGhhKCkpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBibHVlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFscGhhKQoreworICAgIGlmICghQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlz
Q3VycmVudFRocmVhZCgpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7Cisg
ICAgICAgIHR5cGVkZWYgdm9pZCAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2
YXRlOjoqRnVuY3Rpb25UeXBlKShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFj
a2luZ1N0b3JlUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyPigKKyAgICAgICAgICAgICAgICAmQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3csIHRoaXMsIHJlY3QsIHJlZCwgZ3JlZW4sIGJs
dWUsIGFscGhhKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5jbGllbnQo
KS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIpOworICAgIGlmICgh
ZHN0QnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBj
bGVhcldpbmRvdyIpOworCisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0
ZWRSZWdpb24ocmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRS
ZWdpb24ocmVjdCk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFy
QnVmZmVyKGRzdEJ1ZmZlciwgcmVjdCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCiti
b29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3QKK3sK
KyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoY29uc3RfY2FzdDxCYWNraW5nU3Rv
cmVQcml2YXRlKj4odGhpcykpOworICAgIHJldHVybiBtX2lzU2Nyb2xsaW5nT3Jab29taW5nOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldFNjcm9sbGluZ09yWm9vbWluZyhib29s
IHNjcm9sbGluZ09yWm9vbWluZywgYm9vbCBzaG91bGRCbGl0KQoreworICAgIHsKKyAgICAgICAg
QmFja2luZ1N0b3JlTXV0ZXhMb2NrZXIgbG9ja2VyKHRoaXMpOworICAgICAgICBtX2lzU2Nyb2xs
aW5nT3Jab29taW5nID0gc2Nyb2xsaW5nT3Jab29taW5nOworICAgIH0KKworI2lmICFFTkFCTEVf
UkVQQUlOVE9OU0NST0xMCisgICAgbV9zdXNwZW5kUmVuZGVySm9icyA9IHNjcm9sbGluZ09yWm9v
bWluZzsgLy8gU3VzcGVuZCB0aGUgcmVuZGVyaW5nIG9mIGV2ZXJ5dGhpbmcuCisjZW5kaWYKKwor
ICAgIGlmICghbV93ZWJQYWdlLT5zZXR0aW5ncygpLT5zaG91bGRSZW5kZXJBbmltYXRpb25zT25T
Y3JvbGxPclpvb20oKSkKKyAgICAgICAgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMgPSBzY3Jv
bGxpbmdPclpvb21pbmc7IC8vIFN1c3BlbmQgdGhlIHJlbmRlcmluZyBvZiBhbmltYXRpb25zLgor
CisgICAgLy8gQ2xlYXIgdGhpcyBmbGFnIHNpbmNlIHdlIGRvbid0IGNhcmUgaWYgdGhlIHJlbmRl
ciBxdWV1ZSBpcyB1bmRlciBwcmVzc3VyZQorICAgIC8vIG9yIG5vdCBzaW5jZSB3ZSBhcmUgc2Ny
b2xsaW5nIGFuZCBpdCBpcyBtb3JlIGltcG9ydGFudCB0byBub3QgbGFnIHRoYW4KKyAgICAvLyBp
dCBpcyB0byBlbnN1cmUgYW5pbWF0aW9ucyBhY2hpZXZlIGJldHRlciBmcmFtZXJhdGVzIQorICAg
IGlmIChzY3JvbGxpbmdPclpvb21pbmcpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnNldEN1cnJl
bnRSZWd1bGFyUmVuZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKGZhbHNlKTsKKyNpZiBFTkFCTEVf
U0NST0xMQkFSUworICAgIGVsc2UgaWYgKHNob3VsZEJsaXQgJiYgIXNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpCisgICAgICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyNlbmRpZgor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmxvY2tCYWNraW5nU3RvcmUoKQoreworICAg
IHB0aHJlYWRfbXV0ZXhfbG9jaygmbV9tdXRleCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dW5sb2NrQmFja2luZ1N0b3JlKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygm
bV9tdXRleCk7Cit9CisKK0JhY2tpbmdTdG9yZUdlb21ldHJ5KiBCYWNraW5nU3RvcmVQcml2YXRl
Ojpmcm9udFN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYWNr
aW5nU3RvcmVHZW9tZXRyeSo+KG1fZnJvbnRTdGF0ZSk7Cit9CisKK0JhY2tpbmdTdG9yZUdlb21l
dHJ5KiBCYWNraW5nU3RvcmVQcml2YXRlOjpiYWNrU3RhdGUoKSBjb25zdAoreworICAgIHJldHVy
biByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdlb21ldHJ5Kj4obV9iYWNrU3RhdGUpOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN3YXBTdGF0ZSgpCit7CisjaWYgT1MoUU5Y
KQorICAgIC8vIFN0b3JlIHRlbXBzLgorICAgIHVuc2lnbmVkIGZyb250ID0gcmVpbnRlcnByZXRf
Y2FzdDx1bnNpZ25lZD4oZnJvbnRTdGF0ZSgpKTsKKyAgICB1bnNpZ25lZCBiYWNrID0gcmVpbnRl
cnByZXRfY2FzdDx1bnNpZ25lZD4oYmFja1N0YXRlKCkpOworCisgICAgLy8gQXRvbWljIGNoYW5n
ZS4KKyAgICBfc21wX3hjaGcoJm1fZnJvbnRTdGF0ZSwgYmFjayk7CisgICAgX3NtcF94Y2hnKCZt
X2JhY2tTdGF0ZSwgZnJvbnQpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJm
YWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOworI2Vsc2UK
KyNlcnJvciAiaW1wbGVtZW50IG1lISIKKyNlbmRpZgorfQorCitCYWNraW5nU3RvcmVXaW5kb3dC
dWZmZXJTdGF0ZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93RnJvbnRCdWZmZXJTdGF0ZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlWyhtX2N1cnJlbnRXaW5k
b3dCYWNrQnVmZmVyICsgMSkgJSAyXTsKK30KKworQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3Rh
dGUqIEJhY2tpbmdTdG9yZVByaXZhdGU6OndpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlW21fY3VycmVudFdpbmRvd0JhY2tCdWZm
ZXJdOworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorYm9vbCBCYWNraW5n
U3RvcmVQcml2YXRlOjpkcmF3U3ViTGF5ZXJzKCkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6
UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRo
cmVhZCgpKTsKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhy
ZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRzdCA9IG1fd2ViUGFnZS0+Y2xp
ZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCk7CisgICAgaWYgKGRz
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IHNyYyA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJs
ZUNvbnRlbnRzUmVjdCgpOworICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBjb250ZW50c1JlY3QgPSBt
X3dlYlBhZ2UtPmQtPm1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0UmVjdCgKKyAgICAgICAgV2ViQ29y
ZTo6RmxvYXRSZWN0KFdlYkNvcmU6OkludFJlY3Qoc3JjKSkpOworICAgIHJldHVybiBtX3dlYlBh
Z2UtPmQtPmRyYXdTdWJMYXllcnMoZHN0LCBjb250ZW50c1JlY3QpOworfQorI2VuZGlmCisKK2Jv
b2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBC
YWNraW5nU3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9PSBtX3dlYlBh
Z2UgJiYgIVN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5pc0VtcHR5KCk7Cit9CisK
K0JhY2tpbmdTdG9yZTo6QmFja2luZ1N0b3JlKFdlYlBhZ2UqIHdlYlBhZ2UsIEJhY2tpbmdTdG9y
ZUNsaWVudCogY2xpZW50KQorICAgIDogZChuZXcgQmFja2luZ1N0b3JlUHJpdmF0ZSkKK3sKKyAg
ICBkLT5tX3dlYlBhZ2UgPSB3ZWJQYWdlOworICAgIGQtPm1fY2xpZW50ID0gY2xpZW50OworfQor
CitCYWNraW5nU3RvcmU6On5CYWNraW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBkOworICAgIGQg
PSAwOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6Y3JlYXRlU3VyZmFjZSgpCit7CisgICAgc3Rh
dGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7Cisg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6aW5pdGlhbGl6ZSgpOworICAg
ICAgICBpbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisjaWYgVVNFKE9QRU5WRykKKyAgICBk
LT5tX2VnbERpc3BsYXkgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmVnbERpc3Bs
YXkoKTsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgT3BlblZHLgorICAgIGVnbEJp
bmRBUEkoRUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAg
IEVHTERpc3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KGQtPm1fZWdsRGlzcGxheSk7Cisj
ZW5kaWYKKworICAgIC8vIFRyaWdnZXJzIGNyZWF0aW9uIG9mIHN1cmZhY2VzIGluIGJhY2tpbmdz
dG9yZS4KKyAgICBkLT5jcmVhdGVTdXJmYWNlcygpOworCisjaWYgVVNFKE9QRU5WRykKKyAgICBF
R0xEaXNwbGF5T3BlblZHOjpjdXJyZW50KCktPnNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpLT5tYWtl
Q3VycmVudCgpOworI2VuZGlmCisKKyAgICAvLyBGb2N1c2luZyB0aGUgV2ViUGFnZSB0cmlnZ2Vy
cyBhIHJlcGFpbnQsIHNvIHdoaWxlIHdlIHdhbnQgaXQgdG8gYmUKKyAgICAvLyBmb2N1c2VkIGlu
aXRpYWxseSB0aGlzIGhhcyB0byBoYXBwZW4gYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHN1cmZhY2Uu
CisgICAgZC0+bV93ZWJQYWdlLT5zZXRGb2N1c2VkKHRydWUpOworfQorCit2b2lkIEJhY2tpbmdT
dG9yZTo6c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKQoreworICAgIGQtPnN1
c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlOjpyZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKFJlc3VtZVVwZGF0ZU9wZXJh
dGlvbiBvcCkKK3sKKyAgICBkLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKG9w
KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmU6OmlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZC0+aXNTY3JvbGxpbmdPclpvb21pbmcoKTsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmU6OnNldFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNjcm9sbGluZ09yWm9vbWluZykK
K3sKKyAgICBkLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoc2Nyb2xsaW5nT3Jab29taW5nKTsKK30K
Kwordm9pZCBCYWNraW5nU3RvcmU6OmJsaXRDb250ZW50cyhjb25zdCBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJl
Y3QmIGNvbnRlbnRzKQoreworICAgIC8vIEJsaXR0aW5nIGR1cmluZyBkaXJlY3QgcmVuZGVyaW5n
IGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgaWYgKGlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkg
eworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNr
aW5nU3RvcmU6OmJsaXRDb250ZW50cyBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBkaXJlY3Qg
cmVuZGVyaW5nIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGQtPmJsaXRD
b250ZW50cyhkc3RSZWN0LCBjb250ZW50cyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXBh
aW50KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAg
ZC0+cmVwYWludChQbGF0Zm9ybTo6SW50UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgY29udGVu
dENoYW5nZWQsIGltbWVkaWF0ZSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjpoYXNSZW5kZXJK
b2JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZC0+c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKTsK
K30KKwordm9pZCBCYWNraW5nU3RvcmU6OnJlbmRlck9uSWRsZSgpCit7CisgICAgZC0+cmVuZGVy
T25JZGxlKCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjppc0RpcmVjdFJlbmRlcmluZ1RvV2lu
ZG93KCkgY29uc3QKK3sKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoZCk7Cisg
ICAgcmV0dXJuIGQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlOjpkZWZlcnNCbGl0KCkgY29uc3QKK3sKKyAgICAgICAgcmV0dXJuIGQtPm1f
ZGVmZXJzQmxpdDsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNldERlZmVyc0JsaXQoYm9vbCBi
KQoreworICAgICAgICBkLT5tX2RlZmVyc0JsaXQgPSBiOworfQorCitib29sIEJhY2tpbmdTdG9y
ZTo6aGFzQmxpdEpvYnMoKSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkIGJl
IGNhbGxlZCBmcm9tIHRoZSBjb21wb3NpdGluZyB0aHJlYWQsCisgICAgLy8gYW5kIHRoZSBmbGFn
IGlzIHNldCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLCBzbyBubyBuZWVkIGZvcgorICAgIC8v
IHN5bmNocm9uaXphdGlvbi4KKyAgICByZXR1cm4gZC0+bV9oYXNCbGl0Sm9iczsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmU6OmJsaXRPbklkbGUoKQoreworICAgIGQtPmJsaXRWaXNpYmxlQ29udGVu
dHModHJ1ZSAvKmZvcmNlKi8pOworfQorCit9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5
L0FwaS9CYWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5i
MjEzZGIwCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9C
YWNraW5nU3RvcmUuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX2gKKyNkZWZp
bmUgQmFja2luZ1N0b3JlX2gKKworI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworI2lu
Y2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJy
eVBsYXRmb3JtUHJpbWl0aXZlcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDaHJv
bWVDbGllbnRCbGFja0JlcnJ5OworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEZyYW1lTG9hZGVy
Q2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7Cit9
CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBX
ZWJQYWdlOworY2xhc3MgV2ViUGFnZVByaXZhdGU7CitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRl
OworY2xhc3MgQmFja2luZ1N0b3JlQ2xpZW50OworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBC
YWNraW5nU3RvcmUgeworcHVibGljOgorICAgIGVudW0gUmVzdW1lVXBkYXRlT3BlcmF0aW9uIHsg
Tm9uZSwgQmxpdCwgUmVuZGVyQW5kQmxpdCB9OworICAgIEJhY2tpbmdTdG9yZShXZWJQYWdlKiwg
QmFja2luZ1N0b3JlQ2xpZW50Kik7CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlKCk7CisKKyAg
ICB2b2lkIGNyZWF0ZVN1cmZhY2UoKTsKKworICAgIHZvaWQgc3VzcGVuZFNjcmVlbkFuZEJhY2tp
bmdTdG9yZVVwZGF0ZXMoKTsKKyAgICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVw
ZGF0ZXMoUmVzdW1lVXBkYXRlT3BlcmF0aW9uKTsKKworICAgIGJvb2wgaXNTY3JvbGxpbmdPclpv
b21pbmcoKSBjb25zdDsKKyAgICB2b2lkIHNldFNjcm9sbGluZ09yWm9vbWluZyhib29sKTsKKwor
ICAgIHZvaWQgYmxpdENvbnRlbnRzKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0
JiBkc3RSZWN0LCBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMp
OworICAgIHZvaWQgcmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwg
Ym9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgYm9vbCBoYXNSZW5k
ZXJKb2JzKCkgY29uc3Q7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKworICAgIC8vIEluIHRo
ZSBkZWZlcnMgYmxpdCBtb2RlLCBhbnkgYmxpdCByZXF1ZXN0cyB3aWxsIGp1c3QgcmV0dXJuIGVh
cmx5LCBhbmQKKyAgICAvLyBhIGJsaXQgam9iIHdpbGwgYmUgcXVldWVkIHRoYXQgaXMgZXhlY3V0
ZWQgYnkgY2FsbGluZyBibGl0T25JZGxlKCkuCisgICAgYm9vbCBkZWZlcnNCbGl0KCkgY29uc3Q7
CisgICAgdm9pZCBzZXREZWZlcnNCbGl0KGJvb2wpOworCisgICAgYm9vbCBoYXNCbGl0Sm9icygp
IGNvbnN0OworICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgYm9vbCBpc0RpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJsYWNr
QmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlQ2xpZW50OworICAgIGZyaWVuZCBjbGFzcyBCbGFj
a0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2U7CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6Oldl
YktpdDo6V2ViUGFnZVByaXZhdGU7IC8vIEZJWE1FOiBGb3Igbm93LCB3ZSBleHBvc2Ugb3VyIGlu
dGVybmFscyB0byBXZWJQYWdlUHJpdmF0ZS4gU2VlIFBSICMxMjAzMDEuCisgICAgZnJpZW5kIGNs
YXNzIFdlYkNvcmU6OkNocm9tZUNsaWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdl
YkNvcmU6OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2Vi
Q29yZTo6R0xFUzJDb250ZXh0OworICAgIEJhY2tpbmdTdG9yZVByaXZhdGUgKmQ7Cit9OworfQor
fQorCisjZW5kaWYgLy8gQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li4wMjI5MGFkCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0Fw
aS9CYWNraW5nU3RvcmVfcC5oCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRo
ZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUK
KyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJv
c3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX3Bf
aAorI2RlZmluZSBCYWNraW5nU3RvcmVfcF9oCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmUuaCIK
KyNpbmNsdWRlICJSZW5kZXJRdWV1ZS5oIgorI2luY2x1ZGUgIlRpbGVJbmRleC5oIgorI2luY2x1
ZGUgIlRpbGVJbmRleEhhc2guaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8Qmxh
Y2tCZXJyeVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1H
dWFyZGVkUG9pbnRlci5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3Rm
L1ZlY3Rvci5oPgorCisjaWYgVVNFKE9QRU5WRykKKyNpbmNsdWRlIDxlZ2wuaD4KKyNlbmRpZgor
CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBJbnRS
ZWN0OworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7Cit9CisKK25hbWVzcGFjZSBCbGFja0Jl
cnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNraW5nU3RvcmVUaWxlOworY2xh
c3MgVGlsZUJ1ZmZlcjsKK2NsYXNzIFdlYlBhZ2U7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7
CisKK3R5cGVkZWYgV1RGOjpIYXNoTWFwPFRpbGVJbmRleCwgQmFja2luZ1N0b3JlVGlsZSo+IFRp
bGVNYXA7CitjbGFzcyBCYWNraW5nU3RvcmVHZW9tZXRyeSB7CitwdWJsaWM6CisgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkoKQorICAgICAgICA6IG1fbnVtYmVyT2ZUaWxlc1dpZGUoMCkKKyAgICAg
ICAgLCBtX251bWJlck9mVGlsZXNIaWdoKDApCisgICAgeworICAgIH0KKworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50U2l6
ZSBiYWNraW5nU3RvcmVTaXplKCkgY29uc3Q7CisKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc1dpZGUo
KSBjb25zdCB7IHJldHVybiBtX251bWJlck9mVGlsZXNXaWRlOyB9CisgICAgdm9pZCBzZXROdW1i
ZXJPZlRpbGVzV2lkZShpbnQgbnVtYmVyT2ZUaWxlc1dpZGUpIHsgbV9udW1iZXJPZlRpbGVzV2lk
ZSA9IG51bWJlck9mVGlsZXNXaWRlOyB9CisgICAgaW50IG51bWJlck9mVGlsZXNIaWdoKCkgY29u
c3QgeyByZXR1cm4gbV9udW1iZXJPZlRpbGVzSGlnaDsgfQorICAgIHZvaWQgc2V0TnVtYmVyT2ZU
aWxlc0hpZ2goaW50IG51bWJlck9mVGlsZXNIaWdoKSB7IG1fbnVtYmVyT2ZUaWxlc0hpZ2ggPSBu
dW1iZXJPZlRpbGVzSGlnaDsgfQorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBiYWNraW5nU3RvcmVP
ZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2JhY2tpbmdTdG9yZU9mZnNldDsgfQorICAgIHZvaWQg
c2V0QmFja2luZ1N0b3JlT2Zmc2V0KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb2Zmc2V0KSB7
IG1fYmFja2luZ1N0b3JlT2Zmc2V0ID0gb2Zmc2V0OyB9CisgICAgQmFja2luZ1N0b3JlVGlsZSog
dGlsZUF0KFRpbGVJbmRleCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwLmdldChpbmRl
eCk7IH0KKyAgICBjb25zdCBUaWxlTWFwJiB0aWxlTWFwKCkgY29uc3QgeyByZXR1cm4gbV90aWxl
TWFwOyB9CisgICAgdm9pZCBzZXRUaWxlTWFwKGNvbnN0IFRpbGVNYXAmIHRpbGVNYXApIHsgbV90
aWxlTWFwID0gdGlsZU1hcDsgfQorCisgIHByaXZhdGU6CisgICAgaW50IG1fbnVtYmVyT2ZUaWxl
c1dpZGU7CisgICAgaW50IG1fbnVtYmVyT2ZUaWxlc0hpZ2g7CisgICAgUGxhdGZvcm06OkludFBv
aW50IG1fYmFja2luZ1N0b3JlT2Zmc2V0OworICAgIFRpbGVNYXAgbV90aWxlTWFwOworfTsKKwor
Y2xhc3MgQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUgeworcHVibGljOgorICAgIFBsYXRm
b3JtOjpJbnRSZWN0UmVnaW9uIGJsaXR0ZWRSZWdpb24oKSBjb25zdCB7IHJldHVybiBtX2JsaXR0
ZWRSZWdpb247IH0KKyAgICB2b2lkIGFkZEJsaXR0ZWRSZWdpb24oY29uc3QgUGxhdGZvcm06Oklu
dFJlY3RSZWdpb24mIHJlZ2lvbikKKyAgICB7CisgICAgICAgIG1fYmxpdHRlZFJlZ2lvbiA9IFBs
YXRmb3JtOjpJbnRSZWN0UmVnaW9uOjp1bmlvblJlZ2lvbnMobV9ibGl0dGVkUmVnaW9uLCByZWdp
b24pOworICAgIH0KKyAgICB2b2lkIGNsZWFyQmxpdHRlZFJlZ2lvbihjb25zdCBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiYgcmVnaW9uKQorICAgIHsKKyAgICAgICAgbV9ibGl0dGVkUmVnaW9uID0g
UGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX2JsaXR0ZWRSZWdpb24s
IHJlZ2lvbik7CisgICAgfQorICAgIHZvaWQgY2xlYXJCbGl0dGVkUmVnaW9uKCkgeyBtX2JsaXR0
ZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOyB9CisKKyAgICBib29sIGlzUmVu
ZGVyZWQoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgY29uc3QgUGxh
dGZvcm06OkludFJlY3RSZWdpb24mIGNvbnRlbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0
dXJuIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMoY29udGVudHMsIG1f
YmxpdHRlZFJlZ2lvbikuaXNFbXB0eSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFBsYXRm
b3JtOjpJbnRSZWN0UmVnaW9uIG1fYmxpdHRlZFJlZ2lvbjsKK307CisKK2NsYXNzIEJhY2tpbmdT
dG9yZVByaXZhdGUgOiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okd1YXJkZWRQb2ludGVy
QmFzZSB7CitwdWJsaWM6CisgICAgZW51bSBUaWxlTWF0cml4RGlyZWN0aW9uIHsgSG9yaXpvbnRh
bCwgVmVydGljYWwgfTsKKyAgICBCYWNraW5nU3RvcmVQcml2YXRlKCk7CisgICAgfkJhY2tpbmdT
dG9yZVByaXZhdGUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkaXJlY3QgcmVuZGVyaW5n
IGlzIGV4cGxpY2l0bHkgdHVybmVkIG9uIG9yIGlzCisgICAgLy8gcmVxdWlyZWQgYmVjYXVzZSB0
aGUgc3VyZmFjZSBwb29sIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gbWVldAorICAgIC8vIHRoZSBt
aW5pbXVtIG51bWJlciBvZiB0aWxlcyByZXF1aXJlZCB0byBzY3JvbGwuCisgICAgYm9vbCBzaG91
bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpIGNvbnN0OworCisgICAgLy8gU3VzcGVuZHMgYWxs
IHNjcmVlbiB1cGRhdGVzIHNvIHRoYXQgJ2JsaXRDb250ZW50cycgaXMgZGlzYWJsZWQuCisgICAg
dm9pZCBzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gUmVz
dW1lcyBhbGwgc2NyZWVuIHVwZGF0ZXMgc28gdGhhdCAnYmxpdENvbnRlbnRzJyBpcyBlbmFibGVk
LgorICAgIHZvaWQgcmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3Rv
cmU6OlJlc3VtZVVwZGF0ZU9wZXJhdGlvbik7CisKKyAgICAvLyBUaGUgZnVuY3Rpb25zIHJlcGFp
bnQoKSwgc2xvd1Njcm9sbCgpLCBzY3JvbGwoKSwgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcigpIGFy
ZQorICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgV2ViS2l0IGFuZCB3aXRoaW4gV2ViS2l0IHZp
YSBDaHJvbWVDbGllbnRCbGFja0JlcnJ5LgorICAgIHZvaWQgcmVwYWludChjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgd2luZG93UmVjdCwgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlh
dGUpOworCisgICAgdm9pZCBzbG93U2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0
YSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKTsK
KworICAgIHZvaWQgc2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmIHNjcm9sbFZpZXdSZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgY2xpcFJlY3QpOworICAgIHZvaWQgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcihjb25zdCBQbGF0
Zm9ybTo6SW50U2l6ZSYgZGVsdGEpOworCisgICAgYm9vbCBzaG91bGRTdXBwcmVzc05vblZpc2li
bGVSZWd1bGFyUmVuZGVySm9icygpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkUGVyZm9ybVJlbmRl
ckpvYnMoKSBjb25zdDsKKyAgICBib29sIHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygp
IGNvbnN0OworICAgIHZvaWQgc3RhcnRSZW5kZXJUaW1lcigpOworICAgIHZvaWQgc3RvcFJlbmRl
clRpbWVyKCk7CisgICAgdm9pZCByZW5kZXJPblRpbWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdT
dG9yZVByaXZhdGU+Kik7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKyAgICBib29sIHdpbGxG
aXJlVGltZXIoKTsKKworICAgIC8vIFNldCBvZiBoZWxwZXIgbWV0aG9kcyBmb3IgdGhlIHNjcm9s
bEJhY2tpbmdTdG9yZSgpIG1ldGhvZC4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1Jl
Y3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBleHBhbmRlZENvbnRlbnRzUmVjdCgp
IGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QoKSBjb25z
dDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB1bmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KCkg
Y29uc3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYp
IGNvbnN0OworICAgIGJvb2wgc2hvdWxkTW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
KSBjb25zdDsKKyAgICBib29sIHNob3VsZE1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JikgY29uc3Q7CisgICAgYm9vbCBjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNv
bnN0OworICAgIGJvb2wgY2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsK
KyAgICBib29sIGNhbk1vdmVMZWZ0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7Cisg
ICAgYm9vbCBjYW5Nb3ZlUmlnaHQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAg
ICBib29sIGNhbk1vdmVVcChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJv
b2wgY2FuTW92ZURvd24oY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoaW50IGRlbHRhWCwgaW50
IGRlbHRhWSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICB2b2lkIHNldEJh
Y2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKworICAgIHR5cGVkZWYg
V1RGOjpWZWN0b3I8VGlsZUluZGV4PiBUaWxlSW5kZXhMaXN0OworICAgIFRpbGVJbmRleExpc3Qg
aW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25z
dDsKKworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZkxhc3RSZW5kZXJGb3JUaWxlKGNv
bnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3Q7CisKKyAgICBUaWxlSW5kZXggaW5kZXhPZkxhc3RS
ZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqKSBjb25zdDsK
KyAgICBUaWxlSW5kZXggaW5kZXhPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmln
aW4sIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdDsKKyAg
ICB2b2lkIGNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3QgVGlsZUlu
ZGV4JiwgQmFja2luZ1N0b3JlVGlsZSosIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QsIGJvb2wgdXBkYXRlID0g
dHJ1ZSk7CisgICAgYm9vbCBpc0N1cnJlbnRWaXNpYmxlSm9iKGNvbnN0IFRpbGVJbmRleCYsIEJh
Y2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVj
dCkgY29uc3Q7CisKKyAgICAvLyBSZXNwb25zaWJsZSBmb3Igc2Nyb2xsaW5nIHRoZSBiYWNraW5n
IHN0b3JlIGFuZCB1cGRhdGluZyB0aGUKKyAgICAvLyB0aWxlIG1hdHJpeCBnZW9tZXRyeS4KKyAg
ICB2b2lkIHNjcm9sbEJhY2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKTsKKworICAg
IC8vIFJlbmRlciB0aGUgdGlsZXMgZGlydHkgcmVjdHMgYW5kIGJsaXQgdG8gdGhlIHNjcmVlbi4K
KyAgICBib29sIHJlbmRlckRpcmVjdFRvV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jiwg
Ym9vbCByZW5kZXJDb250ZW50T25seSk7CisgICAgYm9vbCByZW5kZXIoY29uc3QgUGxhdGZvcm06
OkludFJlY3QmLCBib29sIHJlbmRlckNvbnRlbnRPbmx5KTsKKyAgICBib29sIHJlbmRlcihjb25z
dCBJbnRSZWN0TGlzdCYsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpOworCisgICAgLy8gQ2FsbGVk
IGJ5IHRoZSByZW5kZXIgcXVldWUgdG8gZW5zdXJlIHRoYXQgdGhlIHF1ZXVlIGlzIGluIGEKKyAg
ICAvLyBjb25zdGFudCBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHJlbmRlciBqb2IuCisgICAg
dm9pZCByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBjb25zdDsKKworICAgIC8vIEhlbHBlciByZW5k
ZXIgbWV0aG9kcy4KKyAgICB2b2lkIHJlbmRlclZpc2libGVDb250ZW50cyhib29sIHJlbmRlckNv
bnRlbnRPbmx5ID0gZmFsc2UpOworICAgIHZvaWQgcmVuZGVyQmFja2luZ1N0b3JlKGJvb2wgcmVu
ZGVyQ29udGVudE9ubHkgPSBmYWxzZSk7CisgICAgdm9pZCBibGl0VmlzaWJsZUNvbnRlbnRzKGJv
b2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAvLyBBc3N1bWVzIHRoZSByZWN0IHRvIGJlIGluIHdp
bmRvdy92aWV3cG9ydCBjb29yZGluYXRlcy4KKyAgICB2b2lkIGNvcHlQcmV2aW91c0NvbnRlbnRz
VG9CYWNrU3VyZmFjZU9mV2luZG93KCk7CisgICAgdm9pZCBjb3B5UHJldmlvdXNDb250ZW50c1Rv
QmFja1N1cmZhY2VPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVU
aWxlKik7CisgICAgdm9pZCBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiBjb250ZW50cywgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBi
b29sIGZsdXNoKTsKKyAgICB2b2lkIGJsaXRDb250ZW50cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLCBib29sIGZvcmNl
ID0gZmFsc2UpOworICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgdHlwZWRlZiBzdGQ6OnBh
aXI8VGlsZUluZGV4LCBQbGF0Zm9ybTo6SW50UmVjdD4gVGlsZVJlY3Q7CisgICAgUGxhdGZvcm06
OkludFJlY3QgYmxpdFRpbGVSZWN0KFRpbGVCdWZmZXIqLCBjb25zdCBUaWxlUmVjdCYsIGNvbnN0
IFBsYXRmb3JtOjpJbnRQb2ludCYsIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4
JiwgQmFja2luZ1N0b3JlR2VvbWV0cnkqKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJ
VElORykKKyAgICB2b2lkIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiBkc3RSZWN0KTsKKyAgICB2b2lkIGNsZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCk7Cisg
ICAgYm9vbCBkcmF3U3ViTGF5ZXJzKCk7CisjZW5kaWYKKworICAgIHZvaWQgYmxpdEhvcml6b250
YWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBibGl0VmVy
dGljYWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisKKyAgICAvLyBSZXR1
cm5zIHdoZXRoZXIgdGhlIHRpbGUgaW5kZXggaXMgY3VycmVudGx5IHZpc2libGUgb3Igbm90Lgor
ICAgIGJvb2wgaXNUaWxlVmlzaWJsZShjb25zdCBUaWxlSW5kZXgmKSBjb25zdDsKKyAgICBib29s
IGlzVGlsZVZpc2libGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JikgY29uc3Q7CisKKyAgICAv
LyBSZXR1cm5zIGEgcmVjdCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBhbGwgdGlsZXMgdGhhdCBhcmUg
dmlzaWJsZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlVGlsZXNSZWN0KCkgY29uc3Q7
CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIHZpc2libGUgY29udGVudCBmb3IgaW5zdGFu
Y2UuCisgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZVZpc2libGVDb250ZW50c1JlY3QoY29uc3Qg
VGlsZUluZGV4JikgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIHVuY2xpcHBl
ZCB2aXNpYmxlIGNvbnRlbnQgZm9yIGluc3RhbmNlIHdoaWNoIGluY2x1ZGVzIG92ZXJzY3JvbGwu
CisgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZVVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3Qo
Y29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIGNv
bnRlbnRzIGZvciBpbnN0YW5jZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlQ29udGVudHNS
ZWN0KGNvbnN0IFRpbGVJbmRleCYsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7Cisg
ICAgUGxhdGZvcm06OkludFJlY3QgdGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmLCBj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29u
c3Q7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSBXZWJQYWdlIG9uY2UgbG9hZCBpcyBjb21t
aXR0ZWQgdG8gcmVzZXQgdGhlIHJlbmRlciBxdWV1ZS4KKyAgICB2b2lkIHJlc2V0UmVuZGVyUXVl
dWUoKTsKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSBGcmFtZUxvYWRlckNsaWVudCB0aGF0IGV4
cGxpY2l0bHkgcGFpbnRzIG9uIGZpcnN0IHZpc2libGUgbGF5b3V0LgorICAgIHZvaWQgY2xlYXJW
aXNpYmxlWm9vbSgpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgV2ViUGFnZSBvbmNlIGxv
YWQgaXMgY29tbWl0dGVkIHRvIHJlc2V0IGFsbCB0aGUgdGlsZXMuCisgICAgdm9pZCByZXNldFRp
bGVzKGJvb2wgcmVzZXRCYWNrZ3JvdW5kKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFdl
YlBhZ2UgYWZ0ZXIgbG9hZCBpcyBjb21wbGV0ZSB0byB1cGRhdGUgYWxsIHRoZSB0aWxlcy4KKyAg
ICB2b2lkIHVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpOwor
CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHNjcm9sbCBhbmQgYnkgdGhlIHJlbmRlciBx
dWV1ZS4KKyAgICB2b2lkIHVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbihi
b29sIGNoZWNrTG9hZGluZyA9IHRydWUpOworCisgICAgLy8gUmVzZXQgYW4gaW5kaXZpZHVhbCB0
aWxlLgorICAgIHZvaWQgcmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRp
bGUqLCBib29sIHJlc2V0QmFja2dyb3VuZCk7CisKKyAgICAvLyBVcGRhdGUgYW4gaW5kaXZpZHVh
bCB0aWxlLgorICAgIHZvaWQgdXBkYXRlVGlsZShjb25zdCBUaWxlSW5kZXgmLCBib29sIGltbWVk
aWF0ZSk7CisgICAgdm9pZCB1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYsIGJv
b2wgaW1tZWRpYXRlKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IG1hcEZyb21UaWxlc1RvVHJh
bnNmb3JtZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYs
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICB0eXBlZGVmIFdURjo6VmVj
dG9yPFRpbGVSZWN0PiBUaWxlUmVjdExpc3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFu
c2Zvcm1lZENvbnRlbnRzVG9BYnNvbHV0ZVRpbGVCb3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JikgY29uc3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRl
bnRzVG9UaWxlcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIFRpbGVSZWN0
TGlzdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmLCBCYWNraW5nU3RvcmVHZW9tZXRyeSopIGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVU
aWxlTWF0cml4SWZOZWVkZWQoKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6
bm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkLgorICAgIHZvaWQgY29udGVudHNT
aXplQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYpOworCisgICAgLy8gQ2FsbGVkIGJ5
IFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQuCisgICAgdm9p
ZCBzY3JvbGxDaGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgLy8gQ2Fs
bGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1DaGFuZ2VkLgorICAgIHZvaWQg
dHJhbnNmb3JtQ2hhbmdlZCgpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjph
Y3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQuCisgICAgdm9pZCBhY3R1YWxWaXNpYmxlU2l6ZUNoYW5n
ZWQoY29uc3QgUGxhdGZvcm06OkludFNpemUmKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdl
UHJpdmF0ZTo6c2V0U2NyZWVuUm90YXRlZC4KKyAgICB2b2lkIG9yaWVudGF0aW9uQ2hhbmdlZCgp
OworCisgICAgLy8gU2V0cyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgbWF0cml4LgorICAgIHZv
aWQgc2V0R2VvbWV0cnlPZlRpbGVNYXRyaXgoaW50IG51bWJlck9mVGlsZXNXaWRlLCBpbnQgbnVt
YmVyT2ZUaWxlc0hpZ2gpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdXJmYWNlcyBvZiB0aGUgYmFj
a2luZyBzdG9yZS4KKyAgICB2b2lkIGNyZWF0ZVN1cmZhY2VzKCk7CisgICAgdm9pZCBjcmVhdGVW
aXNpYmxlVGlsZUJ1ZmZlcigpOworCisgICAgLy8gVmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgcXVh
bnRpdGllcyByZWxldmFudCB0byBiYWNraW5nIHN0b3JlLgorICAgIFBsYXRmb3JtOjpJbnRQb2lu
dCBvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisgICAgUGxhdGZvcm06Oklu
dFBvaW50IG9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYpIGNvbnN0OworICAgIGludCBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdDsK
KyAgICBpbnQgbWluaW11bU51bWJlck9mVGlsZXNIaWdoKCkgY29uc3Q7CisgICAgUGxhdGZvcm06
OkludFNpemUgZXhwYW5kZWRDb250ZW50c1NpemUoKSBjb25zdDsKKworICAgIC8vIFRoZSB0aWxl
IGdlb21ldHJ5IG1ldGhvZHMgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb24uCisgICAgc3RhdGljIGlu
dCB0aWxlV2lkdGgoKTsKKyAgICBzdGF0aWMgaW50IHRpbGVIZWlnaHQoKTsKKyAgICBzdGF0aWMg
UGxhdGZvcm06OkludFNpemUgdGlsZVNpemUoKTsKKyAgICBzdGF0aWMgUGxhdGZvcm06OkludFJl
Y3QgdGlsZVJlY3QoKTsKKworICAgIC8vIFRoaXMgdGFrZXMgdHJhbnNmb3JtZWQgY29udGVudHMg
Y29vcmRpbmF0ZXMuCisgICAgdm9pZCByZW5kZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJ1ZmZlciosIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3VyZmFjZU9m
ZnNldCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzUmVjdCkgY29uc3Q7CisKKyAg
ICB2b2lkIGJsaXRUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29u
c3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHNyY0J1ZmZlciwgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHNyY1JlY3QsIGJvb2wgYmxlbmQsIHVuc2lnbmVkIGNoYXIg
Z2xvYmFsQWxwaGEpOworICAgIHZvaWQgY2hlY2tlcldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBjb250ZW50c09yaWdpbiwg
ZG91YmxlIGNvbnRlbnRzU2NhbGUpOworCisgICAgdm9pZCBpbnZhbGlkYXRlV2luZG93KCk7Cisg
ICAgdm9pZCBpbnZhbGlkYXRlV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpOwor
ICAgIHZvaWQgY2xlYXJXaW5kb3coKTsKKyAgICB2b2lkIGNsZWFyV2luZG93KGNvbnN0IFBsYXRm
b3JtOjpJbnRSZWN0JiwgdW5zaWduZWQgY2hhciByZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVu
c2lnbmVkIGNoYXIgYmx1ZSwgdW5zaWduZWQgY2hhciBhbHBoYSA9IDI1NSk7CisKKyAgICBib29s
IGlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTY3JvbGxpbmdPclpv
b21pbmcoYm9vbCBzY3JvbGxpbmdPclpvb21pbmcsIGJvb2wgc2hvdWxkQmxpdCA9IHRydWUpOwor
CisgICAgdm9pZCBsb2NrQmFja2luZ1N0b3JlKCk7CisgICAgdm9pZCB1bmxvY2tCYWNraW5nU3Rv
cmUoKTsKKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBmcm9udFN0YXRlKCkgY29uc3Q7Cisg
ICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGJhY2tTdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3dh
cFN0YXRlKCk7CisKKyAgICBCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSogd2luZG93RnJv
bnRCdWZmZXJTdGF0ZSgpIGNvbnN0OworICAgIEJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRl
KiB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIHNldEN1
cnJlbnRCYWNraW5nU3RvcmVPd25lcihXZWJQYWdlKiB3ZWJQYWdlKSB7IEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnNfY3VycmVudEJhY2tpbmdTdG9yZU93bmVyID0gd2ViUGFnZTsgfQorICAgIHN0YXRp
YyBXZWJQYWdlKiBjdXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSB7IHJldHVybiBCYWNraW5nU3Rv
cmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsgfQorICAgIGJvb2wgaXNBY3Rp
dmUoKSBjb25zdDsKKworICAgIHN0YXRpYyBXZWJQYWdlKiBzX2N1cnJlbnRCYWNraW5nU3RvcmVP
d25lcjsKKworICAgIGJvb2wgbV9zdXNwZW5kU2NyZWVuVXBkYXRlczsKKyAgICBib29sIG1fc3Vz
cGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXM7CisKKyAgICBib29sIG1fc3VzcGVuZFJlbmRlckpvYnM7
CisgICAgYm9vbCBtX3N1c3BlbmRSZWd1bGFyUmVuZGVySm9iczsKKyAgICBib29sIG1faXNTY3Jv
bGxpbmdPclpvb21pbmc7CisgICAgV2ViUGFnZSogbV93ZWJQYWdlOworICAgIEJhY2tpbmdTdG9y
ZUNsaWVudCogbV9jbGllbnQ7CisgICAgUmVuZGVyUXVldWUqIG1fcmVuZGVyUXVldWU7CisgICAg
bXV0YWJsZSBQbGF0Zm9ybTo6SW50U2l6ZSBtX3ByZXZpb3VzRGVsdGE7CisKKyAgICBib29sIG1f
ZGVmZXJzQmxpdDsKKyAgICBib29sIG1faGFzQmxpdEpvYnM7CisKKyNpZiBVU0UoT1BFTlZHKQor
ICAgIEVHTERpc3BsYXkgbV9lZ2xEaXNwbGF5OworI2VuZGlmCisgICAgbXV0YWJsZSB1bnNpZ25l
ZCBtX2Zyb250U3RhdGU7CisgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2JhY2tTdGF0ZTsKKworICAg
IHVuc2lnbmVkIG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXI7CisgICAgbXV0YWJsZSBCYWNraW5n
U3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSBtX3dpbmRvd0J1ZmZlclN0YXRlWzJdOworCisgICAgVGls
ZU1hdHJpeERpcmVjdGlvbiBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb247CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdDsKKworICAgIC8vIExhc3Qg
cmVzb3J0IHRpbWVyIGZvciByZW5kZXJpbmcuCisgICAgV2ViQ29yZTo6VGltZXI8QmFja2luZ1N0
b3JlUHJpdmF0ZT4qIG1fcmVuZGVyVGltZXI7CisKKyAgICBwdGhyZWFkX211dGV4X3QgbV9tdXRl
eDsKKworICAgIGludCBtX2JsaXRHZW5lcmF0aW9uOworICAgIHB0aHJlYWRfbXV0ZXhfdCBtX2Js
aXRHZW5lcmF0aW9uTG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2JsaXRHZW5lcmF0aW9uQ29u
ZDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbV9jdXJyZW50QmxpdEVuZDsKK307Cit9Cit9CisKKyNl
bmRpZiAvLyBCYWNraW5nU3RvcmVfcF9oCi0tIAoxLjcuNwoK
</data>
<flag name="review"
          id="117513"
          type_id="1"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118047</attachid>
            <date>2011-12-06 07:17:53 -0800</date>
            <delta_ts>2011-12-09 11:46:40 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>73668-3.patch</filename>
            <type>text/plain</type>
            <size>127554</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSA3MWY3Njc1ZDA0ODc5NmJlZGNkMzlkMTk4NDhmMmE0MDkwMDdjZDY3IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
RnJpLCAyIERlYyAyMDExIDEyOjI3OjM5IC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCiogYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlLmg6IEFkZGVkLgoqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICB8ICAgMTYgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3Bw
IHwgMjYwOCArKysrKysrKysrKysrKysrKysrKysrKysrCiBTb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL0JhY2tpbmdTdG9yZS5oICAgfCAgIDg1ICsKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaCB8ICAzNTcgKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDY2
IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCiBjcmVhdGUgbW9kZSAxMDA2
NDQgU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaAoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggMjExNzM1ZS4uMDM0NThmMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMS0xMi0wMiAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQVBJIGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVh
bSwgdGhlIG1haW4gY29udHJpYnV0b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJp
bS5jb20+LgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAg
ICAgICAqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oOiBBZGRlZC4KKwogMjAxMS0xMi0wMSAgSmFja3kgSmlh
bmcgIDx6aGFqaWFuZ0ByaW0uY29tPgogCiAgICAgICAgIFVwc3RyZWFtIHRleHQgY29kZWMgYW5k
IHdlYiBzdHJpbmcgZmlsZXMgb2YgQmxhY2tCZXJyeSBBUEkKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcCBiL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi41MWY4ODNiCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCkBAIC0wLDAgKzEsMjYwOCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlLmgiCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVD
bGllbnQuaCIKKyNpbmNsdWRlICJCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UuaCIKKyNp
bmNsdWRlICJCYWNraW5nU3RvcmVUaWxlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlX3AuaCIK
KyNpbmNsdWRlICJGYXRGaW5nZXJzLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJG
cmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnNw
ZWN0b3JDb250cm9sbGVyLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlN1cmZhY2VQ
b29sLmgiCisjaW5jbHVkZSAiV2ViUGFnZS5oIgorI2luY2x1ZGUgIldlYlBhZ2VDbGllbnQuaCIK
KyNpbmNsdWRlICJXZWJQYWdlX3AuaCIKKyNpbmNsdWRlICJXZWJTZXR0aW5ncy5oIgorCisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtRXhlY3V0YWJsZU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxC
bGFja0JlcnJ5UGxhdGZvcm1JbnRSZWN0UmVnaW9uLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBs
YXRmb3JtTWVzc2FnZS5oPgorI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2VDbGll
bnQuaD4KKworI2luY2x1ZGUgPHd0Zi9DdXJyZW50VGltZS5oPgorI2luY2x1ZGUgPHd0Zi9NYXRo
RXh0cmFzLmg+CisjaW5jbHVkZSA8d3RmL05vdEZvdW5kLmg+CisKKyNkZWZpbmUgU1VQUFJFU1Nf
Tk9OX1ZJU0lCTEVfUkVHVUxBUl9SRU5ERVJfSk9CUyAwCisjZGVmaW5lIEVOQUJMRV9TQ1JPTExC
QVJTIDEKKyNkZWZpbmUgRU5BQkxFX1JFUEFJTlRPTlNDUk9MTCAxCisjZGVmaW5lIERFQlVHX0JB
Q0tJTkdTVE9SRSAwCisjZGVmaW5lIERFQlVHX1ZJU1VBTElaRSAwCisjZGVmaW5lIERFQlVHX1RJ
TEVNQVRSSVggMAorI2RlZmluZSBERUJVR19DT01QT1NJVElOR19ESVJUWV9SRUdJT04gMAorCisj
aWYgVVNFKE9QRU5WRykKKyNpbmNsdWRlICJFR0xEaXNwbGF5T3BlblZHLmgiCisjaW5jbHVkZSAi
RUdMVXRpbHMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtU2NyZWVu
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwor
dXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3Q7Cit1c2luZyBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6SW50UG9pbnQ7Cit1c2luZyBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50U2l6ZTsK
KworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NvbnN0IGlu
dCBzX3JlbmRlclRpbWVyVGltZW91dCA9IDEuMDsKK1dlYlBhZ2UqIEJhY2tpbmdTdG9yZVByaXZh
dGU6OnNfY3VycmVudEJhY2tpbmdTdG9yZU93bmVyID0gMDsKKwordHlwZWRlZiBzdGQ6OnBhaXI8
aW50LCBpbnQ+IERpdmlzb3I7Cit0eXBlZGVmIFZlY3RvcjxEaXZpc29yPiBEaXZpc29yTGlzdDsK
Ky8vIEZJWE1FOiBDYWNoZSB0aGlzIGFuZC9vciB1c2UgYSBzbWFydGVyIGFsZ29yaXRobS4KK3N0
YXRpYyBEaXZpc29yTGlzdCBkaXZpc29ycyh1bnNpZ25lZCBuKQoreworICAgIERpdmlzb3JMaXN0
IGRpdmlzb3JzOworICAgIGZvciAodW5zaWduZWQgaSA9IDE7IGkgPD0gbjsgKytpKQorICAgICAg
ICBpZiAoIShuICUgaSkpCisgICAgICAgICAgICBkaXZpc29ycy5hcHBlbmQoc3RkOjptYWtlX3Bh
aXIoaSwgbiAvIGkpKTsKKyAgICByZXR1cm4gZGl2aXNvcnM7Cit9CisKKy8vIENvbXB1dGUgYmVz
dCBkaXZpc29yIGdpdmVuIHRoZSByYXRpbyBkZXRlcm1pbmVkIGJ5IHNpemUuCitzdGF0aWMgRGl2
aXNvciBiZXN0RGl2aXNvcihQbGF0Zm9ybTo6SW50U2l6ZSBzaXplLCBpbnQgdGlsZVdpZHRoLCBp
bnQgdGlsZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5pbXVtTnVt
YmVyT2ZUaWxlc1dpZGUsIGludCBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2gsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlTWF0cml4RGlyZWN0aW9u
IGRpcmVjdGlvbikKK3sKKyAgICAvLyBUaGUgcG9pbnQgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBk
ZXRlcm1pbmUgdGhlIG51bWJlciBvZiB0aWxlcyBpbiBlYWNoCisgICAgLy8gZGltZW5zaW9uLiBX
ZSBkbyB0aGlzIGJ5IGxvb2tpbmcgdG8gbWF0Y2ggdGhlIHRpbGUgbWF0cml4IHdpZHRoL2hlaWdo
dAorICAgIC8vIHJhdGlvIGFzIGNsb3NlbHkgYXMgcG9zc2libGUgd2l0aCB0aGUgd2lkdGgvaGVp
Z2h0IHJhdGlvIG9mIHRoZSBjb250ZW50cy4KKyAgICAvLyBXZSBhbHNvIGxvb2sgYXQgdGhlIGRp
cmVjdGlvbiBwYXNzZWQgdG8gZ2l2ZSBwcmVmZXJlbmNlIHRvIG9uZSBkaW1lbnNpb24KKyAgICAv
LyBvdmVyIGFub3RoZXIuIFRoaXMgbWV0aG9kIGNvdWxkIHByb2JhYmx5IGJlIG1hZGUgZmFzdGVy
LCBidXQgaXQgZ2V0cyB0aGUKKyAgICAvLyBqb2IgZG9uZS4KKyAgICBTdXJmYWNlUG9vbCogc3Vy
ZmFjZVBvb2wgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKTsKKyAgICBBU1NFUlQo
IXN1cmZhY2VQb29sLT5pc0VtcHR5KCkpOworCisgICAgLy8gU3RvcmUgYSBzdGF0aWMgbGlzdCBv
ZiBwb3NzaWJsZSBkaXZpc29ycy4KKyAgICBzdGF0aWMgRGl2aXNvckxpc3QgZGl2aXNvckxpc3Qg
PSBkaXZpc29ycyhzdXJmYWNlUG9vbC0+c2l6ZSgpKTsKKworICAgIC8vIFRoZSByYXRpbyB3ZSdy
ZSBsb29raW5nIHRvIGJlc3QgaW1pdGF0ZS4KKyAgICBmbG9hdCByYXRpbyA9IHN0YXRpY19jYXN0
PGZsb2F0PihzaXplLndpZHRoKCkpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHNpemUuaGVpZ2h0KCkp
OworCisgICAgRGl2aXNvciBiZXN0RGl2aXNvcjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IGRpdmlzb3JMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIERpdmlzb3IgZGl2aXNvciA9IGRp
dmlzb3JMaXN0W2ldOworCisgICAgICAgIGJvb2wgZGl2aXNvcldpZHRoSXNQZXJmZWN0ID0gc2l6
ZS53aWR0aCgpIDw9IGRpdmlzb3IuZmlyc3QgKiB0aWxlV2lkdGggJiYgYWJzKHNpemUud2lkdGgo
KSAtIGRpdmlzb3IuZmlyc3QgKiB0aWxlV2lkdGgpIDwgdGlsZVdpZHRoOworICAgICAgICBib29s
IGRpdmlzb3JIZWlnaHRJc1BlcmZlY3QgPSBzaXplLmhlaWdodCgpIDw9IGRpdmlzb3Iuc2Vjb25k
ICogdGlsZUhlaWdodCAmJiBhYnMoc2l6ZS5oZWlnaHQoKSAtIGRpdmlzb3Iuc2Vjb25kICogdGls
ZUhlaWdodCkgPCB0aWxlSGVpZ2h0OworICAgICAgICBib29sIGRpdmlzb3JXaWR0aElzVmFsaWQg
PSBkaXZpc29yLmZpcnN0ID49IG1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSB8fCBkaXZpc29yV2lk
dGhJc1BlcmZlY3Q7CisgICAgICAgIGJvb2wgZGl2aXNvckhlaWdodElzVmFsaWQgPSBkaXZpc29y
LnNlY29uZCA+PSBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2ggfHwgZGl2aXNvckhlaWdodElzUGVy
ZmVjdDsKKyAgICAgICAgaWYgKCFkaXZpc29yV2lkdGhJc1ZhbGlkIHx8ICFkaXZpc29ySGVpZ2h0
SXNWYWxpZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkaXZpc29yLmZp
cnN0ID4gZGl2aXNvci5zZWNvbmQgJiYgZGlyZWN0aW9uID09IEJhY2tpbmdTdG9yZVByaXZhdGU6
OlZlcnRpY2FsICYmICFkaXZpc29ySGVpZ2h0SXNQZXJmZWN0KQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgaWYgKGRpdmlzb3Iuc2Vjb25kID4gZGl2aXNvci5maXJzdCAmJiBkaXJl
Y3Rpb24gPT0gQmFja2luZ1N0b3JlUHJpdmF0ZTo6SG9yaXpvbnRhbCAmJiAhZGl2aXNvcldpZHRo
SXNQZXJmZWN0KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGRpdmlzb3JX
aWR0aElzUGVyZmVjdCB8fCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0KSB7CisgICAgICAgICAgICBi
ZXN0RGl2aXNvciA9IGRpdmlzb3I7IC8vIEZvdW5kIGEgcGVyZmVjdCBmaXQhCisjaWYgREVCVUdf
VElMRU1BVFJJWAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgImJlc3REaXZpc29yIGZvdW5kIHBlcmZl
Y3Qgc2l6ZSB3aWR0aFBlcmZlY3Q9JXMgaGVpZ2h0UGVyZmVjdD0lcyIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3JXaWR0aElzUGVyZmVjdCA/ICJ0cnVlIiA6ICJm
YWxzZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlzb3JIZWlnaHRJ
c1BlcmZlY3QgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKworICAgICAgICAvLyBTdG9yZSBiYXNpcyBvZiBjb21wYXJpc29uLgorICAg
ICAgICBpZiAoIWJlc3REaXZpc29yLmZpcnN0ICYmICFiZXN0RGl2aXNvci5zZWNvbmQpIHsKKyAg
ICAgICAgICAgIGJlc3REaXZpc29yID0gZGl2aXNvcjsKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gQ29tcGFyZSByYXRpb3MuCisgICAgICAgIGZsb2F0IGRp
ZmYxID0gZmFicygoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRpdmlzb3IuZmlyc3QpIC8gc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGRpdmlzb3Iuc2Vjb25kKSkgLSByYXRpbyk7CisgICAgICAgIGZsb2F0IGRpZmYy
ID0gZmFicygoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJlc3REaXZpc29yLmZpcnN0KSAvIHN0YXRpY19j
YXN0PGZsb2F0PihiZXN0RGl2aXNvci5zZWNvbmQpKSAtIHJhdGlvKTsKKyAgICAgICAgaWYgKGRp
ZmYxIDwgZGlmZjIpCisgICAgICAgICAgICBiZXN0RGl2aXNvciA9IGRpdmlzb3I7CisgICAgfQor
CisgICAgcmV0dXJuIGJlc3REaXZpc29yOworfQorCitzdHJ1Y3QgQmFja2luZ1N0b3JlTXV0ZXhM
b2NrZXIgeworICAgIEJhY2tpbmdTdG9yZU11dGV4TG9ja2VyKEJhY2tpbmdTdG9yZVByaXZhdGUq
IGJhY2tpbmdTdG9yZVByaXZhdGUpCisgICAgICAgIDogbV9iYWNraW5nU3RvcmVQcml2YXRlKGJh
Y2tpbmdTdG9yZVByaXZhdGUpCisgICAgeworICAgICAgICBtX2JhY2tpbmdTdG9yZVByaXZhdGUt
PmxvY2tCYWNraW5nU3RvcmUoKTsKKyAgICB9CisKKyAgICB+QmFja2luZ1N0b3JlTXV0ZXhMb2Nr
ZXIoKQorICAgIHsKKyAgICAgICAgbV9iYWNraW5nU3RvcmVQcml2YXRlLT51bmxvY2tCYWNraW5n
U3RvcmUoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQmFja2luZ1N0b3JlUHJpdmF0ZSogbV9i
YWNraW5nU3RvcmVQcml2YXRlOworfTsKKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3Jl
R2VvbWV0cnk6OmJhY2tpbmdTdG9yZVJlY3QoKSBjb25zdAoreworICAgIHJldHVybiBQbGF0Zm9y
bTo6SW50UmVjdChiYWNraW5nU3RvcmVPZmZzZXQoKSwgYmFja2luZ1N0b3JlU2l6ZSgpKTsKK30K
KworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlR2VvbWV0cnk6OmJhY2tpbmdTdG9yZVNp
emUoKSBjb25zdAoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50U2l6ZShudW1iZXJPZlRpbGVz
V2lkZSgpICogQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVdpZHRoKCksIG51bWJlck9mVGlsZXNI
aWdoKCkgKiBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlSGVpZ2h0KCkpOworfQorCitCYWNraW5n
U3RvcmVQcml2YXRlOjpCYWNraW5nU3RvcmVQcml2YXRlKCkKKyAgICA6IG1fc3VzcGVuZFNjcmVl
blVwZGF0ZXMoZmFsc2UpCisgICAgLCBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzKGZhbHNl
KQorICAgICwgbV9zdXNwZW5kUmVuZGVySm9icyhmYWxzZSkKKyAgICAsIG1fc3VzcGVuZFJlZ3Vs
YXJSZW5kZXJKb2JzKGZhbHNlKQorICAgICwgbV9pc1Njcm9sbGluZ09yWm9vbWluZyhmYWxzZSkK
KyAgICAsIG1fd2ViUGFnZSgwKQorICAgICwgbV9jbGllbnQoMCkKKyAgICAsIG1fcmVuZGVyUXVl
dWUoYWRvcHRQdHIobmV3IFJlbmRlclF1ZXVlKHRoaXMpKSkKKyAgICAsIG1fZGVmZXJzQmxpdCh0
cnVlKQorICAgICwgbV9oYXNCbGl0Sm9icyhmYWxzZSkKKyNpZiBVU0UoT1BFTlZHKQorICAgICwg
bV9lZ2xEaXNwbGF5KEVHTF9OT19ESVNQTEFZKQorI2VuZGlmCisgICAgLCBtX2N1cnJlbnRXaW5k
b3dCYWNrQnVmZmVyKDApCisgICAgLCBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24oVmVy
dGljYWwpCisgICAgLCBtX2JsaXRHZW5lcmF0aW9uKC0xKQoreworICAgIG1fZnJvbnRTdGF0ZSA9
IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQ+KG5ldyBCYWNraW5nU3RvcmVHZW9tZXRyeSk7Cisg
ICAgbV9iYWNrU3RhdGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0
b3JlR2VvbWV0cnkpOworCisgICAgbV9yZW5kZXJUaW1lciA9IGFkb3B0UHRyKG5ldyBUaW1lcjxC
YWNraW5nU3RvcmVQcml2YXRlPih0aGlzLCAmQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyT25U
aW1lcikpOworCisgICAgLy8gTmVlZCBhIHJlY3Vyc2l2ZSBtdXRleCB0byBhY2hpZXZlIGEgZ2xv
YmFsIGxvY2suCisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfbXV0
ZXhhdHRyX2luaXQoJmF0dHIpOworICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUoJmF0dHIs
IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbXV0
ZXgsICZhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZhdHRyKTsKKworICAg
IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9ibGl0R2VuZXJhdGlvbkxvY2ssIDApOworICAgIHB0aHJl
YWRfY29uZF9pbml0KCZtX2JsaXRHZW5lcmF0aW9uQ29uZCwgMCk7Cit9CisKK0JhY2tpbmdTdG9y
ZVByaXZhdGU6On5CYWNraW5nU3RvcmVQcml2YXRlKCkKK3sKKyAgICBCYWNraW5nU3RvcmVHZW9t
ZXRyeSogZnJvbnQgPSByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdlb21ldHJ5Kj4obV9m
cm9udFN0YXRlKTsKKyAgICBkZWxldGUgZnJvbnQ7CisgICAgbV9mcm9udFN0YXRlID0gMDsKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBiYWNrID0gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5n
U3RvcmVHZW9tZXRyeSo+KG1fYmFja1N0YXRlKTsKKyAgICBkZWxldGUgYmFjazsKKyAgICBtX2Jh
Y2tTdGF0ZSA9IDA7CisKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbXV0ZXgpOworfQor
Citib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93
KCkgY29uc3QKK3sKKyAgICBpZiAobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5pc0RpcmVjdFJlbmRl
cmluZ1RvV2luZG93RW5hYmxlZCgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKworICAgIGNvbnN0IEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9u
dFN0YXRlKCk7CisgICAgY29uc3QgdW5zaWduZWQgdGlsZXNOZWNlc3NhcnkgPSBtaW5pbXVtTnVt
YmVyT2ZUaWxlc1dpZGUoKSAqIG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpOworICAgIGNvbnN0
IHVuc2lnbmVkIHRpbGVzQXZhaWxhYmxlID0gY3VycmVudFN0YXRlLT5udW1iZXJPZlRpbGVzV2lk
ZSgpICogY3VycmVudFN0YXRlLT5udW1iZXJPZlRpbGVzSGlnaCgpOworICAgIHJldHVybiB0aWxl
c0F2YWlsYWJsZSA8IHRpbGVzTmVjZXNzYXJ5OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZh
dGU6OnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCkKK3sKKyAgICBtX3N1c3Bl
bmRCYWNraW5nU3RvcmVVcGRhdGVzID0gdHJ1ZTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXNl
ciBpbnRlcmZhY2UgdGhyZWFkIGdldHMgdGhlIG1lc3NhZ2UgYmVmb3JlIHdlIHByb2NlZWQKKyAg
ICAvLyBiZWNhdXNlIGJsaXRDb250ZW50cyBjYW4gYmUgY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQg
YW5kIGl0IG11c3QgaG9ub3IKKyAgICAvLyB0aGlzIGZsYWcuCisgICAgbV9zdXNwZW5kU2NyZWVu
VXBkYXRlcyA9IHRydWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7CisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgbV93ZWJQYWdlLT5kLT5yZXNldENvbXBvc2l0
aW5nU3VyZmFjZSgpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVz
dW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlc3VtZVVwZGF0
ZU9wZXJhdGlvbiBvcCkKK3sKKyAgICBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID0gZmFs
c2U7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgaWYgKG9wICE9IEJh
Y2tpbmdTdG9yZTo6Tm9uZSkKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXROZWVkc09uZVNob3RE
cmF3aW5nU3luY2hyb25pemF0aW9uKCk7CisjZW5kaWYKKworICAgIC8vIEZvciB0aGUgZGlyZWN0
IHJlbmRlcmluZyBjYXNlLCB0aGVyZSBpcyBubyBzdWNoIG9wZXJhdGlvbiBhcyBibGl0LAorICAg
IC8vIHdlIGhhdmUgdG8gcmVuZGVyIHRvIGdldCBhbnl0aGluZyB0byB0aGUgc2NyZWVuLgorICAg
IGlmIChzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpICYmIG9wID09IEJhY2tpbmdTdG9y
ZTo6QmxpdCkKKyAgICAgICAgb3AgPSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQ7CisKKyAg
ICAvLyBEbyBzb21lIHJlbmRlcmluZyBpZiBuZWNlc3NhcnkuCisgICAgaWYgKG9wID09IEJhY2tp
bmdTdG9yZTo6UmVuZGVyQW5kQmxpdCkKKyAgICAgICAgcmVuZGVyVmlzaWJsZUNvbnRlbnRzKHRy
dWUgLypyZW5kZXJDb250ZW50T25seSovKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgdXNlciBp
bnRlcmZhY2UgdGhyZWFkIGdldHMgdGhlIG1lc3NhZ2UgYmVmb3JlIHdlIHByb2NlZWQKKyAgICAv
LyBiZWNhdXNlIGJsaXRDb250ZW50cyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIHVzZXIgaW50ZXJm
YWNlIHRocmVhZCBhbmQKKyAgICAvLyBpdCBtdXN0IGhvbm9yIHRoaXMgZmxhZy4KKyAgICBtX3N1
c3BlbmRTY3JlZW5VcGRhdGVzID0gZmFsc2U7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPnN5bmNUb0N1cnJlbnRNZXNzYWdlKCk7
CisKKyAgICAvLyBEbyBzb21lIGJsaXR0aW5nIGlmIG5lY2Vzc2FyeS4KKyAgICBpZiAoKG9wID09
IEJhY2tpbmdTdG9yZTo6QmxpdCB8fCBvcCA9PSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQp
ICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBibGl0VmlzaWJs
ZUNvbnRlbnRzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVwYWludChjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgd2luZG93UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBib29sIGNvbnRlbnRDaGFuZ2VkLCBib29sIGltbWVkaWF0ZSkKK3sKKyNpZiBV
U0UoT1BFTlZHKQorICAgIEFTU0VSVChtX2VnbERpc3BsYXkgIT0gRUdMX05PX0RJU1BMQVkpOwor
I2VuZGlmCisKKyAgICBpZiAobV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcykKKyAgICAgICAg
cmV0dXJuOworCisgICAgIC8vIElmIGltbWVkaWF0ZSBpcyB0cnVlLCB0aGVuIHdlJ3JlIGJlaW5n
IGFza2VkIHRvIHBlcmZvcm0gc3luY2hyb25vdXNseS4KKyAgICAgLy8gTk9URTogV2ViQ29yZTo6
U2Nyb2xsVmlldyB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBpbW1lZGlhdGU6dHJ1ZSBhbmQg
Y29udGVudENoYW5nZWQ6ZmFsc2UuCisgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgaW50
cm9kdWNlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBBcHBsZSdzIHdpbmRvd3MgcG9ydCBhbmQgY2Fu
IGJlIHNhZmVseSBpZ25vcmVkIEkgYmVsaWV2ZS4KKyAgICAgLy8gTm93IHRoaXMgbWV0aG9kIHdp
bGwgYmUgY2FsbGVkIGZyb20gV2ViUGFnZVByaXZhdGU6OnJlcGFpbnQoKS4KKworICAgIGlmIChj
b250ZW50Q2hhbmdlZCAmJiAhd2luZG93UmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gVGhp
cyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8g
dGhlIHZpZXdwb3J0LCBidXQKKyAgICAgICAgLy8gaXQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQg
Y29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybWVkIGNvbnRlbnRzLgorICAgICAg
ICBQbGF0Zm9ybTo6SW50UmVjdCByZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBUb1RyYW5zZm9ybWVk
KG1fY2xpZW50LT5tYXBGcm9tVmlld3BvcnRUb0NvbnRlbnRzKHdpbmRvd1JlY3QpKTsKKyAgICAg
ICAgcmVjdC5pbmZsYXRlKDEgLypkeCovLCAxIC8qZHkqLyk7IC8vIEFjY291bnQgZm9yIGFudGkt
YWxpYXNpbmcgb2YgcHJldmlvdXMgcmVuZGVyaW5nIHJ1bnMuCisKKyAgICAgICAgLy8gRklYTUU6
IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24gV2ViQ29yZTo6LgorICAgICAg
ICBXZWJDb3JlOjpJbnRSZWN0IHRtcFJlY3QgPSByZWN0OworICAgICAgICBtX2NsaWVudC0+Y2xp
cFRvVHJhbnNmb3JtZWRDb250ZW50c1JlY3QodG1wUmVjdCk7CisKKyAgICAgICAgcmVjdCA9IHRt
cFJlY3Q7CisgICAgICAgIGlmIChyZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybjsK
KworICAgICAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICAgICAgcmVuZGVyKHJlY3QsIGZhbHNl
IC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVu
ZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlJlZ3VsYXJSZW5kZXIsIHJlY3QpOwor
ICAgIH0KK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzbG93U2Nyb2xsKGNvbnN0IFBs
YXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1Jl
Y3QsIGJvb2wgaW1tZWRpYXRlKQoreworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0
YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91YmxlIHRpbWUgPSBXVEY6OmN1cnJl
bnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoZGVsdGEpOwor
CisgICAgLy8gVGhpcyB3aW5kb3dSZWN0IGlzIGluIHVudHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMg
cmVsYXRpdmUgdG8gdGhlIHZpZXdwb3J0LCBidXQKKyAgICAvLyBpdCBuZWVkcyB0byBiZSB0cmFu
c2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdHJhbnNmb3JtZWQgY29udGVudHMu
CisgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwVG9UcmFuc2Zv
cm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3aW5kb3dSZWN0KSk7CisK
KyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIocmVjdCwgZmFsc2UgLypyZW5kZXJD
b250ZW50T25seSovKTsKKyAgICBlbHNlIHsKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9R
dWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCwgcmVjdCk7CisgICAgICAgIC8vIFdlIG9u
bHkgYmxpdCBoZXJlIGlmIHRoZSBjbGllbnQgZGlkIG5vdCBnZW5lcmF0ZSB0aGUgc2Nyb2xsIGFz
IHRoZSBjbGllbnQKKyAgICAgICAgLy8gbm93IHN1cHBvcnRzIGJsaXR0aW5nIGFzeW5jaHJvbm91
c2x5IGR1cmluZyBzY3JvbGwgb3BlcmF0aW9ucy4KKyAgICAgICAgaWYgKCFtX2NsaWVudC0+aXND
bGllbnRHZW5lcmF0ZWRTY3JvbGwoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3co
KSkKKyAgICAgICAgICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICB9CisKKyNpZiBERUJV
R19CQUNLSU5HU1RPUkUKKyAgICAvLyBTdG9wIHRoZSB0aW1lIG1lYXN1cmVtZW50LgorICAgIGRv
dWJsZSBlbGFwc2VkID0gV1RGOjpjdXJyZW50VGltZSgpIC0gdGltZTsKKyAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAi
QmFja2luZ1N0b3JlUHJpdmF0ZTo6c2xvd1Njcm9sbCBlbGFwc2VkPSVmIiwgZWxhcHNlZCk7Cisj
ZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGwoY29uc3QgUGxhdGZv
cm06OkludFNpemUmIGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHNjcm9sbFZpZXdSZWN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNsaXBSZWN0KQoreworICAg
IC8vIElmIHdlIGFyZSBkaXJlY3QgcmVuZGVyaW5nIHRoZW4gd2UgYXJlIGZvcmNlZCB0byBnbyBk
b3duIHRoZSBzbG93IHBhdGgKKyAgICAvLyB0byBzY3JvbGxpbmcuCisgICAgaWYgKHNob3VsZERp
cmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qgdmll
d3BvcnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5kLT50cmFuc2Zv
cm1lZFZpZXdwb3J0U2l6ZSgpKTsKKyAgICAgICAgc2xvd1Njcm9sbChkZWx0YSwgbV93ZWJQYWdl
LT5kLT5tYXBGcm9tVHJhbnNmb3JtZWQodmlld3BvcnRSZWN0KSwgdHJ1ZSAvKmltbWVkaWF0ZSov
KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAg
IC8vIFN0YXJ0IHRoZSB0aW1lIG1lYXN1cmVtZW50Li4uCisgICAgZG91YmxlIHRpbWUgPSBXVEY6
OmN1cnJlbnRUaW1lKCk7CisjZW5kaWYKKworICAgIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoZGVs
dGEpOworCisgICAgLy8gV2Ugb25seSBibGl0IGhlcmUgaWYgdGhlIGNsaWVudCBkaWQgbm90IGdl
bmVyYXRlIHRoZSBzY3JvbGwgYXMgdGhlIGNsaWVudAorICAgIC8vIG5vdyBzdXBwb3J0cyBibGl0
dGluZyBhc3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuCisgICAgaWYgKCFt
X2NsaWVudC0+aXNDbGllbnRHZW5lcmF0ZWRTY3JvbGwoKSkKKyAgICAgICAgYmxpdFZpc2libGVD
b250ZW50cygpOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgLy8gU3RvcCB0aGUgdGlt
ZSBtZWFzdXJlbWVudC4KKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAt
IHRpbWU7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbCBkeD0lZCwg
ZHk9JWQgZWxhcHNlZD0lZiIsIGRlbHRhLndpZHRoKCksIGRlbHRhLmhlaWdodCgpLCBlbGFwc2Vk
KTsKKyNlbmRpZgorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbGluZ1N0YXJ0
ZWRIZWxwZXIoY29uc3QgUGxhdGZvcm06OkludFNpemUmIGRlbHRhKQoreworICAgIC8vIE5vdGlm
eSB0aGUgcmVuZGVyIHF1ZXVlIHNvIHRoYXQgaXQgY2FuIHNodWZmbGUgYWNjb3JkaW5nbHkuCisg
ICAgbV9yZW5kZXJRdWV1ZS0+dXBkYXRlU29ydERpcmVjdGlvbihkZWx0YS53aWR0aCgpLCBkZWx0
YS5oZWlnaHQoKSk7CisgICAgbV9yZW5kZXJRdWV1ZS0+dmlzaWJsZUNvbnRlbnRDaGFuZ2VkKHZp
c2libGVDb250ZW50c1JlY3QoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhlIGFjdHVhbCBiYWNraW5n
c3RvcmUuCisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKGRlbHRhLndpZHRoKCksIGRlbHRhLmhlaWdo
dCgpKTsKKworICAgIC8vIEFkZCBhbnkgbmV3bHkgdmlzaWJsZSB0aWxlcyB0aGF0IGhhdmUgbm90
IGJlZW4gcHJldmlvdXNseSByZW5kZXJlZCB0byB0aGUgcXVldWUKKyAgICAvLyBhbmQgY2hlY2sg
aWYgdGhlIHRpbGUgd2FzIHByZXZpb3VzbHkgcmVuZGVyZWQgYnkgcmVndWxhciByZW5kZXIgam9i
LgorICAgIHVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbigpOworfQorCiti
b29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZFN1cHByZXNzTm9uVmlzaWJsZVJlZ3VsYXJS
ZW5kZXJKb2JzKCkgY29uc3QKK3sKKyNpZiBTVVBQUkVTU19OT05fVklTSUJMRV9SRUdVTEFSX1JF
TkRFUl9KT0JTCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIC8vIEFsd2F5cyBzdXBwcmVz
cyB3aGVuIGxvYWRpbmcgYXMgdGhpcyBkcmFzdGljYWxseSBkZWNyZWFzZXMgcGFnZSBsb2FkaW5n
CisgICAgLy8gdGltZS4uLgorICAgIHJldHVybiBtX2NsaWVudC0+aXNMb2FkaW5nKCk7CisjZW5k
aWYKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRQZXJmb3JtUmVuZGVySm9i
cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8IHNob3Vs
ZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpICYmICFtX3N1c3BlbmRSZW5kZXJKb2JzICYmICFt
X3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzICYmICFtX3JlbmRlclF1ZXVlLT5pc0VtcHR5KCFt
X3N1c3BlbmRSZWd1bGFyUmVuZGVySm9icyk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6c2hvdWxkUGVyZm9ybVJlZ3VsYXJSZW5kZXJKb2JzKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSAmJiAhbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnM7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RhcnRSZW5kZXJUaW1lcigpCit7Cisg
ICAgLy8gQ2FsbGVkIHdoZW4gcmVuZGVyIHF1ZXVlIGhhcyBhIG5ldyBqb2IgYWRkZWQuCisgICAg
aWYgKG1fcmVuZGVyVGltZXItPmlzQWN0aXZlKCkgfHwgbV9yZW5kZXJRdWV1ZS0+aXNFbXB0eSgh
bV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJV
R19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RhcnRS
ZW5kZXJUaW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIG1f
cmVuZGVyVGltZXItPnN0YXJ0T25lU2hvdChzX3JlbmRlclRpbWVyVGltZW91dCk7Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVyKCkKK3sKKyAgICBpZiAoIW1f
cmVuZGVyVGltZXItPmlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENhbGxl
ZCB3aGVuIHdlIHJlbmRlciBzb21ldGhpbmcgdG8gcmVzdGFydC4KKyNpZiBERUJVR19CQUNLSU5H
U1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c3RvcFJlbmRlclRpbWVy
IHRpbWU9JWYiLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworI2VuZGlmCisgICAgbV9yZW5kZXJUaW1l
ci0+c3RvcCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlck9uVGltZXIo
V2ViQ29yZTo6VGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4qKQoreworICAgIC8vIFRoaXMgdGlt
ZXIgaXMgYSB0aGlyZCBtZXRob2Qgb2Ygc3RhcnRpbmcgYSByZW5kZXIgb3BlcmF0aW9uIHRoYXQg
aXMgYSBjYXRjaC1hbGwuIElmIG1vcmUKKyAgICAvLyB0aGFuIHNfcmVuZGVyVGltZXJUaW1lb3V0
IGVsYXBzZXMgd2l0aCBubyByZW5kZXJpbmcgdGFraW5nIHBsYWNlIGFuZCByZW5kZXIgam9icyBp
biB0aGUgcXVldWUsIHRoZW4KKyAgICAvLyByZW5kZXJPblRpbWVyIHdpbGwgYmUgY2FsbGVkIHdo
aWNoIHdpbGwgYWN0dWFsbHkgcmVuZGVyLgorICAgIGlmICghc2hvdWxkUGVyZm9ybVJlbmRlckpv
YnMoKSkKKyAgICAgICAgcmV0dXJuOworCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0
aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlck9uVGltZXIgdGltZT0lZiIsIFdURjo6
Y3VycmVudFRpbWUoKSk7CisjZW5kaWYKKyAgICB3aGlsZSAobV9yZW5kZXJRdWV1ZS0+aGFzQ3Vy
cmVudFZpc2libGVab29tSm9iKCkgfHwgbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZpc2libGVT
Y3JvbGxKb2IoKSkKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+cmVuZGVyKCFtX3N1c3BlbmRSZWd1
bGFyUmVuZGVySm9icyk7CisKKyAgICBpZiAoIXNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9i
cygpIHx8ICFtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXJBbGxDdXJyZW50UmVndWxh
clJlbmRlckpvYnMoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJPbklk
bGUoKQoreworICAgIEFTU0VSVChzaG91bGRQZXJmb3JtUmVuZGVySm9icygpKTsKKworICAgIC8v
IExldCB0aGUgcmVuZGVyIHF1ZXVlIGtub3cgdGhhdCB3ZSBlbnRlcmVkIGEgbmV3IGV2ZW50IHF1
ZXVlIGN5Y2xlCisgICAgLy8gc28gaXQgY2FuIGRldGVybWluZSBpZiBpdCBpcyB1bmRlciBwcmVz
c3VyZS4KKyAgICBtX3JlbmRlclF1ZXVlLT5ldmVudFF1ZXVlQ3ljbGVkKCk7CisKKyNpZiBERUJV
R19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVy
T25JZGxlIik7CisjZW5kaWYKKworICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9zdXNwZW5k
UmVndWxhclJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OndpbGxG
aXJlVGltZXIoKQoreworICAgIC8vIExldCB0aGUgcmVuZGVyIHF1ZXVlIGtub3cgdGhhdCB3ZSBl
bnRlcmVkIGEgbmV3IGV2ZW50IHF1ZXVlIGN5Y2xlCisgICAgLy8gc28gaXQgY2FuIGRldGVybWlu
ZSBpZiBpdCBpcyB1bmRlciBwcmVzc3VyZS4KKyAgICBtX3JlbmRlclF1ZXVlLT5ldmVudFF1ZXVl
Q3ljbGVkKCk7CisKKyAgICBpZiAoIXNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIHx8
ICFtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVndWxhclJlbmRlckpvYigpIHx8ICFtX3JlbmRl
clF1ZXVlLT5jdXJyZW50UmVndWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZSgpKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWws
ICJCYWNraW5nU3RvcmVQcml2YXRlOjp3aWxsRmlyZVRpbWVyIik7CisjZW5kaWYKKworICAgIC8v
IFdlJ3ZlIGRldGVjdGVkIHRoYXQgdGhlIHJlZ3VsYXIgcmVuZGVyIGpvYnMgYXJlIGNvbWluZyB1
bmRlciBwcmVzc3VyZSBsaWtlbHkKKyAgICAvLyBkdWUgdG8gdGltZXJzIGZpcmluZyBwcm9kdWNp
bmcgaW52YWxpZGF0aW9uIGpvYnMgYW5kIG91ciBlZmZvcnRzIHRvIGJyZWFrIHRoZW0KKyAgICAv
LyB1cCBpbnRvIGJpdGUgc2l6ZSBwaWVjZXMgaGFzIHByb2R1Y2VkIGEgc2l0dWF0aW9uIHdoZXJl
IHdlIGNhbiBub3QgY29tcGxldGUKKyAgICAvLyBhIGJhdGNoIG9mIHRoZW0gYmVmb3JlIHJlY2Vp
dmluZyBtb3JlIHRoYXQgaW50ZXJzZWN0IHRoZW0gd2hpY2ggY2F1c2VzIHVzCisgICAgLy8gdG8g
c3RhcnQgdGhlIGJhdGNoIG92ZXIuIFRvIG1pdGlnYXRlIHRoaXMgd2UgaGF2ZSB0byBlbXB0eSB0
aGUgY3VycmVudCBiYXRjaAorICAgIC8vIHdoZW4gdGhpcyBpcyBkZXRlY3RlZC4KKworICAgIC8v
IFdlIHN0aWxsIHdhbnQgdG8gcGVyZm9ybSBwcmlvcml0eSBqb2JzIGZpcnN0IHRvIGF2b2lkIHJl
ZHVuZGFudCBwYWludHMuCisgICAgd2hpbGUgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNp
YmxlWm9vbUpvYigpIHx8IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9i
KCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9zdXNwZW5kUmVndWxhclJlbmRl
ckpvYnMpOworCisgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRSZWd1bGFyUmVuZGVy
Sm9iKCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlckFsbEN1cnJlbnRSZWd1bGFyUmVu
ZGVySm9icygpOworCisgICAgLy8gTGV0IHRoZSBjYWxsZXIgeWllbGQgYW5kIHJlc2NoZWR1bGUg
dGhlIHRpbWVyLgorICAgIHJldHVybiBmYWxzZTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6ZXhwYW5kZWRDb250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJl
dHVybiBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGV4cGFuZGVk
Q29udGVudHNTaXplKCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2
YXRlOjp2aXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gaW50ZXJzZWN0
aW9uKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVDb250ZW50c1JlY3QoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAw
KSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpKTsKK30KKworUGxhdGZvcm06
OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVj
dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpc2libGVDb250
ZW50c1JlY3QoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlTGVm
dChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tp
bmdTdG9yZVJlY3QueCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLngoKQorICAgICAgICAgICAg
JiYgYmFja2luZ1N0b3JlUmVjdC54KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLngoKTsKK30K
KworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlUmlnaHQoY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNhbk1v
dmVYKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LnJp
Z2h0KCkgPCB2aXNpYmxlQ29udGVudHNSZWN0KCkucmlnaHQoKQorICAgICAgICAgICAgJiYgYmFj
a2luZ1N0b3JlUmVjdC5yaWdodCgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5yaWdodCgpOwor
fQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNob3VsZE1vdmVVcChjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2FuTW92
ZVkoYmFja2luZ1N0b3JlUmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueSgp
ID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLnkoKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0b3Jl
UmVjdC55KCkgPiBleHBhbmRlZENvbnRlbnRzUmVjdCgpLnkoKTsKK30KKworYm9vbCBCYWNraW5n
U3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFj
a2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gY2FuTW92ZVkoYmFja2luZ1N0b3Jl
UmVjdCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkgPCB2aXNpYmxl
Q29udGVudHNSZWN0KCkuYm90dG9tKCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3Qu
Ym90dG9tKCkgPCBleHBhbmRlZENvbnRlbnRzUmVjdCgpLmJvdHRvbSgpOworfQorCitib29sIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OmNhbk1vdmVYKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNr
aW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LndpZHRo
KCkgPiB2aXNpYmxlQ29udGVudHNSZWN0KCkud2lkdGgoKTsKK30KKworYm9vbCBCYWNraW5nU3Rv
cmVQcml2YXRlOjpjYW5Nb3ZlWShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3Jl
UmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSA+IHZp
c2libGVDb250ZW50c1JlY3QoKS5oZWlnaHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjpjYW5Nb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRz
UmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFu
ZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKC10aWxlV2lkdGgo
KSwgMCk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA+PSB2aXNpYmxlQ29u
dGVudHNSZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgpID49
IGNvbnRlbnRzUmVjdC54KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92
ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBsYXRm
b3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7Cisg
ICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRDb250ZW50
c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUodGlsZVdpZHRoKCksIDApOworICAg
IHJldHVybiBiYWNraW5nU3RvcmVSZWN0LngoKSA8PSB2aXNpYmxlQ29udGVudHNSZWN0LngoKQor
ICAgICAgICAgICAgJiYgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8PSBjb250ZW50c1JlY3Qu
cmlnaHQoKQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSAtIGNvbnRl
bnRzUmVjdC5yaWdodCgpKSA8IHRpbGVXaWR0aCgpKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjYW5Nb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7
CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7CisgICAgUGxh
dGZvcm06OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2libGVDb250ZW50
c1JlY3QoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0aGlzLT5leHBh
bmRlZENvbnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCAtdGlsZUhl
aWdodCgpKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA+PSB2aXNpYmxl
Q29udGVudHNSZWN0LmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0Lnko
KSA+PSBjb250ZW50c1JlY3QueSgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNh
bk1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0OworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNpYmxlQ29udGVudHNSZWN0KCk7
CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gdGhpcy0+ZXhwYW5kZWRDb250
ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgpKTsK
KyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC55KCkgPD0gdmlzaWJsZUNvbnRlbnRzUmVjdC55
KCkKKyAgICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgpIDw9IGNvbnRlbnRz
UmVjdC5ib3R0b20oKQorICAgICAgICAgICAgfHwgKGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkg
LSBjb250ZW50c1JlY3QuYm90dG9tKCkpIDwgdGlsZUhlaWdodCgpKTsKK30KKworUGxhdGZvcm06
OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja2luZ1N0b3JlUmVjdEZvclNjcm9sbChp
bnQgZGVsdGFYLCBpbnQgZGVsdGFZLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29u
c3QKK3sKKyAgICAvLyBUaGUgY3VycmVudCByZWN0LgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJh
Y2tpbmdTdG9yZVJlY3QgPSByZWN0OworCisgICAgLy8gVGhpcyBtZXRob2QgdXNlcyB0aGUgZGVs
dGEgdmFsdWVzIHRvIGRlc2NyaWJlIHRoZSBiYWNraW5nc3RvcmUgcmVjdAorICAgIC8vIGdpdmVu
IHRoZSBjdXJyZW50IHNjcm9sbCBkaXJlY3Rpb24gYW5kIHRoZSB2aWV3cG9ydCBwb3NpdGlvbi4g
SG93ZXZlciwKKyAgICAvLyB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGggbm8gZGVsdGFz
IHdoYXRzb2V2ZXIgZm9yIGluc3RhbmNlIHdoZW4KKyAgICAvLyB0aGUgY29udGVudHMgc2l6ZSBj
aGFuZ2VzIG9yIHRoZSBvcmllbnRhdGlvbiBjaGFuZ2VzLiBJbiB0aGlzIGNhc2UsIHdlCisgICAg
Ly8gd2FudCB0byB1c2UgdGhlIHByZXZpb3VzIHNjcm9sbCBkaXJlY3Rpb24gdG8gZGVzY3JpYmUg
dGhlIGJhY2tpbmdzdG9yZQorICAgIC8vIHJlY3QuIFRoaXMgd2lsbCByZXN1bHQgaW4gbGVzcyBj
aGVja2VyYm9hcmQuCisgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgeworICAgICAgICBkZWx0
YVggPSBtX3ByZXZpb3VzRGVsdGEud2lkdGgoKTsKKyAgICAgICAgZGVsdGFZID0gbV9wcmV2aW91
c0RlbHRhLmhlaWdodCgpOworICAgIH0KKyAgICBtX3ByZXZpb3VzRGVsdGEgPSBQbGF0Zm9ybTo6
SW50U2l6ZShkZWx0YVgsIGRlbHRhWSk7CisKKyAgICAvLyBSZXR1cm4gdG8gb3JpZ2luIGlmIG5l
ZWQgYmUuCisgICAgaWYgKCFjYW5Nb3ZlWChiYWNraW5nU3RvcmVSZWN0KSAmJiBiYWNraW5nU3Rv
cmVSZWN0LngoKSkKKyAgICAgICAgYmFja2luZ1N0b3JlUmVjdC5zZXRYKDApOworCisgICAgaWYg
KCFjYW5Nb3ZlWShiYWNraW5nU3RvcmVSZWN0KSAmJiBiYWNraW5nU3RvcmVSZWN0LnkoKSkKKyAg
ICAgICAgYmFja2luZ1N0b3JlUmVjdC5zZXRZKDApOworCisgICAgLy8gTW92ZSB0aGUgcmVjdCBs
ZWZ0LgorICAgIHdoaWxlIChzaG91bGRNb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSB8fCAoZGVs
dGFYID4gMCAmJiBjYW5Nb3ZlTGVmdChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAgIGJhY2tp
bmdTdG9yZVJlY3QubW92ZSgtdGlsZVdpZHRoKCksIDApOworCisgICAgLy8gTW92ZSB0aGUgcmVj
dCByaWdodC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZVJpZ2h0KGJhY2tpbmdTdG9yZVJlY3QpIHx8
IChkZWx0YVggPCAwICYmIGNhbk1vdmVSaWdodChiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAg
IGJhY2tpbmdTdG9yZVJlY3QubW92ZSh0aWxlV2lkdGgoKSwgMCk7CisKKyAgICAvLyBNb3ZlIHRo
ZSByZWN0IHVwLgorICAgIHdoaWxlIChzaG91bGRNb3ZlVXAoYmFja2luZ1N0b3JlUmVjdCkgfHwg
KGRlbHRhWSA+IDAgJiYgY2FuTW92ZVVwKGJhY2tpbmdTdG9yZVJlY3QpKSkKKyAgICAgICAgYmFj
a2luZ1N0b3JlUmVjdC5tb3ZlKDAsIC10aWxlSGVpZ2h0KCkpOworCisgICAgLy8gTW92ZSB0aGUg
cmVjdCBkb3duLgorICAgIHdoaWxlIChzaG91bGRNb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSB8
fCAoZGVsdGFZIDwgMCAmJiBjYW5Nb3ZlRG93bihiYWNraW5nU3RvcmVSZWN0KSkpCisgICAgICAg
IGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCB0aWxlSGVpZ2h0KCkpOworCisgICAgcmV0dXJuIGJh
Y2tpbmdTdG9yZVJlY3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2lu
Z1N0b3JlUmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkKK3sK
KyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNob3VsZFJlc2V0
VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCBjdXJyZW50QmFja2luZ1N0b3JlUmVjdCA9IGZyb250U3RhdGUoKS0+YmFj
a2luZ1N0b3JlUmVjdCgpOworCisgICAgaWYgKGJhY2tpbmdTdG9yZVJlY3QgPT0gY3VycmVudEJh
Y2tpbmdTdG9yZVJlY3QpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX1RJTEVNQVRSSVgK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2V0QmFja2luZ1N0b3JlUmVjdCBj
aGFuZ2VkIGZyb20gKCVkLCVkICVkeCVkKSB0byAoJWQsJWQgJWR4JWQpIiwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LngoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LnkoKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0LndpZHRoKCksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZVJlY3QueCgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC55KCksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBiYWNraW5nU3RvcmVSZWN0LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICBiYWNraW5nU3RvcmVSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFw
IGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFRpbGVJbmRleExp
c3QgaW5kZXhlc1RvRmlsbCA9IGluZGV4ZXNGb3JCYWNraW5nU3RvcmVSZWN0KGJhY2tpbmdTdG9y
ZVJlY3QpOworCisgICAgQVNTRVJUKHN0YXRpY19jYXN0PGludD4oaW5kZXhlc1RvRmlsbC5zaXpl
KCkpID09IGN1cnJlbnRNYXAuc2l6ZSgpKTsKKworICAgIFRpbGVNYXAgbmV3VGlsZU1hcDsKKyAg
ICBUaWxlTWFwIGxlZnRPdmVyVGlsZXM7CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggb3VyIGN1
cnJlbnQgdGlsZSBtYXAgYW5kIGFkZCB0aWxlcyB0aGF0IGFyZSByZW5kZXJlZCB3aXRoCisgICAg
Ly8gb3VyIG5ldyBiYWNraW5nIHN0b3JlIHJlY3QuCisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0
b3IgdGlsZU1hcEVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gdGlsZU1hcEVuZDsgKytp
dCkgeworICAgICAgICBUaWxlSW5kZXggb2xkSW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJh
Y2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOworCisgICAgICAgIC8vIFJlc2V0IHRo
ZSBvbGQgaW5kZXguCisgICAgICAgIHJlc2V0VGlsZShvbGRJbmRleCwgdGlsZSwgZmFsc2UgLypy
ZXNldEJhY2tncm91bmQqLyk7CisKKyAgICAgICAgLy8gT3JpZ2luIG9mIGxhc3QgY29tbWl0dGVk
IHJlbmRlciBmb3IgdGlsZSBpbiB0cmFuc2Zvcm1lZCBjb250ZW50IGNvb3JkaW5hdGVzLgorICAg
ICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gb3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGls
ZShvbGRJbmRleCwgdGlsZSwgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QpOworCisgICAgICAgIC8v
IElmIHRoZSBuZXcgYmFja2luZyBzdG9yZSByZWN0IGNvbnRhaW5zIHRoaXMgb3JpZ2luLCB0aGVu
IGluc2VydCB0aGUgdGlsZSB0aGVyZQorICAgICAgICAvLyBhbmQgbWFyayBpdCBhcyBubyBsb25n
ZXIgc2hpZnRlZC4gTm90ZTogUGxhdGZvcm06OkludFJlY3Q6OmNvbnRhaW5zIGNoZWNrcyBmb3Ig
YSAxeDEgcmVjdAorICAgICAgICAvLyBiZWxvdyBhbmQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBvcmln
aW4gc28gaXQgaXMgY29ycmVjdCB1c2FnZSBoZXJlLgorICAgICAgICBpZiAoYmFja2luZ1N0b3Jl
UmVjdC5jb250YWlucyhvcmlnaW4pKSB7CisgICAgICAgICAgICBUaWxlSW5kZXggbmV3SW5kZXgg
PSBpbmRleE9mVGlsZShvcmlnaW4sIGJhY2tpbmdTdG9yZVJlY3QpOworICAgICAgICAgICAgUGxh
dGZvcm06OkludFJlY3QgcmVjdChvcmlnaW4sIHRpbGVTaXplKCkpOworICAgICAgICAgICAgaWYg
KG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJKb2JzUHJldmlvdXNseUF0dGVtcHRlZEJ1dE5v
dFJlbmRlcmVkKHJlY3QpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlbmRlciBxdWV1
ZSBwcmV2aW91c2x5IHRyaWVkIHRvIHJlbmRlciB0aGlzIHRpbGUsIGJ1dCB0aGUKKyAgICAgICAg
ICAgICAgICAvLyBiYWNraW5nc3RvcmUgd2Fzbid0IGluIHRoZSBjb3JyZWN0IHBsYWNlIG9yIHRo
ZSB0aWxlIHdhc24ndCB2aXNpYmxlCisgICAgICAgICAgICAgICAgLy8gYXQgdGhlIHRpbWUgdGhl
biB3ZSBjYW4ndCBzaW1wbHkgcmVzdG9yZSB0aGUgdGlsZSBzaW5jZSB0aGUgY29udGVudAorICAg
ICAgICAgICAgICAgIC8vIGlzIG5vdyBpbnZhbGlkIGFzIGZhciBhcyBXZWJLaXQgaXMgY29uY2Vy
bmVkLiBJbnN0ZWFkLCB3ZSBjbGVhcgorICAgICAgICAgICAgICAgIC8vIHRoZSB0aWxlIGhlcmUg
b2YgdGhlIHJlZ2lvbiBhbmQgdGhlbiBwdXQgdGhlIHRpbGUgaW4gdGhlIHJlbmRlcgorICAgICAg
ICAgICAgICAgIC8vIHF1ZXVlIGFnYWluLgorCisgICAgICAgICAgICAgICAgLy8gSW50ZXJzZWN0
IHRoZSB0aWxlIHdpdGggdGhlIG5vdCByZW5kZXJlZCByZWdpb24gdG8gZ2V0IHRoZSBhcmVhcwor
ICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0aWxlIHRoYXQgd2UgbmVlZCB0byBjbGVhci4KKyAg
ICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdp
b24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucyhtX3JlbmRlclF1
ZXVlLT5yZWd1bGFyUmVuZGVySm9ic05vdFJlbmRlcmVkUmVnaW9uKCksIHJlY3QpOworICAgICAg
ICAgICAgICAgIGNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24obmV3SW5kZXgs
IHRpbGUsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvbiwgYmFja2luZ1N0b3JlUmVjdCk7CisjaWYgREVC
VUdfQkFDS0lOR1NUT1JFCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50
cyA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lvbi5leHRlbnRzKCk7CisgICAgICAgICAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0
aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tpbmdTdG9yZVJlY3QgZGlkIGNsZWFy
IHRpbGUgJWQsJWQgJWR4JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZXh0ZW50cy54KCksIGV4dGVudHMueSgpLCBleHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVp
Z2h0KCkpOworI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8v
IE1hcmsgYXMgbmVlZGluZyB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKCF0aWxlLT5mcm9u
dEJ1ZmZlcigpLT5pc1JlbmRlcmVkKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIWlzQ3VycmVu
dFZpc2libGVKb2IobmV3SW5kZXgsIHRpbGUsIGJhY2tpbmdTdG9yZVJlY3QpKQorICAgICAgICAg
ICAgICAgICAgICB1cGRhdGVUaWxlKG9yaWdpbiwgZmFsc2UgLyppbW1lZGlhdGUqLyk7CisgICAg
ICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIERvIHNvbWUgYm9va2tlZXBpbmcgd2l0aCBzaGlm
dGluZyB0aWxlcy4uLgorICAgICAgICAgICAgdGlsZS0+Y2xlYXJTaGlmdCgpOworICAgICAgICAg
ICAgdGlsZS0+c2V0Q29tbWl0dGVkKHRydWUpOworCisgICAgICAgICAgICBzaXplX3QgaSA9IGlu
ZGV4ZXNUb0ZpbGwuZmluZChuZXdJbmRleCk7CisgICAgICAgICAgICBBU1NFUlQoaSAhPSBXVEY6
Om5vdEZvdW5kKTsKKyAgICAgICAgICAgIGluZGV4ZXNUb0ZpbGwucmVtb3ZlKGkpOworICAgICAg
ICAgICAgbmV3VGlsZU1hcC5hZGQobmV3SW5kZXgsIHRpbGUpOworICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgLy8gU3RvcmUgdGhpcyB0aWxlIGFuZCBpbmRleCBzbyB3ZSBjYW4gYWRkIGl0
IHRvIHRoZSByZW1haW5pbmcgbGVmdCBvdmVyIHNwb3RzLi4uCisgICAgICAgICAgICBsZWZ0T3Zl
clRpbGVzLmFkZChvbGRJbmRleCwgdGlsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NF
UlQoc3RhdGljX2Nhc3Q8aW50PihpbmRleGVzVG9GaWxsLnNpemUoKSkgPT0gbGVmdE92ZXJUaWxl
cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBUaWxlTWFwOjpjb25zdF9pdGVyYXRv
ciBsZWZ0T3ZlckVuZCA9IGxlZnRPdmVyVGlsZXMuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IGxlZnRPdmVyVGlsZXMuYmVnaW4oKTsgaXQgIT0gbGVmdE92ZXJF
bmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4IG9sZEluZGV4ID0gaXQtPmZpcnN0OworICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGkg
Pj0gaW5kZXhlc1RvRmlsbC5zaXplKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hF
RCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBUaWxlSW5kZXgg
bmV3SW5kZXggPSBpbmRleGVzVG9GaWxsLmF0KGkpOworCisgICAgICAgIC8vIE9yaWdpbiBvZiBs
YXN0IGNvbW1pdHRlZCByZW5kZXIgZm9yIHRpbGUgaW4gdHJhbnNmb3JtZWQgY29udGVudCBjb29y
ZGluYXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbk9mT2xkID0gb3JpZ2lu
T2ZMYXN0UmVuZGVyRm9yVGlsZShvbGRJbmRleCwgdGlsZSwgY3VycmVudEJhY2tpbmdTdG9yZVJl
Y3QpOworICAgICAgICAvLyBPcmlnaW4gb2YgdGhlIG5ldyBpbmRleCBmb3IgdGhlIG5ldyBiYWNr
aW5nIHN0b3JlIHJlY3QuCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZk5ldyA9
IG9yaWdpbk9mVGlsZShuZXdJbmRleCwgYmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8g
TWFyayBhcyBuZWVkaW5nIHVwZGF0ZS4KKyAgICAgICAgdXBkYXRlVGlsZShvcmlnaW5PZk5ldywg
ZmFsc2UgLyppbW1lZGlhdGUqLyk7CisKKyAgICAgICAgdGlsZS0+Y2xlYXJTaGlmdCgpOworICAg
ICAgICB0aWxlLT5zZXRDb21taXR0ZWQoZmFsc2UpOworICAgICAgICB0aWxlLT5zZXRIb3Jpem9u
dGFsU2hpZnQoKG9yaWdpbk9mT2xkLngoKSAtIG9yaWdpbk9mTmV3LngoKSkgLyB0aWxlV2lkdGgo
KSk7CisgICAgICAgIHRpbGUtPnNldFZlcnRpY2FsU2hpZnQoKG9yaWdpbk9mT2xkLnkoKSAtIG9y
aWdpbk9mTmV3LnkoKSkgLyB0aWxlSGVpZ2h0KCkpOworCisgICAgICAgIG5ld1RpbGVNYXAuYWRk
KG5ld0luZGV4LCB0aWxlKTsKKworICAgICAgICArK2k7CisgICAgfQorCisgICAgLy8gQ2hlY2tz
IHRvIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGxvc3QgYW55IHRpbGVzLgorICAgIEFTU0VSVChjdXJy
ZW50TWFwLnNpemUoKSA9PSBuZXdUaWxlTWFwLnNpemUoKSk7CisKKyAgICBiYWNrU3RhdGUoKS0+
c2V0TnVtYmVyT2ZUaWxlc1dpZGUoYmFja2luZ1N0b3JlUmVjdC53aWR0aCgpIC8gdGlsZVdpZHRo
KCkpOworICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzSGlnaChiYWNraW5nU3RvcmVS
ZWN0LmhlaWdodCgpIC8gdGlsZUhlaWdodCgpKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0QmFja2lu
Z1N0b3JlT2Zmc2V0KGJhY2tpbmdTdG9yZVJlY3QubG9jYXRpb24oKSk7CisgICAgYmFja1N0YXRl
KCktPnNldFRpbGVNYXAobmV3VGlsZU1hcCk7CisKKyAgICBzd2FwU3RhdGUoKTsKK30KKworQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6VGlsZUluZGV4TGlzdCBCYWNraW5nU3RvcmVQcml2YXRlOjppbmRl
eGVzRm9yQmFja2luZ1N0b3JlUmVjdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0
b3JlUmVjdCkgY29uc3QKK3sKKyAgICBUaWxlSW5kZXhMaXN0IGluZGV4ZXM7CisgICAgaW50IG51
bWJlck9mVGlsZXNXaWRlID0gYmFja2luZ1N0b3JlUmVjdC53aWR0aCgpIC8gdGlsZVdpZHRoKCk7
CisgICAgaW50IG51bWJlck9mVGlsZXNIaWdoID0gYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSAv
IHRpbGVIZWlnaHQoKTsKKyAgICBmb3IgKGludCB5ID0gMDsgeSA8IG51bWJlck9mVGlsZXNIaWdo
OyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1iZXJPZlRpbGVzV2lkZTsg
Kyt4KSB7CisgICAgICAgICAgICBUaWxlSW5kZXggaW5kZXgoeCwgeSk7CisgICAgICAgICAgICBp
bmRleGVzLmFwcGVuZChpbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluZGV4
ZXM7Cit9CisKK1BsYXRmb3JtOjpJbnRQb2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmlnaW5P
Zkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tp
bmdTdG9yZVRpbGUqIHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNr
aW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJldHVybiBvcmlnaW5PZlRpbGUoaW5kZXhPZkxh
c3RSZW5kZXJGb3JUaWxlKGluZGV4LCB0aWxlKSwgYmFja2luZ1N0b3JlUmVjdCk7Cit9CisKK1Rp
bGVJbmRleCBCYWNraW5nU3RvcmVQcml2YXRlOjppbmRleE9mTGFzdFJlbmRlckZvclRpbGUoY29u
c3QgVGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSkgY29uc3QKK3sKKyAg
ICByZXR1cm4gVGlsZUluZGV4KGluZGV4LmkoKSArIHRpbGUtPmhvcml6b250YWxTaGlmdCgpLCBp
bmRleC5qKCkgKyB0aWxlLT52ZXJ0aWNhbFNoaWZ0KCkpOworfQorCitUaWxlSW5kZXggQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6aW5kZXhPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmln
aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgaW50IG9mZnNl
dFggPSBvcmlnaW4ueCgpIC0gYmFja2luZ1N0b3JlUmVjdC54KCk7CisgICAgaW50IG9mZnNldFkg
PSBvcmlnaW4ueSgpIC0gYmFja2luZ1N0b3JlUmVjdC55KCk7CisgICAgaWYgKG9mZnNldFgpCisg
ICAgICAgIG9mZnNldFggPSBvZmZzZXRYIC8gdGlsZVdpZHRoKCk7CisgICAgaWYgKG9mZnNldFkp
CisgICAgICAgIG9mZnNldFkgPSBvZmZzZXRZIC8gdGlsZUhlaWdodCgpOworICAgIHJldHVybiBU
aWxlSW5kZXgob2Zmc2V0WCwgb2Zmc2V0WSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6Y2xlYXJBbmRVcGRhdGVUaWxlT2ZOb3RSZW5kZXJlZFJlZ2lvbihjb25zdCBUaWxlSW5kZXgm
IGluZGV4LCBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uJiB0aWxlTm90UmVuZGVyZWRSZWdpb24sCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1cGRhdGUpCit7Cisg
ICAgLy8gSW50ZXJzZWN0IHRoZSB0aWxlIHdpdGggdGhlIG5vdCByZW5kZXJlZCByZWdpb24gdG8g
Z2V0IHRoZSBhcmVhcworICAgIC8vIG9mIHRoZSB0aWxlIHRoYXQgd2UgbmVlZCB0byBjbGVhci4K
KyAgICBJbnRSZWN0TGlzdCB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cyA9IHRpbGVOb3RSZW5k
ZXJlZFJlZ2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZU5vdFJl
bmRlcmVkUmVnaW9uUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJl
Y3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3Rz
LmF0KGkpOworICAgICAgICAvLyBDbGVhciB0aGUgcmVuZGVyIHF1ZXVlIG9mIHRoaXMgcmVjdC4K
KyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+Y2xlYXIodGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCwg
dHJ1ZSAvKmNsZWFyUmVndWxhclJlbmRlckpvYnMqLyk7CisKKyAgICAgICAgaWYgKHVwZGF0ZSkg
eworICAgICAgICAgICAgLy8gQWRkIGl0IGFnYWluIGFzIGEgcmVndWxhciByZW5kZXIgam9iLgor
ICAgICAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6UmVndWxh
clJlbmRlciwgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7CisgICAgICAgIH0KKworICAgICAg
ICAvLyBGaW5kIHRoZSBvcmlnaW4gb2YgdGhpcyB0aWxlLgorICAgICAgICBQbGF0Zm9ybTo6SW50
UG9pbnQgb3JpZ2luID0gb3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5nU3RvcmVSZWN0KTsKKwor
ICAgICAgICAvLyBNYXAgdG8gdGlsZSBjb29yZGluYXRlcy4KKyAgICAgICAgdGlsZU5vdFJlbmRl
cmVkUmVnaW9uUmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7CisKKyAgICAgICAg
Ly8gQ2xlYXIgdGhlIHRpbGUgb2YgdGhpcyByZWdpb24uCisgICAgICAgIHRpbGUtPmZyb250QnVm
ZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24odGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7Cisg
ICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbih0aWxlTm90UmVu
ZGVyZWRSZWdpb25SZWN0KTsKKyAgICB9Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
aXNDdXJyZW50VmlzaWJsZUpvYihjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBCYWNraW5nU3RvcmVU
aWxlKiB0aWxlLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29u
c3QKK3sKKyAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgd2hvbGUgcmVjdCBpcyBpbiB0aGUgcXVl
dWUuCisgICAgUGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0ID0gUGxhdGZvcm06OkludFJlY3Qo
b3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5nU3RvcmVSZWN0KSwgdGlsZVNpemUoKSk7CisgICAg
aWYgKG1fcmVuZGVyUXVldWUtPmlzQ3VycmVudFZpc2libGVTY3JvbGxKb2Iod2hvbGVSZWN0KSB8
fCBtX3JlbmRlclF1ZXVlLT5pc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9iQ29tcGxldGVkKHdob2xl
UmVjdCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gU2Vjb25kIGNoZWNrIGlmIHRo
ZSBpbmRpdmlkdWFsIHBhcnRzIG9mIHRoZSBub24tcmVuZGVyZWQgcmVnaW9uIGFyZSBpbiB0aGUg
cmVndWxhciBxdWV1ZS4KKyAgICBib29sIGlzQ3VycmVudCA9IHRydWU7IC8vIEl0IGlzIHRydWUg
dW50aWwgaXQgaXNuJ3QgOikKKworICAgIEludFJlY3RMaXN0IHRpbGVOb3RSZW5kZXJlZFJlZ2lv
blJlY3RzID0gdGlsZS0+ZnJvbnRCdWZmZXIoKS0+bm90UmVuZGVyZWRSZWdpb24oKS5yZWN0cygp
OworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMu
c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZU5vdFJlbmRlcmVk
UmVnaW9uUmVjdCA9IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3RzLmF0KGkpOworICAgICAgICBQ
bGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gb3JpZ2luT2ZUaWxlKGluZGV4LCBiYWNraW5nU3Rv
cmVSZWN0KTsKKworICAgICAgICAvLyBNYXAgdG8gdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRp
bmF0ZXMuCisgICAgICAgIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QubW92ZShvcmlnaW4ueCgp
LCBvcmlnaW4ueSgpKTsKKworICAgICAgICBpc0N1cnJlbnQgPSBtX3JlbmRlclF1ZXVlLT5pc0N1
cnJlbnRSZWd1bGFyUmVuZGVySm9iKHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpID8gaXNDdXJy
ZW50IDogZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGlzQ3VycmVudDsKK30KKwordm9pZCBC
YWNraW5nU3RvcmVQcml2YXRlOjpzY3JvbGxCYWNraW5nU3RvcmUoaW50IGRlbHRhWCwgaW50IGRl
bHRhWSkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghaXNBY3RpdmUoKSkgeworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNo
b3VsZFJlc2V0VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICAvLyBDYWxjdWxhdGUgb3VyIG5ldyBwcmVmZXJyZWQgbWF0cml4IGRpbWVuc2lvbi4KKyAg
ICBpZiAoZGVsdGFYIHx8IGRlbHRhWSkKKyAgICAgICAgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGlt
ZW5zaW9uID0gYWJzKGRlbHRhWCkgPiBhYnMoZGVsdGFZKSA/IEhvcml6b250YWwgOiBWZXJ0aWNh
bDsKKworICAgIC8vIENhbGN1bGF0ZSBvdXIgcHJlZmVycmVkIG1hdHJpeCBnZW9tZXRyeS4KKyAg
ICBEaXZpc29yIGRpdmlzb3IgPSBiZXN0RGl2aXNvcihleHBhbmRlZENvbnRlbnRzU2l6ZSgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0
KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bU51bWJlck9mVGls
ZXNXaWRlKCksIG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lvbik7CisKKyNpZiBE
RUJVR19USUxFTUFUUklYCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9s
bEJhY2tpbmdTdG9yZSBkaXZpc29yICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
IGRpdmlzb3IuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yLnNlY29u
ZCk7CisjZW5kaWYKKworICAgIC8vIEluaXRpYWxpemUgYSByZWN0IHdpdGggdGhhdCBuZXcgZ2Vv
bWV0cnkuCisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCgwLCAwLCBkaXZp
c29yLmZpcnN0ICogdGlsZVdpZHRoKCksIGRpdmlzb3Iuc2Vjb25kICogdGlsZUhlaWdodCgpKTsK
KworICAgIC8vIFNjcm9sbCB0aGF0IHJlY3Qgc28gdGhhdCBpdCBmaXRzIG91ciBjb250ZW50cyBh
bmQgdmlld3BvcnQgYW5kIHNjcm9sbCBkZWx0YS4KKyAgICBiYWNraW5nU3RvcmVSZWN0ID0gYmFj
a2luZ1N0b3JlUmVjdEZvclNjcm9sbChkZWx0YVgsIGRlbHRhWSwgYmFja2luZ1N0b3JlUmVjdCk7
CisKKyAgICBBU1NFUlQoIWJhY2tpbmdTdG9yZVJlY3QuaXNFbXB0eSgpKTsKKworICAgIHNldEJh
Y2tpbmdTdG9yZVJlY3QoYmFja2luZ1N0b3JlUmVjdCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6cmVuZGVyKGNvbnN0IEludFJlY3RMaXN0JiByZWN0TGlzdCwgYm9vbCByZW5kZXJD
b250ZW50T25seSkKK3sKKyAgICAvLyBGSVhNRTogV2UgY3ljbGUgdGhyb3VnaCBvbmUgYnkgb25l
IGFuZCBvbmx5IGJsaXQgdGhlIGNvbnRlbnRzIGF0IHRoZSBlbmQuCisgICAgLy8gVGhpcyBjYW4g
YmUgaW1wcm92ZWQgdXBvbiBpZiB3ZSBoYWQgYSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1Rv
VGlsZXMgdGhhdAorICAgIC8vIHRvb2sgYSBzZXQgb2YgcmVjdHMgYW5kIGRlY29tcG9zZWQgdGhl
bSBhcHByb3ByaWF0ZWx5LgorICAgIGJvb2wgcmVuZGVyZWQgPSBmYWxzZTsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IHJlY3RMaXN0LnNpemUoKTsgKytpKQorICAgICAgICByZW5kZXJlZCA9
IHJlbmRlcihyZWN0TGlzdC5hdChpKSwgdHJ1ZSkgPyB0cnVlIDogcmVuZGVyZWQ7CisKKyAgICBp
ZiAocmVuZGVyZWQgJiYgIXJlbmRlckNvbnRlbnRPbmx5KSB7CisgICAgICAgIGlmICghc2hvdWxk
RGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgICAgIGJsaXRWaXNpYmxlQ29udGVu
dHMoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW52YWxpZGF0ZVdpbmRvdygpOworICAg
IH0KKworICAgIHJldHVybiByZW5kZXJlZDsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRl
OjpyZW5kZXJEaXJlY3RUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwgYm9v
bCByZW5kZXJDb250ZW50T25seSkKK3sKKyAgICByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKTsKKwor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IHJlY3Q7CisgICAgZGlydHlSZWN0Lmlu
dGVyc2VjdCh1bmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworCisgICAgaWYgKGRpcnR5
UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHNjcmVlblJlY3QgPSBtX2NsaWVudC0+bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNU
b1RyYW5zZm9ybWVkVmlld3BvcnQoZGlydHlSZWN0KTsKKyAgICB3aW5kb3dGcm9udEJ1ZmZlclN0
YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbihzY3JlZW5SZWN0KTsKKyAgICBjb3B5UHJldmlvdXND
b250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpOworCisgICAgcGFpbnREZWZhdWx0QmFja2dy
b3VuZChkaXJ0eVJlY3QsIFRyYW5zZm9ybWF0aW9uTWF0cml4KCksIHRydWUgLypmbHVzaCovKTsK
KworICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4gPSB1bmNsaXBwZWRWaXNpYmxl
Q29udGVudHNSZWN0KCkubG9jYXRpb24oKTsKKyAgICAvLyBXZSBkb24ndCBuZWVkIGEgYnVmZmVy
IHNpbmNlIHdlJ3JlIGRpcmVjdCByZW5kZXJpbmcgdG8gd2luZG93LgorICAgIHJlbmRlckNvbnRl
bnRzKDAsIG9yaWdpbiwgZGlydHlSZWN0KTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+
YWRkQmxpdHRlZFJlZ2lvbihzY3JlZW5SZWN0KTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykgJiYgRU5BQkxFX0NPTVBPU0lUSU5HX1NVUkZBQ0UKKyAgICBpZiAobV93ZWJQYWdl
LT5kLT5tX2NsaWVudC0+d2luZG93KCktPndpbmRvd1VzYWdlKCkgIT0gQmxhY2tCZXJyeTo6UGxh
dGZvcm06OkdyYXBoaWNzOjpXaW5kb3c6OkdMRVMyVXNhZ2UpIHsKKyAgICAgICAgUGxhdGZvcm06
OkludFJlY3QgY2xpcHBlZFJlY3QgPSBpbnRlcnNlY3Rpb24oZGlydHlSZWN0LCB2aXNpYmxlQ29u
dGVudHNSZWN0KCkpOworICAgICAgICBibGVuZENvbXBvc2l0aW5nU3VyZmFjZShjbGlwcGVkUmVj
dCk7CisgICAgfQorI2VuZGlmCisKKyAgICBib29sIHNob3VsZEludmFsaWRhdGUgPSAhbV9zdXNw
ZW5kU2NyZWVuVXBkYXRlcyAmJiAhcmVuZGVyQ29udGVudE9ubHk7CisgICAgaWYgKCFzaG91bGRJ
bnZhbGlkYXRlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGludmFsaWRhdGVXaW5kb3co
c2NyZWVuUmVjdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6cmVuZGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0LCBib29sIHJlbmRlckNv
bnRlbnRPbmx5KQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgcmVxdWVzdExheW91dElmTmVlZGVkKCk7CisKKyAgICBpZiAo
c2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgcmV0dXJuIHJlbmRlckRp
cmVjdFRvV2luZG93KHJlY3QsIHJlbmRlckNvbnRlbnRPbmx5KTsKKworICAgIFRpbGVSZWN0TGlz
dCB0aWxlUmVjdExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMocmVjdCk7
CisgICAgaWYgKHRpbGVSZWN0TGlzdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyIHJlY3Q9KCVkLCVkICVkeCVk
KSwgcmVuZGVyQ29udGVudE9ubHk9JXMsIG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMgPSAl
cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LngoKSwgcmVjdC55KCksIHJlY3Qu
d2lkdGgoKSwgcmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRl
ckNvbnRlbnRPbmx5ID8gInRydWUiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgIG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyNl
bmRpZgorCisgICAgYm9vbCBibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdyA9IG1f
d2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpID09IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOworCisgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFw
IGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IGRpcnR5Q29udGVudHNSZWN0OworICAgIGJvb2wgc2hvdWxkQmxpdCA9ICFtX3N1c3Bl
bmRCYWNraW5nU3RvcmVVcGRhdGVzICYmICFyZW5kZXJDb250ZW50T25seTsKKyAgICBjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9y
bTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsK
KyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCB2aWV3cG9ydFJlY3QgPSBQbGF0Zm9ybTo6SW50
UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdw
b3J0U2l6ZSgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZVJlY3RMaXN0LnNp
emUoKTsgKytpKSB7CisgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0ID0gdGlsZVJlY3RMaXN0W2ld
OworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSB0aWxlUmVjdC5maXJzdDsKKyAgICAgICAgUGxh
dGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKyAgICAgICAg
QmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0KGluZGV4KTsKKworICAgICAg
ICAvLyBUaGlzIGRpcnR5IHRpbGUgcmVjdCBpcyBpbiB0aWxlIGNvb3JkaW5hdGVzLCBidXQgaXQg
bmVlZHMgdG8gYmUgaW4KKyAgICAgICAgLy8gdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRpbmF0
ZXMuCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IG1hcEZyb21UaWxlc1Rv
VHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisKKyAgICAgICAgLy8gSWYgd2UncmUgbm90
IHlldCBjb21taXR0ZWQsIHRoZW4gY29tbWl0IG5vdyBieSBjbGVhcmluZyB0aGUgcmVuZGVyZWQg
cmVnaW9uCisgICAgICAgIC8vIGFuZCBzZXR0aW5nIHRoZSBjb21taXR0ZWQgZmxhZyBhcyB3ZWxs
IGFzIGNsZWFyaW5nIHRoZSBzaGlmdC4KKyAgICAgICAgaWYgKCF0aWxlLT5pc0NvbW1pdHRlZCgp
KSB7CisgICAgICAgICAgICB0aWxlLT5zZXRDb21taXR0ZWQodHJ1ZSk7CisgICAgICAgICAgICB0
aWxlLT5mcm9udEJ1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgICAgICB0
aWxlLT5iYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24oKTsKKyAgICAgICAgICAgIHRp
bGUtPmNsZWFyU2hpZnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSB0aWxlIGhh
cyBiZWVuIGNyZWF0ZWQsIGJ1dCB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBwYWludGlu
ZyBvbiBpdAorICAgICAgICAvLyB0aGVuIGl0IGhhc24ndCBiZWVuIGdpdmVuIGEgZGVmYXVsdCBi
YWNrZ3JvdW5kIHlldCBzbyB0aGF0IHdlIGNhbiBzYXZlIHRpbWUgZHVyaW5nCisgICAgICAgIC8v
IHN0YXJ0dXAuIFRoYXQncyB3aHkgd2UgYXJlIGRvaW5nIGl0IGhlcmUgaW5zdGVhZC4uLgorICAg
ICAgICBpZiAoIXRpbGUtPmJhY2tncm91bmRQYWludGVkKCkpCisgICAgICAgICAgICB0aWxlLT5w
YWludEJhY2tncm91bmQoKTsKKworICAgICAgICAvLyBQYWludCBkZWZhdWx0IGJhY2tncm91bmQg
aWYgY29udGVudHMgcmVjdCBpcyBlbXB0eS4KKyAgICAgICAgaWYgKCFleHBhbmRlZENvbnRlbnRz
UmVjdCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHdlIHNob3VsZCBj
bGlwIHRoZSBjb250ZW50cyBzaXplIGFuZCByZW5kZXIgdGhlIGNvbnRlbnQuCisgICAgICAgICAg
ICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGV4cGFuZGVkQ29udGVudHNSZWN0KCkpOworCisgICAgICAg
ICAgICBkaXJ0eVRpbGVSZWN0LmludGVyc2VjdCh0aWxlQ29udGVudHNSZWN0KGluZGV4LCBleHBh
bmRlZENvbnRlbnRzUmVjdCgpLCBjdXJyZW50U3RhdGUpKTsKKworICAgICAgICAgICAgLy8gV2Ug
cHJvYmFibHkgaGF2ZSBleHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVudHMgc2l6ZSBpcyBzbyBz
bWFsbC4KKyAgICAgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgorICAgICAgICAg
ICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIH0KKworICAgICAgICBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZlRp
bGUoZGlydHlUaWxlUmVjdCwgdGlsZSk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpCdWZmZXIqIG5hdGl2ZUJ1ZmZlcgorICAgICAgICAgICAgPSB0aWxlLT5iYWNr
QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpOworCisgICAgICAgIGlmIChibGl0dGluZ0RpcmVjdGx5
VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZt
X2JsaXRHZW5lcmF0aW9uTG9jayk7CisgICAgICAgICAgICB3aGlsZSAobV9ibGl0R2VuZXJhdGlv
biA9PSB0aWxlLT5iYWNrQnVmZmVyKCktPmJsaXRHZW5lcmF0aW9uKCkpIHsKKyAgICAgICAgICAg
ICAgICBpbnQgZXJyID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmbV9ibGl0R2VuZXJhdGlvbkNv
bmQsICZtX2JsaXRHZW5lcmF0aW9uTG9jaywgJm1fY3VycmVudEJsaXRFbmQpOworICAgICAgICAg
ICAgICAgIGlmIChlcnIgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgICAgICsrbV9i
bGl0R2VuZXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0
aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29u
ZF90aW1lZHdhaXQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIEZJWE1FOiBtb2RpZnkgcmVuZGVyIHRvIHRha2UgYSBWZWN0b3I8SW50
UmVjdD4gcGFyYW1ldGVyIHNvIHdlJ3JlIG5vdCByZWNyZWF0aW5nCisgICAgICAgIC8vIEdyYXBo
aWNzQ29udGV4dCBvbiB0aGUgc3RhY2sgZWFjaCB0aW1lLgorICAgICAgICByZW5kZXJDb250ZW50
cyhuYXRpdmVCdWZmZXIsIG9yaWdpbk9mVGlsZShpbmRleCksIGRpcnR5UmVjdCk7CisKKyAgICAg
ICAgLy8gQWRkIHRoZSBuZXdseSByZW5kZXJlZCByZWdpb24gdG8gdGhlIHRpbGUgc28gaXQgY2Fu
IGtlZXAgdHJhY2sgZm9yIGJsaXRzLgorICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmFkZFJl
bmRlcmVkUmVnaW9uKGRpcnR5VGlsZVJlY3QpOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBj
b250ZW50cyBmb3IgdGhpcyB0aWxlJ3MgYmFja2J1ZmZlciBhcmUgdmFsaWQgd2hlbgorICAgICAg
ICAvLyBjb21wYXJlZCB0byB0aGUgZnJvbnQgYnVmZmVyLgorICAgICAgICBib29sIGJhY2tCdWZm
ZXJJc1ZhbGlkID0gdGlsZS0+YmFja0J1ZmZlcigpLT5pc1JlbmRlcmVkKHRpbGUtPmZyb250QnVm
ZmVyKCktPnJlbmRlcmVkUmVnaW9uKCkpOworCisgICAgICAgIC8vIE91ciBjdXJyZW50IGRlc2ln
biBkZW1hbmRzIHRoYXQgdGhlIGJhY2tidWZmZXIgaXMgdmFsaWQgYWZ0ZXIgYW55CisgICAgICAg
IC8vIHJlbmRlcmluZyBvcGVyYXRpb24gc28gYXNzZXJ0IHRoYXQgaGVyZS4gSWYgd2UgaGl0IHRo
aXMgYXNzZXJ0IHdlCisgICAgICAgIC8vIGtub3cgdGhhdCB3ZSdyZSBkb2luZyBzb21ldGhpbmcg
YmFkIHRoYXQgd2lsbCByZXN1bHQgaW4gYXJ0aWZhY3RzLgorICAgICAgICBBU1NFUlQoYmFja0J1
ZmZlcklzVmFsaWQpOworCisgICAgICAgIC8vIFdlIHdpbGwgbmVlZCBhIHN3YXAgaGVyZSBiZWNh
dXNlIG9mIHRoZSBzaGFyZWQgYmFjayBidWZmZXIuCisgICAgICAgIGlmIChiYWNrQnVmZmVySXNW
YWxpZCkgeworICAgICAgICAgICAgdGlsZS0+c3dhcEJ1ZmZlcnMoKTsKKyAgICAgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5z
eW5jVG9DdXJyZW50TWVzc2FnZSgpOworICAgICAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5j
bGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBkaXJ0eUNvbnRlbnRz
UmVjdCA9IFBsYXRmb3JtOjp1bmlvbk9mUmVjdHMoZGlydHlDb250ZW50c1JlY3QsIGRpcnR5UmVj
dCk7CisgICAgfQorCisgICAgLy8gQ2xpcCB0byB0aGUgdmlzaWJsZSBjb250ZW50IGluY2x1ZGlu
ZyBvdmVyc2Nyb2xsLgorICAgIGRpcnR5Q29udGVudHNSZWN0LmludGVyc2VjdCh1bmNsaXBwZWRW
aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIGlmIChkaXJ0eUNvbnRlbnRzUmVjdC5pc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKCFzaG91bGRCbGl0KQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZXF1ZXN0TGF5b3V0SWZOZWVk
ZWQoKSBjb25zdAoreworICAgIG1fd2ViUGFnZS0+ZC0+cmVxdWVzdExheW91dElmTmVlZGVkKCk7
Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVuZGVyVmlzaWJsZUNvbnRlbnRzKGJv
b2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgUGxhdGZvcm06OkludFJlY3QgcmVuZGVyUmVj
dCA9IHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkgPyB2aXNpYmxlQ29udGVudHNSZWN0
KCkgOiB2aXNpYmxlVGlsZXNSZWN0KCk7CisKKyAgICByZW5kZXIocmVuZGVyUmVjdCwgcmVuZGVy
Q29udGVudE9ubHkpOworICAgIG1fcmVuZGVyUXVldWUtPmNsZWFyKHJlbmRlclJlY3QsIHRydWUg
LypjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKi8pOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZh
dGU6OnJlbmRlckJhY2tpbmdTdG9yZShib29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIHJl
bmRlcihmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKSwgcmVuZGVyQ29udGVudE9ubHkp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMoYm9v
bCBmb3JjZSkKK3sKKyAgICAvLyBCbGl0dGluZyBtdXN0IG5ldmVyIGhhcHBlbiBmb3IgZGlyZWN0
IHJlbmRlcmluZyBjYXNlLgorICAgIEFTU0VSVCghc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5k
b3coKSk7CisKKyAgICBpZiAobV9zdXNwZW5kU2NyZWVuVXBkYXRlcykgeworICAgICAgICAvLyBB
dm9pZCBjbGllbnQgZ29pbmcgaW50byBidXN5IGxvb3Agd2hpbGUgdXBkYXRlcyBzdXNwZW5kZWQu
CisgICAgICAgIGlmIChmb3JjZSkKKyAgICAgICAgICAgIG1faGFzQmxpdEpvYnMgPSBmYWxzZTsK
KyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKSB7
CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2Fn
ZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgJkJhY2tpbmdT
dG9yZVByaXZhdGU6OmJsaXRWaXNpYmxlQ29udGVudHMsIHRoaXMsIGZvcmNlKSk7CisgICAgICAg
IHJldHVybjsKKyAgICB9CisKKyAgICBibGl0Q29udGVudHMobV93ZWJQYWdlLT5jbGllbnQoKS0+
dXNlckludGVyZmFjZUJsaXR0ZWREZXN0aW5hdGlvblJlY3QoKSwKKyAgICAgICAgICAgICAgICAg
bV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNS
ZWN0KCksCisgICAgICAgICAgICAgICAgIGZvcmNlKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpCit7Cisg
ICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gcHJldmlvdXNDb250ZW50c1JlZ2lvbgorICAgICAg
ICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMod2luZG93RnJvbnRC
dWZmZXJTdGF0ZSgpLT5ibGl0dGVkUmVnaW9uKCksIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5i
bGl0dGVkUmVnaW9uKCkpOworCisgICAgaWYgKHByZXZpb3VzQ29udGVudHNSZWdpb24uaXNFbXB0
eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3co
KS0+Y29weUZyb21Gcm9udFRvQmFjayhwcmV2aW91c0NvbnRlbnRzUmVnaW9uKTsKKyAgICB3aW5k
b3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihwcmV2aW91c0NvbnRlbnRzUmVn
aW9uKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjb3B5UHJldmlvdXNDb250ZW50
c1RvQmFja1N1cmZhY2VPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIHByZXZpb3VzQ29udGVudHNSZWdpb24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJl
Z2lvbjo6c3VidHJhY3RSZWdpb25zKHRpbGUtPmZyb250QnVmZmVyKCktPnJlbmRlcmVkUmVnaW9u
KCksIHJlY3QpOworCisgICAgSW50UmVjdExpc3QgcHJldmlvdXNDb250ZW50c1JlY3RzID0gcHJl
dmlvdXNDb250ZW50c1JlZ2lvbi5yZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
cHJldmlvdXNDb250ZW50c1JlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHByZXZpb3VzQ29udGVudHNSZWN0ID0gcHJldmlvdXNDb250ZW50c1JlY3RzLmF0KGkp
OworICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmFkZFJlbmRlcmVkUmVnaW9uKHByZXZpb3Vz
Q29udGVudHNSZWN0KTsKKworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OmJsaXRUb0J1ZmZlcigKKyAgICAgICAgICAgIHRpbGUtPmJhY2tCdWZmZXIoKS0+bmF0aXZlQnVm
ZmVyKCksIHByZXZpb3VzQ29udGVudHNSZWN0LAorICAgICAgICAgICAgdGlsZS0+ZnJvbnRCdWZm
ZXIoKS0+bmF0aXZlQnVmZmVyKCksIHByZXZpb3VzQ29udGVudHNSZWN0KTsKKyAgICB9Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cGFpbnREZWZhdWx0QmFja2dyb3VuZChjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgm
IHRyYW5zZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGJvb2wgZmx1c2gpCit7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29u
dGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBt
X3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworICAgIFBsYXRmb3JtOjpJ
bnRQb2ludCBvcmlnaW4gPSBjb250ZW50cy5sb2NhdGlvbigpOworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGNvbnRlbnRzQ2xpcHBlZCA9IGNvbnRlbnRzOworCisgICAgLy8gV2UgaGF2ZSB0byBwYWlu
dCB0aGUgZGVmYXVsdCBiYWNrZ3JvdW5kIGluIHRoZSBjYXNlIG9mIG92ZXJ6b29tIGFuZAorICAg
IC8vIG1ha2Ugc3VyZSBpdCBpcyBpbnZhbGlkYXRlZC4KKyAgICBDb2xvciBjb2xvcihtX3dlYlBh
Z2UtPnNldHRpbmdzKCktPm92ZXJab29tQ29sb3IoKSk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbiBvdmVyU2Nyb2xsUmVnaW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMoUGxhdGZvcm06OkludFJlY3QoY29udGVudHNDbGlwcGVk
KSwgY29udGVudHNSZWN0KTsKKworICAgIEludFJlY3RMaXN0IG92ZXJTY3JvbGxSZWN0cyA9IG92
ZXJTY3JvbGxSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG92ZXJT
Y3JvbGxSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBvdmVy
U2Nyb2xsUmVjdCA9IG92ZXJTY3JvbGxSZWN0cy5hdChpKTsKKyAgICAgICAgb3ZlclNjcm9sbFJl
Y3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworICAgICAgICBvdmVyU2Nyb2xsUmVj
dCA9IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3Qob3ZlclNjcm9sbFJlY3QpOworCisgICAgICAgIGlm
ICghdHJhbnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAvLyBCZWNhdXNl
IG9mIHJvdW5kaW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgb3ZlclNjcm9sbFJlY3QgY291bGQgYmUg
b2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgICAgIC8vIHRoYW4gdGhlIHN1cmZhY2Ugc2l6ZSBv
ZiB0aGUgd2luZG93LiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAg
ICAgIC8vIGl0IHRvIGVuc3VyZSB0aGF0IGNhbid0IGhhcHBlbi4KKyAgICAgICAgICAgIG92ZXJT
Y3JvbGxSZWN0LmludGVyc2VjdChQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQo
MCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7Cisg
ICAgICAgIH0KKworICAgICAgICBjbGVhcldpbmRvdyhvdmVyU2Nyb2xsUmVjdCwgY29sb3IucmVk
KCksIGNvbG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgY29sb3IuYWxwaGEoKSk7CisgICAgfQor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJsaXRDb250ZW50cyhjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBCbGl0dGluZyBtdXN0
IG5ldmVyIGhhcHBlbiBmb3IgZGlyZWN0IHJlbmRlcmluZyBjYXNlLgorICAgIC8vIFVzZSBpbnZh
bGlkYXRlV2luZG93KCkgaW5zdGVhZC4KKyAgICBBU1NFUlQoIXNob3VsZERpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkpOworCisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8IG1fc3Vz
cGVuZFNjcmVlblVwZGF0ZXMgfHwgIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgLy8gQXZvaWQgY2xp
ZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIGJsaXQgaXMgaW1wb3NzaWJsZS4KKyAgICAg
ICAgaWYgKGZvcmNlKQorICAgICAgICAgICAgbV9oYXNCbGl0Sm9icyA9IGZhbHNlOworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlcklu
dGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50
KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpj
cmVhdGVNZXRob2RDYWxsTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3JlUHJp
dmF0ZTo6YmxpdENvbnRlbnRzLCB0aGlzLCBkc3RSZWN0LCBzcmNSZWN0LCBmb3JjZSkpOworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1fZGVmZXJzQmxpdCAmJiAhZm9yY2UpIHsK
KyAgICAgICAgbV9oYXNCbGl0Sm9icyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBtX2hhc0JsaXRKb2JzID0gZmFsc2U7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSog
Y3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
IGNvbnRlbnRzUmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAw
KSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpOworCisjaWYgREVCVUdfVklT
VUFMSVpFCisgICAgLy8gU3Vic3RpdHV0ZSBhIGRlYnVnUmVjdCB0aGF0IGNvbnNpc3RzIG9mIHRo
ZSB1bmlvbiBvZiB0aGUgYmFja2luZ3N0b3JlIHJlY3QKKyAgICAvLyBhbmQgdGhlIHVpIHRocmVh
ZCB2aWV3cG9ydCByZWN0IGluc3RlYWQgb2YgdGhlIG5vcm1hbCBzb3VyY2UgcmVjdCBzbyB3ZQor
ICAgIC8vIGNhbiB2aXN1YWxpemUgdGhlIGVudGlyZSBiYWNraW5nc3RvcmUgYW5kIHdoYXQgaXQg
aXMgZG9pbmcgd2hlbiB3ZQorICAgIC8vIHNjcm9sbCBhbmQgem9vbSEKKyAgICAvLyBGSVhNRTog
VGhpcyBzaG91bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjouCisgICAgV2Vi
Q29yZTo6SW50UmVjdCBkZWJ1Z1JlY3QgPSBjdXJyZW50U3RhdGUtPmJhY2tpbmdTdG9yZVJlY3Qo
KTsKKyAgICBkZWJ1Z1JlY3QudW5pdGUobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFj
ZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIGlmIChkZWJ1Z1JlY3Qud2lkdGgo
KSA8IGRlYnVnUmVjdC5oZWlnaHQoKSkKKyAgICAgICAgZGVidWdSZWN0LnNldFdpZHRoKGNlaWwo
ZG91YmxlKHNyY1JlY3Qud2lkdGgoKSkgKiAoZG91YmxlKGRlYnVnUmVjdC5oZWlnaHQoKSkgLyBz
cmNSZWN0LmhlaWdodCgpKSkpOworICAgIGlmIChkZWJ1Z1JlY3QuaGVpZ2h0KCkgPCBkZWJ1Z1Jl
Y3Qud2lkdGgoKSkKKyAgICAgICAgZGVidWdSZWN0LnNldEhlaWdodChjZWlsKGRvdWJsZShzcmNS
ZWN0LmhlaWdodCgpKSAqIChkb3VibGUoZGVidWdSZWN0LndpZHRoKCkpIC8gc3JjUmVjdC53aWR0
aCgpKSkpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzID0gZGVidWdSZWN0OworI2Vs
c2UKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50cyA9IHNyY1JlY3Q7CisjZW5kaWYKKwor
ICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9uIFdlYkNv
cmU6Oi4KKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFuc2Zvcm1hdGlvbiA9IFRyYW5zZm9y
bWF0aW9uTWF0cml4OjpyZWN0VG9SZWN0KAorICAgICAgICBGbG9hdFJlY3QoRmxvYXRQb2ludCgw
LjAsIDAuMCksIFdlYkNvcmU6OkludFNpemUoY29udGVudHMuc2l6ZSgpKSksIFdlYkNvcmU6Oklu
dFJlY3QoZHN0UmVjdCkpOworCisgICAgYm9vbCBibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGlu
Z1dpbmRvdyA9IG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgp
ID09IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlOwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICBCYWNraW5nU3RvcmVDb21wb3Np
dGluZ1N1cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQb29sOjpn
bG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlmICghYmxp
dHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpCisgICAgICAgIGRyYXdTdWJMYXllcnMo
KTsKKyNlbmRpZgorCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMg
ZHN0UmVjdD0oJWQsJWQgJWR4JWQpIHNyY1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICBkc3RSZWN0LngoKSwgZHN0UmVjdC55KCksIGRzdFJlY3Qud2lkdGgo
KSwgZHN0UmVjdC5oZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1JlY3Qu
eCgpLCBzcmNSZWN0LnkoKSwgc3JjUmVjdC53aWR0aCgpLCBzcmNSZWN0LmhlaWdodCgpKTsKKyNl
bmRpZgorCisgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IGNvbnRlbnRzLmxvY2F0aW9u
KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNDbGlwcGVkID0gY29udGVudHM7CisK
KyAgICBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGNvbnRlbnRzLCB0cmFuc2Zvcm1hdGlvbiwgZmFs
c2UgLypmbHVzaCovKTsKKworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+
dGlsZU1hcCgpOworCisgICAgLy8gRG9uJ3QgY2xpcCB0byBjb250ZW50cyBpZiBpdCBpcyBlbXB0
eSBzbyB3ZSBjYW4gc3RpbGwgcGFpbnQgZGVmYXVsdCBiYWNrZ3JvdW5kLgorICAgIGlmICghY29u
dGVudHNSZWN0LmlzRW1wdHkoKSkgeworICAgICAgICBjb250ZW50c0NsaXBwZWQuaW50ZXJzZWN0
KGNvbnRlbnRzUmVjdCk7CisgICAgICAgIGlmIChjb250ZW50c0NsaXBwZWQuaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBpbnZhbGlkYXRlV2luZG93KGRzdFJlY3QpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CisKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gY29udGVu
dHNSZWdpb24gPSBjb250ZW50c0NsaXBwZWQ7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIGJhY2tpbmdTdG9yZVJlZ2lvbiA9IGN1cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgp
OworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiBjaGVja2VyZWRSZWdpb24KKyAgICAg
ICAgICAgID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhjb250ZW50
c1JlZ2lvbiwgYmFja2luZ1N0b3JlUmVnaW9uKTsKKworICAgICAgICAvLyBCbGl0IGNoZWNrZXJl
ZCB0byB0aG9zZSBwYXJ0cyB0aGF0IGFyZSBub3QgY292ZXJlZCBieSB0aGUgYmFja2luZ1N0b3Jl
UmVjdC4KKyAgICAgICAgSW50UmVjdExpc3QgY2hlY2tlcmVkUmVjdHMgPSBjaGVja2VyZWRSZWdp
b24ucmVjdHMoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGVja2VyZWRSZWN0
cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZHN0UmVjdCA9
IHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QoUGxhdGZvcm06OkludFJlY3QoCisgICAgICAgICAgICAg
ICAgUGxhdGZvcm06OkludFBvaW50KGNoZWNrZXJlZFJlY3RzLmF0KGkpLngoKSAtIG9yaWdpbi54
KCksIGNoZWNrZXJlZFJlY3RzLmF0KGkpLnkoKSAtIG9yaWdpbi55KCkpLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VyZWRSZWN0cy5hdChpKS5zaXplKCkpKTsKKyAg
ICAgICAgICAgIGNoZWNrZXJXaW5kb3coZHN0UmVjdCwgY2hlY2tlcmVkUmVjdHMuYXQoaSkubG9j
YXRpb24oKSwgdHJhbnNmb3JtYXRpb24uYSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFZl
Y3RvcjxUaWxlQnVmZmVyKj4gYmxpdHRlZFRpbGVzOworCisgICAgLy8gR2V0IHRoZSBsaXN0IG9m
IHRpbGUgcmVjdHMgdGhhdCBtYWtldXAgdGhlIGNvbnRlbnQuCisgICAgVGlsZVJlY3RMaXN0IHRp
bGVSZWN0TGlzdCA9IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb250ZW50c0Ns
aXBwZWQsIGN1cnJlbnRTdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVj
dExpc3Quc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3QgPSB0aWxlUmVj
dExpc3RbaV07CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAg
ICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOwor
ICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gY3VycmVudE1hcC5nZXQoaW5kZXgpOwor
ICAgICAgICBUaWxlQnVmZmVyKiB0aWxlQnVmZmVyID0gdGlsZS0+ZnJvbnRCdWZmZXIoKTsKKwor
ICAgICAgICAvLyBUaGlzIGRpcnR5IHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRlcywgYnV0IGl0
IG5lZWRzIHRvIGJlIGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5h
dGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QKKyAgICAgICAgICAgID0g
bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBjdXJyZW50U3RhdGUt
PmJhY2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAgICAgLy8gRG9uJ3QgY2xpcCB0byBjb250ZW50
cyBpZiBpdCBpcyBlbXB0eSBzbyB3ZSBjYW4gc3RpbGwgcGFpbnQgZGVmYXVsdCBiYWNrZ3JvdW5k
LgorICAgICAgICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8v
IE90aGVyd2lzZSB3ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQgYmxpdC4KKyAg
ICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QoY29udGVudHNSZWN0KTsKKworICAgICAgICAg
ICAgLy8gV2UgcHJvYmFibHkgaGF2ZSBleHRyYSB0aWxlcyBzaW5jZSB0aGUgY29udGVudHMgc2l6
ZSBpcyBzbyBzbWFsbC4KKyAgICAgICAgICAgIC8vIFNhdmUgc29tZSBjeWNsZXMgaGVyZS4uLgor
ICAgICAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3csIHRoaXMgZGlydHkgcmVjdCBpcyBp
biB0cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgLy8gdHJh
bnNmb3JtZWQgY29udGVudHMsIGJ1dCB1bHRpbWF0ZWx5IGl0IG5lZWRzIHRvIGJlIHRyYW5zZm9y
bWVkCisgICAgICAgIC8vIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAg
ICAgICAgZGlydHlSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKworICAgICAg
ICAvLyBTYXZlIHNvbWUgY3ljbGVzIGhlcmUuLi4KKyAgICAgICAgaWYgKGRpcnR5UmVjdC5pc0Vt
cHR5KCkgfHwgZGlydHlUaWxlUmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBjb250aW51ZTsK
KworICAgICAgICBUaWxlUmVjdCB3aG9sZVRpbGVSZWN0OworICAgICAgICB3aG9sZVRpbGVSZWN0
LmZpcnN0ID0gaW5kZXg7CisgICAgICAgIHdob2xlVGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+dGls
ZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0CisgICAgICAgICAg
ICA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh3aG9sZVRpbGVSZWN0LCBjdXJy
ZW50U3RhdGUtPmJhY2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAgICAgYm9vbCBjb21taXR0ZWQg
PSB0aWxlLT5pc0NvbW1pdHRlZCgpOworICAgICAgICBib29sIHJlbmRlcmVkID0gdGlsZUJ1ZmZl
ci0+aXNSZW5kZXJlZChkaXJ0eVRpbGVSZWN0KTsKKyAgICAgICAgYm9vbCBwYWludENoZWNrZXJl
ZCA9ICFjb21taXR0ZWQgfHwgIXJlbmRlcmVkOworCisgICAgICAgIGlmIChwYWludENoZWNrZXJl
ZCkgeworICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9IHRyYW5zZm9y
bWF0aW9uLm1hcFJlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1h
dGlvbi5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIHJvdW5k
aW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgZGlydHlSZWN0IGNvdWxkIGJlIG9mZi1ieS1vbmUgbGFy
Z2VyCisgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBzaXplIG9mIHRoZSBkc3Qg
YnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcKKyAgICAgICAgICAgICAg
ICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgICAgICAgICAgZGly
dHlSZWN0VC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAs
IDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50IGNvbnRlbnRz
T3JpZ2luKGRpcnR5UmVjdC54KCkgKyBvcmlnaW4ueCgpLCBkaXJ0eVJlY3QueSgpICsgb3JpZ2lu
LnkoKSk7CisgICAgICAgICAgICBjaGVja2VyV2luZG93KGRpcnR5UmVjdFQsIGNvbnRlbnRzT3Jp
Z2luLCB0cmFuc2Zvcm1hdGlvbi5hKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmxpdCB0
aGUgdmlzaWJsZSBidWZmZXIgaGVyZSBpZiB3ZSBoYXZlIHZpc2libGUgem9vbSBqb2JzLgorICAg
ICAgICBpZiAobV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFZpc2libGVab29tSm9iKCkpIHsKKwor
ICAgICAgICAgICAgLy8gTmVlZHMgdG8gYmUgaW4gc2FtZSBjb29yZGluYXRlIHN5c3RlbSBhcyBk
aXJ0eVJlY3QuCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlVGlsZUJ1ZmZl
clJlY3QgPSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdDsKKyAgICAgICAgICAgIHZpc2libGVUaWxl
QnVmZmVyUmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7CisKKyAgICAgICAgICAg
IC8vIENsaXAgdG8gdGhlIHZpc2libGVUaWxlQnVmZmVyUmVjdC4KKyAgICAgICAgICAgIGRpcnR5
UmVjdC5pbnRlcnNlY3QodmlzaWJsZVRpbGVCdWZmZXJSZWN0KTsKKworICAgICAgICAgICAgLy8g
Q2xpcCB0byB0aGUgZGlydHlSZWN0LgorICAgICAgICAgICAgdmlzaWJsZVRpbGVCdWZmZXJSZWN0
LmludGVyc2VjdChkaXJ0eVJlY3QpOworCisgICAgICAgICAgICBpZiAoIWRpcnR5UmVjdC5pc0Vt
cHR5KCkgJiYgIXZpc2libGVUaWxlQnVmZmVyUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB2aXNpYmxlVGlsZUJ1ZmZlcgorICAgICAgICAgICAgICAg
ICAgICA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT52aXNpYmxlVGlsZUJ1ZmZl
cigpOworICAgICAgICAgICAgICAgIEFTU0VSVCh2aXNpYmxlVGlsZUJ1ZmZlci0+c2l6ZSgpID09
IHZpc2libGVDb250ZW50c1JlY3QoKS5zaXplKCkpOworCisgICAgICAgICAgICAgICAgLy8gVGhl
IG9mZnNldCBvZiB0aGUgY3VycmVudCB2aWV3cG9ydCB3aXRoIHRoZSB2aXNibGUgdGlsZSBidWZm
ZXIuCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVuY2UgPSBvcmln
aW4gLSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAgICAgICAgICAg
IFBsYXRmb3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRpZmZlcmVuY2Uu
eCgpLCBkaWZmZXJlbmNlLnkoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBNYXAgdG8gdGhlIHZp
c2libGVUaWxlQnVmZmVyIGNvb3JkaW5hdGVzLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB2aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisgICAgICAgICAg
ICAgICAgZGlydHlUaWxlUmVjdC5tb3ZlKG9mZnNldC53aWR0aCgpLCBvZmZzZXQuaGVpZ2h0KCkp
OworCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0VCA9IHRyYW5z
Zm9ybWF0aW9uLm1hcFJlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGlmICghdHJh
bnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1
c2Ugb2Ygcm91bmRpbmcgaXQgaXMgcG9zc2libGUgdGhhdCBkaXJ0eVJlY3QgY291bGQgYmUgb2Zm
LWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFjZSBz
aXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBpbmcK
KyAgICAgICAgICAgICAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgor
ICAgICAgICAgICAgICAgICAgICBkaXJ0eVJlY3RULmludGVyc2VjdChQbGF0Zm9ybTo6SW50UmVj
dChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygp
LT5zdXJmYWNlU2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAg
YmxpdFRvV2luZG93KGRpcnR5UmVjdFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZp
c2libGVUaWxlQnVmZmVyLT5mcm9udEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZGlydHlUaWxlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZmFsc2UgLypibGVuZCovLCAyNTUpOworICAgICAgICAgICAgfQorICAgICAgICB9
IGVsc2UgaWYgKGNvbW1pdHRlZCkgeworICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSByZW5k
ZXJlZCByZWdpb24uCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiByZW5kZXJl
ZFJlZ2lvbiA9IHRpbGVCdWZmZXItPnJlbmRlcmVkUmVnaW9uKCk7CisgICAgICAgICAgICBJbnRS
ZWN0TGlzdCBkaXJ0eVJlbmRlcmVkUmVjdHMgPSByZW5kZXJlZFJlZ2lvbi5yZWN0cygpOworICAg
ICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkaXJ0eVJlbmRlcmVkUmVjdHMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdDsKKyAgICAgICAgICAg
ICAgICB0aWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgICAgICAgICAgICAgIHRpbGVSZWN0LnNl
Y29uZCA9IGludGVyc2VjdGlvbihkaXJ0eVRpbGVSZWN0LCBkaXJ0eVJlbmRlcmVkUmVjdHMuYXQo
aSkpOworICAgICAgICAgICAgICAgIGlmICh0aWxlUmVjdC5zZWNvbmQuaXNFbXB0eSgpKQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBCbGl0IHRoZSBy
ZW5kZXJlZCBwYXJ0cy4KKyAgICAgICAgICAgICAgICBibGl0VGlsZVJlY3QodGlsZUJ1ZmZlciwg
dGlsZVJlY3QsIG9yaWdpbiwgdHJhbnNmb3JtYXRpb24sIGN1cnJlbnRTdGF0ZSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBibGl0dGVkVGlsZXMuYXBwZW5kKHRpbGVCdWZmZXIpOworICAg
ICAgICB9CisgICAgfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlm
IChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBXZWJDb3Jl
OjpGbG9hdFJlY3QgY29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNmb3Jt
ZWRGbG9hdFJlY3QoCisgICAgICAgICAgICBXZWJDb3JlOjpGbG9hdFJlY3QoV2ViQ29yZTo6SW50
UmVjdChjb250ZW50cykpKTsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5kcmF3U3ViTGF5ZXJzKGRz
dFJlY3QsIGNvbnRlbnRzUmVjdCk7CisgICAgfSBlbHNlIGlmIChjb21wb3NpdGluZ1N1cmZhY2Up
CisgICAgICAgIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGRzdFJlY3QpOworCisjZW5kaWYKKwor
I2lmIEVOQUJMRV9TQ1JPTExCQVJTCisgICAgaWYgKGlzU2Nyb2xsaW5nT3Jab29taW5nKCkgJiYg
bV9jbGllbnQtPmlzTWFpbkZyYW1lKCkpIHsKKyAgICAgICAgaWYgKG1fY2xpZW50LT5zY3JvbGxz
SG9yaXpvbnRhbGx5KCkpCisgICAgICAgICAgICBibGl0SG9yaXpvbnRhbFNjcm9sbGJhcihvcmln
aW4pOworICAgICAgICBpZiAobV9jbGllbnQtPnNjcm9sbHNWZXJ0aWNhbGx5KCkpCisgICAgICAg
ICAgICBibGl0VmVydGljYWxTY3JvbGxiYXIob3JpZ2luKTsKKyAgICB9CisjZW5kaWYKKworI2lm
IERFQlVHX1ZJU1VBTElaRQorICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRl
bHkgZGVwZW5kIG9uIFdlYkNvcmU6Oi4KKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhp
Y3M6OkJ1ZmZlciogd2luZG93QnVmZmVyID0KKyAgICAgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+
d2luZG93KCktPmJ1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
RHJhd2FibGUqIGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpsb2NrQnVmZmVyRHJhd2FibGUod2luZG93QnVmZmVyKTsKKyAgICBQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCogYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPQorICAgICAg
ICBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y3JlYXRlUGxhdGZvcm1HcmFwaGlj
c0NvbnRleHQoYnVmZmVyRHJhd2FibGUpOworICAgIEdyYXBoaWNzQ29udGV4dCBncmFwaGljc0Nv
bnRleHQoYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworICAgIEZsb2F0UmVjdCB3a1Zp
ZXdwb3J0ID0gRmxvYXRSZWN0KHZpc2libGVDb250ZW50c1JlY3QoKSk7CisgICAgRmxvYXRSZWN0
IHVpVmlld3BvcnQgPSBGbG9hdFJlY3QobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFj
ZUJsaXR0ZWRWaXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgIHdrVmlld3BvcnQubW92ZSgtY29u
dGVudHMueCgpLCAtY29udGVudHMueSgpKTsKKyAgICB1aVZpZXdwb3J0Lm1vdmUoLWNvbnRlbnRz
LngoKSwgLWNvbnRlbnRzLnkoKSk7CisKKyAgICBncmFwaGljc0NvbnRleHQuc2F2ZSgpOworCisg
ICAgLy8gRHJhdyBhIGJsdWUgcmVjdCBmb3IgdGhlIHdlYmtpdCB0aHJlYWQgdmlld3BvcnQuCisg
ICAgZ3JhcGhpY3NDb250ZXh0LnNldFN0cm9rZUNvbG9yKFdlYkNvcmU6OkNvbG9yKDAsIDAsIDI1
NSksIFdlYkNvcmU6OkNvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGdyYXBoaWNzQ29udGV4dC5z
dHJva2VSZWN0KHRyYW5zZm9ybWF0aW9uLm1hcFJlY3Qod2tWaWV3cG9ydCksIDEuMCk7CisKKyAg
ICAvLyBEcmF3IGEgcmVkIHJlY3QgZm9yIHRoZSB1aSB0aHJlYWQgdmlld3BvcnQuCisgICAgZ3Jh
cGhpY3NDb250ZXh0LnNldFN0cm9rZUNvbG9yKFdlYkNvcmU6OkNvbG9yKDI1NSwgMCwgMCksIFdl
YkNvcmU6OkNvbG9yU3BhY2VEZXZpY2VSR0IpOworICAgIGdyYXBoaWNzQ29udGV4dC5zdHJva2VS
ZWN0KHRyYW5zZm9ybWF0aW9uLm1hcFJlY3QodWlWaWV3cG9ydCksIDEuMCk7CisKKyAgICBncmFw
aGljc0NvbnRleHQucmVzdG9yZSgpOworCisgICAgZGVsZXRlIGJ1ZmZlclBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0OworICAgIHJlbGVhc2VCdWZmZXJEcmF3YWJsZSh3aW5kb3dCdWZmZXIpOworI2Vu
ZGlmCisKKyAgICBpbnZhbGlkYXRlV2luZG93KGRzdFJlY3QpOworCisgICAgaWYgKGJsaXR0aW5n
RGlyZWN0bHlUb0NvbXBvc2l0aW5nV2luZG93KSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9j
aygmbV9ibGl0R2VuZXJhdGlvbkxvY2spOworCisgICAgICAgICsrbV9ibGl0R2VuZXJhdGlvbjsK
KyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBibGl0dGVkVGlsZXMuc2l6ZSgp
OyArK2kpCisgICAgICAgICAgICBibGl0dGVkVGlsZXNbaV0tPnNldEJsaXRHZW5lcmF0aW9uKG1f
YmxpdEdlbmVyYXRpb24pOworCisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUs
ICZtX2N1cnJlbnRCbGl0RW5kKTsKKyAgICAgICAgbV9jdXJyZW50QmxpdEVuZC50dl9uc2VjICs9
IDMwICogMTAwMCAqIDEwMDA7CisgICAgICAgIGlmIChtX2N1cnJlbnRCbGl0RW5kLnR2X25zZWMg
Pj0gMTAwMDAwMDAwMEwpIHsKKyAgICAgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZfc2VjICAr
PSAxOworICAgICAgICAgICAgbV9jdXJyZW50QmxpdEVuZC50dl9uc2VjIC09IDEwMDAwMDAwMDBM
OworICAgICAgICB9CisKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm1fYmxpdEdlbmVy
YXRpb25Mb2NrKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmbV9ibGl0R2VuZXJhdGlv
bkNvbmQpOworICAgIH0KK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6YmxpdFRpbGVSZWN0KFRpbGVCdWZmZXIqIHRpbGVCdWZmZXIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaWxlUmVjdCYgdGlsZVJl
Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBj
b25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9u
TWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpCit7CisgICAgaWYgKCFtX3dl
YlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm4gUGxhdGZv
cm06OkludFJlY3QoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB0
aWxlUmVjdC5zZWNvbmQ7CisKKyAgICAvLyBUaGlzIGRpcnR5IHJlY3QgaXMgaW4gdGlsZSBjb29y
ZGluYXRlcywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgLy8gdHJhbnNmb3JtZWQgY29udGVu
dHMgY29vcmRpbmF0ZXMuCisgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0ID0gbWFwRnJv
bVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0LCBzdGF0ZS0+YmFja2luZ1N0b3Jl
UmVjdCgpKTsKKworICAgIC8vIE5vdywgdGhpcyBkaXJ0eSByZWN0IGlzIGluIHRyYW5zZm9ybWVk
IGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZQorICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRz
LCBidXQgdWx0aW1hdGVseSBpdCBuZWVkcyB0byBiZSB0cmFuc2Zvcm1lZAorICAgIC8vIGNvb3Jk
aW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydC4KKyAgICBkaXJ0eVJlY3QubW92ZSgtb3Jp
Z2luLngoKSwgLW9yaWdpbi55KCkpOworICAgIGRpcnR5UmVjdCA9IG1hdHJpeC5tYXBSZWN0KGRp
cnR5UmVjdCk7CisKKyAgICBpZiAoIW1hdHJpeC5pc0lkZW50aXR5KCkpIHsKKyAgICAgICAgLy8g
QmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBjb3VsZCBi
ZSBvZmYtYnktb25lIGxhcmdlcgorICAgICAgICAvLyB0aGFuIHRoZSBzdXJmYWNlIHNpemUgb2Yg
dGhlIGRzdCBidWZmZXIuIFdlIHByZXZlbnQgdGhpcyBoZXJlLCBieSBjbGFtcGluZworICAgICAg
ICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAgIGRpcnR5UmVjdC5p
bnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dl
YlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgIH0KKworICAg
IEFTU0VSVCghZGlydHlSZWN0LmlzRW1wdHkoKSk7CisgICAgQVNTRVJUKCFkaXJ0eVRpbGVSZWN0
LmlzRW1wdHkoKSk7CisgICAgaWYgKGRpcnR5UmVjdC5pc0VtcHR5KCkgfHwgZGlydHlUaWxlUmVj
dC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAg
YmxpdFRvV2luZG93KGRpcnR5UmVjdCwgdGlsZUJ1ZmZlci0+bmF0aXZlQnVmZmVyKCksIGRpcnR5
VGlsZVJlY3QsCisgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxlbmQqLywgMjU1KTsKKyAgICBy
ZXR1cm4gZGlydHlSZWN0OworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQor
dm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGVuZENvbXBvc2l0aW5nU3VyZmFjZShjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCkKK3sKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRm
b3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQo
KSkgeworICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0
b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKyAg
ICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xp
ZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJhY2tpbmdTdG9yZVByaXZh
dGUsIFBsYXRmb3JtOjpJbnRSZWN0PigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3JlUHJp
dmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZhY2UsIHRoaXMsIGRzdFJlY3QpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIEJhY2tpbmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29t
cG9zaXRpbmdTdXJmYWNlID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29s
KCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpOworCisgICAgaWYgKCFjb21wb3NpdGluZ1N1cmZhY2Ug
fHwgIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkNv
cmU6OkxheWVyUmVuZGVyaW5nUmVzdWx0cyBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzID0gbV93ZWJQ
YWdlLT5kLT5sYXN0Q29tcG9zaXRpbmdSZXN1bHRzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBsYXN0Q29tcG9zaXRpbmdSZXN1bHRzLmhvbGVQdW5jaFJlY3RTaXplKCk7IGkrKykgewor
ICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBob2xlUHVuY2hSZWN0ID0gbGFzdENvbXBvc2l0aW5n
UmVzdWx0cy5ob2xlUHVuY2hSZWN0KGkpOworCisgICAgICAgIGhvbGVQdW5jaFJlY3QuaW50ZXJz
ZWN0KGRzdFJlY3QpOworICAgICAgICBob2xlUHVuY2hSZWN0LmludGVyc2VjdChQbGF0Zm9ybTo6
SW50UmVjdCgKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV93ZWJQYWdl
LT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKworICAgICAgICBpZiAoIWhv
bGVQdW5jaFJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgY2xlYXJXaW5kb3coaG9sZVB1bmNo
UmVjdCwgMCwgMCwgMCwgMCk7CisgICAgfQorCisgICAgQ29tcG9zaXRpbmdTdXJmYWNlQnVmZmVy
KiBmcm9udEJ1ZmZlciA9IGNvbXBvc2l0aW5nU3VyZmFjZS0+ZnJvbnRCdWZmZXIoKTsKKworICAg
IEludFJlY3RMaXN0IHJlY3RzID0gbGFzdENvbXBvc2l0aW5nUmVzdWx0cy5kaXJ0eVJlZ2lvbi5y
ZWN0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVjdHMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgcmVjdHNbaV0uaW50ZXJzZWN0KGRzdFJlY3QpOworI2lmIERFQlVHX0NPTVBPU0lU
SU5HX0RJUlRZX1JFR0lPTgorICAgICAgICBjbGVhckJ1ZmZlcihtX3dlYlBhZ2UtPmNsaWVudCgp
LT53aW5kb3coKS0+YnVmZmVyKCksIHJlY3RzW2ldLCAyNTUsIDAsIDAsIDEyOCk7CisjZW5kaWYK
KyAgICAgICAgYmxpdFRvV2luZG93KHJlY3RzW2ldLCBmcm9udEJ1ZmZlci0+bmF0aXZlQnVmZmVy
KCksIHJlY3RzW2ldLCB0cnVlIC8qYmxlbmQqLywgMjU1KTsKKyAgICB9Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJDb21wb3NpdGluZ1N1cmZhY2UoKQoreworICAgIEJhY2tp
bmdTdG9yZUNvbXBvc2l0aW5nU3VyZmFjZSogY29tcG9zaXRpbmdTdXJmYWNlID0KKyAgICAgICAg
U3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNvbXBvc2l0aW5nU3VyZmFjZSgpOwor
CisgICAgaWYgKCFjb21wb3NpdGluZ1N1cmZhY2UpCisgICAgICAgIHJldHVybjsKKworICAgIENv
bXBvc2l0aW5nU3VyZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGluZ1N1cmZhY2Ut
PmZyb250QnVmZmVyKCk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVh
ckJ1ZmZlcihmcm9udEJ1ZmZlci0+bmF0aXZlQnVmZmVyKCksIFBsYXRmb3JtOjpJbnRSZWN0KFBs
YXRmb3JtOjpJbnRQb2ludCgpLCBmcm9udEJ1ZmZlci0+c3VyZmFjZVNpemUoKSksIDAsIDAsIDAs
IDApOworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKwordm9pZCBC
YWNraW5nU3RvcmVQcml2YXRlOjpibGl0SG9yaXpvbnRhbFNjcm9sbGJhcihjb25zdCBQbGF0Zm9y
bTo6SW50UG9pbnQmIHNjcm9sbFBvc2l0aW9uKQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zp
c2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVNTRVJUKG1fY2xpZW50LT5zY3JvbGxz
SG9yaXpvbnRhbGx5KCkpOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd0hvcml6b250
YWxTY3JvbGxiYXIoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmVydGlj
YWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbikKK3sK
KyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IEFTU0VSVChtX2NsaWVudC0+c2Nyb2xsc1ZlcnRpY2FsbHkoKSk7CisKKyAgICBtX3dlYlBhZ2Ut
PmNsaWVudCgpLT5kcmF3VmVydGljYWxTY3JvbGxiYXIoKTsKK30KKworYm9vbCBCYWNraW5nU3Rv
cmVQcml2YXRlOjppc1RpbGVWaXNpYmxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNvbnN0Cit7
CisgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAg
ICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIHJldHVybiBtYXBGcm9t
VGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpLmludGVyc2VjdHModmlzaWJsZUNv
bnRlbnRzUmVjdCgpKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc1RpbGVWaXNp
YmxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luKSBjb25zdAoreworICAgIHJldHVy
biBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW4sIHRpbGVTaXplKCkpLmludGVyc2VjdHModmlzaWJs
ZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dmlzaWJsZVRpbGVzUmVjdCgpIGNvbnN0Cit7CisgICAgQmFja2luZ1N0b3JlR2VvbWV0
cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAg
PSBjdXJyZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3Q7
CisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsKKyAg
ICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAgIHRp
bGVSZWN0LmZpcnN0ID0gaXQtPmZpcnN0OworICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlz
LT50aWxlUmVjdCgpOworICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlID0gbWFwRnJvbVRp
bGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KTsKKyAgICAgICAgaWYgKHRpbGUuaW50
ZXJzZWN0cyh2aXNpYmxlQ29udGVudHNSZWN0KCkpKQorICAgICAgICAgICAgcmVjdCA9IFBsYXRm
b3JtOjp1bmlvbk9mUmVjdHMocmVjdCwgdGlsZSk7CisgICAgfQorICAgIHJldHVybiByZWN0Owor
fQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlVmlzaWJsZUNv
bnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4KSBjb25zdAoreworICAgIGlmICghaXNU
aWxlVmlzaWJsZShpbmRleCkpCisgICAgICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgpOwor
CisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIHZpc2libGVDb250ZW50c1JlY3Qo
KSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVVbmNs
aXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgpIGNvbnN0Cit7
CisgICAgaWYgKCFpc1RpbGVWaXNpYmxlKGluZGV4KSkKKyAgICAgICAgcmV0dXJuIFBsYXRmb3Jt
OjpJbnRSZWN0KCk7CisKKyAgICByZXR1cm4gdGlsZUNvbnRlbnRzUmVjdChpbmRleCwgdW5jbGlw
cGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4LAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cykgY29uc3QKK3sKKyAgICByZXR1cm4gdGls
ZUNvbnRlbnRzUmVjdChpbmRleCwgY29udGVudHMsIGZyb250U3RhdGUoKSk7Cit9CisKK1BsYXRm
b3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50c1JlY3QoY29uc3Qg
VGlsZUluZGV4JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkqIHN0YXRlKSBjb25zdAoreworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVj
dExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29udGVudHMsIHN0YXRl
KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVSZWN0TGlzdC5zaXplKCk7ICsraSkg
eworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlzdFtpXTsKKyAgICAgICAg
aWYgKGluZGV4ID09IHRpbGVSZWN0LmZpcnN0KQorICAgICAgICAgICAgcmV0dXJuIHRpbGVSZWN0
LnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRSZW5kZXJRdWV1ZSgpCit7CisgICAgbV9yZW5k
ZXJRdWV1ZS0+cmVzZXQoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhclZp
c2libGVab29tKCkKK3sKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhclZpc2libGVab29tKCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlcyhib29sIHJlc2V0QmFja2dy
b3VuZCkKK3sKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRT
dGF0ZSgpOworICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgp
OworCisgICAgVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsK
KyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIHJlc2V0VGlsZShpdC0+Zmlyc3QsIGl0LT5zZWNv
bmQsIHJlc2V0QmFja2dyb3VuZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dXBk
YXRlVGlsZXMoYm9vbCB1cGRhdGVWaXNpYmxlLCBib29sIGltbWVkaWF0ZSkKK3sKKyAgICBpZiAo
IWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5
KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0g
Y3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBl
bmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGlsZU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBib29s
IGlzVmlzaWJsZSA9IGlzVGlsZVZpc2libGUoaXQtPmZpcnN0KTsKKyAgICAgICAgaWYgKCF1cGRh
dGVWaXNpYmxlICYmIGlzVmlzaWJsZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB1
cGRhdGVUaWxlKGl0LT5maXJzdCwgaW1tZWRpYXRlKTsKKyAgICB9Cit9CisKK3ZvaWQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZXNGb3JTY3JvbGxPck5vdFJlbmRlcmVkUmVnaW9uKGJv
b2wgY2hlY2tMb2FkaW5nKQoreworICAgIC8vIFRoaXMgbWV0aG9kIGxvb2tzIGF0IGFsbCB0aGUg
dGlsZXMgYW5kIGlmIHRoZXkgYXJlIHZpc2libGUsIGJ1dCBub3QgY29tcGxldGVseQorICAgIC8v
IHJlbmRlcmVkIG9yIHdlIGFyZSBsb2FkaW5nLCB0aGVuIGl0IHVwZGF0ZXMgdGhlbS4gRm9yIGFs
bCB0aWxlcywgdmlzaWJsZSBhbmQKKyAgICAvLyBub24tdmlzaWJsZSwgaWYgYSBwcmV2aW91cyBh
dHRlbXB0IHdhcyBtYWRlIHRvIHJlbmRlciB0aGVtIGR1cmluZyBhIHJlZ3VsYXIKKyAgICAvLyBy
ZW5kZXIgam9iLCBidXQgdGhleSB3ZXJlIG5vdCB2aXNpYmxlIGF0IHRoZSB0aW1lLCB0aGVuIHVw
ZGF0ZSB0aGVtIGFuZCBpZgorICAgIC8vIHRoZXkgYXJlIGN1cnJlbnRseSB2aXNpYmxlLCByZXNl
dCB0aGVtLgorCisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250
U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUtPnRpbGVNYXAo
KTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gY3VycmVudFN0YXRl
LT5iYWNraW5nU3RvcmVSZWN0KCk7CisKKyAgICBib29sIGlzTG9hZGluZyA9IG1fY2xpZW50LT5s
b2FkU3RhdGUoKSA9PSBXZWJQYWdlUHJpdmF0ZTo6Q29tbWl0dGVkOworICAgIGJvb2wgZm9yY2VW
aXNpYmxlID0gY2hlY2tMb2FkaW5nICYmIGlzTG9hZGluZzsKKworICAgIFRpbGVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Cisg
ICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGl0LT5maXJzdDsKKyAgICAgICAgQmFja2luZ1N0b3Jl
VGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgaXNWaXNpYmxlID0gaXNUaWxl
VmlzaWJsZShpbmRleCk7CisgICAgICAgIC8vIFRoZSByZWN0IGluIHRyYW5zZm9ybWVkIGNvbnRl
bnRzIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCByZWN0KG9yaWdpbk9m
VGlsZShpbmRleCksIHRpbGVTaXplKCkpOworICAgICAgICBpZiAodGlsZS0+aXNDb21taXR0ZWQo
KQorICAgICAgICAgICAgJiYgbV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNQcmV2aW91
c2x5QXR0ZW1wdGVkQnV0Tm90UmVuZGVyZWQocmVjdCkpIHsKKyAgICAgICAgICAgIC8vIElmIHRo
ZSByZW5kZXIgcXVldWUgcHJldmlvdXNseSB0cmllZCB0byByZW5kZXIgdGhpcyB0aWxlLCBidXQg
dGhlCisgICAgICAgICAgICAvLyB0aWxlIHdhc24ndCB2aXNpYmxlIGF0IHRoZSB0aW1lIHdlIGNh
bid0IHNpbXBseSByZXN0b3JlIHRoZSB0aWxlCisgICAgICAgICAgICAvLyBzaW5jZSB0aGUgY29u
dGVudCBpcyBub3cgaW52YWxpZCBhcyBmYXIgYXMgV2ViS2l0IGlzIGNvbmNlcm5lZC4KKyAgICAg
ICAgICAgIC8vIEluc3RlYWQsIHdlIGNsZWFyIHRoYXQgcGFydCBvZiB0aGUgdGlsZSBpZiBpdCBp
cyB2aXNpYmxlIGFuZCB0aGVuCisgICAgICAgICAgICAvLyBwdXQgdGhlIHRpbGUgaW4gdGhlIHJl
bmRlciBxdWV1ZSBhZ2Fpbi4KKyAgICAgICAgICAgIGlmIChpc1Zpc2libGUpIHsKKyAgICAgICAg
ICAgICAgICAvLyBJbnRlcnNlY3QgdGhlIHRpbGUgd2l0aCB0aGUgbm90IHJlbmRlcmVkIHJlZ2lv
biB0byBnZXQgdGhlIGFyZWFzCisgICAgICAgICAgICAgICAgLy8gb2YgdGhlIHRpbGUgdGhhdCB3
ZSBuZWVkIHRvIGNsZWFyLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9u
IHRpbGVOb3RSZW5kZXJlZFJlZ2lvbgorICAgICAgICAgICAgICAgICAgICA9IFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uOjppbnRlcnNlY3RSZWdpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAg
bV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbigpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgcmVjdCk7CisgICAgICAgICAgICAgICAgY2xlYXJBbmRVcGRh
dGVUaWxlT2ZOb3RSZW5kZXJlZFJlZ2lvbihpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlTm90UmVuZGVyZWRSZWdpb24s
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
YWNraW5nU3RvcmVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZmFsc2UgLyp1cGRhdGUqLyk7CisjaWYgREVCVUdfQkFDS0lOR1NUT1JF
CisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZXh0ZW50cyA9IHRpbGVOb3RSZW5k
ZXJlZFJlZ2lvbi5leHRlbnRzKCk7CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAg
ICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVzRm9yU2Nyb2xsIGRp
ZCBjbGVhciB0aWxlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW50cy54
KCksIGV4dGVudHMueSgpLCBleHRlbnRzLndpZHRoKCksIGV4dGVudHMuaGVpZ2h0KCkpOworI2Vu
ZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVUaWxlKGluZGV4LCBmYWxzZSAv
KmltbWVkaWF0ZSovKTsKKyAgICAgICAgfSBlbHNlIGlmIChpc1Zpc2libGUKKyAgICAgICAgICAg
ICYmIChmb3JjZVZpc2libGUgfHwgIXRpbGUtPmZyb250QnVmZmVyKCktPmlzUmVuZGVyZWQodGls
ZVZpc2libGVDb250ZW50c1JlY3QoaW5kZXgpKSkKKyAgICAgICAgICAgICYmICFpc0N1cnJlbnRW
aXNpYmxlSm9iKGluZGV4LCB0aWxlLCBiYWNraW5nU3RvcmVSZWN0KSkKKyAgICAgICAgICAgIHVw
ZGF0ZVRpbGUoaW5kZXgsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworICAgIH0KK30KKwordm9pZCBC
YWNraW5nU3RvcmVQcml2YXRlOjpyZXNldFRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFj
a2luZ1N0b3JlVGlsZSogdGlsZSwgYm9vbCByZXNldEJhY2tncm91bmQpCit7CisgICAgaWYgKCFt
X3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzQWN0
aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRTaG91bGRSZXNldFRpbGVzV2hlblNo
b3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgVGlsZVJlY3QgdGlsZVJl
Y3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICB0aWxlUmVjdC5zZWNvbmQgPSB0
aGlzLT50aWxlUmVjdCgpOworICAgIC8vIE9ubHkgY2xlYXIgcmVndWxhciByZW5kZXIgam9icyBp
ZiB3ZSdyZSBjbGVhcmluZyB0aGUgYmFja2dyb3VuZCB0b28uCisgICAgbV9yZW5kZXJRdWV1ZS0+
Y2xlYXIobWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KSwgcmVzZXRC
YWNrZ3JvdW5kIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKKyAgICBpZiAocmVzZXRCYWNr
Z3JvdW5kKQorICAgICAgICB0aWxlLT5yZXNldCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnVwZGF0ZVRpbGUoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgYm9vbCBpbW1lZGlhdGUp
Cit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBUaWxlUmVj
dCB0aWxlUmVjdDsKKyAgICB0aWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgIHRpbGVSZWN0LnNl
Y29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgdXBkYXRlUmVj
dCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisgICAgUmVu
ZGVyUXVldWU6OkpvYlR5cGUgam9iVHlwZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpID8gUmVuZGVy
UXVldWU6OlZpc2libGVTY3JvbGwgOiBSZW5kZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9sbDsKKyAg
ICBpZiAoaW1tZWRpYXRlKQorICAgICAgICByZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAvKnJlbmRl
ckNvbnRlbnRPbmx5Ki8pOworICAgIGVsc2UKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9R
dWV1ZShqb2JUeXBlLCB1cGRhdGVSZWN0KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRl
Ojp1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luLCBib29sIGltbWVk
aWF0ZSkKK3sKKyAgICBpZiAoIWlzQWN0aXZlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IHVwZGF0ZVJlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChvcmlnaW4sIHRp
bGVTaXplKCkpOworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBpc1RpbGVWaXNp
YmxlKG9yaWdpbikgPyBSZW5kZXJRdWV1ZTo6VmlzaWJsZVNjcm9sbCA6IFJlbmRlclF1ZXVlOjpO
b25WaXNpYmxlU2Nyb2xsOworICAgIGlmIChpbW1lZGlhdGUpCisgICAgICAgIHJlbmRlcih1cGRh
dGVSZWN0LCB0cnVlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgZWxzZQorICAgICAgICBt
X3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKGpvYlR5cGUsIHVwZGF0ZVJlY3QpOworfQorCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjptYXBGcm9tVGlsZXNUb1RyYW5zZm9y
bWVkQ29udGVudHMoY29uc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3QmIHRpbGVSZWN0
KSBjb25zdAoreworICAgIHJldHVybiBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMo
dGlsZVJlY3QsIGZyb250U3RhdGUoKS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKK30KKworUGxhdGZv
cm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1l
ZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0JiB0aWxlUmVjdCwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAg
VGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3Qg
cmVjdCA9IHRpbGVSZWN0LnNlY29uZDsKKyAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSB0aWxlIGlu
Y2x1ZGluZyB0aGUgYmFja2luZyBzdG9yZSBvZmZzZXQuCisgICAgY29uc3QgUGxhdGZvcm06Oklu
dFBvaW50IG9yaWdpbk9mVGlsZSA9IHRoaXMtPm9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0
b3JlUmVjdCk7CisgICAgcmVjdC5tb3ZlKG9yaWdpbk9mVGlsZS54KCksIG9yaWdpbk9mVGlsZS55
KCkpOworICAgIHJldHVybiByZWN0OworfQorCitCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVj
dExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb0Fi
c29sdXRlVGlsZUJvdW5kYXJpZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0
Cit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpIHx8ICFpc0FjdGl2ZSgpKSB7Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gVGlsZVJlY3RMaXN0
KCk7CisgICAgfQorCisgICAgVGlsZVJlY3RMaXN0IHRpbGVSZWN0TGlzdDsKKyAgICBpbnQgZmly
c3RYT2Zmc2V0ID0gcmVjdC54KCkgLyB0aWxlV2lkdGgoKTsKKyAgICBpbnQgZmlyc3RZT2Zmc2V0
ID0gcmVjdC55KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAgaW50IGxhc3RYT2Zmc2V0ID0gKHJlY3Qu
cmlnaHQoKSAtIDEpIC8gdGlsZVdpZHRoKCk7CisgICAgaW50IGxhc3RZT2Zmc2V0ID0gKHJlY3Qu
Ym90dG9tKCkgLSAxKSAvIHRpbGVIZWlnaHQoKTsKKyAgICBmb3IgKGludCBpID0gZmlyc3RYT2Zm
c2V0OyBpIDw9IGxhc3RYT2Zmc2V0OyArK2kpIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IGZpcnN0
WU9mZnNldDsgaiA8PSBsYXN0WU9mZnNldDsgKytqKSB7CisgICAgICAgICAgICBjb25zdCBpbnQg
ZHN0WCA9IChpID09IGZpcnN0WE9mZnNldCkgPyByZWN0LngoKSA6IGkgKiB0aWxlV2lkdGgoKTsK
KyAgICAgICAgICAgIGNvbnN0IGludCBkc3RZID0gKGogPT0gZmlyc3RZT2Zmc2V0KSA/IHJlY3Qu
eSgpIDogaiAqIHRpbGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RSaWdodCA9
IChpID09IGxhc3RYT2Zmc2V0KSA/IHJlY3QucmlnaHQoKSA6IChpICsgMSkgKiB0aWxlV2lkdGgo
KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBkc3RCb3R0b20gPSAoaiA9PSBsYXN0WU9mZnNldCkg
PyByZWN0LmJvdHRvbSgpIDogKGogKyAxKSAqIHRpbGVIZWlnaHQoKTsKKyAgICAgICAgICAgIGNv
bnN0IGludCBzcmNYID0gZHN0WCAlIHRpbGVXaWR0aCgpOworICAgICAgICAgICAgY29uc3QgaW50
IHNyY1kgPSBkc3RZICUgdGlsZUhlaWdodCgpOworICAgICAgICAgICAgVGlsZVJlY3QgdGlsZVJl
Y3Q7CisgICAgICAgICAgICB0aWxlUmVjdC5maXJzdCA9IFRpbGVJbmRleChpLCBqKTsKKyAgICAg
ICAgICAgIHRpbGVSZWN0LnNlY29uZCA9IFBsYXRmb3JtOjpJbnRSZWN0KHNyY1gsIHNyY1ksIGRz
dFJpZ2h0IC0gZHN0WCwgZHN0Qm90dG9tIC0gZHN0WSk7CisgICAgICAgICAgICB0aWxlUmVjdExp
c3QuYXBwZW5kKHRpbGVSZWN0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGlsZVJl
Y3RMaXN0OworfQorCisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0TGlzdCBCYWNraW5n
U3RvcmVQcml2YXRlOjptYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1hcEZyb21UcmFuc2Zv
cm1lZENvbnRlbnRzVG9UaWxlcyhyZWN0LCBmcm9udFN0YXRlKCkpOworfQorCitCYWNraW5nU3Rv
cmVQcml2YXRlOjpUaWxlUmVjdExpc3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5z
Zm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0LCBCYWNr
aW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpIGNvbnN0Cit7CisgICAgVGlsZU1hcCB0aWxlTWFwID0g
c3RhdGUtPnRpbGVNYXAoKTsKKworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3Q7CisgICAg
VGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gdGlsZU1hcC5lbmQoKTsKKyAgICBmb3IgKFRp
bGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gaXQtPmZpcnN0OworICAgICAgICBCYWNr
aW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29uZDsKKworICAgICAgICAvLyBOZWVkIHRvIG1h
cCB0aGUgcmVjdCB0byB0aWxlIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVj
dCByID0gcmVjdDsKKworICAgICAgICAvLyBUaGUgb3JpZ2luIG9mIHRoZSB0aWxlIGluY2x1ZGlu
ZyB0aGUgYmFja2luZyBzdG9yZSBvZmZzZXQuCisgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQ
b2ludCBvcmlnaW5PZlRpbGUgPSB0aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgsIHN0YXRlLT5iYWNr
aW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIHIubW92ZSgtKG9yaWdpbk9mVGlsZS54KCkpLCAt
KG9yaWdpbk9mVGlsZS55KCkpKTsKKworICAgICAgICAvLyBEbyB3ZSBpbnRlcnNlY3QgdGhlIGN1
cnJlbnQgdGlsZSBvciBubz8KKyAgICAgICAgci5pbnRlcnNlY3QodGlsZS0+cmVjdCgpKTsKKyAg
ICAgICAgaWYgKHIuaXNFbXB0eSgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAg
Ly8gSWYgd2UgZG8gYXBwZW5kIHRvIGxpc3QgYW5kIFZvaWxhIQorICAgICAgICBUaWxlUmVjdCB0
aWxlUmVjdDsKKyAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgdGlsZVJl
Y3Quc2Vjb25kID0gcjsKKyAgICAgICAgdGlsZVJlY3RMaXN0LmFwcGVuZCh0aWxlUmVjdCk7Cisg
ICAgfQorICAgIHJldHVybiB0aWxlUmVjdExpc3Q7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6dXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCkKK3sKKyAgICAvLyBUaGlzIHdpbGwgdXBk
YXRlIHRoZSB0aWxlIG1hdHJpeC4KKyAgICBzY3JvbGxCYWNraW5nU3RvcmUoMCwgMCk7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29udGVudHNTaXplQ2hhbmdlZChjb25zdCBQbGF0
Zm9ybTo6SW50U2l6ZSYpCit7CisgICAgdXBkYXRlVGlsZU1hdHJpeElmTmVlZGVkKCk7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6
SW50UG9pbnQmKQoreworICAgIC8vIEZJWE1FOiBOZWVkIHRvIGRvIGFueXRoaW5nIGhlcmU/Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dHJhbnNmb3JtQ2hhbmdlZCgpCit7CisgICAg
aWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
IWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+cmVzZXQoKTsKKyAgICAgICAg
bV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1ZTo6VmlzaWJsZVpvb20sIHZpc2li
bGVDb250ZW50c1JlY3QoKSk7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRU
aWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJhY2tp
bmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1h
cCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBib29sIGhhc0N1
cnJlbnRWaXNpYmxlWm9vbUpvYiA9IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9v
bUpvYigpOworICAgIGJvb2wgaXNMb2FkaW5nID0gbV9jbGllbnQtPmlzTG9hZGluZygpOworICAg
IGlmIChpc0xvYWRpbmcpIHsKKyAgICAgICAgaWYgKCFoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2Ip
CisgICAgICAgICAgICBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdCA9IHZpc2libGVDb250ZW50c1Jl
Y3QoKTsgLy8gQ2FjaGUgdGhpcyBmb3IgYmxpdFZpc2libGVDb250ZW50cy4KKworICAgICAgICAv
LyBBZGQgdGhlIGN1cnJlbnRseSB2aXNpYmxlIHRpbGVzIHRvIHRoZSByZW5kZXIgcXVldWUgYXMg
dmlzaWJsZSB6b29tIGpvYnMuCisgICAgICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3QgPSBt
YXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXModmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsK
KyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6ZSgpOyArK2kp
IHsKKyAgICAgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0ID0gdGlsZVJlY3RMaXN0W2ldOworICAg
ICAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7CisgICAgICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOworICAgICAg
ICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0KGluZGV4KTsKKwor
ICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSB0aGUgd2hvbGUgcmVjdC4KKyAgICAgICAgICAgIHRp
bGVSZWN0LnNlY29uZCA9IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdCB3aG9sZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGls
ZVJlY3QpOworICAgICAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShSZW5kZXJRdWV1
ZTo6VmlzaWJsZVpvb20sIHdob2xlUmVjdCk7CisKKyAgICAgICAgICAgIC8vIENvcHkgdGhlIHZp
c2libGUgY29udGVudHMgaW50byB0aGUgdmlzaWJsZVRpbGVCdWZmZXIgaWYgd2UgZG9uJ3QgaGF2
ZQorICAgICAgICAgICAgLy8gYW55IGN1cnJlbnQgdmlzaWJsZSB6b29tIGpvYnMuCisgICAgICAg
ICAgICBpZiAoIWhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYikgeworICAgICAgICAgICAgICAgIC8v
IE1hcCB0byB0aGUgZGVzdGluYXRpb24ncyBjb29yZGluYXRlIHN5c3RlbS4KKyAgICAgICAgICAg
ICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgZGlmZmVyZW5jZSA9IHRoaXMtPm9yaWdpbk9mVGlsZShp
bmRleCkgLSBtX3Zpc2libGVUaWxlQnVmZmVyUmVjdC5sb2NhdGlvbigpOworICAgICAgICAgICAg
ICAgIFBsYXRmb3JtOjpJbnRTaXplIG9mZnNldCA9IFBsYXRmb3JtOjpJbnRTaXplKGRpZmZlcmVu
Y2UueCgpLCBkaWZmZXJlbmNlLnkoKSk7CisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJl
Y3QgZGlydHlSZWN0ID0gZGlydHlUaWxlUmVjdDsKKyAgICAgICAgICAgICAgICBkaXJ0eVJlY3Qu
bW92ZShvZmZzZXQud2lkdGgoKSwgb2Zmc2V0LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAg
IEJhY2tpbmdTdG9yZVRpbGUqIHZpc2libGVUaWxlQnVmZmVyCisgICAgICAgICAgICAgICAgICAg
ID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPnZpc2libGVUaWxlQnVmZmVyKCk7
CisgICAgICAgICAgICAgICAgQVNTRVJUKHZpc2libGVUaWxlQnVmZmVyLT5zaXplKCkgPT0gUGxh
dGZvcm06OkludFNpemUobV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKSk7
CisgICAgICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpibGl0VG9C
dWZmZXIoCisgICAgICAgICAgICAgICAgICAgIHZpc2libGVUaWxlQnVmZmVyLT5mcm9udEJ1ZmZl
cigpLT5uYXRpdmVCdWZmZXIoKSwgZGlydHlSZWN0LAorICAgICAgICAgICAgICAgICAgICB0aWxl
LT5mcm9udEJ1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKSwgZGlydHlUaWxlUmVjdCk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZXNldCgpOwor
ICAgIHJlc2V0VGlsZXModHJ1ZSAvKnJlc2V0QmFja2dyb3VuZCovKTsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmVQcml2YXRlOjpvcmllbnRhdGlvbkNoYW5nZWQoKQoreworICAgIHVwZGF0ZVRpbGVN
YXRyaXhJZk5lZWRlZCgpOworICAgIGNyZWF0ZVZpc2libGVUaWxlQnVmZmVyKCk7Cit9CisKK3Zv
aWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKGNvbnN0IFBs
YXRmb3JtOjpJbnRTaXplJiBzaXplKQoreworfQorCitzdGF0aWMgdm9pZCBjcmVhdGVWaXNpYmxl
VGlsZUJ1ZmZlckZvcldlYlBhZ2UoV2ViUGFnZVByaXZhdGUqIHBhZ2UpCit7CisgICAgQVNTRVJU
KHBhZ2UpOworICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9i
YWxTdXJmYWNlUG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplVmlzaWJsZVRpbGVC
dWZmZXIocGFnZS0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7Cit9CisKK3ZvaWQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y3JlYXRlU3VyZmFjZXMoKQoreworICAgIEJhY2tpbmdTdG9yZUdlb21l
dHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFw
ID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBBU1NFUlQoY3VycmVudE1hcC5pc0Vt
cHR5KCkpOworCisgICAgaWYgKG1fd2ViUGFnZS0+aXNWaXNpYmxlKCkpIHsKKyAgICAgICAgLy8g
VGhpcyBtZXRob2QgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiBzZXR0aW5nIHVwIGEg
bmV3IHdlYiBwYWdlIGluc3RhbmNlIGFuZAorICAgICAgICAvLyBiZWZvcmUgc2FpZCBpbnN0YW5j
ZSBpcyBtYWRlIHZpc2libGUgc28gYXMgdG8gZW5zdXJlIGEgY29uc2lzdGVudCBkZWZpbml0aW9u
IG9mIHdlYgorICAgICAgICAvLyBwYWdlIHZpc2liaWxpdHkuIFRoYXQgaXMsIGEgd2ViIHBhZ2Ug
aXMgc2FpZCB0byBiZSB2aXNpYmxlIHdoZW4gZXhwbGljaXRseSBtYWRlIHZpc2libGUuCisgICAg
ICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAg
U3VyZmFjZVBvb2wqIHN1cmZhY2VQb29sID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29s
KCk7CisgICAgc3VyZmFjZVBvb2wtPmluaXRpYWxpemUodGlsZVNpemUoKSk7CisKKyAgICBpZiAo
c3VyZmFjZVBvb2wtPmlzRW1wdHkoKSkgLy8gU2V0dGluZ3Mgc3BlY2lmeSAwIHRpbGVzIC8gbm8g
YmFja2luZyBzdG9yZS4KKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgRGl2aXNvciBkaXZp
c29yID0gYmVzdERpdmlzb3IoZXhwYW5kZWRDb250ZW50c1NpemUoKSwgdGlsZVdpZHRoKCksIHRp
bGVIZWlnaHQoKSwgbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCksIG1pbmltdW1OdW1iZXJPZlRp
bGVzSGlnaCgpLCBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24pOworCisgICAgaW50IG51
bWJlck9mVGlsZXNXaWRlID0gZGl2aXNvci5maXJzdDsKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc0hp
Z2ggPSBkaXZpc29yLnNlY29uZDsKKworICAgIGNvbnN0IFN1cmZhY2VQb29sOjpUaWxlTGlzdCB0
aWxlTGlzdCA9IHN1cmZhY2VQb29sLT50aWxlTGlzdCgpOworICAgIEFTU0VSVChzdGF0aWNfY2Fz
dDxpbnQ+KHRpbGVMaXN0LnNpemUoKSkgPj0gKG51bWJlck9mVGlsZXNXaWRlICogbnVtYmVyT2ZU
aWxlc0hpZ2gpKTsKKworICAgIFRpbGVNYXAgbmV3VGlsZU1hcDsKKyAgICBmb3IgKGludCB5ID0g
MDsgeSA8IG51bWJlck9mVGlsZXNIaWdoOyArK3kpIHsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7
IHggPCBudW1iZXJPZlRpbGVzV2lkZTsgKyt4KSB7CisgICAgICAgICAgICBUaWxlSW5kZXggaW5k
ZXgoeCwgeSk7CisgICAgICAgICAgICBuZXdUaWxlTWFwLmFkZChpbmRleCwgdGlsZUxpc3QuYXQo
eCArIHkgKiBudW1iZXJPZlRpbGVzV2lkZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8g
U2V0IHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBiYWNraW5nc3RvcmUgZ2VvbWV0cnkuCisgICAg
YmFja1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNXaWRlKGRpdmlzb3IuZmlyc3QpOworICAgIGJh
Y2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzSGlnaChkaXZpc29yLnNlY29uZCk7CisgICAgYmFj
a1N0YXRlKCktPnNldFRpbGVNYXAobmV3VGlsZU1hcCk7CisKKyAgICAvLyBTd2FwIGJhY2svZnJv
bnQgc3RhdGUuCisgICAgc3dhcFN0YXRlKCk7CisKKyAgICBjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZl
ckZvcldlYlBhZ2UobV93ZWJQYWdlLT5kKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRl
OjpjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlcigpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlz
aWJsZSgpIHx8ICFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBjcmVhdGVWaXNp
YmxlVGlsZUJ1ZmZlckZvcldlYlBhZ2UobV93ZWJQYWdlLT5kKTsKK30KKworUGxhdGZvcm06Oklu
dFBvaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgm
IGluZGV4KSBjb25zdAoreworICAgIHJldHVybiBvcmlnaW5PZlRpbGUoaW5kZXgsIGZyb250U3Rh
dGUoKS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKK30KKworUGxhdGZvcm06OkludFBvaW50IEJhY2tp
bmdTdG9yZVByaXZhdGU6Om9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4LCBjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1
cm4gUGxhdGZvcm06OkludFBvaW50KGJhY2tpbmdTdG9yZVJlY3QueCgpICsgKGluZGV4LmkoKSAq
IHRpbGVXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9y
ZVJlY3QueSgpICsgKGluZGV4LmooKSAqIHRpbGVIZWlnaHQoKSkpOworfQorCitpbnQgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgY29uc3QKK3sKKyAgICAv
LyBUaGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgd2lkZSByZXF1aXJlZCB0byBmaWxsIHRoZSB2
aWV3cG9ydCArIDEgdGlsZSBleHRyYSB0byBhbGxvdyBzY3JvbGxpbmcuCisgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4oY2VpbGYobV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCku
d2lkdGgoKSAvIHN0YXRpY19jYXN0PGZsb2F0Pih0aWxlV2lkdGgoKSkpKSArIDE7Cit9CisKK2lu
dCBCYWNraW5nU3RvcmVQcml2YXRlOjptaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKSBjb25zdAor
eworICAgIC8vIFRoZSBtaW5pbXVtIG51bWJlciBvZiB0aWxlcyBoaWdoIHJlcXVpcmVkIHRvIGZp
bGwgdGhlIHZpZXdwb3J0ICsgMSB0aWxlIGV4dHJhIHRvIGFsbG93IHNjcm9sbGluZy4KKyAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihjZWlsZihtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9y
dFNpemUoKS5oZWlnaHQoKSAvIHN0YXRpY19jYXN0PGZsb2F0Pih0aWxlSGVpZ2h0KCkpKSkgKyAx
OworfQorCitQbGF0Zm9ybTo6SW50U2l6ZSBCYWNraW5nU3RvcmVQcml2YXRlOjpleHBhbmRlZENv
bnRlbnRzU2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY2xpZW50LT50cmFuc2Zvcm1lZENv
bnRlbnRzU2l6ZSgpLmV4cGFuZGVkVG8obV9jbGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXpl
KCkpOworfQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZVdpZHRoKCkKK3sKKyAgICBz
dGF0aWMgaW50IHR3ID0gMDsKKyAgICBpZiAoIXR3KQorICAgICAgICB0dyA9IEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2NhcGVXaWR0aCgpOworICAgIHJldHVy
biB0dzsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVIZWlnaHQoKQoreworICAg
IHN0YXRpYyBpbnQgdGggPSAwOworICAgIGlmICghdGgpCisgICAgICAgIHRoID0gQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46OmxhbmRzY2FwZUhlaWdodCgpOworICAgIHJl
dHVybiB0aDsKK30KKworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGls
ZVNpemUoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50U2l6ZSh0aWxlV2lkdGgoKSwgdGls
ZUhlaWdodCgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
dGlsZVJlY3QoKQoreworICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgwLCAwLCB0aWxlV2lk
dGgoKSwgdGlsZUhlaWdodCgpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5k
ZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogdGlsZUJ1
ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxh
dGZvcm06OkludFBvaW50JiBzdXJmYWNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHNSZWN0KSBj
b25zdAoreworICAgIC8vIElmIHRpbGVCdWZmZXIgPT0gMCwgd2UgcmVuZGVyIGRpcmVjdGx5IHRv
IHRoZSB3aW5kb3cuCisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpICYmIHRpbGVCdWZm
ZXIpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVu
ZGVyQ29udGVudHMgdGlsZUJ1ZmZlcj0weCV4IHN1cmZhY2VPZmZzZXQ9KCVkLCVkKSBjb250ZW50
c1JlY3Q9KCVkLCVkICVkeCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlQnVm
ZmVyLCBzdXJmYWNlT2Zmc2V0LngoKSwgc3VyZmFjZU9mZnNldC55KCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb250ZW50c1JlY3QueCgpLCBjb250ZW50c1JlY3QueSgpLCBjb250ZW50
c1JlY3Qud2lkdGgoKSwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgLy8g
SXQgaXMgdXAgdG8gY2FsbGVycyBvZiB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGxheW91dCB0aGVt
c2VsdmVzIQorICAgIEFTU0VSVCghbV93ZWJQYWdlLT5kLT5tYWluRnJhbWUoKS0+dmlldygpLT5u
ZWVkc0xheW91dCgpKTsKKworICAgIFBsYXRmb3JtOjpJbnRTaXplIGNvbnRlbnRzU2l6ZSA9IG1f
Y2xpZW50LT5jb250ZW50c1NpemUoKTsKKyAgICBDb2xvciBiYWNrZ3JvdW5kQ29sb3IobV93ZWJQ
YWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogdGFyZ2V0QnVmZmVyID0gdGlsZUJ1ZmZlcgorICAg
ICAgICA/IHRpbGVCdWZmZXIKKyAgICAgICAgOiBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3co
KS0+YnVmZmVyKCk7CisKKyAgICBpZiAoY29udGVudHNTaXplLmlzRW1wdHkoKQorICAgICAgICB8
fCAhUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+
dHJhbnNmb3JtZWRDb250ZW50c1NpemUoKSkuY29udGFpbnMoY29udGVudHNSZWN0KQorICAgICAg
ICB8fCBiYWNrZ3JvdW5kQ29sb3IuaGFzQWxwaGEoKSkgeworICAgICAgICAvLyBDbGVhciB0aGUg
YXJlYSBpZiBpdCdzIG5vdCBmdWxseSBjb3ZlcmVkIGJ5IChvcGFxdWUpIGNvbnRlbnRzLgorICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCBjbGVhclJlY3QgPSBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgICAgIGNvbnRlbnRzUmVjdC54KCkgLSBzdXJm
YWNlT2Zmc2V0LngoKSwgY29udGVudHNSZWN0LnkoKSAtIHN1cmZhY2VPZmZzZXQueSgpLAorICAg
ICAgICAgICAgY29udGVudHNSZWN0LndpZHRoKCksIGNvbnRlbnRzUmVjdC5oZWlnaHQoKSk7CisK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZlcih0YXJn
ZXRCdWZmZXIsIGNsZWFyUmVjdCwKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5yZWQoKSwg
YmFja2dyb3VuZENvbG9yLmdyZWVuKCksCisgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3IuYmx1
ZSgpLCBiYWNrZ3JvdW5kQ29sb3IuYWxwaGEoKSk7CisgICAgfQorCisgICAgaWYgKGNvbnRlbnRz
U2l6ZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKyAgICBtX3dlYlBhZ2UtPmQtPmNvbW1pdFJvb3RMYXllcklmTmVlZGVkKCk7
CisjZW5kaWYKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6RHJhd2FibGUq
IGJ1ZmZlckRyYXdhYmxlID0KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
Ojpsb2NrQnVmZmVyRHJhd2FibGUodGFyZ2V0QnVmZmVyKTsKKworICAgIFBsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0KiBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCA9IGJ1ZmZlckRyYXdhYmxl
CisgICAgICAgID8gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNyZWF0ZVBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxlKQorICAgICAgICA6IDA7CisgICAgUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQqIHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0ID0gYnVm
ZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQKKyAgICAgICAgPyBidWZmZXJQbGF0Zm9ybUdyYXBo
aWNzQ29udGV4dAorICAgICAgICA6IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5s
b2NrVGlsZVJlbmRlcmluZ1N1cmZhY2UoKTsKKworICAgIEFTU0VSVCh0YXJnZXRQbGF0Zm9ybUdy
YXBoaWNzQ29udGV4dCk7CisKKyAgICB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBncmFwaGlj
c0NvbnRleHQodGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworCisgICAgICAgIC8vIEJl
bGlldmUgaXQgb3Igbm90IHRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIHRoZSBXZWJLaXQgU2tpYSBi
YWNrZW5kCisgICAgICAgIC8vIGRvZXNuJ3Qgc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRlIHVubGVz
cyB5b3UgY2FsbCBzYXZlIGZpcnN0IDpQCisgICAgICAgIGdyYXBoaWNzQ29udGV4dC5zYXZlKCk7
CisKKyAgICAgICAgLy8gVHJhbnNsYXRlIGNvbnRleHQgYWNjb3JkaW5nIHRvIG9mZnNldC4KKyAg
ICAgICAgZ3JhcGhpY3NDb250ZXh0LnRyYW5zbGF0ZSgtc3VyZmFjZU9mZnNldC54KCksIC1zdXJm
YWNlT2Zmc2V0LnkoKSk7CisKKyAgICAgICAgLy8gQWRkIG91ciB0cmFuc2Zvcm1hdGlvbiBtYXRy
aXggYXMgdGhlIGdsb2JhbCB0cmFuc2Zvcm0uCisgICAgICAgIEFmZmluZVRyYW5zZm9ybSBhZmZp
bmVUcmFuc2Zvcm0oCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0
cml4KCktPmEoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRy
aXgoKS0+YigpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJp
eCgpLT5jKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4
KCktPmQoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgo
KS0+ZSgpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJpeCgp
LT5mKCkpOworICAgICAgICBncmFwaGljc0NvbnRleHQuY29uY2F0Q1RNKGFmZmluZVRyYW5zZm9y
bSk7CisKKyAgICAgICAgLy8gTm93IHRoYXQgdGhlIG1hdHJpeCBpcyBhcHBsaWVkIHdlIG5lZWQg
dW50cmFuZm9ybWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50
UmVjdCB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJh
bnNmb3JtZWQoY29udGVudHNSZWN0KTsKKworICAgICAgICAvLyBXZSBleHRyYWN0IGZyb20gdGhl
IGNvbnRlbnRzUmVjdCBidXQgZHJhdyBhIHNsaWdodGx5IGxhcmdlciByZWdpb24gdGhhbgorICAg
ICAgICAvLyB3ZSB3ZXJlIHRvbGQgdG8sIGluIG9yZGVyIHRvIGF2b2lkIHBpeGVscyBiZWluZyBy
ZW5kZXJlZCBvbmx5IHBhcnRpYWxseS4KKyAgICAgICAgY29uc3QgaW50IGF0TGVhc3RPbmVEZXZp
Y2VQaXhlbCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKDEuMCAvIG1fd2Vi
UGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+YSgpKSk7CisgICAgICAgIHVudHJhbnNm
b3JtZWRDb250ZW50c1JlY3QuaW5mbGF0ZShhdExlYXN0T25lRGV2aWNlUGl4ZWwsIGF0TGVhc3RP
bmVEZXZpY2VQaXhlbCk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1bnRyYW5zZm9ybWVk
IHJlY3RhbmdsZSBmb3IgdGhlIChzbGlnaHRseSBsYXJnZXIgdGhhbgorICAgICAgICAvLyBpbml0
aWFsbHkgcmVxdWVzdGVkKSByZXBhaW50ZWQgcmVnaW9uIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9m
IHRoZSBwYWdlLgorICAgICAgICB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0LmludGVyc2VjdChQ
bGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIGNvbnRlbnRzU2l6ZSkp
OworCisgICAgICAgIC8vIFNvbWUgV2ViS2l0IHBhaW50aW5nIGJhY2tlbmRzICpjb3VnaCogU2tp
YSAqY291Z2gqIGRvbid0IHNldCB0aGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gdG8gdGhl
IGRpcnR5UmVjdCBzbyBkbyBzbyBoZXJlIGV4cGxpY2l0bHkuCisgICAgICAgIGdyYXBoaWNzQ29u
dGV4dC5jbGlwKHVudHJhbnNmb3JtZWRDb250ZW50c1JlY3QpOworCisgICAgICAgIC8vIFRha2Ug
Y2FyZSBvZiBwb3NzaWJsZSBsZWZ0IG92ZXJmbG93IG9uIFJUTCBwYWdlLgorICAgICAgICBpZiAo
aW50IGxlZnRPdmVyRmxvdyA9IG1fY2xpZW50LT5mcmFtZSgpLT52aWV3KCktPm1pbmltdW1TY3Jv
bGxQb3NpdGlvbigpLngoKSkgeworICAgICAgICAgICAgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVj
dC5tb3ZlKGxlZnRPdmVyRmxvdywgMCk7CisgICAgICAgICAgICBncmFwaGljc0NvbnRleHQudHJh
bnNsYXRlKC1sZWZ0T3ZlckZsb3csIDApOworICAgICAgICB9CisKKyAgICAgICAgLy8gTGV0IFdl
YkNvcmUgcmVuZGVyIHRoZSBwYWdlIGNvbnRlbnRzIGludG8gdGhlIGRyYXdpbmcgc3VyZmFjZS4K
KyAgICAgICAgbV9jbGllbnQtPmZyYW1lKCktPnZpZXcoKS0+cGFpbnRDb250ZW50cygmZ3JhcGhp
Y3NDb250ZXh0LCB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0KTsKKworI2lmIEVOQUJMRShJTlNQ
RUNUT1IpCisgICAgICAgIGlmIChtX3dlYlBhZ2UtPmQtPm1fcGFnZS0+aW5zcGVjdG9yQ29udHJv
bGxlcigpLT5lbmFibGVkKCkpIHsKKyAgICAgICAgICAgIFdlYkNvcmU6OkludFBvaW50IHNjcm9s
bFBvc2l0aW9uID0gbV9jbGllbnQtPmZyYW1lKCktPnZpZXcoKS0+c2Nyb2xsUG9zaXRpb24oKTsK
KyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC50cmFuc2xhdGUoc2Nyb2xsUG9zaXRpb24ueCgp
LCBzY3JvbGxQb3NpdGlvbi55KCkpOworICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT5tX3BhZ2Ut
Pmluc3BlY3RvckNvbnRyb2xsZXIoKS0+ZHJhd05vZGVIaWdobGlnaHQoZ3JhcGhpY3NDb250ZXh0
KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnJlc3RvcmUo
KTsKKyAgICB9CisKKyAgICAvLyBHcmFiIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGZyb20gdGhlIGRy
YXdpbmcgc3VyZmFjZSBpbnRvIHRoZSB0aWxlIGltYWdlLgorI2lmIFVTRShPUEVOVkcpCisgICAg
c3VyZmFjZS0+bWFrZUN1cnJlbnQoKTsKKyNlbmRpZgorCisgICAgZGVsZXRlIGJ1ZmZlclBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0OworCisgICAgaWYgKGJ1ZmZlckRyYXdhYmxlKQorICAgICAgICBy
ZWxlYXNlQnVmZmVyRHJhd2FibGUodGFyZ2V0QnVmZmVyKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
Y29uc3QgUGxhdGZvcm06OkludFBvaW50IGRzdFBvaW50KGNvbnRlbnRzUmVjdC54KCkgLSBzdXJm
YWNlT2Zmc2V0LngoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnRlbnRzUmVjdC55KCkgLSBzdXJmYWNlT2Zmc2V0LnkoKSk7CisgICAgICAgIGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0IGRzdFJlY3QoZHN0UG9pbnQsIGNvbnRlbnRzUmVjdC5zaXplKCkpOwor
ICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCBzcmNSZWN0ID0gZHN0UmVjdDsKKworICAg
ICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkaXJlY3RseSBkcmF3IHRvIHRoZSBidWZmZXIsIGNvcHkg
ZnJvbSB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAgICBTdXJmYWNlUG9vbDo6Z2xvYmFsU3Vy
ZmFjZVBvb2woKS0+cmVsZWFzZVRpbGVSZW5kZXJpbmdTdXJmYWNlKHRhcmdldFBsYXRmb3JtR3Jh
cGhpY3NDb250ZXh0KTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpi
bGl0VG9CdWZmZXIodGFyZ2V0QnVmZmVyLCBkc3RSZWN0LCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OmRyYXdpbmdTdXJmYWNlKCksIHNyY1JlY3QpOworICAgIH0KK30KKworI2lmIERF
QlVHX0ZBVF9GSU5HRVJTCitzdGF0aWMgdm9pZCBkcmF3RGVidWdSZWN0KEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBkc3RCdWZmZXIsIGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0JiBkc3RSZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVjdCwgdW5zaWduZWQg
Y2hhciByZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVuc2lnbmVkIGNoYXIgYmx1ZSkKK3sKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCBkcmF3UmVjdChzcmNSZWN0KTsKKyAgICBkcmF3UmVjdC5pbnRl
cnNlY3QoZHN0UmVjdCk7CisgICAgaWYgKCFkcmF3UmVjdC5pc0VtcHR5KCkpCisgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZHN0QnVmZmVyLCBkcmF3
UmVjdCwgcmVkLCBncmVlbiwgYmx1ZSwgMTI4KTsKK30KKyNlbmRpZgorCit2b2lkIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmJsaXRUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVj
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBzcmNCdWZmZXIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVj
dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmxlbmQsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGdsb2Jh
bEFscGhhKQoreworICAgIEFTU0VSVChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFj
ZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgd2luZG93
RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisgICAgd2lu
ZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQ
YWdlLT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIp
OworICAgIEFTU0VSVChzcmNCdWZmZXIpOworICAgIGlmICghZHN0QnVmZmVyKQorICAgICAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbFdh
cm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBibGl0VG9XaW5kb3ciKTsKKworICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QmxlbmRNb2RlIGJsZW5kTW9kZSA9IGJs
ZW5kCisgICAgICAgID8gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTb3VyY2VPdmVy
CisgICAgICAgIDogQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTb3VyY2VDb3B5Owor
CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIoZHN0QnVm
ZmVyLCBkc3RSZWN0LCBzcmNCdWZmZXIsIHNyY1JlY3QsIGJsZW5kTW9kZSwgZ2xvYmFsQWxwaGEp
OworCisjaWYgREVCVUdfRkFUX0ZJTkdFUlMKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1ZmZlciwg
ZHN0UmVjdCwgRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZpbmdlclJlY3QsIDIxMCwgMjEwLCAyNTAp
OworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVyLCBkc3RSZWN0LCBQbGF0Zm9ybTo6SW50UmVj
dChGYXRGaW5nZXJzOjptX2RlYnVnRmF0RmluZ2VyQ2xpY2tQb3NpdGlvbiwgUGxhdGZvcm06Oklu
dFNpemUoMywgMykpLCAwLCAwLCAwKTsKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1ZmZlciwgZHN0
UmVjdCwgUGxhdGZvcm06OkludFJlY3QoRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZpbmdlckFkanVz
dGVkUG9zaXRpb24sIFBsYXRmb3JtOjpJbnRTaXplKDUsIDUpKSwgMTAwLCAxMDAsIDEwMCk7Cisj
ZW5kaWYKKworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNoZWNrZXJXaW5kb3coY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBjb250ZW50c09yaWdpbiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29udGVudHNT
Y2FsZSkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsKKworICAgIHdpbmRvd0Zy
b250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKGRzdFJlY3QpOworICAgIHdpbmRv
d0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9uKGRzdFJlY3QpOworCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFn
ZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsK
KyAgICBpZiAoIWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwg
Y291bGRuJ3QgY2hlY2tlcldpbmRvdyIpOworCisgICAgQ29sb3IgY29sb3IobV93ZWJQYWdlLT5z
ZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAgdW5zaWduZWQgY2hhciBhbHBoYSA9
IGNvbG9yLmFscGhhKCk7CisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjaGVj
a2VyQnVmZmVyKGRzdEJ1ZmZlciwgZHN0UmVjdCwgY29udGVudHNPcmlnaW4sIGNvbnRlbnRzU2Nh
bGUsIGFscGhhKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2lu
ZG93KCkKK3sKKyAgICAvLyBHcmFiIGEgcmVjdCBhcHByb3ByaWF0ZSBmb3IgdGhlIGN1cnJlbnQg
dGhyZWFkLgorICAgIGlmIChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVh
ZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpCisgICAgICAgIGludmFsaWRhdGVX
aW5kb3cobV93ZWJQYWdlLT5jbGllbnQoKS0+dXNlckludGVyZmFjZUJsaXR0ZWREZXN0aW5hdGlv
blJlY3QoKSk7CisgICAgZWxzZQorICAgICAgICBpbnZhbGlkYXRlV2luZG93KFBsYXRmb3JtOjpJ
bnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV9jbGllbnQtPnRyYW5zZm9ybWVkVmll
d3BvcnRTaXplKCkpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRl
V2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpCit7CisgICAgaWYgKGRzdC5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06
OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpICYm
ICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIC8vIFRoaXMgbmVl
ZHMgdG8gYmUgc3luYyBpbiBvcmRlciB0byBzd2FwIHRoZSByZWNlbnRseSBkcmF3biB0aGluZy4u
LgorICAgICAgICAvLyBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgZnJvbSBXZWJLaXQgdGhyZWFk
IGR1cmluZyBkaXJlY3QgcmVuZGVyaW5nLgorICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoU3luY01lc3NhZ2UoCisgICAgICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rp
b25UeXBlLCBCYWNraW5nU3RvcmVQcml2YXRlLCBQbGF0Zm9ybTo6SW50UmVjdD4oCisgICAgICAg
ICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3csIHRoaXMsIGRz
dCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisg
ICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2
ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3cgZHN0ID0g
JXMiLCBkc3QudG9TdHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgLy8gU2lu
Y2Ugb3VyIHdpbmRvdyBtYXkgYWxzbyBiZSBkb3VibGUgYnVmZmVyZWQsIHdlIG5lZWQgdG8gYWxz
byBjb3B5IHRoZQorICAgIC8vIGZyb250IGJ1ZmZlcidzIGNvbnRlbnRzIHRvIHRoZSBiYWNrIGJ1
ZmZlciBiZWZvcmUgd2Ugc3dhcCB0aGVtLiBJdCBpcworICAgIC8vIGFuYWxvZ291cyB0byB3aGF0
IHdlIGRvIHdpdGggb3VyIGRvdWJsZSBidWZmZXJlZCB0aWxlcyBieSBjYWxsaW5nCisgICAgLy8g
Y29weVByZXZpb3VzQ29udGVudHNUb0JhY2tpbmdTdXJmYWNlT2ZUaWxlKCkuIEl0IG9ubHkgYWZm
ZWN0cyBwYXJ0aWFsCisgICAgLy8gc2NyZWVuIHVwZGF0ZXMgc2luY2Ugd2hlbiB3ZSBhcmUgc2Ny
b2xsaW5nIG9yIHpvb21pbmcsIHRoZSB3aG9sZSB3aW5kb3cKKyAgICAvLyBpcyBpbnZhbGlkYXRl
ZCBhbnl3YXlzIGFuZCBubyBjb3B5aW5nIGlzIG5lZWRlZC4KKyAgICBjb3B5UHJldmlvdXNDb250
ZW50c1RvQmFja1N1cmZhY2VPZldpbmRvdygpOworCisgICAgUGxhdGZvcm06OkludFJlY3QgZHN0
UmVjdCA9IGRzdDsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpZXdwb3J0UmVjdChQbGF0Zm9y
bTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKTsK
KyAgICBkc3RSZWN0LmludGVyc2VjdCh2aWV3cG9ydFJlY3QpOworCisgICAgaWYgKGRzdFJlY3Qu
d2lkdGgoKSA8PSAwIHx8IGRzdFJlY3QuaGVpZ2h0KCkgPD0gMCkKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OmludmFsaWRhdGVXaW5kb3cgcG9zdGluZyA9ICVzIiwgZHN0UmVjdC50b1N0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworI2VuZGlmCisKKyAgICBtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyID0g
KG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXIgKyAxKSAlIDI7CisgICAgbV93ZWJQYWdlLT5jbGll
bnQoKS0+d2luZG93KCktPnBvc3QoZHN0UmVjdCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6Y2xlYXJXaW5kb3coKQoreworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpICYmICFz
aG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIHR5cGVkZWYgdm9pZCAo
QmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjoqRnVuY3Rpb25UeXBlKSgp
OworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxh
dGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlPEZ1bmN0aW9uVHlwZSwgQmFja2luZ1N0b3Jl
UHJpdmF0ZT4oCisgICAgICAgICAgICAgICAgJkJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyV2lu
ZG93LCB0aGlzKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5jbGllbnQo
KS0+d2luZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIpOworICAgIGlmICgh
ZHN0QnVmZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBj
bGVhcldpbmRvdyIpOworCisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0
ZWRSZWdpb24oKTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lv
bihQbGF0Zm9ybTo6SW50UmVjdCgKKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBt
X3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworCisgICAgQ29s
b3IgY29sb3IobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5iYWNrZ3JvdW5kQ29sb3IoKSk7CisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpjbGVhckJ1ZmZlcihkc3RCdWZmZXIsCisg
ICAgICAgIGNvbG9yLnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIGNvbG9yLmFs
cGhhKCkpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93KGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB1bnNpZ25lZCBjaGFyIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgdW5zaWduZWQgY2hhciBncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciBibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFscGhhKQoreworICAgIGlmICghQmxhY2tCZXJy
eTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVu
dFRocmVhZCgpICYmICFzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAg
IHR5cGVkZWYgdm9pZCAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVQcml2YXRlOjoq
RnVuY3Rpb25UeXBlKShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBj
aGFyKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VUaHJlYWRN
ZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0
b3JlUHJpdmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyPigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3csIHRoaXMsIHJlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIGFs
cGhhKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+d2lu
ZG93KCktPmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIpOworICAgIGlmICghZHN0QnVm
ZmVyKQorICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpMb2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBjbGVhcldp
bmRvdyIpOworCisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdp
b24ocmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24o
cmVjdCk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFyQnVmZmVy
KGRzdEJ1ZmZlciwgcmVjdCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCitib29sIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OmlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3QKK3sKKyAgICBC
YWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoY29uc3RfY2FzdDxCYWNraW5nU3RvcmVQcml2
YXRlKj4odGhpcykpOworICAgIHJldHVybiBtX2lzU2Nyb2xsaW5nT3Jab29taW5nOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNldFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNjcm9s
bGluZ09yWm9vbWluZywgYm9vbCBzaG91bGRCbGl0KQoreworICAgIHsKKyAgICAgICAgQmFja2lu
Z1N0b3JlTXV0ZXhMb2NrZXIgbG9ja2VyKHRoaXMpOworICAgICAgICBtX2lzU2Nyb2xsaW5nT3Ja
b29taW5nID0gc2Nyb2xsaW5nT3Jab29taW5nOworICAgIH0KKworI2lmICFFTkFCTEVfUkVQQUlO
VE9OU0NST0xMCisgICAgbV9zdXNwZW5kUmVuZGVySm9icyA9IHNjcm9sbGluZ09yWm9vbWluZzsg
Ly8gU3VzcGVuZCB0aGUgcmVuZGVyaW5nIG9mIGV2ZXJ5dGhpbmcuCisjZW5kaWYKKworICAgIGlm
ICghbV93ZWJQYWdlLT5zZXR0aW5ncygpLT5zaG91bGRSZW5kZXJBbmltYXRpb25zT25TY3JvbGxP
clpvb20oKSkKKyAgICAgICAgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMgPSBzY3JvbGxpbmdP
clpvb21pbmc7IC8vIFN1c3BlbmQgdGhlIHJlbmRlcmluZyBvZiBhbmltYXRpb25zLgorCisgICAg
Ly8gQ2xlYXIgdGhpcyBmbGFnIHNpbmNlIHdlIGRvbid0IGNhcmUgaWYgdGhlIHJlbmRlciBxdWV1
ZSBpcyB1bmRlciBwcmVzc3VyZQorICAgIC8vIG9yIG5vdCBzaW5jZSB3ZSBhcmUgc2Nyb2xsaW5n
IGFuZCBpdCBpcyBtb3JlIGltcG9ydGFudCB0byBub3QgbGFnIHRoYW4KKyAgICAvLyBpdCBpcyB0
byBlbnN1cmUgYW5pbWF0aW9ucyBhY2hpZXZlIGJldHRlciBmcmFtZXJhdGVzIQorICAgIGlmIChz
Y3JvbGxpbmdPclpvb21pbmcpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnNldEN1cnJlbnRSZWd1
bGFyUmVuZGVySm9iQmF0Y2hVbmRlclByZXNzdXJlKGZhbHNlKTsKKyNpZiBFTkFCTEVfU0NST0xM
QkFSUworICAgIGVsc2UgaWYgKHNob3VsZEJsaXQgJiYgIXNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkpCisgICAgICAgIGJsaXRWaXNpYmxlQ29udGVudHMoKTsKKyNlbmRpZgorfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmxvY2tCYWNraW5nU3RvcmUoKQoreworICAgIHB0aHJl
YWRfbXV0ZXhfbG9jaygmbV9tdXRleCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
dW5sb2NrQmFja2luZ1N0b3JlKCkKK3sKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbV9tdXRl
eCk7Cit9CisKK0JhY2tpbmdTdG9yZUdlb21ldHJ5KiBCYWNraW5nU3RvcmVQcml2YXRlOjpmcm9u
dFN0YXRlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3Rv
cmVHZW9tZXRyeSo+KG1fZnJvbnRTdGF0ZSk7Cit9CisKK0JhY2tpbmdTdG9yZUdlb21ldHJ5KiBC
YWNraW5nU3RvcmVQcml2YXRlOjpiYWNrU3RhdGUoKSBjb25zdAoreworICAgIHJldHVybiByZWlu
dGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdlb21ldHJ5Kj4obV9iYWNrU3RhdGUpOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN3YXBTdGF0ZSgpCit7CisjaWYgT1MoUU5YKQorICAg
IC8vIFN0b3JlIHRlbXBzLgorICAgIHVuc2lnbmVkIGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDx1
bnNpZ25lZD4oZnJvbnRTdGF0ZSgpKTsKKyAgICB1bnNpZ25lZCBiYWNrID0gcmVpbnRlcnByZXRf
Y2FzdDx1bnNpZ25lZD4oYmFja1N0YXRlKCkpOworCisgICAgLy8gQXRvbWljIGNoYW5nZS4KKyAg
ICBfc21wX3hjaGcoJm1fZnJvbnRTdGF0ZSwgYmFjayk7CisgICAgX3NtcF94Y2hnKCZtX2JhY2tT
dGF0ZSwgZnJvbnQpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhy
ZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOworI2Vsc2UKKyNlcnJv
ciAiaW1wbGVtZW50IG1lISIKKyNlbmRpZgorfQorCitCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJT
dGF0ZSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpIGNvbnN0
Cit7CisgICAgcmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlWyhtX2N1cnJlbnRXaW5kb3dCYWNr
QnVmZmVyICsgMSkgJSAyXTsKK30KKworQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUqIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OndpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlW21fY3VycmVudFdpbmRvd0JhY2tCdWZmZXJdOwor
fQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpkcmF3U3ViTGF5ZXJzKCkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgp
KTsKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVz
c2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRzdCA9IG1fd2ViUGFnZS0+Y2xpZW50KCkt
PnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCk7CisgICAgaWYgKGRzdC5pc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHNy
YyA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRl
bnRzUmVjdCgpOworICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBjb250ZW50c1JlY3QgPSBtX3dlYlBh
Z2UtPmQtPm1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0UmVjdCgKKyAgICAgICAgV2ViQ29yZTo6Rmxv
YXRSZWN0KFdlYkNvcmU6OkludFJlY3Qoc3JjKSkpOworICAgIHJldHVybiBtX3dlYlBhZ2UtPmQt
PmRyYXdTdWJMYXllcnMoZHN0LCBjb250ZW50c1JlY3QpOworfQorI2VuZGlmCisKK2Jvb2wgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6aXNBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBCYWNraW5n
U3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9PSBtX3dlYlBhZ2UgJiYg
IVN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5pc0VtcHR5KCk7Cit9CisKK0JhY2tp
bmdTdG9yZTo6QmFja2luZ1N0b3JlKFdlYlBhZ2UqIHdlYlBhZ2UsIEJhY2tpbmdTdG9yZUNsaWVu
dCogY2xpZW50KQorICAgIDogZChuZXcgQmFja2luZ1N0b3JlUHJpdmF0ZSkKK3sKKyAgICBkLT5t
X3dlYlBhZ2UgPSB3ZWJQYWdlOworICAgIGQtPm1fY2xpZW50ID0gY2xpZW50OworfQorCitCYWNr
aW5nU3RvcmU6On5CYWNraW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBkOworICAgIGQgPSAwOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZTo6Y3JlYXRlU3VyZmFjZSgpCit7CisgICAgc3RhdGljIGJv
b2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAg
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6aW5pdGlhbGl6ZSgpOworICAgICAgICBp
bml0aWFsaXplZCA9IHRydWU7CisgICAgfQorCisjaWYgVVNFKE9QRU5WRykKKyAgICBkLT5tX2Vn
bERpc3BsYXkgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmVnbERpc3BsYXkoKTsK
KworICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgT3BlblZHLgorICAgIGVnbEJpbmRBUEko
RUdMX09QRU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIEVHTERp
c3BsYXlPcGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KGQtPm1fZWdsRGlzcGxheSk7CisjZW5kaWYK
KworICAgIC8vIFRyaWdnZXJzIGNyZWF0aW9uIG9mIHN1cmZhY2VzIGluIGJhY2tpbmdzdG9yZS4K
KyAgICBkLT5jcmVhdGVTdXJmYWNlcygpOworCisjaWYgVVNFKE9QRU5WRykKKyAgICBFR0xEaXNw
bGF5T3BlblZHOjpjdXJyZW50KCktPnNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpLT5tYWtlQ3VycmVu
dCgpOworI2VuZGlmCisKKyAgICAvLyBGb2N1c2luZyB0aGUgV2ViUGFnZSB0cmlnZ2VycyBhIHJl
cGFpbnQsIHNvIHdoaWxlIHdlIHdhbnQgaXQgdG8gYmUKKyAgICAvLyBmb2N1c2VkIGluaXRpYWxs
eSB0aGlzIGhhcyB0byBoYXBwZW4gYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHN1cmZhY2UuCisgICAg
ZC0+bV93ZWJQYWdlLT5zZXRGb2N1c2VkKHRydWUpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6
c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKQoreworICAgIGQtPnN1c3BlbmRT
Y3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpy
ZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKFJlc3VtZVVwZGF0ZU9wZXJhdGlvbiBv
cCkKK3sKKyAgICBkLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKG9wKTsKK30K
KworYm9vbCBCYWNraW5nU3RvcmU6OmlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZC0+aXNTY3JvbGxpbmdPclpvb21pbmcoKTsKK30KKwordm9pZCBCYWNraW5nU3Rv
cmU6OnNldFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNjcm9sbGluZ09yWm9vbWluZykKK3sKKyAg
ICBkLT5zZXRTY3JvbGxpbmdPclpvb21pbmcoc2Nyb2xsaW5nT3Jab29taW5nKTsKK30KKwordm9p
ZCBCYWNraW5nU3RvcmU6OmJsaXRDb250ZW50cyhjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIGNv
bnRlbnRzKQoreworICAgIC8vIEJsaXR0aW5nIGR1cmluZyBkaXJlY3QgcmVuZGVyaW5nIGlzIG5v
dCBzdXBwb3J0ZWQuCisgICAgaWYgKGlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3Rv
cmU6OmJsaXRDb250ZW50cyBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBkaXJlY3QgcmVuZGVy
aW5nIG1vZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGQtPmJsaXRDb250ZW50
cyhkc3RSZWN0LCBjb250ZW50cyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXBhaW50KGlu
dCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAgZC0+cmVw
YWludChQbGF0Zm9ybTo6SW50UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgY29udGVudENoYW5n
ZWQsIGltbWVkaWF0ZSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjpoYXNSZW5kZXJKb2JzKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZC0+c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKTsKK30KKwor
dm9pZCBCYWNraW5nU3RvcmU6OnJlbmRlck9uSWRsZSgpCit7CisgICAgZC0+cmVuZGVyT25JZGxl
KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjppc0RpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkg
Y29uc3QKK3sKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoZCk7CisgICAgcmV0
dXJuIGQtPnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCk7Cit9CisKK2Jvb2wgQmFja2lu
Z1N0b3JlOjpkZWZlcnNCbGl0KCkgY29uc3QKK3sKKyAgICAgICAgcmV0dXJuIGQtPm1fZGVmZXJz
QmxpdDsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNldERlZmVyc0JsaXQoYm9vbCBiKQorewor
ICAgICAgICBkLT5tX2RlZmVyc0JsaXQgPSBiOworfQorCitib29sIEJhY2tpbmdTdG9yZTo6aGFz
QmxpdEpvYnMoKSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkIGJlIGNhbGxl
ZCBmcm9tIHRoZSBjb21wb3NpdGluZyB0aHJlYWQsCisgICAgLy8gYW5kIHRoZSBmbGFnIGlzIHNl
dCBvbiB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLCBzbyBubyBuZWVkIGZvcgorICAgIC8vIHN5bmNo
cm9uaXphdGlvbi4KKyAgICByZXR1cm4gZC0+bV9oYXNCbGl0Sm9iczsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmU6OmJsaXRPbklkbGUoKQoreworICAgIGQtPmJsaXRWaXNpYmxlQ29udGVudHModHJ1
ZSAvKmZvcmNlKi8pOworfQorCit9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNr
YmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9C
YWNraW5nU3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEzZGIw
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5n
U3RvcmUuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEw
LCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNz
ZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAy
MTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgQmFj
a2luZ1N0b3JlX2gKKworI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworI2luY2x1ZGUg
PEJsYWNrQmVycnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRm
b3JtUHJpbWl0aXZlcy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBDaHJvbWVDbGll
bnRCbGFja0JlcnJ5OworY2xhc3MgRmxvYXRQb2ludDsKK2NsYXNzIEZyYW1lTG9hZGVyQ2xpZW50
QmxhY2tCZXJyeTsKK2NsYXNzIEdMRVMyQ29udGV4dDsKK2NsYXNzIEludFJlY3Q7Cit9CisKK25h
bWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQYWdl
OworY2xhc3MgV2ViUGFnZVByaXZhdGU7CitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlOworY2xh
c3MgQmFja2luZ1N0b3JlQ2xpZW50OworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBCYWNraW5n
U3RvcmUgeworcHVibGljOgorICAgIGVudW0gUmVzdW1lVXBkYXRlT3BlcmF0aW9uIHsgTm9uZSwg
QmxpdCwgUmVuZGVyQW5kQmxpdCB9OworICAgIEJhY2tpbmdTdG9yZShXZWJQYWdlKiwgQmFja2lu
Z1N0b3JlQ2xpZW50Kik7CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlKCk7CisKKyAgICB2b2lk
IGNyZWF0ZVN1cmZhY2UoKTsKKworICAgIHZvaWQgc3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9y
ZVVwZGF0ZXMoKTsKKyAgICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMo
UmVzdW1lVXBkYXRlT3BlcmF0aW9uKTsKKworICAgIGJvb2wgaXNTY3JvbGxpbmdPclpvb21pbmco
KSBjb25zdDsKKyAgICB2b2lkIHNldFNjcm9sbGluZ09yWm9vbWluZyhib29sKTsKKworICAgIHZv
aWQgYmxpdENvbnRlbnRzKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0JiBkc3RS
ZWN0LCBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMpOworICAg
IHZvaWQgcmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9vbCBj
b250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgYm9vbCBoYXNSZW5kZXJKb2Jz
KCkgY29uc3Q7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKworICAgIC8vIEluIHRoZSBkZWZl
cnMgYmxpdCBtb2RlLCBhbnkgYmxpdCByZXF1ZXN0cyB3aWxsIGp1c3QgcmV0dXJuIGVhcmx5LCBh
bmQKKyAgICAvLyBhIGJsaXQgam9iIHdpbGwgYmUgcXVldWVkIHRoYXQgaXMgZXhlY3V0ZWQgYnkg
Y2FsbGluZyBibGl0T25JZGxlKCkuCisgICAgYm9vbCBkZWZlcnNCbGl0KCkgY29uc3Q7CisgICAg
dm9pZCBzZXREZWZlcnNCbGl0KGJvb2wpOworCisgICAgYm9vbCBoYXNCbGl0Sm9icygpIGNvbnN0
OworICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgYm9vbCBpc0RpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6
OldlYktpdDo6QmFja2luZ1N0b3JlQ2xpZW50OworICAgIGZyaWVuZCBjbGFzcyBCbGFja0JlcnJ5
OjpXZWJLaXQ6OldlYlBhZ2U7CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6OldlYktpdDo6
V2ViUGFnZVByaXZhdGU7IC8vIEZJWE1FOiBGb3Igbm93LCB3ZSBleHBvc2Ugb3VyIGludGVybmFs
cyB0byBXZWJQYWdlUHJpdmF0ZS4gU2VlIFBSICMxMjAzMDEuCisgICAgZnJpZW5kIGNsYXNzIFdl
YkNvcmU6OkNocm9tZUNsaWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNvcmU6
OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6
R0xFUzJDb250ZXh0OworICAgIEJhY2tpbmdTdG9yZVByaXZhdGUgKmQ7Cit9OworfQorfQorCisj
ZW5kaWYgLy8gQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2ti
ZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzYx
NzI5Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNr
aW5nU3RvcmVfcC5oCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5
LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZv
dW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rvbiwg
TUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX3BfaAorI2Rl
ZmluZSBCYWNraW5nU3RvcmVfcF9oCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmUuaCIKKyNpbmNs
dWRlICJSZW5kZXJRdWV1ZS5oIgorI2luY2x1ZGUgIlRpbGVJbmRleC5oIgorI2luY2x1ZGUgIlRp
bGVJbmRleEhhc2guaCIKKyNpbmNsdWRlICJUaW1lci5oIgorCisjaW5jbHVkZSA8QmxhY2tCZXJy
eVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HdWFyZGVk
UG9pbnRlci5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorCisjaWYgVVNFKE9QRU5WRykKKyNpbmNsdWRlIDxlZ2wuaD4KKyNlbmRpZgorCisjaW5j
bHVkZSA8cHRocmVhZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBJbnRSZWN0Owor
Y2xhc3MgVHJhbnNmb3JtYXRpb25NYXRyaXg7Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsK
K25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBCYWNraW5nU3RvcmVUaWxlOworY2xhc3MgVGls
ZUJ1ZmZlcjsKK2NsYXNzIFdlYlBhZ2U7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CisKK3R5
cGVkZWYgV1RGOjpIYXNoTWFwPFRpbGVJbmRleCwgQmFja2luZ1N0b3JlVGlsZSo+IFRpbGVNYXA7
CitjbGFzcyBCYWNraW5nU3RvcmVHZW9tZXRyeSB7CitwdWJsaWM6CisgICAgQmFja2luZ1N0b3Jl
R2VvbWV0cnkoKQorICAgICAgICA6IG1fbnVtYmVyT2ZUaWxlc1dpZGUoMCkKKyAgICAgICAgLCBt
X251bWJlck9mVGlsZXNIaWdoKDApCisgICAgeworICAgIH0KKworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGJhY2tpbmdTdG9yZVJlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50U2l6ZSBiYWNr
aW5nU3RvcmVTaXplKCkgY29uc3Q7CisKKyAgICBpbnQgbnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25z
dCB7IHJldHVybiBtX251bWJlck9mVGlsZXNXaWRlOyB9CisgICAgdm9pZCBzZXROdW1iZXJPZlRp
bGVzV2lkZShpbnQgbnVtYmVyT2ZUaWxlc1dpZGUpIHsgbV9udW1iZXJPZlRpbGVzV2lkZSA9IG51
bWJlck9mVGlsZXNXaWRlOyB9CisgICAgaW50IG51bWJlck9mVGlsZXNIaWdoKCkgY29uc3QgeyBy
ZXR1cm4gbV9udW1iZXJPZlRpbGVzSGlnaDsgfQorICAgIHZvaWQgc2V0TnVtYmVyT2ZUaWxlc0hp
Z2goaW50IG51bWJlck9mVGlsZXNIaWdoKSB7IG1fbnVtYmVyT2ZUaWxlc0hpZ2ggPSBudW1iZXJP
ZlRpbGVzSGlnaDsgfQorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBiYWNraW5nU3RvcmVPZmZzZXQo
KSBjb25zdCB7IHJldHVybiBtX2JhY2tpbmdTdG9yZU9mZnNldDsgfQorICAgIHZvaWQgc2V0QmFj
a2luZ1N0b3JlT2Zmc2V0KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb2Zmc2V0KSB7IG1fYmFj
a2luZ1N0b3JlT2Zmc2V0ID0gb2Zmc2V0OyB9CisgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZUF0
KFRpbGVJbmRleCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwLmdldChpbmRleCk7IH0K
KyAgICBjb25zdCBUaWxlTWFwJiB0aWxlTWFwKCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwOyB9
CisgICAgdm9pZCBzZXRUaWxlTWFwKGNvbnN0IFRpbGVNYXAmIHRpbGVNYXApIHsgbV90aWxlTWFw
ID0gdGlsZU1hcDsgfQorCisgIHByaXZhdGU6CisgICAgaW50IG1fbnVtYmVyT2ZUaWxlc1dpZGU7
CisgICAgaW50IG1fbnVtYmVyT2ZUaWxlc0hpZ2g7CisgICAgUGxhdGZvcm06OkludFBvaW50IG1f
YmFja2luZ1N0b3JlT2Zmc2V0OworICAgIFRpbGVNYXAgbV90aWxlTWFwOworfTsKKworY2xhc3Mg
QmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUgeworcHVibGljOgorICAgIFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uIGJsaXR0ZWRSZWdpb24oKSBjb25zdCB7IHJldHVybiBtX2JsaXR0ZWRSZWdp
b247IH0KKyAgICB2b2lkIGFkZEJsaXR0ZWRSZWdpb24oY29uc3QgUGxhdGZvcm06OkludFJlY3RS
ZWdpb24mIHJlZ2lvbikKKyAgICB7CisgICAgICAgIG1fYmxpdHRlZFJlZ2lvbiA9IFBsYXRmb3Jt
OjpJbnRSZWN0UmVnaW9uOjp1bmlvblJlZ2lvbnMobV9ibGl0dGVkUmVnaW9uLCByZWdpb24pOwor
ICAgIH0KKyAgICB2b2lkIGNsZWFyQmxpdHRlZFJlZ2lvbihjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dFJlZ2lvbiYgcmVnaW9uKQorICAgIHsKKyAgICAgICAgbV9ibGl0dGVkUmVnaW9uID0gUGxhdGZv
cm06OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyhtX2JsaXR0ZWRSZWdpb24sIHJlZ2lv
bik7CisgICAgfQorICAgIHZvaWQgY2xlYXJCbGl0dGVkUmVnaW9uKCkgeyBtX2JsaXR0ZWRSZWdp
b24gPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbigpOyB9CisKKyAgICBib29sIGlzUmVuZGVyZWQo
Y29uc3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbiwgY29uc3QgUGxhdGZvcm06
OkludFJlY3RSZWdpb24mIGNvbnRlbnRzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFBs
YXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMoY29udGVudHMsIG1fYmxpdHRl
ZFJlZ2lvbikuaXNFbXB0eSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFBsYXRmb3JtOjpJ
bnRSZWN0UmVnaW9uIG1fYmxpdHRlZFJlZ2lvbjsKK307CisKK2NsYXNzIEJhY2tpbmdTdG9yZVBy
aXZhdGUgOiBwdWJsaWMgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okd1YXJkZWRQb2ludGVyQmFzZSB7
CitwdWJsaWM6CisgICAgZW51bSBUaWxlTWF0cml4RGlyZWN0aW9uIHsgSG9yaXpvbnRhbCwgVmVy
dGljYWwgfTsKKyAgICBCYWNraW5nU3RvcmVQcml2YXRlKCk7CisgICAgfkJhY2tpbmdTdG9yZVBy
aXZhdGUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkaXJlY3QgcmVuZGVyaW5nIGlzIGV4
cGxpY2l0bHkgdHVybmVkIG9uIG9yIGlzCisgICAgLy8gcmVxdWlyZWQgYmVjYXVzZSB0aGUgc3Vy
ZmFjZSBwb29sIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gbWVldAorICAgIC8vIHRoZSBtaW5pbXVt
IG51bWJlciBvZiB0aWxlcyByZXF1aXJlZCB0byBzY3JvbGwuCisgICAgYm9vbCBzaG91bGREaXJl
Y3RSZW5kZXJpbmdUb1dpbmRvdygpIGNvbnN0OworCisgICAgLy8gU3VzcGVuZHMgYWxsIHNjcmVl
biB1cGRhdGVzIHNvIHRoYXQgJ2JsaXRDb250ZW50cycgaXMgZGlzYWJsZWQuCisgICAgdm9pZCBz
dXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworCisgICAgLy8gUmVzdW1lcyBh
bGwgc2NyZWVuIHVwZGF0ZXMgc28gdGhhdCAnYmxpdENvbnRlbnRzJyBpcyBlbmFibGVkLgorICAg
IHZvaWQgcmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJl
c3VtZVVwZGF0ZU9wZXJhdGlvbik7CisKKyAgICAvLyBUaGUgZnVuY3Rpb25zIHJlcGFpbnQoKSwg
c2xvd1Njcm9sbCgpLCBzY3JvbGwoKSwgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcigpIGFyZQorICAg
IC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgV2ViS2l0IGFuZCB3aXRoaW4gV2ViS2l0IHZpYSBDaHJv
bWVDbGllbnRCbGFja0JlcnJ5LgorICAgIHZvaWQgcmVwYWludChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgd2luZG93UmVjdCwgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOwor
CisgICAgdm9pZCBzbG93U2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKTsKKworICAg
IHZvaWQgc2Nyb2xsKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZv
cm06OkludFJlY3QmIHNjcm9sbFZpZXdSZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY2xp
cFJlY3QpOworICAgIHZvaWQgc2Nyb2xsaW5nU3RhcnRlZEhlbHBlcihjb25zdCBQbGF0Zm9ybTo6
SW50U2l6ZSYgZGVsdGEpOworCisgICAgYm9vbCBzaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1
bGFyUmVuZGVySm9icygpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMo
KSBjb25zdDsKKyAgICBib29sIHNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0
OworICAgIHZvaWQgc3RhcnRSZW5kZXJUaW1lcigpOworICAgIHZvaWQgc3RvcFJlbmRlclRpbWVy
KCk7CisgICAgdm9pZCByZW5kZXJPblRpbWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdTdG9yZVBy
aXZhdGU+Kik7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKyAgICBib29sIHdpbGxGaXJlVGlt
ZXIoKTsKKworICAgIC8vIFNldCBvZiBoZWxwZXIgbWV0aG9kcyBmb3IgdGhlIHNjcm9sbEJhY2tp
bmdTdG9yZSgpIG1ldGhvZC4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QoKSBj
b25zdDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBleHBhbmRlZENvbnRlbnRzUmVjdCgpIGNvbnN0
OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAg
ICBQbGF0Zm9ybTo6SW50UmVjdCB1bmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7
CisgICAgYm9vbCBzaG91bGRNb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0
OworICAgIGJvb2wgc2hvdWxkTW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25z
dDsKKyAgICBib29sIHNob3VsZE1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgYm9vbCBjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0Owor
ICAgIGJvb2wgY2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBi
b29sIGNhbk1vdmVMZWZ0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9v
bCBjYW5Nb3ZlUmlnaHQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29s
IGNhbk1vdmVVcChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2Fu
TW92ZURvd24oY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRh
WSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICB2b2lkIHNldEJhY2tpbmdT
dG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKTsKKworICAgIHR5cGVkZWYgV1RGOjpW
ZWN0b3I8VGlsZUluZGV4PiBUaWxlSW5kZXhMaXN0OworICAgIFRpbGVJbmRleExpc3QgaW5kZXhl
c0ZvckJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKwor
ICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRp
bGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFj
a2luZ1N0b3JlUmVjdCkgY29uc3Q7CisKKyAgICBUaWxlSW5kZXggaW5kZXhPZkxhc3RSZW5kZXJG
b3JUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqKSBjb25zdDsKKyAgICBU
aWxlSW5kZXggaW5kZXhPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdDsKKyAgICB2b2lk
IGNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3QgVGlsZUluZGV4Jiwg
QmFja2luZ1N0b3JlVGlsZSosIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiwgY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QsIGJvb2wgdXBkYXRlID0gdHJ1ZSk7
CisgICAgYm9vbCBpc0N1cnJlbnRWaXNpYmxlSm9iKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdT
dG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29u
c3Q7CisKKyAgICAvLyBSZXNwb25zaWJsZSBmb3Igc2Nyb2xsaW5nIHRoZSBiYWNraW5nIHN0b3Jl
IGFuZCB1cGRhdGluZyB0aGUKKyAgICAvLyB0aWxlIG1hdHJpeCBnZW9tZXRyeS4KKyAgICB2b2lk
IHNjcm9sbEJhY2tpbmdTdG9yZShpbnQgZGVsdGFYLCBpbnQgZGVsdGFZKTsKKworICAgIC8vIFJl
bmRlciB0aGUgdGlsZXMgZGlydHkgcmVjdHMgYW5kIGJsaXQgdG8gdGhlIHNjcmVlbi4KKyAgICBi
b29sIHJlbmRlckRpcmVjdFRvV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCBy
ZW5kZXJDb250ZW50T25seSk7CisgICAgYm9vbCByZW5kZXIoY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmLCBib29sIHJlbmRlckNvbnRlbnRPbmx5KTsKKyAgICBib29sIHJlbmRlcihjb25zdCBJbnRS
ZWN0TGlzdCYsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpOworCisgICAgLy8gQ2FsbGVkIGJ5IHRo
ZSByZW5kZXIgcXVldWUgdG8gZW5zdXJlIHRoYXQgdGhlIHF1ZXVlIGlzIGluIGEKKyAgICAvLyBj
b25zdGFudCBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHJlbmRlciBqb2IuCisgICAgdm9pZCBy
ZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBjb25zdDsKKworICAgIC8vIEhlbHBlciByZW5kZXIgbWV0
aG9kcy4KKyAgICB2b2lkIHJlbmRlclZpc2libGVDb250ZW50cyhib29sIHJlbmRlckNvbnRlbnRP
bmx5ID0gZmFsc2UpOworICAgIHZvaWQgcmVuZGVyQmFja2luZ1N0b3JlKGJvb2wgcmVuZGVyQ29u
dGVudE9ubHkgPSBmYWxzZSk7CisgICAgdm9pZCBibGl0VmlzaWJsZUNvbnRlbnRzKGJvb2wgZm9y
Y2UgPSBmYWxzZSk7CisKKyAgICAvLyBBc3N1bWVzIHRoZSByZWN0IHRvIGJlIGluIHdpbmRvdy92
aWV3cG9ydCBjb29yZGluYXRlcy4KKyAgICB2b2lkIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNr
U3VyZmFjZU9mV2luZG93KCk7CisgICAgdm9pZCBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1
cmZhY2VPZlRpbGUoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVUaWxlKik7
CisgICAgdm9pZCBwYWludERlZmF1bHRCYWNrZ3JvdW5kKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiBjb250ZW50cywgY29uc3QgV2ViQ29yZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBib29sIGZs
dXNoKTsKKyAgICB2b2lkIGJsaXRDb250ZW50cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0
UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLCBib29sIGZvcmNlID0gZmFs
c2UpOworICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8VGls
ZUluZGV4LCBQbGF0Zm9ybTo6SW50UmVjdD4gVGlsZVJlY3Q7CisgICAgUGxhdGZvcm06OkludFJl
Y3QgYmxpdFRpbGVSZWN0KFRpbGVCdWZmZXIqLCBjb25zdCBUaWxlUmVjdCYsIGNvbnN0IFBsYXRm
b3JtOjpJbnRQb2ludCYsIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiwgQmFj
a2luZ1N0b3JlR2VvbWV0cnkqKTsKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
KyAgICB2b2lkIGJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiBkc3RSZWN0KTsKKyAgICB2b2lkIGNsZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCk7CisgICAgYm9v
bCBkcmF3U3ViTGF5ZXJzKCk7CisjZW5kaWYKKworICAgIHZvaWQgYmxpdEhvcml6b250YWxTY3Jv
bGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisgICAgdm9pZCBibGl0VmVydGljYWxT
Y3JvbGxiYXIoY29uc3QgUGxhdGZvcm06OkludFBvaW50Jik7CisKKyAgICAvLyBSZXR1cm5zIHdo
ZXRoZXIgdGhlIHRpbGUgaW5kZXggaXMgY3VycmVudGx5IHZpc2libGUgb3Igbm90LgorICAgIGJv
b2wgaXNUaWxlVmlzaWJsZShjb25zdCBUaWxlSW5kZXgmKSBjb25zdDsKKyAgICBib29sIGlzVGls
ZVZpc2libGUoY29uc3QgUGxhdGZvcm06OkludFBvaW50JikgY29uc3Q7CisKKyAgICAvLyBSZXR1
cm5zIGEgcmVjdCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBhbGwgdGlsZXMgdGhhdCBhcmUgdmlzaWJs
ZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlVGlsZXNSZWN0KCkgY29uc3Q7CisKKyAg
ICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIHZpc2libGUgY29udGVudCBmb3IgaW5zdGFuY2UuCisg
ICAgUGxhdGZvcm06OkludFJlY3QgdGlsZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUlu
ZGV4JikgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIHVuY2xpcHBlZCB2aXNp
YmxlIGNvbnRlbnQgZm9yIGluc3RhbmNlIHdoaWNoIGluY2x1ZGVzIG92ZXJzY3JvbGwuCisgICAg
UGxhdGZvcm06OkludFJlY3QgdGlsZVVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoY29uc3Qg
VGlsZUluZGV4JikgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIGNvbnRlbnRz
IGZvciBpbnN0YW5jZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB0aWxlQ29udGVudHNSZWN0KGNv
bnN0IFRpbGVJbmRleCYsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgUGxh
dGZvcm06OkludFJlY3QgdGlsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdCYsIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3Q7CisK
KyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSBXZWJQYWdlIG9uY2UgbG9hZCBpcyBjb21taXR0ZWQg
dG8gcmVzZXQgdGhlIHJlbmRlciBxdWV1ZS4KKyAgICB2b2lkIHJlc2V0UmVuZGVyUXVldWUoKTsK
KyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSBGcmFtZUxvYWRlckNsaWVudCB0aGF0IGV4cGxpY2l0
bHkgcGFpbnRzIG9uIGZpcnN0IHZpc2libGUgbGF5b3V0LgorICAgIHZvaWQgY2xlYXJWaXNpYmxl
Wm9vbSgpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgV2ViUGFnZSBvbmNlIGxvYWQgaXMg
Y29tbWl0dGVkIHRvIHJlc2V0IGFsbCB0aGUgdGlsZXMuCisgICAgdm9pZCByZXNldFRpbGVzKGJv
b2wgcmVzZXRCYWNrZ3JvdW5kKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFdlYlBhZ2Ug
YWZ0ZXIgbG9hZCBpcyBjb21wbGV0ZSB0byB1cGRhdGUgYWxsIHRoZSB0aWxlcy4KKyAgICB2b2lk
IHVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpOworCisgICAg
Ly8gVGhpcyBpcyBjYWxsZWQgZHVyaW5nIHNjcm9sbCBhbmQgYnkgdGhlIHJlbmRlciBxdWV1ZS4K
KyAgICB2b2lkIHVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbihib29sIGNo
ZWNrTG9hZGluZyA9IHRydWUpOworCisgICAgLy8gUmVzZXQgYW4gaW5kaXZpZHVhbCB0aWxlLgor
ICAgIHZvaWQgcmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBi
b29sIHJlc2V0QmFja2dyb3VuZCk7CisKKyAgICAvLyBVcGRhdGUgYW4gaW5kaXZpZHVhbCB0aWxl
LgorICAgIHZvaWQgdXBkYXRlVGlsZShjb25zdCBUaWxlSW5kZXgmLCBib29sIGltbWVkaWF0ZSk7
CisgICAgdm9pZCB1cGRhdGVUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYsIGJvb2wgaW1t
ZWRpYXRlKTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IG1hcEZyb21UaWxlc1RvVHJhbnNmb3Jt
ZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYsIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPFRp
bGVSZWN0PiBUaWxlUmVjdExpc3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1l
ZENvbnRlbnRzVG9BYnNvbHV0ZVRpbGVCb3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JikgY29uc3Q7CisgICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9U
aWxlcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIFRpbGVSZWN0TGlzdCBt
YXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
LCBCYWNraW5nU3RvcmVHZW9tZXRyeSopIGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVUaWxlTWF0
cml4SWZOZWVkZWQoKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5
VHJhbnNmb3JtZWRDb250ZW50c1NpemVDaGFuZ2VkLgorICAgIHZvaWQgY29udGVudHNTaXplQ2hh
bmdlZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYlBh
Z2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1lZFNjcm9sbENoYW5nZWQuCisgICAgdm9pZCBzY3Jv
bGxDaGFuZ2VkKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgLy8gQ2FsbGVkIGJ5
IFdlYnBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zvcm1DaGFuZ2VkLgorICAgIHZvaWQgdHJhbnNm
b3JtQ2hhbmdlZCgpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjphY3R1YWxW
aXNpYmxlU2l6ZUNoYW5nZWQuCisgICAgdm9pZCBhY3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQoY29u
c3QgUGxhdGZvcm06OkludFNpemUmKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0
ZTo6c2V0U2NyZWVuUm90YXRlZC4KKyAgICB2b2lkIG9yaWVudGF0aW9uQ2hhbmdlZCgpOworCisg
ICAgLy8gU2V0cyB0aGUgZ2VvbWV0cnkgb2YgdGhlIHRpbGUgbWF0cml4LgorICAgIHZvaWQgc2V0
R2VvbWV0cnlPZlRpbGVNYXRyaXgoaW50IG51bWJlck9mVGlsZXNXaWRlLCBpbnQgbnVtYmVyT2ZU
aWxlc0hpZ2gpOworCisgICAgLy8gQ3JlYXRlIHRoZSBzdXJmYWNlcyBvZiB0aGUgYmFja2luZyBz
dG9yZS4KKyAgICB2b2lkIGNyZWF0ZVN1cmZhY2VzKCk7CisgICAgdm9pZCBjcmVhdGVWaXNpYmxl
VGlsZUJ1ZmZlcigpOworCisgICAgLy8gVmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgcXVhbnRpdGll
cyByZWxldmFudCB0byBiYWNraW5nIHN0b3JlLgorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmln
aW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFBvaW50
IG9yaWdpbk9mVGlsZShjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYp
IGNvbnN0OworICAgIGludCBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdDsKKyAgICBp
bnQgbWluaW11bU51bWJlck9mVGlsZXNIaWdoKCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFNp
emUgZXhwYW5kZWRDb250ZW50c1NpemUoKSBjb25zdDsKKworICAgIC8vIFRoZSB0aWxlIGdlb21l
dHJ5IG1ldGhvZHMgYXJlIGFsbCBzdGF0aWMgZnVuY3Rpb24uCisgICAgc3RhdGljIGludCB0aWxl
V2lkdGgoKTsKKyAgICBzdGF0aWMgaW50IHRpbGVIZWlnaHQoKTsKKyAgICBzdGF0aWMgUGxhdGZv
cm06OkludFNpemUgdGlsZVNpemUoKTsKKyAgICBzdGF0aWMgUGxhdGZvcm06OkludFJlY3QgdGls
ZVJlY3QoKTsKKworICAgIC8vIFRoaXMgdGFrZXMgdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRp
bmF0ZXMuCisgICAgdm9pZCByZW5kZXJDb250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OkJ1ZmZlciosIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3VyZmFjZU9mZnNldCwg
Y29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzUmVjdCkgY29uc3Q7CisKKyAgICB2b2lk
IGJsaXRUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHNyY0J1ZmZlciwgY29uc3QgUGxh
dGZvcm06OkludFJlY3QmIHNyY1JlY3QsIGJvb2wgYmxlbmQsIHVuc2lnbmVkIGNoYXIgZ2xvYmFs
QWxwaGEpOworICAgIHZvaWQgY2hlY2tlcldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
ZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBjb250ZW50c09yaWdpbiwgZG91Ymxl
IGNvbnRlbnRzU2NhbGUpOworCisgICAgdm9pZCBpbnZhbGlkYXRlV2luZG93KCk7CisgICAgdm9p
ZCBpbnZhbGlkYXRlV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpOworICAgIHZv
aWQgY2xlYXJXaW5kb3coKTsKKyAgICB2b2lkIGNsZWFyV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0JiwgdW5zaWduZWQgY2hhciByZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVuc2lnbmVk
IGNoYXIgYmx1ZSwgdW5zaWduZWQgY2hhciBhbHBoYSA9IDI1NSk7CisKKyAgICBib29sIGlzU2Ny
b2xsaW5nT3Jab29taW5nKCkgY29uc3Q7CisgICAgdm9pZCBzZXRTY3JvbGxpbmdPclpvb21pbmco
Ym9vbCBzY3JvbGxpbmdPclpvb21pbmcsIGJvb2wgc2hvdWxkQmxpdCA9IHRydWUpOworCisgICAg
dm9pZCBsb2NrQmFja2luZ1N0b3JlKCk7CisgICAgdm9pZCB1bmxvY2tCYWNraW5nU3RvcmUoKTsK
KworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBmcm9udFN0YXRlKCkgY29uc3Q7CisgICAgQmFj
a2luZ1N0b3JlR2VvbWV0cnkqIGJhY2tTdGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3dhcFN0YXRl
KCk7CisKKyAgICBCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSogd2luZG93RnJvbnRCdWZm
ZXJTdGF0ZSgpIGNvbnN0OworICAgIEJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlKiB3aW5k
b3dCYWNrQnVmZmVyU3RhdGUoKSBjb25zdDsKKworICAgIHN0YXRpYyB2b2lkIHNldEN1cnJlbnRC
YWNraW5nU3RvcmVPd25lcihXZWJQYWdlKiB3ZWJQYWdlKSB7IEJhY2tpbmdTdG9yZVByaXZhdGU6
OnNfY3VycmVudEJhY2tpbmdTdG9yZU93bmVyID0gd2ViUGFnZTsgfQorICAgIHN0YXRpYyBXZWJQ
YWdlKiBjdXJyZW50QmFja2luZ1N0b3JlT3duZXIoKSB7IHJldHVybiBCYWNraW5nU3RvcmVQcml2
YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsgfQorICAgIGJvb2wgaXNBY3RpdmUoKSBj
b25zdDsKKworICAgIHN0YXRpYyBXZWJQYWdlKiBzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsK
KworICAgIGJvb2wgbV9zdXNwZW5kU2NyZWVuVXBkYXRlczsKKyAgICBib29sIG1fc3VzcGVuZEJh
Y2tpbmdTdG9yZVVwZGF0ZXM7CisKKyAgICBib29sIG1fc3VzcGVuZFJlbmRlckpvYnM7CisgICAg
Ym9vbCBtX3N1c3BlbmRSZWd1bGFyUmVuZGVySm9iczsKKyAgICBib29sIG1faXNTY3JvbGxpbmdP
clpvb21pbmc7CisgICAgV2ViUGFnZSogbV93ZWJQYWdlOworICAgIEJhY2tpbmdTdG9yZUNsaWVu
dCogbV9jbGllbnQ7CisgICAgT3duUHRyPFJlbmRlclF1ZXVlPiBtX3JlbmRlclF1ZXVlOworICAg
IG11dGFibGUgUGxhdGZvcm06OkludFNpemUgbV9wcmV2aW91c0RlbHRhOworCisgICAgYm9vbCBt
X2RlZmVyc0JsaXQ7CisgICAgYm9vbCBtX2hhc0JsaXRKb2JzOworCisjaWYgVVNFKE9QRU5WRykK
KyAgICBFR0xEaXNwbGF5IG1fZWdsRGlzcGxheTsKKyNlbmRpZgorICAgIG11dGFibGUgdW5zaWdu
ZWQgbV9mcm9udFN0YXRlOworICAgIG11dGFibGUgdW5zaWduZWQgbV9iYWNrU3RhdGU7CisKKyAg
ICB1bnNpZ25lZCBtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyOworICAgIG11dGFibGUgQmFja2lu
Z1N0b3JlV2luZG93QnVmZmVyU3RhdGUgbV93aW5kb3dCdWZmZXJTdGF0ZVsyXTsKKworICAgIFRp
bGVNYXRyaXhEaXJlY3Rpb24gbV9wcmVmZXJyZWRUaWxlTWF0cml4RGltZW5zaW9uOworCisgICAg
UGxhdGZvcm06OkludFJlY3QgbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisKKyAgICAvLyBMYXN0
IHJlc29ydCB0aW1lciBmb3IgcmVuZGVyaW5nLgorICAgIE93blB0cjxXZWJDb3JlOjpUaW1lcjxC
YWNraW5nU3RvcmVQcml2YXRlPiA+IG1fcmVuZGVyVGltZXI7CisKKyAgICBwdGhyZWFkX211dGV4
X3QgbV9tdXRleDsKKworICAgIGludCBtX2JsaXRHZW5lcmF0aW9uOworICAgIHB0aHJlYWRfbXV0
ZXhfdCBtX2JsaXRHZW5lcmF0aW9uTG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2JsaXRHZW5l
cmF0aW9uQ29uZDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgbV9jdXJyZW50QmxpdEVuZDsKK307Cit9
Cit9CisKKyNlbmRpZiAvLyBCYWNraW5nU3RvcmVfcF9oCi0tIAoxLjcuNwoK
</data>
<flag name="review"
          id="117694"
          type_id="1"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118601</attachid>
            <date>2011-12-09 11:47:49 -0800</date>
            <delta_ts>2011-12-09 17:08:22 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>73668.patch</filename>
            <type>text/plain</type>
            <size>127519</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSA2ZWQ2NTg0MDIwZDMxNzRiZDE3MWNmZjlkZmNlODlhYzQ1ZDBhNmY4IE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
VGh1LCA4IERlYyAyMDExIDEzOjQyOjEzIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCiogYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlLmg6IEFkZGVkLgoqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICB8ICAgMTYgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3Bw
IHwgMjYwMyArKysrKysrKysrKysrKysrKysrKysrKysrCiBTb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL0JhY2tpbmdTdG9yZS5oICAgfCAgIDg4ICsKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaCB8ICAzNTYgKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDYz
IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCiBjcmVhdGUgbW9kZSAxMDA2
NDQgU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaAoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggOTdiMzJhMS4uNTJjY2U2NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMS0xMi0wOCAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQVBJIGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVh
bSwgdGhlIG1haW4gY29udHJpYnV0b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJp
bS5jb20+LgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAg
ICAgICAqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oOiBBZGRlZC4KKwogMjAxMS0xMi0wNiAgTGVvIFlhbmcg
IDxsZW8ueWFuZ0B0b3JjaG1vYmlsZS5jb20uY24+CiAKICAgICAgICAgVXBzdHJlYW0gYWJvdXQ6
IGZlYXR1cmUgaW4gV2ViS2l0L2JsYWNrYmVycnkvV2ViQ29yZVN1cHBvcnQvCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uODE4MjZhMQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApAQCAtMCwwICsxLDI2MDMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZS5oIgorCisjaW5jbHVkZSAiQmFj
a2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJm
YWNlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlVGlsZS5oIgorI2luY2x1ZGUgIkJhY2tpbmdT
dG9yZV9wLmgiCisjaW5jbHVkZSAiRmF0RmluZ2Vycy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisj
aW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRl
ICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJQYWdl
Q2xpZW50LmgiCisjaW5jbHVkZSAiV2ViUGFnZV9wLmgiCisjaW5jbHVkZSAiV2ViU2V0dGluZ3Mu
aCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4ZWN1dGFibGVNZXNzYWdlLmg+Cisj
aW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1N
ZXNzYWdlQ2xpZW50Lmg+CisKKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Ob3RGb3VuZC5oPgorCisjZGVmaW5l
IFNVUFBSRVNTX05PTl9WSVNJQkxFX1JFR1VMQVJfUkVOREVSX0pPQlMgMAorI2RlZmluZSBFTkFC
TEVfU0NST0xMQkFSUyAxCisjZGVmaW5lIEVOQUJMRV9SRVBBSU5UT05TQ1JPTEwgMQorI2RlZmlu
ZSBERUJVR19CQUNLSU5HU1RPUkUgMAorI2RlZmluZSBERUJVR19WSVNVQUxJWkUgMAorI2RlZmlu
ZSBERUJVR19USUxFTUFUUklYIDAKKyNkZWZpbmUgREVCVUdfQ09NUE9TSVRJTkdfRElSVFlfUkVH
SU9OIDAKKworI2lmIFVTRShPUEVOVkcpCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5WRy5oIgor
I2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0
Zm9ybVNjcmVlbi5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFj
ZSBzdGQ7CisKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0OwordXNpbmcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFBvaW50OwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFNpemU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgewor
Citjb25zdCBpbnQgc19yZW5kZXJUaW1lclRpbWVvdXQgPSAxLjA7CitXZWJQYWdlKiBCYWNraW5n
U3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9IDA7CisKK3R5cGVkZWYg
c3RkOjpwYWlyPGludCwgaW50PiBEaXZpc29yOwordHlwZWRlZiBWZWN0b3I8RGl2aXNvcj4gRGl2
aXNvckxpc3Q7CisvLyBGSVhNRTogQ2FjaGUgdGhpcyBhbmQvb3IgdXNlIGEgc21hcnRlciBhbGdv
cml0aG0uCitzdGF0aWMgRGl2aXNvckxpc3QgZGl2aXNvcnModW5zaWduZWQgbikKK3sKKyAgICBE
aXZpc29yTGlzdCBkaXZpc29yczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IG47ICsr
aSkKKyAgICAgICAgaWYgKCEobiAlIGkpKQorICAgICAgICAgICAgZGl2aXNvcnMuYXBwZW5kKHN0
ZDo6bWFrZV9wYWlyKGksIG4gLyBpKSk7CisgICAgcmV0dXJuIGRpdmlzb3JzOworfQorCisvLyBD
b21wdXRlIGJlc3QgZGl2aXNvciBnaXZlbiB0aGUgcmF0aW8gZGV0ZXJtaW5lZCBieSBzaXplLgor
c3RhdGljIERpdmlzb3IgYmVzdERpdmlzb3IoUGxhdGZvcm06OkludFNpemUgc2l6ZSwgaW50IHRp
bGVXaWR0aCwgaW50IHRpbGVIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
bWluaW11bU51bWJlck9mVGlsZXNXaWRlLCBpbnQgbWluaW11bU51bWJlck9mVGlsZXNIaWdoLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZU1hdHJp
eERpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgLy8gVGhlIHBvaW50IG9mIHRoaXMgZnVuY3Rp
b24gaXMgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGlsZXMgaW4gZWFjaAorICAgIC8vIGRp
bWVuc2lvbi4gV2UgZG8gdGhpcyBieSBsb29raW5nIHRvIG1hdGNoIHRoZSB0aWxlIG1hdHJpeCB3
aWR0aC9oZWlnaHQKKyAgICAvLyByYXRpbyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHdpdGggdGhl
IHdpZHRoL2hlaWdodCByYXRpbyBvZiB0aGUgY29udGVudHMuCisgICAgLy8gV2UgYWxzbyBsb29r
IGF0IHRoZSBkaXJlY3Rpb24gcGFzc2VkIHRvIGdpdmUgcHJlZmVyZW5jZSB0byBvbmUgZGltZW5z
aW9uCisgICAgLy8gb3ZlciBhbm90aGVyLiBUaGlzIG1ldGhvZCBjb3VsZCBwcm9iYWJseSBiZSBt
YWRlIGZhc3RlciwgYnV0IGl0IGdldHMgdGhlCisgICAgLy8gam9iIGRvbmUuCisgICAgU3VyZmFj
ZVBvb2wqIHN1cmZhY2VQb29sID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCk7Cisg
ICAgQVNTRVJUKCFzdXJmYWNlUG9vbC0+aXNFbXB0eSgpKTsKKworICAgIC8vIFN0b3JlIGEgc3Rh
dGljIGxpc3Qgb2YgcG9zc2libGUgZGl2aXNvcnMuCisgICAgc3RhdGljIERpdmlzb3JMaXN0IGRp
dmlzb3JMaXN0ID0gZGl2aXNvcnMoc3VyZmFjZVBvb2wtPnNpemUoKSk7CisKKyAgICAvLyBUaGUg
cmF0aW8gd2UncmUgbG9va2luZyB0byBiZXN0IGltaXRhdGUuCisgICAgZmxvYXQgcmF0aW8gPSBz
dGF0aWNfY2FzdDxmbG9hdD4oc2l6ZS53aWR0aCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzaXpl
LmhlaWdodCgpKTsKKworICAgIERpdmlzb3IgYmVzdERpdmlzb3I7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBkaXZpc29yTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBEaXZpc29yIGRp
dmlzb3IgPSBkaXZpc29yTGlzdFtpXTsKKworICAgICAgICBib29sIGRpdmlzb3JXaWR0aElzUGVy
ZmVjdCA9IHNpemUud2lkdGgoKSA8PSBkaXZpc29yLmZpcnN0ICogdGlsZVdpZHRoICYmIGFicyhz
aXplLndpZHRoKCkgLSBkaXZpc29yLmZpcnN0ICogdGlsZVdpZHRoKSA8IHRpbGVXaWR0aDsKKyAg
ICAgICAgYm9vbCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0ID0gc2l6ZS5oZWlnaHQoKSA8PSBkaXZp
c29yLnNlY29uZCAqIHRpbGVIZWlnaHQgJiYgYWJzKHNpemUuaGVpZ2h0KCkgLSBkaXZpc29yLnNl
Y29uZCAqIHRpbGVIZWlnaHQpIDwgdGlsZUhlaWdodDsKKyAgICAgICAgYm9vbCBkaXZpc29yV2lk
dGhJc1ZhbGlkID0gZGl2aXNvci5maXJzdCA+PSBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUgfHwg
ZGl2aXNvcldpZHRoSXNQZXJmZWN0OworICAgICAgICBib29sIGRpdmlzb3JIZWlnaHRJc1ZhbGlk
ID0gZGl2aXNvci5zZWNvbmQgPj0gbWluaW11bU51bWJlck9mVGlsZXNIaWdoIHx8IGRpdmlzb3JI
ZWlnaHRJc1BlcmZlY3Q7CisgICAgICAgIGlmICghZGl2aXNvcldpZHRoSXNWYWxpZCB8fCAhZGl2
aXNvckhlaWdodElzVmFsaWQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAo
ZGl2aXNvci5maXJzdCA+IGRpdmlzb3Iuc2Vjb25kICYmIGRpcmVjdGlvbiA9PSBCYWNraW5nU3Rv
cmVQcml2YXRlOjpWZXJ0aWNhbCAmJiAhZGl2aXNvckhlaWdodElzUGVyZmVjdCkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkaXZpc29yLnNlY29uZCA+IGRpdmlzb3IuZmly
c3QgJiYgZGlyZWN0aW9uID09IEJhY2tpbmdTdG9yZVByaXZhdGU6Okhvcml6b250YWwgJiYgIWRp
dmlzb3JXaWR0aElzUGVyZmVjdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlm
IChkaXZpc29yV2lkdGhJc1BlcmZlY3QgfHwgZGl2aXNvckhlaWdodElzUGVyZmVjdCkgeworICAg
ICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29yOyAvLyBGb3VuZCBhIHBlcmZlY3QgZml0IQor
I2lmIERFQlVHX1RJTEVNQVRSSVgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjps
b2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJiZXN0RGl2aXNvciBm
b3VuZCBwZXJmZWN0IHNpemUgd2lkdGhQZXJmZWN0PSVzIGhlaWdodFBlcmZlY3Q9JXMiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yV2lkdGhJc1BlcmZlY3QgPyAi
dHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZp
c29ySGVpZ2h0SXNQZXJmZWN0ID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgYmFzaXMgb2YgY29tcGFy
aXNvbi4KKyAgICAgICAgaWYgKCFiZXN0RGl2aXNvci5maXJzdCAmJiAhYmVzdERpdmlzb3Iuc2Vj
b25kKSB7CisgICAgICAgICAgICBiZXN0RGl2aXNvciA9IGRpdmlzb3I7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXBhcmUgcmF0aW9zLgorICAgICAg
ICBmbG9hdCBkaWZmMSA9IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihkaXZpc29yLmZpcnN0KSAv
IHN0YXRpY19jYXN0PGZsb2F0PihkaXZpc29yLnNlY29uZCkpIC0gcmF0aW8pOworICAgICAgICBm
bG9hdCBkaWZmMiA9IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihiZXN0RGl2aXNvci5maXJzdCkg
LyBzdGF0aWNfY2FzdDxmbG9hdD4oYmVzdERpdmlzb3Iuc2Vjb25kKSkgLSByYXRpbyk7CisgICAg
ICAgIGlmIChkaWZmMSA8IGRpZmYyKQorICAgICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29y
OworICAgIH0KKworICAgIHJldHVybiBiZXN0RGl2aXNvcjsKK30KKworc3RydWN0IEJhY2tpbmdT
dG9yZU11dGV4TG9ja2VyIHsKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlcihCYWNraW5nU3Rv
cmVQcml2YXRlKiBiYWNraW5nU3RvcmVQcml2YXRlKQorICAgICAgICA6IG1fYmFja2luZ1N0b3Jl
UHJpdmF0ZShiYWNraW5nU3RvcmVQcml2YXRlKQorICAgIHsKKyAgICAgICAgbV9iYWNraW5nU3Rv
cmVQcml2YXRlLT5sb2NrQmFja2luZ1N0b3JlKCk7CisgICAgfQorCisgICAgfkJhY2tpbmdTdG9y
ZU11dGV4TG9ja2VyKCkKKyAgICB7CisgICAgICAgIG1fYmFja2luZ1N0b3JlUHJpdmF0ZS0+dW5s
b2NrQmFja2luZ1N0b3JlKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhY2tpbmdTdG9yZVBy
aXZhdGUqIG1fYmFja2luZ1N0b3JlUHJpdmF0ZTsKK307CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJh
Y2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNraW5nU3RvcmVSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gUGxhdGZvcm06OkludFJlY3QoYmFja2luZ1N0b3JlT2Zmc2V0KCksIGJhY2tpbmdTdG9yZVNp
emUoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRTaXplIEJhY2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNr
aW5nU3RvcmVTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFNpemUobnVt
YmVyT2ZUaWxlc1dpZGUoKSAqIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVXaWR0aCgpLCBudW1i
ZXJPZlRpbGVzSGlnaCgpICogQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCgpKTsKK30K
KworQmFja2luZ1N0b3JlUHJpdmF0ZTo6QmFja2luZ1N0b3JlUHJpdmF0ZSgpCisgICAgOiBtX3N1
c3BlbmRTY3JlZW5VcGRhdGVzKGZhbHNlKQorICAgICwgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBk
YXRlcyhmYWxzZSkKKyAgICAsIG1fc3VzcGVuZFJlbmRlckpvYnMoZmFsc2UpCisgICAgLCBtX3N1
c3BlbmRSZWd1bGFyUmVuZGVySm9icyhmYWxzZSkKKyAgICAsIG1faXNTY3JvbGxpbmdPclpvb21p
bmcoZmFsc2UpCisgICAgLCBtX3dlYlBhZ2UoMCkKKyAgICAsIG1fY2xpZW50KDApCisgICAgLCBt
X3JlbmRlclF1ZXVlKGFkb3B0UHRyKG5ldyBSZW5kZXJRdWV1ZSh0aGlzKSkpCisgICAgLCBtX2Rl
ZmVyc0JsaXQodHJ1ZSkKKyAgICAsIG1faGFzQmxpdEpvYnMoZmFsc2UpCisjaWYgVVNFKE9QRU5W
RykKKyAgICAsIG1fZWdsRGlzcGxheShFR0xfTk9fRElTUExBWSkKKyNlbmRpZgorICAgICwgbV9j
dXJyZW50V2luZG93QmFja0J1ZmZlcigwKQorICAgICwgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGlt
ZW5zaW9uKFZlcnRpY2FsKQorICAgICwgbV9ibGl0R2VuZXJhdGlvbigtMSkKK3sKKyAgICBtX2Zy
b250U3RhdGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0b3JlR2Vv
bWV0cnkpOworICAgIG1fYmFja1N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4obmV3
IEJhY2tpbmdTdG9yZUdlb21ldHJ5KTsKKworICAgIG1fcmVuZGVyVGltZXIgPSBhZG9wdFB0cihu
ZXcgVGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4odGhpcywgJkJhY2tpbmdTdG9yZVByaXZhdGU6
OnJlbmRlck9uVGltZXIpKTsKKworICAgIC8vIE5lZWQgYSByZWN1cnNpdmUgbXV0ZXggdG8gYWNo
aWV2ZSBhIGdsb2JhbCBsb2NrLgorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKKyAgICBw
dGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9zZXR0
eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgcHRocmVhZF9tdXRleF9p
bml0KCZtX211dGV4LCAmYXR0cik7CisgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmYXR0
cik7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fYmxpdEdlbmVyYXRpb25Mb2NrLCAwKTsK
KyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9ibGl0R2VuZXJhdGlvbkNvbmQsIDApOworfQorCitC
YWNraW5nU3RvcmVQcml2YXRlOjp+QmFja2luZ1N0b3JlUHJpdmF0ZSgpCit7CisgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkqIGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3RvcmVHZW9t
ZXRyeSo+KG1fZnJvbnRTdGF0ZSk7CisgICAgZGVsZXRlIGZyb250OworICAgIG1fZnJvbnRTdGF0
ZSA9IDA7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogYmFjayA9IHJlaW50ZXJwcmV0X2Nh
c3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2JhY2tTdGF0ZSk7CisgICAgZGVsZXRlIGJhY2s7
CisgICAgbV9iYWNrU3RhdGUgPSAwOworCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX211
dGV4KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGREaXJlY3RSZW5kZXJp
bmdUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+aXNE
aXJlY3RSZW5kZXJpbmdUb1dpbmRvd0VuYWJsZWQoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0
YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IHVuc2lnbmVkIHRpbGVzTmVjZXNzYXJ5ID0g
bWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgKiBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKTsK
KyAgICBjb25zdCB1bnNpZ25lZCB0aWxlc0F2YWlsYWJsZSA9IGN1cnJlbnRTdGF0ZS0+bnVtYmVy
T2ZUaWxlc1dpZGUoKSAqIGN1cnJlbnRTdGF0ZS0+bnVtYmVyT2ZUaWxlc0hpZ2goKTsKKyAgICBy
ZXR1cm4gdGlsZXNBdmFpbGFibGUgPCB0aWxlc05lY2Vzc2FyeTsKK30KKwordm9pZCBCYWNraW5n
U3RvcmVQcml2YXRlOjpzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpCit7Cisg
ICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyA9IHRydWU7CisKKyAgICAvLyBNYWtlIHN1
cmUgdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCBnZXRzIHRoZSBtZXNzYWdlIGJlZm9yZSB3ZSBw
cm9jZWVkCisgICAgLy8gYmVjYXVzZSBibGl0Q29udGVudHMgY2FuIGJlIGNhbGxlZCBmcm9tIHRo
aXMgdGhyZWFkIGFuZCBpdCBtdXN0IGhvbm9yCisgICAgLy8gdGhpcyBmbGFnLgorICAgIG1fc3Vz
cGVuZFNjcmVlblVwZGF0ZXMgPSB0cnVlOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2Vy
SW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIG1fd2ViUGFnZS0+ZC0+cmVz
ZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsKKyNlbmRpZgorfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpS
ZXN1bWVVcGRhdGVPcGVyYXRpb24gb3ApCit7CisgICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBk
YXRlcyA9IGZhbHNlOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlm
IChvcCAhPSBCYWNraW5nU3RvcmU6Ok5vbmUpCisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0TmVl
ZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworI2VuZGlmCisKKyAgICAvLyBGb3Ig
dGhlIGRpcmVjdCByZW5kZXJpbmcgY2FzZSwgdGhlcmUgaXMgbm8gc3VjaCBvcGVyYXRpb24gYXMg
YmxpdCwKKyAgICAvLyB3ZSBoYXZlIHRvIHJlbmRlciB0byBnZXQgYW55dGhpbmcgdG8gdGhlIHNj
cmVlbi4KKyAgICBpZiAoc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSAmJiBvcCA9PSBC
YWNraW5nU3RvcmU6OkJsaXQpCisgICAgICAgIG9wID0gQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRC
bGl0OworCisgICAgLy8gRG8gc29tZSByZW5kZXJpbmcgaWYgbmVjZXNzYXJ5LgorICAgIGlmIChv
cCA9PSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQpCisgICAgICAgIHJlbmRlclZpc2libGVD
b250ZW50cyh0cnVlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisKKyAgICAvLyBNYWtlIHN1cmUg
dGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCBnZXRzIHRoZSBtZXNzYWdlIGJlZm9yZSB3ZSBwcm9j
ZWVkCisgICAgLy8gYmVjYXVzZSBibGl0Q29udGVudHMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSB1
c2VyIGludGVyZmFjZSB0aHJlYWQgYW5kCisgICAgLy8gaXQgbXVzdCBob25vciB0aGlzIGZsYWcu
CisgICAgbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyA9IGZhbHNlOworICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50
TWVzc2FnZSgpOworCisgICAgLy8gRG8gc29tZSBibGl0dGluZyBpZiBuZWNlc3NhcnkuCisgICAg
aWYgKChvcCA9PSBCYWNraW5nU3RvcmU6OkJsaXQgfHwgb3AgPT0gQmFja2luZ1N0b3JlOjpSZW5k
ZXJBbmRCbGl0KSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAg
YmxpdFZpc2libGVDb250ZW50cygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
cGFpbnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUp
Cit7CisjaWYgVVNFKE9QRU5WRykKKyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVHTF9OT19E
SVNQTEFZKTsKKyNlbmRpZgorCisgICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMp
CisgICAgICAgIHJldHVybjsKKworICAgICAvLyBJZiBpbW1lZGlhdGUgaXMgdHJ1ZSwgdGhlbiB3
ZSdyZSBiZWluZyBhc2tlZCB0byBwZXJmb3JtIHN5bmNocm9ub3VzbHkuCisgICAgIC8vIE5PVEU6
IFdlYkNvcmU6OlNjcm9sbFZpZXcgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggaW1tZWRpYXRl
OnRydWUgYW5kIGNvbnRlbnRDaGFuZ2VkOmZhbHNlLgorICAgICAvLyBUaGlzIGlzIGEgc3BlY2lh
bCBjYXNlIGludHJvZHVjZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgQXBwbGUncyB3aW5kb3dzIHBv
cnQgYW5kIGNhbiBiZSBzYWZlbHkgaWdub3JlZCBJIGJlbGlldmUuCisgICAgIC8vIE5vdyB0aGlz
IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmcm9tIFdlYlBhZ2VQcml2YXRlOjpyZXBhaW50KCkuCisK
KyAgICBpZiAoY29udGVudENoYW5nZWQgJiYgIXdpbmRvd1JlY3QuaXNFbXB0eSgpKSB7CisgICAg
ICAgIC8vIFRoaXMgd2luZG93UmVjdCBpcyBpbiB1bnRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJl
bGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgYnV0CisgICAgICAgIC8vIGl0IG5lZWRzIHRvIGJlIHRy
YW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb250ZW50
cy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwVG9U
cmFuc2Zvcm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3aW5kb3dSZWN0
KSk7CisgICAgICAgIHJlY3QuaW5mbGF0ZSgxIC8qZHgqLywgMSAvKmR5Ki8pOyAvLyBBY2NvdW50
IGZvciBhbnRpLWFsaWFzaW5nIG9mIHByZXZpb3VzIHJlbmRlcmluZyBydW5zLgorCisgICAgICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9uIFdlYkNvcmU6
Oi4KKyAgICAgICAgV2ViQ29yZTo6SW50UmVjdCB0bXBSZWN0ID0gcmVjdDsKKyAgICAgICAgbV9j
bGllbnQtPmNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KHRtcFJlY3QpOworCisgICAgICAg
IHJlY3QgPSB0bXBSZWN0OworICAgICAgICBpZiAocmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgICAgIHJlbmRlcihy
ZWN0LCBmYWxzZSAvKnJlbmRlckNvbnRlbnRPbmx5Ki8pOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBtX3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpSZWd1bGFyUmVuZGVy
LCByZWN0KTsKKyAgICB9Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2xvd1Njcm9s
bChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiB3aW5kb3dSZWN0LCBib29sIGltbWVkaWF0ZSkKK3sKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVudC4uLgorICAgIGRvdWJsZSB0aW1lID0g
V1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlmCisKKyAgICBzY3JvbGxpbmdTdGFydGVkSGVscGVy
KGRlbHRhKTsKKworICAgIC8vIFRoaXMgd2luZG93UmVjdCBpcyBpbiB1bnRyYW5zZm9ybWVkIGNv
b3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgYnV0CisgICAgLy8gaXQgbmVlZHMg
dG8gYmUgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybWVk
IGNvbnRlbnRzLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3QgPSBtX3dlYlBhZ2UtPmQtPm1h
cFRvVHJhbnNmb3JtZWQobV9jbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMod2luZG93
UmVjdCkpOworCisgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgcmVuZGVyKHJlY3QsIGZhbHNl
IC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgZWxzZSB7CisgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlZpc2libGVTY3JvbGwsIHJlY3QpOworICAgICAg
ICAvLyBXZSBvbmx5IGJsaXQgaGVyZSBpZiB0aGUgY2xpZW50IGRpZCBub3QgZ2VuZXJhdGUgdGhl
IHNjcm9sbCBhcyB0aGUgY2xpZW50CisgICAgICAgIC8vIG5vdyBzdXBwb3J0cyBibGl0dGluZyBh
c3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuCisgICAgICAgIGlmICghbV9j
bGllbnQtPmlzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKCkgJiYgIXNob3VsZERpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgfQor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgLy8gU3RvcCB0aGUgdGltZSBtZWFzdXJlbWVu
dC4KKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxD
cml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNsb3dTY3JvbGwgZWxhcHNlZD0lZiIsIGVs
YXBzZWQpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsKGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjbGlwUmVj
dCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgZGlyZWN0IHJlbmRlcmluZyB0aGVuIHdlIGFyZSBmb3Jj
ZWQgdG8gZ28gZG93biB0aGUgc2xvdyBwYXRoCisgICAgLy8gdG8gc2Nyb2xsaW5nLgorICAgIGlm
IChzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHZpZXdwb3J0UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+
ZC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7CisgICAgICAgIHNsb3dTY3JvbGwoZGVsdGEs
IG1fd2ViUGFnZS0+ZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHZpZXdwb3J0UmVjdCksIHRydWUgLypp
bW1lZGlhdGUqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBERUJVR19CQUNLSU5H
U1RPUkUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVudC4uLgorICAgIGRvdWJsZSB0
aW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlmCisKKyAgICBzY3JvbGxpbmdTdGFydGVk
SGVscGVyKGRlbHRhKTsKKworICAgIC8vIFdlIG9ubHkgYmxpdCBoZXJlIGlmIHRoZSBjbGllbnQg
ZGlkIG5vdCBnZW5lcmF0ZSB0aGUgc2Nyb2xsIGFzIHRoZSBjbGllbnQKKyAgICAvLyBub3cgc3Vw
cG9ydHMgYmxpdHRpbmcgYXN5bmNocm9ub3VzbHkgZHVyaW5nIHNjcm9sbCBvcGVyYXRpb25zLgor
ICAgIGlmICghbV9jbGllbnQtPmlzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKCkpCisgICAgICAgIGJs
aXRWaXNpYmxlQ29udGVudHMoKTsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0
b3AgdGhlIHRpbWUgbWVhc3VyZW1lbnQuCisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJl
bnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGwgZHg9JWQsIGR5PSVkIGVsYXBzZWQ9JWYiLCBkZWx0YS53aWR0aCgpLCBkZWx0YS5oZWlnaHQo
KSwgZWxhcHNlZCk7CisjZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGxpbmdTdGFydGVkSGVscGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSkKK3sKKyAg
ICAvLyBOb3RpZnkgdGhlIHJlbmRlciBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBzaHVmZmxlIGFjY29y
ZGluZ2x5LgorICAgIG1fcmVuZGVyUXVldWUtPnVwZGF0ZVNvcnREaXJlY3Rpb24oZGVsdGEud2lk
dGgoKSwgZGVsdGEuaGVpZ2h0KCkpOworICAgIG1fcmVuZGVyUXVldWUtPnZpc2libGVDb250ZW50
Q2hhbmdlZCh2aXNpYmxlQ29udGVudHNSZWN0KCkpOworCisgICAgLy8gU2Nyb2xsIHRoZSBhY3R1
YWwgYmFja2luZ3N0b3JlLgorICAgIHNjcm9sbEJhY2tpbmdTdG9yZShkZWx0YS53aWR0aCgpLCBk
ZWx0YS5oZWlnaHQoKSk7CisKKyAgICAvLyBBZGQgYW55IG5ld2x5IHZpc2libGUgdGlsZXMgdGhh
dCBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgcmVuZGVyZWQgdG8gdGhlIHF1ZXVlCisgICAgLy8g
YW5kIGNoZWNrIGlmIHRoZSB0aWxlIHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGJ5IHJlZ3VsYXIg
cmVuZGVyIGpvYi4KKyAgICB1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24o
KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRTdXBwcmVzc05vblZpc2li
bGVSZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7CisjaWYgU1VQUFJFU1NfTk9OX1ZJU0lCTEVf
UkVHVUxBUl9SRU5ERVJfSk9CUworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICAvLyBBbHdh
eXMgc3VwcHJlc3Mgd2hlbiBsb2FkaW5nIGFzIHRoaXMgZHJhc3RpY2FsbHkgZGVjcmVhc2VzIHBh
Z2UgbG9hZGluZworICAgIC8vIHRpbWUuLi4KKyAgICByZXR1cm4gbV9jbGllbnQtPmlzTG9hZGlu
ZygpOworI2VuZGlmCit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkUGVyZm9y
bVJlbmRlckpvYnMoKSBjb25zdAoreworICAgIHJldHVybiAobV93ZWJQYWdlLT5pc1Zpc2libGUo
KSB8fCBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSAmJiAhbV9zdXNwZW5kUmVuZGVy
Sm9icyAmJiAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhbV9yZW5kZXJRdWV1ZS0+
aXNFbXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdT
dG9yZVByaXZhdGU6OnNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkgJiYgIW1fc3VzcGVuZFJlZ3VsYXJS
ZW5kZXJKb2JzOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0YXJ0UmVuZGVyVGlt
ZXIoKQoreworICAgIC8vIENhbGxlZCB3aGVuIHJlbmRlciBxdWV1ZSBoYXMgYSBuZXcgam9iIGFk
ZGVkLgorICAgIGlmIChtX3JlbmRlclRpbWVyLT5pc0FjdGl2ZSgpIHx8IG1fcmVuZGVyUXVldWUt
PmlzRW1wdHkoIW1fc3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzKSkKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OnN0YXJ0UmVuZGVyVGltZXIgdGltZT0lZiIsIFdURjo6Y3VycmVudFRpbWUoKSk7CisjZW5k
aWYKKyAgICBtX3JlbmRlclRpbWVyLT5zdGFydE9uZVNob3Qoc19yZW5kZXJUaW1lclRpbWVvdXQp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0b3BSZW5kZXJUaW1lcigpCit7Cisg
ICAgaWYgKCFtX3JlbmRlclRpbWVyLT5pc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDYWxsZWQgd2hlbiB3ZSByZW5kZXIgc29tZXRoaW5nIHRvIHJlc3RhcnQuCisjaWYgREVC
VUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnN0b3BS
ZW5kZXJUaW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIG1f
cmVuZGVyVGltZXItPnN0b3AoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5k
ZXJPblRpbWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdTdG9yZVByaXZhdGU+KikKK3sKKyAgICAv
LyBUaGlzIHRpbWVyIGlzIGEgdGhpcmQgbWV0aG9kIG9mIHN0YXJ0aW5nIGEgcmVuZGVyIG9wZXJh
dGlvbiB0aGF0IGlzIGEgY2F0Y2gtYWxsLiBJZiBtb3JlCisgICAgLy8gdGhhbiBzX3JlbmRlclRp
bWVyVGltZW91dCBlbGFwc2VzIHdpdGggbm8gcmVuZGVyaW5nIHRha2luZyBwbGFjZSBhbmQgcmVu
ZGVyIGpvYnMgaW4gdGhlIHF1ZXVlLCB0aGVuCisgICAgLy8gcmVuZGVyT25UaW1lciB3aWxsIGJl
IGNhbGxlZCB3aGljaCB3aWxsIGFjdHVhbGx5IHJlbmRlci4KKyAgICBpZiAoIXNob3VsZFBlcmZv
cm1SZW5kZXJKb2JzKCkpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9S
RQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJPblRpbWVyIHRpbWU9
JWYiLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworI2VuZGlmCisgICAgd2hpbGUgKG1fcmVuZGVyUXVl
dWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYigpIHx8IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJl
bnRWaXNpYmxlU2Nyb2xsSm9iKCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9z
dXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVndWxh
clJlbmRlckpvYnMoKSB8fCAhbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJK
b2IoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9yZW5kZXJRdWV1ZS0+cmVuZGVyQWxsQ3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
cmVuZGVyT25JZGxlKCkKK3sKKyAgICBBU1NFUlQoc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSk7
CisKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93IHRoYXQgd2UgZW50ZXJlZCBhIG5l
dyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNhbiBkZXRlcm1pbmUgaWYgaXQgaXMg
dW5kZXIgcHJlc3N1cmUuCisgICAgbV9yZW5kZXJRdWV1ZS0+ZXZlbnRRdWV1ZUN5Y2xlZCgpOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OnJlbmRlck9uSWRsZSIpOworI2VuZGlmCisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIo
IW1fc3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjp3aWxsRmlyZVRpbWVyKCkKK3sKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93
IHRoYXQgd2UgZW50ZXJlZCBhIG5ldyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNh
biBkZXRlcm1pbmUgaWYgaXQgaXMgdW5kZXIgcHJlc3N1cmUuCisgICAgbV9yZW5kZXJRdWV1ZS0+
ZXZlbnRRdWV1ZUN5Y2xlZCgpOworCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVndWxhclJlbmRl
ckpvYnMoKSB8fCAhbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IoKSB8
fCAhbV9yZW5kZXJRdWV1ZS0+Y3VycmVudFJlZ3VsYXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1
cmUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2lsbEZpcmVUaW1lciIpOworI2VuZGlm
CisKKyAgICAvLyBXZSd2ZSBkZXRlY3RlZCB0aGF0IHRoZSByZWd1bGFyIHJlbmRlciBqb2JzIGFy
ZSBjb21pbmcgdW5kZXIgcHJlc3N1cmUgbGlrZWx5CisgICAgLy8gZHVlIHRvIHRpbWVycyBmaXJp
bmcgcHJvZHVjaW5nIGludmFsaWRhdGlvbiBqb2JzIGFuZCBvdXIgZWZmb3J0cyB0byBicmVhayB0
aGVtCisgICAgLy8gdXAgaW50byBiaXRlIHNpemUgcGllY2VzIGhhcyBwcm9kdWNlZCBhIHNpdHVh
dGlvbiB3aGVyZSB3ZSBjYW4gbm90IGNvbXBsZXRlCisgICAgLy8gYSBiYXRjaCBvZiB0aGVtIGJl
Zm9yZSByZWNlaXZpbmcgbW9yZSB0aGF0IGludGVyc2VjdCB0aGVtIHdoaWNoIGNhdXNlcyB1cwor
ICAgIC8vIHRvIHN0YXJ0IHRoZSBiYXRjaCBvdmVyLiBUbyBtaXRpZ2F0ZSB0aGlzIHdlIGhhdmUg
dG8gZW1wdHkgdGhlIGN1cnJlbnQgYmF0Y2gKKyAgICAvLyB3aGVuIHRoaXMgaXMgZGV0ZWN0ZWQu
CisKKyAgICAvLyBXZSBzdGlsbCB3YW50IHRvIHBlcmZvcm0gcHJpb3JpdHkgam9icyBmaXJzdCB0
byBhdm9pZCByZWR1bmRhbnQgcGFpbnRzLgorICAgIHdoaWxlIChtX3JlbmRlclF1ZXVlLT5oYXND
dXJyZW50VmlzaWJsZVpvb21Kb2IoKSB8fCBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50VmlzaWJs
ZVNjcm9sbEpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3VzcGVuZFJl
Z3VsYXJSZW5kZXJKb2JzKTsKKworICAgIGlmIChtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVn
dWxhclJlbmRlckpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXJBbGxDdXJyZW50
UmVndWxhclJlbmRlckpvYnMoKTsKKworICAgIC8vIExldCB0aGUgY2FsbGVyIHlpZWxkIGFuZCBy
ZXNjaGVkdWxlIHRoZSB0aW1lci4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BsYXRmb3JtOjpJ
bnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmV4cGFuZGVkQ29udGVudHNSZWN0KCkgY29uc3QK
K3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDAp
LCBleHBhbmRlZENvbnRlbnRzU2l6ZSgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGludGVyc2VjdGlvbihtX2NsaWVudC0+dHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCks
CisgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50
UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnVuY2xpcHBlZFZpc2libGVD
b250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+dHJhbnNmb3JtZWRW
aXNpYmxlQ29udGVudHNSZWN0KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hv
dWxkTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVYKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAg
ICAmJiBiYWNraW5nU3RvcmVSZWN0LngoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS54KCkKKyAg
ICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgpID4gZXhwYW5kZWRDb250ZW50c1JlY3Qo
KS54KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZVJpZ2h0KGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJl
dHVybiBjYW5Nb3ZlWChiYWNraW5nU3RvcmVSZWN0KQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC5yaWdodCgpIDwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpLnJpZ2h0KCkKKyAgICAgICAg
ICAgICYmIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8IGV4cGFuZGVkQ29udGVudHNSZWN0KCku
cmlnaHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlVXAoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGNhbk1vdmVZKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3Rv
cmVSZWN0LnkoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS55KCkKKyAgICAgICAgICAgICYmIGJh
Y2tpbmdTdG9yZVJlY3QueSgpID4gZXhwYW5kZWRDb250ZW50c1JlY3QoKS55KCk7Cit9CisKK2Jv
b2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZURvd24oY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVZKGJh
Y2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgp
IDwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpLmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5n
U3RvcmVSZWN0LmJvdHRvbSgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5ib3R0b20oKTsKK30K
KworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3Jl
UmVjdC53aWR0aCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLndpZHRoKCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJh
Y2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuaGVp
Z2h0KCkgPiB2aXNpYmxlQ29udGVudHNSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK2Jvb2wgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3Qp
IGNvbnN0Cit7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7
CisgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2li
bGVDb250ZW50c1JlY3QoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0
aGlzLT5leHBhbmRlZENvbnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgt
dGlsZVdpZHRoKCksIDApOworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPj0g
dmlzaWJsZUNvbnRlbnRzUmVjdC5yaWdodCgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVS
ZWN0LngoKSA+PSBjb250ZW50c1JlY3QueCgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZh
dGU6OmNhbk1vdmVSaWdodChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRz
UmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFu
ZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKHRpbGVXaWR0aCgp
LCAwKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC54KCkgPD0gdmlzaWJsZUNvbnRlbnRz
UmVjdC54KCkKKyAgICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPD0gY29u
dGVudHNSZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0
KCkgLSBjb250ZW50c1JlY3QucmlnaHQoKSkgPCB0aWxlV2lkdGgoKSk7Cit9CisKK2Jvb2wgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVVwKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0
KSBjb25zdAoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0
OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNp
YmxlQ29udGVudHNSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0g
dGhpcy0+ZXhwYW5kZWRDb250ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUo
MCwgLXRpbGVIZWlnaHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkg
Pj0gdmlzaWJsZUNvbnRlbnRzUmVjdC5ib3R0b20oKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC55KCkgPj0gY29udGVudHNSZWN0LnkoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjYW5Nb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QK
K3sKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRl
bnRzUmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4
cGFuZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKDAsIHRpbGVI
ZWlnaHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QueSgpIDw9IHZpc2libGVDb250
ZW50c1JlY3QueSgpCisgICAgICAgICAgICAmJiAoYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA8
PSBjb250ZW50c1JlY3QuYm90dG9tKCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0
LmJvdHRvbSgpIC0gY29udGVudHNSZWN0LmJvdHRvbSgpKSA8IHRpbGVIZWlnaHQoKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmJhY2tpbmdTdG9yZVJlY3RG
b3JTY3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhlIGN1cnJlbnQgcmVjdC4KKyAgICBQbGF0Zm9ybTo6
SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKworICAgIC8vIFRoaXMgbWV0aG9kIHVz
ZXMgdGhlIGRlbHRhIHZhbHVlcyB0byBkZXNjcmliZSB0aGUgYmFja2luZ3N0b3JlIHJlY3QKKyAg
ICAvLyBnaXZlbiB0aGUgY3VycmVudCBzY3JvbGwgZGlyZWN0aW9uIGFuZCB0aGUgdmlld3BvcnQg
cG9zaXRpb24uIEhvd2V2ZXIsCisgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRo
IG5vIGRlbHRhcyB3aGF0c29ldmVyIGZvciBpbnN0YW5jZSB3aGVuCisgICAgLy8gdGhlIGNvbnRl
bnRzIHNpemUgY2hhbmdlcyBvciB0aGUgb3JpZW50YXRpb24gY2hhbmdlcy4gSW4gdGhpcyBjYXNl
LCB3ZQorICAgIC8vIHdhbnQgdG8gdXNlIHRoZSBwcmV2aW91cyBzY3JvbGwgZGlyZWN0aW9uIHRv
IGRlc2NyaWJlIHRoZSBiYWNraW5nc3RvcmUKKyAgICAvLyByZWN0LiBUaGlzIHdpbGwgcmVzdWx0
IGluIGxlc3MgY2hlY2tlcmJvYXJkLgorICAgIGlmICghZGVsdGFYICYmICFkZWx0YVkpIHsKKyAg
ICAgICAgZGVsdGFYID0gbV9wcmV2aW91c0RlbHRhLndpZHRoKCk7CisgICAgICAgIGRlbHRhWSA9
IG1fcHJldmlvdXNEZWx0YS5oZWlnaHQoKTsKKyAgICB9CisgICAgbV9wcmV2aW91c0RlbHRhID0g
UGxhdGZvcm06OkludFNpemUoZGVsdGFYLCBkZWx0YVkpOworCisgICAgLy8gUmV0dXJuIHRvIG9y
aWdpbiBpZiBuZWVkIGJlLgorICAgIGlmICghY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkgJiYg
YmFja2luZ1N0b3JlUmVjdC54KCkpCisgICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WCgwKTsK
KworICAgIGlmICghY2FuTW92ZVkoYmFja2luZ1N0b3JlUmVjdCkgJiYgYmFja2luZ1N0b3JlUmVj
dC55KCkpCisgICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WSgwKTsKKworICAgIC8vIE1vdmUg
dGhlIHJlY3QgbGVmdC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVj
dCkgfHwgKGRlbHRhWCA+IDAgJiYgY2FuTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVjdCkpKQorICAg
ICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoLXRpbGVXaWR0aCgpLCAwKTsKKworICAgIC8vIE1v
dmUgdGhlIHJlY3QgcmlnaHQuCisgICAgd2hpbGUgKHNob3VsZE1vdmVSaWdodChiYWNraW5nU3Rv
cmVSZWN0KSB8fCAoZGVsdGFYIDwgMCAmJiBjYW5Nb3ZlUmlnaHQoYmFja2luZ1N0b3JlUmVjdCkp
KQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUodGlsZVdpZHRoKCksIDApOworCisgICAg
Ly8gTW92ZSB0aGUgcmVjdCB1cC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZVVwKGJhY2tpbmdTdG9y
ZVJlY3QpIHx8IChkZWx0YVkgPiAwICYmIGNhbk1vdmVVcChiYWNraW5nU3RvcmVSZWN0KSkpCisg
ICAgICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCAtdGlsZUhlaWdodCgpKTsKKworICAgIC8v
IE1vdmUgdGhlIHJlY3QgZG93bi4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZURvd24oYmFja2luZ1N0
b3JlUmVjdCkgfHwgKGRlbHRhWSA8IDAgJiYgY2FuTW92ZURvd24oYmFja2luZ1N0b3JlUmVjdCkp
KQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgpKTsKKworICAg
IHJldHVybiBiYWNraW5nU3RvcmVSZWN0OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6
OnNldEJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9y
ZVJlY3QpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRT
aG91bGRSZXNldFRpbGVzV2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgUGxhdGZvcm06OkludFJlY3QgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QgPSBmcm9udFN0
YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKTsKKworICAgIGlmIChiYWNraW5nU3RvcmVSZWN0ID09
IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19U
SUxFTUFUUklYCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tpbmdT
dG9yZVJlY3QgY2hhbmdlZCBmcm9tICglZCwlZCAlZHglZCkgdG8gKCVkLCVkICVkeCVkKSIsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC54KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC55KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC53aWR0aCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QuaGVp
Z2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVSZWN0LngoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZVJlY3QueSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC53aWR0aCgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSk7CisjZW5kaWYKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7Cisg
ICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBU
aWxlSW5kZXhMaXN0IGluZGV4ZXNUb0ZpbGwgPSBpbmRleGVzRm9yQmFja2luZ1N0b3JlUmVjdChi
YWNraW5nU3RvcmVSZWN0KTsKKworICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KGluZGV4ZXNU
b0ZpbGwuc2l6ZSgpKSA9PSBjdXJyZW50TWFwLnNpemUoKSk7CisKKyAgICBUaWxlTWFwIG5ld1Rp
bGVNYXA7CisgICAgVGlsZU1hcCBsZWZ0T3ZlclRpbGVzOworCisgICAgLy8gSXRlcmF0ZSB0aHJv
dWdoIG91ciBjdXJyZW50IHRpbGUgbWFwIGFuZCBhZGQgdGlsZXMgdGhhdCBhcmUgcmVuZGVyZWQg
d2l0aAorICAgIC8vIG91ciBuZXcgYmFja2luZyBzdG9yZSByZWN0LgorICAgIFRpbGVNYXA6OmNv
bnN0X2l0ZXJhdG9yIHRpbGVNYXBFbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGls
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IHRpbGVN
YXBFbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4IG9sZEluZGV4ID0gaXQtPmZpcnN0Owor
ICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29uZDsKKworICAgICAgICAv
LyBSZXNldCB0aGUgb2xkIGluZGV4LgorICAgICAgICByZXNldFRpbGUob2xkSW5kZXgsIHRpbGUs
IGZhbHNlIC8qcmVzZXRCYWNrZ3JvdW5kKi8pOworCisgICAgICAgIC8vIE9yaWdpbiBvZiBsYXN0
IGNvbW1pdHRlZCByZW5kZXIgZm9yIHRpbGUgaW4gdHJhbnNmb3JtZWQgY29udGVudCBjb29yZGlu
YXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mTGFzdFJl
bmRlckZvclRpbGUob2xkSW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KTsKKwor
ICAgICAgICAvLyBJZiB0aGUgbmV3IGJhY2tpbmcgc3RvcmUgcmVjdCBjb250YWlucyB0aGlzIG9y
aWdpbiwgdGhlbiBpbnNlcnQgdGhlIHRpbGUgdGhlcmUKKyAgICAgICAgLy8gYW5kIG1hcmsgaXQg
YXMgbm8gbG9uZ2VyIHNoaWZ0ZWQuIE5vdGU6IFBsYXRmb3JtOjpJbnRSZWN0Ojpjb250YWlucyBj
aGVja3MgZm9yIGEgMXgxIHJlY3QKKyAgICAgICAgLy8gYmVsb3cgYW5kIHRvIHRoZSByaWdodCBv
ZiB0aGUgb3JpZ2luIHNvIGl0IGlzIGNvcnJlY3QgdXNhZ2UgaGVyZS4KKyAgICAgICAgaWYgKGJh
Y2tpbmdTdG9yZVJlY3QuY29udGFpbnMob3JpZ2luKSkgeworICAgICAgICAgICAgVGlsZUluZGV4
IG5ld0luZGV4ID0gaW5kZXhPZlRpbGUob3JpZ2luLCBiYWNraW5nU3RvcmVSZWN0KTsKKyAgICAg
ICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICAg
ICAgICAgIGlmIChtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic1ByZXZpb3VzbHlBdHRl
bXB0ZWRCdXROb3RSZW5kZXJlZChyZWN0KSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBy
ZW5kZXIgcXVldWUgcHJldmlvdXNseSB0cmllZCB0byByZW5kZXIgdGhpcyB0aWxlLCBidXQgdGhl
CisgICAgICAgICAgICAgICAgLy8gYmFja2luZ3N0b3JlIHdhc24ndCBpbiB0aGUgY29ycmVjdCBw
bGFjZSBvciB0aGUgdGlsZSB3YXNuJ3QgdmlzaWJsZQorICAgICAgICAgICAgICAgIC8vIGF0IHRo
ZSB0aW1lIHRoZW4gd2UgY2FuJ3Qgc2ltcGx5IHJlc3RvcmUgdGhlIHRpbGUgc2luY2UgdGhlIGNv
bnRlbnQKKyAgICAgICAgICAgICAgICAvLyBpcyBub3cgaW52YWxpZCBhcyBmYXIgYXMgV2ViS2l0
IGlzIGNvbmNlcm5lZC4gSW5zdGVhZCwgd2UgY2xlYXIKKyAgICAgICAgICAgICAgICAvLyB0aGUg
dGlsZSBoZXJlIG9mIHRoZSByZWdpb24gYW5kIHRoZW4gcHV0IHRoZSB0aWxlIGluIHRoZSByZW5k
ZXIKKyAgICAgICAgICAgICAgICAvLyBxdWV1ZSBhZ2Fpbi4KKworICAgICAgICAgICAgICAgIC8v
IEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQgcmVnaW9uIHRvIGdldCB0
aGUgYXJlYXMKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQgdG8g
Y2xlYXIuCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gdGlsZU5vdFJl
bmRlcmVkUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OmludGVyc2VjdFJlZ2lvbnMo
bV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbigpLCByZWN0
KTsKKyAgICAgICAgICAgICAgICBjbGVhckFuZFVwZGF0ZVRpbGVPZk5vdFJlbmRlcmVkUmVnaW9u
KG5ld0luZGV4LCB0aWxlLCB0aWxlTm90UmVuZGVyZWRSZWdpb24sIGJhY2tpbmdTdG9yZVJlY3Qp
OworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGV4dGVudHMgPSB0aWxlTm90UmVuZGVyZWRSZWdpb24uZXh0ZW50cygpOworICAgICAgICAg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRCYWNraW5nU3RvcmVSZWN0
IGRpZCBjbGVhciB0aWxlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53aWR0aCgpLCBl
eHRlbnRzLmhlaWdodCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAvLyBNYXJrIGFzIG5lZWRpbmcgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmICgh
dGlsZS0+ZnJvbnRCdWZmZXIoKS0+aXNSZW5kZXJlZCgpCisgICAgICAgICAgICAgICAgICAgICYm
ICFpc0N1cnJlbnRWaXNpYmxlSm9iKG5ld0luZGV4LCB0aWxlLCBiYWNraW5nU3RvcmVSZWN0KSkK
KyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGlsZShvcmlnaW4sIGZhbHNlIC8qaW1tZWRpYXRl
Ki8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEbyBzb21lIGJvb2trZWVwaW5n
IHdpdGggc2hpZnRpbmcgdGlsZXMuLi4KKyAgICAgICAgICAgIHRpbGUtPmNsZWFyU2hpZnQoKTsK
KyAgICAgICAgICAgIHRpbGUtPnNldENvbW1pdHRlZCh0cnVlKTsKKworICAgICAgICAgICAgc2l6
ZV90IGkgPSBpbmRleGVzVG9GaWxsLmZpbmQobmV3SW5kZXgpOworICAgICAgICAgICAgQVNTRVJU
KGkgIT0gV1RGOjpub3RGb3VuZCk7CisgICAgICAgICAgICBpbmRleGVzVG9GaWxsLnJlbW92ZShp
KTsKKyAgICAgICAgICAgIG5ld1RpbGVNYXAuYWRkKG5ld0luZGV4LCB0aWxlKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoaXMgdGlsZSBhbmQgaW5kZXggc28gd2Ug
Y2FuIGFkZCBpdCB0byB0aGUgcmVtYWluaW5nIGxlZnQgb3ZlciBzcG90cy4uLgorICAgICAgICAg
ICAgbGVmdE92ZXJUaWxlcy5hZGQob2xkSW5kZXgsIHRpbGUpOworICAgICAgICB9CisgICAgfQor
CisgICAgQVNTRVJUKHN0YXRpY19jYXN0PGludD4oaW5kZXhlc1RvRmlsbC5zaXplKCkpID09IGxl
ZnRPdmVyVGlsZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgVGlsZU1hcDo6Y29u
c3RfaXRlcmF0b3IgbGVmdE92ZXJFbmQgPSBsZWZ0T3ZlclRpbGVzLmVuZCgpOworICAgIGZvciAo
VGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsZWZ0T3ZlclRpbGVzLmJlZ2luKCk7IGl0ICE9
IGxlZnRPdmVyRW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBvbGRJbmRleCA9IGl0LT5m
aXJzdDsKKyAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisgICAg
ICAgIGlmIChpID49IGluZGV4ZXNUb0ZpbGwuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
VGlsZUluZGV4IG5ld0luZGV4ID0gaW5kZXhlc1RvRmlsbC5hdChpKTsKKworICAgICAgICAvLyBP
cmlnaW4gb2YgbGFzdCBjb21taXR0ZWQgcmVuZGVyIGZvciB0aWxlIGluIHRyYW5zZm9ybWVkIGNv
bnRlbnQgY29vcmRpbmF0ZXMuCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZk9s
ZCA9IG9yaWdpbk9mTGFzdFJlbmRlckZvclRpbGUob2xkSW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNr
aW5nU3RvcmVSZWN0KTsKKyAgICAgICAgLy8gT3JpZ2luIG9mIHRoZSBuZXcgaW5kZXggZm9yIHRo
ZSBuZXcgYmFja2luZyBzdG9yZSByZWN0LgorICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3Jp
Z2luT2ZOZXcgPSBvcmlnaW5PZlRpbGUobmV3SW5kZXgsIGJhY2tpbmdTdG9yZVJlY3QpOworCisg
ICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUuCisgICAgICAgIHVwZGF0ZVRpbGUob3Jp
Z2luT2ZOZXcsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworCisgICAgICAgIHRpbGUtPmNsZWFyU2hp
ZnQoKTsKKyAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKGZhbHNlKTsKKyAgICAgICAgdGlsZS0+
c2V0SG9yaXpvbnRhbFNoaWZ0KChvcmlnaW5PZk9sZC54KCkgLSBvcmlnaW5PZk5ldy54KCkpIC8g
dGlsZVdpZHRoKCkpOworICAgICAgICB0aWxlLT5zZXRWZXJ0aWNhbFNoaWZ0KChvcmlnaW5PZk9s
ZC55KCkgLSBvcmlnaW5PZk5ldy55KCkpIC8gdGlsZUhlaWdodCgpKTsKKworICAgICAgICBuZXdU
aWxlTWFwLmFkZChuZXdJbmRleCwgdGlsZSk7CisKKyAgICAgICAgKytpOworICAgIH0KKworICAg
IC8vIENoZWNrcyB0byBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBsb3N0IGFueSB0aWxlcy4KKyAgICBB
U1NFUlQoY3VycmVudE1hcC5zaXplKCkgPT0gbmV3VGlsZU1hcC5zaXplKCkpOworCisgICAgYmFj
a1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNXaWRlKGJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSAv
IHRpbGVXaWR0aCgpKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0TnVtYmVyT2ZUaWxlc0hpZ2goYmFj
a2luZ1N0b3JlUmVjdC5oZWlnaHQoKSAvIHRpbGVIZWlnaHQoKSk7CisgICAgYmFja1N0YXRlKCkt
PnNldEJhY2tpbmdTdG9yZU9mZnNldChiYWNraW5nU3RvcmVSZWN0LmxvY2F0aW9uKCkpOworICAg
IGJhY2tTdGF0ZSgpLT5zZXRUaWxlTWFwKG5ld1RpbGVNYXApOworCisgICAgc3dhcFN0YXRlKCk7
Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVJbmRleExpc3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6aW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgVGlsZUluZGV4TGlzdCBpbmRleGVzOwor
ICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSAvIHRp
bGVXaWR0aCgpOworICAgIGludCBudW1iZXJPZlRpbGVzSGlnaCA9IGJhY2tpbmdTdG9yZVJlY3Qu
aGVpZ2h0KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1iZXJP
ZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtYmVyT2ZU
aWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4KHgsIHkpOworICAg
ICAgICAgICAgaW5kZXhlcy5hcHBlbmQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIHJl
dHVybiBpbmRleGVzOworfQorCitQbGF0Zm9ybTo6SW50UG9pbnQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6b3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3JpZ2luT2ZUaWxl
KGluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShpbmRleCwgdGlsZSksIGJhY2tpbmdTdG9yZVJlY3Qp
OworfQorCitUaWxlSW5kZXggQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW5kZXhPZkxhc3RSZW5kZXJG
b3JUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFRpbGVJbmRleChpbmRleC5pKCkgKyB0aWxlLT5ob3Jpem9udGFs
U2hpZnQoKSwgaW5kZXguaigpICsgdGlsZS0+dmVydGljYWxTaGlmdCgpKTsKK30KKworVGlsZUlu
ZGV4IEJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4T2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQ
b2ludCYgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAg
IGludCBvZmZzZXRYID0gb3JpZ2luLngoKSAtIGJhY2tpbmdTdG9yZVJlY3QueCgpOworICAgIGlu
dCBvZmZzZXRZID0gb3JpZ2luLnkoKSAtIGJhY2tpbmdTdG9yZVJlY3QueSgpOworICAgIGlmIChv
ZmZzZXRYKQorICAgICAgICBvZmZzZXRYID0gb2Zmc2V0WCAvIHRpbGVXaWR0aCgpOworICAgIGlm
IChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0gb2Zmc2V0WSAvIHRpbGVIZWlnaHQoKTsKKyAg
ICByZXR1cm4gVGlsZUluZGV4KG9mZnNldFgsIG9mZnNldFkpOworfQorCit2b2lkIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3Qg
VGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgdGlsZU5vdFJlbmRlcmVkUmVnaW9uLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBk
YXRlKQoreworICAgIC8vIEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQg
cmVnaW9uIHRvIGdldCB0aGUgYXJlYXMKKyAgICAvLyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQg
dG8gY2xlYXIuCisgICAgSW50UmVjdExpc3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMgPSB0
aWxlTm90UmVuZGVyZWRSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QgPSB0aWxlTm90UmVuZGVyZWRS
ZWdpb25SZWN0cy5hdChpKTsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHJlbmRlciBxdWV1ZSBvZiB0
aGlzIHJlY3QuCisgICAgICAgIG1fcmVuZGVyUXVldWUtPmNsZWFyKHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3QsIHRydWUgLypjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKi8pOworCisgICAgICAgIGlm
ICh1cGRhdGUpIHsKKyAgICAgICAgICAgIC8vIEFkZCBpdCBhZ2FpbiBhcyBhIHJlZ3VsYXIgcmVu
ZGVyIGpvYi4KKyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVl
dWU6OlJlZ3VsYXJSZW5kZXIsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpOworICAgICAgICB9
CisKKyAgICAgICAgLy8gRmluZCB0aGUgb3JpZ2luIG9mIHRoaXMgdGlsZS4KKyAgICAgICAgUGxh
dGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3Jl
UmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRpbGUgY29vcmRpbmF0ZXMuCisgICAgICAgIHRp
bGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOwor
CisgICAgICAgIC8vIENsZWFyIHRoZSB0aWxlIG9mIHRoaXMgcmVnaW9uLgorICAgICAgICB0aWxl
LT5mcm9udEJ1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKHRpbGVOb3RSZW5kZXJlZFJlZ2lv
blJlY3QpOworICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24o
dGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7CisgICAgfQorfQorCitib29sIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OmlzQ3VycmVudFZpc2libGVKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFj
a2luZ1N0b3JlVGlsZSogdGlsZSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9y
ZVJlY3QpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHdob2xlIHJlY3QgaXMg
aW4gdGhlIHF1ZXVlLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHdob2xlUmVjdCA9IFBsYXRmb3Jt
OjpJbnRSZWN0KG9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3JlUmVjdCksIHRpbGVTaXpl
KCkpOworICAgIGlmIChtX3JlbmRlclF1ZXVlLT5pc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9iKHdo
b2xlUmVjdCkgfHwgbV9yZW5kZXJRdWV1ZS0+aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBs
ZXRlZCh3aG9sZVJlY3QpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFNlY29uZCBj
aGVjayBpZiB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgbm9uLXJlbmRlcmVkIHJlZ2lvbiBh
cmUgaW4gdGhlIHJlZ3VsYXIgcXVldWUuCisgICAgYm9vbCBpc0N1cnJlbnQgPSB0cnVlOyAvLyBJ
dCBpcyB0cnVlIHVudGlsIGl0IGlzbid0IDopCisKKyAgICBJbnRSZWN0TGlzdCB0aWxlTm90UmVu
ZGVyZWRSZWdpb25SZWN0cyA9IHRpbGUtPmZyb250QnVmZmVyKCktPm5vdFJlbmRlcmVkUmVnaW9u
KCkucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVO
b3RSZW5kZXJlZFJlZ2lvblJlY3QgPSB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5hdChpKTsK
KyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCwg
YmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRyYW5zZm9ybWVkIGNvbnRl
bnRzIGNvb3JkaW5hdGVzLgorICAgICAgICB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0Lm1vdmUo
b3JpZ2luLngoKSwgb3JpZ2luLnkoKSk7CisKKyAgICAgICAgaXNDdXJyZW50ID0gbV9yZW5kZXJR
dWV1ZS0+aXNDdXJyZW50UmVndWxhclJlbmRlckpvYih0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0
KSA/IGlzQ3VycmVudCA6IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBpc0N1cnJlbnQ7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQmFja2luZ1N0b3JlKGludCBkZWx0
YVgsIGludCBkZWx0YVkpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdl
LT5kLT5zZXRTaG91bGRSZXNldFRpbGVzV2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIG91ciBuZXcgcHJlZmVycmVkIG1hdHJpeCBkaW1l
bnNpb24uCisgICAgaWYgKGRlbHRhWCB8fCBkZWx0YVkpCisgICAgICAgIG1fcHJlZmVycmVkVGls
ZU1hdHJpeERpbWVuc2lvbiA9IGFicyhkZWx0YVgpID4gYWJzKGRlbHRhWSkgPyBIb3Jpem9udGFs
IDogVmVydGljYWw7CisKKyAgICAvLyBDYWxjdWxhdGUgb3VyIHByZWZlcnJlZCBtYXRyaXggZ2Vv
bWV0cnkuCisgICAgRGl2aXNvciBkaXZpc29yID0gYmVzdERpdmlzb3IoZXhwYW5kZWRDb250ZW50
c1NpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlV2lkdGgoKSwg
dGlsZUhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1O
dW1iZXJPZlRpbGVzV2lkZSgpLCBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24p
OworCisjaWYgREVCVUdfVElMRU1BVFJJWAorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2
YXRlOjpzY3JvbGxCYWNraW5nU3RvcmUgZGl2aXNvciAlZHglZCIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkaXZpc29yLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2
aXNvci5zZWNvbmQpOworI2VuZGlmCisKKyAgICAvLyBJbml0aWFsaXplIGEgcmVjdCB3aXRoIHRo
YXQgbmV3IGdlb21ldHJ5LgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3Qo
MCwgMCwgZGl2aXNvci5maXJzdCAqIHRpbGVXaWR0aCgpLCBkaXZpc29yLnNlY29uZCAqIHRpbGVI
ZWlnaHQoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhhdCByZWN0IHNvIHRoYXQgaXQgZml0cyBvdXIg
Y29udGVudHMgYW5kIHZpZXdwb3J0IGFuZCBzY3JvbGwgZGVsdGEuCisgICAgYmFja2luZ1N0b3Jl
UmVjdCA9IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoZGVsdGFYLCBkZWx0YVksIGJhY2tpbmdT
dG9yZVJlY3QpOworCisgICAgQVNTRVJUKCFiYWNraW5nU3RvcmVSZWN0LmlzRW1wdHkoKSk7CisK
KyAgICBzZXRCYWNraW5nU3RvcmVSZWN0KGJhY2tpbmdTdG9yZVJlY3QpOworfQorCitib29sIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBJbnRSZWN0TGlzdCYgcmVjdExpc3QsIGJv
b2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgLy8gRklYTUU6IFdlIGN5Y2xlIHRocm91Z2gg
b25lIGJ5IG9uZSBhbmQgb25seSBibGl0IHRoZSBjb250ZW50cyBhdCB0aGUgZW5kLgorICAgIC8v
IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24gaWYgd2UgaGFkIGEgbWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RpbGVzIHRoYXQKKyAgICAvLyB0b29rIGEgc2V0IG9mIHJlY3RzIGFuZCBkZWNv
bXBvc2VkIHRoZW0gYXBwcm9wcmlhdGVseS4KKyAgICBib29sIHJlbmRlcmVkID0gZmFsc2U7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAgICAg
cmVuZGVyZWQgPSByZW5kZXIocmVjdExpc3QuYXQoaSksIHRydWUpID8gdHJ1ZSA6IHJlbmRlcmVk
OworCisgICAgaWYgKHJlbmRlcmVkICYmICFyZW5kZXJDb250ZW50T25seSkgeworICAgICAgICBp
ZiAoIXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0Vmlz
aWJsZUNvbnRlbnRzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludmFsaWRhdGVXaW5k
b3coKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZWQ7Cit9CisKK2Jvb2wgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6cmVuZGVyRGlyZWN0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgcmVxdWVzdExheW91dElmTmVl
ZGVkKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSByZWN0OworICAgIGRp
cnR5UmVjdC5pbnRlcnNlY3QodW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKworICAg
IGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBzY3JlZW5SZWN0ID0gbV9jbGllbnQtPm1hcEZyb21UcmFuc2Zvcm1l
ZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGRpcnR5UmVjdCk7CisgICAgd2luZG93RnJv
bnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisgICAgY29w
eVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKworICAgIHBhaW50RGVm
YXVsdEJhY2tncm91bmQoZGlydHlSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCB0cnVlIC8q
Zmx1c2gqLyk7CisKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gdW5jbGlw
cGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpLmxvY2F0aW9uKCk7CisgICAgLy8gV2UgZG9uJ3QgbmVl
ZCBhIGJ1ZmZlciBzaW5jZSB3ZSdyZSBkaXJlY3QgcmVuZGVyaW5nIHRvIHdpbmRvdy4KKyAgICBy
ZW5kZXJDb250ZW50cygwLCBvcmlnaW4sIGRpcnR5UmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZl
clN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19TVVJGQUNFCisgICAgaWYg
KG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpICE9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlKSB7CisgICAgICAg
IFBsYXRmb3JtOjpJbnRSZWN0IGNsaXBwZWRSZWN0ID0gaW50ZXJzZWN0aW9uKGRpcnR5UmVjdCwg
dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAgYmxlbmRDb21wb3NpdGluZ1N1cmZhY2Uo
Y2xpcHBlZFJlY3QpOworICAgIH0KKyNlbmRpZgorCisgICAgYm9vbCBzaG91bGRJbnZhbGlkYXRl
ID0gIW1fc3VzcGVuZFNjcmVlblVwZGF0ZXMgJiYgIXJlbmRlckNvbnRlbnRPbmx5OworICAgIGlm
ICghc2hvdWxkSW52YWxpZGF0ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpbnZhbGlk
YXRlV2luZG93KHNjcmVlblJlY3QpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwgYm9v
bCByZW5kZXJDb250ZW50T25seSkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOwor
CisgICAgaWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHJldHVy
biByZW5kZXJEaXJlY3RUb1dpbmRvdyhyZWN0LCByZW5kZXJDb250ZW50T25seSk7CisKKyAgICBU
aWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1Rp
bGVzKHJlY3QpOworICAgIGlmICh0aWxlUmVjdExpc3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlciByZWN0PSgl
ZCwlZCAlZHglZCksIHJlbmRlckNvbnRlbnRPbmx5PSVzLCBtX3N1c3BlbmRCYWNraW5nU3RvcmVV
cGRhdGVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZW5kZXJDb250ZW50T25seSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID8gInRydWUiIDogImZh
bHNlIik7CisjZW5kaWYKKworICAgIGJvb2wgYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdX
aW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9
PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZTsKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7Cisg
ICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eUNvbnRlbnRzUmVjdDsKKyAgICBib29sIHNob3VsZEJsaXQg
PSAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhcmVuZGVyQ29udGVudE9ubHk7Cisg
ICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJl
Y3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRDb250ZW50
c1NpemUoKSk7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3Qgdmlld3BvcnRSZWN0ID0gUGxh
dGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNm
b3JtZWRWaWV3cG9ydFNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVS
ZWN0TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVS
ZWN0TGlzdFtpXTsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7Cisg
ICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7
CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50TWFwLmdldChpbmRleCk7
CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSB0aWxlIHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRl
cywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRz
IGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSBtYXBG
cm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpOworCisgICAgICAgIC8vIElm
IHdlJ3JlIG5vdCB5ZXQgY29tbWl0dGVkLCB0aGVuIGNvbW1pdCBub3cgYnkgY2xlYXJpbmcgdGhl
IHJlbmRlcmVkIHJlZ2lvbgorICAgICAgICAvLyBhbmQgc2V0dGluZyB0aGUgY29tbWl0dGVkIGZs
YWcgYXMgd2VsbCBhcyBjbGVhcmluZyB0aGUgc2hpZnQuCisgICAgICAgIGlmICghdGlsZS0+aXND
b21taXR0ZWQoKSkgeworICAgICAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKHRydWUpOworICAg
ICAgICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAg
ICAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAg
ICAgICAgICB0aWxlLT5jbGVhclNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0
aGUgdGlsZSBoYXMgYmVlbiBjcmVhdGVkLCBidXQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBh
cmUgcGFpbnRpbmcgb24gaXQKKyAgICAgICAgLy8gdGhlbiBpdCBoYXNuJ3QgYmVlbiBnaXZlbiBh
IGRlZmF1bHQgYmFja2dyb3VuZCB5ZXQgc28gdGhhdCB3ZSBjYW4gc2F2ZSB0aW1lIGR1cmluZwor
ICAgICAgICAvLyBzdGFydHVwLiBUaGF0J3Mgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIGluc3Rl
YWQuLi4KKyAgICAgICAgaWYgKCF0aWxlLT5iYWNrZ3JvdW5kUGFpbnRlZCgpKQorICAgICAgICAg
ICAgdGlsZS0+cGFpbnRCYWNrZ3JvdW5kKCk7CisKKyAgICAgICAgLy8gUGFpbnQgZGVmYXVsdCBi
YWNrZ3JvdW5kIGlmIGNvbnRlbnRzIHJlY3QgaXMgZW1wdHkuCisgICAgICAgIGlmICghZXhwYW5k
ZWRDb250ZW50c1JlY3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3
ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQgcmVuZGVyIHRoZSBjb250ZW50Lgor
ICAgICAgICAgICAgZGlydHlSZWN0LmludGVyc2VjdChleHBhbmRlZENvbnRlbnRzUmVjdCgpKTsK
KworICAgICAgICAgICAgZGlydHlUaWxlUmVjdC5pbnRlcnNlY3QodGlsZUNvbnRlbnRzUmVjdChp
bmRleCwgZXhwYW5kZWRDb250ZW50c1JlY3QoKSwgY3VycmVudFN0YXRlKSk7CisKKyAgICAgICAg
ICAgIC8vIFdlIHByb2JhYmx5IGhhdmUgZXh0cmEgdGlsZXMgc2luY2UgdGhlIGNvbnRlbnRzIHNp
emUgaXMgc28gc21hbGwuCisgICAgICAgICAgICAvLyBTYXZlIHNvbWUgY3ljbGVzIGhlcmUuLi4K
KyAgICAgICAgICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tT
dXJmYWNlT2ZUaWxlKGRpcnR5VGlsZVJlY3QsIHRpbGUpOworCisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBuYXRpdmVCdWZmZXIKKyAgICAgICAgICAgID0g
dGlsZS0+YmFja0J1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKTsKKworICAgICAgICBpZiAoYmxpdHRp
bmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0
ZXhfbG9jaygmbV9ibGl0R2VuZXJhdGlvbkxvY2spOworICAgICAgICAgICAgd2hpbGUgKG1fYmxp
dEdlbmVyYXRpb24gPT0gdGlsZS0+YmFja0J1ZmZlcigpLT5ibGl0R2VuZXJhdGlvbigpKSB7Cisg
ICAgICAgICAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJm1fYmxpdEdl
bmVyYXRpb25Db25kLCAmbV9ibGl0R2VuZXJhdGlvbkxvY2ssICZtX2N1cnJlbnRCbGl0RW5kKTsK
KyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAg
ICAgICArK21fYmxpdEdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgImNvbmRfdGltZWR3YWl0IGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJyKSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2JsaXRHZW5lcmF0aW9uTG9jayk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogbW9kaWZ5IHJlbmRlciB0byB0YWtlIGEg
VmVjdG9yPEludFJlY3Q+IHBhcmFtZXRlciBzbyB3ZSdyZSBub3QgcmVjcmVhdGluZworICAgICAg
ICAvLyBHcmFwaGljc0NvbnRleHQgb24gdGhlIHN0YWNrIGVhY2ggdGltZS4KKyAgICAgICAgcmVu
ZGVyQ29udGVudHMobmF0aXZlQnVmZmVyLCBvcmlnaW5PZlRpbGUoaW5kZXgpLCBkaXJ0eVJlY3Qp
OworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3bHkgcmVuZGVyZWQgcmVnaW9uIHRvIHRoZSB0aWxl
IHNvIGl0IGNhbiBrZWVwIHRyYWNrIGZvciBibGl0cy4KKyAgICAgICAgdGlsZS0+YmFja0J1ZmZl
cigpLT5hZGRSZW5kZXJlZFJlZ2lvbihkaXJ0eVRpbGVSZWN0KTsKKworICAgICAgICAvLyBDaGVj
ayBpZiB0aGUgY29udGVudHMgZm9yIHRoaXMgdGlsZSdzIGJhY2tidWZmZXIgYXJlIHZhbGlkIHdo
ZW4KKyAgICAgICAgLy8gY29tcGFyZWQgdG8gdGhlIGZyb250IGJ1ZmZlci4KKyAgICAgICAgYm9v
bCBiYWNrQnVmZmVySXNWYWxpZCA9IHRpbGUtPmJhY2tCdWZmZXIoKS0+aXNSZW5kZXJlZCh0aWxl
LT5mcm9udEJ1ZmZlcigpLT5yZW5kZXJlZFJlZ2lvbigpKTsKKworICAgICAgICAvLyBPdXIgY3Vy
cmVudCBkZXNpZ24gZGVtYW5kcyB0aGF0IHRoZSBiYWNrYnVmZmVyIGlzIHZhbGlkIGFmdGVyIGFu
eQorICAgICAgICAvLyByZW5kZXJpbmcgb3BlcmF0aW9uIHNvIGFzc2VydCB0aGF0IGhlcmUuIElm
IHdlIGhpdCB0aGlzIGFzc2VydCB3ZQorICAgICAgICAvLyBrbm93IHRoYXQgd2UncmUgZG9pbmcg
c29tZXRoaW5nIGJhZCB0aGF0IHdpbGwgcmVzdWx0IGluIGFydGlmYWN0cy4KKyAgICAgICAgQVNT
RVJUKGJhY2tCdWZmZXJJc1ZhbGlkKTsKKworICAgICAgICAvLyBXZSB3aWxsIG5lZWQgYSBzd2Fw
IGhlcmUgYmVjYXVzZSBvZiB0aGUgc2hhcmVkIGJhY2sgYnVmZmVyLgorICAgICAgICBpZiAoYmFj
a0J1ZmZlcklzVmFsaWQpIHsKKyAgICAgICAgICAgIHRpbGUtPnN3YXBCdWZmZXJzKCk7CisgICAg
ICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VD
bGllbnQoKS0+c3luY1RvQ3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRpbGUtPmJhY2tC
dWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgZGly
dHlDb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6dW5pb25PZlJlY3RzKGRpcnR5Q29udGVudHNSZWN0
LCBkaXJ0eVJlY3QpOworICAgIH0KKworICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGUgY29udGVu
dCBpbmNsdWRpbmcgb3ZlcnNjcm9sbC4KKyAgICBkaXJ0eUNvbnRlbnRzUmVjdC5pbnRlcnNlY3Qo
dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICBpZiAoZGlydHlDb250ZW50c1Jl
Y3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghc2hvdWxkQmxp
dCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVxdWVzdExh
eW91dElmTmVlZGVkKCkgY29uc3QKK3sKKyAgICBtX3dlYlBhZ2UtPmQtPnJlcXVlc3RMYXlvdXRJ
Zk5lZWRlZCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlclZpc2libGVD
b250ZW50cyhib29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHJlbmRlclJlY3QgPSBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpID8gdmlzaWJsZUNv
bnRlbnRzUmVjdCgpIDogdmlzaWJsZVRpbGVzUmVjdCgpOworCisgICAgcmVuZGVyKHJlbmRlclJl
Y3QsIHJlbmRlckNvbnRlbnRPbmx5KTsKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhcihyZW5kZXJS
ZWN0LCB0cnVlIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKK30KKwordm9pZCBCYWNraW5n
U3RvcmVQcml2YXRlOjpyZW5kZXJCYWNraW5nU3RvcmUoYm9vbCByZW5kZXJDb250ZW50T25seSkK
K3sKKyAgICByZW5kZXIoZnJvbnRTdGF0ZSgpLT5iYWNraW5nU3RvcmVSZWN0KCksIHJlbmRlckNv
bnRlbnRPbmx5KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNv
bnRlbnRzKGJvb2wgZm9yY2UpCit7CisgICAgLy8gQmxpdHRpbmcgbXVzdCBuZXZlciBoYXBwZW4g
Zm9yIGRpcmVjdCByZW5kZXJpbmcgY2FzZS4KKyAgICBBU1NFUlQoIXNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpOworCisgICAgaWYgKG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMpIHsKKyAg
ICAgICAgLy8gQXZvaWQgY2xpZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIHVwZGF0ZXMg
c3VzcGVuZGVkLgorICAgICAgICBpZiAoZm9yY2UpCisgICAgICAgICAgICBtX2hhc0JsaXRKb2Jz
ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUJsYWNrQmVycnk6
OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRU
aHJlYWQoKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgICAg
ICZCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzLCB0aGlzLCBmb3JjZSkp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmxpdENvbnRlbnRzKG1fd2ViUGFnZS0+
Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCksCisgICAgICAg
ICAgICAgICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJs
ZUNvbnRlbnRzUmVjdCgpLAorICAgICAgICAgICAgICAgICBmb3JjZSk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5k
b3coKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHByZXZpb3VzQ29udGVudHNSZWdp
b24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKHdp
bmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigpLCB3aW5kb3dCYWNrQnVmZmVy
U3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigpKTsKKworICAgIGlmIChwcmV2aW91c0NvbnRlbnRzUmVn
aW9uLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQo
KS0+d2luZG93KCktPmNvcHlGcm9tRnJvbnRUb0JhY2socHJldmlvdXNDb250ZW50c1JlZ2lvbik7
CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24ocHJldmlvdXND
b250ZW50c1JlZ2lvbik7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZp
b3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSkKK3sKKyAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBwcmV2aW91c0NvbnRlbnRzUmVnaW9uCisgICAgICAgID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyh0aWxlLT5mcm9udEJ1ZmZlcigpLT5yZW5k
ZXJlZFJlZ2lvbigpLCByZWN0KTsKKworICAgIEludFJlY3RMaXN0IHByZXZpb3VzQ29udGVudHNS
ZWN0cyA9IHByZXZpb3VzQ29udGVudHNSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHByZXZpb3VzQ29udGVudHNSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBwcmV2aW91c0NvbnRlbnRzUmVjdCA9IHByZXZpb3VzQ29udGVudHNS
ZWN0cy5hdChpKTsKKyAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5hZGRSZW5kZXJlZFJlZ2lv
bihwcmV2aW91c0NvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIoCisgICAgICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCkt
Pm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91c0NvbnRlbnRzUmVjdCwKKyAgICAgICAgICAgIHRpbGUt
PmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91c0NvbnRlbnRzUmVjdCk7Cisg
ICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnBhaW50RGVmYXVsdEJhY2tncm91
bmQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0cmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoKQoreworICAgIGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0IGNvbnRlbnRzUmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2lu
dCgwLCAwKSwgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsKKyAgICBQ
bGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gY29udGVudHMubG9jYXRpb24oKTsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCBjb250ZW50c0NsaXBwZWQgPSBjb250ZW50czsKKworICAgIC8vIFdlIGhh
dmUgdG8gcGFpbnQgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpbiB0aGUgY2FzZSBvZiBvdmVyem9v
bSBhbmQKKyAgICAvLyBtYWtlIHN1cmUgaXQgaXMgaW52YWxpZGF0ZWQuCisgICAgQ29sb3IgY29s
b3IobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5vdmVyWm9vbUNvbG9yKCkpOworCisgICAgUGxhdGZv
cm06OkludFJlY3RSZWdpb24gb3ZlclNjcm9sbFJlZ2lvbgorICAgICAgICAgICAgPSBQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKFBsYXRmb3JtOjpJbnRSZWN0KGNvbnRl
bnRzQ2xpcHBlZCksIGNvbnRlbnRzUmVjdCk7CisKKyAgICBJbnRSZWN0TGlzdCBvdmVyU2Nyb2xs
UmVjdHMgPSBvdmVyU2Nyb2xsUmVnaW9uLnJlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBvdmVyU2Nyb2xsUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm06Oklu
dFJlY3Qgb3ZlclNjcm9sbFJlY3QgPSBvdmVyU2Nyb2xsUmVjdHMuYXQoaSk7CisgICAgICAgIG92
ZXJTY3JvbGxSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKyAgICAgICAgb3Zl
clNjcm9sbFJlY3QgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KG92ZXJTY3JvbGxSZWN0KTsKKwor
ICAgICAgICBpZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAg
Ly8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IG92ZXJTY3JvbGxSZWN0
IGNvdWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAgICAvLyB0aGFuIHRoZSBzdXJm
YWNlIHNpemUgb2YgdGhlIHdpbmRvdy4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5IGNsYW1waW5n
CisgICAgICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAg
ICAgICBvdmVyU2Nyb2xsUmVjdC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06
OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNp
emUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJXaW5kb3cob3ZlclNjcm9sbFJlY3Qs
IGNvbG9yLnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIGNvbG9yLmFscGhhKCkp
OworICAgIH0KK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gQmxp
dHRpbmcgbXVzdCBuZXZlciBoYXBwZW4gZm9yIGRpcmVjdCByZW5kZXJpbmcgY2FzZS4KKyAgICAv
LyBVc2UgaW52YWxpZGF0ZVdpbmRvdygpIGluc3RlYWQuCisgICAgQVNTRVJUKCFzaG91bGREaXJl
Y3RSZW5kZXJpbmdUb1dpbmRvdygpKTsKKworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUo
KSB8fCBtX3N1c3BlbmRTY3JlZW5VcGRhdGVzIHx8ICFpc0FjdGl2ZSgpKSB7CisgICAgICAgIC8v
IEF2b2lkIGNsaWVudCBnb2luZyBpbnRvIGJ1c3kgbG9vcCB3aGlsZSBibGl0IGlzIGltcG9zc2li
bGUuCisgICAgICAgIGlmIChmb3JjZSkKKyAgICAgICAgICAgIG1faGFzQmxpdEpvYnMgPSBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgp
KSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVz
c2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgJkJhY2tp
bmdTdG9yZVByaXZhdGU6OmJsaXRDb250ZW50cywgdGhpcywgZHN0UmVjdCwgc3JjUmVjdCwgZm9y
Y2UpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2RlZmVyc0JsaXQgJiYg
IWZvcmNlKSB7CisgICAgICAgIG1faGFzQmxpdEpvYnMgPSB0cnVlOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgbV9oYXNCbGl0Sm9icyA9IGZhbHNlOworCisgICAgQmFja2luZ1N0b3Jl
R2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50
UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsKKworI2lm
IERFQlVHX1ZJU1VBTElaRQorICAgIC8vIFN1YnN0aXR1dGUgYSBkZWJ1Z1JlY3QgdGhhdCBjb25z
aXN0cyBvZiB0aGUgdW5pb24gb2YgdGhlIGJhY2tpbmdzdG9yZSByZWN0CisgICAgLy8gYW5kIHRo
ZSB1aSB0aHJlYWQgdmlld3BvcnQgcmVjdCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgc291cmNlIHJl
Y3Qgc28gd2UKKyAgICAvLyBjYW4gdmlzdWFsaXplIHRoZSBlbnRpcmUgYmFja2luZ3N0b3JlIGFu
ZCB3aGF0IGl0IGlzIGRvaW5nIHdoZW4gd2UKKyAgICAvLyBzY3JvbGwgYW5kIHpvb20hCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24gV2ViQ29yZTo6
LgorICAgIFdlYkNvcmU6OkludFJlY3QgZGVidWdSZWN0ID0gY3VycmVudFN0YXRlLT5iYWNraW5n
U3RvcmVSZWN0KCk7CisgICAgZGVidWdSZWN0LnVuaXRlKG1fd2ViUGFnZS0+Y2xpZW50KCktPnVz
ZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICBpZiAoZGVidWdS
ZWN0LndpZHRoKCkgPCBkZWJ1Z1JlY3QuaGVpZ2h0KCkpCisgICAgICAgIGRlYnVnUmVjdC5zZXRX
aWR0aChjZWlsKGRvdWJsZShzcmNSZWN0LndpZHRoKCkpICogKGRvdWJsZShkZWJ1Z1JlY3QuaGVp
Z2h0KCkpIC8gc3JjUmVjdC5oZWlnaHQoKSkpKTsKKyAgICBpZiAoZGVidWdSZWN0LmhlaWdodCgp
IDwgZGVidWdSZWN0LndpZHRoKCkpCisgICAgICAgIGRlYnVnUmVjdC5zZXRIZWlnaHQoY2VpbChk
b3VibGUoc3JjUmVjdC5oZWlnaHQoKSkgKiAoZG91YmxlKGRlYnVnUmVjdC53aWR0aCgpKSAvIHNy
Y1JlY3Qud2lkdGgoKSkpKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50cyA9IGRlYnVn
UmVjdDsKKyNlbHNlCisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHMgPSBzcmNSZWN0Owor
I2VuZGlmCisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVu
ZCBvbiBXZWJDb3JlOjouCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtYXRpb24g
PSBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6cmVjdFRvUmVjdCgKKyAgICAgICAgRmxvYXRSZWN0KEZs
b2F0UG9pbnQoMC4wLCAwLjApLCBXZWJDb3JlOjpJbnRTaXplKGNvbnRlbnRzLnNpemUoKSkpLCBX
ZWJDb3JlOjpJbnRSZWN0KGRzdFJlY3QpKTsKKworICAgIGJvb2wgYmxpdHRpbmdEaXJlY3RseVRv
Q29tcG9zaXRpbmdXaW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+d2lu
ZG93VXNhZ2UoKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xF
UzJVc2FnZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgQmFja2luZ1N0
b3JlQ29tcG9zaXRpbmdTdXJmYWNlKiBjb21wb3NpdGluZ1N1cmZhY2UgPQorICAgICAgICBTdXJm
YWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y29tcG9zaXRpbmdTdXJmYWNlKCk7CisKKyAg
ICBpZiAoIWJsaXR0aW5nRGlyZWN0bHlUb0NvbXBvc2l0aW5nV2luZG93KQorICAgICAgICBkcmF3
U3ViTGF5ZXJzKCk7CisjZW5kaWYKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6Ymxp
dENvbnRlbnRzIGRzdFJlY3Q9KCVkLCVkICVkeCVkKSBzcmNSZWN0PSglZCwlZCAlZHglZCkiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RS
ZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWln
aHQoKSk7CisjZW5kaWYKKworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4gPSBjb250ZW50
cy5sb2NhdGlvbigpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzQ2xpcHBlZCA9IGNv
bnRlbnRzOworCisgICAgcGFpbnREZWZhdWx0QmFja2dyb3VuZChjb250ZW50cywgdHJhbnNmb3Jt
YXRpb24sIGZhbHNlIC8qZmx1c2gqLyk7CisKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJy
ZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIC8vIERvbid0IGNsaXAgdG8gY29udGVudHMgaWYg
aXQgaXMgZW1wdHkgc28gd2UgY2FuIHN0aWxsIHBhaW50IGRlZmF1bHQgYmFja2dyb3VuZC4KKyAg
ICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGVudHNDbGlwcGVk
LmludGVyc2VjdChjb250ZW50c1JlY3QpOworICAgICAgICBpZiAoY29udGVudHNDbGlwcGVkLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0KTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIGNvbnRlbnRzUmVnaW9uID0gY29udGVudHNDbGlwcGVkOworICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBiYWNraW5nU3RvcmVSZWdpb24gPSBjdXJyZW50U3RhdGUtPmJhY2tpbmdT
dG9yZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gY2hlY2tlcmVkUmVn
aW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lv
bnMoY29udGVudHNSZWdpb24sIGJhY2tpbmdTdG9yZVJlZ2lvbik7CisKKyAgICAgICAgLy8gQmxp
dCBjaGVja2VyZWQgdG8gdGhvc2UgcGFydHMgdGhhdCBhcmUgbm90IGNvdmVyZWQgYnkgdGhlIGJh
Y2tpbmdTdG9yZVJlY3QuCisgICAgICAgIEludFJlY3RMaXN0IGNoZWNrZXJlZFJlY3RzID0gY2hl
Y2tlcmVkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hl
Y2tlcmVkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0
IGRzdFJlY3QgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KFBsYXRmb3JtOjpJbnRSZWN0KAorICAg
ICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludChjaGVja2VyZWRSZWN0cy5hdChpKS54KCkg
LSBvcmlnaW4ueCgpLCBjaGVja2VyZWRSZWN0cy5hdChpKS55KCkgLSBvcmlnaW4ueSgpKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlcmVkUmVjdHMuYXQoaSkuc2l6
ZSgpKSk7CisgICAgICAgICAgICBjaGVja2VyV2luZG93KGRzdFJlY3QsIGNoZWNrZXJlZFJlY3Rz
LmF0KGkpLmxvY2F0aW9uKCksIHRyYW5zZm9ybWF0aW9uLmEoKSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBWZWN0b3I8VGlsZUJ1ZmZlcio+IGJsaXR0ZWRUaWxlczsKKworICAgIC8vIEdldCB0
aGUgbGlzdCBvZiB0aWxlIHJlY3RzIHRoYXQgbWFrZXVwIHRoZSBjb250ZW50LgorICAgIFRpbGVS
ZWN0TGlzdCB0aWxlUmVjdExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMo
Y29udGVudHNDbGlwcGVkLCBjdXJyZW50U3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdGlsZVJlY3RMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0
ID0gdGlsZVJlY3RMaXN0W2ldOworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSB0aWxlUmVjdC5m
aXJzdDsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0
LnNlY29uZDsKKyAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0
KGluZGV4KTsKKyAgICAgICAgVGlsZUJ1ZmZlciogdGlsZUJ1ZmZlciA9IHRpbGUtPmZyb250QnVm
ZmVyKCk7CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSByZWN0IGlzIGluIHRpbGUgY29vcmRpbmF0
ZXMsIGJ1dCBpdCBuZWVkcyB0byBiZSBpbgorICAgICAgICAvLyB0cmFuc2Zvcm1lZCBjb250ZW50
cyBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0CisgICAg
ICAgICAgICA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCwgY3Vy
cmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIC8vIERvbid0IGNsaXAg
dG8gY29udGVudHMgaWYgaXQgaXMgZW1wdHkgc28gd2UgY2FuIHN0aWxsIHBhaW50IGRlZmF1bHQg
YmFja2dyb3VuZC4KKyAgICAgICAgaWYgKCFjb250ZW50c1JlY3QuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugc2hvdWxkIGNsaXAgdGhlIGNvbnRlbnRzIHNpemUgYW5k
IGJsaXQuCisgICAgICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGNvbnRlbnRzUmVjdCk7CisK
KyAgICAgICAgICAgIC8vIFdlIHByb2JhYmx5IGhhdmUgZXh0cmEgdGlsZXMgc2luY2UgdGhlIGNv
bnRlbnRzIHNpemUgaXMgc28gc21hbGwuCisgICAgICAgICAgICAvLyBTYXZlIHNvbWUgY3ljbGVz
IGhlcmUuLi4KKyAgICAgICAgICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93LCB0aGlzIGRpcnR5
IHJlY3QgaXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlCisgICAg
ICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzLCBidXQgdWx0aW1hdGVseSBpdCBuZWVkcyB0byBi
ZSB0cmFuc2Zvcm1lZAorICAgICAgICAvLyBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmll
d3BvcnQuCisgICAgICAgIGRpcnR5UmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7
CisKKyAgICAgICAgLy8gU2F2ZSBzb21lIGN5Y2xlcyBoZXJlLi4uCisgICAgICAgIGlmIChkaXJ0
eVJlY3QuaXNFbXB0eSgpIHx8IGRpcnR5VGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgVGlsZVJlY3Qgd2hvbGVUaWxlUmVjdDsKKyAgICAgICAgd2hv
bGVUaWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgICAgICB3aG9sZVRpbGVSZWN0LnNlY29uZCA9
IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHdob2xlUmVjdAor
ICAgICAgICAgICAgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMod2hvbGVUaWxl
UmVjdCwgY3VycmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIGJvb2wg
Y29tbWl0dGVkID0gdGlsZS0+aXNDb21taXR0ZWQoKTsKKyAgICAgICAgYm9vbCByZW5kZXJlZCA9
IHRpbGVCdWZmZXItPmlzUmVuZGVyZWQoZGlydHlUaWxlUmVjdCk7CisgICAgICAgIGJvb2wgcGFp
bnRDaGVja2VyZWQgPSAhY29tbWl0dGVkIHx8ICFyZW5kZXJlZDsKKworICAgICAgICBpZiAocGFp
bnRDaGVja2VyZWQpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdFQg
PSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAgICAgIGlmICgh
dHJhbnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gQmVjYXVz
ZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBjb3VsZCBiZSBvZmYt
Ynktb25lIGxhcmdlcgorICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIHN1cmZhY2Ugc2l6ZSBv
ZiB0aGUgZHN0IGJ1ZmZlci4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5IGNsYW1waW5nCisgICAg
ICAgICAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgorICAgICAgICAg
ICAgICAgIGRpcnR5UmVjdFQuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJ
bnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXpl
KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCBjb250ZW50c09yaWdpbihkaXJ0eVJlY3QueCgpICsgb3JpZ2luLngoKSwgZGlydHlSZWN0Lnko
KSArIG9yaWdpbi55KCkpOworICAgICAgICAgICAgY2hlY2tlcldpbmRvdyhkaXJ0eVJlY3RULCBj
b250ZW50c09yaWdpbiwgdHJhbnNmb3JtYXRpb24uYSgpKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEJsaXQgdGhlIHZpc2libGUgYnVmZmVyIGhlcmUgaWYgd2UgaGF2ZSB2aXNpYmxlIHpvb20g
am9icy4KKyAgICAgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9vbUpv
YigpKSB7CisKKyAgICAgICAgICAgIC8vIE5lZWRzIHRvIGJlIGluIHNhbWUgY29vcmRpbmF0ZSBz
eXN0ZW0gYXMgZGlydHlSZWN0LgorICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJs
ZVRpbGVCdWZmZXJSZWN0ID0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisgICAgICAgICAgICB2
aXNpYmxlVGlsZUJ1ZmZlclJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworCisg
ICAgICAgICAgICAvLyBDbGlwIHRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuCisgICAgICAg
ICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KHZpc2libGVUaWxlQnVmZmVyUmVjdCk7CisKKyAgICAg
ICAgICAgIC8vIENsaXAgdG8gdGhlIGRpcnR5UmVjdC4KKyAgICAgICAgICAgIHZpc2libGVUaWxl
QnVmZmVyUmVjdC5pbnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCFkaXJ0
eVJlY3QuaXNFbXB0eSgpICYmICF2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdmlzaWJsZVRpbGVCdWZmZXIKKyAgICAg
ICAgICAgICAgICAgICAgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+dmlzaWJs
ZVRpbGVCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQodmlzaWJsZVRpbGVCdWZmZXIt
PnNpemUoKSA9PSB2aXNpYmxlQ29udGVudHNSZWN0KCkuc2l6ZSgpKTsKKworICAgICAgICAgICAg
ICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgd2l0aCB0aGUgdmlzYmxl
IHRpbGUgYnVmZmVyLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBkaWZmZXJl
bmNlID0gb3JpZ2luIC0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QubG9jYXRpb24oKTsKKyAgICAg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBvZmZzZXQgPSBQbGF0Zm9ybTo6SW50U2l6ZShk
aWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkpOworCisgICAgICAgICAgICAgICAgLy8gTWFw
IHRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlciBjb29yZGluYXRlcy4KKyAgICAgICAgICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdmlzaWJsZVRpbGVCdWZmZXJSZWN0Owor
ICAgICAgICAgICAgICAgIGRpcnR5VGlsZVJlY3QubW92ZShvZmZzZXQud2lkdGgoKSwgb2Zmc2V0
LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVj
dFQgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBCZWNhdXNlIG9mIHJvdW5kaW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgZGlydHlSZWN0IGNv
dWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhl
IHN1cmZhY2Ugc2l6ZSBvZiB0aGUgZHN0IGJ1ZmZlci4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5
IGNsYW1waW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRvIGVuc3VyZSB0aGF0IGNhbid0
IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgZGlydHlSZWN0VC5pbnRlcnNlY3QoUGxhdGZv
cm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgp
LT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGJsaXRUb1dpbmRvdyhkaXJ0eVJlY3RULAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlci0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5VGlsZVJlY3QsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxlbmQqLywgMjU1KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIGlmIChjb21taXR0ZWQpIHsKKyAgICAgICAgICAgIC8vIEludGVyc2Vj
dCB0aGUgcmVuZGVyZWQgcmVnaW9uLgorICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdp
b24gcmVuZGVyZWRSZWdpb24gPSB0aWxlQnVmZmVyLT5yZW5kZXJlZFJlZ2lvbigpOworICAgICAg
ICAgICAgSW50UmVjdExpc3QgZGlydHlSZW5kZXJlZFJlY3RzID0gcmVuZGVyZWRSZWdpb24ucmVj
dHMoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlydHlSZW5kZXJlZFJl
Y3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7Cisg
ICAgICAgICAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgICAgICAgICB0
aWxlUmVjdC5zZWNvbmQgPSBpbnRlcnNlY3Rpb24oZGlydHlUaWxlUmVjdCwgZGlydHlSZW5kZXJl
ZFJlY3RzLmF0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVJlY3Quc2Vjb25kLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8g
QmxpdCB0aGUgcmVuZGVyZWQgcGFydHMuCisgICAgICAgICAgICAgICAgYmxpdFRpbGVSZWN0KHRp
bGVCdWZmZXIsIHRpbGVSZWN0LCBvcmlnaW4sIHRyYW5zZm9ybWF0aW9uLCBjdXJyZW50U3RhdGUp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxpdHRlZFRpbGVzLmFwcGVuZCh0aWxlQnVm
ZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAoYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpIHsKKyAgICAg
ICAgV2ViQ29yZTo6RmxvYXRSZWN0IGNvbnRlbnRzUmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwRnJv
bVRyYW5zZm9ybWVkRmxvYXRSZWN0KAorICAgICAgICAgICAgV2ViQ29yZTo6RmxvYXRSZWN0KFdl
YkNvcmU6OkludFJlY3QoY29udGVudHMpKSk7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+ZHJhd1N1
YkxheWVycyhkc3RSZWN0LCBjb250ZW50c1JlY3QpOworICAgIH0gZWxzZSBpZiAoY29tcG9zaXRp
bmdTdXJmYWNlKQorICAgICAgICBibGVuZENvbXBvc2l0aW5nU3VyZmFjZShkc3RSZWN0KTsKKwor
I2VuZGlmCisKKyNpZiBFTkFCTEVfU0NST0xMQkFSUworICAgIGlmIChpc1Njcm9sbGluZ09yWm9v
bWluZygpICYmIG1fY2xpZW50LT5pc01haW5GcmFtZSgpKSB7CisgICAgICAgIGlmIChtX2NsaWVu
dC0+c2Nyb2xsc0hvcml6b250YWxseSgpKQorICAgICAgICAgICAgYmxpdEhvcml6b250YWxTY3Jv
bGxiYXIob3JpZ2luKTsKKyAgICAgICAgaWYgKG1fY2xpZW50LT5zY3JvbGxzVmVydGljYWxseSgp
KQorICAgICAgICAgICAgYmxpdFZlcnRpY2FsU2Nyb2xsYmFyKG9yaWdpbik7CisgICAgfQorI2Vu
ZGlmCisKKyNpZiBERUJVR19WSVNVQUxJWkUKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90
IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjouCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpCdWZmZXIqIHdpbmRvd0J1ZmZlciA9CisgICAgICAgIG1fd2ViUGFnZS0+
Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OkRyYXdhYmxlKiBidWZmZXJEcmF3YWJsZSA9CisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6bG9ja0J1ZmZlckRyYXdhYmxlKHdpbmRvd0J1ZmZlcik7Cisg
ICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
ID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNyZWF0ZVBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxlKTsKKyAgICBHcmFwaGljc0NvbnRleHQg
Z3JhcGhpY3NDb250ZXh0KGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KTsKKyAgICBGbG9h
dFJlY3Qgd2tWaWV3cG9ydCA9IEZsb2F0UmVjdCh2aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAg
IEZsb2F0UmVjdCB1aVZpZXdwb3J0ID0gRmxvYXRSZWN0KG1fd2ViUGFnZS0+Y2xpZW50KCktPnVz
ZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB3a1ZpZXdwb3J0
Lm1vdmUoLWNvbnRlbnRzLngoKSwgLWNvbnRlbnRzLnkoKSk7CisgICAgdWlWaWV3cG9ydC5tb3Zl
KC1jb250ZW50cy54KCksIC1jb250ZW50cy55KCkpOworCisgICAgZ3JhcGhpY3NDb250ZXh0LnNh
dmUoKTsKKworICAgIC8vIERyYXcgYSBibHVlIHJlY3QgZm9yIHRoZSB3ZWJraXQgdGhyZWFkIHZp
ZXdwb3J0LgorICAgIGdyYXBoaWNzQ29udGV4dC5zZXRTdHJva2VDb2xvcihXZWJDb3JlOjpDb2xv
cigwLCAwLCAyNTUpLCBXZWJDb3JlOjpDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBncmFwaGlj
c0NvbnRleHQuc3Ryb2tlUmVjdCh0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHdrVmlld3BvcnQpLCAx
LjApOworCisgICAgLy8gRHJhdyBhIHJlZCByZWN0IGZvciB0aGUgdWkgdGhyZWFkIHZpZXdwb3J0
LgorICAgIGdyYXBoaWNzQ29udGV4dC5zZXRTdHJva2VDb2xvcihXZWJDb3JlOjpDb2xvcigyNTUs
IDAsIDApLCBXZWJDb3JlOjpDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBncmFwaGljc0NvbnRl
eHQuc3Ryb2tlUmVjdCh0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHVpVmlld3BvcnQpLCAxLjApOwor
CisgICAgZ3JhcGhpY3NDb250ZXh0LnJlc3RvcmUoKTsKKworICAgIGRlbGV0ZSBidWZmZXJQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dDsKKyAgICByZWxlYXNlQnVmZmVyRHJhd2FibGUod2luZG93QnVm
ZmVyKTsKKyNlbmRpZgorCisgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0KTsKKworICAgIGlm
IChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBwdGhyZWFk
X211dGV4X2xvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKworICAgICAgICArK21fYmxpdEdl
bmVyYXRpb247CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYmxpdHRlZFRp
bGVzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgYmxpdHRlZFRpbGVzW2ldLT5zZXRCbGl0R2Vu
ZXJhdGlvbihtX2JsaXRHZW5lcmF0aW9uKTsKKworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NL
X1JFQUxUSU1FLCAmbV9jdXJyZW50QmxpdEVuZCk7CisgICAgICAgIG1fY3VycmVudEJsaXRFbmQu
dHZfbnNlYyArPSAzMCAqIDEwMDAgKiAxMDAwOworICAgICAgICBpZiAobV9jdXJyZW50QmxpdEVu
ZC50dl9uc2VjID49IDEwMDAwMDAwMDBMKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRCbGl0RW5k
LnR2X3NlYyAgKz0gMTsKKyAgICAgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZfbnNlYyAtPSAx
MDAwMDAwMDAwTDsKKyAgICAgICAgfQorCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZt
X2JsaXRHZW5lcmF0aW9uTG9jayk7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1fYmxp
dEdlbmVyYXRpb25Db25kKTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdT
dG9yZVByaXZhdGU6OmJsaXRUaWxlUmVjdChUaWxlQnVmZmVyKiB0aWxlQnVmZmVyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGlsZVJl
Y3QmIHRpbGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJDb3JlOjpUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKQoreworICAg
IGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0
dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRp
bGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOworCisgICAgLy8gVGhpcyBkaXJ0eSByZWN0IGlzIGlu
IHRpbGUgY29vcmRpbmF0ZXMsIGJ1dCBpdCBuZWVkcyB0byBiZSBpbgorICAgIC8vIHRyYW5zZm9y
bWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVj
dCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCwgc3RhdGUtPmJh
Y2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAvLyBOb3csIHRoaXMgZGlydHkgcmVjdCBpcyBpbiB0
cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKKyAgICAvLyB0cmFuc2Zvcm1l
ZCBjb250ZW50cywgYnV0IHVsdGltYXRlbHkgaXQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQKKyAg
ICAvLyBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQuCisgICAgZGlydHlSZWN0
Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKyAgICBkaXJ0eVJlY3QgPSBtYXRyaXgu
bWFwUmVjdChkaXJ0eVJlY3QpOworCisgICAgaWYgKCFtYXRyaXguaXNJZGVudGl0eSgpKSB7Cisg
ICAgICAgIC8vIEJlY2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMgcG9zc2libGUgdGhhdCBkaXJ0eVJl
Y3QgY291bGQgYmUgb2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFj
ZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBp
bmcKKyAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgorICAgICAgICBk
aXJ0eVJlY3QuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgw
LCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKyAg
ICB9CisKKyAgICBBU1NFUlQoIWRpcnR5UmVjdC5pc0VtcHR5KCkpOworICAgIEFTU0VSVCghZGly
dHlUaWxlUmVjdC5pc0VtcHR5KCkpOworICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpIHx8IGRp
cnR5VGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3Qo
KTsKKworICAgIGJsaXRUb1dpbmRvdyhkaXJ0eVJlY3QsIHRpbGVCdWZmZXItPm5hdGl2ZUJ1ZmZl
cigpLCBkaXJ0eVRpbGVSZWN0LAorICAgICAgICAgICAgICAgICBmYWxzZSAvKmJsZW5kKi8sIDI1
NSk7CisgICAgcmV0dXJuIGRpcnR5UmVjdDsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZh
Y2UoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QpCit7CisgICAgaWYgKCFCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJy
ZW50VGhyZWFkKCkpIHsKKyAgICAgICAgdHlwZWRlZiB2b2lkIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUpKGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0Jik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFk
TWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rpb25UeXBlLCBCYWNraW5n
U3RvcmVQcml2YXRlLCBQbGF0Zm9ybTo6SW50UmVjdD4oCisgICAgICAgICAgICAgICAgJkJhY2tp
bmdTdG9yZVByaXZhdGU6OmJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlLCB0aGlzLCBkc3RSZWN0KSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1
cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlmICghY29tcG9zaXRp
bmdTdXJmYWNlIHx8ICFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBXZWJDb3JlOjpMYXllclJlbmRlcmluZ1Jlc3VsdHMgbGFzdENvbXBvc2l0aW5nUmVzdWx0
cyA9IG1fd2ViUGFnZS0+ZC0+bGFzdENvbXBvc2l0aW5nUmVzdWx0cygpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbGFzdENvbXBvc2l0aW5nUmVzdWx0cy5ob2xlUHVuY2hSZWN0U2l6ZSgp
OyBpKyspIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgaG9sZVB1bmNoUmVjdCA9IGxhc3RD
b21wb3NpdGluZ1Jlc3VsdHMuaG9sZVB1bmNoUmVjdChpKTsKKworICAgICAgICBob2xlUHVuY2hS
ZWN0LmludGVyc2VjdChkc3RSZWN0KTsKKyAgICAgICAgaG9sZVB1bmNoUmVjdC5pbnRlcnNlY3Qo
UGxhdGZvcm06OkludFJlY3QoCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCks
IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7CisKKyAgICAg
ICAgaWYgKCFob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNsZWFyV2luZG93
KGhvbGVQdW5jaFJlY3QsIDAsIDAsIDAsIDApOworICAgIH0KKworICAgIENvbXBvc2l0aW5nU3Vy
ZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGluZ1N1cmZhY2UtPmZyb250QnVmZmVy
KCk7CisKKyAgICBJbnRSZWN0TGlzdCByZWN0cyA9IGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMuZGly
dHlSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIHJlY3RzW2ldLmludGVyc2VjdChkc3RSZWN0KTsKKyNpZiBERUJV
R19DT01QT1NJVElOR19ESVJUWV9SRUdJT04KKyAgICAgICAgY2xlYXJCdWZmZXIobV93ZWJQYWdl
LT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpLCByZWN0c1tpXSwgMjU1LCAwLCAwLCAxMjgp
OworI2VuZGlmCisgICAgICAgIGJsaXRUb1dpbmRvdyhyZWN0c1tpXSwgZnJvbnRCdWZmZXItPm5h
dGl2ZUJ1ZmZlcigpLCByZWN0c1tpXSwgdHJ1ZSAvKmJsZW5kKi8sIDI1NSk7CisgICAgfQorfQor
Cit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCkKK3sK
KyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9
CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1
cmZhY2UoKTsKKworICAgIGlmICghY29tcG9zaXRpbmdTdXJmYWNlKQorICAgICAgICByZXR1cm47
CisKKyAgICBDb21wb3NpdGluZ1N1cmZhY2VCdWZmZXIqIGZyb250QnVmZmVyID0gY29tcG9zaXRp
bmdTdXJmYWNlLT5mcm9udEJ1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6Y2xlYXJCdWZmZXIoZnJvbnRCdWZmZXItPm5hdGl2ZUJ1ZmZlcigpLCBQbGF0Zm9ybTo6
SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoKSwgZnJvbnRCdWZmZXItPnN1cmZhY2VTaXplKCkp
LCAwLCAwLCAwLCAwKTsKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdEhvcml6b250YWxTY3JvbGxiYXIoY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbikKK3sKKyAgICBpZiAoIW1fd2Vi
UGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX2NsaWVu
dC0+c2Nyb2xsc0hvcml6b250YWxseSgpKTsKKworICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPmRy
YXdIb3Jpem9udGFsU2Nyb2xsYmFyKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
YmxpdFZlcnRpY2FsU2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc2Nyb2xsUG9z
aXRpb24pCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQobV9jbGllbnQtPnNjcm9sbHNWZXJ0aWNhbGx5KCkpOworCisgICAg
bV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd1ZlcnRpY2FsU2Nyb2xsYmFyKCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNUaWxlVmlzaWJsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4
KSBjb25zdAoreworICAgIFRpbGVSZWN0IHRpbGVSZWN0OworICAgIHRpbGVSZWN0LmZpcnN0ID0g
aW5kZXg7CisgICAgdGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICByZXR1
cm4gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KS5pbnRlcnNlY3Rz
KHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
aXNUaWxlVmlzaWJsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbikgY29uc3QKK3sK
KyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKS5pbnRlcnNl
Y3RzKHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tp
bmdTdG9yZVByaXZhdGU6OnZpc2libGVUaWxlc1JlY3QoKSBjb25zdAoreworICAgIEJhY2tpbmdT
dG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBj
dXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCByZWN0OworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAu
ZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0Owor
ICAgICAgICB0aWxlUmVjdC5maXJzdCA9IGl0LT5maXJzdDsKKyAgICAgICAgdGlsZVJlY3Quc2Vj
b25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZSA9
IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisgICAgICAgIGlm
ICh0aWxlLmludGVyc2VjdHModmlzaWJsZUNvbnRlbnRzUmVjdCgpKSkKKyAgICAgICAgICAgIHJl
Y3QgPSBQbGF0Zm9ybTo6dW5pb25PZlJlY3RzKHJlY3QsIHRpbGUpOworICAgIH0KKyAgICByZXR1
cm4gcmVjdDsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGls
ZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4JiBpbmRleCkgY29uc3QKK3sKKyAg
ICBpZiAoIWlzVGlsZVZpc2libGUoaW5kZXgpKQorICAgICAgICByZXR1cm4gUGxhdGZvcm06Oklu
dFJlY3QoKTsKKworICAgIHJldHVybiB0aWxlQ29udGVudHNSZWN0KGluZGV4LCB2aXNpYmxlQ29u
dGVudHNSZWN0KCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRl
Ojp0aWxlVW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4
KSBjb25zdAoreworICAgIGlmICghaXNUaWxlVmlzaWJsZShpbmRleCkpCisgICAgICAgIHJldHVy
biBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5k
ZXgsIHVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRS
ZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4
JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIGNvbnRlbnRzLCBmcm9udFN0YXRlKCkpOwor
fQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlQ29udGVudHNS
ZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRl
bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3QKK3sKKyAgICBUaWxlUmVjdExp
c3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnRl
bnRzLCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3QgPSB0aWxlUmVjdExpc3RbaV07
CisgICAgICAgIGlmIChpbmRleCA9PSB0aWxlUmVjdC5maXJzdCkKKyAgICAgICAgICAgIHJldHVy
biB0aWxlUmVjdC5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc2V0UmVuZGVyUXVldWUoKQorewor
ICAgIG1fcmVuZGVyUXVldWUtPnJlc2V0KCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6Y2xlYXJWaXNpYmxlWm9vbSgpCit7CisgICAgbV9yZW5kZXJRdWV1ZS0+Y2xlYXJWaXNpYmxl
Wm9vbSgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc2V0VGlsZXMoYm9vbCBy
ZXNldEJhY2tncm91bmQpCit7CisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0
ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUt
PnRpbGVNYXAoKTsKKworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRN
YXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRN
YXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICByZXNldFRpbGUoaXQtPmZpcnN0
LCBpdC0+c2Vjb25kLCByZXNldEJhY2tncm91bmQpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpCit7
CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBCYWNraW5nU3Rv
cmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAgY3Vy
cmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgVGlsZU1hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgYm9vbCBpc1Zpc2libGUgPSBpc1RpbGVWaXNpYmxlKGl0LT5maXJzdCk7CisgICAgICAg
IGlmICghdXBkYXRlVmlzaWJsZSAmJiBpc1Zpc2libGUpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgdXBkYXRlVGlsZShpdC0+Zmlyc3QsIGltbWVkaWF0ZSk7CisgICAgfQorfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJl
ZFJlZ2lvbihib29sIGNoZWNrTG9hZGluZykKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBsb29rcyBh
dCBhbGwgdGhlIHRpbGVzIGFuZCBpZiB0aGV5IGFyZSB2aXNpYmxlLCBidXQgbm90IGNvbXBsZXRl
bHkKKyAgICAvLyByZW5kZXJlZCBvciB3ZSBhcmUgbG9hZGluZywgdGhlbiBpdCB1cGRhdGVzIHRo
ZW0uIEZvciBhbGwgdGlsZXMsIHZpc2libGUgYW5kCisgICAgLy8gbm9uLXZpc2libGUsIGlmIGEg
cHJldmlvdXMgYXR0ZW1wdCB3YXMgbWFkZSB0byByZW5kZXIgdGhlbSBkdXJpbmcgYSByZWd1bGFy
CisgICAgLy8gcmVuZGVyIGpvYiwgYnV0IHRoZXkgd2VyZSBub3QgdmlzaWJsZSBhdCB0aGUgdGlt
ZSwgdGhlbiB1cGRhdGUgdGhlbSBhbmQgaWYKKyAgICAvLyB0aGV5IGFyZSBjdXJyZW50bHkgdmlz
aWJsZSwgcmVzZXQgdGhlbS4KKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3Rh
dGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRl
LT50aWxlTWFwKCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IGN1
cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpOworCisgICAgYm9vbCBpc0xvYWRpbmcgPSBt
X2NsaWVudC0+bG9hZFN0YXRlKCkgPT0gV2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZDsKKyAgICBi
b29sIGZvcmNlVmlzaWJsZSA9IGNoZWNrTG9hZGluZyAmJiBpc0xvYWRpbmc7CisKKyAgICBUaWxl
TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGls
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJh
Y2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOworICAgICAgICBib29sIGlzVmlzaWJs
ZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpOworICAgICAgICAvLyBUaGUgcmVjdCBpbiB0cmFuc2Zv
cm1lZCBjb250ZW50cyBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVj
dChvcmlnaW5PZlRpbGUoaW5kZXgpLCB0aWxlU2l6ZSgpKTsKKyAgICAgICAgaWYgKHRpbGUtPmlz
Q29tbWl0dGVkKCkKKyAgICAgICAgICAgICYmIG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJK
b2JzUHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKHJlY3QpKSB7CisgICAgICAgICAg
ICAvLyBJZiB0aGUgcmVuZGVyIHF1ZXVlIHByZXZpb3VzbHkgdHJpZWQgdG8gcmVuZGVyIHRoaXMg
dGlsZSwgYnV0IHRoZQorICAgICAgICAgICAgLy8gdGlsZSB3YXNuJ3QgdmlzaWJsZSBhdCB0aGUg
dGltZSB3ZSBjYW4ndCBzaW1wbHkgcmVzdG9yZSB0aGUgdGlsZQorICAgICAgICAgICAgLy8gc2lu
Y2UgdGhlIGNvbnRlbnQgaXMgbm93IGludmFsaWQgYXMgZmFyIGFzIFdlYktpdCBpcyBjb25jZXJu
ZWQuCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBjbGVhciB0aGF0IHBhcnQgb2YgdGhlIHRp
bGUgaWYgaXQgaXMgdmlzaWJsZSBhbmQgdGhlbgorICAgICAgICAgICAgLy8gcHV0IHRoZSB0aWxl
IGluIHRoZSByZW5kZXIgcXVldWUgYWdhaW4uCisgICAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7
CisgICAgICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSB0aWxlIHdpdGggdGhlIG5vdCByZW5k
ZXJlZCByZWdpb24gdG8gZ2V0IHRoZSBhcmVhcworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0
aWxlIHRoYXQgd2UgbmVlZCB0byBjbGVhci4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50
UmVjdFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdpb24KKyAgICAgICAgICAgICAgICAgICAgPSBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucygKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJKb2JzTm90UmVuZGVyZWRSZWdp
b24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgICAgICAgICAgICAgIGNs
ZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oaW5kZXgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZU5vdFJlbmRl
cmVkUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYmFja2luZ1N0b3JlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qdXBkYXRlKi8pOworI2lmIERFQlVHX0JB
Q0tJTkdTVE9SRQorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGV4dGVudHMgPSB0
aWxlTm90UmVuZGVyZWRSZWdpb24uZXh0ZW50cygpOworICAgICAgICAgICAgICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWws
CisgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlc0Zv
clNjcm9sbCBkaWQgY2xlYXIgdGlsZSAlZCwlZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAg
IGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53aWR0aCgpLCBleHRlbnRzLmhlaWdo
dCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlVGlsZShpbmRl
eCwgZmFsc2UgLyppbW1lZGlhdGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNWaXNpYmxlCisg
ICAgICAgICAgICAmJiAoZm9yY2VWaXNpYmxlIHx8ICF0aWxlLT5mcm9udEJ1ZmZlcigpLT5pc1Jl
bmRlcmVkKHRpbGVWaXNpYmxlQ29udGVudHNSZWN0KGluZGV4KSkpCisgICAgICAgICAgICAmJiAh
aXNDdXJyZW50VmlzaWJsZUpvYihpbmRleCwgdGlsZSwgYmFja2luZ1N0b3JlUmVjdCkpCisgICAg
ICAgICAgICB1cGRhdGVUaWxlKGluZGV4LCBmYWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICB9Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYg
aW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUsIGJvb2wgcmVzZXRCYWNrZ3JvdW5kKQorewor
ICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRU
aWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRpbGVS
ZWN0IHRpbGVSZWN0OworICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAgdGlsZVJlY3Qu
c2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAvLyBPbmx5IGNsZWFyIHJlZ3VsYXIgcmVu
ZGVyIGpvYnMgaWYgd2UncmUgY2xlYXJpbmcgdGhlIGJhY2tncm91bmQgdG9vLgorICAgIG1fcmVu
ZGVyUXVldWUtPmNsZWFyKG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVj
dCksIHJlc2V0QmFja2dyb3VuZCAvKmNsZWFyUmVndWxhclJlbmRlckpvYnMqLyk7CisgICAgaWYg
KHJlc2V0QmFja2dyb3VuZCkKKyAgICAgICAgdGlsZS0+cmVzZXQoKTsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wg
aW1tZWRpYXRlKQoreworICAgIGlmICghaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICB0
aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHVwZGF0ZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3Qp
OworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBpc1RpbGVWaXNpYmxlKGluZGV4
KSA/IFJlbmRlclF1ZXVlOjpWaXNpYmxlU2Nyb2xsIDogUmVuZGVyUXVldWU6Ok5vblZpc2libGVT
Y3JvbGw7CisgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgcmVuZGVyKHVwZGF0ZVJlY3QsIHRy
dWUgLypyZW5kZXJDb250ZW50T25seSovKTsKKyAgICBlbHNlCisgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmFkZFRvUXVldWUoam9iVHlwZSwgdXBkYXRlUmVjdCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbiwg
Ym9vbCBpbW1lZGlhdGUpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB1cGRhdGVSZWN0ID0gUGxhdGZvcm06OkludFJlY3Qo
b3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICBSZW5kZXJRdWV1ZTo6Sm9iVHlwZSBqb2JUeXBlID0g
aXNUaWxlVmlzaWJsZShvcmlnaW4pID8gUmVuZGVyUXVldWU6OlZpc2libGVTY3JvbGwgOiBSZW5k
ZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9sbDsKKyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICBy
ZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAvKnJlbmRlckNvbnRlbnRPbmx5Ki8pOworICAgIGVsc2UK
KyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShqb2JUeXBlLCB1cGRhdGVSZWN0KTsK
K30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVz
VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0
JiB0aWxlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1l
ZENvbnRlbnRzKHRpbGVSZWN0LCBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKSk7Cit9
CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21UaWxlc1Rv
VHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdCYg
dGlsZVJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25z
dAoreworICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IHJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7CisgICAgLy8gVGhlIG9yaWdpbiBvZiB0
aGUgdGlsZSBpbmNsdWRpbmcgdGhlIGJhY2tpbmcgc3RvcmUgb2Zmc2V0LgorICAgIGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZlRpbGUgPSB0aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgs
IGJhY2tpbmdTdG9yZVJlY3QpOworICAgIHJlY3QubW92ZShvcmlnaW5PZlRpbGUueCgpLCBvcmln
aW5PZlRpbGUueSgpKTsKKyAgICByZXR1cm4gcmVjdDsKK30KKworQmFja2luZ1N0b3JlUHJpdmF0
ZTo6VGlsZVJlY3RMaXN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZENv
bnRlbnRzVG9BYnNvbHV0ZVRpbGVCb3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0KSBjb25zdAoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3Rp
dmUoKSkgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFRp
bGVSZWN0TGlzdCgpOworICAgIH0KKworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3Q7Cisg
ICAgaW50IGZpcnN0WE9mZnNldCA9IHJlY3QueCgpIC8gdGlsZVdpZHRoKCk7CisgICAgaW50IGZp
cnN0WU9mZnNldCA9IHJlY3QueSgpIC8gdGlsZUhlaWdodCgpOworICAgIGludCBsYXN0WE9mZnNl
dCA9IChyZWN0LnJpZ2h0KCkgLSAxKSAvIHRpbGVXaWR0aCgpOworICAgIGludCBsYXN0WU9mZnNl
dCA9IChyZWN0LmJvdHRvbSgpIC0gMSkgLyB0aWxlSGVpZ2h0KCk7CisgICAgZm9yIChpbnQgaSA9
IGZpcnN0WE9mZnNldDsgaSA8PSBsYXN0WE9mZnNldDsgKytpKSB7CisgICAgICAgIGZvciAoaW50
IGogPSBmaXJzdFlPZmZzZXQ7IGogPD0gbGFzdFlPZmZzZXQ7ICsraikgeworICAgICAgICAgICAg
Y29uc3QgaW50IGRzdFggPSAoaSA9PSBmaXJzdFhPZmZzZXQpID8gcmVjdC54KCkgOiBpICogdGls
ZVdpZHRoKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgZHN0WSA9IChqID09IGZpcnN0WU9mZnNl
dCkgPyByZWN0LnkoKSA6IGogKiB0aWxlSGVpZ2h0KCk7CisgICAgICAgICAgICBjb25zdCBpbnQg
ZHN0UmlnaHQgPSAoaSA9PSBsYXN0WE9mZnNldCkgPyByZWN0LnJpZ2h0KCkgOiAoaSArIDEpICog
dGlsZVdpZHRoKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgZHN0Qm90dG9tID0gKGogPT0gbGFz
dFlPZmZzZXQpID8gcmVjdC5ib3R0b20oKSA6IChqICsgMSkgKiB0aWxlSGVpZ2h0KCk7CisgICAg
ICAgICAgICBjb25zdCBpbnQgc3JjWCA9IGRzdFggJSB0aWxlV2lkdGgoKTsKKyAgICAgICAgICAg
IGNvbnN0IGludCBzcmNZID0gZHN0WSAlIHRpbGVIZWlnaHQoKTsKKyAgICAgICAgICAgIFRpbGVS
ZWN0IHRpbGVSZWN0OworICAgICAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBUaWxlSW5kZXgoaSwg
aik7CisgICAgICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSBQbGF0Zm9ybTo6SW50UmVjdChzcmNY
LCBzcmNZLCBkc3RSaWdodCAtIGRzdFgsIGRzdEJvdHRvbSAtIGRzdFkpOworICAgICAgICAgICAg
dGlsZVJlY3RMaXN0LmFwcGVuZCh0aWxlUmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0
dXJuIHRpbGVSZWN0TGlzdDsKK30KKworCitCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdExp
c3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVz
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtYXBG
cm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMocmVjdCwgZnJvbnRTdGF0ZSgpKTsKK30KKwor
QmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3RMaXN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1h
cEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
cmVjdCwgQmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKSBjb25zdAoreworICAgIFRpbGVNYXAg
dGlsZU1hcCA9IHN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBUaWxlUmVjdExpc3QgdGlsZVJlY3RM
aXN0OworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHRpbGVNYXAuZW5kKCk7Cisg
ICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHRpbGVNYXAuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGl0LT5maXJzdDsKKyAg
ICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgLy8g
TmVlZCB0byBtYXAgdGhlIHJlY3QgdG8gdGlsZSBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZv
cm06OkludFJlY3QgciA9IHJlY3Q7CisKKyAgICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgdGls
ZSBpbmNsdWRpbmcgdGhlIGJhY2tpbmcgc3RvcmUgb2Zmc2V0LgorICAgICAgICBjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZUaWxlID0gdGhpcy0+b3JpZ2luT2ZUaWxlKGluZGV4LCBz
dGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKKworICAgICAgICByLm1vdmUoLShvcmlnaW5PZlRp
bGUueCgpKSwgLShvcmlnaW5PZlRpbGUueSgpKSk7CisKKyAgICAgICAgLy8gRG8gd2UgaW50ZXJz
ZWN0IHRoZSBjdXJyZW50IHRpbGUgb3Igbm8/CisgICAgICAgIHIuaW50ZXJzZWN0KHRpbGUtPnJl
Y3QoKSk7CisgICAgICAgIGlmIChyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIC8vIElmIHdlIGRvIGFwcGVuZCB0byBsaXN0IGFuZCBWb2lsYSEKKyAgICAgICAg
VGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAg
ICAgIHRpbGVSZWN0LnNlY29uZCA9IHI7CisgICAgICAgIHRpbGVSZWN0TGlzdC5hcHBlbmQodGls
ZVJlY3QpOworICAgIH0KKyAgICByZXR1cm4gdGlsZVJlY3RMaXN0OworfQorCit2b2lkIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVNYXRyaXhJZk5lZWRlZCgpCit7CisgICAgLy8gVGhp
cyB3aWxsIHVwZGF0ZSB0aGUgdGlsZSBtYXRyaXguCisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKDAs
IDApOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNvbnRlbnRzU2l6ZUNoYW5nZWQo
Y29uc3QgUGxhdGZvcm06OkludFNpemUmKQoreworICAgIHVwZGF0ZVRpbGVNYXRyaXhJZk5lZWRl
ZCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbENoYW5nZWQoY29uc3Qg
UGxhdGZvcm06OkludFBvaW50JikKK3sKKyAgICAvLyBGSVhNRTogTmVlZCB0byBkbyBhbnl0aGlu
ZyBoZXJlPworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRyYW5zZm9ybUNoYW5nZWQo
KQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlc2V0KCk7
CisgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlZpc2libGVa
b29tLCB2aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNo
b3VsZFJlc2V0VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOwor
ICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAg
Ym9vbCBoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IgPSBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50
VmlzaWJsZVpvb21Kb2IoKTsKKyAgICBib29sIGlzTG9hZGluZyA9IG1fY2xpZW50LT5pc0xvYWRp
bmcoKTsKKyAgICBpZiAoaXNMb2FkaW5nKSB7CisgICAgICAgIGlmICghaGFzQ3VycmVudFZpc2li
bGVab29tSm9iKQorICAgICAgICAgICAgbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QgPSB2aXNpYmxl
Q29udGVudHNSZWN0KCk7IC8vIENhY2hlIHRoaXMgZm9yIGJsaXRWaXNpYmxlQ29udGVudHMuCisK
KyAgICAgICAgLy8gQWRkIHRoZSBjdXJyZW50bHkgdmlzaWJsZSB0aWxlcyB0byB0aGUgcmVuZGVy
IHF1ZXVlIGFzIHZpc2libGUgem9vbSBqb2JzLgorICAgICAgICBUaWxlUmVjdExpc3QgdGlsZVJl
Y3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKHZpc2libGVDb250ZW50
c1JlY3QoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZVJlY3RMaXN0LnNp
emUoKTsgKytpKSB7CisgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlz
dFtpXTsKKyAgICAgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAg
ICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0LnNlY29u
ZDsKKyAgICAgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50TWFwLmdldChp
bmRleCk7CisKKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHdob2xlIHJlY3QuCisgICAg
ICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgICAgICAgICAg
UGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0ID0gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENv
bnRlbnRzKHRpbGVSZWN0KTsKKyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUo
UmVuZGVyUXVldWU6OlZpc2libGVab29tLCB3aG9sZVJlY3QpOworCisgICAgICAgICAgICAvLyBD
b3B5IHRoZSB2aXNpYmxlIGNvbnRlbnRzIGludG8gdGhlIHZpc2libGVUaWxlQnVmZmVyIGlmIHdl
IGRvbid0IGhhdmUKKyAgICAgICAgICAgIC8vIGFueSBjdXJyZW50IHZpc2libGUgem9vbSBqb2Jz
LgorICAgICAgICAgICAgaWYgKCFoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IpIHsKKyAgICAgICAg
ICAgICAgICAvLyBNYXAgdG8gdGhlIGRlc3RpbmF0aW9uJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCisg
ICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVuY2UgPSB0aGlzLT5vcmln
aW5PZlRpbGUoaW5kZXgpIC0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QubG9jYXRpb24oKTsKKyAg
ICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBvZmZzZXQgPSBQbGF0Zm9ybTo6SW50U2l6
ZShkaWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkpOworICAgICAgICAgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IGRpcnR5VGlsZVJlY3Q7CisgICAgICAgICAgICAgICAg
ZGlydHlSZWN0Lm1vdmUob2Zmc2V0LndpZHRoKCksIG9mZnNldC5oZWlnaHQoKSk7CisKKyAgICAg
ICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB2aXNpYmxlVGlsZUJ1ZmZlcgorICAgICAgICAg
ICAgICAgICAgICA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT52aXNpYmxlVGls
ZUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIEFTU0VSVCh2aXNpYmxlVGlsZUJ1ZmZlci0+c2l6
ZSgpID09IFBsYXRmb3JtOjpJbnRTaXplKG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtZWRWaWV3cG9y
dFNpemUoKSkpOworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGlj
czo6YmxpdFRvQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlci0+
ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5UmVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5VGlsZVJlY3Qp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9yZW5kZXJRdWV1ZS0+
cmVzZXQoKTsKKyAgICByZXNldFRpbGVzKHRydWUgLypyZXNldEJhY2tncm91bmQqLyk7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZW50YXRpb25DaGFuZ2VkKCkKK3sKKyAgICB1
cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQoKTsKKyAgICBjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlcigp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmFjdHVhbFZpc2libGVTaXplQ2hhbmdl
ZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgc2l6ZSkKK3sKK30KKworc3RhdGljIHZvaWQgY3Jl
YXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorewor
ICAgIEFTU0VSVChwYWdlKTsKKyAgICBTdXJmYWNlUG9vbCogc3VyZmFjZVBvb2wgPSBTdXJmYWNl
UG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKTsKKyAgICBzdXJmYWNlUG9vbC0+aW5pdGlhbGl6ZVZp
c2libGVUaWxlQnVmZmVyKHBhZ2UtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNyZWF0ZVN1cmZhY2VzKCkKK3sKKyAgICBCYWNraW5n
U3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAg
Y3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgQVNTRVJUKGN1cnJl
bnRNYXAuaXNFbXB0eSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKSB7Cisg
ICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGFzIHBhcnQgb2Ygc2V0
dGluZyB1cCBhIG5ldyB3ZWIgcGFnZSBpbnN0YW5jZSBhbmQKKyAgICAgICAgLy8gYmVmb3JlIHNh
aWQgaW5zdGFuY2UgaXMgbWFkZSB2aXNpYmxlIHNvIGFzIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQg
ZGVmaW5pdGlvbiBvZiB3ZWIKKyAgICAgICAgLy8gcGFnZSB2aXNpYmlsaXR5LiBUaGF0IGlzLCBh
IHdlYiBwYWdlIGlzIHNhaWQgdG8gYmUgdmlzaWJsZSB3aGVuIGV4cGxpY2l0bHkgbWFkZSB2aXNp
YmxlLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplKHRpbGVTaXplKCkpOwor
CisgICAgaWYgKHN1cmZhY2VQb29sLT5pc0VtcHR5KCkpIC8vIFNldHRpbmdzIHNwZWNpZnkgMCB0
aWxlcyAvIG5vIGJhY2tpbmcgc3RvcmUuCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IERp
dmlzb3IgZGl2aXNvciA9IGJlc3REaXZpc29yKGV4cGFuZGVkQ29udGVudHNTaXplKCksIHRpbGVX
aWR0aCgpLCB0aWxlSGVpZ2h0KCksIG1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSgpLCBtaW5pbXVt
TnVtYmVyT2ZUaWxlc0hpZ2goKSwgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGltZW5zaW9uKTsKKwor
ICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGRpdmlzb3IuZmlyc3Q7CisgICAgaW50IG51bWJl
ck9mVGlsZXNIaWdoID0gZGl2aXNvci5zZWNvbmQ7CisKKyAgICBjb25zdCBTdXJmYWNlUG9vbDo6
VGlsZUxpc3QgdGlsZUxpc3QgPSBzdXJmYWNlUG9vbC0+dGlsZUxpc3QoKTsKKyAgICBBU1NFUlQo
c3RhdGljX2Nhc3Q8aW50Pih0aWxlTGlzdC5zaXplKCkpID49IChudW1iZXJPZlRpbGVzV2lkZSAq
IG51bWJlck9mVGlsZXNIaWdoKSk7CisKKyAgICBUaWxlTWFwIG5ld1RpbGVNYXA7CisgICAgZm9y
IChpbnQgeSA9IDA7IHkgPCBudW1iZXJPZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAo
aW50IHggPSAwOyB4IDwgbnVtYmVyT2ZUaWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGls
ZUluZGV4IGluZGV4KHgsIHkpOworICAgICAgICAgICAgbmV3VGlsZU1hcC5hZGQoaW5kZXgsIHRp
bGVMaXN0LmF0KHggKyB5ICogbnVtYmVyT2ZUaWxlc1dpZGUpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYmFja2luZ3N0b3JlIGdlb21l
dHJ5LgorICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzV2lkZShkaXZpc29yLmZpcnN0
KTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0TnVtYmVyT2ZUaWxlc0hpZ2goZGl2aXNvci5zZWNvbmQp
OworICAgIGJhY2tTdGF0ZSgpLT5zZXRUaWxlTWFwKG5ld1RpbGVNYXApOworCisgICAgLy8gU3dh
cCBiYWNrL2Zyb250IHN0YXRlLgorICAgIHN3YXBTdGF0ZSgpOworCisgICAgY3JlYXRlVmlzaWJs
ZVRpbGVCdWZmZXJGb3JXZWJQYWdlKG1fd2ViUGFnZS0+ZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXIoKQoreworICAgIGlmICghbV93ZWJQ
YWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKG1fd2ViUGFnZS0+ZCk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRQb2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmlnaW5PZlRpbGUoY29uc3Qg
VGlsZUluZGV4JiBpbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3JpZ2luT2ZUaWxlKGluZGV4
LCBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRQ
b2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiBp
bmRleCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7
CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRQb2ludChiYWNraW5nU3RvcmVSZWN0LngoKSArIChp
bmRleC5pKCkgKiB0aWxlV2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
YWNraW5nU3RvcmVSZWN0LnkoKSArIChpbmRleC5qKCkgKiB0aWxlSGVpZ2h0KCkpKTsKK30KKwor
aW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSgpIGNvbnN0
Cit7CisgICAgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbGVzIHdpZGUgcmVxdWlyZWQgdG8g
ZmlsbCB0aGUgdmlld3BvcnQgKyAxIHRpbGUgZXh0cmEgdG8gYWxsb3cgc2Nyb2xsaW5nLgorICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdw
b3J0U2l6ZSgpLndpZHRoKCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odGlsZVdpZHRoKCkpKSkgKyAx
OworfQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNIaWdo
KCkgY29uc3QKK3sKKyAgICAvLyBUaGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgaGlnaCByZXF1
aXJlZCB0byBmaWxsIHRoZSB2aWV3cG9ydCArIDEgdGlsZSBleHRyYSB0byBhbGxvdyBzY3JvbGxp
bmcuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYobV9jbGllbnQtPnRyYW5zZm9y
bWVkVmlld3BvcnRTaXplKCkuaGVpZ2h0KCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odGlsZUhlaWdo
dCgpKSkpICsgMTsKK30KKworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
ZXhwYW5kZWRDb250ZW50c1NpemUoKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+dHJh
bnNmb3JtZWRDb250ZW50c1NpemUoKS5leHBhbmRlZFRvKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSgpKTsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVXaWR0aCgp
Cit7CisgICAgc3RhdGljIGludCB0dyA9IDA7CisgICAgaWYgKCF0dykKKyAgICAgICAgdHcgPSBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlV2lkdGgoKTsK
KyAgICByZXR1cm4gdHc7Cit9CisKK2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlSGVpZ2h0
KCkKK3sKKyAgICBzdGF0aWMgaW50IHRoID0gMDsKKyAgICBpZiAoIXRoKQorICAgICAgICB0aCA9
IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U2NyZWVuOjpsYW5kc2NhcGVIZWlnaHQo
KTsKKyAgICByZXR1cm4gdGg7Cit9CisKK1BsYXRmb3JtOjpJbnRTaXplIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnRpbGVTaXplKCkKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFNpemUodGlsZVdp
ZHRoKCksIHRpbGVIZWlnaHQoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9y
ZVByaXZhdGU6OnRpbGVSZWN0KCkKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3QoMCwg
MCwgdGlsZVdpZHRoKCksIHRpbGVIZWlnaHQoKSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6cmVuZGVyQ29udGVudHMoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZm
ZXIqIHRpbGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc3VyZmFjZU9mZnNldCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRl
bnRzUmVjdCkgY29uc3QKK3sKKyAgICAvLyBJZiB0aWxlQnVmZmVyID09IDAsIHdlIHJlbmRlciBk
aXJlY3RseSB0byB0aGUgd2luZG93LgorICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSAm
JiB0aWxlQnVmZmVyKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dM
ZXZlbENyaXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVBy
aXZhdGU6OnJlbmRlckNvbnRlbnRzIHRpbGVCdWZmZXI9MHgleCBzdXJmYWNlT2Zmc2V0PSglZCwl
ZCkgY29udGVudHNSZWN0PSglZCwlZCAlZHglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgdGlsZUJ1ZmZlciwgc3VyZmFjZU9mZnNldC54KCksIHN1cmZhY2VPZmZzZXQueSgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNSZWN0LngoKSwgY29udGVudHNSZWN0Lnko
KSwgY29udGVudHNSZWN0LndpZHRoKCksIGNvbnRlbnRzUmVjdC5oZWlnaHQoKSk7CisjZW5kaWYK
KworICAgIC8vIEl0IGlzIHVwIHRvIGNhbGxlcnMgb2YgdGhpcyBtZXRob2QgdG8gcGVyZm9ybSBs
YXlvdXQgdGhlbXNlbHZlcyEKKyAgICBBU1NFUlQoIW1fd2ViUGFnZS0+ZC0+bWFpbkZyYW1lKCkt
PnZpZXcoKS0+bmVlZHNMYXlvdXQoKSk7CisKKyAgICBQbGF0Zm9ybTo6SW50U2l6ZSBjb250ZW50
c1NpemUgPSBtX2NsaWVudC0+Y29udGVudHNTaXplKCk7CisgICAgQ29sb3IgYmFja2dyb3VuZENv
bG9yKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+YmFja2dyb3VuZENvbG9yKCkpOworCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIHRhcmdldEJ1ZmZlciA9IHRpbGVC
dWZmZXIKKyAgICAgICAgPyB0aWxlQnVmZmVyCisgICAgICAgIDogbV93ZWJQYWdlLT5jbGllbnQo
KS0+d2luZG93KCktPmJ1ZmZlcigpOworCisgICAgaWYgKGNvbnRlbnRzU2l6ZS5pc0VtcHR5KCkK
KyAgICAgICAgfHwgIVBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwg
bV9jbGllbnQtPnRyYW5zZm9ybWVkQ29udGVudHNTaXplKCkpLmNvbnRhaW5zKGNvbnRlbnRzUmVj
dCkKKyAgICAgICAgfHwgYmFja2dyb3VuZENvbG9yLmhhc0FscGhhKCkpIHsKKyAgICAgICAgLy8g
Q2xlYXIgdGhlIGFyZWEgaWYgaXQncyBub3QgZnVsbHkgY292ZXJlZCBieSAob3BhcXVlKSBjb250
ZW50cy4KKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QgY2xlYXJSZWN0ID0g
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QoCisgICAgICAgICAgICBjb250ZW50c1JlY3Qu
eCgpIC0gc3VyZmFjZU9mZnNldC54KCksIGNvbnRlbnRzUmVjdC55KCkgLSBzdXJmYWNlT2Zmc2V0
LnkoKSwKKyAgICAgICAgICAgIGNvbnRlbnRzUmVjdC53aWR0aCgpLCBjb250ZW50c1JlY3QuaGVp
Z2h0KCkpOworCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJC
dWZmZXIodGFyZ2V0QnVmZmVyLCBjbGVhclJlY3QsCisgICAgICAgICAgICBiYWNrZ3JvdW5kQ29s
b3IucmVkKCksIGJhY2tncm91bmRDb2xvci5ncmVlbigpLAorICAgICAgICAgICAgYmFja2dyb3Vu
ZENvbG9yLmJsdWUoKSwgYmFja2dyb3VuZENvbG9yLmFscGhhKCkpOworICAgIH0KKworICAgIGlm
IChjb250ZW50c1NpemUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgbV93ZWJQYWdlLT5kLT5jb21taXRSb290TGF5ZXJJ
Zk5lZWRlZCgpOworI2VuZGlmCisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6
OkRyYXdhYmxlKiBidWZmZXJEcmF3YWJsZSA9CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
OjpHcmFwaGljczo6bG9ja0J1ZmZlckRyYXdhYmxlKHRhcmdldEJ1ZmZlcik7CisKKyAgICBQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dCogYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPSBidWZm
ZXJEcmF3YWJsZQorICAgICAgICA/IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5j
cmVhdGVQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dChidWZmZXJEcmF3YWJsZSkKKyAgICAgICAgOiAw
OworICAgIFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KiB0YXJnZXRQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dCA9IGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0CisgICAgICAgID8gYnVmZmVyUGxh
dGZvcm1HcmFwaGljc0NvbnRleHQKKyAgICAgICAgOiBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFj
ZVBvb2woKS0+bG9ja1RpbGVSZW5kZXJpbmdTdXJmYWNlKCk7CisKKyAgICBBU1NFUlQodGFyZ2V0
UGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworCisgICAgeworICAgICAgICBHcmFwaGljc0NvbnRl
eHQgZ3JhcGhpY3NDb250ZXh0KHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KTsKKworICAg
ICAgICAvLyBCZWxpZXZlIGl0IG9yIG5vdCB0aGlzIGlzIGltcG9ydGFudCBzaW5jZSB0aGUgV2Vi
S2l0IFNraWEgYmFja2VuZAorICAgICAgICAvLyBkb2Vzbid0IHN0b3JlIHRoZSBvcmlnaW5hbCBz
dGF0ZSB1bmxlc3MgeW91IGNhbGwgc2F2ZSBmaXJzdCA6UAorICAgICAgICBncmFwaGljc0NvbnRl
eHQuc2F2ZSgpOworCisgICAgICAgIC8vIFRyYW5zbGF0ZSBjb250ZXh0IGFjY29yZGluZyB0byBv
ZmZzZXQuCisgICAgICAgIGdyYXBoaWNzQ29udGV4dC50cmFuc2xhdGUoLXN1cmZhY2VPZmZzZXQu
eCgpLCAtc3VyZmFjZU9mZnNldC55KCkpOworCisgICAgICAgIC8vIEFkZCBvdXIgdHJhbnNmb3Jt
YXRpb24gbWF0cml4IGFzIHRoZSBnbG9iYWwgdHJhbnNmb3JtLgorICAgICAgICBBZmZpbmVUcmFu
c2Zvcm0gYWZmaW5lVHJhbnNmb3JtKAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zv
cm1hdGlvbk1hdHJpeCgpLT5hKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9y
bWF0aW9uTWF0cml4KCktPmIoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3Jt
YXRpb25NYXRyaXgoKS0+YygpLAorICAgICAgICAgICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1h
dGlvbk1hdHJpeCgpLT5kKCksCisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0
aW9uTWF0cml4KCktPmUoKSwKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRp
b25NYXRyaXgoKS0+ZigpKTsKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LmNvbmNhdENUTShhZmZp
bmVUcmFuc2Zvcm0pOworCisgICAgICAgIC8vIE5vdyB0aGF0IHRoZSBtYXRyaXggaXMgYXBwbGll
ZCB3ZSBuZWVkIHVudHJhbmZvcm1lZCBjb250ZW50cyBjb29yZGluYXRlcy4KKyAgICAgICAgUGxh
dGZvcm06OkludFJlY3QgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdCA9IG1fd2ViUGFnZS0+ZC0+
bWFwRnJvbVRyYW5zZm9ybWVkKGNvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgLy8gV2UgZXh0cmFj
dCBmcm9tIHRoZSBjb250ZW50c1JlY3QgYnV0IGRyYXcgYSBzbGlnaHRseSBsYXJnZXIgcmVnaW9u
IHRoYW4KKyAgICAgICAgLy8gd2Ugd2VyZSB0b2xkIHRvLCBpbiBvcmRlciB0byBhdm9pZCBwaXhl
bHMgYmVpbmcgcmVuZGVyZWQgb25seSBwYXJ0aWFsbHkuCisgICAgICAgIGNvbnN0IGludCBhdExl
YXN0T25lRGV2aWNlUGl4ZWwgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihjZWlsZigx
LjAgLyBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4KCktPmEoKSkpOworICAgICAg
ICB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0LmluZmxhdGUoYXRMZWFzdE9uZURldmljZVBpeGVs
LCBhdExlYXN0T25lRGV2aWNlUGl4ZWwpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdW50
cmFuc2Zvcm1lZCByZWN0YW5nbGUgZm9yIHRoZSAoc2xpZ2h0bHkgbGFyZ2VyIHRoYW4KKyAgICAg
ICAgLy8gaW5pdGlhbGx5IHJlcXVlc3RlZCkgcmVwYWludGVkIHJlZ2lvbiBpcyB3aXRoaW4gdGhl
IGJvdW5kcyBvZiB0aGUgcGFnZS4KKyAgICAgICAgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdC5p
bnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBjb250
ZW50c1NpemUpKTsKKworICAgICAgICAvLyBTb21lIFdlYktpdCBwYWludGluZyBiYWNrZW5kcyAq
Y291Z2gqIFNraWEgKmNvdWdoKiBkb24ndCBzZXQgdGhpcyBhdXRvbWF0aWNhbGx5CisgICAgICAg
IC8vIHRvIHRoZSBkaXJ0eVJlY3Qgc28gZG8gc28gaGVyZSBleHBsaWNpdGx5LgorICAgICAgICBn
cmFwaGljc0NvbnRleHQuY2xpcCh1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0KTsKKworICAgICAg
ICAvLyBUYWtlIGNhcmUgb2YgcG9zc2libGUgbGVmdCBvdmVyZmxvdyBvbiBSVEwgcGFnZS4KKyAg
ICAgICAgaWYgKGludCBsZWZ0T3ZlckZsb3cgPSBtX2NsaWVudC0+ZnJhbWUoKS0+dmlldygpLT5t
aW5pbXVtU2Nyb2xsUG9zaXRpb24oKS54KCkpIHsKKyAgICAgICAgICAgIHVudHJhbnNmb3JtZWRD
b250ZW50c1JlY3QubW92ZShsZWZ0T3ZlckZsb3csIDApOworICAgICAgICAgICAgZ3JhcGhpY3ND
b250ZXh0LnRyYW5zbGF0ZSgtbGVmdE92ZXJGbG93LCAwKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIExldCBXZWJDb3JlIHJlbmRlciB0aGUgcGFnZSBjb250ZW50cyBpbnRvIHRoZSBkcmF3aW5n
IHN1cmZhY2UuCisgICAgICAgIG1fY2xpZW50LT5mcmFtZSgpLT52aWV3KCktPnBhaW50Q29udGVu
dHMoJmdyYXBoaWNzQ29udGV4dCwgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdCk7CisKKyNpZiBF
TkFCTEUoSU5TUEVDVE9SKQorICAgICAgICBpZiAobV93ZWJQYWdlLT5kLT5tX3BhZ2UtPmluc3Bl
Y3RvckNvbnRyb2xsZXIoKS0+ZW5hYmxlZCgpKSB7CisgICAgICAgICAgICBXZWJDb3JlOjpJbnRQ
b2ludCBzY3JvbGxQb3NpdGlvbiA9IG1fY2xpZW50LT5mcmFtZSgpLT52aWV3KCktPnNjcm9sbFBv
c2l0aW9uKCk7CisgICAgICAgICAgICBncmFwaGljc0NvbnRleHQudHJhbnNsYXRlKHNjcm9sbFBv
c2l0aW9uLngoKSwgc2Nyb2xsUG9zaXRpb24ueSgpKTsKKyAgICAgICAgICAgIG1fd2ViUGFnZS0+
ZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmRyYXdOb2RlSGlnaGxpZ2h0KGdyYXBo
aWNzQ29udGV4dCk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGdyYXBoaWNzQ29udGV4
dC5yZXN0b3JlKCk7CisgICAgfQorCisgICAgLy8gR3JhYiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBm
cm9tIHRoZSBkcmF3aW5nIHN1cmZhY2UgaW50byB0aGUgdGlsZSBpbWFnZS4KKyNpZiBVU0UoT1BF
TlZHKQorICAgIHN1cmZhY2UtPm1ha2VDdXJyZW50KCk7CisjZW5kaWYKKworICAgIGRlbGV0ZSBi
dWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDsKKworICAgIGlmIChidWZmZXJEcmF3YWJsZSkK
KyAgICAgICAgcmVsZWFzZUJ1ZmZlckRyYXdhYmxlKHRhcmdldEJ1ZmZlcik7CisgICAgZWxzZSB7
CisgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCBkc3RQb2ludChjb250ZW50c1JlY3Qu
eCgpIC0gc3VyZmFjZU9mZnNldC54KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBjb250ZW50c1JlY3QueSgpIC0gc3VyZmFjZU9mZnNldC55KCkpOworICAgICAg
ICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCBkc3RSZWN0KGRzdFBvaW50LCBjb250ZW50c1JlY3Qu
c2l6ZSgpKTsKKyAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3Qgc3JjUmVjdCA9IGRzdFJl
Y3Q7CisKKyAgICAgICAgLy8gSWYgd2UgY291bGRuJ3QgZGlyZWN0bHkgZHJhdyB0byB0aGUgYnVm
ZmVyLCBjb3B5IGZyb20gdGhlIGRyYXdpbmcgc3VyZmFjZS4KKyAgICAgICAgU3VyZmFjZVBvb2w6
Omdsb2JhbFN1cmZhY2VQb29sKCktPnJlbGVhc2VUaWxlUmVuZGVyaW5nU3VyZmFjZSh0YXJnZXRQ
bGF0Zm9ybUdyYXBoaWNzQ29udGV4dCk7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpH
cmFwaGljczo6YmxpdFRvQnVmZmVyKHRhcmdldEJ1ZmZlciwgZHN0UmVjdCwgQmxhY2tCZXJyeTo6
UGxhdGZvcm06OkdyYXBoaWNzOjpkcmF3aW5nU3VyZmFjZSgpLCBzcmNSZWN0KTsKKyAgICB9Cit9
CisKKyNpZiBERUJVR19GQVRfRklOR0VSUworc3RhdGljIHZvaWQgZHJhd0RlYnVnUmVjdChCbGFj
a0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyLCBjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHNyY1JlY3Qs
IHVuc2lnbmVkIGNoYXIgcmVkLCB1bnNpZ25lZCBjaGFyIGdyZWVuLCB1bnNpZ25lZCBjaGFyIGJs
dWUpCit7CisgICAgUGxhdGZvcm06OkludFJlY3QgZHJhd1JlY3Qoc3JjUmVjdCk7CisgICAgZHJh
d1JlY3QuaW50ZXJzZWN0KGRzdFJlY3QpOworICAgIGlmICghZHJhd1JlY3QuaXNFbXB0eSgpKQor
ICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFyQnVmZmVyKGRzdEJ1
ZmZlciwgZHJhd1JlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIDEyOCk7Cit9CisjZW5kaWYKKwordm9p
ZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25z
dCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciogc3JjQnVmZmVyLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29s
IGJsZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg
Y2hhciBnbG9iYWxBbHBoYSkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsKKwor
ICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJCbGl0dGVkUmVnaW9uKGRzdFJlY3Qp
OworICAgIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9uKGRzdFJlY3Qp
OworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZl
ciA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQo
ZHN0QnVmZmVyKTsKKyAgICBBU1NFUlQoc3JjQnVmZmVyKTsKKyAgICBpZiAoIWRzdEJ1ZmZlcikK
KyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwgY291bGRuJ3QgYmxpdFRvV2luZG93
Iik7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJsZW5kTW9kZSBibGVu
ZE1vZGUgPSBibGVuZAorICAgICAgICA/IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6
U291cmNlT3ZlcgorICAgICAgICA6IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6U291
cmNlQ29weTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6YmxpdFRvQnVm
ZmVyKGRzdEJ1ZmZlciwgZHN0UmVjdCwgc3JjQnVmZmVyLCBzcmNSZWN0LCBibGVuZE1vZGUsIGds
b2JhbEFscGhhKTsKKworI2lmIERFQlVHX0ZBVF9GSU5HRVJTCisgICAgZHJhd0RlYnVnUmVjdChk
c3RCdWZmZXIsIGRzdFJlY3QsIEZhdEZpbmdlcnM6Om1fZGVidWdGYXRGaW5nZXJSZWN0LCAyMTAs
IDIxMCwgMjUwKTsKKyAgICBkcmF3RGVidWdSZWN0KGRzdEJ1ZmZlciwgZHN0UmVjdCwgUGxhdGZv
cm06OkludFJlY3QoRmF0RmluZ2Vyczo6bV9kZWJ1Z0ZhdEZpbmdlckNsaWNrUG9zaXRpb24sIFBs
YXRmb3JtOjpJbnRTaXplKDMsIDMpKSwgMCwgMCwgMCk7CisgICAgZHJhd0RlYnVnUmVjdChkc3RC
dWZmZXIsIGRzdFJlY3QsIFBsYXRmb3JtOjpJbnRSZWN0KEZhdEZpbmdlcnM6Om1fZGVidWdGYXRG
aW5nZXJBZGp1c3RlZFBvc2l0aW9uLCBQbGF0Zm9ybTo6SW50U2l6ZSg1LCA1KSksIDEwMCwgMTAw
LCAxMDApOworI2VuZGlmCisKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjaGVja2Vy
V2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RSZWN0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgY29udGVu
dHNPcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91Ymxl
IGNvbnRlbnRzU2NhbGUpCit7CisgICAgQVNTRVJUKEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2Vy
SW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSk7CisKKyAg
ICB3aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsK
KyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsK
KworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBkc3RCdWZmZXIg
PSBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+YnVmZmVyKCk7CisgICAgQVNTRVJUKGRz
dEJ1ZmZlcik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsV2FybiwgIkVtcHR5IHdpbmRv
dyBidWZmZXIsIGNvdWxkbid0IGNoZWNrZXJXaW5kb3ciKTsKKworICAgIENvbG9yIGNvbG9yKG1f
d2ViUGFnZS0+c2V0dGluZ3MoKS0+YmFja2dyb3VuZENvbG9yKCkpOworICAgIHVuc2lnbmVkIGNo
YXIgYWxwaGEgPSBjb2xvci5hbHBoYSgpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6Y2hlY2tlckJ1ZmZlcihkc3RCdWZmZXIsIGRzdFJlY3QsIGNvbnRlbnRzT3JpZ2luLCBj
b250ZW50c1NjYWxlLCBhbHBoYSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW52
YWxpZGF0ZVdpbmRvdygpCit7CisgICAgLy8gR3JhYiBhIHJlY3QgYXBwcm9wcmlhdGUgZm9yIHRo
ZSBjdXJyZW50IHRocmVhZC4KKyAgICBpZiAoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRl
cmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKQorICAgICAgICBp
bnZhbGlkYXRlV2luZG93KG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVk
RGVzdGluYXRpb25SZWN0KCkpOworICAgIGVsc2UKKyAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhQ
bGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFu
c2Zvcm1lZFZpZXdwb3J0U2l6ZSgpKSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
aW52YWxpZGF0ZVdpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0KQoreworICAgIGlm
IChkc3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIUJsYWNrQmVycnk6
OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRU
aHJlYWQoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICAv
LyBUaGlzIG5lZWRzIHRvIGJlIHN5bmMgaW4gb3JkZXIgdG8gc3dhcCB0aGUgcmVjZW50bHkgZHJh
d24gdGhpbmcuLi4KKyAgICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgYmUgY2FsbGVkIGZyb20gV2Vi
S2l0IHRocmVhZCBkdXJpbmcgZGlyZWN0IHJlbmRlcmluZy4KKyAgICAgICAgdHlwZWRlZiB2b2lk
IChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUp
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3Jt
Ojp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaFN5bmNNZXNzYWdl
KAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNz
YWdlPEZ1bmN0aW9uVHlwZSwgQmFja2luZ1N0b3JlUHJpdmF0ZSwgUGxhdGZvcm06OkludFJlY3Q+
KAorICAgICAgICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2luZG93
LCB0aGlzLCBkc3QpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIERFQlVHX0JBQ0tJ
TkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2lu
ZG93IGRzdCA9ICVzIiwgZHN0LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisjZW5kaWYKKwor
ICAgIC8vIFNpbmNlIG91ciB3aW5kb3cgbWF5IGFsc28gYmUgZG91YmxlIGJ1ZmZlcmVkLCB3ZSBu
ZWVkIHRvIGFsc28gY29weSB0aGUKKyAgICAvLyBmcm9udCBidWZmZXIncyBjb250ZW50cyB0byB0
aGUgYmFjayBidWZmZXIgYmVmb3JlIHdlIHN3YXAgdGhlbS4gSXQgaXMKKyAgICAvLyBhbmFsb2dv
dXMgdG8gd2hhdCB3ZSBkbyB3aXRoIG91ciBkb3VibGUgYnVmZmVyZWQgdGlsZXMgYnkgY2FsbGlu
ZworICAgIC8vIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNraW5nU3VyZmFjZU9mVGlsZSgpLiBJ
dCBvbmx5IGFmZmVjdHMgcGFydGlhbAorICAgIC8vIHNjcmVlbiB1cGRhdGVzIHNpbmNlIHdoZW4g
d2UgYXJlIHNjcm9sbGluZyBvciB6b29taW5nLCB0aGUgd2hvbGUgd2luZG93CisgICAgLy8gaXMg
aW52YWxpZGF0ZWQgYW55d2F5cyBhbmQgbm8gY29weWluZyBpcyBuZWVkZWQuCisgICAgY29weVBy
ZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKworICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IGRzdFJlY3QgPSBkc3Q7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aWV3cG9ydFJl
Y3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9y
dFNpemUoKSk7CisgICAgZHN0UmVjdC5pbnRlcnNlY3Qodmlld3BvcnRSZWN0KTsKKworICAgIGlm
IChkc3RSZWN0LndpZHRoKCkgPD0gMCB8fCBkc3RSZWN0LmhlaWdodCgpIDw9IDApCisgICAgICAg
IHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5n
U3RvcmVQcml2YXRlOjppbnZhbGlkYXRlV2luZG93IHBvc3RpbmcgPSAlcyIsIGRzdFJlY3QudG9T
dHJpbmcoKS51dGY4KCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgbV9jdXJyZW50V2luZG93QmFj
a0J1ZmZlciA9IChtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVyICsgMSkgJSAyOworICAgIG1fd2Vi
UGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5wb3N0KGRzdFJlY3QpOworfQorCit2b2lkIEJhY2tp
bmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93KCkKK3sKKyAgICBpZiAoIUJsYWNrQmVycnk6OlBs
YXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRUaHJl
YWQoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICB0eXBl
ZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3JlUHJpdmF0ZTo6KkZ1bmN0
aW9uVHlwZSkoKTsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVzZXJJbnRlcmZhY2VU
aHJlYWRNZXNzYWdlQ2xpZW50KCktPmRpc3BhdGNoTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJh
Y2tpbmdTdG9yZVByaXZhdGU+KAorICAgICAgICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRl
OjpjbGVhcldpbmRvdywgdGhpcykpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFn
ZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsK
KyAgICBpZiAoIWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwg
Y291bGRuJ3QgY2xlYXJXaW5kb3ciKTsKKworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+
Y2xlYXJCbGl0dGVkUmVnaW9uKCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJs
aXR0ZWRSZWdpb24oUGxhdGZvcm06OkludFJlY3QoCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2lu
dCgwLCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsK
KworICAgIENvbG9yIGNvbG9yKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+YmFja2dyb3VuZENvbG9y
KCkpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZHN0
QnVmZmVyLAorICAgICAgICBjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3IuYmx1ZSgp
LCBjb2xvci5hbHBoYSgpKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhcldp
bmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciByZWQsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZ3JlZW4sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYmx1ZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBhbHBoYSkKK3sKKyAgICBpZiAo
IUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgp
LT5pc0N1cnJlbnRUaHJlYWQoKSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkg
eworICAgICAgICB0eXBlZGVmIHZvaWQgKEJsYWNrQmVycnk6OldlYktpdDo6QmFja2luZ1N0b3Jl
UHJpdmF0ZTo6KkZ1bmN0aW9uVHlwZSkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNo
YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dW5zaWduZWQgY2hhcik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJm
YWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rpb25UeXBl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IEJhY2tpbmdTdG9yZVByaXZhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNp
Z25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcj4oCisgICAgICAgICAgICAgICAg
JkJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyV2luZG93LCB0aGlzLCByZWN0LCByZWQsIGdyZWVu
LCBibHVlLCBhbHBoYSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZmZXIqIGRzdEJ1ZmZlciA9IG1fd2ViUGFnZS0+Y2xp
ZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBBU1NFUlQoZHN0QnVmZmVyKTsKKyAgICBp
ZiAoIWRzdEJ1ZmZlcikKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxXYXJuLCAiRW1wdHkgd2luZG93IGJ1ZmZlciwgY291bGRu
J3QgY2xlYXJXaW5kb3ciKTsKKworICAgIHdpbmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+Y2xlYXJC
bGl0dGVkUmVnaW9uKHJlY3QpOworICAgIHdpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0
dGVkUmVnaW9uKHJlY3QpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpj
bGVhckJ1ZmZlcihkc3RCdWZmZXIsIHJlY3QsIHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKK30K
KworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjppc1Njcm9sbGluZ09yWm9vbWluZygpIGNvbnN0
Cit7CisgICAgQmFja2luZ1N0b3JlTXV0ZXhMb2NrZXIgbG9ja2VyKGNvbnN0X2Nhc3Q8QmFja2lu
Z1N0b3JlUHJpdmF0ZSo+KHRoaXMpKTsKKyAgICByZXR1cm4gbV9pc1Njcm9sbGluZ09yWm9vbWlu
ZzsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRTY3JvbGxpbmdPclpvb21pbmco
Ym9vbCBzY3JvbGxpbmdPclpvb21pbmcsIGJvb2wgc2hvdWxkQmxpdCkKK3sKKyAgICB7CisgICAg
ICAgIEJhY2tpbmdTdG9yZU11dGV4TG9ja2VyIGxvY2tlcih0aGlzKTsKKyAgICAgICAgbV9pc1Nj
cm9sbGluZ09yWm9vbWluZyA9IHNjcm9sbGluZ09yWm9vbWluZzsKKyAgICB9CisKKyNpZiAhRU5B
QkxFX1JFUEFJTlRPTlNDUk9MTAorICAgIG1fc3VzcGVuZFJlbmRlckpvYnMgPSBzY3JvbGxpbmdP
clpvb21pbmc7IC8vIFN1c3BlbmQgdGhlIHJlbmRlcmluZyBvZiBldmVyeXRoaW5nLgorI2VuZGlm
CisKKyAgICBpZiAoIW1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+c2hvdWxkUmVuZGVyQW5pbWF0aW9u
c09uU2Nyb2xsT3Jab29tKCkpCisgICAgICAgIG1fc3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzID0g
c2Nyb2xsaW5nT3Jab29taW5nOyAvLyBTdXNwZW5kIHRoZSByZW5kZXJpbmcgb2YgYW5pbWF0aW9u
cy4KKworICAgIC8vIENsZWFyIHRoaXMgZmxhZyBzaW5jZSB3ZSBkb24ndCBjYXJlIGlmIHRoZSBy
ZW5kZXIgcXVldWUgaXMgdW5kZXIgcHJlc3N1cmUKKyAgICAvLyBvciBub3Qgc2luY2Ugd2UgYXJl
IHNjcm9sbGluZyBhbmQgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gbm90IGxhZyB0aGFuCisgICAg
Ly8gaXQgaXMgdG8gZW5zdXJlIGFuaW1hdGlvbnMgYWNoaWV2ZSBiZXR0ZXIgZnJhbWVyYXRlcyEK
KyAgICBpZiAoc2Nyb2xsaW5nT3Jab29taW5nKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5zZXRD
dXJyZW50UmVndWxhclJlbmRlckpvYkJhdGNoVW5kZXJQcmVzc3VyZShmYWxzZSk7CisjaWYgRU5B
QkxFX1NDUk9MTEJBUlMKKyAgICBlbHNlIGlmIChzaG91bGRCbGl0ICYmICFzaG91bGREaXJlY3RS
ZW5kZXJpbmdUb1dpbmRvdygpKQorICAgICAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisjZW5k
aWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpsb2NrQmFja2luZ1N0b3JlKCkKK3sK
KyAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbXV0ZXgpOworfQorCit2b2lkIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OnVubG9ja0JhY2tpbmdTdG9yZSgpCit7CisgICAgcHRocmVhZF9tdXRleF91bmxv
Y2soJm1fbXV0ZXgpOworfQorCitCYWNraW5nU3RvcmVHZW9tZXRyeSogQmFja2luZ1N0b3JlUHJp
dmF0ZTo6ZnJvbnRTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2Zyb250U3RhdGUpOworfQorCitCYWNraW5nU3RvcmVH
ZW9tZXRyeSogQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmFja1N0YXRlKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3RvcmVHZW9tZXRyeSo+KG1fYmFja1N0YXRl
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzd2FwU3RhdGUoKQoreworICAgIHVu
c2lnbmVkIGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oZnJvbnRTdGF0ZSgpKTsK
KyAgICB1bnNpZ25lZCBiYWNrID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4oYmFja1N0YXRl
KCkpOworCisgICAgLy8gQXRvbWljIGNoYW5nZS4KKyAgICBfc21wX3hjaGcoJm1fZnJvbnRTdGF0
ZSwgYmFjayk7CisgICAgX3NtcF94Y2hnKCZtX2JhY2tTdGF0ZSwgZnJvbnQpOworICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5j
VG9DdXJyZW50TWVzc2FnZSgpOworfQorCitCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSog
QmFja2luZ1N0b3JlUHJpdmF0ZTo6d2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuICZtX3dpbmRvd0J1ZmZlclN0YXRlWyhtX2N1cnJlbnRXaW5kb3dCYWNrQnVmZmVy
ICsgMSkgJSAyXTsKK30KKworQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUqIEJhY2tpbmdT
dG9yZVByaXZhdGU6OndpbmRvd0JhY2tCdWZmZXJTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJu
ICZtX3dpbmRvd0J1ZmZlclN0YXRlW21fY3VycmVudFdpbmRvd0JhY2tCdWZmZXJdOworfQorCisj
aWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorYm9vbCBCYWNraW5nU3RvcmVQcml2YXRl
OjpkcmF3U3ViTGF5ZXJzKCkKK3sKKyAgICBBU1NFUlQoQmxhY2tCZXJyeTo6UGxhdGZvcm06OnVz
ZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgpKTsKKyAg
ICBpZiAoIUJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNs
aWVudCgpLT5pc0N1cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
aWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRzdCA9IG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJ
bnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCk7CisgICAgaWYgKGRzdC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHNyYyA9IG1f
d2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVj
dCgpOworICAgIFdlYkNvcmU6OkZsb2F0UmVjdCBjb250ZW50c1JlY3QgPSBtX3dlYlBhZ2UtPmQt
Pm1hcEZyb21UcmFuc2Zvcm1lZEZsb2F0UmVjdCgKKyAgICAgICAgV2ViQ29yZTo6RmxvYXRSZWN0
KFdlYkNvcmU6OkludFJlY3Qoc3JjKSkpOworICAgIHJldHVybiBtX3dlYlBhZ2UtPmQtPmRyYXdT
dWJMYXllcnMoZHN0LCBjb250ZW50c1JlY3QpOworfQorI2VuZGlmCisKK2Jvb2wgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6aXNBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiBCYWNraW5nU3RvcmVQ
cml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9PSBtX3dlYlBhZ2UgJiYgIVN1cmZh
Y2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5pc0VtcHR5KCk7Cit9CisKK0JhY2tpbmdTdG9y
ZTo6QmFja2luZ1N0b3JlKFdlYlBhZ2UqIHdlYlBhZ2UsIEJhY2tpbmdTdG9yZUNsaWVudCogY2xp
ZW50KQorICAgIDogZChuZXcgQmFja2luZ1N0b3JlUHJpdmF0ZSkKK3sKKyAgICBkLT5tX3dlYlBh
Z2UgPSB3ZWJQYWdlOworICAgIGQtPm1fY2xpZW50ID0gY2xpZW50OworfQorCitCYWNraW5nU3Rv
cmU6On5CYWNraW5nU3RvcmUoKQoreworICAgIGRlbGV0ZSBkOworICAgIGQgPSAwOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZTo6Y3JlYXRlU3VyZmFjZSgpCit7CisgICAgc3RhdGljIGJvb2wgaW5p
dGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisgICAgICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6aW5pdGlhbGl6ZSgpOworICAgICAgICBpbml0aWFs
aXplZCA9IHRydWU7CisgICAgfQorCisjaWYgVVNFKE9QRU5WRykKKyAgICBkLT5tX2VnbERpc3Bs
YXkgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmVnbERpc3BsYXkoKTsKKworICAg
IC8vIE1ha2Ugc3VyZSB3ZSBhcmUgdXNpbmcgT3BlblZHLgorICAgIGVnbEJpbmRBUEkoRUdMX09Q
RU5WR19BUEkpOworICAgIEFTU0VSVF9FR0xfTk9fRVJST1IoKTsKKworICAgIEVHTERpc3BsYXlP
cGVuVkc6OnNldEN1cnJlbnREaXNwbGF5KGQtPm1fZWdsRGlzcGxheSk7CisjZW5kaWYKKworICAg
IC8vIFRyaWdnZXJzIGNyZWF0aW9uIG9mIHN1cmZhY2VzIGluIGJhY2tpbmdzdG9yZS4KKyAgICBk
LT5jcmVhdGVTdXJmYWNlcygpOworCisjaWYgVVNFKE9QRU5WRykKKyAgICBFR0xEaXNwbGF5T3Bl
blZHOjpjdXJyZW50KCktPnNoYXJlZFBsYXRmb3JtU3VyZmFjZSgpLT5tYWtlQ3VycmVudCgpOwor
I2VuZGlmCisKKyAgICAvLyBGb2N1c2luZyB0aGUgV2ViUGFnZSB0cmlnZ2VycyBhIHJlcGFpbnQs
IHNvIHdoaWxlIHdlIHdhbnQgaXQgdG8gYmUKKyAgICAvLyBmb2N1c2VkIGluaXRpYWxseSB0aGlz
IGhhcyB0byBoYXBwZW4gYWZ0ZXIgY3JlYXRpb24gb2YgdGhlIHN1cmZhY2UuCisgICAgZC0+bV93
ZWJQYWdlLT5zZXRGb2N1c2VkKHRydWUpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZTo6c3VzcGVu
ZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKQoreworICAgIGQtPnN1c3BlbmRTY3JlZW5B
bmRCYWNraW5nU3RvcmVVcGRhdGVzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXN1bWVT
Y3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKFJlc3VtZVVwZGF0ZU9wZXJhdGlvbiBvcCkKK3sK
KyAgICBkLT5yZXN1bWVTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKG9wKTsKK30KKworYm9v
bCBCYWNraW5nU3RvcmU6OmlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZC0+aXNTY3JvbGxpbmdPclpvb21pbmcoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNl
dFNjcm9sbGluZ09yWm9vbWluZyhib29sIHNjcm9sbGluZ09yWm9vbWluZykKK3sKKyAgICBkLT5z
ZXRTY3JvbGxpbmdPclpvb21pbmcoc2Nyb2xsaW5nT3Jab29taW5nKTsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmU6OmJsaXRDb250ZW50cyhjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVj
dCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRz
KQoreworICAgIC8vIEJsaXR0aW5nIGR1cmluZyBkaXJlY3QgcmVuZGVyaW5nIGlzIG5vdCBzdXBw
b3J0ZWQuCisgICAgaWYgKGlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkgeworICAgICAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENy
aXRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmU6OmJs
aXRDb250ZW50cyBvcGVyYXRpb24gbm90IHN1cHBvcnRlZCBpbiBkaXJlY3QgcmVuZGVyaW5nIG1v
ZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGQtPmJsaXRDb250ZW50cyhkc3RS
ZWN0LCBjb250ZW50cyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZXBhaW50KGludCB4LCBp
bnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
Ym9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpCit7CisgICAgZC0+cmVwYWludChQ
bGF0Zm9ybTo6SW50UmVjdCh4LCB5LCB3aWR0aCwgaGVpZ2h0KSwgY29udGVudENoYW5nZWQsIGlt
bWVkaWF0ZSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjpoYXNSZW5kZXJKb2JzKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZC0+c2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKTsKK30KKwordm9pZCBC
YWNraW5nU3RvcmU6OnJlbmRlck9uSWRsZSgpCit7CisgICAgZC0+cmVuZGVyT25JZGxlKCk7Cit9
CisKK2Jvb2wgQmFja2luZ1N0b3JlOjppc0RpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkgY29uc3QK
K3sKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2NrZXIoZCk7CisgICAgcmV0dXJuIGQt
PnNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3Jl
OjpkZWZlcnNCbGl0KCkgY29uc3QKK3sKKyAgICAgICAgcmV0dXJuIGQtPm1fZGVmZXJzQmxpdDsK
K30KKwordm9pZCBCYWNraW5nU3RvcmU6OnNldERlZmVyc0JsaXQoYm9vbCBiKQoreworICAgICAg
ICBkLT5tX2RlZmVyc0JsaXQgPSBiOworfQorCitib29sIEJhY2tpbmdTdG9yZTo6aGFzQmxpdEpv
YnMoKSBjb25zdAoreworICAgIC8vIE5vcm1hbGx5LCB0aGlzIHdvdWxkIGJlIGNhbGxlZCBmcm9t
IHRoZSBjb21wb3NpdGluZyB0aHJlYWQsCisgICAgLy8gYW5kIHRoZSBmbGFnIGlzIHNldCBvbiB0
aGUgY29tcG9zaXRpbmcgdGhyZWFkLCBzbyBubyBuZWVkIGZvcgorICAgIC8vIHN5bmNocm9uaXph
dGlvbi4KKyAgICByZXR1cm4gZC0+bV9oYXNCbGl0Sm9iczsKK30KKwordm9pZCBCYWNraW5nU3Rv
cmU6OmJsaXRPbklkbGUoKQoreworICAgIGQtPmJsaXRWaXNpYmxlQ29udGVudHModHJ1ZSAvKmZv
cmNlKi8pOworfQorCit9Cit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkv
QXBpL0JhY2tpbmdTdG9yZS5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5n
U3RvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjczMjY4Ci0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUu
aApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEx
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX2gKKyNkZWZpbmUgQmFja2luZ1N0
b3JlX2gKKworI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworY2xhc3MgQ2hyb21lQ2xpZW50QmxhY2tCZXJyeTsKK2NsYXNzIEZsb2F0UG9pbnQ7Citj
bGFzcyBGcmFtZUxvYWRlckNsaWVudEJsYWNrQmVycnk7CitjbGFzcyBHTEVTMkNvbnRleHQ7Citj
bGFzcyBJbnRSZWN0OworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgUGxh
dGZvcm0geworY2xhc3MgSW50UmVjdDsKK30KK30KKworbmFtZXNwYWNlIEJsYWNrQmVycnkgewor
bmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYlBhZ2U7CitjbGFzcyBXZWJQYWdlUHJpdmF0
ZTsKK2NsYXNzIEJhY2tpbmdTdG9yZVByaXZhdGU7CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7
CisKK2NsYXNzIEJMQUNLQkVSUllfRVhQT1JUIEJhY2tpbmdTdG9yZSB7CitwdWJsaWM6CisgICAg
ZW51bSBSZXN1bWVVcGRhdGVPcGVyYXRpb24geyBOb25lLCBCbGl0LCBSZW5kZXJBbmRCbGl0IH07
CisgICAgQmFja2luZ1N0b3JlKFdlYlBhZ2UqLCBCYWNraW5nU3RvcmVDbGllbnQqKTsKKyAgICB2
aXJ0dWFsIH5CYWNraW5nU3RvcmUoKTsKKworICAgIHZvaWQgY3JlYXRlU3VyZmFjZSgpOworCisg
ICAgdm9pZCBzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworICAgIHZvaWQg
cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhSZXN1bWVVcGRhdGVPcGVyYXRpb24p
OworCisgICAgYm9vbCBpc1Njcm9sbGluZ09yWm9vbWluZygpIGNvbnN0OworICAgIHZvaWQgc2V0
U2Nyb2xsaW5nT3Jab29taW5nKGJvb2wpOworCisgICAgdm9pZCBibGl0Q29udGVudHMoY29uc3Qg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cyk7CisgICAgdm9pZCByZXBhaW50KGludCB4LCBp
bnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGNvbnRlbnRDaGFuZ2VkLCBib29sIGlt
bWVkaWF0ZSk7CisKKyAgICBib29sIGhhc1JlbmRlckpvYnMoKSBjb25zdDsKKyAgICB2b2lkIHJl
bmRlck9uSWRsZSgpOworCisgICAgLy8gSW4gdGhlIGRlZmVycyBibGl0IG1vZGUsIGFueSBibGl0
IHJlcXVlc3RzIHdpbGwganVzdCByZXR1cm4gZWFybHksIGFuZAorICAgIC8vIGEgYmxpdCBqb2Ig
d2lsbCBiZSBxdWV1ZWQgdGhhdCBpcyBleGVjdXRlZCBieSBjYWxsaW5nIGJsaXRPbklkbGUoKS4K
KyAgICBib29sIGRlZmVyc0JsaXQoKSBjb25zdDsKKyAgICB2b2lkIHNldERlZmVyc0JsaXQoYm9v
bCk7CisKKyAgICBib29sIGhhc0JsaXRKb2JzKCkgY29uc3Q7CisgICAgdm9pZCBibGl0T25JZGxl
KCk7CisKKyAgICBib29sIGlzRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSBjb25zdDsKKworcHJp
dmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3RvcmVD
bGllbnQ7CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6OldlYktpdDo6V2ViUGFnZTsKKyAg
ICBmcmllbmQgY2xhc3MgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlUHJpdmF0ZTsgLy8gRklY
TUU6IEZvciBub3csIHdlIGV4cG9zZSBvdXIgaW50ZXJuYWxzIHRvIFdlYlBhZ2VQcml2YXRlLiBT
ZWUgUFIgIzEyMDMwMS4KKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6Q2hyb21lQ2xpZW50Qmxh
Y2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29yZTo6RnJhbWVMb2FkZXJDbGllbnRCbGFj
a0JlcnJ5OworICAgIGZyaWVuZCBjbGFzcyBXZWJDb3JlOjpHTEVTMkNvbnRleHQ7CisgICAgQmFj
a2luZ1N0b3JlUHJpdmF0ZSAqZDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBCYWNraW5nU3RvcmVf
aApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmVf
cC5oIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOWRlOTYKLS0tIC9kZXYvbnVsbAorKysg
Yi9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmgKQEAgLTAsMCAr
MSwzNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2lmbmRlZiBCYWNraW5nU3RvcmVfcF9oCisjZGVmaW5lIEJhY2tpbmdTdG9yZV9wX2gK
KworI2luY2x1ZGUgIkJhY2tpbmdTdG9yZS5oIgorI2luY2x1ZGUgIlJlbmRlclF1ZXVlLmgiCisj
aW5jbHVkZSAiVGlsZUluZGV4LmgiCisjaW5jbHVkZSAiVGlsZUluZGV4SGFzaC5oIgorI2luY2x1
ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3JhcGhpY3MuaD4KKyNp
bmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1HdWFyZGVkUG9pbnRlci5oPgorI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgVVNFKE9QRU5WRykK
KyNpbmNsdWRlIDxlZ2wuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CitjbGFzcyBJbnRSZWN0OworY2xhc3MgVHJhbnNmb3JtYXRpb25NYXRy
aXg7Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitj
bGFzcyBCYWNraW5nU3RvcmVUaWxlOworY2xhc3MgVGlsZUJ1ZmZlcjsKK2NsYXNzIFdlYlBhZ2U7
CitjbGFzcyBCYWNraW5nU3RvcmVDbGllbnQ7CisKK3R5cGVkZWYgV1RGOjpIYXNoTWFwPFRpbGVJ
bmRleCwgQmFja2luZ1N0b3JlVGlsZSo+IFRpbGVNYXA7CitjbGFzcyBCYWNraW5nU3RvcmVHZW9t
ZXRyeSB7CitwdWJsaWM6CisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkoKQorICAgICAgICA6IG1f
bnVtYmVyT2ZUaWxlc1dpZGUoMCkKKyAgICAgICAgLCBtX251bWJlck9mVGlsZXNIaWdoKDApCisg
ICAgeworICAgIH0KKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QoKSBj
b25zdDsKKyAgICBQbGF0Zm9ybTo6SW50U2l6ZSBiYWNraW5nU3RvcmVTaXplKCkgY29uc3Q7CisK
KyAgICBpbnQgbnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdCB7IHJldHVybiBtX251bWJlck9mVGls
ZXNXaWRlOyB9CisgICAgdm9pZCBzZXROdW1iZXJPZlRpbGVzV2lkZShpbnQgbnVtYmVyT2ZUaWxl
c1dpZGUpIHsgbV9udW1iZXJPZlRpbGVzV2lkZSA9IG51bWJlck9mVGlsZXNXaWRlOyB9CisgICAg
aW50IG51bWJlck9mVGlsZXNIaWdoKCkgY29uc3QgeyByZXR1cm4gbV9udW1iZXJPZlRpbGVzSGln
aDsgfQorICAgIHZvaWQgc2V0TnVtYmVyT2ZUaWxlc0hpZ2goaW50IG51bWJlck9mVGlsZXNIaWdo
KSB7IG1fbnVtYmVyT2ZUaWxlc0hpZ2ggPSBudW1iZXJPZlRpbGVzSGlnaDsgfQorICAgIFBsYXRm
b3JtOjpJbnRQb2ludCBiYWNraW5nU3RvcmVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX2JhY2tp
bmdTdG9yZU9mZnNldDsgfQorICAgIHZvaWQgc2V0QmFja2luZ1N0b3JlT2Zmc2V0KGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCYgb2Zmc2V0KSB7IG1fYmFja2luZ1N0b3JlT2Zmc2V0ID0gb2Zmc2V0
OyB9CisgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZUF0KFRpbGVJbmRleCBpbmRleCkgY29uc3Qg
eyByZXR1cm4gbV90aWxlTWFwLmdldChpbmRleCk7IH0KKyAgICBjb25zdCBUaWxlTWFwJiB0aWxl
TWFwKCkgY29uc3QgeyByZXR1cm4gbV90aWxlTWFwOyB9CisgICAgdm9pZCBzZXRUaWxlTWFwKGNv
bnN0IFRpbGVNYXAmIHRpbGVNYXApIHsgbV90aWxlTWFwID0gdGlsZU1hcDsgfQorCisgIHByaXZh
dGU6CisgICAgaW50IG1fbnVtYmVyT2ZUaWxlc1dpZGU7CisgICAgaW50IG1fbnVtYmVyT2ZUaWxl
c0hpZ2g7CisgICAgUGxhdGZvcm06OkludFBvaW50IG1fYmFja2luZ1N0b3JlT2Zmc2V0OworICAg
IFRpbGVNYXAgbV90aWxlTWFwOworfTsKKworY2xhc3MgQmFja2luZ1N0b3JlV2luZG93QnVmZmVy
U3RhdGUgeworcHVibGljOgorICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIGJsaXR0ZWRSZWdp
b24oKSBjb25zdCB7IHJldHVybiBtX2JsaXR0ZWRSZWdpb247IH0KKyAgICB2b2lkIGFkZEJsaXR0
ZWRSZWdpb24oY29uc3QgUGxhdGZvcm06OkludFJlY3RSZWdpb24mIHJlZ2lvbikKKyAgICB7Cisg
ICAgICAgIG1fYmxpdHRlZFJlZ2lvbiA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjp1bmlvblJl
Z2lvbnMobV9ibGl0dGVkUmVnaW9uLCByZWdpb24pOworICAgIH0KKyAgICB2b2lkIGNsZWFyQmxp
dHRlZFJlZ2lvbihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgcmVnaW9uKQorICAgIHsK
KyAgICAgICAgbV9ibGl0dGVkUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OnN1YnRy
YWN0UmVnaW9ucyhtX2JsaXR0ZWRSZWdpb24sIHJlZ2lvbik7CisgICAgfQorICAgIHZvaWQgY2xl
YXJCbGl0dGVkUmVnaW9uKCkgeyBtX2JsaXR0ZWRSZWdpb24gPSBQbGF0Zm9ybTo6SW50UmVjdFJl
Z2lvbigpOyB9CisKKyAgICBib29sIGlzUmVuZGVyZWQoY29uc3QgUGxhdGZvcm06OkludFBvaW50
JiBzY3JvbGxQb3NpdGlvbiwgY29uc3QgUGxhdGZvcm06OkludFJlY3RSZWdpb24mIGNvbnRlbnRz
KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpz
dWJ0cmFjdFJlZ2lvbnMoY29udGVudHMsIG1fYmxpdHRlZFJlZ2lvbikuaXNFbXB0eSgpOworICAg
IH0KKworICBwcml2YXRlOgorICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIG1fYmxpdHRlZFJl
Z2lvbjsKK307CisKK2NsYXNzIEJhY2tpbmdTdG9yZVByaXZhdGUgOiBwdWJsaWMgQmxhY2tCZXJy
eTo6UGxhdGZvcm06Okd1YXJkZWRQb2ludGVyQmFzZSB7CitwdWJsaWM6CisgICAgZW51bSBUaWxl
TWF0cml4RGlyZWN0aW9uIHsgSG9yaXpvbnRhbCwgVmVydGljYWwgfTsKKyAgICBCYWNraW5nU3Rv
cmVQcml2YXRlKCk7CisgICAgfkJhY2tpbmdTdG9yZVByaXZhdGUoKTsKKworICAgIC8vIFJldHVy
bnMgd2hldGhlciBkaXJlY3QgcmVuZGVyaW5nIGlzIGV4cGxpY2l0bHkgdHVybmVkIG9uIG9yIGlz
CisgICAgLy8gcmVxdWlyZWQgYmVjYXVzZSB0aGUgc3VyZmFjZSBwb29sIGlzIG5vdCBsYXJnZSBl
bm91Z2ggdG8gbWVldAorICAgIC8vIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0aWxlcyByZXF1aXJl
ZCB0byBzY3JvbGwuCisgICAgYm9vbCBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpIGNv
bnN0OworCisgICAgLy8gU3VzcGVuZHMgYWxsIHNjcmVlbiB1cGRhdGVzIHNvIHRoYXQgJ2JsaXRD
b250ZW50cycgaXMgZGlzYWJsZWQuCisgICAgdm9pZCBzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0
b3JlVXBkYXRlcygpOworCisgICAgLy8gUmVzdW1lcyBhbGwgc2NyZWVuIHVwZGF0ZXMgc28gdGhh
dCAnYmxpdENvbnRlbnRzJyBpcyBlbmFibGVkLgorICAgIHZvaWQgcmVzdW1lU2NyZWVuQW5kQmFj
a2luZ1N0b3JlVXBkYXRlcyhCYWNraW5nU3RvcmU6OlJlc3VtZVVwZGF0ZU9wZXJhdGlvbik7CisK
KyAgICAvLyBUaGUgZnVuY3Rpb25zIHJlcGFpbnQoKSwgc2xvd1Njcm9sbCgpLCBzY3JvbGwoKSwg
c2Nyb2xsaW5nU3RhcnRlZEhlbHBlcigpIGFyZQorICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUg
V2ViS2l0IGFuZCB3aXRoaW4gV2ViS2l0IHZpYSBDaHJvbWVDbGllbnRCbGFja0JlcnJ5LgorICAg
IHZvaWQgcmVwYWludChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgd2luZG93UmVjdCwgYm9vbCBj
b250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgdm9pZCBzbG93U2Nyb2xsKGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdp
bmRvd1JlY3QsIGJvb2wgaW1tZWRpYXRlKTsKKworICAgIHZvaWQgc2Nyb2xsKGNvbnN0IFBsYXRm
b3JtOjpJbnRTaXplJiBkZWx0YSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHNjcm9sbFZpZXdS
ZWN0LCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY2xpcFJlY3QpOworICAgIHZvaWQgc2Nyb2xs
aW5nU3RhcnRlZEhlbHBlcihjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEpOworCisgICAg
Ym9vbCBzaG91bGRTdXBwcmVzc05vblZpc2libGVSZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Owor
ICAgIGJvb2wgc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSBjb25zdDsKKyAgICBib29sIHNob3Vs
ZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0OworICAgIHZvaWQgc3RhcnRSZW5kZXJU
aW1lcigpOworICAgIHZvaWQgc3RvcFJlbmRlclRpbWVyKCk7CisgICAgdm9pZCByZW5kZXJPblRp
bWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdTdG9yZVByaXZhdGU+Kik7CisgICAgdm9pZCByZW5k
ZXJPbklkbGUoKTsKKyAgICBib29sIHdpbGxGaXJlVGltZXIoKTsKKworICAgIC8vIFNldCBvZiBo
ZWxwZXIgbWV0aG9kcyBmb3IgdGhlIHNjcm9sbEJhY2tpbmdTdG9yZSgpIG1ldGhvZC4KKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCBleHBhbmRlZENvbnRlbnRzUmVjdCgpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHZpc2libGVDb250ZW50c1JlY3QoKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB1bmNs
aXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlTGVm
dChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgc2hvdWxkTW92ZVJp
Z2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRNb3Zl
VXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIHNob3VsZE1vdmVE
b3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBjYW5Nb3ZlWChj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2FuTW92ZVkoY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNhbk1vdmVMZWZ0KGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9vbCBjYW5Nb3ZlUmlnaHQoY29uc3QgUGxh
dGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNhbk1vdmVVcChjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJvb2wgY2FuTW92ZURvd24oY29uc3QgUGxhdGZvcm06
OkludFJlY3QmKSBjb25zdDsKKworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJl
Y3RGb3JTY3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgY29uc3QgUGxhdGZvcm06OkludFJl
Y3QmKSBjb25zdDsKKyAgICB2b2lkIHNldEJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06
OkludFJlY3QmKTsKKworICAgIHR5cGVkZWYgV1RGOjpWZWN0b3I8VGlsZUluZGV4PiBUaWxlSW5k
ZXhMaXN0OworICAgIFRpbGVJbmRleExpc3QgaW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJlY3QoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBv
cmlnaW5PZkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRp
bGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3Q7CisK
KyAgICBUaWxlSW5kZXggaW5kZXhPZkxhc3RSZW5kZXJGb3JUaWxlKGNvbnN0IFRpbGVJbmRleCYs
IEJhY2tpbmdTdG9yZVRpbGUqKSBjb25zdDsKKyAgICBUaWxlSW5kZXggaW5kZXhPZlRpbGUoY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBi
YWNraW5nU3RvcmVSZWN0KSBjb25zdDsKKyAgICB2b2lkIGNsZWFyQW5kVXBkYXRlVGlsZU9mTm90
UmVuZGVyZWRSZWdpb24oY29uc3QgVGlsZUluZGV4JiwgQmFja2luZ1N0b3JlVGlsZSosIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uJiwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tp
bmdTdG9yZVJlY3QsIGJvb2wgdXBkYXRlID0gdHJ1ZSk7CisgICAgYm9vbCBpc0N1cnJlbnRWaXNp
YmxlSm9iKGNvbnN0IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3Q7CisKKyAgICAvLyBSZXNwb25zaWJs
ZSBmb3Igc2Nyb2xsaW5nIHRoZSBiYWNraW5nIHN0b3JlIGFuZCB1cGRhdGluZyB0aGUKKyAgICAv
LyB0aWxlIG1hdHJpeCBnZW9tZXRyeS4KKyAgICB2b2lkIHNjcm9sbEJhY2tpbmdTdG9yZShpbnQg
ZGVsdGFYLCBpbnQgZGVsdGFZKTsKKworICAgIC8vIFJlbmRlciB0aGUgdGlsZXMgZGlydHkgcmVj
dHMgYW5kIGJsaXQgdG8gdGhlIHNjcmVlbi4KKyAgICBib29sIHJlbmRlckRpcmVjdFRvV2luZG93
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgYm9vbCByZW5kZXJDb250ZW50T25seSk7CisgICAg
Ym9vbCByZW5kZXIoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBib29sIHJlbmRlckNvbnRlbnRP
bmx5KTsKKyAgICBib29sIHJlbmRlcihjb25zdCBJbnRSZWN0TGlzdCYsIGJvb2wgcmVuZGVyQ29u
dGVudE9ubHkpOworCisgICAgLy8gQ2FsbGVkIGJ5IHRoZSByZW5kZXIgcXVldWUgdG8gZW5zdXJl
IHRoYXQgdGhlIHF1ZXVlIGlzIGluIGEKKyAgICAvLyBjb25zdGFudCBzdGF0ZSBiZWZvcmUgcGVy
Zm9ybWluZyBhIHJlbmRlciBqb2IuCisgICAgdm9pZCByZXF1ZXN0TGF5b3V0SWZOZWVkZWQoKSBj
b25zdDsKKworICAgIC8vIEhlbHBlciByZW5kZXIgbWV0aG9kcy4KKyAgICB2b2lkIHJlbmRlclZp
c2libGVDb250ZW50cyhib29sIHJlbmRlckNvbnRlbnRPbmx5ID0gZmFsc2UpOworICAgIHZvaWQg
cmVuZGVyQmFja2luZ1N0b3JlKGJvb2wgcmVuZGVyQ29udGVudE9ubHkgPSBmYWxzZSk7CisgICAg
dm9pZCBibGl0VmlzaWJsZUNvbnRlbnRzKGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKyAgICAvLyBB
c3N1bWVzIHRoZSByZWN0IHRvIGJlIGluIHdpbmRvdy92aWV3cG9ydCBjb29yZGluYXRlcy4KKyAg
ICB2b2lkIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNrU3VyZmFjZU9mV2luZG93KCk7CisgICAg
dm9pZCBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFja1N1cmZhY2VPZlRpbGUoY29uc3QgUGxhdGZv
cm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVUaWxlKik7CisgICAgdm9pZCBwYWludERlZmF1bHRC
YWNrZ3JvdW5kKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cywgY29uc3QgV2ViQ29y
ZTo6VHJhbnNmb3JtYXRpb25NYXRyaXgmLCBib29sIGZsdXNoKTsKKyAgICB2b2lkIGJsaXRDb250
ZW50cyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGNvbnRlbnRzLCBib29sIGZvcmNlID0gZmFsc2UpOworICAgIHZvaWQgYmxpdE9uSWRs
ZSgpOworCisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8VGlsZUluZGV4LCBQbGF0Zm9ybTo6SW50UmVj
dD4gVGlsZVJlY3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmxpdFRpbGVSZWN0KFRpbGVCdWZm
ZXIqLCBjb25zdCBUaWxlUmVjdCYsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYsIGNvbnN0IFdl
YkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiwgQmFja2luZ1N0b3JlR2VvbWV0cnkqKTsKKwor
I2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKyAgICB2b2lkIGJsZW5kQ29tcG9zaXRp
bmdTdXJmYWNlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RSZWN0KTsKKyAgICB2b2lkIGNs
ZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCk7CisgICAgYm9vbCBkcmF3U3ViTGF5ZXJzKCk7CisjZW5k
aWYKKworICAgIHZvaWQgYmxpdEhvcml6b250YWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06Oklu
dFBvaW50Jik7CisgICAgdm9pZCBibGl0VmVydGljYWxTY3JvbGxiYXIoY29uc3QgUGxhdGZvcm06
OkludFBvaW50Jik7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHRpbGUgaW5kZXggaXMg
Y3VycmVudGx5IHZpc2libGUgb3Igbm90LgorICAgIGJvb2wgaXNUaWxlVmlzaWJsZShjb25zdCBU
aWxlSW5kZXgmKSBjb25zdDsKKyAgICBib29sIGlzVGlsZVZpc2libGUoY29uc3QgUGxhdGZvcm06
OkludFBvaW50JikgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIGEgcmVjdCB0aGF0IGlzIHRoZSB1
bmlvbiBvZiBhbGwgdGlsZXMgdGhhdCBhcmUgdmlzaWJsZS4KKyAgICBQbGF0Zm9ybTo6SW50UmVj
dCB2aXNpYmxlVGlsZXNSZWN0KCkgY29uc3Q7CisKKyAgICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhl
IHZpc2libGUgY29udGVudCBmb3IgaW5zdGFuY2UuCisgICAgUGxhdGZvcm06OkludFJlY3QgdGls
ZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisKKyAgICAvLyBV
c2VkIHRvIGNsaXAgdG8gdGhlIHVuY2xpcHBlZCB2aXNpYmxlIGNvbnRlbnQgZm9yIGluc3RhbmNl
IHdoaWNoIGluY2x1ZGVzIG92ZXJzY3JvbGwuCisgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZVVu
Y2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisKKyAg
ICAvLyBVc2VkIHRvIGNsaXAgdG8gdGhlIGNvbnRlbnRzIGZvciBpbnN0YW5jZS4KKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB0aWxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJbmRleCYsIGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZUNvbnRl
bnRzUmVjdChjb25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsIEJhY2tp
bmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3Q7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBi
eSBXZWJQYWdlIG9uY2UgbG9hZCBpcyBjb21taXR0ZWQgdG8gcmVzZXQgdGhlIHJlbmRlciBxdWV1
ZS4KKyAgICB2b2lkIHJlc2V0UmVuZGVyUXVldWUoKTsKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBi
eSBGcmFtZUxvYWRlckNsaWVudCB0aGF0IGV4cGxpY2l0bHkgcGFpbnRzIG9uIGZpcnN0IHZpc2li
bGUgbGF5b3V0LgorICAgIHZvaWQgY2xlYXJWaXNpYmxlWm9vbSgpOworCisgICAgLy8gVGhpcyBp
cyBjYWxsZWQgYnkgV2ViUGFnZSBvbmNlIGxvYWQgaXMgY29tbWl0dGVkIHRvIHJlc2V0IGFsbCB0
aGUgdGlsZXMuCisgICAgdm9pZCByZXNldFRpbGVzKGJvb2wgcmVzZXRCYWNrZ3JvdW5kKTsKKwor
ICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFdlYlBhZ2UgYWZ0ZXIgbG9hZCBpcyBjb21wbGV0ZSB0
byB1cGRhdGUgYWxsIHRoZSB0aWxlcy4KKyAgICB2b2lkIHVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRl
VmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgZHVyaW5n
IHNjcm9sbCBhbmQgYnkgdGhlIHJlbmRlciBxdWV1ZS4KKyAgICB2b2lkIHVwZGF0ZVRpbGVzRm9y
U2Nyb2xsT3JOb3RSZW5kZXJlZFJlZ2lvbihib29sIGNoZWNrTG9hZGluZyA9IHRydWUpOworCisg
ICAgLy8gUmVzZXQgYW4gaW5kaXZpZHVhbCB0aWxlLgorICAgIHZvaWQgcmVzZXRUaWxlKGNvbnN0
IFRpbGVJbmRleCYsIEJhY2tpbmdTdG9yZVRpbGUqLCBib29sIHJlc2V0QmFja2dyb3VuZCk7CisK
KyAgICAvLyBVcGRhdGUgYW4gaW5kaXZpZHVhbCB0aWxlLgorICAgIHZvaWQgdXBkYXRlVGlsZShj
b25zdCBUaWxlSW5kZXgmLCBib29sIGltbWVkaWF0ZSk7CisgICAgdm9pZCB1cGRhdGVUaWxlKGNv
bnN0IFBsYXRmb3JtOjpJbnRQb2ludCYsIGJvb2wgaW1tZWRpYXRlKTsKKworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBUaWxlUmVj
dCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IG1hcEZyb21UaWxlc1RvVHJhbnNmb3Jt
ZWRDb250ZW50cyhjb25zdCBUaWxlUmVjdCYsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisKKyAgICB0eXBlZGVmIFdURjo6VmVjdG9yPFRpbGVSZWN0PiBUaWxlUmVjdExpc3Q7Cisg
ICAgVGlsZVJlY3RMaXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9BYnNvbHV0ZVRpbGVC
b3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgVGlsZVJlY3RM
aXN0IG1hcEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYpIGNvbnN0OworICAgIFRpbGVSZWN0TGlzdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50
c1RvVGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVHZW9tZXRyeSop
IGNvbnN0OworCisgICAgdm9pZCB1cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQoKTsKKworICAgIC8v
IENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3JtZWRDb250ZW50c1NpemVD
aGFuZ2VkLgorICAgIHZvaWQgY29udGVudHNTaXplQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50
U2l6ZSYpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYlBhZ2VQcml2YXRlOjpub3RpZnlUcmFuc2Zv
cm1lZFNjcm9sbENoYW5nZWQuCisgICAgdm9pZCBzY3JvbGxDaGFuZ2VkKGNvbnN0IFBsYXRmb3Jt
OjpJbnRQb2ludCYpOworCisgICAgLy8gQ2FsbGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjpub3RpZnlU
cmFuc2Zvcm1DaGFuZ2VkLgorICAgIHZvaWQgdHJhbnNmb3JtQ2hhbmdlZCgpOworCisgICAgLy8g
Q2FsbGVkIGJ5IFdlYnBhZ2VQcml2YXRlOjphY3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQuCisgICAg
dm9pZCBhY3R1YWxWaXNpYmxlU2l6ZUNoYW5nZWQoY29uc3QgUGxhdGZvcm06OkludFNpemUmKTsK
KworICAgIC8vIENhbGxlZCBieSBXZWJQYWdlUHJpdmF0ZTo6c2V0U2NyZWVuUm90YXRlZC4KKyAg
ICB2b2lkIG9yaWVudGF0aW9uQ2hhbmdlZCgpOworCisgICAgLy8gU2V0cyB0aGUgZ2VvbWV0cnkg
b2YgdGhlIHRpbGUgbWF0cml4LgorICAgIHZvaWQgc2V0R2VvbWV0cnlPZlRpbGVNYXRyaXgoaW50
IG51bWJlck9mVGlsZXNXaWRlLCBpbnQgbnVtYmVyT2ZUaWxlc0hpZ2gpOworCisgICAgLy8gQ3Jl
YXRlIHRoZSBzdXJmYWNlcyBvZiB0aGUgYmFja2luZyBzdG9yZS4KKyAgICB2b2lkIGNyZWF0ZVN1
cmZhY2VzKCk7CisgICAgdm9pZCBjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlcigpOworCisgICAgLy8g
VmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgcXVhbnRpdGllcyByZWxldmFudCB0byBiYWNraW5nIHN0
b3JlLgorICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4
JikgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbk9mVGlsZShjb25zdCBUaWxl
SW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGludCBtaW5pbXVt
TnVtYmVyT2ZUaWxlc1dpZGUoKSBjb25zdDsKKyAgICBpbnQgbWluaW11bU51bWJlck9mVGlsZXNI
aWdoKCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFNpemUgZXhwYW5kZWRDb250ZW50c1NpemUo
KSBjb25zdDsKKworICAgIC8vIFRoZSB0aWxlIGdlb21ldHJ5IG1ldGhvZHMgYXJlIGFsbCBzdGF0
aWMgZnVuY3Rpb24uCisgICAgc3RhdGljIGludCB0aWxlV2lkdGgoKTsKKyAgICBzdGF0aWMgaW50
IHRpbGVIZWlnaHQoKTsKKyAgICBzdGF0aWMgUGxhdGZvcm06OkludFNpemUgdGlsZVNpemUoKTsK
KyAgICBzdGF0aWMgUGxhdGZvcm06OkludFJlY3QgdGlsZVJlY3QoKTsKKworICAgIC8vIFRoaXMg
dGFrZXMgdHJhbnNmb3JtZWQgY29udGVudHMgY29vcmRpbmF0ZXMuCisgICAgdm9pZCByZW5kZXJD
b250ZW50cyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OkJ1ZmZlciosIGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCYgc3VyZmFjZU9mZnNldCwgY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IGNvbnRlbnRzUmVjdCkgY29uc3Q7CisKKyAgICB2b2lkIGJsaXRUb1dpbmRvdyhjb25zdCBQbGF0
Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjpCdWZmZXIqIHNyY0J1ZmZlciwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHNyY1JlY3Qs
IGJvb2wgYmxlbmQsIHVuc2lnbmVkIGNoYXIgZ2xvYmFsQWxwaGEpOworICAgIHZvaWQgY2hlY2tl
cldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0UmVjdCwgY29uc3QgUGxhdGZvcm06
OkludFBvaW50JiBjb250ZW50c09yaWdpbiwgZG91YmxlIGNvbnRlbnRzU2NhbGUpOworCisgICAg
dm9pZCBpbnZhbGlkYXRlV2luZG93KCk7CisgICAgdm9pZCBpbnZhbGlkYXRlV2luZG93KGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3QpOworICAgIHZvaWQgY2xlYXJXaW5kb3coKTsKKyAgICB2
b2lkIGNsZWFyV2luZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgdW5zaWduZWQgY2hhciBy
ZWQsIHVuc2lnbmVkIGNoYXIgZ3JlZW4sIHVuc2lnbmVkIGNoYXIgYmx1ZSwgdW5zaWduZWQgY2hh
ciBhbHBoYSA9IDI1NSk7CisKKyAgICBib29sIGlzU2Nyb2xsaW5nT3Jab29taW5nKCkgY29uc3Q7
CisgICAgdm9pZCBzZXRTY3JvbGxpbmdPclpvb21pbmcoYm9vbCBzY3JvbGxpbmdPclpvb21pbmcs
IGJvb2wgc2hvdWxkQmxpdCA9IHRydWUpOworCisgICAgdm9pZCBsb2NrQmFja2luZ1N0b3JlKCk7
CisgICAgdm9pZCB1bmxvY2tCYWNraW5nU3RvcmUoKTsKKworICAgIEJhY2tpbmdTdG9yZUdlb21l
dHJ5KiBmcm9udFN0YXRlKCkgY29uc3Q7CisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGJhY2tT
dGF0ZSgpIGNvbnN0OworICAgIHZvaWQgc3dhcFN0YXRlKCk7CisKKyAgICBCYWNraW5nU3RvcmVX
aW5kb3dCdWZmZXJTdGF0ZSogd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpIGNvbnN0OworICAgIEJh
Y2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlKiB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKSBjb25z
dDsKKworICAgIHN0YXRpYyB2b2lkIHNldEN1cnJlbnRCYWNraW5nU3RvcmVPd25lcihXZWJQYWdl
KiB3ZWJQYWdlKSB7IEJhY2tpbmdTdG9yZVByaXZhdGU6OnNfY3VycmVudEJhY2tpbmdTdG9yZU93
bmVyID0gd2ViUGFnZTsgfQorICAgIHN0YXRpYyBXZWJQYWdlKiBjdXJyZW50QmFja2luZ1N0b3Jl
T3duZXIoKSB7IHJldHVybiBCYWNraW5nU3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3Rv
cmVPd25lcjsgfQorICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKworICAgIHN0YXRpYyBXZWJQ
YWdlKiBzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lcjsKKworICAgIGJvb2wgbV9zdXNwZW5kU2Ny
ZWVuVXBkYXRlczsKKyAgICBib29sIG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXM7CisKKyAg
ICBib29sIG1fc3VzcGVuZFJlbmRlckpvYnM7CisgICAgYm9vbCBtX3N1c3BlbmRSZWd1bGFyUmVu
ZGVySm9iczsKKyAgICBib29sIG1faXNTY3JvbGxpbmdPclpvb21pbmc7CisgICAgV2ViUGFnZSog
bV93ZWJQYWdlOworICAgIEJhY2tpbmdTdG9yZUNsaWVudCogbV9jbGllbnQ7CisgICAgT3duUHRy
PFJlbmRlclF1ZXVlPiBtX3JlbmRlclF1ZXVlOworICAgIG11dGFibGUgUGxhdGZvcm06OkludFNp
emUgbV9wcmV2aW91c0RlbHRhOworCisgICAgYm9vbCBtX2RlZmVyc0JsaXQ7CisgICAgYm9vbCBt
X2hhc0JsaXRKb2JzOworCisjaWYgVVNFKE9QRU5WRykKKyAgICBFR0xEaXNwbGF5IG1fZWdsRGlz
cGxheTsKKyNlbmRpZgorICAgIG11dGFibGUgdW5zaWduZWQgbV9mcm9udFN0YXRlOworICAgIG11
dGFibGUgdW5zaWduZWQgbV9iYWNrU3RhdGU7CisKKyAgICB1bnNpZ25lZCBtX2N1cnJlbnRXaW5k
b3dCYWNrQnVmZmVyOworICAgIG11dGFibGUgQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUg
bV93aW5kb3dCdWZmZXJTdGF0ZVsyXTsKKworICAgIFRpbGVNYXRyaXhEaXJlY3Rpb24gbV9wcmVm
ZXJyZWRUaWxlTWF0cml4RGltZW5zaW9uOworCisgICAgUGxhdGZvcm06OkludFJlY3QgbV92aXNp
YmxlVGlsZUJ1ZmZlclJlY3Q7CisKKyAgICAvLyBMYXN0IHJlc29ydCB0aW1lciBmb3IgcmVuZGVy
aW5nLgorICAgIE93blB0cjxXZWJDb3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQcml2YXRlPiA+IG1f
cmVuZGVyVGltZXI7CisKKyAgICBwdGhyZWFkX211dGV4X3QgbV9tdXRleDsKKworICAgIGludCBt
X2JsaXRHZW5lcmF0aW9uOworICAgIHB0aHJlYWRfbXV0ZXhfdCBtX2JsaXRHZW5lcmF0aW9uTG9j
azsKKyAgICBwdGhyZWFkX2NvbmRfdCBtX2JsaXRHZW5lcmF0aW9uQ29uZDsKKyAgICBzdHJ1Y3Qg
dGltZXNwZWMgbV9jdXJyZW50QmxpdEVuZDsKK307Cit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKK30g
Ly8gbmFtZXNwYWNlIEJsYWNrQmVycnkKKworI2VuZGlmIC8vIEJhY2tpbmdTdG9yZV9wX2gKLS0g
CjEuNy40LjEKCg==
</data>
<flag name="review"
          id="118398"
          type_id="1"
          status="+"
          setter="dbates"
    />
    <flag name="commit-queue"
          id="118428"
          type_id="3"
          status="-"
          setter="dbates"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>118667</attachid>
            <date>2011-12-09 17:08:22 -0800</date>
            <delta_ts>2011-12-09 18:46:28 -0800</delta_ts>
            <desc>Updated patch</desc>
            <filename>73668-final.patch</filename>
            <type>text/plain</type>
            <size>127487</size>
            <attacher name="Jacky Jiang">jkjiang</attacher>
            
              <data encoding="base64">RnJvbSBkYTE1M2U2OTZkYjdmYWYyNzQ4YTVkN2I5ZTJlN2M2Y2QyN2E4MzMzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWNreSBKaWFuZyA8emhhamlhbmdAcmltLmNvbT4KRGF0ZTog
RnJpLCA5IERlYyAyMDExIDE1OjAzOjIyIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0gVXBzdHJlYW0g
QmxhY2tCZXJyeSBBUEkgYmFja2luZyBzdG9yZSBmaWxlcwogaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTczNjY4CgpSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KCkNv
bnRyaWJ1dGVkIGJ5IFRvcmNoIHRlYW0sIHRoZSBtYWluIGNvbnRyaWJ1dG9yIGlzIEFkYW0gVHJl
YXQKPGF0cmVhdEByaW0uY29tPi4KCkluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KCiog
YmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcDogQWRkZWQuCiogYmxhY2tiZXJyeS9BcGkv
QmFja2luZ1N0b3JlLmg6IEFkZGVkLgoqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZV9wLmg6
IEFkZGVkLgotLS0KIFNvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nICAgICAgICAgICAgICAgICAgICAg
ICB8ICAgMTYgKwogU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3Bw
IHwgMjU5OSArKysrKysrKysrKysrKysrKysrKysrKysrCiBTb3VyY2UvV2ViS2l0L2JsYWNrYmVy
cnkvQXBpL0JhY2tpbmdTdG9yZS5oICAgfCAgIDg4ICsKIFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvQmFja2luZ1N0b3JlX3AuaCB8ICAzNTYgKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDU5
IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgU291cmNl
L1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuY3BwCiBjcmVhdGUgbW9kZSAxMDA2
NDQgU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaAogY3JlYXRlIG1v
ZGUgMTAwNjQ0IFNvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaAoK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFu
Z2VMb2cKaW5kZXggOTdiMzJhMS4uNTJjY2U2NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9D
aGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAor
MjAxMS0xMi0wOCAgSmFja3kgSmlhbmcgIDx6aGFqaWFuZ0ByaW0uY29tPgorCisgICAgICAgIFVw
c3RyZWFtIEJsYWNrQmVycnkgQVBJIGJhY2tpbmcgc3RvcmUgZmlsZXMKKyAgICAgICAgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTczNjY4CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQ29udHJpYnV0ZWQgYnkgVG9yY2ggdGVh
bSwgdGhlIG1haW4gY29udHJpYnV0b3IgaXMgQWRhbSBUcmVhdAorICAgICAgICA8YXRyZWF0QHJp
bS5jb20+LgorCisgICAgICAgIEluaXRpYWwgdXBzdHJlYW0sIG5vIG5ldyB0ZXN0cy4KKworICAg
ICAgICAqIGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHA6IEFkZGVkLgorICAgICAgICAq
IGJsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5oOiBBZGRlZC4KKyAgICAgICAgKiBibGFja2Jl
cnJ5L0FwaS9CYWNraW5nU3RvcmVfcC5oOiBBZGRlZC4KKwogMjAxMS0xMi0wNiAgTGVvIFlhbmcg
IDxsZW8ueWFuZ0B0b3JjaG1vYmlsZS5jb20uY24+CiAKICAgICAgICAgVXBzdHJlYW0gYWJvdXQ6
IGZlYXR1cmUgaW4gV2ViS2l0L2JsYWNrYmVycnkvV2ViQ29yZVN1cHBvcnQvCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAgYi9Tb3VyY2Uv
V2ViS2l0L2JsYWNrYmVycnkvQXBpL0JhY2tpbmdTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uZTRmOTE5YQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJL
aXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmNwcApAQCAtMCwwICsxLDI1OTkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkJhY2tpbmdTdG9yZS5oIgorCisjaW5jbHVkZSAiQmFj
a2luZ1N0b3JlQ2xpZW50LmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlQ29tcG9zaXRpbmdTdXJm
YWNlLmgiCisjaW5jbHVkZSAiQmFja2luZ1N0b3JlVGlsZS5oIgorI2luY2x1ZGUgIkJhY2tpbmdT
dG9yZV9wLmgiCisjaW5jbHVkZSAiRmF0RmluZ2Vycy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisj
aW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5j
bHVkZSAiSW5zcGVjdG9yQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRl
ICJTdXJmYWNlUG9vbC5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNsdWRlICJXZWJQYWdl
Q2xpZW50LmgiCisjaW5jbHVkZSAiV2ViUGFnZV9wLmgiCisjaW5jbHVkZSAiV2ViU2V0dGluZ3Mu
aCIKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0Zm9ybUV4ZWN1dGFibGVNZXNzYWdlLmg+Cisj
aW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtSW50UmVjdFJlZ2lvbi5oPgorI2luY2x1ZGUgPEJs
YWNrQmVycnlQbGF0Zm9ybU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1N
ZXNzYWdlQ2xpZW50Lmg+CisKKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Ob3RGb3VuZC5oPgorCisjZGVmaW5l
IFNVUFBSRVNTX05PTl9WSVNJQkxFX1JFR1VMQVJfUkVOREVSX0pPQlMgMAorI2RlZmluZSBFTkFC
TEVfU0NST0xMQkFSUyAxCisjZGVmaW5lIEVOQUJMRV9SRVBBSU5UT05TQ1JPTEwgMQorI2RlZmlu
ZSBERUJVR19CQUNLSU5HU1RPUkUgMAorI2RlZmluZSBERUJVR19WSVNVQUxJWkUgMAorI2RlZmlu
ZSBERUJVR19USUxFTUFUUklYIDAKKyNkZWZpbmUgREVCVUdfQ09NUE9TSVRJTkdfRElSVFlfUkVH
SU9OIDAKKworI2lmIFVTRShPUEVOVkcpCisjaW5jbHVkZSAiRUdMRGlzcGxheU9wZW5WRy5oIgor
I2luY2x1ZGUgIkVHTFV0aWxzLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPEJsYWNrQmVycnlQbGF0
Zm9ybVNjcmVlbi5oPgorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKK3VzaW5nIG5hbWVzcGFj
ZSBzdGQ7CisKK3VzaW5nIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0OwordXNpbmcgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFBvaW50OwordXNpbmcgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkludFNpemU7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgewor
Citjb25zdCBpbnQgc19yZW5kZXJUaW1lclRpbWVvdXQgPSAxLjA7CitXZWJQYWdlKiBCYWNraW5n
U3RvcmVQcml2YXRlOjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9IDA7CisKK3R5cGVkZWYg
c3RkOjpwYWlyPGludCwgaW50PiBEaXZpc29yOwordHlwZWRlZiBWZWN0b3I8RGl2aXNvcj4gRGl2
aXNvckxpc3Q7CisvLyBGSVhNRTogQ2FjaGUgdGhpcyBhbmQvb3IgdXNlIGEgc21hcnRlciBhbGdv
cml0aG0uCitzdGF0aWMgRGl2aXNvckxpc3QgZGl2aXNvcnModW5zaWduZWQgbikKK3sKKyAgICBE
aXZpc29yTGlzdCBkaXZpc29yczsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDw9IG47ICsr
aSkKKyAgICAgICAgaWYgKCEobiAlIGkpKQorICAgICAgICAgICAgZGl2aXNvcnMuYXBwZW5kKHN0
ZDo6bWFrZV9wYWlyKGksIG4gLyBpKSk7CisgICAgcmV0dXJuIGRpdmlzb3JzOworfQorCisvLyBD
b21wdXRlIGJlc3QgZGl2aXNvciBnaXZlbiB0aGUgcmF0aW8gZGV0ZXJtaW5lZCBieSBzaXplLgor
c3RhdGljIERpdmlzb3IgYmVzdERpdmlzb3IoUGxhdGZvcm06OkludFNpemUgc2l6ZSwgaW50IHRp
bGVXaWR0aCwgaW50IHRpbGVIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQg
bWluaW11bU51bWJlck9mVGlsZXNXaWRlLCBpbnQgbWluaW11bU51bWJlck9mVGlsZXNIaWdoLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZU1hdHJp
eERpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgLy8gVGhlIHBvaW50IG9mIHRoaXMgZnVuY3Rp
b24gaXMgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgdGlsZXMgaW4gZWFjaAorICAgIC8vIGRp
bWVuc2lvbi4gV2UgZG8gdGhpcyBieSBsb29raW5nIHRvIG1hdGNoIHRoZSB0aWxlIG1hdHJpeCB3
aWR0aC9oZWlnaHQKKyAgICAvLyByYXRpbyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlIHdpdGggdGhl
IHdpZHRoL2hlaWdodCByYXRpbyBvZiB0aGUgY29udGVudHMuCisgICAgLy8gV2UgYWxzbyBsb29r
IGF0IHRoZSBkaXJlY3Rpb24gcGFzc2VkIHRvIGdpdmUgcHJlZmVyZW5jZSB0byBvbmUgZGltZW5z
aW9uCisgICAgLy8gb3ZlciBhbm90aGVyLiBUaGlzIG1ldGhvZCBjb3VsZCBwcm9iYWJseSBiZSBt
YWRlIGZhc3RlciwgYnV0IGl0IGdldHMgdGhlCisgICAgLy8gam9iIGRvbmUuCisgICAgU3VyZmFj
ZVBvb2wqIHN1cmZhY2VQb29sID0gU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCk7Cisg
ICAgQVNTRVJUKCFzdXJmYWNlUG9vbC0+aXNFbXB0eSgpKTsKKworICAgIC8vIFN0b3JlIGEgc3Rh
dGljIGxpc3Qgb2YgcG9zc2libGUgZGl2aXNvcnMuCisgICAgc3RhdGljIERpdmlzb3JMaXN0IGRp
dmlzb3JMaXN0ID0gZGl2aXNvcnMoc3VyZmFjZVBvb2wtPnNpemUoKSk7CisKKyAgICAvLyBUaGUg
cmF0aW8gd2UncmUgbG9va2luZyB0byBiZXN0IGltaXRhdGUuCisgICAgZmxvYXQgcmF0aW8gPSBz
dGF0aWNfY2FzdDxmbG9hdD4oc2l6ZS53aWR0aCgpKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzaXpl
LmhlaWdodCgpKTsKKworICAgIERpdmlzb3IgYmVzdERpdmlzb3I7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBkaXZpc29yTGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBEaXZpc29yIGRp
dmlzb3IgPSBkaXZpc29yTGlzdFtpXTsKKworICAgICAgICBib29sIGRpdmlzb3JXaWR0aElzUGVy
ZmVjdCA9IHNpemUud2lkdGgoKSA8PSBkaXZpc29yLmZpcnN0ICogdGlsZVdpZHRoICYmIGFicyhz
aXplLndpZHRoKCkgLSBkaXZpc29yLmZpcnN0ICogdGlsZVdpZHRoKSA8IHRpbGVXaWR0aDsKKyAg
ICAgICAgYm9vbCBkaXZpc29ySGVpZ2h0SXNQZXJmZWN0ID0gc2l6ZS5oZWlnaHQoKSA8PSBkaXZp
c29yLnNlY29uZCAqIHRpbGVIZWlnaHQgJiYgYWJzKHNpemUuaGVpZ2h0KCkgLSBkaXZpc29yLnNl
Y29uZCAqIHRpbGVIZWlnaHQpIDwgdGlsZUhlaWdodDsKKyAgICAgICAgYm9vbCBkaXZpc29yV2lk
dGhJc1ZhbGlkID0gZGl2aXNvci5maXJzdCA+PSBtaW5pbXVtTnVtYmVyT2ZUaWxlc1dpZGUgfHwg
ZGl2aXNvcldpZHRoSXNQZXJmZWN0OworICAgICAgICBib29sIGRpdmlzb3JIZWlnaHRJc1ZhbGlk
ID0gZGl2aXNvci5zZWNvbmQgPj0gbWluaW11bU51bWJlck9mVGlsZXNIaWdoIHx8IGRpdmlzb3JI
ZWlnaHRJc1BlcmZlY3Q7CisgICAgICAgIGlmICghZGl2aXNvcldpZHRoSXNWYWxpZCB8fCAhZGl2
aXNvckhlaWdodElzVmFsaWQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAo
ZGl2aXNvci5maXJzdCA+IGRpdmlzb3Iuc2Vjb25kICYmIGRpcmVjdGlvbiA9PSBCYWNraW5nU3Rv
cmVQcml2YXRlOjpWZXJ0aWNhbCAmJiAhZGl2aXNvckhlaWdodElzUGVyZmVjdCkKKyAgICAgICAg
ICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChkaXZpc29yLnNlY29uZCA+IGRpdmlzb3IuZmly
c3QgJiYgZGlyZWN0aW9uID09IEJhY2tpbmdTdG9yZVByaXZhdGU6Okhvcml6b250YWwgJiYgIWRp
dmlzb3JXaWR0aElzUGVyZmVjdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlm
IChkaXZpc29yV2lkdGhJc1BlcmZlY3QgfHwgZGl2aXNvckhlaWdodElzUGVyZmVjdCkgeworICAg
ICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29yOyAvLyBGb3VuZCBhIHBlcmZlY3QgZml0IQor
I2lmIERFQlVHX1RJTEVNQVRSSVgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjps
b2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJiZXN0RGl2aXNvciBm
b3VuZCBwZXJmZWN0IHNpemUgd2lkdGhQZXJmZWN0PSVzIGhlaWdodFBlcmZlY3Q9JXMiLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpc29yV2lkdGhJc1BlcmZlY3QgPyAi
dHJ1ZSIgOiAiZmFsc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXZp
c29ySGVpZ2h0SXNQZXJmZWN0ID8gInRydWUiIDogImZhbHNlIik7CisjZW5kaWYKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gU3RvcmUgYmFzaXMgb2YgY29tcGFy
aXNvbi4KKyAgICAgICAgaWYgKCFiZXN0RGl2aXNvci5maXJzdCAmJiAhYmVzdERpdmlzb3Iuc2Vj
b25kKSB7CisgICAgICAgICAgICBiZXN0RGl2aXNvciA9IGRpdmlzb3I7CisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbXBhcmUgcmF0aW9zLgorICAgICAg
ICBmbG9hdCBkaWZmMSA9IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihkaXZpc29yLmZpcnN0KSAv
IHN0YXRpY19jYXN0PGZsb2F0PihkaXZpc29yLnNlY29uZCkpIC0gcmF0aW8pOworICAgICAgICBm
bG9hdCBkaWZmMiA9IGZhYnMoKHN0YXRpY19jYXN0PGZsb2F0PihiZXN0RGl2aXNvci5maXJzdCkg
LyBzdGF0aWNfY2FzdDxmbG9hdD4oYmVzdERpdmlzb3Iuc2Vjb25kKSkgLSByYXRpbyk7CisgICAg
ICAgIGlmIChkaWZmMSA8IGRpZmYyKQorICAgICAgICAgICAgYmVzdERpdmlzb3IgPSBkaXZpc29y
OworICAgIH0KKworICAgIHJldHVybiBiZXN0RGl2aXNvcjsKK30KKworc3RydWN0IEJhY2tpbmdT
dG9yZU11dGV4TG9ja2VyIHsKKyAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlcihCYWNraW5nU3Rv
cmVQcml2YXRlKiBiYWNraW5nU3RvcmVQcml2YXRlKQorICAgICAgICA6IG1fYmFja2luZ1N0b3Jl
UHJpdmF0ZShiYWNraW5nU3RvcmVQcml2YXRlKQorICAgIHsKKyAgICAgICAgbV9iYWNraW5nU3Rv
cmVQcml2YXRlLT5sb2NrQmFja2luZ1N0b3JlKCk7CisgICAgfQorCisgICAgfkJhY2tpbmdTdG9y
ZU11dGV4TG9ja2VyKCkKKyAgICB7CisgICAgICAgIG1fYmFja2luZ1N0b3JlUHJpdmF0ZS0+dW5s
b2NrQmFja2luZ1N0b3JlKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIEJhY2tpbmdTdG9yZVBy
aXZhdGUqIG1fYmFja2luZ1N0b3JlUHJpdmF0ZTsKK307CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJh
Y2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNraW5nU3RvcmVSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1
cm4gUGxhdGZvcm06OkludFJlY3QoYmFja2luZ1N0b3JlT2Zmc2V0KCksIGJhY2tpbmdTdG9yZVNp
emUoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRTaXplIEJhY2tpbmdTdG9yZUdlb21ldHJ5OjpiYWNr
aW5nU3RvcmVTaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFNpemUobnVt
YmVyT2ZUaWxlc1dpZGUoKSAqIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVXaWR0aCgpLCBudW1i
ZXJPZlRpbGVzSGlnaCgpICogQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCgpKTsKK30K
KworQmFja2luZ1N0b3JlUHJpdmF0ZTo6QmFja2luZ1N0b3JlUHJpdmF0ZSgpCisgICAgOiBtX3N1
c3BlbmRTY3JlZW5VcGRhdGVzKGZhbHNlKQorICAgICwgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBk
YXRlcyhmYWxzZSkKKyAgICAsIG1fc3VzcGVuZFJlbmRlckpvYnMoZmFsc2UpCisgICAgLCBtX3N1
c3BlbmRSZWd1bGFyUmVuZGVySm9icyhmYWxzZSkKKyAgICAsIG1faXNTY3JvbGxpbmdPclpvb21p
bmcoZmFsc2UpCisgICAgLCBtX3dlYlBhZ2UoMCkKKyAgICAsIG1fY2xpZW50KDApCisgICAgLCBt
X3JlbmRlclF1ZXVlKGFkb3B0UHRyKG5ldyBSZW5kZXJRdWV1ZSh0aGlzKSkpCisgICAgLCBtX2Rl
ZmVyc0JsaXQodHJ1ZSkKKyAgICAsIG1faGFzQmxpdEpvYnMoZmFsc2UpCisjaWYgVVNFKE9QRU5W
RykKKyAgICAsIG1fZWdsRGlzcGxheShFR0xfTk9fRElTUExBWSkKKyNlbmRpZgorICAgICwgbV9j
dXJyZW50V2luZG93QmFja0J1ZmZlcigwKQorICAgICwgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGlt
ZW5zaW9uKFZlcnRpY2FsKQorICAgICwgbV9ibGl0R2VuZXJhdGlvbigtMSkKK3sKKyAgICBtX2Zy
b250U3RhdGUgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihuZXcgQmFja2luZ1N0b3JlR2Vv
bWV0cnkpOworICAgIG1fYmFja1N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZD4obmV3
IEJhY2tpbmdTdG9yZUdlb21ldHJ5KTsKKworICAgIG1fcmVuZGVyVGltZXIgPSBhZG9wdFB0cihu
ZXcgVGltZXI8QmFja2luZ1N0b3JlUHJpdmF0ZT4odGhpcywgJkJhY2tpbmdTdG9yZVByaXZhdGU6
OnJlbmRlck9uVGltZXIpKTsKKworICAgIC8vIE5lZWQgYSByZWN1cnNpdmUgbXV0ZXggdG8gYWNo
aWV2ZSBhIGdsb2JhbCBsb2NrLgorICAgIHB0aHJlYWRfbXV0ZXhhdHRyX3QgYXR0cjsKKyAgICBw
dGhyZWFkX211dGV4YXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX211dGV4YXR0cl9zZXR0
eXBlKCZhdHRyLCBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7CisgICAgcHRocmVhZF9tdXRleF9p
bml0KCZtX211dGV4LCAmYXR0cik7CisgICAgcHRocmVhZF9tdXRleGF0dHJfZGVzdHJveSgmYXR0
cik7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fYmxpdEdlbmVyYXRpb25Mb2NrLCAwKTsK
KyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmbV9ibGl0R2VuZXJhdGlvbkNvbmQsIDApOworfQorCitC
YWNraW5nU3RvcmVQcml2YXRlOjp+QmFja2luZ1N0b3JlUHJpdmF0ZSgpCit7CisgICAgQmFja2lu
Z1N0b3JlR2VvbWV0cnkqIGZyb250ID0gcmVpbnRlcnByZXRfY2FzdDxCYWNraW5nU3RvcmVHZW9t
ZXRyeSo+KG1fZnJvbnRTdGF0ZSk7CisgICAgZGVsZXRlIGZyb250OworICAgIG1fZnJvbnRTdGF0
ZSA9IDA7CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogYmFjayA9IHJlaW50ZXJwcmV0X2Nh
c3Q8QmFja2luZ1N0b3JlR2VvbWV0cnkqPihtX2JhY2tTdGF0ZSk7CisgICAgZGVsZXRlIGJhY2s7
CisgICAgbV9iYWNrU3RhdGUgPSAwOworCisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZtX211
dGV4KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGREaXJlY3RSZW5kZXJp
bmdUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgaWYgKG1fd2ViUGFnZS0+c2V0dGluZ3MoKS0+aXNE
aXJlY3RSZW5kZXJpbmdUb1dpbmRvd0VuYWJsZWQoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0
YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIGNvbnN0IHVuc2lnbmVkIHRpbGVzTmVjZXNzYXJ5ID0g
bWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgKiBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKTsK
KyAgICBjb25zdCB1bnNpZ25lZCB0aWxlc0F2YWlsYWJsZSA9IGN1cnJlbnRTdGF0ZS0+bnVtYmVy
T2ZUaWxlc1dpZGUoKSAqIGN1cnJlbnRTdGF0ZS0+bnVtYmVyT2ZUaWxlc0hpZ2goKTsKKyAgICBy
ZXR1cm4gdGlsZXNBdmFpbGFibGUgPCB0aWxlc05lY2Vzc2FyeTsKK30KKwordm9pZCBCYWNraW5n
U3RvcmVQcml2YXRlOjpzdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpCit7Cisg
ICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyA9IHRydWU7CisKKyAgICAvLyBNYWtlIHN1
cmUgdGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCBnZXRzIHRoZSBtZXNzYWdlIGJlZm9yZSB3ZSBw
cm9jZWVkCisgICAgLy8gYmVjYXVzZSBibGl0Q29udGVudHMgY2FuIGJlIGNhbGxlZCBmcm9tIHRo
aXMgdGhyZWFkIGFuZCBpdCBtdXN0IGhvbm9yCisgICAgLy8gdGhpcyBmbGFnLgorICAgIG1fc3Vz
cGVuZFNjcmVlblVwZGF0ZXMgPSB0cnVlOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2Vy
SW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50TWVzc2FnZSgpOwor
CisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIG1fd2ViUGFnZS0+ZC0+cmVz
ZXRDb21wb3NpdGluZ1N1cmZhY2UoKTsKKyNlbmRpZgorfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpS
ZXN1bWVVcGRhdGVPcGVyYXRpb24gb3ApCit7CisgICAgbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBk
YXRlcyA9IGZhbHNlOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIGlm
IChvcCAhPSBCYWNraW5nU3RvcmU6Ok5vbmUpCisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0TmVl
ZHNPbmVTaG90RHJhd2luZ1N5bmNocm9uaXphdGlvbigpOworI2VuZGlmCisKKyAgICAvLyBGb3Ig
dGhlIGRpcmVjdCByZW5kZXJpbmcgY2FzZSwgdGhlcmUgaXMgbm8gc3VjaCBvcGVyYXRpb24gYXMg
YmxpdCwKKyAgICAvLyB3ZSBoYXZlIHRvIHJlbmRlciB0byBnZXQgYW55dGhpbmcgdG8gdGhlIHNj
cmVlbi4KKyAgICBpZiAoc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSAmJiBvcCA9PSBC
YWNraW5nU3RvcmU6OkJsaXQpCisgICAgICAgIG9wID0gQmFja2luZ1N0b3JlOjpSZW5kZXJBbmRC
bGl0OworCisgICAgLy8gRG8gc29tZSByZW5kZXJpbmcgaWYgbmVjZXNzYXJ5LgorICAgIGlmIChv
cCA9PSBCYWNraW5nU3RvcmU6OlJlbmRlckFuZEJsaXQpCisgICAgICAgIHJlbmRlclZpc2libGVD
b250ZW50cyh0cnVlIC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisKKyAgICAvLyBNYWtlIHN1cmUg
dGhlIHVzZXIgaW50ZXJmYWNlIHRocmVhZCBnZXRzIHRoZSBtZXNzYWdlIGJlZm9yZSB3ZSBwcm9j
ZWVkCisgICAgLy8gYmVjYXVzZSBibGl0Q29udGVudHMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSB1
c2VyIGludGVyZmFjZSB0aHJlYWQgYW5kCisgICAgLy8gaXQgbXVzdCBob25vciB0aGlzIGZsYWcu
CisgICAgbV9zdXNwZW5kU2NyZWVuVXBkYXRlcyA9IGZhbHNlOworICAgIEJsYWNrQmVycnk6OlBs
YXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5zeW5jVG9DdXJyZW50
TWVzc2FnZSgpOworCisgICAgLy8gRG8gc29tZSBibGl0dGluZyBpZiBuZWNlc3NhcnkuCisgICAg
aWYgKChvcCA9PSBCYWNraW5nU3RvcmU6OkJsaXQgfHwgb3AgPT0gQmFja2luZ1N0b3JlOjpSZW5k
ZXJBbmRCbGl0KSAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAg
YmxpdFZpc2libGVDb250ZW50cygpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJl
cGFpbnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHdpbmRvd1JlY3QsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUp
Cit7CisjaWYgVVNFKE9QRU5WRykKKyAgICBBU1NFUlQobV9lZ2xEaXNwbGF5ICE9IEVHTF9OT19E
SVNQTEFZKTsKKyNlbmRpZgorCisgICAgaWYgKG1fc3VzcGVuZEJhY2tpbmdTdG9yZVVwZGF0ZXMp
CisgICAgICAgIHJldHVybjsKKworICAgICAvLyBJZiBpbW1lZGlhdGUgaXMgdHJ1ZSwgdGhlbiB3
ZSdyZSBiZWluZyBhc2tlZCB0byBwZXJmb3JtIHN5bmNocm9ub3VzbHkuCisgICAgIC8vIE5PVEU6
IFdlYkNvcmU6OlNjcm9sbFZpZXcgd2lsbCBjYWxsIHRoaXMgbWV0aG9kIHdpdGggaW1tZWRpYXRl
OnRydWUgYW5kIGNvbnRlbnRDaGFuZ2VkOmZhbHNlLgorICAgICAvLyBUaGlzIGlzIGEgc3BlY2lh
bCBjYXNlIGludHJvZHVjZWQgc3BlY2lmaWNhbGx5IGZvciB0aGUgQXBwbGUncyB3aW5kb3dzIHBv
cnQgYW5kIGNhbiBiZSBzYWZlbHkgaWdub3JlZCBJIGJlbGlldmUuCisgICAgIC8vIE5vdyB0aGlz
IG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBmcm9tIFdlYlBhZ2VQcml2YXRlOjpyZXBhaW50KCkuCisK
KyAgICBpZiAoY29udGVudENoYW5nZWQgJiYgIXdpbmRvd1JlY3QuaXNFbXB0eSgpKSB7CisgICAg
ICAgIC8vIFRoaXMgd2luZG93UmVjdCBpcyBpbiB1bnRyYW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJl
bGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgYnV0CisgICAgICAgIC8vIGl0IG5lZWRzIHRvIGJlIHRy
YW5zZm9ybWVkIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB0cmFuc2Zvcm1lZCBjb250ZW50
cy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwVG9U
cmFuc2Zvcm1lZChtX2NsaWVudC0+bWFwRnJvbVZpZXdwb3J0VG9Db250ZW50cyh3aW5kb3dSZWN0
KSk7CisgICAgICAgIHJlY3QuaW5mbGF0ZSgxIC8qZHgqLywgMSAvKmR5Ki8pOyAvLyBBY2NvdW50
IGZvciBhbnRpLWFsaWFzaW5nIG9mIHByZXZpb3VzIHJlbmRlcmluZyBydW5zLgorCisgICAgICAg
IC8vIEZJWE1FOiBUaGlzIHNob3VsZCBub3QgZXhwbGljaXRlbHkgZGVwZW5kIG9uIFdlYkNvcmU6
Oi4KKyAgICAgICAgV2ViQ29yZTo6SW50UmVjdCB0bXBSZWN0ID0gcmVjdDsKKyAgICAgICAgbV9j
bGllbnQtPmNsaXBUb1RyYW5zZm9ybWVkQ29udGVudHNSZWN0KHRtcFJlY3QpOworCisgICAgICAg
IHJlY3QgPSB0bXBSZWN0OworICAgICAgICBpZiAocmVjdC5pc0VtcHR5KCkpCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgICAgIHJlbmRlcihy
ZWN0LCBmYWxzZSAvKnJlbmRlckNvbnRlbnRPbmx5Ki8pOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBtX3JlbmRlclF1ZXVlLT5hZGRUb1F1ZXVlKFJlbmRlclF1ZXVlOjpSZWd1bGFyUmVuZGVy
LCByZWN0KTsKKyAgICB9Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2xvd1Njcm9s
bChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiB3aW5kb3dSZWN0LCBib29sIGltbWVkaWF0ZSkKK3sKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUK
KyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVudC4uLgorICAgIGRvdWJsZSB0aW1lID0g
V1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlmCisKKyAgICBzY3JvbGxpbmdTdGFydGVkSGVscGVy
KGRlbHRhKTsKKworICAgIC8vIFRoaXMgd2luZG93UmVjdCBpcyBpbiB1bnRyYW5zZm9ybWVkIGNv
b3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgYnV0CisgICAgLy8gaXQgbmVlZHMg
dG8gYmUgdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIHRyYW5zZm9ybWVk
IGNvbnRlbnRzLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3QgPSBtX3dlYlBhZ2UtPmQtPm1h
cFRvVHJhbnNmb3JtZWQobV9jbGllbnQtPm1hcEZyb21WaWV3cG9ydFRvQ29udGVudHMod2luZG93
UmVjdCkpOworCisgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgcmVuZGVyKHJlY3QsIGZhbHNl
IC8qcmVuZGVyQ29udGVudE9ubHkqLyk7CisgICAgZWxzZSB7CisgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlZpc2libGVTY3JvbGwsIHJlY3QpOworICAgICAg
ICAvLyBXZSBvbmx5IGJsaXQgaGVyZSBpZiB0aGUgY2xpZW50IGRpZCBub3QgZ2VuZXJhdGUgdGhl
IHNjcm9sbCBhcyB0aGUgY2xpZW50CisgICAgICAgIC8vIG5vdyBzdXBwb3J0cyBibGl0dGluZyBh
c3luY2hyb25vdXNseSBkdXJpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuCisgICAgICAgIGlmICghbV9j
bGllbnQtPmlzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKCkgJiYgIXNob3VsZERpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7CisgICAgfQor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgLy8gU3RvcCB0aGUgdGltZSBtZWFzdXJlbWVu
dC4KKyAgICBkb3VibGUgZWxhcHNlZCA9IFdURjo6Y3VycmVudFRpbWUoKSAtIHRpbWU7CisgICAg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxD
cml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNsb3dTY3JvbGwgZWxhcHNlZD0lZiIsIGVs
YXBzZWQpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsKGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjbGlwUmVj
dCkKK3sKKyAgICAvLyBJZiB3ZSBhcmUgZGlyZWN0IHJlbmRlcmluZyB0aGVuIHdlIGFyZSBmb3Jj
ZWQgdG8gZ28gZG93biB0aGUgc2xvdyBwYXRoCisgICAgLy8gdG8gc2Nyb2xsaW5nLgorICAgIGlm
IChzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0IHZpZXdwb3J0UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+
ZC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSk7CisgICAgICAgIHNsb3dTY3JvbGwoZGVsdGEs
IG1fd2ViUGFnZS0+ZC0+bWFwRnJvbVRyYW5zZm9ybWVkKHZpZXdwb3J0UmVjdCksIHRydWUgLypp
bW1lZGlhdGUqLyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyNpZiBERUJVR19CQUNLSU5H
U1RPUkUKKyAgICAvLyBTdGFydCB0aGUgdGltZSBtZWFzdXJlbWVudC4uLgorICAgIGRvdWJsZSB0
aW1lID0gV1RGOjpjdXJyZW50VGltZSgpOworI2VuZGlmCisKKyAgICBzY3JvbGxpbmdTdGFydGVk
SGVscGVyKGRlbHRhKTsKKworICAgIC8vIFdlIG9ubHkgYmxpdCBoZXJlIGlmIHRoZSBjbGllbnQg
ZGlkIG5vdCBnZW5lcmF0ZSB0aGUgc2Nyb2xsIGFzIHRoZSBjbGllbnQKKyAgICAvLyBub3cgc3Vw
cG9ydHMgYmxpdHRpbmcgYXN5bmNocm9ub3VzbHkgZHVyaW5nIHNjcm9sbCBvcGVyYXRpb25zLgor
ICAgIGlmICghbV9jbGllbnQtPmlzQ2xpZW50R2VuZXJhdGVkU2Nyb2xsKCkpCisgICAgICAgIGJs
aXRWaXNpYmxlQ29udGVudHMoKTsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIC8vIFN0
b3AgdGhlIHRpbWUgbWVhc3VyZW1lbnQuCisgICAgZG91YmxlIGVsYXBzZWQgPSBXVEY6OmN1cnJl
bnRUaW1lKCkgLSB0aW1lOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJy
eTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGwgZHg9JWQsIGR5PSVkIGVsYXBzZWQ9JWYiLCBkZWx0YS53aWR0aCgpLCBkZWx0YS5oZWlnaHQo
KSwgZWxhcHNlZCk7CisjZW5kaWYKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpzY3Jv
bGxpbmdTdGFydGVkSGVscGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRTaXplJiBkZWx0YSkKK3sKKyAg
ICAvLyBOb3RpZnkgdGhlIHJlbmRlciBxdWV1ZSBzbyB0aGF0IGl0IGNhbiBzaHVmZmxlIGFjY29y
ZGluZ2x5LgorICAgIG1fcmVuZGVyUXVldWUtPnVwZGF0ZVNvcnREaXJlY3Rpb24oZGVsdGEud2lk
dGgoKSwgZGVsdGEuaGVpZ2h0KCkpOworICAgIG1fcmVuZGVyUXVldWUtPnZpc2libGVDb250ZW50
Q2hhbmdlZCh2aXNpYmxlQ29udGVudHNSZWN0KCkpOworCisgICAgLy8gU2Nyb2xsIHRoZSBhY3R1
YWwgYmFja2luZ3N0b3JlLgorICAgIHNjcm9sbEJhY2tpbmdTdG9yZShkZWx0YS53aWR0aCgpLCBk
ZWx0YS5oZWlnaHQoKSk7CisKKyAgICAvLyBBZGQgYW55IG5ld2x5IHZpc2libGUgdGlsZXMgdGhh
dCBoYXZlIG5vdCBiZWVuIHByZXZpb3VzbHkgcmVuZGVyZWQgdG8gdGhlIHF1ZXVlCisgICAgLy8g
YW5kIGNoZWNrIGlmIHRoZSB0aWxlIHdhcyBwcmV2aW91c2x5IHJlbmRlcmVkIGJ5IHJlZ3VsYXIg
cmVuZGVyIGpvYi4KKyAgICB1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24o
KTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRTdXBwcmVzc05vblZpc2li
bGVSZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7CisjaWYgU1VQUFJFU1NfTk9OX1ZJU0lCTEVf
UkVHVUxBUl9SRU5ERVJfSk9CUworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICAvLyBBbHdh
eXMgc3VwcHJlc3Mgd2hlbiBsb2FkaW5nIGFzIHRoaXMgZHJhc3RpY2FsbHkgZGVjcmVhc2VzIHBh
Z2UgbG9hZGluZworICAgIC8vIHRpbWUuLi4KKyAgICByZXR1cm4gbV9jbGllbnQtPmlzTG9hZGlu
ZygpOworI2VuZGlmCit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkUGVyZm9y
bVJlbmRlckpvYnMoKSBjb25zdAoreworICAgIHJldHVybiAobV93ZWJQYWdlLT5pc1Zpc2libGUo
KSB8fCBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpKSAmJiAhbV9zdXNwZW5kUmVuZGVy
Sm9icyAmJiAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhbV9yZW5kZXJRdWV1ZS0+
aXNFbXB0eSghbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworfQorCitib29sIEJhY2tpbmdT
dG9yZVByaXZhdGU6OnNob3VsZFBlcmZvcm1SZWd1bGFyUmVuZGVySm9icygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIHNob3VsZFBlcmZvcm1SZW5kZXJKb2JzKCkgJiYgIW1fc3VzcGVuZFJlZ3VsYXJS
ZW5kZXJKb2JzOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0YXJ0UmVuZGVyVGlt
ZXIoKQoreworICAgIC8vIENhbGxlZCB3aGVuIHJlbmRlciBxdWV1ZSBoYXMgYSBuZXcgam9iIGFk
ZGVkLgorICAgIGlmIChtX3JlbmRlclRpbWVyLT5pc0FjdGl2ZSgpIHx8IG1fcmVuZGVyUXVldWUt
PmlzRW1wdHkoIW1fc3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzKSkKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OnN0YXJ0UmVuZGVyVGltZXIgdGltZT0lZiIsIFdURjo6Y3VycmVudFRpbWUoKSk7CisjZW5k
aWYKKyAgICBtX3JlbmRlclRpbWVyLT5zdGFydE9uZVNob3Qoc19yZW5kZXJUaW1lclRpbWVvdXQp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnN0b3BSZW5kZXJUaW1lcigpCit7Cisg
ICAgaWYgKCFtX3JlbmRlclRpbWVyLT5pc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBDYWxsZWQgd2hlbiB3ZSByZW5kZXIgc29tZXRoaW5nIHRvIHJlc3RhcnQuCisjaWYgREVC
VUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnN0b3BS
ZW5kZXJUaW1lciB0aW1lPSVmIiwgV1RGOjpjdXJyZW50VGltZSgpKTsKKyNlbmRpZgorICAgIG1f
cmVuZGVyVGltZXItPnN0b3AoKTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5k
ZXJPblRpbWVyKFdlYkNvcmU6OlRpbWVyPEJhY2tpbmdTdG9yZVByaXZhdGU+KikKK3sKKyAgICAv
LyBUaGlzIHRpbWVyIGlzIGEgdGhpcmQgbWV0aG9kIG9mIHN0YXJ0aW5nIGEgcmVuZGVyIG9wZXJh
dGlvbiB0aGF0IGlzIGEgY2F0Y2gtYWxsLiBJZiBtb3JlCisgICAgLy8gdGhhbiBzX3JlbmRlclRp
bWVyVGltZW91dCBlbGFwc2VzIHdpdGggbm8gcmVuZGVyaW5nIHRha2luZyBwbGFjZSBhbmQgcmVu
ZGVyIGpvYnMgaW4gdGhlIHF1ZXVlLCB0aGVuCisgICAgLy8gcmVuZGVyT25UaW1lciB3aWxsIGJl
IGNhbGxlZCB3aGljaCB3aWxsIGFjdHVhbGx5IHJlbmRlci4KKyAgICBpZiAoIXNob3VsZFBlcmZv
cm1SZW5kZXJKb2JzKCkpCisgICAgICAgIHJldHVybjsKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9S
RQorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJPblRpbWVyIHRpbWU9
JWYiLCBXVEY6OmN1cnJlbnRUaW1lKCkpOworI2VuZGlmCisgICAgd2hpbGUgKG1fcmVuZGVyUXVl
dWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9vbUpvYigpIHx8IG1fcmVuZGVyUXVldWUtPmhhc0N1cnJl
bnRWaXNpYmxlU2Nyb2xsSm9iKCkpCisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlbmRlcighbV9z
dXNwZW5kUmVndWxhclJlbmRlckpvYnMpOworCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVndWxh
clJlbmRlckpvYnMoKSB8fCAhbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJK
b2IoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9yZW5kZXJRdWV1ZS0+cmVuZGVyQWxsQ3Vy
cmVudFJlZ3VsYXJSZW5kZXJKb2JzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
cmVuZGVyT25JZGxlKCkKK3sKKyAgICBBU1NFUlQoc2hvdWxkUGVyZm9ybVJlbmRlckpvYnMoKSk7
CisKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93IHRoYXQgd2UgZW50ZXJlZCBhIG5l
dyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNhbiBkZXRlcm1pbmUgaWYgaXQgaXMg
dW5kZXIgcHJlc3N1cmUuCisgICAgbV9yZW5kZXJRdWV1ZS0+ZXZlbnRRdWV1ZUN5Y2xlZCgpOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZh
dGU6OnJlbmRlck9uSWRsZSIpOworI2VuZGlmCisKKyAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIo
IW1fc3VzcGVuZFJlZ3VsYXJSZW5kZXJKb2JzKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2
YXRlOjp3aWxsRmlyZVRpbWVyKCkKK3sKKyAgICAvLyBMZXQgdGhlIHJlbmRlciBxdWV1ZSBrbm93
IHRoYXQgd2UgZW50ZXJlZCBhIG5ldyBldmVudCBxdWV1ZSBjeWNsZQorICAgIC8vIHNvIGl0IGNh
biBkZXRlcm1pbmUgaWYgaXQgaXMgdW5kZXIgcHJlc3N1cmUuCisgICAgbV9yZW5kZXJRdWV1ZS0+
ZXZlbnRRdWV1ZUN5Y2xlZCgpOworCisgICAgaWYgKCFzaG91bGRQZXJmb3JtUmVndWxhclJlbmRl
ckpvYnMoKSB8fCAhbV9yZW5kZXJRdWV1ZS0+aGFzQ3VycmVudFJlZ3VsYXJSZW5kZXJKb2IoKSB8
fCAhbV9yZW5kZXJRdWV1ZS0+Y3VycmVudFJlZ3VsYXJSZW5kZXJKb2JCYXRjaFVuZGVyUHJlc3N1
cmUoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZl
bENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6d2lsbEZpcmVUaW1lciIpOworI2VuZGlm
CisKKyAgICAvLyBXZSd2ZSBkZXRlY3RlZCB0aGF0IHRoZSByZWd1bGFyIHJlbmRlciBqb2JzIGFy
ZSBjb21pbmcgdW5kZXIgcHJlc3N1cmUgbGlrZWx5CisgICAgLy8gZHVlIHRvIHRpbWVycyBmaXJp
bmcgcHJvZHVjaW5nIGludmFsaWRhdGlvbiBqb2JzIGFuZCBvdXIgZWZmb3J0cyB0byBicmVhayB0
aGVtCisgICAgLy8gdXAgaW50byBiaXRlIHNpemUgcGllY2VzIGhhcyBwcm9kdWNlZCBhIHNpdHVh
dGlvbiB3aGVyZSB3ZSBjYW4gbm90IGNvbXBsZXRlCisgICAgLy8gYSBiYXRjaCBvZiB0aGVtIGJl
Zm9yZSByZWNlaXZpbmcgbW9yZSB0aGF0IGludGVyc2VjdCB0aGVtIHdoaWNoIGNhdXNlcyB1cwor
ICAgIC8vIHRvIHN0YXJ0IHRoZSBiYXRjaCBvdmVyLiBUbyBtaXRpZ2F0ZSB0aGlzIHdlIGhhdmUg
dG8gZW1wdHkgdGhlIGN1cnJlbnQgYmF0Y2gKKyAgICAvLyB3aGVuIHRoaXMgaXMgZGV0ZWN0ZWQu
CisKKyAgICAvLyBXZSBzdGlsbCB3YW50IHRvIHBlcmZvcm0gcHJpb3JpdHkgam9icyBmaXJzdCB0
byBhdm9pZCByZWR1bmRhbnQgcGFpbnRzLgorICAgIHdoaWxlIChtX3JlbmRlclF1ZXVlLT5oYXND
dXJyZW50VmlzaWJsZVpvb21Kb2IoKSB8fCBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50VmlzaWJs
ZVNjcm9sbEpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXIoIW1fc3VzcGVuZFJl
Z3VsYXJSZW5kZXJKb2JzKTsKKworICAgIGlmIChtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50UmVn
dWxhclJlbmRlckpvYigpKQorICAgICAgICBtX3JlbmRlclF1ZXVlLT5yZW5kZXJBbGxDdXJyZW50
UmVndWxhclJlbmRlckpvYnMoKTsKKworICAgIC8vIExldCB0aGUgY2FsbGVyIHlpZWxkIGFuZCBy
ZXNjaGVkdWxlIHRoZSB0aW1lci4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1BsYXRmb3JtOjpJ
bnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmV4cGFuZGVkQ29udGVudHNSZWN0KCkgY29uc3QK
K3sKKyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDAp
LCBleHBhbmRlZENvbnRlbnRzU2l6ZSgpKTsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6dmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGludGVyc2VjdGlvbihtX2NsaWVudC0+dHJhbnNmb3JtZWRWaXNpYmxlQ29udGVudHNSZWN0KCks
CisgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50
UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnVuY2xpcHBlZFZpc2libGVD
b250ZW50c1JlY3QoKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+dHJhbnNmb3JtZWRW
aXNpYmxlQ29udGVudHNSZWN0KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hv
dWxkTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNv
bnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVYKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAg
ICAmJiBiYWNraW5nU3RvcmVSZWN0LngoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS54KCkKKyAg
ICAgICAgICAgICYmIGJhY2tpbmdTdG9yZVJlY3QueCgpID4gZXhwYW5kZWRDb250ZW50c1JlY3Qo
KS54KCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZVJpZ2h0KGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAgIHJl
dHVybiBjYW5Nb3ZlWChiYWNraW5nU3RvcmVSZWN0KQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC5yaWdodCgpIDwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpLnJpZ2h0KCkKKyAgICAgICAg
ICAgICYmIGJhY2tpbmdTdG9yZVJlY3QucmlnaHQoKSA8IGV4cGFuZGVkQ29udGVudHNSZWN0KCku
cmlnaHQoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpzaG91bGRNb3ZlVXAoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGNhbk1vdmVZKGJhY2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3Rv
cmVSZWN0LnkoKSA+IHZpc2libGVDb250ZW50c1JlY3QoKS55KCkKKyAgICAgICAgICAgICYmIGJh
Y2tpbmdTdG9yZVJlY3QueSgpID4gZXhwYW5kZWRDb250ZW50c1JlY3QoKS55KCk7Cit9CisKK2Jv
b2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2hvdWxkTW92ZURvd24oY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNhbk1vdmVZKGJh
Y2tpbmdTdG9yZVJlY3QpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVSZWN0LmJvdHRvbSgp
IDwgdmlzaWJsZUNvbnRlbnRzUmVjdCgpLmJvdHRvbSgpCisgICAgICAgICAgICAmJiBiYWNraW5n
U3RvcmVSZWN0LmJvdHRvbSgpIDwgZXhwYW5kZWRDb250ZW50c1JlY3QoKS5ib3R0b20oKTsKK30K
KworYm9vbCBCYWNraW5nU3RvcmVQcml2YXRlOjpjYW5Nb3ZlWChjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gYmFja2luZ1N0b3Jl
UmVjdC53aWR0aCgpID4gdmlzaWJsZUNvbnRlbnRzUmVjdCgpLndpZHRoKCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVkoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJh
Y2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuaGVp
Z2h0KCkgPiB2aXNpYmxlQ29udGVudHNSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK2Jvb2wgQmFja2lu
Z1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJlY3Qp
IGNvbnN0Cit7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IHJlY3Q7
CisgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJsZUNvbnRlbnRzUmVjdCA9IHRoaXMtPnZpc2li
bGVDb250ZW50c1JlY3QoKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSB0
aGlzLT5leHBhbmRlZENvbnRlbnRzUmVjdCgpOworICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgt
dGlsZVdpZHRoKCksIDApOworICAgIHJldHVybiBiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPj0g
dmlzaWJsZUNvbnRlbnRzUmVjdC5yaWdodCgpCisgICAgICAgICAgICAmJiBiYWNraW5nU3RvcmVS
ZWN0LngoKSA+PSBjb250ZW50c1JlY3QueCgpOworfQorCitib29sIEJhY2tpbmdTdG9yZVByaXZh
dGU6OmNhbk1vdmVSaWdodChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QKK3sK
KyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRlbnRz
UmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4cGFu
ZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKHRpbGVXaWR0aCgp
LCAwKTsKKyAgICByZXR1cm4gYmFja2luZ1N0b3JlUmVjdC54KCkgPD0gdmlzaWJsZUNvbnRlbnRz
UmVjdC54KCkKKyAgICAgICAgICAgICYmIChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0KCkgPD0gY29u
dGVudHNSZWN0LnJpZ2h0KCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0LnJpZ2h0
KCkgLSBjb250ZW50c1JlY3QucmlnaHQoKSkgPCB0aWxlV2lkdGgoKSk7Cit9CisKK2Jvb2wgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2FuTW92ZVVwKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0
KSBjb25zdAoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3QgPSByZWN0
OworICAgIFBsYXRmb3JtOjpJbnRSZWN0IHZpc2libGVDb250ZW50c1JlY3QgPSB0aGlzLT52aXNp
YmxlQ29udGVudHNSZWN0KCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0g
dGhpcy0+ZXhwYW5kZWRDb250ZW50c1JlY3QoKTsKKyAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUo
MCwgLXRpbGVIZWlnaHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QuYm90dG9tKCkg
Pj0gdmlzaWJsZUNvbnRlbnRzUmVjdC5ib3R0b20oKQorICAgICAgICAgICAgJiYgYmFja2luZ1N0
b3JlUmVjdC55KCkgPj0gY29udGVudHNSZWN0LnkoKTsKK30KKworYm9vbCBCYWNraW5nU3RvcmVQ
cml2YXRlOjpjYW5Nb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCkgY29uc3QK
K3sKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0ID0gdGhpcy0+dmlzaWJsZUNvbnRl
bnRzUmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzUmVjdCA9IHRoaXMtPmV4
cGFuZGVkQ29udGVudHNSZWN0KCk7CisgICAgYmFja2luZ1N0b3JlUmVjdC5tb3ZlKDAsIHRpbGVI
ZWlnaHQoKSk7CisgICAgcmV0dXJuIGJhY2tpbmdTdG9yZVJlY3QueSgpIDw9IHZpc2libGVDb250
ZW50c1JlY3QueSgpCisgICAgICAgICAgICAmJiAoYmFja2luZ1N0b3JlUmVjdC5ib3R0b20oKSA8
PSBjb250ZW50c1JlY3QuYm90dG9tKCkKKyAgICAgICAgICAgIHx8IChiYWNraW5nU3RvcmVSZWN0
LmJvdHRvbSgpIC0gY29udGVudHNSZWN0LmJvdHRvbSgpKSA8IHRpbGVIZWlnaHQoKSk7Cit9CisK
K1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OmJhY2tpbmdTdG9yZVJlY3RG
b3JTY3JvbGwoaW50IGRlbHRhWCwgaW50IGRlbHRhWSwgY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgLy8gVGhlIGN1cnJlbnQgcmVjdC4KKyAgICBQbGF0Zm9ybTo6
SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0ID0gcmVjdDsKKworICAgIC8vIFRoaXMgbWV0aG9kIHVz
ZXMgdGhlIGRlbHRhIHZhbHVlcyB0byBkZXNjcmliZSB0aGUgYmFja2luZ3N0b3JlIHJlY3QKKyAg
ICAvLyBnaXZlbiB0aGUgY3VycmVudCBzY3JvbGwgZGlyZWN0aW9uIGFuZCB0aGUgdmlld3BvcnQg
cG9zaXRpb24uIEhvd2V2ZXIsCisgICAgLy8gdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aXRo
IG5vIGRlbHRhcyB3aGF0c29ldmVyIGZvciBpbnN0YW5jZSB3aGVuCisgICAgLy8gdGhlIGNvbnRl
bnRzIHNpemUgY2hhbmdlcyBvciB0aGUgb3JpZW50YXRpb24gY2hhbmdlcy4gSW4gdGhpcyBjYXNl
LCB3ZQorICAgIC8vIHdhbnQgdG8gdXNlIHRoZSBwcmV2aW91cyBzY3JvbGwgZGlyZWN0aW9uIHRv
IGRlc2NyaWJlIHRoZSBiYWNraW5nc3RvcmUKKyAgICAvLyByZWN0LiBUaGlzIHdpbGwgcmVzdWx0
IGluIGxlc3MgY2hlY2tlcmJvYXJkLgorICAgIGlmICghZGVsdGFYICYmICFkZWx0YVkpIHsKKyAg
ICAgICAgZGVsdGFYID0gbV9wcmV2aW91c0RlbHRhLndpZHRoKCk7CisgICAgICAgIGRlbHRhWSA9
IG1fcHJldmlvdXNEZWx0YS5oZWlnaHQoKTsKKyAgICB9CisgICAgbV9wcmV2aW91c0RlbHRhID0g
UGxhdGZvcm06OkludFNpemUoZGVsdGFYLCBkZWx0YVkpOworCisgICAgLy8gUmV0dXJuIHRvIG9y
aWdpbiBpZiBuZWVkIGJlLgorICAgIGlmICghY2FuTW92ZVgoYmFja2luZ1N0b3JlUmVjdCkgJiYg
YmFja2luZ1N0b3JlUmVjdC54KCkpCisgICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WCgwKTsK
KworICAgIGlmICghY2FuTW92ZVkoYmFja2luZ1N0b3JlUmVjdCkgJiYgYmFja2luZ1N0b3JlUmVj
dC55KCkpCisgICAgICAgIGJhY2tpbmdTdG9yZVJlY3Quc2V0WSgwKTsKKworICAgIC8vIE1vdmUg
dGhlIHJlY3QgbGVmdC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVj
dCkgfHwgKGRlbHRhWCA+IDAgJiYgY2FuTW92ZUxlZnQoYmFja2luZ1N0b3JlUmVjdCkpKQorICAg
ICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoLXRpbGVXaWR0aCgpLCAwKTsKKworICAgIC8vIE1v
dmUgdGhlIHJlY3QgcmlnaHQuCisgICAgd2hpbGUgKHNob3VsZE1vdmVSaWdodChiYWNraW5nU3Rv
cmVSZWN0KSB8fCAoZGVsdGFYIDwgMCAmJiBjYW5Nb3ZlUmlnaHQoYmFja2luZ1N0b3JlUmVjdCkp
KQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUodGlsZVdpZHRoKCksIDApOworCisgICAg
Ly8gTW92ZSB0aGUgcmVjdCB1cC4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZVVwKGJhY2tpbmdTdG9y
ZVJlY3QpIHx8IChkZWx0YVkgPiAwICYmIGNhbk1vdmVVcChiYWNraW5nU3RvcmVSZWN0KSkpCisg
ICAgICAgIGJhY2tpbmdTdG9yZVJlY3QubW92ZSgwLCAtdGlsZUhlaWdodCgpKTsKKworICAgIC8v
IE1vdmUgdGhlIHJlY3QgZG93bi4KKyAgICB3aGlsZSAoc2hvdWxkTW92ZURvd24oYmFja2luZ1N0
b3JlUmVjdCkgfHwgKGRlbHRhWSA8IDAgJiYgY2FuTW92ZURvd24oYmFja2luZ1N0b3JlUmVjdCkp
KQorICAgICAgICBiYWNraW5nU3RvcmVSZWN0Lm1vdmUoMCwgdGlsZUhlaWdodCgpKTsKKworICAg
IHJldHVybiBiYWNraW5nU3RvcmVSZWN0OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6
OnNldEJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9y
ZVJlY3QpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdlLT5kLT5zZXRT
aG91bGRSZXNldFRpbGVzV2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgUGxhdGZvcm06OkludFJlY3QgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QgPSBmcm9udFN0
YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKTsKKworICAgIGlmIChiYWNraW5nU3RvcmVSZWN0ID09
IGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19U
SUxFTUFUUklYCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnNldEJhY2tpbmdT
dG9yZVJlY3QgY2hhbmdlZCBmcm9tICglZCwlZCAlZHglZCkgdG8gKCVkLCVkICVkeCVkKSIsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC54KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC55KCksCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50QmFja2luZ1N0b3JlUmVjdC53aWR0aCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEJhY2tpbmdTdG9yZVJlY3QuaGVp
Z2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNraW5nU3RvcmVSZWN0LngoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tpbmdTdG9yZVJlY3QueSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC53aWR0aCgpLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYmFja2luZ1N0b3JlUmVjdC5oZWlnaHQoKSk7CisjZW5kaWYKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7Cisg
ICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBU
aWxlSW5kZXhMaXN0IGluZGV4ZXNUb0ZpbGwgPSBpbmRleGVzRm9yQmFja2luZ1N0b3JlUmVjdChi
YWNraW5nU3RvcmVSZWN0KTsKKworICAgIEFTU0VSVChzdGF0aWNfY2FzdDxpbnQ+KGluZGV4ZXNU
b0ZpbGwuc2l6ZSgpKSA9PSBjdXJyZW50TWFwLnNpemUoKSk7CisKKyAgICBUaWxlTWFwIG5ld1Rp
bGVNYXA7CisgICAgVGlsZU1hcCBsZWZ0T3ZlclRpbGVzOworCisgICAgLy8gSXRlcmF0ZSB0aHJv
dWdoIG91ciBjdXJyZW50IHRpbGUgbWFwIGFuZCBhZGQgdGlsZXMgdGhhdCBhcmUgcmVuZGVyZWQg
d2l0aAorICAgIC8vIG91ciBuZXcgYmFja2luZyBzdG9yZSByZWN0LgorICAgIFRpbGVNYXA6OmNv
bnN0X2l0ZXJhdG9yIHRpbGVNYXBFbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGls
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IHRpbGVN
YXBFbmQ7ICsraXQpIHsKKyAgICAgICAgVGlsZUluZGV4IG9sZEluZGV4ID0gaXQtPmZpcnN0Owor
ICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlID0gaXQtPnNlY29uZDsKKworICAgICAgICAv
LyBSZXNldCB0aGUgb2xkIGluZGV4LgorICAgICAgICByZXNldFRpbGUob2xkSW5kZXgsIHRpbGUs
IGZhbHNlIC8qcmVzZXRCYWNrZ3JvdW5kKi8pOworCisgICAgICAgIC8vIE9yaWdpbiBvZiBsYXN0
IGNvbW1pdHRlZCByZW5kZXIgZm9yIHRpbGUgaW4gdHJhbnNmb3JtZWQgY29udGVudCBjb29yZGlu
YXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mTGFzdFJl
bmRlckZvclRpbGUob2xkSW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNraW5nU3RvcmVSZWN0KTsKKwor
ICAgICAgICAvLyBJZiB0aGUgbmV3IGJhY2tpbmcgc3RvcmUgcmVjdCBjb250YWlucyB0aGlzIG9y
aWdpbiwgdGhlbiBpbnNlcnQgdGhlIHRpbGUgdGhlcmUKKyAgICAgICAgLy8gYW5kIG1hcmsgaXQg
YXMgbm8gbG9uZ2VyIHNoaWZ0ZWQuIE5vdGU6IFBsYXRmb3JtOjpJbnRSZWN0Ojpjb250YWlucyBj
aGVja3MgZm9yIGEgMXgxIHJlY3QKKyAgICAgICAgLy8gYmVsb3cgYW5kIHRvIHRoZSByaWdodCBv
ZiB0aGUgb3JpZ2luIHNvIGl0IGlzIGNvcnJlY3QgdXNhZ2UgaGVyZS4KKyAgICAgICAgaWYgKGJh
Y2tpbmdTdG9yZVJlY3QuY29udGFpbnMob3JpZ2luKSkgeworICAgICAgICAgICAgVGlsZUluZGV4
IG5ld0luZGV4ID0gaW5kZXhPZlRpbGUob3JpZ2luLCBiYWNraW5nU3RvcmVSZWN0KTsKKyAgICAg
ICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICAg
ICAgICAgIGlmIChtX3JlbmRlclF1ZXVlLT5yZWd1bGFyUmVuZGVySm9ic1ByZXZpb3VzbHlBdHRl
bXB0ZWRCdXROb3RSZW5kZXJlZChyZWN0KSkgeworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBy
ZW5kZXIgcXVldWUgcHJldmlvdXNseSB0cmllZCB0byByZW5kZXIgdGhpcyB0aWxlLCBidXQgdGhl
CisgICAgICAgICAgICAgICAgLy8gYmFja2luZ3N0b3JlIHdhc24ndCBpbiB0aGUgY29ycmVjdCBw
bGFjZSBvciB0aGUgdGlsZSB3YXNuJ3QgdmlzaWJsZQorICAgICAgICAgICAgICAgIC8vIGF0IHRo
ZSB0aW1lIHRoZW4gd2UgY2FuJ3Qgc2ltcGx5IHJlc3RvcmUgdGhlIHRpbGUgc2luY2UgdGhlIGNv
bnRlbnQKKyAgICAgICAgICAgICAgICAvLyBpcyBub3cgaW52YWxpZCBhcyBmYXIgYXMgV2ViS2l0
IGlzIGNvbmNlcm5lZC4gSW5zdGVhZCwgd2UgY2xlYXIKKyAgICAgICAgICAgICAgICAvLyB0aGUg
dGlsZSBoZXJlIG9mIHRoZSByZWdpb24gYW5kIHRoZW4gcHV0IHRoZSB0aWxlIGluIHRoZSByZW5k
ZXIKKyAgICAgICAgICAgICAgICAvLyBxdWV1ZSBhZ2Fpbi4KKworICAgICAgICAgICAgICAgIC8v
IEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQgcmVnaW9uIHRvIGdldCB0
aGUgYXJlYXMKKyAgICAgICAgICAgICAgICAvLyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQgdG8g
Y2xlYXIuCisgICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gdGlsZU5vdFJl
bmRlcmVkUmVnaW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb246OmludGVyc2VjdFJlZ2lvbnMo
bV9yZW5kZXJRdWV1ZS0+cmVndWxhclJlbmRlckpvYnNOb3RSZW5kZXJlZFJlZ2lvbigpLCByZWN0
KTsKKyAgICAgICAgICAgICAgICBjbGVhckFuZFVwZGF0ZVRpbGVPZk5vdFJlbmRlcmVkUmVnaW9u
KG5ld0luZGV4LCB0aWxlLCB0aWxlTm90UmVuZGVyZWRSZWdpb24sIGJhY2tpbmdTdG9yZVJlY3Qp
OworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGV4dGVudHMgPSB0aWxlTm90UmVuZGVyZWRSZWdpb24uZXh0ZW50cygpOworICAgICAgICAg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2YXRlOjpzZXRCYWNraW5nU3RvcmVSZWN0
IGRpZCBjbGVhciB0aWxlICVkLCVkICVkeCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53aWR0aCgpLCBl
eHRlbnRzLmhlaWdodCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgICAgICAvLyBNYXJrIGFzIG5lZWRpbmcgdXBkYXRlLgorICAgICAgICAgICAgICAgIGlmICgh
dGlsZS0+ZnJvbnRCdWZmZXIoKS0+aXNSZW5kZXJlZCgpCisgICAgICAgICAgICAgICAgICAgICYm
ICFpc0N1cnJlbnRWaXNpYmxlSm9iKG5ld0luZGV4LCB0aWxlLCBiYWNraW5nU3RvcmVSZWN0KSkK
KyAgICAgICAgICAgICAgICAgICAgdXBkYXRlVGlsZShvcmlnaW4sIGZhbHNlIC8qaW1tZWRpYXRl
Ki8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBEbyBzb21lIGJvb2trZWVwaW5n
IHdpdGggc2hpZnRpbmcgdGlsZXMuLi4KKyAgICAgICAgICAgIHRpbGUtPmNsZWFyU2hpZnQoKTsK
KyAgICAgICAgICAgIHRpbGUtPnNldENvbW1pdHRlZCh0cnVlKTsKKworICAgICAgICAgICAgc2l6
ZV90IGkgPSBpbmRleGVzVG9GaWxsLmZpbmQobmV3SW5kZXgpOworICAgICAgICAgICAgQVNTRVJU
KGkgIT0gV1RGOjpub3RGb3VuZCk7CisgICAgICAgICAgICBpbmRleGVzVG9GaWxsLnJlbW92ZShp
KTsKKyAgICAgICAgICAgIG5ld1RpbGVNYXAuYWRkKG5ld0luZGV4LCB0aWxlKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoaXMgdGlsZSBhbmQgaW5kZXggc28gd2Ug
Y2FuIGFkZCBpdCB0byB0aGUgcmVtYWluaW5nIGxlZnQgb3ZlciBzcG90cy4uLgorICAgICAgICAg
ICAgbGVmdE92ZXJUaWxlcy5hZGQob2xkSW5kZXgsIHRpbGUpOworICAgICAgICB9CisgICAgfQor
CisgICAgQVNTRVJUKHN0YXRpY19jYXN0PGludD4oaW5kZXhlc1RvRmlsbC5zaXplKCkpID09IGxl
ZnRPdmVyVGlsZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgVGlsZU1hcDo6Y29u
c3RfaXRlcmF0b3IgbGVmdE92ZXJFbmQgPSBsZWZ0T3ZlclRpbGVzLmVuZCgpOworICAgIGZvciAo
VGlsZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBsZWZ0T3ZlclRpbGVzLmJlZ2luKCk7IGl0ICE9
IGxlZnRPdmVyRW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBvbGRJbmRleCA9IGl0LT5m
aXJzdDsKKyAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisgICAg
ICAgIGlmIChpID49IGluZGV4ZXNUb0ZpbGwuc2l6ZSgpKSB7CisgICAgICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAg
VGlsZUluZGV4IG5ld0luZGV4ID0gaW5kZXhlc1RvRmlsbC5hdChpKTsKKworICAgICAgICAvLyBP
cmlnaW4gb2YgbGFzdCBjb21taXR0ZWQgcmVuZGVyIGZvciB0aWxlIGluIHRyYW5zZm9ybWVkIGNv
bnRlbnQgY29vcmRpbmF0ZXMuCisgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZk9s
ZCA9IG9yaWdpbk9mTGFzdFJlbmRlckZvclRpbGUob2xkSW5kZXgsIHRpbGUsIGN1cnJlbnRCYWNr
aW5nU3RvcmVSZWN0KTsKKyAgICAgICAgLy8gT3JpZ2luIG9mIHRoZSBuZXcgaW5kZXggZm9yIHRo
ZSBuZXcgYmFja2luZyBzdG9yZSByZWN0LgorICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3Jp
Z2luT2ZOZXcgPSBvcmlnaW5PZlRpbGUobmV3SW5kZXgsIGJhY2tpbmdTdG9yZVJlY3QpOworCisg
ICAgICAgIC8vIE1hcmsgYXMgbmVlZGluZyB1cGRhdGUuCisgICAgICAgIHVwZGF0ZVRpbGUob3Jp
Z2luT2ZOZXcsIGZhbHNlIC8qaW1tZWRpYXRlKi8pOworCisgICAgICAgIHRpbGUtPmNsZWFyU2hp
ZnQoKTsKKyAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKGZhbHNlKTsKKyAgICAgICAgdGlsZS0+
c2V0SG9yaXpvbnRhbFNoaWZ0KChvcmlnaW5PZk9sZC54KCkgLSBvcmlnaW5PZk5ldy54KCkpIC8g
dGlsZVdpZHRoKCkpOworICAgICAgICB0aWxlLT5zZXRWZXJ0aWNhbFNoaWZ0KChvcmlnaW5PZk9s
ZC55KCkgLSBvcmlnaW5PZk5ldy55KCkpIC8gdGlsZUhlaWdodCgpKTsKKworICAgICAgICBuZXdU
aWxlTWFwLmFkZChuZXdJbmRleCwgdGlsZSk7CisKKyAgICAgICAgKytpOworICAgIH0KKworICAg
IC8vIENoZWNrcyB0byBtYWtlIHN1cmUgd2UgaGF2ZW4ndCBsb3N0IGFueSB0aWxlcy4KKyAgICBB
U1NFUlQoY3VycmVudE1hcC5zaXplKCkgPT0gbmV3VGlsZU1hcC5zaXplKCkpOworCisgICAgYmFj
a1N0YXRlKCktPnNldE51bWJlck9mVGlsZXNXaWRlKGJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSAv
IHRpbGVXaWR0aCgpKTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0TnVtYmVyT2ZUaWxlc0hpZ2goYmFj
a2luZ1N0b3JlUmVjdC5oZWlnaHQoKSAvIHRpbGVIZWlnaHQoKSk7CisgICAgYmFja1N0YXRlKCkt
PnNldEJhY2tpbmdTdG9yZU9mZnNldChiYWNraW5nU3RvcmVSZWN0LmxvY2F0aW9uKCkpOworICAg
IGJhY2tTdGF0ZSgpLT5zZXRUaWxlTWFwKG5ld1RpbGVNYXApOworCisgICAgc3dhcFN0YXRlKCk7
Cit9CisKK0JhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVJbmRleExpc3QgQmFja2luZ1N0b3JlUHJp
dmF0ZTo6aW5kZXhlc0ZvckJhY2tpbmdTdG9yZVJlY3QoY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7CisgICAgVGlsZUluZGV4TGlzdCBpbmRleGVzOwor
ICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGJhY2tpbmdTdG9yZVJlY3Qud2lkdGgoKSAvIHRp
bGVXaWR0aCgpOworICAgIGludCBudW1iZXJPZlRpbGVzSGlnaCA9IGJhY2tpbmdTdG9yZVJlY3Qu
aGVpZ2h0KCkgLyB0aWxlSGVpZ2h0KCk7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBudW1iZXJP
ZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtYmVyT2ZU
aWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGlsZUluZGV4IGluZGV4KHgsIHkpOworICAg
ICAgICAgICAgaW5kZXhlcy5hcHBlbmQoaW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIHJl
dHVybiBpbmRleGVzOworfQorCitQbGF0Zm9ybTo6SW50UG9pbnQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6b3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBCYWNraW5nU3RvcmVUaWxlKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50
UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3JpZ2luT2ZUaWxl
KGluZGV4T2ZMYXN0UmVuZGVyRm9yVGlsZShpbmRleCwgdGlsZSksIGJhY2tpbmdTdG9yZVJlY3Qp
OworfQorCitUaWxlSW5kZXggQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW5kZXhPZkxhc3RSZW5kZXJG
b3JUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUpIGNv
bnN0Cit7CisgICAgcmV0dXJuIFRpbGVJbmRleChpbmRleC5pKCkgKyB0aWxlLT5ob3Jpem9udGFs
U2hpZnQoKSwgaW5kZXguaigpICsgdGlsZS0+dmVydGljYWxTaGlmdCgpKTsKK30KKworVGlsZUlu
ZGV4IEJhY2tpbmdTdG9yZVByaXZhdGU6OmluZGV4T2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQ
b2ludCYgb3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25zdAoreworICAg
IGludCBvZmZzZXRYID0gb3JpZ2luLngoKSAtIGJhY2tpbmdTdG9yZVJlY3QueCgpOworICAgIGlu
dCBvZmZzZXRZID0gb3JpZ2luLnkoKSAtIGJhY2tpbmdTdG9yZVJlY3QueSgpOworICAgIGlmIChv
ZmZzZXRYKQorICAgICAgICBvZmZzZXRYID0gb2Zmc2V0WCAvIHRpbGVXaWR0aCgpOworICAgIGlm
IChvZmZzZXRZKQorICAgICAgICBvZmZzZXRZID0gb2Zmc2V0WSAvIHRpbGVIZWlnaHQoKTsKKyAg
ICByZXR1cm4gVGlsZUluZGV4KG9mZnNldFgsIG9mZnNldFkpOworfQorCit2b2lkIEJhY2tpbmdT
dG9yZVByaXZhdGU6OmNsZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oY29uc3Qg
VGlsZUluZGV4JiBpbmRleCwgQmFja2luZ1N0b3JlVGlsZSogdGlsZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYgdGlsZU5vdFJlbmRlcmVkUmVnaW9uLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0LAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXBk
YXRlKQoreworICAgIC8vIEludGVyc2VjdCB0aGUgdGlsZSB3aXRoIHRoZSBub3QgcmVuZGVyZWQg
cmVnaW9uIHRvIGdldCB0aGUgYXJlYXMKKyAgICAvLyBvZiB0aGUgdGlsZSB0aGF0IHdlIG5lZWQg
dG8gY2xlYXIuCisgICAgSW50UmVjdExpc3QgdGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdHMgPSB0
aWxlTm90UmVuZGVyZWRSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QgPSB0aWxlTm90UmVuZGVyZWRS
ZWdpb25SZWN0cy5hdChpKTsKKyAgICAgICAgLy8gQ2xlYXIgdGhlIHJlbmRlciBxdWV1ZSBvZiB0
aGlzIHJlY3QuCisgICAgICAgIG1fcmVuZGVyUXVldWUtPmNsZWFyKHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3QsIHRydWUgLypjbGVhclJlZ3VsYXJSZW5kZXJKb2JzKi8pOworCisgICAgICAgIGlm
ICh1cGRhdGUpIHsKKyAgICAgICAgICAgIC8vIEFkZCBpdCBhZ2FpbiBhcyBhIHJlZ3VsYXIgcmVu
ZGVyIGpvYi4KKyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVl
dWU6OlJlZ3VsYXJSZW5kZXIsIHRpbGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QpOworICAgICAgICB9
CisKKyAgICAgICAgLy8gRmluZCB0aGUgb3JpZ2luIG9mIHRoaXMgdGlsZS4KKyAgICAgICAgUGxh
dGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3Jl
UmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRpbGUgY29vcmRpbmF0ZXMuCisgICAgICAgIHRp
bGVOb3RSZW5kZXJlZFJlZ2lvblJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOwor
CisgICAgICAgIC8vIENsZWFyIHRoZSB0aWxlIG9mIHRoaXMgcmVnaW9uLgorICAgICAgICB0aWxl
LT5mcm9udEJ1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKHRpbGVOb3RSZW5kZXJlZFJlZ2lv
blJlY3QpOworICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCktPmNsZWFyUmVuZGVyZWRSZWdpb24o
dGlsZU5vdFJlbmRlcmVkUmVnaW9uUmVjdCk7CisgICAgfQorfQorCitib29sIEJhY2tpbmdTdG9y
ZVByaXZhdGU6OmlzQ3VycmVudFZpc2libGVKb2IoY29uc3QgVGlsZUluZGV4JiBpbmRleCwgQmFj
a2luZ1N0b3JlVGlsZSogdGlsZSwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9y
ZVJlY3QpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgaWYgdGhlIHdob2xlIHJlY3QgaXMg
aW4gdGhlIHF1ZXVlLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IHdob2xlUmVjdCA9IFBsYXRmb3Jt
OjpJbnRSZWN0KG9yaWdpbk9mVGlsZShpbmRleCwgYmFja2luZ1N0b3JlUmVjdCksIHRpbGVTaXpl
KCkpOworICAgIGlmIChtX3JlbmRlclF1ZXVlLT5pc0N1cnJlbnRWaXNpYmxlU2Nyb2xsSm9iKHdo
b2xlUmVjdCkgfHwgbV9yZW5kZXJRdWV1ZS0+aXNDdXJyZW50VmlzaWJsZVNjcm9sbEpvYkNvbXBs
ZXRlZCh3aG9sZVJlY3QpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFNlY29uZCBj
aGVjayBpZiB0aGUgaW5kaXZpZHVhbCBwYXJ0cyBvZiB0aGUgbm9uLXJlbmRlcmVkIHJlZ2lvbiBh
cmUgaW4gdGhlIHJlZ3VsYXIgcXVldWUuCisgICAgYm9vbCBpc0N1cnJlbnQgPSB0cnVlOyAvLyBJ
dCBpcyB0cnVlIHVudGlsIGl0IGlzbid0IDopCisKKyAgICBJbnRSZWN0TGlzdCB0aWxlTm90UmVu
ZGVyZWRSZWdpb25SZWN0cyA9IHRpbGUtPmZyb250QnVmZmVyKCktPm5vdFJlbmRlcmVkUmVnaW9u
KCkucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVOb3RSZW5kZXJlZFJl
Z2lvblJlY3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVO
b3RSZW5kZXJlZFJlZ2lvblJlY3QgPSB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0cy5hdChpKTsK
KyAgICAgICAgUGxhdGZvcm06OkludFBvaW50IG9yaWdpbiA9IG9yaWdpbk9mVGlsZShpbmRleCwg
YmFja2luZ1N0b3JlUmVjdCk7CisKKyAgICAgICAgLy8gTWFwIHRvIHRyYW5zZm9ybWVkIGNvbnRl
bnRzIGNvb3JkaW5hdGVzLgorICAgICAgICB0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0Lm1vdmUo
b3JpZ2luLngoKSwgb3JpZ2luLnkoKSk7CisKKyAgICAgICAgaXNDdXJyZW50ID0gbV9yZW5kZXJR
dWV1ZS0+aXNDdXJyZW50UmVndWxhclJlbmRlckpvYih0aWxlTm90UmVuZGVyZWRSZWdpb25SZWN0
KSA/IGlzQ3VycmVudCA6IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBpc0N1cnJlbnQ7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6c2Nyb2xsQmFja2luZ1N0b3JlKGludCBkZWx0
YVgsIGludCBkZWx0YVkpCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKKyAgICAgICAgbV93ZWJQYWdl
LT5kLT5zZXRTaG91bGRSZXNldFRpbGVzV2hlblNob3duKHRydWUpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIG91ciBuZXcgcHJlZmVycmVkIG1hdHJpeCBkaW1l
bnNpb24uCisgICAgaWYgKGRlbHRhWCB8fCBkZWx0YVkpCisgICAgICAgIG1fcHJlZmVycmVkVGls
ZU1hdHJpeERpbWVuc2lvbiA9IGFicyhkZWx0YVgpID4gYWJzKGRlbHRhWSkgPyBIb3Jpem9udGFs
IDogVmVydGljYWw7CisKKyAgICAvLyBDYWxjdWxhdGUgb3VyIHByZWZlcnJlZCBtYXRyaXggZ2Vv
bWV0cnkuCisgICAgRGl2aXNvciBkaXZpc29yID0gYmVzdERpdmlzb3IoZXhwYW5kZWRDb250ZW50
c1NpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlV2lkdGgoKSwg
dGlsZUhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW1O
dW1iZXJPZlRpbGVzV2lkZSgpLCBtaW5pbXVtTnVtYmVyT2ZUaWxlc0hpZ2goKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFRpbGVNYXRyaXhEaW1lbnNpb24p
OworCisjaWYgREVCVUdfVElMRU1BVFJJWAorICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2co
QmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWwsICJCYWNraW5nU3RvcmVQcml2
YXRlOjpzY3JvbGxCYWNraW5nU3RvcmUgZGl2aXNvciAlZHglZCIsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkaXZpc29yLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGl2
aXNvci5zZWNvbmQpOworI2VuZGlmCisKKyAgICAvLyBJbml0aWFsaXplIGEgcmVjdCB3aXRoIHRo
YXQgbmV3IGdlb21ldHJ5LgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGJhY2tpbmdTdG9yZVJlY3Qo
MCwgMCwgZGl2aXNvci5maXJzdCAqIHRpbGVXaWR0aCgpLCBkaXZpc29yLnNlY29uZCAqIHRpbGVI
ZWlnaHQoKSk7CisKKyAgICAvLyBTY3JvbGwgdGhhdCByZWN0IHNvIHRoYXQgaXQgZml0cyBvdXIg
Y29udGVudHMgYW5kIHZpZXdwb3J0IGFuZCBzY3JvbGwgZGVsdGEuCisgICAgYmFja2luZ1N0b3Jl
UmVjdCA9IGJhY2tpbmdTdG9yZVJlY3RGb3JTY3JvbGwoZGVsdGFYLCBkZWx0YVksIGJhY2tpbmdT
dG9yZVJlY3QpOworCisgICAgQVNTRVJUKCFiYWNraW5nU3RvcmVSZWN0LmlzRW1wdHkoKSk7CisK
KyAgICBzZXRCYWNraW5nU3RvcmVSZWN0KGJhY2tpbmdTdG9yZVJlY3QpOworfQorCitib29sIEJh
Y2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBJbnRSZWN0TGlzdCYgcmVjdExpc3QsIGJv
b2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgLy8gRklYTUU6IFdlIGN5Y2xlIHRocm91Z2gg
b25lIGJ5IG9uZSBhbmQgb25seSBibGl0IHRoZSBjb250ZW50cyBhdCB0aGUgZW5kLgorICAgIC8v
IFRoaXMgY2FuIGJlIGltcHJvdmVkIHVwb24gaWYgd2UgaGFkIGEgbWFwRnJvbVRyYW5zZm9ybWVk
Q29udGVudHNUb1RpbGVzIHRoYXQKKyAgICAvLyB0b29rIGEgc2V0IG9mIHJlY3RzIGFuZCBkZWNv
bXBvc2VkIHRoZW0gYXBwcm9wcmlhdGVseS4KKyAgICBib29sIHJlbmRlcmVkID0gZmFsc2U7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0TGlzdC5zaXplKCk7ICsraSkKKyAgICAgICAg
cmVuZGVyZWQgPSByZW5kZXIocmVjdExpc3QuYXQoaSksIHRydWUpID8gdHJ1ZSA6IHJlbmRlcmVk
OworCisgICAgaWYgKHJlbmRlcmVkICYmICFyZW5kZXJDb250ZW50T25seSkgeworICAgICAgICBp
ZiAoIXNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgICAgICBibGl0Vmlz
aWJsZUNvbnRlbnRzKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludmFsaWRhdGVXaW5k
b3coKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVuZGVyZWQ7Cit9CisKK2Jvb2wgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6cmVuZGVyRGlyZWN0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IHJlY3QsIGJvb2wgcmVuZGVyQ29udGVudE9ubHkpCit7CisgICAgcmVxdWVzdExheW91dElmTmVl
ZGVkKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSByZWN0OworICAgIGRp
cnR5UmVjdC5pbnRlcnNlY3QodW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKworICAg
IGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBzY3JlZW5SZWN0ID0gbV9jbGllbnQtPm1hcEZyb21UcmFuc2Zvcm1l
ZENvbnRlbnRzVG9UcmFuc2Zvcm1lZFZpZXdwb3J0KGRpcnR5UmVjdCk7CisgICAgd2luZG93RnJv
bnRCdWZmZXJTdGF0ZSgpLT5jbGVhckJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisgICAgY29w
eVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5kb3coKTsKKworICAgIHBhaW50RGVm
YXVsdEJhY2tncm91bmQoZGlydHlSZWN0LCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCgpLCB0cnVlIC8q
Zmx1c2gqLyk7CisKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gdW5jbGlw
cGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpLmxvY2F0aW9uKCk7CisgICAgLy8gV2UgZG9uJ3QgbmVl
ZCBhIGJ1ZmZlciBzaW5jZSB3ZSdyZSBkaXJlY3QgcmVuZGVyaW5nIHRvIHdpbmRvdy4KKyAgICBy
ZW5kZXJDb250ZW50cygwLCBvcmlnaW4sIGRpcnR5UmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZl
clN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24oc2NyZWVuUmVjdCk7CisKKyNpZiBVU0UoQUNDRUxF
UkFURURfQ09NUE9TSVRJTkcpICYmIEVOQUJMRV9DT01QT1NJVElOR19TVVJGQUNFCisgICAgaWYg
KG1fd2ViUGFnZS0+ZC0+bV9jbGllbnQtPndpbmRvdygpLT53aW5kb3dVc2FnZSgpICE9IEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6V2luZG93OjpHTEVTMlVzYWdlKSB7CisgICAgICAg
IFBsYXRmb3JtOjpJbnRSZWN0IGNsaXBwZWRSZWN0ID0gaW50ZXJzZWN0aW9uKGRpcnR5UmVjdCwg
dmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICAgICAgYmxlbmRDb21wb3NpdGluZ1N1cmZhY2Uo
Y2xpcHBlZFJlY3QpOworICAgIH0KKyNlbmRpZgorCisgICAgYm9vbCBzaG91bGRJbnZhbGlkYXRl
ID0gIW1fc3VzcGVuZFNjcmVlblVwZGF0ZXMgJiYgIXJlbmRlckNvbnRlbnRPbmx5OworICAgIGlm
ICghc2hvdWxkSW52YWxpZGF0ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpbnZhbGlk
YXRlV2luZG93KHNjcmVlblJlY3QpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnJlbmRlcihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgcmVjdCwgYm9v
bCByZW5kZXJDb250ZW50T25seSkKK3sKKyAgICBpZiAoIW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJlcXVlc3RMYXlvdXRJZk5lZWRlZCgpOwor
CisgICAgaWYgKHNob3VsZERpcmVjdFJlbmRlcmluZ1RvV2luZG93KCkpCisgICAgICAgIHJldHVy
biByZW5kZXJEaXJlY3RUb1dpbmRvdyhyZWN0LCByZW5kZXJDb250ZW50T25seSk7CisKKyAgICBU
aWxlUmVjdExpc3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1Rp
bGVzKHJlY3QpOworICAgIGlmICh0aWxlUmVjdExpc3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIkJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlciByZWN0PSgl
ZCwlZCAlZHglZCksIHJlbmRlckNvbnRlbnRPbmx5PSVzLCBtX3N1c3BlbmRCYWNraW5nU3RvcmVV
cGRhdGVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC54KCksIHJlY3Qu
eSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICByZW5kZXJDb250ZW50T25seSA/ICJ0cnVlIiA6ICJmYWxzZSIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICBtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVzID8gInRydWUiIDogImZh
bHNlIik7CisjZW5kaWYKKworICAgIGJvb2wgYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdX
aW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+d2luZG93VXNhZ2UoKSA9
PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xFUzJVc2FnZTsKKwor
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7Cisg
ICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eUNvbnRlbnRzUmVjdDsKKyAgICBib29sIHNob3VsZEJsaXQg
PSAhbV9zdXNwZW5kQmFja2luZ1N0b3JlVXBkYXRlcyAmJiAhcmVuZGVyQ29udGVudE9ubHk7Cisg
ICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0ID0gUGxhdGZvcm06OkludFJl
Y3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRDb250ZW50
c1NpemUoKSk7CisgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3Qgdmlld3BvcnRSZWN0ID0gUGxh
dGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNm
b3JtZWRWaWV3cG9ydFNpemUoKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRpbGVS
ZWN0TGlzdC5zaXplKCk7ICsraSkgeworICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVS
ZWN0TGlzdFtpXTsKKyAgICAgICAgVGlsZUluZGV4IGluZGV4ID0gdGlsZVJlY3QuZmlyc3Q7Cisg
ICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5VGlsZVJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7
CisgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50TWFwLmdldChpbmRleCk7
CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSB0aWxlIHJlY3QgaXMgaW4gdGlsZSBjb29yZGluYXRl
cywgYnV0IGl0IG5lZWRzIHRvIGJlIGluCisgICAgICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRz
IGNvb3JkaW5hdGVzLgorICAgICAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVJlY3QgPSBtYXBG
cm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3QpOworCisgICAgICAgIC8vIElm
IHdlJ3JlIG5vdCB5ZXQgY29tbWl0dGVkLCB0aGVuIGNvbW1pdCBub3cgYnkgY2xlYXJpbmcgdGhl
IHJlbmRlcmVkIHJlZ2lvbgorICAgICAgICAvLyBhbmQgc2V0dGluZyB0aGUgY29tbWl0dGVkIGZs
YWcgYXMgd2VsbCBhcyBjbGVhcmluZyB0aGUgc2hpZnQuCisgICAgICAgIGlmICghdGlsZS0+aXND
b21taXR0ZWQoKSkgeworICAgICAgICAgICAgdGlsZS0+c2V0Q29tbWl0dGVkKHRydWUpOworICAg
ICAgICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAg
ICAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5jbGVhclJlbmRlcmVkUmVnaW9uKCk7CisgICAg
ICAgICAgICB0aWxlLT5jbGVhclNoaWZ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0
aGUgdGlsZSBoYXMgYmVlbiBjcmVhdGVkLCBidXQgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBh
cmUgcGFpbnRpbmcgb24gaXQKKyAgICAgICAgLy8gdGhlbiBpdCBoYXNuJ3QgYmVlbiBnaXZlbiBh
IGRlZmF1bHQgYmFja2dyb3VuZCB5ZXQgc28gdGhhdCB3ZSBjYW4gc2F2ZSB0aW1lIGR1cmluZwor
ICAgICAgICAvLyBzdGFydHVwLiBUaGF0J3Mgd2h5IHdlIGFyZSBkb2luZyBpdCBoZXJlIGluc3Rl
YWQuLi4KKyAgICAgICAgaWYgKCF0aWxlLT5iYWNrZ3JvdW5kUGFpbnRlZCgpKQorICAgICAgICAg
ICAgdGlsZS0+cGFpbnRCYWNrZ3JvdW5kKCk7CisKKyAgICAgICAgLy8gUGFpbnQgZGVmYXVsdCBi
YWNrZ3JvdW5kIGlmIGNvbnRlbnRzIHJlY3QgaXMgZW1wdHkuCisgICAgICAgIGlmICghZXhwYW5k
ZWRDb250ZW50c1JlY3QoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSB3
ZSBzaG91bGQgY2xpcCB0aGUgY29udGVudHMgc2l6ZSBhbmQgcmVuZGVyIHRoZSBjb250ZW50Lgor
ICAgICAgICAgICAgZGlydHlSZWN0LmludGVyc2VjdChleHBhbmRlZENvbnRlbnRzUmVjdCgpKTsK
KworICAgICAgICAgICAgZGlydHlUaWxlUmVjdC5pbnRlcnNlY3QodGlsZUNvbnRlbnRzUmVjdChp
bmRleCwgZXhwYW5kZWRDb250ZW50c1JlY3QoKSwgY3VycmVudFN0YXRlKSk7CisKKyAgICAgICAg
ICAgIC8vIFdlIHByb2JhYmx5IGhhdmUgZXh0cmEgdGlsZXMgc2luY2UgdGhlIGNvbnRlbnRzIHNp
emUgaXMgc28gc21hbGwuCisgICAgICAgICAgICAvLyBTYXZlIHNvbWUgY3ljbGVzIGhlcmUuLi4K
KyAgICAgICAgICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tT
dXJmYWNlT2ZUaWxlKGRpcnR5VGlsZVJlY3QsIHRpbGUpOworCisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBuYXRpdmVCdWZmZXIKKyAgICAgICAgICAgID0g
dGlsZS0+YmFja0J1ZmZlcigpLT5uYXRpdmVCdWZmZXIoKTsKKworICAgICAgICBpZiAoYmxpdHRp
bmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0
ZXhfbG9jaygmbV9ibGl0R2VuZXJhdGlvbkxvY2spOworICAgICAgICAgICAgd2hpbGUgKG1fYmxp
dEdlbmVyYXRpb24gPT0gdGlsZS0+YmFja0J1ZmZlcigpLT5ibGl0R2VuZXJhdGlvbigpKSB7Cisg
ICAgICAgICAgICAgICAgaW50IGVyciA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoJm1fYmxpdEdl
bmVyYXRpb25Db25kLCAmbV9ibGl0R2VuZXJhdGlvbkxvY2ssICZtX2N1cnJlbnRCbGl0RW5kKTsK
KyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVUSU1FRE9VVCkgeworICAgICAgICAgICAgICAg
ICAgICArK21fYmxpdEdlbmVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICAg
ICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06Okxv
Z0xldmVsQ3JpdGljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgImNvbmRfdGltZWR3YWl0IGZhaWxlZCAoJXMpIiwgc3RyZXJyb3IoZXJyKSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2JsaXRHZW5lcmF0aW9uTG9jayk7
CisgICAgICAgIH0KKworICAgICAgICAvLyBGSVhNRTogbW9kaWZ5IHJlbmRlciB0byB0YWtlIGEg
VmVjdG9yPEludFJlY3Q+IHBhcmFtZXRlciBzbyB3ZSdyZSBub3QgcmVjcmVhdGluZworICAgICAg
ICAvLyBHcmFwaGljc0NvbnRleHQgb24gdGhlIHN0YWNrIGVhY2ggdGltZS4KKyAgICAgICAgcmVu
ZGVyQ29udGVudHMobmF0aXZlQnVmZmVyLCBvcmlnaW5PZlRpbGUoaW5kZXgpLCBkaXJ0eVJlY3Qp
OworCisgICAgICAgIC8vIEFkZCB0aGUgbmV3bHkgcmVuZGVyZWQgcmVnaW9uIHRvIHRoZSB0aWxl
IHNvIGl0IGNhbiBrZWVwIHRyYWNrIGZvciBibGl0cy4KKyAgICAgICAgdGlsZS0+YmFja0J1ZmZl
cigpLT5hZGRSZW5kZXJlZFJlZ2lvbihkaXJ0eVRpbGVSZWN0KTsKKworICAgICAgICAvLyBDaGVj
ayBpZiB0aGUgY29udGVudHMgZm9yIHRoaXMgdGlsZSdzIGJhY2tidWZmZXIgYXJlIHZhbGlkIHdo
ZW4KKyAgICAgICAgLy8gY29tcGFyZWQgdG8gdGhlIGZyb250IGJ1ZmZlci4KKyAgICAgICAgYm9v
bCBiYWNrQnVmZmVySXNWYWxpZCA9IHRpbGUtPmJhY2tCdWZmZXIoKS0+aXNSZW5kZXJlZCh0aWxl
LT5mcm9udEJ1ZmZlcigpLT5yZW5kZXJlZFJlZ2lvbigpKTsKKworICAgICAgICAvLyBPdXIgY3Vy
cmVudCBkZXNpZ24gZGVtYW5kcyB0aGF0IHRoZSBiYWNrYnVmZmVyIGlzIHZhbGlkIGFmdGVyIGFu
eQorICAgICAgICAvLyByZW5kZXJpbmcgb3BlcmF0aW9uIHNvIGFzc2VydCB0aGF0IGhlcmUuIElm
IHdlIGhpdCB0aGlzIGFzc2VydCB3ZQorICAgICAgICAvLyBrbm93IHRoYXQgd2UncmUgZG9pbmcg
c29tZXRoaW5nIGJhZCB0aGF0IHdpbGwgcmVzdWx0IGluIGFydGlmYWN0cy4KKyAgICAgICAgQVNT
RVJUKGJhY2tCdWZmZXJJc1ZhbGlkKTsKKworICAgICAgICAvLyBXZSB3aWxsIG5lZWQgYSBzd2Fw
IGhlcmUgYmVjYXVzZSBvZiB0aGUgc2hhcmVkIGJhY2sgYnVmZmVyLgorICAgICAgICBpZiAoYmFj
a0J1ZmZlcklzVmFsaWQpIHsKKyAgICAgICAgICAgIHRpbGUtPnN3YXBCdWZmZXJzKCk7CisgICAg
ICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VD
bGllbnQoKS0+c3luY1RvQ3VycmVudE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIHRpbGUtPmJhY2tC
dWZmZXIoKS0+Y2xlYXJSZW5kZXJlZFJlZ2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgZGly
dHlDb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6dW5pb25PZlJlY3RzKGRpcnR5Q29udGVudHNSZWN0
LCBkaXJ0eVJlY3QpOworICAgIH0KKworICAgIC8vIENsaXAgdG8gdGhlIHZpc2libGUgY29udGVu
dCBpbmNsdWRpbmcgb3ZlcnNjcm9sbC4KKyAgICBkaXJ0eUNvbnRlbnRzUmVjdC5pbnRlcnNlY3Qo
dW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICBpZiAoZGlydHlDb250ZW50c1Jl
Y3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghc2hvdWxkQmxp
dCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBibGl0VmlzaWJsZUNvbnRlbnRzKCk7Cisg
ICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVxdWVzdExh
eW91dElmTmVlZGVkKCkgY29uc3QKK3sKKyAgICBtX3dlYlBhZ2UtPmQtPnJlcXVlc3RMYXlvdXRJ
Zk5lZWRlZCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlclZpc2libGVD
b250ZW50cyhib29sIHJlbmRlckNvbnRlbnRPbmx5KQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHJlbmRlclJlY3QgPSBzaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygpID8gdmlzaWJsZUNv
bnRlbnRzUmVjdCgpIDogdmlzaWJsZVRpbGVzUmVjdCgpOworCisgICAgcmVuZGVyKHJlbmRlclJl
Y3QsIHJlbmRlckNvbnRlbnRPbmx5KTsKKyAgICBtX3JlbmRlclF1ZXVlLT5jbGVhcihyZW5kZXJS
ZWN0LCB0cnVlIC8qY2xlYXJSZWd1bGFyUmVuZGVySm9icyovKTsKK30KKwordm9pZCBCYWNraW5n
U3RvcmVQcml2YXRlOjpyZW5kZXJCYWNraW5nU3RvcmUoYm9vbCByZW5kZXJDb250ZW50T25seSkK
K3sKKyAgICByZW5kZXIoZnJvbnRTdGF0ZSgpLT5iYWNraW5nU3RvcmVSZWN0KCksIHJlbmRlckNv
bnRlbnRPbmx5KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNv
bnRlbnRzKGJvb2wgZm9yY2UpCit7CisgICAgLy8gQmxpdHRpbmcgbXVzdCBuZXZlciBoYXBwZW4g
Zm9yIGRpcmVjdCByZW5kZXJpbmcgY2FzZS4KKyAgICBBU1NFUlQoIXNob3VsZERpcmVjdFJlbmRl
cmluZ1RvV2luZG93KCkpOworCisgICAgaWYgKG1fc3VzcGVuZFNjcmVlblVwZGF0ZXMpIHsKKyAg
ICAgICAgLy8gQXZvaWQgY2xpZW50IGdvaW5nIGludG8gYnVzeSBsb29wIHdoaWxlIHVwZGF0ZXMg
c3VzcGVuZGVkLgorICAgICAgICBpZiAoZm9yY2UpCisgICAgICAgICAgICBtX2hhc0JsaXRKb2Jz
ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUJsYWNrQmVycnk6
OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1cnJlbnRU
aHJlYWQoKSkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhvZENhbGxNZXNzYWdlKAorICAgICAgICAgICAgICAg
ICZCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0VmlzaWJsZUNvbnRlbnRzLCB0aGlzLCBmb3JjZSkp
OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYmxpdENvbnRlbnRzKG1fd2ViUGFnZS0+
Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkRGVzdGluYXRpb25SZWN0KCksCisgICAgICAg
ICAgICAgICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPnVzZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJs
ZUNvbnRlbnRzUmVjdCgpLAorICAgICAgICAgICAgICAgICBmb3JjZSk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZpb3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZXaW5k
b3coKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uIHByZXZpb3VzQ29udGVudHNSZWdp
b24KKyAgICAgICAgPSBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKHdp
bmRvd0Zyb250QnVmZmVyU3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigpLCB3aW5kb3dCYWNrQnVmZmVy
U3RhdGUoKS0+YmxpdHRlZFJlZ2lvbigpKTsKKworICAgIGlmIChwcmV2aW91c0NvbnRlbnRzUmVn
aW9uLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV93ZWJQYWdlLT5jbGllbnQo
KS0+d2luZG93KCktPmNvcHlGcm9tRnJvbnRUb0JhY2socHJldmlvdXNDb250ZW50c1JlZ2lvbik7
CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFkZEJsaXR0ZWRSZWdpb24ocHJldmlvdXND
b250ZW50c1JlZ2lvbik7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y29weVByZXZp
b3VzQ29udGVudHNUb0JhY2tTdXJmYWNlT2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSkKK3sKKyAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBwcmV2aW91c0NvbnRlbnRzUmVnaW9uCisgICAgICAgID0gUGxhdGZvcm06
OkludFJlY3RSZWdpb246OnN1YnRyYWN0UmVnaW9ucyh0aWxlLT5mcm9udEJ1ZmZlcigpLT5yZW5k
ZXJlZFJlZ2lvbigpLCByZWN0KTsKKworICAgIEludFJlY3RMaXN0IHByZXZpb3VzQ29udGVudHNS
ZWN0cyA9IHByZXZpb3VzQ29udGVudHNSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHByZXZpb3VzQ29udGVudHNSZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBwcmV2aW91c0NvbnRlbnRzUmVjdCA9IHByZXZpb3VzQ29udGVudHNS
ZWN0cy5hdChpKTsKKyAgICAgICAgdGlsZS0+YmFja0J1ZmZlcigpLT5hZGRSZW5kZXJlZFJlZ2lv
bihwcmV2aW91c0NvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpibGl0VG9CdWZmZXIoCisgICAgICAgICAgICB0aWxlLT5iYWNrQnVmZmVyKCkt
Pm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91c0NvbnRlbnRzUmVjdCwKKyAgICAgICAgICAgIHRpbGUt
PmZyb250QnVmZmVyKCktPm5hdGl2ZUJ1ZmZlcigpLCBwcmV2aW91c0NvbnRlbnRzUmVjdCk7Cisg
ICAgfQorfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnBhaW50RGVmYXVsdEJhY2tncm91
bmQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0
aW9uTWF0cml4JiB0cmFuc2Zvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBib29sIGZsdXNoKQoreworICAgIGNvbnN0IFBsYXRmb3JtOjpJ
bnRSZWN0IGNvbnRlbnRzUmVjdCA9IFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2lu
dCgwLCAwKSwgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsKKyAgICBQ
bGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luID0gY29udGVudHMubG9jYXRpb24oKTsKKyAgICBQbGF0
Zm9ybTo6SW50UmVjdCBjb250ZW50c0NsaXBwZWQgPSBjb250ZW50czsKKworICAgIC8vIFdlIGhh
dmUgdG8gcGFpbnQgdGhlIGRlZmF1bHQgYmFja2dyb3VuZCBpbiB0aGUgY2FzZSBvZiBvdmVyem9v
bSBhbmQKKyAgICAvLyBtYWtlIHN1cmUgaXQgaXMgaW52YWxpZGF0ZWQuCisgICAgQ29sb3IgY29s
b3IobV93ZWJQYWdlLT5zZXR0aW5ncygpLT5vdmVyWm9vbUNvbG9yKCkpOworCisgICAgUGxhdGZv
cm06OkludFJlY3RSZWdpb24gb3ZlclNjcm9sbFJlZ2lvbgorICAgICAgICAgICAgPSBQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKFBsYXRmb3JtOjpJbnRSZWN0KGNvbnRl
bnRzQ2xpcHBlZCksIGNvbnRlbnRzUmVjdCk7CisKKyAgICBJbnRSZWN0TGlzdCBvdmVyU2Nyb2xs
UmVjdHMgPSBvdmVyU2Nyb2xsUmVnaW9uLnJlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBvdmVyU2Nyb2xsUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgUGxhdGZvcm06Oklu
dFJlY3Qgb3ZlclNjcm9sbFJlY3QgPSBvdmVyU2Nyb2xsUmVjdHMuYXQoaSk7CisgICAgICAgIG92
ZXJTY3JvbGxSZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKyAgICAgICAgb3Zl
clNjcm9sbFJlY3QgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KG92ZXJTY3JvbGxSZWN0KTsKKwor
ICAgICAgICBpZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAg
Ly8gQmVjYXVzZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IG92ZXJTY3JvbGxSZWN0
IGNvdWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAgICAvLyB0aGFuIHRoZSBzdXJm
YWNlIHNpemUgb2YgdGhlIHdpbmRvdy4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5IGNsYW1waW5n
CisgICAgICAgICAgICAvLyBpdCB0byBlbnN1cmUgdGhhdCBjYW4ndCBoYXBwZW4uCisgICAgICAg
ICAgICBvdmVyU2Nyb2xsUmVjdC5pbnRlcnNlY3QoUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06
OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+c3VyZmFjZVNp
emUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgY2xlYXJXaW5kb3cob3ZlclNjcm9sbFJlY3Qs
IGNvbG9yLnJlZCgpLCBjb2xvci5ncmVlbigpLCBjb2xvci5ibHVlKCksIGNvbG9yLmFscGhhKCkp
OworICAgIH0KK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpibGl0Q29udGVudHMoY29u
c3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgc3JjUmVjdCwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gQmxp
dHRpbmcgbXVzdCBuZXZlciBoYXBwZW4gZm9yIGRpcmVjdCByZW5kZXJpbmcgY2FzZS4KKyAgICAv
LyBVc2UgaW52YWxpZGF0ZVdpbmRvdygpIGluc3RlYWQuCisgICAgQVNTRVJUKCFzaG91bGREaXJl
Y3RSZW5kZXJpbmdUb1dpbmRvdygpKTsKKworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUo
KSB8fCBtX3N1c3BlbmRTY3JlZW5VcGRhdGVzIHx8ICFpc0FjdGl2ZSgpKSB7CisgICAgICAgIC8v
IEF2b2lkIGNsaWVudCBnb2luZyBpbnRvIGJ1c3kgbG9vcCB3aGlsZSBibGl0IGlzIGltcG9zc2li
bGUuCisgICAgICAgIGlmIChmb3JjZSkKKyAgICAgICAgICAgIG1faGFzQmxpdEpvYnMgPSBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghQmxhY2tCZXJyeTo6UGxhdGZv
cm06OnVzZXJJbnRlcmZhY2VUaHJlYWRNZXNzYWdlQ2xpZW50KCktPmlzQ3VycmVudFRocmVhZCgp
KSB7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVz
c2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgJkJhY2tp
bmdTdG9yZVByaXZhdGU6OmJsaXRDb250ZW50cywgdGhpcywgZHN0UmVjdCwgc3JjUmVjdCwgZm9y
Y2UpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtX2RlZmVyc0JsaXQgJiYg
IWZvcmNlKSB7CisgICAgICAgIG1faGFzQmxpdEpvYnMgPSB0cnVlOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgbV9oYXNCbGl0Sm9icyA9IGZhbHNlOworCisgICAgQmFja2luZ1N0b3Jl
R2VvbWV0cnkqIGN1cnJlbnRTdGF0ZSA9IGZyb250U3RhdGUoKTsKKyAgICBjb25zdCBQbGF0Zm9y
bTo6SW50UmVjdCBjb250ZW50c1JlY3QgPSBQbGF0Zm9ybTo6SW50UmVjdChQbGF0Zm9ybTo6SW50
UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6ZSgpKTsKKworI2lm
IERFQlVHX1ZJU1VBTElaRQorICAgIC8vIFN1YnN0aXR1dGUgYSBkZWJ1Z1JlY3QgdGhhdCBjb25z
aXN0cyBvZiB0aGUgdW5pb24gb2YgdGhlIGJhY2tpbmdzdG9yZSByZWN0CisgICAgLy8gYW5kIHRo
ZSB1aSB0aHJlYWQgdmlld3BvcnQgcmVjdCBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgc291cmNlIHJl
Y3Qgc28gd2UKKyAgICAvLyBjYW4gdmlzdWFsaXplIHRoZSBlbnRpcmUgYmFja2luZ3N0b3JlIGFu
ZCB3aGF0IGl0IGlzIGRvaW5nIHdoZW4gd2UKKyAgICAvLyBzY3JvbGwgYW5kIHpvb20hCisgICAg
Ly8gRklYTUU6IFRoaXMgc2hvdWxkIG5vdCBleHBsaWNpdGVseSBkZXBlbmQgb24gV2ViQ29yZTo6
LgorICAgIFdlYkNvcmU6OkludFJlY3QgZGVidWdSZWN0ID0gY3VycmVudFN0YXRlLT5iYWNraW5n
U3RvcmVSZWN0KCk7CisgICAgZGVidWdSZWN0LnVuaXRlKG1fd2ViUGFnZS0+Y2xpZW50KCktPnVz
ZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICBpZiAoZGVidWdS
ZWN0LndpZHRoKCkgPCBkZWJ1Z1JlY3QuaGVpZ2h0KCkpCisgICAgICAgIGRlYnVnUmVjdC5zZXRX
aWR0aChjZWlsKGRvdWJsZShzcmNSZWN0LndpZHRoKCkpICogKGRvdWJsZShkZWJ1Z1JlY3QuaGVp
Z2h0KCkpIC8gc3JjUmVjdC5oZWlnaHQoKSkpKTsKKyAgICBpZiAoZGVidWdSZWN0LmhlaWdodCgp
IDwgZGVidWdSZWN0LndpZHRoKCkpCisgICAgICAgIGRlYnVnUmVjdC5zZXRIZWlnaHQoY2VpbChk
b3VibGUoc3JjUmVjdC5oZWlnaHQoKSkgKiAoZG91YmxlKGRlYnVnUmVjdC53aWR0aCgpKSAvIHNy
Y1JlY3Qud2lkdGgoKSkpKTsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBjb250ZW50cyA9IGRlYnVn
UmVjdDsKKyNlbHNlCisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHMgPSBzcmNSZWN0Owor
I2VuZGlmCisKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGV4cGxpY2l0ZWx5IGRlcGVu
ZCBvbiBXZWJDb3JlOjouCisgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnNmb3JtYXRpb24g
PSBUcmFuc2Zvcm1hdGlvbk1hdHJpeDo6cmVjdFRvUmVjdCgKKyAgICAgICAgRmxvYXRSZWN0KEZs
b2F0UG9pbnQoMC4wLCAwLjApLCBXZWJDb3JlOjpJbnRTaXplKGNvbnRlbnRzLnNpemUoKSkpLCBX
ZWJDb3JlOjpJbnRSZWN0KGRzdFJlY3QpKTsKKworICAgIGJvb2wgYmxpdHRpbmdEaXJlY3RseVRv
Q29tcG9zaXRpbmdXaW5kb3cgPSBtX3dlYlBhZ2UtPmQtPm1fY2xpZW50LT53aW5kb3coKS0+d2lu
ZG93VXNhZ2UoKSA9PSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OldpbmRvdzo6R0xF
UzJVc2FnZTsKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisgICAgQmFja2luZ1N0
b3JlQ29tcG9zaXRpbmdTdXJmYWNlKiBjb21wb3NpdGluZ1N1cmZhY2UgPQorICAgICAgICBTdXJm
YWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y29tcG9zaXRpbmdTdXJmYWNlKCk7CisKKyAg
ICBpZiAoIWJsaXR0aW5nRGlyZWN0bHlUb0NvbXBvc2l0aW5nV2luZG93KQorICAgICAgICBkcmF3
U3ViTGF5ZXJzKCk7CisjZW5kaWYKKworI2lmIERFQlVHX0JBQ0tJTkdTVE9SRQorICAgIEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGlj
YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6Ymxp
dENvbnRlbnRzIGRzdFJlY3Q9KCVkLCVkICVkeCVkKSBzcmNSZWN0PSglZCwlZCAlZHglZCkiLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0UmVjdC54KCksIGRzdFJlY3QueSgpLCBkc3RS
ZWN0LndpZHRoKCksIGRzdFJlY3QuaGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICBzcmNSZWN0LngoKSwgc3JjUmVjdC55KCksIHNyY1JlY3Qud2lkdGgoKSwgc3JjUmVjdC5oZWln
aHQoKSk7CisjZW5kaWYKKworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBvcmlnaW4gPSBjb250ZW50
cy5sb2NhdGlvbigpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGNvbnRlbnRzQ2xpcHBlZCA9IGNv
bnRlbnRzOworCisgICAgcGFpbnREZWZhdWx0QmFja2dyb3VuZChjb250ZW50cywgdHJhbnNmb3Jt
YXRpb24sIGZhbHNlIC8qZmx1c2gqLyk7CisKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJy
ZW50U3RhdGUtPnRpbGVNYXAoKTsKKworICAgIC8vIERvbid0IGNsaXAgdG8gY29udGVudHMgaWYg
aXQgaXMgZW1wdHkgc28gd2UgY2FuIHN0aWxsIHBhaW50IGRlZmF1bHQgYmFja2dyb3VuZC4KKyAg
ICBpZiAoIWNvbnRlbnRzUmVjdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29udGVudHNDbGlwcGVk
LmludGVyc2VjdChjb250ZW50c1JlY3QpOworICAgICAgICBpZiAoY29udGVudHNDbGlwcGVkLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0KTsKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0UmVn
aW9uIGNvbnRlbnRzUmVnaW9uID0gY29udGVudHNDbGlwcGVkOworICAgICAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBiYWNraW5nU3RvcmVSZWdpb24gPSBjdXJyZW50U3RhdGUtPmJhY2tpbmdT
dG9yZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdpb24gY2hlY2tlcmVkUmVn
aW9uCisgICAgICAgICAgICA9IFBsYXRmb3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lv
bnMoY29udGVudHNSZWdpb24sIGJhY2tpbmdTdG9yZVJlZ2lvbik7CisKKyAgICAgICAgLy8gQmxp
dCBjaGVja2VyZWQgdG8gdGhvc2UgcGFydHMgdGhhdCBhcmUgbm90IGNvdmVyZWQgYnkgdGhlIGJh
Y2tpbmdTdG9yZVJlY3QuCisgICAgICAgIEludFJlY3RMaXN0IGNoZWNrZXJlZFJlY3RzID0gY2hl
Y2tlcmVkUmVnaW9uLnJlY3RzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hl
Y2tlcmVkUmVjdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0
IGRzdFJlY3QgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KFBsYXRmb3JtOjpJbnRSZWN0KAorICAg
ICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludChjaGVja2VyZWRSZWN0cy5hdChpKS54KCkg
LSBvcmlnaW4ueCgpLCBjaGVja2VyZWRSZWN0cy5hdChpKS55KCkgLSBvcmlnaW4ueSgpKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlcmVkUmVjdHMuYXQoaSkuc2l6
ZSgpKSk7CisgICAgICAgICAgICBjaGVja2VyV2luZG93KGRzdFJlY3QsIGNoZWNrZXJlZFJlY3Rz
LmF0KGkpLmxvY2F0aW9uKCksIHRyYW5zZm9ybWF0aW9uLmEoKSk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBWZWN0b3I8VGlsZUJ1ZmZlcio+IGJsaXR0ZWRUaWxlczsKKworICAgIC8vIEdldCB0
aGUgbGlzdCBvZiB0aWxlIHJlY3RzIHRoYXQgbWFrZXVwIHRoZSBjb250ZW50LgorICAgIFRpbGVS
ZWN0TGlzdCB0aWxlUmVjdExpc3QgPSBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMo
Y29udGVudHNDbGlwcGVkLCBjdXJyZW50U3RhdGUpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdGlsZVJlY3RMaXN0LnNpemUoKTsgKytpKSB7CisgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0
ID0gdGlsZVJlY3RMaXN0W2ldOworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSB0aWxlUmVjdC5m
aXJzdDsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0
LnNlY29uZDsKKyAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGN1cnJlbnRNYXAuZ2V0
KGluZGV4KTsKKyAgICAgICAgVGlsZUJ1ZmZlciogdGlsZUJ1ZmZlciA9IHRpbGUtPmZyb250QnVm
ZmVyKCk7CisKKyAgICAgICAgLy8gVGhpcyBkaXJ0eSByZWN0IGlzIGluIHRpbGUgY29vcmRpbmF0
ZXMsIGJ1dCBpdCBuZWVkcyB0byBiZSBpbgorICAgICAgICAvLyB0cmFuc2Zvcm1lZCBjb250ZW50
cyBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlSZWN0CisgICAg
ICAgICAgICA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCwgY3Vy
cmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIC8vIERvbid0IGNsaXAg
dG8gY29udGVudHMgaWYgaXQgaXMgZW1wdHkgc28gd2UgY2FuIHN0aWxsIHBhaW50IGRlZmF1bHQg
YmFja2dyb3VuZC4KKyAgICAgICAgaWYgKCFjb250ZW50c1JlY3QuaXNFbXB0eSgpKSB7CisgICAg
ICAgICAgICAvLyBPdGhlcndpc2Ugd2Ugc2hvdWxkIGNsaXAgdGhlIGNvbnRlbnRzIHNpemUgYW5k
IGJsaXQuCisgICAgICAgICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KGNvbnRlbnRzUmVjdCk7CisK
KyAgICAgICAgICAgIC8vIFdlIHByb2JhYmx5IGhhdmUgZXh0cmEgdGlsZXMgc2luY2UgdGhlIGNv
bnRlbnRzIHNpemUgaXMgc28gc21hbGwuCisgICAgICAgICAgICAvLyBTYXZlIHNvbWUgY3ljbGVz
IGhlcmUuLi4KKyAgICAgICAgICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93LCB0aGlzIGRpcnR5
IHJlY3QgaXMgaW4gdHJhbnNmb3JtZWQgY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlCisgICAg
ICAgIC8vIHRyYW5zZm9ybWVkIGNvbnRlbnRzLCBidXQgdWx0aW1hdGVseSBpdCBuZWVkcyB0byBi
ZSB0cmFuc2Zvcm1lZAorICAgICAgICAvLyBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmll
d3BvcnQuCisgICAgICAgIGRpcnR5UmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7
CisKKyAgICAgICAgLy8gU2F2ZSBzb21lIGN5Y2xlcyBoZXJlLi4uCisgICAgICAgIGlmIChkaXJ0
eVJlY3QuaXNFbXB0eSgpIHx8IGRpcnR5VGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICAgICAg
Y29udGludWU7CisKKyAgICAgICAgVGlsZVJlY3Qgd2hvbGVUaWxlUmVjdDsKKyAgICAgICAgd2hv
bGVUaWxlUmVjdC5maXJzdCA9IGluZGV4OworICAgICAgICB3aG9sZVRpbGVSZWN0LnNlY29uZCA9
IHRoaXMtPnRpbGVSZWN0KCk7CisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHdob2xlUmVjdAor
ICAgICAgICAgICAgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMod2hvbGVUaWxl
UmVjdCwgY3VycmVudFN0YXRlLT5iYWNraW5nU3RvcmVSZWN0KCkpOworCisgICAgICAgIGJvb2wg
Y29tbWl0dGVkID0gdGlsZS0+aXNDb21taXR0ZWQoKTsKKyAgICAgICAgYm9vbCByZW5kZXJlZCA9
IHRpbGVCdWZmZXItPmlzUmVuZGVyZWQoZGlydHlUaWxlUmVjdCk7CisgICAgICAgIGJvb2wgcGFp
bnRDaGVja2VyZWQgPSAhY29tbWl0dGVkIHx8ICFyZW5kZXJlZDsKKworICAgICAgICBpZiAocGFp
bnRDaGVja2VyZWQpIHsKKyAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVjdFQg
PSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAgICAgIGlmICgh
dHJhbnNmb3JtYXRpb24uaXNJZGVudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gQmVjYXVz
ZSBvZiByb3VuZGluZyBpdCBpcyBwb3NzaWJsZSB0aGF0IGRpcnR5UmVjdCBjb3VsZCBiZSBvZmYt
Ynktb25lIGxhcmdlcgorICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhlIHN1cmZhY2Ugc2l6ZSBv
ZiB0aGUgZHN0IGJ1ZmZlci4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5IGNsYW1waW5nCisgICAg
ICAgICAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgorICAgICAgICAg
ICAgICAgIGRpcnR5UmVjdFQuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJ
bnRQb2ludCgwLCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXpl
KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2lu
dCBjb250ZW50c09yaWdpbihkaXJ0eVJlY3QueCgpICsgb3JpZ2luLngoKSwgZGlydHlSZWN0Lnko
KSArIG9yaWdpbi55KCkpOworICAgICAgICAgICAgY2hlY2tlcldpbmRvdyhkaXJ0eVJlY3RULCBj
b250ZW50c09yaWdpbiwgdHJhbnNmb3JtYXRpb24uYSgpKTsKKyAgICAgICAgfQorCisgICAgICAg
IC8vIEJsaXQgdGhlIHZpc2libGUgYnVmZmVyIGhlcmUgaWYgd2UgaGF2ZSB2aXNpYmxlIHpvb20g
am9icy4KKyAgICAgICAgaWYgKG1fcmVuZGVyUXVldWUtPmhhc0N1cnJlbnRWaXNpYmxlWm9vbUpv
YigpKSB7CisKKyAgICAgICAgICAgIC8vIE5lZWRzIHRvIGJlIGluIHNhbWUgY29vcmRpbmF0ZSBz
eXN0ZW0gYXMgZGlydHlSZWN0LgorICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJs
ZVRpbGVCdWZmZXJSZWN0ID0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3Q7CisgICAgICAgICAgICB2
aXNpYmxlVGlsZUJ1ZmZlclJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworCisg
ICAgICAgICAgICAvLyBDbGlwIHRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuCisgICAgICAg
ICAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KHZpc2libGVUaWxlQnVmZmVyUmVjdCk7CisKKyAgICAg
ICAgICAgIC8vIENsaXAgdG8gdGhlIGRpcnR5UmVjdC4KKyAgICAgICAgICAgIHZpc2libGVUaWxl
QnVmZmVyUmVjdC5pbnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgaWYgKCFkaXJ0
eVJlY3QuaXNFbXB0eSgpICYmICF2aXNpYmxlVGlsZUJ1ZmZlclJlY3QuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlVGlsZSogdmlzaWJsZVRpbGVCdWZmZXIKKyAgICAg
ICAgICAgICAgICAgICAgPSBTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+dmlzaWJs
ZVRpbGVCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlQodmlzaWJsZVRpbGVCdWZmZXIt
PnNpemUoKSA9PSB2aXNpYmxlQ29udGVudHNSZWN0KCkuc2l6ZSgpKTsKKworICAgICAgICAgICAg
ICAgIC8vIFRoZSBvZmZzZXQgb2YgdGhlIGN1cnJlbnQgdmlld3BvcnQgd2l0aCB0aGUgdmlzYmxl
IHRpbGUgYnVmZmVyLgorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRQb2ludCBkaWZmZXJl
bmNlID0gb3JpZ2luIC0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QubG9jYXRpb24oKTsKKyAgICAg
ICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBvZmZzZXQgPSBQbGF0Zm9ybTo6SW50U2l6ZShk
aWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkpOworCisgICAgICAgICAgICAgICAgLy8gTWFw
IHRvIHRoZSB2aXNpYmxlVGlsZUJ1ZmZlciBjb29yZGluYXRlcy4KKyAgICAgICAgICAgICAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRpbGVSZWN0ID0gdmlzaWJsZVRpbGVCdWZmZXJSZWN0Owor
ICAgICAgICAgICAgICAgIGRpcnR5VGlsZVJlY3QubW92ZShvZmZzZXQud2lkdGgoKSwgb2Zmc2V0
LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVj
dFQgPSB0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAgICAgICAg
ICBpZiAoIXRyYW5zZm9ybWF0aW9uLmlzSWRlbnRpdHkoKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBCZWNhdXNlIG9mIHJvdW5kaW5nIGl0IGlzIHBvc3NpYmxlIHRoYXQgZGlydHlSZWN0IGNv
dWxkIGJlIG9mZi1ieS1vbmUgbGFyZ2VyCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYW4gdGhl
IHN1cmZhY2Ugc2l6ZSBvZiB0aGUgZHN0IGJ1ZmZlci4gV2UgcHJldmVudCB0aGlzIGhlcmUsIGJ5
IGNsYW1waW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGl0IHRvIGVuc3VyZSB0aGF0IGNhbid0
IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgZGlydHlSZWN0VC5pbnRlcnNlY3QoUGxhdGZv
cm06OkludFJlY3QoUGxhdGZvcm06OkludFBvaW50KDAsIDApLCBtX3dlYlBhZ2UtPmNsaWVudCgp
LT53aW5kb3coKS0+c3VyZmFjZVNpemUoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIGJsaXRUb1dpbmRvdyhkaXJ0eVJlY3RULAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlci0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcnR5VGlsZVJlY3QsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxlbmQqLywgMjU1KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfSBlbHNlIGlmIChjb21taXR0ZWQpIHsKKyAgICAgICAgICAgIC8vIEludGVyc2Vj
dCB0aGUgcmVuZGVyZWQgcmVnaW9uLgorICAgICAgICAgICAgUGxhdGZvcm06OkludFJlY3RSZWdp
b24gcmVuZGVyZWRSZWdpb24gPSB0aWxlQnVmZmVyLT5yZW5kZXJlZFJlZ2lvbigpOworICAgICAg
ICAgICAgSW50UmVjdExpc3QgZGlydHlSZW5kZXJlZFJlY3RzID0gcmVuZGVyZWRSZWdpb24ucmVj
dHMoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGlydHlSZW5kZXJlZFJl
Y3RzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3Q7Cisg
ICAgICAgICAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICAgICAgICAgICAgICB0
aWxlUmVjdC5zZWNvbmQgPSBpbnRlcnNlY3Rpb24oZGlydHlUaWxlUmVjdCwgZGlydHlSZW5kZXJl
ZFJlY3RzLmF0KGkpKTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZVJlY3Quc2Vjb25kLmlzRW1w
dHkoKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgLy8g
QmxpdCB0aGUgcmVuZGVyZWQgcGFydHMuCisgICAgICAgICAgICAgICAgYmxpdFRpbGVSZWN0KHRp
bGVCdWZmZXIsIHRpbGVSZWN0LCBvcmlnaW4sIHRyYW5zZm9ybWF0aW9uLCBjdXJyZW50U3RhdGUp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYmxpdHRlZFRpbGVzLmFwcGVuZCh0aWxlQnVm
ZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKKyAgICBpZiAoYmxpdHRpbmdEaXJlY3RseVRvQ29tcG9zaXRpbmdXaW5kb3cpIHsKKyAgICAg
ICAgV2ViQ29yZTo6RmxvYXRSZWN0IGNvbnRlbnRzUmVjdCA9IG1fd2ViUGFnZS0+ZC0+bWFwRnJv
bVRyYW5zZm9ybWVkRmxvYXRSZWN0KAorICAgICAgICAgICAgV2ViQ29yZTo6RmxvYXRSZWN0KFdl
YkNvcmU6OkludFJlY3QoY29udGVudHMpKSk7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+ZHJhd1N1
YkxheWVycyhkc3RSZWN0LCBjb250ZW50c1JlY3QpOworICAgIH0gZWxzZSBpZiAoY29tcG9zaXRp
bmdTdXJmYWNlKQorICAgICAgICBibGVuZENvbXBvc2l0aW5nU3VyZmFjZShkc3RSZWN0KTsKKwor
I2VuZGlmCisKKyNpZiBFTkFCTEVfU0NST0xMQkFSUworICAgIGlmIChpc1Njcm9sbGluZ09yWm9v
bWluZygpICYmIG1fY2xpZW50LT5pc01haW5GcmFtZSgpKSB7CisgICAgICAgIGlmIChtX2NsaWVu
dC0+c2Nyb2xsc0hvcml6b250YWxseSgpKQorICAgICAgICAgICAgYmxpdEhvcml6b250YWxTY3Jv
bGxiYXIob3JpZ2luKTsKKyAgICAgICAgaWYgKG1fY2xpZW50LT5zY3JvbGxzVmVydGljYWxseSgp
KQorICAgICAgICAgICAgYmxpdFZlcnRpY2FsU2Nyb2xsYmFyKG9yaWdpbik7CisgICAgfQorI2Vu
ZGlmCisKKyNpZiBERUJVR19WSVNVQUxJWkUKKyAgICAvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90
IGV4cGxpY2l0ZWx5IGRlcGVuZCBvbiBXZWJDb3JlOjouCisgICAgQmxhY2tCZXJyeTo6UGxhdGZv
cm06OkdyYXBoaWNzOjpCdWZmZXIqIHdpbmRvd0J1ZmZlciA9CisgICAgICAgIG1fd2ViUGFnZS0+
Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OkRyYXdhYmxlKiBidWZmZXJEcmF3YWJsZSA9CisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6bG9ja0J1ZmZlckRyYXdhYmxlKHdpbmRvd0J1ZmZlcik7Cisg
ICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0
ID0KKyAgICAgICAgU3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmNyZWF0ZVBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0KGJ1ZmZlckRyYXdhYmxlKTsKKyAgICBHcmFwaGljc0NvbnRleHQg
Z3JhcGhpY3NDb250ZXh0KGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KTsKKyAgICBGbG9h
dFJlY3Qgd2tWaWV3cG9ydCA9IEZsb2F0UmVjdCh2aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAg
IEZsb2F0UmVjdCB1aVZpZXdwb3J0ID0gRmxvYXRSZWN0KG1fd2ViUGFnZS0+Y2xpZW50KCktPnVz
ZXJJbnRlcmZhY2VCbGl0dGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpKTsKKyAgICB3a1ZpZXdwb3J0
Lm1vdmUoLWNvbnRlbnRzLngoKSwgLWNvbnRlbnRzLnkoKSk7CisgICAgdWlWaWV3cG9ydC5tb3Zl
KC1jb250ZW50cy54KCksIC1jb250ZW50cy55KCkpOworCisgICAgZ3JhcGhpY3NDb250ZXh0LnNh
dmUoKTsKKworICAgIC8vIERyYXcgYSBibHVlIHJlY3QgZm9yIHRoZSB3ZWJraXQgdGhyZWFkIHZp
ZXdwb3J0LgorICAgIGdyYXBoaWNzQ29udGV4dC5zZXRTdHJva2VDb2xvcihXZWJDb3JlOjpDb2xv
cigwLCAwLCAyNTUpLCBXZWJDb3JlOjpDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBncmFwaGlj
c0NvbnRleHQuc3Ryb2tlUmVjdCh0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHdrVmlld3BvcnQpLCAx
LjApOworCisgICAgLy8gRHJhdyBhIHJlZCByZWN0IGZvciB0aGUgdWkgdGhyZWFkIHZpZXdwb3J0
LgorICAgIGdyYXBoaWNzQ29udGV4dC5zZXRTdHJva2VDb2xvcihXZWJDb3JlOjpDb2xvcigyNTUs
IDAsIDApLCBXZWJDb3JlOjpDb2xvclNwYWNlRGV2aWNlUkdCKTsKKyAgICBncmFwaGljc0NvbnRl
eHQuc3Ryb2tlUmVjdCh0cmFuc2Zvcm1hdGlvbi5tYXBSZWN0KHVpVmlld3BvcnQpLCAxLjApOwor
CisgICAgZ3JhcGhpY3NDb250ZXh0LnJlc3RvcmUoKTsKKworICAgIGRlbGV0ZSBidWZmZXJQbGF0
Zm9ybUdyYXBoaWNzQ29udGV4dDsKKyAgICByZWxlYXNlQnVmZmVyRHJhd2FibGUod2luZG93QnVm
ZmVyKTsKKyNlbmRpZgorCisgICAgaW52YWxpZGF0ZVdpbmRvdyhkc3RSZWN0KTsKKworICAgIGlm
IChibGl0dGluZ0RpcmVjdGx5VG9Db21wb3NpdGluZ1dpbmRvdykgeworICAgICAgICBwdGhyZWFk
X211dGV4X2xvY2soJm1fYmxpdEdlbmVyYXRpb25Mb2NrKTsKKworICAgICAgICArK21fYmxpdEdl
bmVyYXRpb247CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgYmxpdHRlZFRp
bGVzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgYmxpdHRlZFRpbGVzW2ldLT5zZXRCbGl0R2Vu
ZXJhdGlvbihtX2JsaXRHZW5lcmF0aW9uKTsKKworICAgICAgICBjbG9ja19nZXR0aW1lKENMT0NL
X1JFQUxUSU1FLCAmbV9jdXJyZW50QmxpdEVuZCk7CisgICAgICAgIG1fY3VycmVudEJsaXRFbmQu
dHZfbnNlYyArPSAzMCAqIDEwMDAgKiAxMDAwOworICAgICAgICBpZiAobV9jdXJyZW50QmxpdEVu
ZC50dl9uc2VjID49IDEwMDAwMDAwMDBMKSB7CisgICAgICAgICAgICBtX2N1cnJlbnRCbGl0RW5k
LnR2X3NlYyAgKz0gMTsKKyAgICAgICAgICAgIG1fY3VycmVudEJsaXRFbmQudHZfbnNlYyAtPSAx
MDAwMDAwMDAwTDsKKyAgICAgICAgfQorCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZt
X2JsaXRHZW5lcmF0aW9uTG9jayk7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJm1fYmxp
dEdlbmVyYXRpb25Db25kKTsKKyAgICB9Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdT
dG9yZVByaXZhdGU6OmJsaXRUaWxlUmVjdChUaWxlQnVmZmVyKiB0aWxlQnVmZmVyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGlsZVJl
Y3QmIHRpbGVSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFBvaW50JiBvcmlnaW4sCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJDb3JlOjpUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKQoreworICAg
IGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0
dXJuIFBsYXRmb3JtOjpJbnRSZWN0KCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkaXJ0eVRp
bGVSZWN0ID0gdGlsZVJlY3Quc2Vjb25kOworCisgICAgLy8gVGhpcyBkaXJ0eSByZWN0IGlzIGlu
IHRpbGUgY29vcmRpbmF0ZXMsIGJ1dCBpdCBuZWVkcyB0byBiZSBpbgorICAgIC8vIHRyYW5zZm9y
bWVkIGNvbnRlbnRzIGNvb3JkaW5hdGVzLgorICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRpcnR5UmVj
dCA9IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCwgc3RhdGUtPmJh
Y2tpbmdTdG9yZVJlY3QoKSk7CisKKyAgICAvLyBOb3csIHRoaXMgZGlydHkgcmVjdCBpcyBpbiB0
cmFuc2Zvcm1lZCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKKyAgICAvLyB0cmFuc2Zvcm1l
ZCBjb250ZW50cywgYnV0IHVsdGltYXRlbHkgaXQgbmVlZHMgdG8gYmUgdHJhbnNmb3JtZWQKKyAg
ICAvLyBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQuCisgICAgZGlydHlSZWN0
Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgpKTsKKyAgICBkaXJ0eVJlY3QgPSBtYXRyaXgu
bWFwUmVjdChkaXJ0eVJlY3QpOworCisgICAgaWYgKCFtYXRyaXguaXNJZGVudGl0eSgpKSB7Cisg
ICAgICAgIC8vIEJlY2F1c2Ugb2Ygcm91bmRpbmcgaXQgaXMgcG9zc2libGUgdGhhdCBkaXJ0eVJl
Y3QgY291bGQgYmUgb2ZmLWJ5LW9uZSBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgc3VyZmFj
ZSBzaXplIG9mIHRoZSBkc3QgYnVmZmVyLiBXZSBwcmV2ZW50IHRoaXMgaGVyZSwgYnkgY2xhbXBp
bmcKKyAgICAgICAgLy8gaXQgdG8gZW5zdXJlIHRoYXQgY2FuJ3QgaGFwcGVuLgorICAgICAgICBk
aXJ0eVJlY3QuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgw
LCAwKSwgbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCktPnN1cmZhY2VTaXplKCkpKTsKKyAg
ICB9CisKKyAgICBBU1NFUlQoIWRpcnR5UmVjdC5pc0VtcHR5KCkpOworICAgIEFTU0VSVCghZGly
dHlUaWxlUmVjdC5pc0VtcHR5KCkpOworICAgIGlmIChkaXJ0eVJlY3QuaXNFbXB0eSgpIHx8IGRp
cnR5VGlsZVJlY3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3Qo
KTsKKworICAgIGJsaXRUb1dpbmRvdyhkaXJ0eVJlY3QsIHRpbGVCdWZmZXItPm5hdGl2ZUJ1ZmZl
cigpLCBkaXJ0eVRpbGVSZWN0LAorICAgICAgICAgICAgICAgICBmYWxzZSAvKmJsZW5kKi8sIDI1
NSk7CisgICAgcmV0dXJuIGRpcnR5UmVjdDsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01Q
T1NJVElORykKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxlbmRDb21wb3NpdGluZ1N1cmZh
Y2UoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QpCit7CisgICAgaWYgKCFCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJy
ZW50VGhyZWFkKCkpIHsKKyAgICAgICAgdHlwZWRlZiB2b2lkIChCbGFja0JlcnJ5OjpXZWJLaXQ6
OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUpKGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0Jik7CisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFk
TWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1lc3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2FsbE1lc3NhZ2U8RnVuY3Rpb25UeXBlLCBCYWNraW5n
U3RvcmVQcml2YXRlLCBQbGF0Zm9ybTo6SW50UmVjdD4oCisgICAgICAgICAgICAgICAgJkJhY2tp
bmdTdG9yZVByaXZhdGU6OmJsZW5kQ29tcG9zaXRpbmdTdXJmYWNlLCB0aGlzLCBkc3RSZWN0KSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1
cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1cmZhY2UoKTsKKworICAgIGlmICghY29tcG9zaXRp
bmdTdXJmYWNlIHx8ICFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBXZWJDb3JlOjpMYXllclJlbmRlcmluZ1Jlc3VsdHMgbGFzdENvbXBvc2l0aW5nUmVzdWx0
cyA9IG1fd2ViUGFnZS0+ZC0+bGFzdENvbXBvc2l0aW5nUmVzdWx0cygpOworICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbGFzdENvbXBvc2l0aW5nUmVzdWx0cy5ob2xlUHVuY2hSZWN0U2l6ZSgp
OyBpKyspIHsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgaG9sZVB1bmNoUmVjdCA9IGxhc3RD
b21wb3NpdGluZ1Jlc3VsdHMuaG9sZVB1bmNoUmVjdChpKTsKKworICAgICAgICBob2xlUHVuY2hS
ZWN0LmludGVyc2VjdChkc3RSZWN0KTsKKyAgICAgICAgaG9sZVB1bmNoUmVjdC5pbnRlcnNlY3Qo
UGxhdGZvcm06OkludFJlY3QoCisgICAgICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCks
IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7CisKKyAgICAg
ICAgaWYgKCFob2xlUHVuY2hSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNsZWFyV2luZG93
KGhvbGVQdW5jaFJlY3QsIDAsIDAsIDAsIDApOworICAgIH0KKworICAgIENvbXBvc2l0aW5nU3Vy
ZmFjZUJ1ZmZlciogZnJvbnRCdWZmZXIgPSBjb21wb3NpdGluZ1N1cmZhY2UtPmZyb250QnVmZmVy
KCk7CisKKyAgICBJbnRSZWN0TGlzdCByZWN0cyA9IGxhc3RDb21wb3NpdGluZ1Jlc3VsdHMuZGly
dHlSZWdpb24ucmVjdHMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlY3RzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIHJlY3RzW2ldLmludGVyc2VjdChkc3RSZWN0KTsKKyNpZiBERUJV
R19DT01QT1NJVElOR19ESVJUWV9SRUdJT04KKyAgICAgICAgY2xlYXJCdWZmZXIobV93ZWJQYWdl
LT5jbGllbnQoKS0+d2luZG93KCktPmJ1ZmZlcigpLCByZWN0c1tpXSwgMjU1LCAwLCAwLCAxMjgp
OworI2VuZGlmCisgICAgICAgIGJsaXRUb1dpbmRvdyhyZWN0c1tpXSwgZnJvbnRCdWZmZXItPm5h
dGl2ZUJ1ZmZlcigpLCByZWN0c1tpXSwgdHJ1ZSAvKmJsZW5kKi8sIDI1NSk7CisgICAgfQorfQor
Cit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNsZWFyQ29tcG9zaXRpbmdTdXJmYWNlKCkKK3sK
KyAgICBCYWNraW5nU3RvcmVDb21wb3NpdGluZ1N1cmZhY2UqIGNvbXBvc2l0aW5nU3VyZmFjZSA9
CisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5jb21wb3NpdGluZ1N1
cmZhY2UoKTsKKworICAgIGlmICghY29tcG9zaXRpbmdTdXJmYWNlKQorICAgICAgICByZXR1cm47
CisKKyAgICBDb21wb3NpdGluZ1N1cmZhY2VCdWZmZXIqIGZyb250QnVmZmVyID0gY29tcG9zaXRp
bmdTdXJmYWNlLT5mcm9udEJ1ZmZlcigpOworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFw
aGljczo6Y2xlYXJCdWZmZXIoZnJvbnRCdWZmZXItPm5hdGl2ZUJ1ZmZlcigpLCBQbGF0Zm9ybTo6
SW50UmVjdChQbGF0Zm9ybTo6SW50UG9pbnQoKSwgZnJvbnRCdWZmZXItPnN1cmZhY2VTaXplKCkp
LCAwLCAwLCAwLCAwKTsKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdEhvcml6b250YWxTY3JvbGxiYXIoY29u
c3QgUGxhdGZvcm06OkludFBvaW50JiBzY3JvbGxQb3NpdGlvbikKK3sKKyAgICBpZiAoIW1fd2Vi
UGFnZS0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX2NsaWVu
dC0+c2Nyb2xsc0hvcml6b250YWxseSgpKTsKKworICAgIG1fd2ViUGFnZS0+Y2xpZW50KCktPmRy
YXdIb3Jpem9udGFsU2Nyb2xsYmFyKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
YmxpdFZlcnRpY2FsU2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc2Nyb2xsUG9z
aXRpb24pCit7CisgICAgaWYgKCFtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBBU1NFUlQobV9jbGllbnQtPnNjcm9sbHNWZXJ0aWNhbGx5KCkpOworCisgICAg
bV93ZWJQYWdlLT5jbGllbnQoKS0+ZHJhd1ZlcnRpY2FsU2Nyb2xsYmFyKCk7Cit9CisKK2Jvb2wg
QmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNUaWxlVmlzaWJsZShjb25zdCBUaWxlSW5kZXgmIGluZGV4
KSBjb25zdAoreworICAgIFRpbGVSZWN0IHRpbGVSZWN0OworICAgIHRpbGVSZWN0LmZpcnN0ID0g
aW5kZXg7CisgICAgdGlsZVJlY3Quc2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICByZXR1
cm4gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENvbnRlbnRzKHRpbGVSZWN0KS5pbnRlcnNlY3Rz
KHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
aXNUaWxlVmlzaWJsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbikgY29uc3QKK3sK
KyAgICByZXR1cm4gUGxhdGZvcm06OkludFJlY3Qob3JpZ2luLCB0aWxlU2l6ZSgpKS5pbnRlcnNl
Y3RzKHZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tp
bmdTdG9yZVByaXZhdGU6OnZpc2libGVUaWxlc1JlY3QoKSBjb25zdAoreworICAgIEJhY2tpbmdT
dG9yZUdlb21ldHJ5KiBjdXJyZW50U3RhdGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBj
dXJyZW50TWFwID0gY3VycmVudFN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCByZWN0OworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRNYXAu
ZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRNYXAu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVSZWN0IHRpbGVSZWN0Owor
ICAgICAgICB0aWxlUmVjdC5maXJzdCA9IGl0LT5maXJzdDsKKyAgICAgICAgdGlsZVJlY3Quc2Vj
b25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZSA9
IG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVjdCk7CisgICAgICAgIGlm
ICh0aWxlLmludGVyc2VjdHModmlzaWJsZUNvbnRlbnRzUmVjdCgpKSkKKyAgICAgICAgICAgIHJl
Y3QgPSBQbGF0Zm9ybTo6dW5pb25PZlJlY3RzKHJlY3QsIHRpbGUpOworICAgIH0KKyAgICByZXR1
cm4gcmVjdDsKK30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGls
ZVZpc2libGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4JiBpbmRleCkgY29uc3QKK3sKKyAg
ICBpZiAoIWlzVGlsZVZpc2libGUoaW5kZXgpKQorICAgICAgICByZXR1cm4gUGxhdGZvcm06Oklu
dFJlY3QoKTsKKworICAgIHJldHVybiB0aWxlQ29udGVudHNSZWN0KGluZGV4LCB2aXNpYmxlQ29u
dGVudHNSZWN0KCkpOworfQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRl
Ojp0aWxlVW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdChjb25zdCBUaWxlSW5kZXgmIGluZGV4
KSBjb25zdAoreworICAgIGlmICghaXNUaWxlVmlzaWJsZShpbmRleCkpCisgICAgICAgIHJldHVy
biBQbGF0Zm9ybTo6SW50UmVjdCgpOworCisgICAgcmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5k
ZXgsIHVuY2xpcHBlZFZpc2libGVDb250ZW50c1JlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRS
ZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4
JiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHRpbGVDb250ZW50c1JlY3QoaW5kZXgsIGNvbnRlbnRzLCBmcm9udFN0YXRlKCkpOwor
fQorCitQbGF0Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlQ29udGVudHNS
ZWN0KGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNvbnRl
bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBzdGF0ZSkgY29uc3QKK3sKKyAgICBUaWxlUmVjdExp
c3QgdGlsZVJlY3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnRl
bnRzLCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aWxlUmVjdExpc3Quc2l6
ZSgpOyArK2kpIHsKKyAgICAgICAgVGlsZVJlY3QgdGlsZVJlY3QgPSB0aWxlUmVjdExpc3RbaV07
CisgICAgICAgIGlmIChpbmRleCA9PSB0aWxlUmVjdC5maXJzdCkKKyAgICAgICAgICAgIHJldHVy
biB0aWxlUmVjdC5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBQbGF0Zm9ybTo6SW50UmVjdCgp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc2V0UmVuZGVyUXVldWUoKQorewor
ICAgIG1fcmVuZGVyUXVldWUtPnJlc2V0KCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6Y2xlYXJWaXNpYmxlWm9vbSgpCit7CisgICAgbV9yZW5kZXJRdWV1ZS0+Y2xlYXJWaXNpYmxl
Wm9vbSgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlc2V0VGlsZXMoYm9vbCBy
ZXNldEJhY2tncm91bmQpCit7CisgICAgQmFja2luZ1N0b3JlR2VvbWV0cnkqIGN1cnJlbnRTdGF0
ZSA9IGZyb250U3RhdGUoKTsKKyAgICBUaWxlTWFwIGN1cnJlbnRNYXAgPSBjdXJyZW50U3RhdGUt
PnRpbGVNYXAoKTsKKworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IGN1cnJlbnRN
YXAuZW5kKCk7CisgICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IGN1cnJlbnRN
YXAuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICByZXNldFRpbGUoaXQtPmZpcnN0
LCBpdC0+c2Vjb25kLCByZXNldEJhY2tncm91bmQpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVBy
aXZhdGU6OnVwZGF0ZVRpbGVzKGJvb2wgdXBkYXRlVmlzaWJsZSwgYm9vbCBpbW1lZGlhdGUpCit7
CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBCYWNraW5nU3Rv
cmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAgY3Vy
cmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgVGlsZU1hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gY3VycmVudE1hcC5lbmQoKTsKKyAgICBmb3IgKFRpbGVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gY3VycmVudE1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgYm9vbCBpc1Zpc2libGUgPSBpc1RpbGVWaXNpYmxlKGl0LT5maXJzdCk7CisgICAgICAg
IGlmICghdXBkYXRlVmlzaWJsZSAmJiBpc1Zpc2libGUpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgdXBkYXRlVGlsZShpdC0+Zmlyc3QsIGltbWVkaWF0ZSk7CisgICAgfQorfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVzRm9yU2Nyb2xsT3JOb3RSZW5kZXJl
ZFJlZ2lvbihib29sIGNoZWNrTG9hZGluZykKK3sKKyAgICAvLyBUaGlzIG1ldGhvZCBsb29rcyBh
dCBhbGwgdGhlIHRpbGVzIGFuZCBpZiB0aGV5IGFyZSB2aXNpYmxlLCBidXQgbm90IGNvbXBsZXRl
bHkKKyAgICAvLyByZW5kZXJlZCBvciB3ZSBhcmUgbG9hZGluZywgdGhlbiBpdCB1cGRhdGVzIHRo
ZW0uIEZvciBhbGwgdGlsZXMsIHZpc2libGUgYW5kCisgICAgLy8gbm9uLXZpc2libGUsIGlmIGEg
cHJldmlvdXMgYXR0ZW1wdCB3YXMgbWFkZSB0byByZW5kZXIgdGhlbSBkdXJpbmcgYSByZWd1bGFy
CisgICAgLy8gcmVuZGVyIGpvYiwgYnV0IHRoZXkgd2VyZSBub3QgdmlzaWJsZSBhdCB0aGUgdGlt
ZSwgdGhlbiB1cGRhdGUgdGhlbSBhbmQgaWYKKyAgICAvLyB0aGV5IGFyZSBjdXJyZW50bHkgdmlz
aWJsZSwgcmVzZXQgdGhlbS4KKworICAgIEJhY2tpbmdTdG9yZUdlb21ldHJ5KiBjdXJyZW50U3Rh
dGUgPSBmcm9udFN0YXRlKCk7CisgICAgVGlsZU1hcCBjdXJyZW50TWFwID0gY3VycmVudFN0YXRl
LT50aWxlTWFwKCk7CisgICAgUGxhdGZvcm06OkludFJlY3QgYmFja2luZ1N0b3JlUmVjdCA9IGN1
cnJlbnRTdGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpOworCisgICAgYm9vbCBpc0xvYWRpbmcgPSBt
X2NsaWVudC0+bG9hZFN0YXRlKCkgPT0gV2ViUGFnZVByaXZhdGU6OkNvbW1pdHRlZDsKKyAgICBi
b29sIGZvcmNlVmlzaWJsZSA9IGNoZWNrTG9hZGluZyAmJiBpc0xvYWRpbmc7CisKKyAgICBUaWxl
TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBjdXJyZW50TWFwLmVuZCgpOworICAgIGZvciAoVGls
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjdXJyZW50TWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgeworICAgICAgICBUaWxlSW5kZXggaW5kZXggPSBpdC0+Zmlyc3Q7CisgICAgICAgIEJh
Y2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBpdC0+c2Vjb25kOworICAgICAgICBib29sIGlzVmlzaWJs
ZSA9IGlzVGlsZVZpc2libGUoaW5kZXgpOworICAgICAgICAvLyBUaGUgcmVjdCBpbiB0cmFuc2Zv
cm1lZCBjb250ZW50cyBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZvcm06OkludFJlY3QgcmVj
dChvcmlnaW5PZlRpbGUoaW5kZXgpLCB0aWxlU2l6ZSgpKTsKKyAgICAgICAgaWYgKHRpbGUtPmlz
Q29tbWl0dGVkKCkKKyAgICAgICAgICAgICYmIG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJK
b2JzUHJldmlvdXNseUF0dGVtcHRlZEJ1dE5vdFJlbmRlcmVkKHJlY3QpKSB7CisgICAgICAgICAg
ICAvLyBJZiB0aGUgcmVuZGVyIHF1ZXVlIHByZXZpb3VzbHkgdHJpZWQgdG8gcmVuZGVyIHRoaXMg
dGlsZSwgYnV0IHRoZQorICAgICAgICAgICAgLy8gdGlsZSB3YXNuJ3QgdmlzaWJsZSBhdCB0aGUg
dGltZSB3ZSBjYW4ndCBzaW1wbHkgcmVzdG9yZSB0aGUgdGlsZQorICAgICAgICAgICAgLy8gc2lu
Y2UgdGhlIGNvbnRlbnQgaXMgbm93IGludmFsaWQgYXMgZmFyIGFzIFdlYktpdCBpcyBjb25jZXJu
ZWQuCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBjbGVhciB0aGF0IHBhcnQgb2YgdGhlIHRp
bGUgaWYgaXQgaXMgdmlzaWJsZSBhbmQgdGhlbgorICAgICAgICAgICAgLy8gcHV0IHRoZSB0aWxl
IGluIHRoZSByZW5kZXIgcXVldWUgYWdhaW4uCisgICAgICAgICAgICBpZiAoaXNWaXNpYmxlKSB7
CisgICAgICAgICAgICAgICAgLy8gSW50ZXJzZWN0IHRoZSB0aWxlIHdpdGggdGhlIG5vdCByZW5k
ZXJlZCByZWdpb24gdG8gZ2V0IHRoZSBhcmVhcworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0
aWxlIHRoYXQgd2UgbmVlZCB0byBjbGVhci4KKyAgICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50
UmVjdFJlZ2lvbiB0aWxlTm90UmVuZGVyZWRSZWdpb24KKyAgICAgICAgICAgICAgICAgICAgPSBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6aW50ZXJzZWN0UmVnaW9ucygKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlZ3VsYXJSZW5kZXJKb2JzTm90UmVuZGVyZWRSZWdp
b24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QpOworICAgICAgICAgICAgICAgIGNs
ZWFyQW5kVXBkYXRlVGlsZU9mTm90UmVuZGVyZWRSZWdpb24oaW5kZXgsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZU5vdFJlbmRl
cmVkUmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgYmFja2luZ1N0b3JlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qdXBkYXRlKi8pOworI2lmIERFQlVHX0JB
Q0tJTkdTVE9SRQorICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IGV4dGVudHMgPSB0
aWxlTm90UmVuZGVyZWRSZWdpb24uZXh0ZW50cygpOworICAgICAgICAgICAgICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsQ3JpdGljYWws
CisgICAgICAgICAgICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlc0Zv
clNjcm9sbCBkaWQgY2xlYXIgdGlsZSAlZCwlZCAlZHglZCIsCisgICAgICAgICAgICAgICAgICAg
IGV4dGVudHMueCgpLCBleHRlbnRzLnkoKSwgZXh0ZW50cy53aWR0aCgpLCBleHRlbnRzLmhlaWdo
dCgpKTsKKyNlbmRpZgorICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlVGlsZShpbmRl
eCwgZmFsc2UgLyppbW1lZGlhdGUqLyk7CisgICAgICAgIH0gZWxzZSBpZiAoaXNWaXNpYmxlCisg
ICAgICAgICAgICAmJiAoZm9yY2VWaXNpYmxlIHx8ICF0aWxlLT5mcm9udEJ1ZmZlcigpLT5pc1Jl
bmRlcmVkKHRpbGVWaXNpYmxlQ29udGVudHNSZWN0KGluZGV4KSkpCisgICAgICAgICAgICAmJiAh
aXNDdXJyZW50VmlzaWJsZUpvYihpbmRleCwgdGlsZSwgYmFja2luZ1N0b3JlUmVjdCkpCisgICAg
ICAgICAgICB1cGRhdGVUaWxlKGluZGV4LCBmYWxzZSAvKmltbWVkaWF0ZSovKTsKKyAgICB9Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6cmVzZXRUaWxlKGNvbnN0IFRpbGVJbmRleCYg
aW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUsIGJvb2wgcmVzZXRCYWNrZ3JvdW5kKQorewor
ICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fd2ViUGFnZS0+ZC0+c2V0U2hvdWxkUmVzZXRU
aWxlc1doZW5TaG93bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFRpbGVS
ZWN0IHRpbGVSZWN0OworICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAgdGlsZVJlY3Qu
c2Vjb25kID0gdGhpcy0+dGlsZVJlY3QoKTsKKyAgICAvLyBPbmx5IGNsZWFyIHJlZ3VsYXIgcmVu
ZGVyIGpvYnMgaWYgd2UncmUgY2xlYXJpbmcgdGhlIGJhY2tncm91bmQgdG9vLgorICAgIG1fcmVu
ZGVyUXVldWUtPmNsZWFyKG1hcEZyb21UaWxlc1RvVHJhbnNmb3JtZWRDb250ZW50cyh0aWxlUmVj
dCksIHJlc2V0QmFja2dyb3VuZCAvKmNsZWFyUmVndWxhclJlbmRlckpvYnMqLyk7CisgICAgaWYg
KHJlc2V0QmFja2dyb3VuZCkKKyAgICAgICAgdGlsZS0+cmVzZXQoKTsKK30KKwordm9pZCBCYWNr
aW5nU3RvcmVQcml2YXRlOjp1cGRhdGVUaWxlKGNvbnN0IFRpbGVJbmRleCYgaW5kZXgsIGJvb2wg
aW1tZWRpYXRlKQoreworICAgIGlmICghaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgVGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgdGlsZVJlY3QuZmlyc3QgPSBpbmRleDsKKyAgICB0
aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgIFBsYXRmb3JtOjpJbnRSZWN0
IHVwZGF0ZVJlY3QgPSBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHModGlsZVJlY3Qp
OworICAgIFJlbmRlclF1ZXVlOjpKb2JUeXBlIGpvYlR5cGUgPSBpc1RpbGVWaXNpYmxlKGluZGV4
KSA/IFJlbmRlclF1ZXVlOjpWaXNpYmxlU2Nyb2xsIDogUmVuZGVyUXVldWU6Ok5vblZpc2libGVT
Y3JvbGw7CisgICAgaWYgKGltbWVkaWF0ZSkKKyAgICAgICAgcmVuZGVyKHVwZGF0ZVJlY3QsIHRy
dWUgLypyZW5kZXJDb250ZW50T25seSovKTsKKyAgICBlbHNlCisgICAgICAgIG1fcmVuZGVyUXVl
dWUtPmFkZFRvUXVldWUoam9iVHlwZSwgdXBkYXRlUmVjdCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6dXBkYXRlVGlsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9yaWdpbiwg
Ym9vbCBpbW1lZGlhdGUpCit7CisgICAgaWYgKCFpc0FjdGl2ZSgpKQorICAgICAgICByZXR1cm47
CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB1cGRhdGVSZWN0ID0gUGxhdGZvcm06OkludFJlY3Qo
b3JpZ2luLCB0aWxlU2l6ZSgpKTsKKyAgICBSZW5kZXJRdWV1ZTo6Sm9iVHlwZSBqb2JUeXBlID0g
aXNUaWxlVmlzaWJsZShvcmlnaW4pID8gUmVuZGVyUXVldWU6OlZpc2libGVTY3JvbGwgOiBSZW5k
ZXJRdWV1ZTo6Tm9uVmlzaWJsZVNjcm9sbDsKKyAgICBpZiAoaW1tZWRpYXRlKQorICAgICAgICBy
ZW5kZXIodXBkYXRlUmVjdCwgdHJ1ZSAvKnJlbmRlckNvbnRlbnRPbmx5Ki8pOworICAgIGVsc2UK
KyAgICAgICAgbV9yZW5kZXJRdWV1ZS0+YWRkVG9RdWV1ZShqb2JUeXBlLCB1cGRhdGVSZWN0KTsK
K30KKworUGxhdGZvcm06OkludFJlY3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRpbGVz
VG9UcmFuc2Zvcm1lZENvbnRlbnRzKGNvbnN0IEJhY2tpbmdTdG9yZVByaXZhdGU6OlRpbGVSZWN0
JiB0aWxlUmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1l
ZENvbnRlbnRzKHRpbGVSZWN0LCBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKSk7Cit9
CisKK1BsYXRmb3JtOjpJbnRSZWN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21UaWxlc1Rv
VHJhbnNmb3JtZWRDb250ZW50cyhjb25zdCBCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdCYg
dGlsZVJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0KSBjb25z
dAoreworICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAgIFBsYXRmb3Jt
OjpJbnRSZWN0IHJlY3QgPSB0aWxlUmVjdC5zZWNvbmQ7CisgICAgLy8gVGhlIG9yaWdpbiBvZiB0
aGUgdGlsZSBpbmNsdWRpbmcgdGhlIGJhY2tpbmcgc3RvcmUgb2Zmc2V0LgorICAgIGNvbnN0IFBs
YXRmb3JtOjpJbnRQb2ludCBvcmlnaW5PZlRpbGUgPSB0aGlzLT5vcmlnaW5PZlRpbGUoaW5kZXgs
IGJhY2tpbmdTdG9yZVJlY3QpOworICAgIHJlY3QubW92ZShvcmlnaW5PZlRpbGUueCgpLCBvcmln
aW5PZlRpbGUueSgpKTsKKyAgICByZXR1cm4gcmVjdDsKK30KKworQmFja2luZ1N0b3JlUHJpdmF0
ZTo6VGlsZVJlY3RMaXN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1hcEZyb21UcmFuc2Zvcm1lZENv
bnRlbnRzVG9BYnNvbHV0ZVRpbGVCb3VuZGFyaWVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBy
ZWN0KSBjb25zdAoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3Rp
dmUoKSkgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIFRp
bGVSZWN0TGlzdCgpOworICAgIH0KKworICAgIFRpbGVSZWN0TGlzdCB0aWxlUmVjdExpc3Q7Cisg
ICAgaW50IGZpcnN0WE9mZnNldCA9IHJlY3QueCgpIC8gdGlsZVdpZHRoKCk7CisgICAgaW50IGZp
cnN0WU9mZnNldCA9IHJlY3QueSgpIC8gdGlsZUhlaWdodCgpOworICAgIGludCBsYXN0WE9mZnNl
dCA9IChyZWN0LnJpZ2h0KCkgLSAxKSAvIHRpbGVXaWR0aCgpOworICAgIGludCBsYXN0WU9mZnNl
dCA9IChyZWN0LmJvdHRvbSgpIC0gMSkgLyB0aWxlSGVpZ2h0KCk7CisgICAgZm9yIChpbnQgaSA9
IGZpcnN0WE9mZnNldDsgaSA8PSBsYXN0WE9mZnNldDsgKytpKSB7CisgICAgICAgIGZvciAoaW50
IGogPSBmaXJzdFlPZmZzZXQ7IGogPD0gbGFzdFlPZmZzZXQ7ICsraikgeworICAgICAgICAgICAg
Y29uc3QgaW50IGRzdFggPSAoaSA9PSBmaXJzdFhPZmZzZXQpID8gcmVjdC54KCkgOiBpICogdGls
ZVdpZHRoKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgZHN0WSA9IChqID09IGZpcnN0WU9mZnNl
dCkgPyByZWN0LnkoKSA6IGogKiB0aWxlSGVpZ2h0KCk7CisgICAgICAgICAgICBjb25zdCBpbnQg
ZHN0UmlnaHQgPSAoaSA9PSBsYXN0WE9mZnNldCkgPyByZWN0LnJpZ2h0KCkgOiAoaSArIDEpICog
dGlsZVdpZHRoKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgZHN0Qm90dG9tID0gKGogPT0gbGFz
dFlPZmZzZXQpID8gcmVjdC5ib3R0b20oKSA6IChqICsgMSkgKiB0aWxlSGVpZ2h0KCk7CisgICAg
ICAgICAgICBjb25zdCBpbnQgc3JjWCA9IGRzdFggJSB0aWxlV2lkdGgoKTsKKyAgICAgICAgICAg
IGNvbnN0IGludCBzcmNZID0gZHN0WSAlIHRpbGVIZWlnaHQoKTsKKyAgICAgICAgICAgIFRpbGVS
ZWN0IHRpbGVSZWN0OworICAgICAgICAgICAgdGlsZVJlY3QuZmlyc3QgPSBUaWxlSW5kZXgoaSwg
aik7CisgICAgICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSBQbGF0Zm9ybTo6SW50UmVjdChzcmNY
LCBzcmNZLCBkc3RSaWdodCAtIGRzdFgsIGRzdEJvdHRvbSAtIGRzdFkpOworICAgICAgICAgICAg
dGlsZVJlY3RMaXN0LmFwcGVuZCh0aWxlUmVjdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0
dXJuIHRpbGVSZWN0TGlzdDsKK30KKworCitCYWNraW5nU3RvcmVQcml2YXRlOjpUaWxlUmVjdExp
c3QgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVz
KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBtYXBG
cm9tVHJhbnNmb3JtZWRDb250ZW50c1RvVGlsZXMocmVjdCwgZnJvbnRTdGF0ZSgpKTsKK30KKwor
QmFja2luZ1N0b3JlUHJpdmF0ZTo6VGlsZVJlY3RMaXN0IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1h
cEZyb21UcmFuc2Zvcm1lZENvbnRlbnRzVG9UaWxlcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
cmVjdCwgQmFja2luZ1N0b3JlR2VvbWV0cnkqIHN0YXRlKSBjb25zdAoreworICAgIFRpbGVNYXAg
dGlsZU1hcCA9IHN0YXRlLT50aWxlTWFwKCk7CisKKyAgICBUaWxlUmVjdExpc3QgdGlsZVJlY3RM
aXN0OworICAgIFRpbGVNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IHRpbGVNYXAuZW5kKCk7Cisg
ICAgZm9yIChUaWxlTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IHRpbGVNYXAuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IGl0LT5maXJzdDsKKyAg
ICAgICAgQmFja2luZ1N0b3JlVGlsZSogdGlsZSA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgLy8g
TmVlZCB0byBtYXAgdGhlIHJlY3QgdG8gdGlsZSBjb29yZGluYXRlcy4KKyAgICAgICAgUGxhdGZv
cm06OkludFJlY3QgciA9IHJlY3Q7CisKKyAgICAgICAgLy8gVGhlIG9yaWdpbiBvZiB0aGUgdGls
ZSBpbmNsdWRpbmcgdGhlIGJhY2tpbmcgc3RvcmUgb2Zmc2V0LgorICAgICAgICBjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZUaWxlID0gdGhpcy0+b3JpZ2luT2ZUaWxlKGluZGV4LCBz
dGF0ZS0+YmFja2luZ1N0b3JlUmVjdCgpKTsKKworICAgICAgICByLm1vdmUoLShvcmlnaW5PZlRp
bGUueCgpKSwgLShvcmlnaW5PZlRpbGUueSgpKSk7CisKKyAgICAgICAgLy8gRG8gd2UgaW50ZXJz
ZWN0IHRoZSBjdXJyZW50IHRpbGUgb3Igbm8/CisgICAgICAgIHIuaW50ZXJzZWN0KHRpbGUtPnJl
Y3QoKSk7CisgICAgICAgIGlmIChyLmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOwor
CisgICAgICAgIC8vIElmIHdlIGRvIGFwcGVuZCB0byBsaXN0IGFuZCBWb2lsYSEKKyAgICAgICAg
VGlsZVJlY3QgdGlsZVJlY3Q7CisgICAgICAgIHRpbGVSZWN0LmZpcnN0ID0gaW5kZXg7CisgICAg
ICAgIHRpbGVSZWN0LnNlY29uZCA9IHI7CisgICAgICAgIHRpbGVSZWN0TGlzdC5hcHBlbmQodGls
ZVJlY3QpOworICAgIH0KKyAgICByZXR1cm4gdGlsZVJlY3RMaXN0OworfQorCit2b2lkIEJhY2tp
bmdTdG9yZVByaXZhdGU6OnVwZGF0ZVRpbGVNYXRyaXhJZk5lZWRlZCgpCit7CisgICAgLy8gVGhp
cyB3aWxsIHVwZGF0ZSB0aGUgdGlsZSBtYXRyaXguCisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKDAs
IDApOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNvbnRlbnRzU2l6ZUNoYW5nZWQo
Y29uc3QgUGxhdGZvcm06OkludFNpemUmKQoreworICAgIHVwZGF0ZVRpbGVNYXRyaXhJZk5lZWRl
ZCgpOworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnNjcm9sbENoYW5nZWQoY29uc3Qg
UGxhdGZvcm06OkludFBvaW50JikKK3sKKyAgICAvLyBGSVhNRTogTmVlZCB0byBkbyBhbnl0aGlu
ZyBoZXJlPworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnRyYW5zZm9ybUNoYW5nZWQo
KQoreworICAgIGlmICghbV93ZWJQYWdlLT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKCFpc0FjdGl2ZSgpKSB7CisgICAgICAgIG1fcmVuZGVyUXVldWUtPnJlc2V0KCk7
CisgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUoUmVuZGVyUXVldWU6OlZpc2libGVa
b29tLCB2aXNpYmxlQ29udGVudHNSZWN0KCkpOworICAgICAgICBtX3dlYlBhZ2UtPmQtPnNldFNo
b3VsZFJlc2V0VGlsZXNXaGVuU2hvd24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOwor
ICAgIFRpbGVNYXAgY3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAg
Ym9vbCBoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IgPSBtX3JlbmRlclF1ZXVlLT5oYXNDdXJyZW50
VmlzaWJsZVpvb21Kb2IoKTsKKyAgICBib29sIGlzTG9hZGluZyA9IG1fY2xpZW50LT5pc0xvYWRp
bmcoKTsKKyAgICBpZiAoaXNMb2FkaW5nKSB7CisgICAgICAgIGlmICghaGFzQ3VycmVudFZpc2li
bGVab29tSm9iKQorICAgICAgICAgICAgbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QgPSB2aXNpYmxl
Q29udGVudHNSZWN0KCk7IC8vIENhY2hlIHRoaXMgZm9yIGJsaXRWaXNpYmxlQ29udGVudHMuCisK
KyAgICAgICAgLy8gQWRkIHRoZSBjdXJyZW50bHkgdmlzaWJsZSB0aWxlcyB0byB0aGUgcmVuZGVy
IHF1ZXVlIGFzIHZpc2libGUgem9vbSBqb2JzLgorICAgICAgICBUaWxlUmVjdExpc3QgdGlsZVJl
Y3RMaXN0ID0gbWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKHZpc2libGVDb250ZW50
c1JlY3QoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGlsZVJlY3RMaXN0LnNp
emUoKTsgKytpKSB7CisgICAgICAgICAgICBUaWxlUmVjdCB0aWxlUmVjdCA9IHRpbGVSZWN0TGlz
dFtpXTsKKyAgICAgICAgICAgIFRpbGVJbmRleCBpbmRleCA9IHRpbGVSZWN0LmZpcnN0OworICAg
ICAgICAgICAgUGxhdGZvcm06OkludFJlY3QgZGlydHlUaWxlUmVjdCA9IHRpbGVSZWN0LnNlY29u
ZDsKKyAgICAgICAgICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGUgPSBjdXJyZW50TWFwLmdldChp
bmRleCk7CisKKyAgICAgICAgICAgIC8vIEludmFsaWRhdGUgdGhlIHdob2xlIHJlY3QuCisgICAg
ICAgICAgICB0aWxlUmVjdC5zZWNvbmQgPSB0aGlzLT50aWxlUmVjdCgpOworICAgICAgICAgICAg
UGxhdGZvcm06OkludFJlY3Qgd2hvbGVSZWN0ID0gbWFwRnJvbVRpbGVzVG9UcmFuc2Zvcm1lZENv
bnRlbnRzKHRpbGVSZWN0KTsKKyAgICAgICAgICAgIG1fcmVuZGVyUXVldWUtPmFkZFRvUXVldWUo
UmVuZGVyUXVldWU6OlZpc2libGVab29tLCB3aG9sZVJlY3QpOworCisgICAgICAgICAgICAvLyBD
b3B5IHRoZSB2aXNpYmxlIGNvbnRlbnRzIGludG8gdGhlIHZpc2libGVUaWxlQnVmZmVyIGlmIHdl
IGRvbid0IGhhdmUKKyAgICAgICAgICAgIC8vIGFueSBjdXJyZW50IHZpc2libGUgem9vbSBqb2Jz
LgorICAgICAgICAgICAgaWYgKCFoYXNDdXJyZW50VmlzaWJsZVpvb21Kb2IpIHsKKyAgICAgICAg
ICAgICAgICAvLyBNYXAgdG8gdGhlIGRlc3RpbmF0aW9uJ3MgY29vcmRpbmF0ZSBzeXN0ZW0uCisg
ICAgICAgICAgICAgICAgUGxhdGZvcm06OkludFBvaW50IGRpZmZlcmVuY2UgPSB0aGlzLT5vcmln
aW5PZlRpbGUoaW5kZXgpIC0gbV92aXNpYmxlVGlsZUJ1ZmZlclJlY3QubG9jYXRpb24oKTsKKyAg
ICAgICAgICAgICAgICBQbGF0Zm9ybTo6SW50U2l6ZSBvZmZzZXQgPSBQbGF0Zm9ybTo6SW50U2l6
ZShkaWZmZXJlbmNlLngoKSwgZGlmZmVyZW5jZS55KCkpOworICAgICAgICAgICAgICAgIFBsYXRm
b3JtOjpJbnRSZWN0IGRpcnR5UmVjdCA9IGRpcnR5VGlsZVJlY3Q7CisgICAgICAgICAgICAgICAg
ZGlydHlSZWN0Lm1vdmUob2Zmc2V0LndpZHRoKCksIG9mZnNldC5oZWlnaHQoKSk7CisKKyAgICAg
ICAgICAgICAgICBCYWNraW5nU3RvcmVUaWxlKiB2aXNpYmxlVGlsZUJ1ZmZlcgorICAgICAgICAg
ICAgICAgICAgICA9IFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT52aXNpYmxlVGls
ZUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIEFTU0VSVCh2aXNpYmxlVGlsZUJ1ZmZlci0+c2l6
ZSgpID09IFBsYXRmb3JtOjpJbnRTaXplKG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtZWRWaWV3cG9y
dFNpemUoKSkpOworICAgICAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGlj
czo6YmxpdFRvQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICB2aXNpYmxlVGlsZUJ1ZmZlci0+
ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5UmVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgdGlsZS0+ZnJvbnRCdWZmZXIoKS0+bmF0aXZlQnVmZmVyKCksIGRpcnR5VGlsZVJlY3Qp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9yZW5kZXJRdWV1ZS0+
cmVzZXQoKTsKKyAgICByZXNldFRpbGVzKHRydWUgLypyZXNldEJhY2tncm91bmQqLyk7Cit9CisK
K3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6b3JpZW50YXRpb25DaGFuZ2VkKCkKK3sKKyAgICB1
cGRhdGVUaWxlTWF0cml4SWZOZWVkZWQoKTsKKyAgICBjcmVhdGVWaXNpYmxlVGlsZUJ1ZmZlcigp
OworfQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmFjdHVhbFZpc2libGVTaXplQ2hhbmdl
ZChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgc2l6ZSkKK3sKK30KKworc3RhdGljIHZvaWQgY3Jl
YXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKFdlYlBhZ2VQcml2YXRlKiBwYWdlKQorewor
ICAgIEFTU0VSVChwYWdlKTsKKyAgICBTdXJmYWNlUG9vbCogc3VyZmFjZVBvb2wgPSBTdXJmYWNl
UG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKTsKKyAgICBzdXJmYWNlUG9vbC0+aW5pdGlhbGl6ZVZp
c2libGVUaWxlQnVmZmVyKHBhZ2UtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmNyZWF0ZVN1cmZhY2VzKCkKK3sKKyAgICBCYWNraW5n
U3RvcmVHZW9tZXRyeSogY3VycmVudFN0YXRlID0gZnJvbnRTdGF0ZSgpOworICAgIFRpbGVNYXAg
Y3VycmVudE1hcCA9IGN1cnJlbnRTdGF0ZS0+dGlsZU1hcCgpOworCisgICAgQVNTRVJUKGN1cnJl
bnRNYXAuaXNFbXB0eSgpKTsKKworICAgIGlmIChtX3dlYlBhZ2UtPmlzVmlzaWJsZSgpKSB7Cisg
ICAgICAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgdG8gYmUgY2FsbGVkIGFzIHBhcnQgb2Ygc2V0
dGluZyB1cCBhIG5ldyB3ZWIgcGFnZSBpbnN0YW5jZSBhbmQKKyAgICAgICAgLy8gYmVmb3JlIHNh
aWQgaW5zdGFuY2UgaXMgbWFkZSB2aXNpYmxlIHNvIGFzIHRvIGVuc3VyZSBhIGNvbnNpc3RlbnQg
ZGVmaW5pdGlvbiBvZiB3ZWIKKyAgICAgICAgLy8gcGFnZSB2aXNpYmlsaXR5LiBUaGF0IGlzLCBh
IHdlYiBwYWdlIGlzIHNhaWQgdG8gYmUgdmlzaWJsZSB3aGVuIGV4cGxpY2l0bHkgbWFkZSB2aXNp
YmxlLgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIFN1cmZhY2VQb29sKiBzdXJmYWNlUG9vbCA9IFN1cmZhY2VQb29sOjpnbG9iYWxT
dXJmYWNlUG9vbCgpOworICAgIHN1cmZhY2VQb29sLT5pbml0aWFsaXplKHRpbGVTaXplKCkpOwor
CisgICAgaWYgKHN1cmZhY2VQb29sLT5pc0VtcHR5KCkpIC8vIFNldHRpbmdzIHNwZWNpZnkgMCB0
aWxlcyAvIG5vIGJhY2tpbmcgc3RvcmUuCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IERp
dmlzb3IgZGl2aXNvciA9IGJlc3REaXZpc29yKGV4cGFuZGVkQ29udGVudHNTaXplKCksIHRpbGVX
aWR0aCgpLCB0aWxlSGVpZ2h0KCksIG1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSgpLCBtaW5pbXVt
TnVtYmVyT2ZUaWxlc0hpZ2goKSwgbV9wcmVmZXJyZWRUaWxlTWF0cml4RGltZW5zaW9uKTsKKwor
ICAgIGludCBudW1iZXJPZlRpbGVzV2lkZSA9IGRpdmlzb3IuZmlyc3Q7CisgICAgaW50IG51bWJl
ck9mVGlsZXNIaWdoID0gZGl2aXNvci5zZWNvbmQ7CisKKyAgICBjb25zdCBTdXJmYWNlUG9vbDo6
VGlsZUxpc3QgdGlsZUxpc3QgPSBzdXJmYWNlUG9vbC0+dGlsZUxpc3QoKTsKKyAgICBBU1NFUlQo
c3RhdGljX2Nhc3Q8aW50Pih0aWxlTGlzdC5zaXplKCkpID49IChudW1iZXJPZlRpbGVzV2lkZSAq
IG51bWJlck9mVGlsZXNIaWdoKSk7CisKKyAgICBUaWxlTWFwIG5ld1RpbGVNYXA7CisgICAgZm9y
IChpbnQgeSA9IDA7IHkgPCBudW1iZXJPZlRpbGVzSGlnaDsgKyt5KSB7CisgICAgICAgIGZvciAo
aW50IHggPSAwOyB4IDwgbnVtYmVyT2ZUaWxlc1dpZGU7ICsreCkgeworICAgICAgICAgICAgVGls
ZUluZGV4IGluZGV4KHgsIHkpOworICAgICAgICAgICAgbmV3VGlsZU1hcC5hZGQoaW5kZXgsIHRp
bGVMaXN0LmF0KHggKyB5ICogbnVtYmVyT2ZUaWxlc1dpZGUpKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIC8vIFNldCB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgYmFja2luZ3N0b3JlIGdlb21l
dHJ5LgorICAgIGJhY2tTdGF0ZSgpLT5zZXROdW1iZXJPZlRpbGVzV2lkZShkaXZpc29yLmZpcnN0
KTsKKyAgICBiYWNrU3RhdGUoKS0+c2V0TnVtYmVyT2ZUaWxlc0hpZ2goZGl2aXNvci5zZWNvbmQp
OworICAgIGJhY2tTdGF0ZSgpLT5zZXRUaWxlTWFwKG5ld1RpbGVNYXApOworCisgICAgLy8gU3dh
cCBiYWNrL2Zyb250IHN0YXRlLgorICAgIHN3YXBTdGF0ZSgpOworCisgICAgY3JlYXRlVmlzaWJs
ZVRpbGVCdWZmZXJGb3JXZWJQYWdlKG1fd2ViUGFnZS0+ZCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0
b3JlUHJpdmF0ZTo6Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXIoKQoreworICAgIGlmICghbV93ZWJQ
YWdlLT5pc1Zpc2libGUoKSB8fCAhaXNBY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Y3JlYXRlVmlzaWJsZVRpbGVCdWZmZXJGb3JXZWJQYWdlKG1fd2ViUGFnZS0+ZCk7Cit9CisKK1Bs
YXRmb3JtOjpJbnRQb2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmlnaW5PZlRpbGUoY29uc3Qg
VGlsZUluZGV4JiBpbmRleCkgY29uc3QKK3sKKyAgICByZXR1cm4gb3JpZ2luT2ZUaWxlKGluZGV4
LCBmcm9udFN0YXRlKCktPmJhY2tpbmdTdG9yZVJlY3QoKSk7Cit9CisKK1BsYXRmb3JtOjpJbnRQ
b2ludCBCYWNraW5nU3RvcmVQcml2YXRlOjpvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiBp
bmRleCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNvbnN0Cit7
CisgICAgcmV0dXJuIFBsYXRmb3JtOjpJbnRQb2ludChiYWNraW5nU3RvcmVSZWN0LngoKSArIChp
bmRleC5pKCkgKiB0aWxlV2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBi
YWNraW5nU3RvcmVSZWN0LnkoKSArIChpbmRleC5qKCkgKiB0aWxlSGVpZ2h0KCkpKTsKK30KKwor
aW50IEJhY2tpbmdTdG9yZVByaXZhdGU6Om1pbmltdW1OdW1iZXJPZlRpbGVzV2lkZSgpIGNvbnN0
Cit7CisgICAgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRpbGVzIHdpZGUgcmVxdWlyZWQgdG8g
ZmlsbCB0aGUgdmlld3BvcnQgKyAxIHRpbGUgZXh0cmEgdG8gYWxsb3cgc2Nyb2xsaW5nLgorICAg
IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxmKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZpZXdw
b3J0U2l6ZSgpLndpZHRoKCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odGlsZVdpZHRoKCkpKSkgKyAx
OworfQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6bWluaW11bU51bWJlck9mVGlsZXNIaWdo
KCkgY29uc3QKK3sKKyAgICAvLyBUaGUgbWluaW11bSBudW1iZXIgb2YgdGlsZXMgaGlnaCByZXF1
aXJlZCB0byBmaWxsIHRoZSB2aWV3cG9ydCArIDEgdGlsZSBleHRyYSB0byBhbGxvdyBzY3JvbGxp
bmcuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY2VpbGYobV9jbGllbnQtPnRyYW5zZm9y
bWVkVmlld3BvcnRTaXplKCkuaGVpZ2h0KCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4odGlsZUhlaWdo
dCgpKSkpICsgMTsKK30KKworUGxhdGZvcm06OkludFNpemUgQmFja2luZ1N0b3JlUHJpdmF0ZTo6
ZXhwYW5kZWRDb250ZW50c1NpemUoKSBjb25zdAoreworICAgIHJldHVybiBtX2NsaWVudC0+dHJh
bnNmb3JtZWRDb250ZW50c1NpemUoKS5leHBhbmRlZFRvKG1fY2xpZW50LT50cmFuc2Zvcm1lZFZp
ZXdwb3J0U2l6ZSgpKTsKK30KKworaW50IEJhY2tpbmdTdG9yZVByaXZhdGU6OnRpbGVXaWR0aCgp
Cit7CisgICAgc3RhdGljIGludCB0aWxlV2lkdGggPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OlNjcmVlbjo6bGFuZHNjYXBlV2lkdGgoKTsKKyAgICByZXR1cm4gdGlsZVdpZHRoOwor
fQorCitpbnQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6dGlsZUhlaWdodCgpCit7CisgICAgc3RhdGlj
IGludCB0aWxlSGVpZ2h0ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpTY3JlZW46
OmxhbmRzY2FwZUhlaWdodCgpOworICAgIHJldHVybiB0aWxlSGVpZ2h0OworfQorCitQbGF0Zm9y
bTo6SW50U2l6ZSBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlU2l6ZSgpCit7CisgICAgcmV0dXJu
IFBsYXRmb3JtOjpJbnRTaXplKHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCkpOworfQorCitQbGF0
Zm9ybTo6SW50UmVjdCBCYWNraW5nU3RvcmVQcml2YXRlOjp0aWxlUmVjdCgpCit7CisgICAgcmV0
dXJuIFBsYXRmb3JtOjpJbnRSZWN0KDAsIDAsIHRpbGVXaWR0aCgpLCB0aWxlSGVpZ2h0KCkpOwor
fQorCit2b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OnJlbmRlckNvbnRlbnRzKEJsYWNrQmVycnk6
OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiB0aWxlQnVmZmVyLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHN1cmZh
Y2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50c1JlY3QpIGNvbnN0Cit7CisgICAgLy8gSWYgdGls
ZUJ1ZmZlciA9PSAwLCB3ZSByZW5kZXIgZGlyZWN0bHkgdG8gdGhlIHdpbmRvdy4KKyAgICBpZiAo
IW1fd2ViUGFnZS0+aXNWaXNpYmxlKCkgJiYgdGlsZUJ1ZmZlcikKKyAgICAgICAgcmV0dXJuOwor
CisjaWYgREVCVUdfQkFDS0lOR1NUT1JFCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICJCYWNraW5nU3RvcmVQcml2YXRlOjpyZW5kZXJDb250ZW50cyB0aWxlQnVmZmVy
PTB4JXggc3VyZmFjZU9mZnNldD0oJWQsJWQpIGNvbnRlbnRzUmVjdD0oJWQsJWQgJWR4JWQpIiwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVCdWZmZXIsIHN1cmZhY2VPZmZzZXQueCgp
LCBzdXJmYWNlT2Zmc2V0LnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRz
UmVjdC54KCksIGNvbnRlbnRzUmVjdC55KCksIGNvbnRlbnRzUmVjdC53aWR0aCgpLCBjb250ZW50
c1JlY3QuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICAvLyBJdCBpcyB1cCB0byBjYWxsZXJzIG9m
IHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gbGF5b3V0IHRoZW1zZWx2ZXMhCisgICAgQVNTRVJUKCFt
X3dlYlBhZ2UtPmQtPm1haW5GcmFtZSgpLT52aWV3KCktPm5lZWRzTGF5b3V0KCkpOworCisgICAg
UGxhdGZvcm06OkludFNpemUgY29udGVudHNTaXplID0gbV9jbGllbnQtPmNvbnRlbnRzU2l6ZSgp
OworICAgIENvbG9yIGJhY2tncm91bmRDb2xvcihtX3dlYlBhZ2UtPnNldHRpbmdzKCktPmJhY2tn
cm91bmRDb2xvcigpKTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVm
ZmVyKiB0YXJnZXRCdWZmZXIgPSB0aWxlQnVmZmVyCisgICAgICAgID8gdGlsZUJ1ZmZlcgorICAg
ICAgICA6IG1fd2ViUGFnZS0+Y2xpZW50KCktPndpbmRvdygpLT5idWZmZXIoKTsKKworICAgIGlm
IChjb250ZW50c1NpemUuaXNFbXB0eSgpCisgICAgICAgIHx8ICFQbGF0Zm9ybTo6SW50UmVjdChQ
bGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fY2xpZW50LT50cmFuc2Zvcm1lZENvbnRlbnRzU2l6
ZSgpKS5jb250YWlucyhjb250ZW50c1JlY3QpCisgICAgICAgIHx8IGJhY2tncm91bmRDb2xvci5o
YXNBbHBoYSgpKSB7CisgICAgICAgIC8vIENsZWFyIHRoZSBhcmVhIGlmIGl0J3Mgbm90IGZ1bGx5
IGNvdmVyZWQgYnkgKG9wYXF1ZSkgY29udGVudHMuCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpJbnRSZWN0IGNsZWFyUmVjdCA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0KAor
ICAgICAgICAgICAgY29udGVudHNSZWN0LngoKSAtIHN1cmZhY2VPZmZzZXQueCgpLCBjb250ZW50
c1JlY3QueSgpIC0gc3VyZmFjZU9mZnNldC55KCksCisgICAgICAgICAgICBjb250ZW50c1JlY3Qu
d2lkdGgoKSwgY29udGVudHNSZWN0LmhlaWdodCgpKTsKKworICAgICAgICBCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6R3JhcGhpY3M6OmNsZWFyQnVmZmVyKHRhcmdldEJ1ZmZlciwgY2xlYXJSZWN0LAor
ICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yLnJlZCgpLCBiYWNrZ3JvdW5kQ29sb3IuZ3JlZW4o
KSwKKyAgICAgICAgICAgIGJhY2tncm91bmRDb2xvci5ibHVlKCksIGJhY2tncm91bmRDb2xvci5h
bHBoYSgpKTsKKyAgICB9CisKKyAgICBpZiAoY29udGVudHNTaXplLmlzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuOworCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorICAgIG1fd2Vi
UGFnZS0+ZC0+Y29tbWl0Um9vdExheWVySWZOZWVkZWQoKTsKKyNlbmRpZgorCisgICAgQmxhY2tC
ZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpEcmF3YWJsZSogYnVmZmVyRHJhd2FibGUgPQorICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmxvY2tCdWZmZXJEcmF3YWJsZSh0
YXJnZXRCdWZmZXIpOworCisgICAgUGxhdGZvcm1HcmFwaGljc0NvbnRleHQqIGJ1ZmZlclBsYXRm
b3JtR3JhcGhpY3NDb250ZXh0ID0gYnVmZmVyRHJhd2FibGUKKyAgICAgICAgPyBTdXJmYWNlUG9v
bDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+Y3JlYXRlUGxhdGZvcm1HcmFwaGljc0NvbnRleHQoYnVm
ZmVyRHJhd2FibGUpCisgICAgICAgIDogMDsKKyAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dCog
dGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQgPSBidWZmZXJQbGF0Zm9ybUdyYXBoaWNzQ29u
dGV4dAorICAgICAgICA/IGJ1ZmZlclBsYXRmb3JtR3JhcGhpY3NDb250ZXh0CisgICAgICAgIDog
U3VyZmFjZVBvb2w6Omdsb2JhbFN1cmZhY2VQb29sKCktPmxvY2tUaWxlUmVuZGVyaW5nU3VyZmFj
ZSgpOworCisgICAgQVNTRVJUKHRhcmdldFBsYXRmb3JtR3JhcGhpY3NDb250ZXh0KTsKKworICAg
IHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dCh0YXJnZXRQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dCk7CisKKyAgICAgICAgLy8gQmVsaWV2ZSBpdCBvciBub3QgdGhpcyBp
cyBpbXBvcnRhbnQgc2luY2UgdGhlIFdlYktpdCBTa2lhIGJhY2tlbmQKKyAgICAgICAgLy8gZG9l
c24ndCBzdG9yZSB0aGUgb3JpZ2luYWwgc3RhdGUgdW5sZXNzIHlvdSBjYWxsIHNhdmUgZmlyc3Qg
OlAKKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LnNhdmUoKTsKKworICAgICAgICAvLyBUcmFuc2xh
dGUgY29udGV4dCBhY2NvcmRpbmcgdG8gb2Zmc2V0LgorICAgICAgICBncmFwaGljc0NvbnRleHQu
dHJhbnNsYXRlKC1zdXJmYWNlT2Zmc2V0LngoKSwgLXN1cmZhY2VPZmZzZXQueSgpKTsKKworICAg
ICAgICAvLyBBZGQgb3VyIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyB0aGUgZ2xvYmFsIHRyYW5z
Zm9ybS4KKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGFmZmluZVRyYW5zZm9ybSgKKyAgICAgICAg
ICAgIG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+YSgpLAorICAgICAgICAg
ICAgbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLT5iKCksCisgICAgICAgICAg
ICBtX3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4KCktPmMoKSwKKyAgICAgICAgICAg
IG1fd2ViUGFnZS0+ZC0+dHJhbnNmb3JtYXRpb25NYXRyaXgoKS0+ZCgpLAorICAgICAgICAgICAg
bV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlvbk1hdHJpeCgpLT5lKCksCisgICAgICAgICAgICBt
X3dlYlBhZ2UtPmQtPnRyYW5zZm9ybWF0aW9uTWF0cml4KCktPmYoKSk7CisgICAgICAgIGdyYXBo
aWNzQ29udGV4dC5jb25jYXRDVE0oYWZmaW5lVHJhbnNmb3JtKTsKKworICAgICAgICAvLyBOb3cg
dGhhdCB0aGUgbWF0cml4IGlzIGFwcGxpZWQgd2UgbmVlZCB1bnRyYW5mb3JtZWQgY29udGVudHMg
Y29vcmRpbmF0ZXMuCisgICAgICAgIFBsYXRmb3JtOjpJbnRSZWN0IHVudHJhbnNmb3JtZWRDb250
ZW50c1JlY3QgPSBtX3dlYlBhZ2UtPmQtPm1hcEZyb21UcmFuc2Zvcm1lZChjb250ZW50c1JlY3Qp
OworCisgICAgICAgIC8vIFdlIGV4dHJhY3QgZnJvbSB0aGUgY29udGVudHNSZWN0IGJ1dCBkcmF3
IGEgc2xpZ2h0bHkgbGFyZ2VyIHJlZ2lvbiB0aGFuCisgICAgICAgIC8vIHdlIHdlcmUgdG9sZCB0
bywgaW4gb3JkZXIgdG8gYXZvaWQgcGl4ZWxzIGJlaW5nIHJlbmRlcmVkIG9ubHkgcGFydGlhbGx5
LgorICAgICAgICBjb25zdCBpbnQgYXRMZWFzdE9uZURldmljZVBpeGVsID0KKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PGludD4oY2VpbGYoMS4wIC8gbV93ZWJQYWdlLT5kLT50cmFuc2Zvcm1hdGlv
bk1hdHJpeCgpLT5hKCkpKTsKKyAgICAgICAgdW50cmFuc2Zvcm1lZENvbnRlbnRzUmVjdC5pbmZs
YXRlKGF0TGVhc3RPbmVEZXZpY2VQaXhlbCwgYXRMZWFzdE9uZURldmljZVBpeGVsKTsKKworICAg
ICAgICAvLyBNYWtlIHN1cmUgdGhlIHVudHJhbnNmb3JtZWQgcmVjdGFuZ2xlIGZvciB0aGUgKHNs
aWdodGx5IGxhcmdlciB0aGFuCisgICAgICAgIC8vIGluaXRpYWxseSByZXF1ZXN0ZWQpIHJlcGFp
bnRlZCByZWdpb24gaXMgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHBhZ2UuCisgICAgICAgIHVu
dHJhbnNmb3JtZWRDb250ZW50c1JlY3QuaW50ZXJzZWN0KFBsYXRmb3JtOjpJbnRSZWN0KFBsYXRm
b3JtOjpJbnRQb2ludCgwLCAwKSwgY29udGVudHNTaXplKSk7CisKKyAgICAgICAgLy8gU29tZSBX
ZWJLaXQgcGFpbnRpbmcgYmFja2VuZHMgKmNvdWdoKiBTa2lhICpjb3VnaCogZG9uJ3Qgc2V0IHRo
aXMgYXV0b21hdGljYWxseQorICAgICAgICAvLyB0byB0aGUgZGlydHlSZWN0IHNvIGRvIHNvIGhl
cmUgZXhwbGljaXRseS4KKyAgICAgICAgZ3JhcGhpY3NDb250ZXh0LmNsaXAodW50cmFuc2Zvcm1l
ZENvbnRlbnRzUmVjdCk7CisKKyAgICAgICAgLy8gVGFrZSBjYXJlIG9mIHBvc3NpYmxlIGxlZnQg
b3ZlcmZsb3cgb24gUlRMIHBhZ2UuCisgICAgICAgIGlmIChpbnQgbGVmdE92ZXJGbG93ID0gbV9j
bGllbnQtPmZyYW1lKCktPnZpZXcoKS0+bWluaW11bVNjcm9sbFBvc2l0aW9uKCkueCgpKSB7Cisg
ICAgICAgICAgICB1bnRyYW5zZm9ybWVkQ29udGVudHNSZWN0Lm1vdmUobGVmdE92ZXJGbG93LCAw
KTsKKyAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC50cmFuc2xhdGUoLWxlZnRPdmVyRmxvdywg
MCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBMZXQgV2ViQ29yZSByZW5kZXIgdGhlIHBhZ2Ug
Y29udGVudHMgaW50byB0aGUgZHJhd2luZyBzdXJmYWNlLgorICAgICAgICBtX2NsaWVudC0+ZnJh
bWUoKS0+dmlldygpLT5wYWludENvbnRlbnRzKCZncmFwaGljc0NvbnRleHQsIHVudHJhbnNmb3Jt
ZWRDb250ZW50c1JlY3QpOworCisjaWYgRU5BQkxFKElOU1BFQ1RPUikKKyAgICAgICAgaWYgKG1f
d2ViUGFnZS0+ZC0+bV9wYWdlLT5pbnNwZWN0b3JDb250cm9sbGVyKCktPmVuYWJsZWQoKSkgewor
ICAgICAgICAgICAgV2ViQ29yZTo6SW50UG9pbnQgc2Nyb2xsUG9zaXRpb24gPSBtX2NsaWVudC0+
ZnJhbWUoKS0+dmlldygpLT5zY3JvbGxQb3NpdGlvbigpOworICAgICAgICAgICAgZ3JhcGhpY3ND
b250ZXh0LnRyYW5zbGF0ZShzY3JvbGxQb3NpdGlvbi54KCksIHNjcm9sbFBvc2l0aW9uLnkoKSk7
CisgICAgICAgICAgICBtX3dlYlBhZ2UtPmQtPm1fcGFnZS0+aW5zcGVjdG9yQ29udHJvbGxlcigp
LT5kcmF3Tm9kZUhpZ2hsaWdodChncmFwaGljc0NvbnRleHQpOworICAgICAgICB9CisjZW5kaWYK
KworICAgICAgICBncmFwaGljc0NvbnRleHQucmVzdG9yZSgpOworICAgIH0KKworICAgIC8vIEdy
YWIgdGhlIHJlcXVlc3RlZCByZWdpb24gZnJvbSB0aGUgZHJhd2luZyBzdXJmYWNlIGludG8gdGhl
IHRpbGUgaW1hZ2UuCisjaWYgVVNFKE9QRU5WRykKKyAgICBzdXJmYWNlLT5tYWtlQ3VycmVudCgp
OworI2VuZGlmCisKKyAgICBkZWxldGUgYnVmZmVyUGxhdGZvcm1HcmFwaGljc0NvbnRleHQ7CisK
KyAgICBpZiAoYnVmZmVyRHJhd2FibGUpCisgICAgICAgIHJlbGVhc2VCdWZmZXJEcmF3YWJsZSh0
YXJnZXRCdWZmZXIpOworICAgIGVsc2UgeworICAgICAgICBjb25zdCBQbGF0Zm9ybTo6SW50UG9p
bnQgZHN0UG9pbnQoY29udGVudHNSZWN0LngoKSAtIHN1cmZhY2VPZmZzZXQueCgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudHNSZWN0LnkoKSAtIHN1
cmZhY2VPZmZzZXQueSgpKTsKKyAgICAgICAgY29uc3QgUGxhdGZvcm06OkludFJlY3QgZHN0UmVj
dChkc3RQb2ludCwgY29udGVudHNSZWN0LnNpemUoKSk7CisgICAgICAgIGNvbnN0IFBsYXRmb3Jt
OjpJbnRSZWN0IHNyY1JlY3QgPSBkc3RSZWN0OworCisgICAgICAgIC8vIElmIHdlIGNvdWxkbid0
IGRpcmVjdGx5IGRyYXcgdG8gdGhlIGJ1ZmZlciwgY29weSBmcm9tIHRoZSBkcmF3aW5nIHN1cmZh
Y2UuCisgICAgICAgIFN1cmZhY2VQb29sOjpnbG9iYWxTdXJmYWNlUG9vbCgpLT5yZWxlYXNlVGls
ZVJlbmRlcmluZ1N1cmZhY2UodGFyZ2V0UGxhdGZvcm1HcmFwaGljc0NvbnRleHQpOworICAgICAg
ICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmJsaXRUb0J1ZmZlcih0YXJnZXRCdWZm
ZXIsIGRzdFJlY3QsIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6ZHJhd2luZ1N1cmZh
Y2UoKSwgc3JjUmVjdCk7CisgICAgfQorfQorCisjaWYgREVCVUdfRkFUX0ZJTkdFUlMKK3N0YXRp
YyB2b2lkIGRyYXdEZWJ1Z1JlY3QoQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNzOjpCdWZm
ZXIqIGRzdEJ1ZmZlciwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LCB1bnNpZ25lZCBjaGFyIHJlZCwgdW5zaWduZWQgY2hh
ciBncmVlbiwgdW5zaWduZWQgY2hhciBibHVlKQoreworICAgIFBsYXRmb3JtOjpJbnRSZWN0IGRy
YXdSZWN0KHNyY1JlY3QpOworICAgIGRyYXdSZWN0LmludGVyc2VjdChkc3RSZWN0KTsKKyAgICBp
ZiAoIWRyYXdSZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpjbGVhckJ1ZmZlcihkc3RCdWZmZXIsIGRyYXdSZWN0LCByZWQsIGdyZWVuLCBibHVl
LCAxMjgpOworfQorI2VuZGlmCisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0ZTo6YmxpdFRvV2lu
ZG93KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBkc3RSZWN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBoaWNz
OjpCdWZmZXIqIHNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCBibGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZ2xvYmFsQWxwaGEpCit7CisgICAgQVNTRVJU
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgp
LT5pc0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgICB3aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNs
ZWFyQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsKKyAgICB3aW5kb3dCYWNrQnVmZmVyU3RhdGUoKS0+
YWRkQmxpdHRlZFJlZ2lvbihkc3RSZWN0KTsKKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpH
cmFwaGljczo6QnVmZmVyKiBkc3RCdWZmZXIgPSBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3co
KS0+YnVmZmVyKCk7CisgICAgQVNTRVJUKGRzdEJ1ZmZlcik7CisgICAgQVNTRVJUKHNyY0J1ZmZl
cik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAgICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjps
b2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsV2FybiwgIkVtcHR5IHdpbmRvdyBidWZm
ZXIsIGNvdWxkbid0IGJsaXRUb1dpbmRvdyIpOworCisgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06
OkdyYXBoaWNzOjpCbGVuZE1vZGUgYmxlbmRNb2RlID0gYmxlbmQKKyAgICAgICAgPyBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNvdXJjZU92ZXIKKyAgICAgICAgOiBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OlNvdXJjZUNvcHk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0
Zm9ybTo6R3JhcGhpY3M6OmJsaXRUb0J1ZmZlcihkc3RCdWZmZXIsIGRzdFJlY3QsIHNyY0J1ZmZl
ciwgc3JjUmVjdCwgYmxlbmRNb2RlLCBnbG9iYWxBbHBoYSk7CisKKyNpZiBERUJVR19GQVRfRklO
R0VSUworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVyLCBkc3RSZWN0LCBGYXRGaW5nZXJzOjpt
X2RlYnVnRmF0RmluZ2VyUmVjdCwgMjEwLCAyMTAsIDI1MCk7CisgICAgZHJhd0RlYnVnUmVjdChk
c3RCdWZmZXIsIGRzdFJlY3QsIFBsYXRmb3JtOjpJbnRSZWN0KEZhdEZpbmdlcnM6Om1fZGVidWdG
YXRGaW5nZXJDbGlja1Bvc2l0aW9uLCBQbGF0Zm9ybTo6SW50U2l6ZSgzLCAzKSksIDAsIDAsIDAp
OworICAgIGRyYXdEZWJ1Z1JlY3QoZHN0QnVmZmVyLCBkc3RSZWN0LCBQbGF0Zm9ybTo6SW50UmVj
dChGYXRGaW5nZXJzOjptX2RlYnVnRmF0RmluZ2VyQWRqdXN0ZWRQb3NpdGlvbiwgUGxhdGZvcm06
OkludFNpemUoNSwgNSkpLCAxMDAsIDEwMCwgMTAwKTsKKyNlbmRpZgorCit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2hlY2tlcldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYg
ZHN0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQ
bGF0Zm9ybTo6SW50UG9pbnQmIGNvbnRlbnRzT3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb250ZW50c1NjYWxlKQoreworICAgIEFTU0VSVChC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+
aXNDdXJyZW50VGhyZWFkKCkpOworCisgICAgd2luZG93RnJvbnRCdWZmZXJTdGF0ZSgpLT5jbGVh
ckJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisgICAgd2luZG93QmFja0J1ZmZlclN0YXRlKCktPmFk
ZEJsaXR0ZWRSZWdpb24oZHN0UmVjdCk7CisKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3Jh
cGhpY3M6OkJ1ZmZlciogZHN0QnVmZmVyID0gbV93ZWJQYWdlLT5jbGllbnQoKS0+d2luZG93KCkt
PmJ1ZmZlcigpOworICAgIEFTU0VSVChkc3RCdWZmZXIpOworICAgIGlmICghZHN0QnVmZmVyKQor
ICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbFdhcm4sICJFbXB0eSB3aW5kb3cgYnVmZmVyLCBjb3VsZG4ndCBjaGVja2VyV2luZG93
Iik7CisKKyAgICBDb2xvciBjb2xvcihtX3dlYlBhZ2UtPnNldHRpbmdzKCktPmJhY2tncm91bmRD
b2xvcigpKTsKKyAgICB1bnNpZ25lZCBjaGFyIGFscGhhID0gY29sb3IuYWxwaGEoKTsKKyAgICBC
bGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmNoZWNrZXJCdWZmZXIoZHN0QnVmZmVyLCBk
c3RSZWN0LCBjb250ZW50c09yaWdpbiwgY29udGVudHNTY2FsZSwgYWxwaGEpOworfQorCit2b2lk
IEJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3coKQoreworICAgIC8vIEdyYWIg
YSByZWN0IGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgaWYgKEJsYWNr
QmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5pc0N1
cnJlbnRUaHJlYWQoKSkKKyAgICAgICAgaW52YWxpZGF0ZVdpbmRvdyhtX3dlYlBhZ2UtPmNsaWVu
dCgpLT51c2VySW50ZXJmYWNlQmxpdHRlZERlc3RpbmF0aW9uUmVjdCgpKTsKKyAgICBlbHNlCisg
ICAgICAgIGludmFsaWRhdGVXaW5kb3coUGxhdGZvcm06OkludFJlY3QoUGxhdGZvcm06OkludFBv
aW50KDAsIDApLCBtX2NsaWVudC0+dHJhbnNmb3JtZWRWaWV3cG9ydFNpemUoKSkpOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZVByaXZhdGU6OmludmFsaWRhdGVXaW5kb3coY29uc3QgUGxhdGZvcm06
OkludFJlY3QmIGRzdCkKK3sKKyAgICBpZiAoZHN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1l
c3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkgJiYgIXNob3VsZERpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkpIHsKKyAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBiZSBzeW5jIGluIG9yZGVy
IHRvIHN3YXAgdGhlIHJlY2VudGx5IGRyYXduIHRoaW5nLi4uCisgICAgICAgIC8vIFRoaXMgd2ls
bCBvbmx5IGJlIGNhbGxlZCBmcm9tIFdlYktpdCB0aHJlYWQgZHVyaW5nIGRpcmVjdCByZW5kZXJp
bmcuCisgICAgICAgIHR5cGVkZWYgdm9pZCAoQmxhY2tCZXJyeTo6V2ViS2l0OjpCYWNraW5nU3Rv
cmVQcml2YXRlOjoqRnVuY3Rpb25UeXBlKShjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpOworICAg
ICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGll
bnQoKS0+ZGlzcGF0Y2hTeW5jTWVzc2FnZSgKKyAgICAgICAgICAgIEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpjcmVhdGVNZXRob2RDYWxsTWVzc2FnZTxGdW5jdGlvblR5cGUsIEJhY2tpbmdTdG9yZVBy
aXZhdGUsIFBsYXRmb3JtOjpJbnRSZWN0PigKKyAgICAgICAgICAgICAgICAmQmFja2luZ1N0b3Jl
UHJpdmF0ZTo6aW52YWxpZGF0ZVdpbmRvdywgdGhpcywgZHN0KSk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyNpZiBERUJVR19CQUNLSU5HU1RPUkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9y
bTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpMb2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0
b3JlUHJpdmF0ZTo6aW52YWxpZGF0ZVdpbmRvdyBkc3QgPSAlcyIsIGRzdC50b1N0cmluZygpLnV0
ZjgoKS5kYXRhKCkpOworI2VuZGlmCisKKyAgICAvLyBTaW5jZSBvdXIgd2luZG93IG1heSBhbHNv
IGJlIGRvdWJsZSBidWZmZXJlZCwgd2UgbmVlZCB0byBhbHNvIGNvcHkgdGhlCisgICAgLy8gZnJv
bnQgYnVmZmVyJ3MgY29udGVudHMgdG8gdGhlIGJhY2sgYnVmZmVyIGJlZm9yZSB3ZSBzd2FwIHRo
ZW0uIEl0IGlzCisgICAgLy8gYW5hbG9nb3VzIHRvIHdoYXQgd2UgZG8gd2l0aCBvdXIgZG91Ymxl
IGJ1ZmZlcmVkIHRpbGVzIGJ5IGNhbGxpbmcKKyAgICAvLyBjb3B5UHJldmlvdXNDb250ZW50c1Rv
QmFja2luZ1N1cmZhY2VPZlRpbGUoKS4gSXQgb25seSBhZmZlY3RzIHBhcnRpYWwKKyAgICAvLyBz
Y3JlZW4gdXBkYXRlcyBzaW5jZSB3aGVuIHdlIGFyZSBzY3JvbGxpbmcgb3Igem9vbWluZywgdGhl
IHdob2xlIHdpbmRvdworICAgIC8vIGlzIGludmFsaWRhdGVkIGFueXdheXMgYW5kIG5vIGNvcHlp
bmcgaXMgbmVlZGVkLgorICAgIGNvcHlQcmV2aW91c0NvbnRlbnRzVG9CYWNrU3VyZmFjZU9mV2lu
ZG93KCk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkc3RSZWN0ID0gZHN0OworCisgICAgUGxh
dGZvcm06OkludFJlY3Qgdmlld3BvcnRSZWN0KFBsYXRmb3JtOjpJbnRQb2ludCgwLCAwKSwgbV9j
bGllbnQtPnRyYW5zZm9ybWVkVmlld3BvcnRTaXplKCkpOworICAgIGRzdFJlY3QuaW50ZXJzZWN0
KHZpZXdwb3J0UmVjdCk7CisKKyAgICBpZiAoZHN0UmVjdC53aWR0aCgpIDw9IDAgfHwgZHN0UmVj
dC5oZWlnaHQoKSA8PSAwKQorICAgICAgICByZXR1cm47CisKKyNpZiBERUJVR19CQUNLSU5HU1RP
UkUKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6bG9nKEJsYWNrQmVycnk6OlBsYXRmb3JtOjpM
b2dMZXZlbENyaXRpY2FsLCAiQmFja2luZ1N0b3JlUHJpdmF0ZTo6aW52YWxpZGF0ZVdpbmRvdyBw
b3N0aW5nID0gJXMiLCBkc3RSZWN0LnRvU3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisjZW5kaWYK
KworICAgIG1fY3VycmVudFdpbmRvd0JhY2tCdWZmZXIgPSAobV9jdXJyZW50V2luZG93QmFja0J1
ZmZlciArIDEpICUgMjsKKyAgICBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+cG9zdChk
c3RSZWN0KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhcldpbmRvdygpCit7
CisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3Nh
Z2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkgJiYgIXNob3VsZERpcmVjdFJlbmRlcmluZ1Rv
V2luZG93KCkpIHsKKyAgICAgICAgdHlwZWRlZiB2b2lkIChCbGFja0JlcnJ5OjpXZWJLaXQ6OkJh
Y2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUpKCk7CisgICAgICAgIEJsYWNrQmVycnk6
OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgpLT5kaXNwYXRjaE1l
c3NhZ2UoCisgICAgICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6Y3JlYXRlTWV0aG9kQ2Fs
bE1lc3NhZ2U8RnVuY3Rpb25UeXBlLCBCYWNraW5nU3RvcmVQcml2YXRlPigKKyAgICAgICAgICAg
ICAgICAmQmFja2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3csIHRoaXMpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVm
ZmVyKiBkc3RCdWZmZXIgPSBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+YnVmZmVyKCk7
CisgICAgQVNTRVJUKGRzdEJ1ZmZlcik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAgICAgIEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsV2Fy
biwgIkVtcHR5IHdpbmRvdyBidWZmZXIsIGNvdWxkbid0IGNsZWFyV2luZG93Iik7CisKKyAgICB3
aW5kb3dGcm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbigpOworICAgIHdpbmRv
d0JhY2tCdWZmZXJTdGF0ZSgpLT5hZGRCbGl0dGVkUmVnaW9uKFBsYXRmb3JtOjpJbnRSZWN0KAor
ICAgICAgICBQbGF0Zm9ybTo6SW50UG9pbnQoMCwgMCksIG1fd2ViUGFnZS0+Y2xpZW50KCktPndp
bmRvdygpLT5zdXJmYWNlU2l6ZSgpKSk7CisKKyAgICBDb2xvciBjb2xvcihtX3dlYlBhZ2UtPnNl
dHRpbmdzKCktPmJhY2tncm91bmRDb2xvcigpKTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
R3JhcGhpY3M6OmNsZWFyQnVmZmVyKGRzdEJ1ZmZlciwKKyAgICAgICAgY29sb3IucmVkKCksIGNv
bG9yLmdyZWVuKCksIGNvbG9yLmJsdWUoKSwgY29sb3IuYWxwaGEoKSk7Cit9CisKK3ZvaWQgQmFj
a2luZ1N0b3JlUHJpdmF0ZTo6Y2xlYXJXaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3QmIHJl
Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIg
cmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFy
IGdyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBj
aGFyIGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXIgYWxwaGEpCit7CisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVy
ZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkgJiYgIXNob3VsZERp
cmVjdFJlbmRlcmluZ1RvV2luZG93KCkpIHsKKyAgICAgICAgdHlwZWRlZiB2b2lkIChCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkJhY2tpbmdTdG9yZVByaXZhdGU6OipGdW5jdGlvblR5cGUpKGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQg
Y2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIpOworICAgICAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+ZGlzcGF0
Y2hNZXNzYWdlKAorICAgICAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmNyZWF0ZU1ldGhv
ZENhbGxNZXNzYWdlPEZ1bmN0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNraW5nU3RvcmVQcml2YXRlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXRmb3JtOjpJ
bnRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIHVuc2lnbmVkIGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVk
IGNoYXI+KAorICAgICAgICAgICAgICAgICZCYWNraW5nU3RvcmVQcml2YXRlOjpjbGVhcldpbmRv
dywgdGhpcywgcmVjdCwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBk
c3RCdWZmZXIgPSBtX3dlYlBhZ2UtPmNsaWVudCgpLT53aW5kb3coKS0+YnVmZmVyKCk7CisgICAg
QVNTRVJUKGRzdEJ1ZmZlcik7CisgICAgaWYgKCFkc3RCdWZmZXIpCisgICAgICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpsb2coQmxhY2tCZXJyeTo6UGxhdGZvcm06OkxvZ0xldmVsV2FybiwgIkVt
cHR5IHdpbmRvdyBidWZmZXIsIGNvdWxkbid0IGNsZWFyV2luZG93Iik7CisKKyAgICB3aW5kb3dG
cm9udEJ1ZmZlclN0YXRlKCktPmNsZWFyQmxpdHRlZFJlZ2lvbihyZWN0KTsKKyAgICB3aW5kb3dC
YWNrQnVmZmVyU3RhdGUoKS0+YWRkQmxpdHRlZFJlZ2lvbihyZWN0KTsKKworICAgIEJsYWNrQmVy
cnk6OlBsYXRmb3JtOjpHcmFwaGljczo6Y2xlYXJCdWZmZXIoZHN0QnVmZmVyLCByZWN0LCByZWQs
IGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6aXNT
Y3JvbGxpbmdPclpvb21pbmcoKSBjb25zdAoreworICAgIEJhY2tpbmdTdG9yZU11dGV4TG9ja2Vy
IGxvY2tlcihjb25zdF9jYXN0PEJhY2tpbmdTdG9yZVByaXZhdGUqPih0aGlzKSk7CisgICAgcmV0
dXJuIG1faXNTY3JvbGxpbmdPclpvb21pbmc7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6c2V0U2Nyb2xsaW5nT3Jab29taW5nKGJvb2wgc2Nyb2xsaW5nT3Jab29taW5nLCBib29sIHNo
b3VsZEJsaXQpCit7CisgICAgeworICAgICAgICBCYWNraW5nU3RvcmVNdXRleExvY2tlciBsb2Nr
ZXIodGhpcyk7CisgICAgICAgIG1faXNTY3JvbGxpbmdPclpvb21pbmcgPSBzY3JvbGxpbmdPclpv
b21pbmc7CisgICAgfQorCisjaWYgIUVOQUJMRV9SRVBBSU5UT05TQ1JPTEwKKyAgICBtX3N1c3Bl
bmRSZW5kZXJKb2JzID0gc2Nyb2xsaW5nT3Jab29taW5nOyAvLyBTdXNwZW5kIHRoZSByZW5kZXJp
bmcgb2YgZXZlcnl0aGluZy4KKyNlbmRpZgorCisgICAgaWYgKCFtX3dlYlBhZ2UtPnNldHRpbmdz
KCktPnNob3VsZFJlbmRlckFuaW1hdGlvbnNPblNjcm9sbE9yWm9vbSgpKQorICAgICAgICBtX3N1
c3BlbmRSZWd1bGFyUmVuZGVySm9icyA9IHNjcm9sbGluZ09yWm9vbWluZzsgLy8gU3VzcGVuZCB0
aGUgcmVuZGVyaW5nIG9mIGFuaW1hdGlvbnMuCisKKyAgICAvLyBDbGVhciB0aGlzIGZsYWcgc2lu
Y2Ugd2UgZG9uJ3QgY2FyZSBpZiB0aGUgcmVuZGVyIHF1ZXVlIGlzIHVuZGVyIHByZXNzdXJlCisg
ICAgLy8gb3Igbm90IHNpbmNlIHdlIGFyZSBzY3JvbGxpbmcgYW5kIGl0IGlzIG1vcmUgaW1wb3J0
YW50IHRvIG5vdCBsYWcgdGhhbgorICAgIC8vIGl0IGlzIHRvIGVuc3VyZSBhbmltYXRpb25zIGFj
aGlldmUgYmV0dGVyIGZyYW1lcmF0ZXMhCisgICAgaWYgKHNjcm9sbGluZ09yWm9vbWluZykKKyAg
ICAgICAgbV9yZW5kZXJRdWV1ZS0+c2V0Q3VycmVudFJlZ3VsYXJSZW5kZXJKb2JCYXRjaFVuZGVy
UHJlc3N1cmUoZmFsc2UpOworI2lmIEVOQUJMRV9TQ1JPTExCQVJTCisgICAgZWxzZSBpZiAoc2hv
dWxkQmxpdCAmJiAhc2hvdWxkRGlyZWN0UmVuZGVyaW5nVG9XaW5kb3coKSkKKyAgICAgICAgYmxp
dFZpc2libGVDb250ZW50cygpOworI2VuZGlmCit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6bG9ja0JhY2tpbmdTdG9yZSgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtX211dGV4
KTsKK30KKwordm9pZCBCYWNraW5nU3RvcmVQcml2YXRlOjp1bmxvY2tCYWNraW5nU3RvcmUoKQor
eworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX211dGV4KTsKK30KKworQmFja2luZ1N0b3Jl
R2VvbWV0cnkqIEJhY2tpbmdTdG9yZVByaXZhdGU6OmZyb250U3RhdGUoKSBjb25zdAoreworICAg
IHJldHVybiByZWludGVycHJldF9jYXN0PEJhY2tpbmdTdG9yZUdlb21ldHJ5Kj4obV9mcm9udFN0
YXRlKTsKK30KKworQmFja2luZ1N0b3JlR2VvbWV0cnkqIEJhY2tpbmdTdG9yZVByaXZhdGU6OmJh
Y2tTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QmFja2luZ1N0
b3JlR2VvbWV0cnkqPihtX2JhY2tTdGF0ZSk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlUHJpdmF0
ZTo6c3dhcFN0YXRlKCkKK3sKKyAgICB1bnNpZ25lZCBmcm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
dW5zaWduZWQ+KGZyb250U3RhdGUoKSk7CisgICAgdW5zaWduZWQgYmFjayA9IHJlaW50ZXJwcmV0
X2Nhc3Q8dW5zaWduZWQ+KGJhY2tTdGF0ZSgpKTsKKworICAgIC8vIEF0b21pYyBjaGFuZ2UuCisg
ICAgX3NtcF94Y2hnKCZtX2Zyb250U3RhdGUsIGJhY2spOworICAgIF9zbXBfeGNoZygmbV9iYWNr
U3RhdGUsIGZyb250KTsKKyAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNlckludGVyZmFjZVRo
cmVhZE1lc3NhZ2VDbGllbnQoKS0+c3luY1RvQ3VycmVudE1lc3NhZ2UoKTsKK30KKworQmFja2lu
Z1N0b3JlV2luZG93QnVmZmVyU3RhdGUqIEJhY2tpbmdTdG9yZVByaXZhdGU6OndpbmRvd0Zyb250
QnVmZmVyU3RhdGUoKSBjb25zdAoreworICAgIHJldHVybiAmbV93aW5kb3dCdWZmZXJTdGF0ZVso
bV9jdXJyZW50V2luZG93QmFja0J1ZmZlciArIDEpICUgMl07Cit9CisKK0JhY2tpbmdTdG9yZVdp
bmRvd0J1ZmZlclN0YXRlKiBCYWNraW5nU3RvcmVQcml2YXRlOjp3aW5kb3dCYWNrQnVmZmVyU3Rh
dGUoKSBjb25zdAoreworICAgIHJldHVybiAmbV93aW5kb3dCdWZmZXJTdGF0ZVttX2N1cnJlbnRX
aW5kb3dCYWNrQnVmZmVyXTsKK30KKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
K2Jvb2wgQmFja2luZ1N0b3JlUHJpdmF0ZTo6ZHJhd1N1YkxheWVycygpCit7CisgICAgQVNTRVJU
KEJsYWNrQmVycnk6OlBsYXRmb3JtOjp1c2VySW50ZXJmYWNlVGhyZWFkTWVzc2FnZUNsaWVudCgp
LT5pc0N1cnJlbnRUaHJlYWQoKSk7CisgICAgaWYgKCFCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6dXNl
ckludGVyZmFjZVRocmVhZE1lc3NhZ2VDbGllbnQoKS0+aXNDdXJyZW50VGhyZWFkKCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtX3N1c3BlbmRCYWNraW5nU3RvcmVVcGRhdGVz
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBkc3QgPSBt
X3dlYlBhZ2UtPmNsaWVudCgpLT51c2VySW50ZXJmYWNlQmxpdHRlZERlc3RpbmF0aW9uUmVjdCgp
OworICAgIGlmIChkc3QuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBQ
bGF0Zm9ybTo6SW50UmVjdCBzcmMgPSBtX3dlYlBhZ2UtPmNsaWVudCgpLT51c2VySW50ZXJmYWNl
QmxpdHRlZFZpc2libGVDb250ZW50c1JlY3QoKTsKKyAgICBXZWJDb3JlOjpGbG9hdFJlY3QgY29u
dGVudHNSZWN0ID0gbV93ZWJQYWdlLT5kLT5tYXBGcm9tVHJhbnNmb3JtZWRGbG9hdFJlY3QoCisg
ICAgICAgIFdlYkNvcmU6OkZsb2F0UmVjdChXZWJDb3JlOjpJbnRSZWN0KHNyYykpKTsKKyAgICBy
ZXR1cm4gbV93ZWJQYWdlLT5kLT5kcmF3U3ViTGF5ZXJzKGRzdCwgY29udGVudHNSZWN0KTsKK30K
KyNlbmRpZgorCitib29sIEJhY2tpbmdTdG9yZVByaXZhdGU6OmlzQWN0aXZlKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gQmFja2luZ1N0b3JlUHJpdmF0ZTo6c19jdXJyZW50QmFja2luZ1N0b3JlT3du
ZXIgPT0gbV93ZWJQYWdlICYmICFTdXJmYWNlUG9vbDo6Z2xvYmFsU3VyZmFjZVBvb2woKS0+aXNF
bXB0eSgpOworfQorCitCYWNraW5nU3RvcmU6OkJhY2tpbmdTdG9yZShXZWJQYWdlKiB3ZWJQYWdl
LCBCYWNraW5nU3RvcmVDbGllbnQqIGNsaWVudCkKKyAgICA6IGQobmV3IEJhY2tpbmdTdG9yZVBy
aXZhdGUpCit7CisgICAgZC0+bV93ZWJQYWdlID0gd2ViUGFnZTsKKyAgICBkLT5tX2NsaWVudCA9
IGNsaWVudDsKK30KKworQmFja2luZ1N0b3JlOjp+QmFja2luZ1N0b3JlKCkKK3sKKyAgICBkZWxl
dGUgZDsKKyAgICBkID0gMDsKK30KKwordm9pZCBCYWNraW5nU3RvcmU6OmNyZWF0ZVN1cmZhY2Uo
KQoreworICAgIHN0YXRpYyBib29sIGluaXRpYWxpemVkID0gZmFsc2U7CisgICAgaWYgKCFpbml0
aWFsaXplZCkgeworICAgICAgICBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6R3JhcGhpY3M6OmluaXRp
YWxpemUoKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworI2lmIFVTRShP
UEVOVkcpCisgICAgZC0+bV9lZ2xEaXNwbGF5ID0gQmxhY2tCZXJyeTo6UGxhdGZvcm06OkdyYXBo
aWNzOjplZ2xEaXNwbGF5KCk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHVzaW5nIE9wZW5W
Ry4KKyAgICBlZ2xCaW5kQVBJKEVHTF9PUEVOVkdfQVBJKTsKKyAgICBBU1NFUlRfRUdMX05PX0VS
Uk9SKCk7CisKKyAgICBFR0xEaXNwbGF5T3BlblZHOjpzZXRDdXJyZW50RGlzcGxheShkLT5tX2Vn
bERpc3BsYXkpOworI2VuZGlmCisKKyAgICAvLyBUcmlnZ2VycyBjcmVhdGlvbiBvZiBzdXJmYWNl
cyBpbiBiYWNraW5nc3RvcmUuCisgICAgZC0+Y3JlYXRlU3VyZmFjZXMoKTsKKworI2lmIFVTRShP
UEVOVkcpCisgICAgRUdMRGlzcGxheU9wZW5WRzo6Y3VycmVudCgpLT5zaGFyZWRQbGF0Zm9ybVN1
cmZhY2UoKS0+bWFrZUN1cnJlbnQoKTsKKyNlbmRpZgorCisgICAgLy8gRm9jdXNpbmcgdGhlIFdl
YlBhZ2UgdHJpZ2dlcnMgYSByZXBhaW50LCBzbyB3aGlsZSB3ZSB3YW50IGl0IHRvIGJlCisgICAg
Ly8gZm9jdXNlZCBpbml0aWFsbHkgdGhpcyBoYXMgdG8gaGFwcGVuIGFmdGVyIGNyZWF0aW9uIG9m
IHRoZSBzdXJmYWNlLgorICAgIGQtPm1fd2ViUGFnZS0+c2V0Rm9jdXNlZCh0cnVlKTsKK30KKwor
dm9pZCBCYWNraW5nU3RvcmU6OnN1c3BlbmRTY3JlZW5BbmRCYWNraW5nU3RvcmVVcGRhdGVzKCkK
K3sKKyAgICBkLT5zdXNwZW5kU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcygpOworfQorCit2
b2lkIEJhY2tpbmdTdG9yZTo6cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0b3JlVXBkYXRlcyhSZXN1
bWVVcGRhdGVPcGVyYXRpb24gb3ApCit7CisgICAgZC0+cmVzdW1lU2NyZWVuQW5kQmFja2luZ1N0
b3JlVXBkYXRlcyhvcCk7Cit9CisKK2Jvb2wgQmFja2luZ1N0b3JlOjppc1Njcm9sbGluZ09yWm9v
bWluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPmlzU2Nyb2xsaW5nT3Jab29taW5nKCk7Cit9
CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpzZXRTY3JvbGxpbmdPclpvb21pbmcoYm9vbCBzY3JvbGxp
bmdPclpvb21pbmcpCit7CisgICAgZC0+c2V0U2Nyb2xsaW5nT3Jab29taW5nKHNjcm9sbGluZ09y
Wm9vbWluZyk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpibGl0Q29udGVudHMoY29uc3QgQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEJsYWNrQmVycnk6OlBs
YXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cykKK3sKKyAgICAvLyBCbGl0dGluZyBkdXJpbmcgZGly
ZWN0IHJlbmRlcmluZyBpcyBub3Qgc3VwcG9ydGVkLgorICAgIGlmIChpc0RpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkpIHsKKyAgICAgICAgQmxhY2tCZXJyeTo6UGxhdGZvcm06OmxvZyhCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TG9nTGV2ZWxDcml0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiQmFja2luZ1N0b3JlOjpibGl0Q29udGVudHMgb3BlcmF0aW9uIG5vdCBzdXBwb3J0
ZWQgaW4gZGlyZWN0IHJlbmRlcmluZyBtb2RlIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisK
KyAgICBkLT5ibGl0Q29udGVudHMoZHN0UmVjdCwgY29udGVudHMpOworfQorCit2b2lkIEJhY2tp
bmdTdG9yZTo6cmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY29udGVudENoYW5nZWQsIGJvb2wgaW1tZWRp
YXRlKQoreworICAgIGQtPnJlcGFpbnQoUGxhdGZvcm06OkludFJlY3QoeCwgeSwgd2lkdGgsIGhl
aWdodCksIGNvbnRlbnRDaGFuZ2VkLCBpbW1lZGlhdGUpOworfQorCitib29sIEJhY2tpbmdTdG9y
ZTo6aGFzUmVuZGVySm9icygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGQtPnNob3VsZFBlcmZvcm1S
ZW5kZXJKb2JzKCk7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpyZW5kZXJPbklkbGUoKQorewor
ICAgIGQtPnJlbmRlck9uSWRsZSgpOworfQorCitib29sIEJhY2tpbmdTdG9yZTo6aXNEaXJlY3RS
ZW5kZXJpbmdUb1dpbmRvdygpIGNvbnN0Cit7CisgICAgQmFja2luZ1N0b3JlTXV0ZXhMb2NrZXIg
bG9ja2VyKGQpOworICAgIHJldHVybiBkLT5zaG91bGREaXJlY3RSZW5kZXJpbmdUb1dpbmRvdygp
OworfQorCitib29sIEJhY2tpbmdTdG9yZTo6ZGVmZXJzQmxpdCgpIGNvbnN0Cit7CisgICAgICAg
IHJldHVybiBkLT5tX2RlZmVyc0JsaXQ7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpzZXREZWZl
cnNCbGl0KGJvb2wgYikKK3sKKyAgICAgICAgZC0+bV9kZWZlcnNCbGl0ID0gYjsKK30KKworYm9v
bCBCYWNraW5nU3RvcmU6Omhhc0JsaXRKb2JzKCkgY29uc3QKK3sKKyAgICAvLyBOb3JtYWxseSwg
dGhpcyB3b3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgY29tcG9zaXRpbmcgdGhyZWFkLAorICAgIC8v
IGFuZCB0aGUgZmxhZyBpcyBzZXQgb24gdGhlIGNvbXBvc2l0aW5nIHRocmVhZCwgc28gbm8gbmVl
ZCBmb3IKKyAgICAvLyBzeW5jaHJvbml6YXRpb24uCisgICAgcmV0dXJuIGQtPm1faGFzQmxpdEpv
YnM7Cit9CisKK3ZvaWQgQmFja2luZ1N0b3JlOjpibGl0T25JZGxlKCkKK3sKKyAgICBkLT5ibGl0
VmlzaWJsZUNvbnRlbnRzKHRydWUgLypmb3JjZSovKTsKK30KKworfQorfQpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9CYWNraW5nU3RvcmUuaCBiL1NvdXJjZS9XZWJL
aXQvYmxhY2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uODY3MzI2OAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwOSwgMjAxMCwgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwg
UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv
ZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIEJhY2tpbmdT
dG9yZV9oCisjZGVmaW5lIEJhY2tpbmdTdG9yZV9oCisKKyNpbmNsdWRlICJCbGFja0JlcnJ5R2xv
YmFsLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIENocm9tZUNsaWVudEJsYWNrQmVy
cnk7CitjbGFzcyBGbG9hdFBvaW50OworY2xhc3MgRnJhbWVMb2FkZXJDbGllbnRCbGFja0JlcnJ5
OworY2xhc3MgR0xFUzJDb250ZXh0OworY2xhc3MgSW50UmVjdDsKK30KKworbmFtZXNwYWNlIEJs
YWNrQmVycnkgeworbmFtZXNwYWNlIFBsYXRmb3JtIHsKK2NsYXNzIEludFJlY3Q7Cit9Cit9CisK
K25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJQ
YWdlOworY2xhc3MgV2ViUGFnZVByaXZhdGU7CitjbGFzcyBCYWNraW5nU3RvcmVQcml2YXRlOwor
Y2xhc3MgQmFja2luZ1N0b3JlQ2xpZW50OworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBCYWNr
aW5nU3RvcmUgeworcHVibGljOgorICAgIGVudW0gUmVzdW1lVXBkYXRlT3BlcmF0aW9uIHsgTm9u
ZSwgQmxpdCwgUmVuZGVyQW5kQmxpdCB9OworICAgIEJhY2tpbmdTdG9yZShXZWJQYWdlKiwgQmFj
a2luZ1N0b3JlQ2xpZW50Kik7CisgICAgdmlydHVhbCB+QmFja2luZ1N0b3JlKCk7CisKKyAgICB2
b2lkIGNyZWF0ZVN1cmZhY2UoKTsKKworICAgIHZvaWQgc3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdT
dG9yZVVwZGF0ZXMoKTsKKyAgICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0
ZXMoUmVzdW1lVXBkYXRlT3BlcmF0aW9uKTsKKworICAgIGJvb2wgaXNTY3JvbGxpbmdPclpvb21p
bmcoKSBjb25zdDsKKyAgICB2b2lkIHNldFNjcm9sbGluZ09yWm9vbWluZyhib29sKTsKKworICAg
IHZvaWQgYmxpdENvbnRlbnRzKGNvbnN0IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpJbnRSZWN0JiBk
c3RSZWN0LCBjb25zdCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6SW50UmVjdCYgY29udGVudHMpOwor
ICAgIHZvaWQgcmVwYWludChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCwgYm9v
bCBjb250ZW50Q2hhbmdlZCwgYm9vbCBpbW1lZGlhdGUpOworCisgICAgYm9vbCBoYXNSZW5kZXJK
b2JzKCkgY29uc3Q7CisgICAgdm9pZCByZW5kZXJPbklkbGUoKTsKKworICAgIC8vIEluIHRoZSBk
ZWZlcnMgYmxpdCBtb2RlLCBhbnkgYmxpdCByZXF1ZXN0cyB3aWxsIGp1c3QgcmV0dXJuIGVhcmx5
LCBhbmQKKyAgICAvLyBhIGJsaXQgam9iIHdpbGwgYmUgcXVldWVkIHRoYXQgaXMgZXhlY3V0ZWQg
YnkgY2FsbGluZyBibGl0T25JZGxlKCkuCisgICAgYm9vbCBkZWZlcnNCbGl0KCkgY29uc3Q7Cisg
ICAgdm9pZCBzZXREZWZlcnNCbGl0KGJvb2wpOworCisgICAgYm9vbCBoYXNCbGl0Sm9icygpIGNv
bnN0OworICAgIHZvaWQgYmxpdE9uSWRsZSgpOworCisgICAgYm9vbCBpc0RpcmVjdFJlbmRlcmlu
Z1RvV2luZG93KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVy
cnk6OldlYktpdDo6QmFja2luZ1N0b3JlQ2xpZW50OworICAgIGZyaWVuZCBjbGFzcyBCbGFja0Jl
cnJ5OjpXZWJLaXQ6OldlYlBhZ2U7CisgICAgZnJpZW5kIGNsYXNzIEJsYWNrQmVycnk6OldlYktp
dDo6V2ViUGFnZVByaXZhdGU7IC8vIEZJWE1FOiBGb3Igbm93LCB3ZSBleHBvc2Ugb3VyIGludGVy
bmFscyB0byBXZWJQYWdlUHJpdmF0ZS4gU2VlIFBSICMxMjAzMDEuCisgICAgZnJpZW5kIGNsYXNz
IFdlYkNvcmU6OkNocm9tZUNsaWVudEJsYWNrQmVycnk7CisgICAgZnJpZW5kIGNsYXNzIFdlYkNv
cmU6OkZyYW1lTG9hZGVyQ2xpZW50QmxhY2tCZXJyeTsKKyAgICBmcmllbmQgY2xhc3MgV2ViQ29y
ZTo6R0xFUzJDb250ZXh0OworICAgIEJhY2tpbmdTdG9yZVByaXZhdGUgKmQ7Cit9OworfQorfQor
CisjZW5kaWYgLy8gQmFja2luZ1N0b3JlX2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxh
Y2tiZXJyeS9BcGkvQmFja2luZ1N0b3JlX3AuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9B
cGkvQmFja2luZ1N0b3JlX3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5k
ZjlkZTk2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9ibGFja2JlcnJ5L0FwaS9C
YWNraW5nU3RvcmVfcC5oCkBAIC0wLDAgKzEsMzU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA5LCAyMDEwLCAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhl
IEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAq
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3Rv
biwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgQmFja2luZ1N0b3JlX3BfaAor
I2RlZmluZSBCYWNraW5nU3RvcmVfcF9oCisKKyNpbmNsdWRlICJCYWNraW5nU3RvcmUuaCIKKyNp
bmNsdWRlICJSZW5kZXJRdWV1ZS5oIgorI2luY2x1ZGUgIlRpbGVJbmRleC5oIgorI2luY2x1ZGUg
IlRpbGVJbmRleEhhc2guaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybUdyYXBoaWNzLmg+CisjaW5jbHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtR3VhcmRl
ZFBvaW50ZXIuaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0
b3IuaD4KKworI2lmIFVTRShPUEVOVkcpCisjaW5jbHVkZSA8ZWdsLmg+CisjZW5kaWYKKworI2lu
Y2x1ZGUgPHB0aHJlYWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgSW50UmVjdDsK
K2NsYXNzIFRyYW5zZm9ybWF0aW9uTWF0cml4OworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7
CituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgQmFja2luZ1N0b3JlVGlsZTsKK2NsYXNzIFRp
bGVCdWZmZXI7CitjbGFzcyBXZWJQYWdlOworY2xhc3MgQmFja2luZ1N0b3JlQ2xpZW50OworCit0
eXBlZGVmIFdURjo6SGFzaE1hcDxUaWxlSW5kZXgsIEJhY2tpbmdTdG9yZVRpbGUqPiBUaWxlTWFw
OworY2xhc3MgQmFja2luZ1N0b3JlR2VvbWV0cnkgeworcHVibGljOgorICAgIEJhY2tpbmdTdG9y
ZUdlb21ldHJ5KCkKKyAgICAgICAgOiBtX251bWJlck9mVGlsZXNXaWRlKDApCisgICAgICAgICwg
bV9udW1iZXJPZlRpbGVzSGlnaCgwKQorICAgIHsKKyAgICB9CisKKyAgICBQbGF0Zm9ybTo6SW50
UmVjdCBiYWNraW5nU3RvcmVSZWN0KCkgY29uc3Q7CisgICAgUGxhdGZvcm06OkludFNpemUgYmFj
a2luZ1N0b3JlU2l6ZSgpIGNvbnN0OworCisgICAgaW50IG51bWJlck9mVGlsZXNXaWRlKCkgY29u
c3QgeyByZXR1cm4gbV9udW1iZXJPZlRpbGVzV2lkZTsgfQorICAgIHZvaWQgc2V0TnVtYmVyT2ZU
aWxlc1dpZGUoaW50IG51bWJlck9mVGlsZXNXaWRlKSB7IG1fbnVtYmVyT2ZUaWxlc1dpZGUgPSBu
dW1iZXJPZlRpbGVzV2lkZTsgfQorICAgIGludCBudW1iZXJPZlRpbGVzSGlnaCgpIGNvbnN0IHsg
cmV0dXJuIG1fbnVtYmVyT2ZUaWxlc0hpZ2g7IH0KKyAgICB2b2lkIHNldE51bWJlck9mVGlsZXNI
aWdoKGludCBudW1iZXJPZlRpbGVzSGlnaCkgeyBtX251bWJlck9mVGlsZXNIaWdoID0gbnVtYmVy
T2ZUaWxlc0hpZ2g7IH0KKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgYmFja2luZ1N0b3JlT2Zmc2V0
KCkgY29uc3QgeyByZXR1cm4gbV9iYWNraW5nU3RvcmVPZmZzZXQ7IH0KKyAgICB2b2lkIHNldEJh
Y2tpbmdTdG9yZU9mZnNldChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIG9mZnNldCkgeyBtX2Jh
Y2tpbmdTdG9yZU9mZnNldCA9IG9mZnNldDsgfQorICAgIEJhY2tpbmdTdG9yZVRpbGUqIHRpbGVB
dChUaWxlSW5kZXggaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZU1hcC5nZXQoaW5kZXgpOyB9
CisgICAgY29uc3QgVGlsZU1hcCYgdGlsZU1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fdGlsZU1hcDsg
fQorICAgIHZvaWQgc2V0VGlsZU1hcChjb25zdCBUaWxlTWFwJiB0aWxlTWFwKSB7IG1fdGlsZU1h
cCA9IHRpbGVNYXA7IH0KKworICBwcml2YXRlOgorICAgIGludCBtX251bWJlck9mVGlsZXNXaWRl
OworICAgIGludCBtX251bWJlck9mVGlsZXNIaWdoOworICAgIFBsYXRmb3JtOjpJbnRQb2ludCBt
X2JhY2tpbmdTdG9yZU9mZnNldDsKKyAgICBUaWxlTWFwIG1fdGlsZU1hcDsKK307CisKK2NsYXNz
IEJhY2tpbmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlIHsKK3B1YmxpYzoKKyAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBibGl0dGVkUmVnaW9uKCkgY29uc3QgeyByZXR1cm4gbV9ibGl0dGVkUmVn
aW9uOyB9CisgICAgdm9pZCBhZGRCbGl0dGVkUmVnaW9uKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
UmVnaW9uJiByZWdpb24pCisgICAgeworICAgICAgICBtX2JsaXR0ZWRSZWdpb24gPSBQbGF0Zm9y
bTo6SW50UmVjdFJlZ2lvbjo6dW5pb25SZWdpb25zKG1fYmxpdHRlZFJlZ2lvbiwgcmVnaW9uKTsK
KyAgICB9CisgICAgdm9pZCBjbGVhckJsaXR0ZWRSZWdpb24oY29uc3QgUGxhdGZvcm06OkludFJl
Y3RSZWdpb24mIHJlZ2lvbikKKyAgICB7CisgICAgICAgIG1fYmxpdHRlZFJlZ2lvbiA9IFBsYXRm
b3JtOjpJbnRSZWN0UmVnaW9uOjpzdWJ0cmFjdFJlZ2lvbnMobV9ibGl0dGVkUmVnaW9uLCByZWdp
b24pOworICAgIH0KKyAgICB2b2lkIGNsZWFyQmxpdHRlZFJlZ2lvbigpIHsgbV9ibGl0dGVkUmVn
aW9uID0gUGxhdGZvcm06OkludFJlY3RSZWdpb24oKTsgfQorCisgICAgYm9vbCBpc1JlbmRlcmVk
KGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgc2Nyb2xsUG9zaXRpb24sIGNvbnN0IFBsYXRmb3Jt
OjpJbnRSZWN0UmVnaW9uJiBjb250ZW50cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBQ
bGF0Zm9ybTo6SW50UmVjdFJlZ2lvbjo6c3VidHJhY3RSZWdpb25zKGNvbnRlbnRzLCBtX2JsaXR0
ZWRSZWdpb24pLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBQbGF0Zm9ybTo6
SW50UmVjdFJlZ2lvbiBtX2JsaXR0ZWRSZWdpb247Cit9OworCitjbGFzcyBCYWNraW5nU3RvcmVQ
cml2YXRlIDogcHVibGljIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpHdWFyZGVkUG9pbnRlckJhc2Ug
eworcHVibGljOgorICAgIGVudW0gVGlsZU1hdHJpeERpcmVjdGlvbiB7IEhvcml6b250YWwsIFZl
cnRpY2FsIH07CisgICAgQmFja2luZ1N0b3JlUHJpdmF0ZSgpOworICAgIH5CYWNraW5nU3RvcmVQ
cml2YXRlKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZGlyZWN0IHJlbmRlcmluZyBpcyBl
eHBsaWNpdGx5IHR1cm5lZCBvbiBvciBpcworICAgIC8vIHJlcXVpcmVkIGJlY2F1c2UgdGhlIHN1
cmZhY2UgcG9vbCBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIG1lZXQKKyAgICAvLyB0aGUgbWluaW11
bSBudW1iZXIgb2YgdGlsZXMgcmVxdWlyZWQgdG8gc2Nyb2xsLgorICAgIGJvb2wgc2hvdWxkRGly
ZWN0UmVuZGVyaW5nVG9XaW5kb3coKSBjb25zdDsKKworICAgIC8vIFN1c3BlbmRzIGFsbCBzY3Jl
ZW4gdXBkYXRlcyBzbyB0aGF0ICdibGl0Q29udGVudHMnIGlzIGRpc2FibGVkLgorICAgIHZvaWQg
c3VzcGVuZFNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoKTsKKworICAgIC8vIFJlc3VtZXMg
YWxsIHNjcmVlbiB1cGRhdGVzIHNvIHRoYXQgJ2JsaXRDb250ZW50cycgaXMgZW5hYmxlZC4KKyAg
ICB2b2lkIHJlc3VtZVNjcmVlbkFuZEJhY2tpbmdTdG9yZVVwZGF0ZXMoQmFja2luZ1N0b3JlOjpS
ZXN1bWVVcGRhdGVPcGVyYXRpb24pOworCisgICAgLy8gVGhlIGZ1bmN0aW9ucyByZXBhaW50KCks
IHNsb3dTY3JvbGwoKSwgc2Nyb2xsKCksIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoKSBhcmUKKyAg
ICAvLyBjYWxsZWQgZnJvbSBvdXRzaWRlIFdlYktpdCBhbmQgd2l0aGluIFdlYktpdCB2aWEgQ2hy
b21lQ2xpZW50QmxhY2tCZXJyeS4KKyAgICB2b2lkIHJlcGFpbnQoY29uc3QgUGxhdGZvcm06Oklu
dFJlY3QmIHdpbmRvd1JlY3QsIGJvb2wgY29udGVudENoYW5nZWQsIGJvb2wgaW1tZWRpYXRlKTsK
KworICAgIHZvaWQgc2xvd1Njcm9sbChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGNv
bnN0IFBsYXRmb3JtOjpJbnRSZWN0JiB3aW5kb3dSZWN0LCBib29sIGltbWVkaWF0ZSk7CisKKyAg
ICB2b2lkIHNjcm9sbChjb25zdCBQbGF0Zm9ybTo6SW50U2l6ZSYgZGVsdGEsIGNvbnN0IFBsYXRm
b3JtOjpJbnRSZWN0JiBzY3JvbGxWaWV3UmVjdCwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGNs
aXBSZWN0KTsKKyAgICB2b2lkIHNjcm9sbGluZ1N0YXJ0ZWRIZWxwZXIoY29uc3QgUGxhdGZvcm06
OkludFNpemUmIGRlbHRhKTsKKworICAgIGJvb2wgc2hvdWxkU3VwcHJlc3NOb25WaXNpYmxlUmVn
dWxhclJlbmRlckpvYnMoKSBjb25zdDsKKyAgICBib29sIHNob3VsZFBlcmZvcm1SZW5kZXJKb2Jz
KCkgY29uc3Q7CisgICAgYm9vbCBzaG91bGRQZXJmb3JtUmVndWxhclJlbmRlckpvYnMoKSBjb25z
dDsKKyAgICB2b2lkIHN0YXJ0UmVuZGVyVGltZXIoKTsKKyAgICB2b2lkIHN0b3BSZW5kZXJUaW1l
cigpOworICAgIHZvaWQgcmVuZGVyT25UaW1lcihXZWJDb3JlOjpUaW1lcjxCYWNraW5nU3RvcmVQ
cml2YXRlPiopOworICAgIHZvaWQgcmVuZGVyT25JZGxlKCk7CisgICAgYm9vbCB3aWxsRmlyZVRp
bWVyKCk7CisKKyAgICAvLyBTZXQgb2YgaGVscGVyIG1ldGhvZHMgZm9yIHRoZSBzY3JvbGxCYWNr
aW5nU3RvcmUoKSBtZXRob2QuCisgICAgUGxhdGZvcm06OkludFJlY3QgY29udGVudHNSZWN0KCkg
Y29uc3Q7CisgICAgUGxhdGZvcm06OkludFJlY3QgZXhwYW5kZWRDb250ZW50c1JlY3QoKSBjb25z
dDsKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCB2aXNpYmxlQ29udGVudHNSZWN0KCkgY29uc3Q7Cisg
ICAgUGxhdGZvcm06OkludFJlY3QgdW5jbGlwcGVkVmlzaWJsZUNvbnRlbnRzUmVjdCgpIGNvbnN0
OworICAgIGJvb2wgc2hvdWxkTW92ZUxlZnQoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25z
dDsKKyAgICBib29sIHNob3VsZE1vdmVSaWdodChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNv
bnN0OworICAgIGJvb2wgc2hvdWxkTW92ZVVwKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29u
c3Q7CisgICAgYm9vbCBzaG91bGRNb3ZlRG93bihjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNv
bnN0OworICAgIGJvb2wgY2FuTW92ZVgoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsK
KyAgICBib29sIGNhbk1vdmVZKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAg
Ym9vbCBjYW5Nb3ZlTGVmdChjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIGJv
b2wgY2FuTW92ZVJpZ2h0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgYm9v
bCBjYW5Nb3ZlVXAoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBib29sIGNh
bk1vdmVEb3duKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisKKyAgICBQbGF0Zm9y
bTo6SW50UmVjdCBiYWNraW5nU3RvcmVSZWN0Rm9yU2Nyb2xsKGludCBkZWx0YVgsIGludCBkZWx0
YVksIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisgICAgdm9pZCBzZXRCYWNraW5n
U3RvcmVSZWN0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0Jik7CisKKyAgICB0eXBlZGVmIFdURjo6
VmVjdG9yPFRpbGVJbmRleD4gVGlsZUluZGV4TGlzdDsKKyAgICBUaWxlSW5kZXhMaXN0IGluZGV4
ZXNGb3JCYWNraW5nU3RvcmVSZWN0KGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JikgY29uc3Q7CisK
KyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3JpZ2luT2ZMYXN0UmVuZGVyRm9yVGlsZShjb25zdCBU
aWxlSW5kZXgmLCBCYWNraW5nU3RvcmVUaWxlKiwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJh
Y2tpbmdTdG9yZVJlY3QpIGNvbnN0OworCisgICAgVGlsZUluZGV4IGluZGV4T2ZMYXN0UmVuZGVy
Rm9yVGlsZShjb25zdCBUaWxlSW5kZXgmLCBCYWNraW5nU3RvcmVUaWxlKikgY29uc3Q7CisgICAg
VGlsZUluZGV4IGluZGV4T2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgb3JpZ2luLCBj
b25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgYmFja2luZ1N0b3JlUmVjdCkgY29uc3Q7CisgICAgdm9p
ZCBjbGVhckFuZFVwZGF0ZVRpbGVPZk5vdFJlbmRlcmVkUmVnaW9uKGNvbnN0IFRpbGVJbmRleCYs
IEJhY2tpbmdTdG9yZVRpbGUqLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdFJlZ2lvbiYsIGNvbnN0
IFBsYXRmb3JtOjpJbnRSZWN0JiBiYWNraW5nU3RvcmVSZWN0LCBib29sIHVwZGF0ZSA9IHRydWUp
OworICAgIGJvb2wgaXNDdXJyZW50VmlzaWJsZUpvYihjb25zdCBUaWxlSW5kZXgmLCBCYWNraW5n
U3RvcmVUaWxlKiwgY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGJhY2tpbmdTdG9yZVJlY3QpIGNv
bnN0OworCisgICAgLy8gUmVzcG9uc2libGUgZm9yIHNjcm9sbGluZyB0aGUgYmFja2luZyBzdG9y
ZSBhbmQgdXBkYXRpbmcgdGhlCisgICAgLy8gdGlsZSBtYXRyaXggZ2VvbWV0cnkuCisgICAgdm9p
ZCBzY3JvbGxCYWNraW5nU3RvcmUoaW50IGRlbHRhWCwgaW50IGRlbHRhWSk7CisKKyAgICAvLyBS
ZW5kZXIgdGhlIHRpbGVzIGRpcnR5IHJlY3RzIGFuZCBibGl0IHRvIHRoZSBzY3JlZW4uCisgICAg
Ym9vbCByZW5kZXJEaXJlY3RUb1dpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYsIGJvb2wg
cmVuZGVyQ29udGVudE9ubHkpOworICAgIGJvb2wgcmVuZGVyKGNvbnN0IFBsYXRmb3JtOjpJbnRS
ZWN0JiwgYm9vbCByZW5kZXJDb250ZW50T25seSk7CisgICAgYm9vbCByZW5kZXIoY29uc3QgSW50
UmVjdExpc3QmLCBib29sIHJlbmRlckNvbnRlbnRPbmx5KTsKKworICAgIC8vIENhbGxlZCBieSB0
aGUgcmVuZGVyIHF1ZXVlIHRvIGVuc3VyZSB0aGF0IHRoZSBxdWV1ZSBpcyBpbiBhCisgICAgLy8g
Y29uc3RhbnQgc3RhdGUgYmVmb3JlIHBlcmZvcm1pbmcgYSByZW5kZXIgam9iLgorICAgIHZvaWQg
cmVxdWVzdExheW91dElmTmVlZGVkKCkgY29uc3Q7CisKKyAgICAvLyBIZWxwZXIgcmVuZGVyIG1l
dGhvZHMuCisgICAgdm9pZCByZW5kZXJWaXNpYmxlQ29udGVudHMoYm9vbCByZW5kZXJDb250ZW50
T25seSA9IGZhbHNlKTsKKyAgICB2b2lkIHJlbmRlckJhY2tpbmdTdG9yZShib29sIHJlbmRlckNv
bnRlbnRPbmx5ID0gZmFsc2UpOworICAgIHZvaWQgYmxpdFZpc2libGVDb250ZW50cyhib29sIGZv
cmNlID0gZmFsc2UpOworCisgICAgLy8gQXNzdW1lcyB0aGUgcmVjdCB0byBiZSBpbiB3aW5kb3cv
dmlld3BvcnQgY29vcmRpbmF0ZXMuCisgICAgdm9pZCBjb3B5UHJldmlvdXNDb250ZW50c1RvQmFj
a1N1cmZhY2VPZldpbmRvdygpOworICAgIHZvaWQgY29weVByZXZpb3VzQ29udGVudHNUb0JhY2tT
dXJmYWNlT2ZUaWxlKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiwgQmFja2luZ1N0b3JlVGlsZSop
OworICAgIHZvaWQgcGFpbnREZWZhdWx0QmFja2dyb3VuZChjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgY29udGVudHMsIGNvbnN0IFdlYkNvcmU6OlRyYW5zZm9ybWF0aW9uTWF0cml4JiwgYm9vbCBm
bHVzaCk7CisgICAgdm9pZCBibGl0Q29udGVudHMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRz
dFJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50cywgYm9vbCBmb3JjZSA9IGZh
bHNlKTsKKyAgICB2b2lkIGJsaXRPbklkbGUoKTsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPFRp
bGVJbmRleCwgUGxhdGZvcm06OkludFJlY3Q+IFRpbGVSZWN0OworICAgIFBsYXRmb3JtOjpJbnRS
ZWN0IGJsaXRUaWxlUmVjdChUaWxlQnVmZmVyKiwgY29uc3QgVGlsZVJlY3QmLCBjb25zdCBQbGF0
Zm9ybTo6SW50UG9pbnQmLCBjb25zdCBXZWJDb3JlOjpUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIEJh
Y2tpbmdTdG9yZUdlb21ldHJ5Kik7CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcp
CisgICAgdm9pZCBibGVuZENvbXBvc2l0aW5nU3VyZmFjZShjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYgZHN0UmVjdCk7CisgICAgdm9pZCBjbGVhckNvbXBvc2l0aW5nU3VyZmFjZSgpOworICAgIGJv
b2wgZHJhd1N1YkxheWVycygpOworI2VuZGlmCisKKyAgICB2b2lkIGJsaXRIb3Jpem9udGFsU2Ny
b2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworICAgIHZvaWQgYmxpdFZlcnRpY2Fs
U2Nyb2xsYmFyKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpOworCisgICAgLy8gUmV0dXJucyB3
aGV0aGVyIHRoZSB0aWxlIGluZGV4IGlzIGN1cnJlbnRseSB2aXNpYmxlIG9yIG5vdC4KKyAgICBi
b29sIGlzVGlsZVZpc2libGUoY29uc3QgVGlsZUluZGV4JikgY29uc3Q7CisgICAgYm9vbCBpc1Rp
bGVWaXNpYmxlKGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYpIGNvbnN0OworCisgICAgLy8gUmV0
dXJucyBhIHJlY3QgdGhhdCBpcyB0aGUgdW5pb24gb2YgYWxsIHRpbGVzIHRoYXQgYXJlIHZpc2li
bGUuCisgICAgUGxhdGZvcm06OkludFJlY3QgdmlzaWJsZVRpbGVzUmVjdCgpIGNvbnN0OworCisg
ICAgLy8gVXNlZCB0byBjbGlwIHRvIHRoZSB2aXNpYmxlIGNvbnRlbnQgZm9yIGluc3RhbmNlLgor
ICAgIFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0IFRpbGVJ
bmRleCYpIGNvbnN0OworCisgICAgLy8gVXNlZCB0byBjbGlwIHRvIHRoZSB1bmNsaXBwZWQgdmlz
aWJsZSBjb250ZW50IGZvciBpbnN0YW5jZSB3aGljaCBpbmNsdWRlcyBvdmVyc2Nyb2xsLgorICAg
IFBsYXRmb3JtOjpJbnRSZWN0IHRpbGVVbmNsaXBwZWRWaXNpYmxlQ29udGVudHNSZWN0KGNvbnN0
IFRpbGVJbmRleCYpIGNvbnN0OworCisgICAgLy8gVXNlZCB0byBjbGlwIHRvIHRoZSBjb250ZW50
cyBmb3IgaW5zdGFuY2UuCisgICAgUGxhdGZvcm06OkludFJlY3QgdGlsZUNvbnRlbnRzUmVjdChj
b25zdCBUaWxlSW5kZXgmLCBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworICAgIFBs
YXRmb3JtOjpJbnRSZWN0IHRpbGVDb250ZW50c1JlY3QoY29uc3QgVGlsZUluZGV4JiwgY29uc3Qg
UGxhdGZvcm06OkludFJlY3QmLCBCYWNraW5nU3RvcmVHZW9tZXRyeSogc3RhdGUpIGNvbnN0Owor
CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgV2ViUGFnZSBvbmNlIGxvYWQgaXMgY29tbWl0dGVk
IHRvIHJlc2V0IHRoZSByZW5kZXIgcXVldWUuCisgICAgdm9pZCByZXNldFJlbmRlclF1ZXVlKCk7
CisgICAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgRnJhbWVMb2FkZXJDbGllbnQgdGhhdCBleHBsaWNp
dGx5IHBhaW50cyBvbiBmaXJzdCB2aXNpYmxlIGxheW91dC4KKyAgICB2b2lkIGNsZWFyVmlzaWJs
ZVpvb20oKTsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIGJ5IFdlYlBhZ2Ugb25jZSBsb2FkIGlz
IGNvbW1pdHRlZCB0byByZXNldCBhbGwgdGhlIHRpbGVzLgorICAgIHZvaWQgcmVzZXRUaWxlcyhi
b29sIHJlc2V0QmFja2dyb3VuZCk7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSBXZWJQYWdl
IGFmdGVyIGxvYWQgaXMgY29tcGxldGUgdG8gdXBkYXRlIGFsbCB0aGUgdGlsZXMuCisgICAgdm9p
ZCB1cGRhdGVUaWxlcyhib29sIHVwZGF0ZVZpc2libGUsIGJvb2wgaW1tZWRpYXRlKTsKKworICAg
IC8vIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBzY3JvbGwgYW5kIGJ5IHRoZSByZW5kZXIgcXVldWUu
CisgICAgdm9pZCB1cGRhdGVUaWxlc0ZvclNjcm9sbE9yTm90UmVuZGVyZWRSZWdpb24oYm9vbCBj
aGVja0xvYWRpbmcgPSB0cnVlKTsKKworICAgIC8vIFJlc2V0IGFuIGluZGl2aWR1YWwgdGlsZS4K
KyAgICB2b2lkIHJlc2V0VGlsZShjb25zdCBUaWxlSW5kZXgmLCBCYWNraW5nU3RvcmVUaWxlKiwg
Ym9vbCByZXNldEJhY2tncm91bmQpOworCisgICAgLy8gVXBkYXRlIGFuIGluZGl2aWR1YWwgdGls
ZS4KKyAgICB2b2lkIHVwZGF0ZVRpbGUoY29uc3QgVGlsZUluZGV4JiwgYm9vbCBpbW1lZGlhdGUp
OworICAgIHZvaWQgdXBkYXRlVGlsZShjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmLCBib29sIGlt
bWVkaWF0ZSk7CisKKyAgICBQbGF0Zm9ybTo6SW50UmVjdCBtYXBGcm9tVGlsZXNUb1RyYW5zZm9y
bWVkQ29udGVudHMoY29uc3QgVGlsZVJlY3QmKSBjb25zdDsKKyAgICBQbGF0Zm9ybTo6SW50UmVj
dCBtYXBGcm9tVGlsZXNUb1RyYW5zZm9ybWVkQ29udGVudHMoY29uc3QgVGlsZVJlY3QmLCBjb25z
dCBQbGF0Zm9ybTo6SW50UmVjdCYpIGNvbnN0OworCisgICAgdHlwZWRlZiBXVEY6OlZlY3RvcjxU
aWxlUmVjdD4gVGlsZVJlY3RMaXN0OworICAgIFRpbGVSZWN0TGlzdCBtYXBGcm9tVHJhbnNmb3Jt
ZWRDb250ZW50c1RvQWJzb2x1dGVUaWxlQm91bmRhcmllcyhjb25zdCBQbGF0Zm9ybTo6SW50UmVj
dCYpIGNvbnN0OworICAgIFRpbGVSZWN0TGlzdCBtYXBGcm9tVHJhbnNmb3JtZWRDb250ZW50c1Rv
VGlsZXMoY29uc3QgUGxhdGZvcm06OkludFJlY3QmKSBjb25zdDsKKyAgICBUaWxlUmVjdExpc3Qg
bWFwRnJvbVRyYW5zZm9ybWVkQ29udGVudHNUb1RpbGVzKGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0
JiwgQmFja2luZ1N0b3JlR2VvbWV0cnkqKSBjb25zdDsKKworICAgIHZvaWQgdXBkYXRlVGlsZU1h
dHJpeElmTmVlZGVkKCk7CisKKyAgICAvLyBDYWxsZWQgYnkgV2ViUGFnZVByaXZhdGU6Om5vdGlm
eVRyYW5zZm9ybWVkQ29udGVudHNTaXplQ2hhbmdlZC4KKyAgICB2b2lkIGNvbnRlbnRzU2l6ZUNo
YW5nZWQoY29uc3QgUGxhdGZvcm06OkludFNpemUmKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJQ
YWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3JtZWRTY3JvbGxDaGFuZ2VkLgorICAgIHZvaWQgc2Ny
b2xsQ2hhbmdlZChjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmKTsKKworICAgIC8vIENhbGxlZCBi
eSBXZWJwYWdlUHJpdmF0ZTo6bm90aWZ5VHJhbnNmb3JtQ2hhbmdlZC4KKyAgICB2b2lkIHRyYW5z
Zm9ybUNoYW5nZWQoKTsKKworICAgIC8vIENhbGxlZCBieSBXZWJwYWdlUHJpdmF0ZTo6YWN0dWFs
VmlzaWJsZVNpemVDaGFuZ2VkLgorICAgIHZvaWQgYWN0dWFsVmlzaWJsZVNpemVDaGFuZ2VkKGNv
bnN0IFBsYXRmb3JtOjpJbnRTaXplJik7CisKKyAgICAvLyBDYWxsZWQgYnkgV2ViUGFnZVByaXZh
dGU6OnNldFNjcmVlblJvdGF0ZWQuCisgICAgdm9pZCBvcmllbnRhdGlvbkNoYW5nZWQoKTsKKwor
ICAgIC8vIFNldHMgdGhlIGdlb21ldHJ5IG9mIHRoZSB0aWxlIG1hdHJpeC4KKyAgICB2b2lkIHNl
dEdlb21ldHJ5T2ZUaWxlTWF0cml4KGludCBudW1iZXJPZlRpbGVzV2lkZSwgaW50IG51bWJlck9m
VGlsZXNIaWdoKTsKKworICAgIC8vIENyZWF0ZSB0aGUgc3VyZmFjZXMgb2YgdGhlIGJhY2tpbmcg
c3RvcmUuCisgICAgdm9pZCBjcmVhdGVTdXJmYWNlcygpOworICAgIHZvaWQgY3JlYXRlVmlzaWJs
ZVRpbGVCdWZmZXIoKTsKKworICAgIC8vIFZhcmlvdXMgY2FsY3VsYXRpb25zIG9mIHF1YW50aXRp
ZXMgcmVsZXZhbnQgdG8gYmFja2luZyBzdG9yZS4KKyAgICBQbGF0Zm9ybTo6SW50UG9pbnQgb3Jp
Z2luT2ZUaWxlKGNvbnN0IFRpbGVJbmRleCYpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRQb2lu
dCBvcmlnaW5PZlRpbGUoY29uc3QgVGlsZUluZGV4JiwgY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
KSBjb25zdDsKKyAgICBpbnQgbWluaW11bU51bWJlck9mVGlsZXNXaWRlKCkgY29uc3Q7CisgICAg
aW50IG1pbmltdW1OdW1iZXJPZlRpbGVzSGlnaCgpIGNvbnN0OworICAgIFBsYXRmb3JtOjpJbnRT
aXplIGV4cGFuZGVkQ29udGVudHNTaXplKCkgY29uc3Q7CisKKyAgICAvLyBUaGUgdGlsZSBnZW9t
ZXRyeSBtZXRob2RzIGFyZSBhbGwgc3RhdGljIGZ1bmN0aW9uLgorICAgIHN0YXRpYyBpbnQgdGls
ZVdpZHRoKCk7CisgICAgc3RhdGljIGludCB0aWxlSGVpZ2h0KCk7CisgICAgc3RhdGljIFBsYXRm
b3JtOjpJbnRTaXplIHRpbGVTaXplKCk7CisgICAgc3RhdGljIFBsYXRmb3JtOjpJbnRSZWN0IHRp
bGVSZWN0KCk7CisKKyAgICAvLyBUaGlzIHRha2VzIHRyYW5zZm9ybWVkIGNvbnRlbnRzIGNvb3Jk
aW5hdGVzLgorICAgIHZvaWQgcmVuZGVyQ29udGVudHMoQmxhY2tCZXJyeTo6UGxhdGZvcm06Okdy
YXBoaWNzOjpCdWZmZXIqLCBjb25zdCBQbGF0Zm9ybTo6SW50UG9pbnQmIHN1cmZhY2VPZmZzZXQs
IGNvbnN0IFBsYXRmb3JtOjpJbnRSZWN0JiBjb250ZW50c1JlY3QpIGNvbnN0OworCisgICAgdm9p
ZCBibGl0VG9XaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3QmIGRzdFJlY3QsIGNvbnN0IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpHcmFwaGljczo6QnVmZmVyKiBzcmNCdWZmZXIsIGNvbnN0IFBs
YXRmb3JtOjpJbnRSZWN0JiBzcmNSZWN0LCBib29sIGJsZW5kLCB1bnNpZ25lZCBjaGFyIGdsb2Jh
bEFscGhhKTsKKyAgICB2b2lkIGNoZWNrZXJXaW5kb3coY29uc3QgUGxhdGZvcm06OkludFJlY3Qm
IGRzdFJlY3QsIGNvbnN0IFBsYXRmb3JtOjpJbnRQb2ludCYgY29udGVudHNPcmlnaW4sIGRvdWJs
ZSBjb250ZW50c1NjYWxlKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVdpbmRvdygpOworICAgIHZv
aWQgaW52YWxpZGF0ZVdpbmRvdyhjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgZHN0KTsKKyAgICB2
b2lkIGNsZWFyV2luZG93KCk7CisgICAgdm9pZCBjbGVhcldpbmRvdyhjb25zdCBQbGF0Zm9ybTo6
SW50UmVjdCYsIHVuc2lnbmVkIGNoYXIgcmVkLCB1bnNpZ25lZCBjaGFyIGdyZWVuLCB1bnNpZ25l
ZCBjaGFyIGJsdWUsIHVuc2lnbmVkIGNoYXIgYWxwaGEgPSAyNTUpOworCisgICAgYm9vbCBpc1Nj
cm9sbGluZ09yWm9vbWluZygpIGNvbnN0OworICAgIHZvaWQgc2V0U2Nyb2xsaW5nT3Jab29taW5n
KGJvb2wgc2Nyb2xsaW5nT3Jab29taW5nLCBib29sIHNob3VsZEJsaXQgPSB0cnVlKTsKKworICAg
IHZvaWQgbG9ja0JhY2tpbmdTdG9yZSgpOworICAgIHZvaWQgdW5sb2NrQmFja2luZ1N0b3JlKCk7
CisKKyAgICBCYWNraW5nU3RvcmVHZW9tZXRyeSogZnJvbnRTdGF0ZSgpIGNvbnN0OworICAgIEJh
Y2tpbmdTdG9yZUdlb21ldHJ5KiBiYWNrU3RhdGUoKSBjb25zdDsKKyAgICB2b2lkIHN3YXBTdGF0
ZSgpOworCisgICAgQmFja2luZ1N0b3JlV2luZG93QnVmZmVyU3RhdGUqIHdpbmRvd0Zyb250QnVm
ZmVyU3RhdGUoKSBjb25zdDsKKyAgICBCYWNraW5nU3RvcmVXaW5kb3dCdWZmZXJTdGF0ZSogd2lu
ZG93QmFja0J1ZmZlclN0YXRlKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgdm9pZCBzZXRDdXJyZW50
QmFja2luZ1N0b3JlT3duZXIoV2ViUGFnZSogd2ViUGFnZSkgeyBCYWNraW5nU3RvcmVQcml2YXRl
OjpzX2N1cnJlbnRCYWNraW5nU3RvcmVPd25lciA9IHdlYlBhZ2U7IH0KKyAgICBzdGF0aWMgV2Vi
UGFnZSogY3VycmVudEJhY2tpbmdTdG9yZU93bmVyKCkgeyByZXR1cm4gQmFja2luZ1N0b3JlUHJp
dmF0ZTo6c19jdXJyZW50QmFja2luZ1N0b3JlT3duZXI7IH0KKyAgICBib29sIGlzQWN0aXZlKCkg
Y29uc3Q7CisKKyAgICBzdGF0aWMgV2ViUGFnZSogc19jdXJyZW50QmFja2luZ1N0b3JlT3duZXI7
CisKKyAgICBib29sIG1fc3VzcGVuZFNjcmVlblVwZGF0ZXM7CisgICAgYm9vbCBtX3N1c3BlbmRC
YWNraW5nU3RvcmVVcGRhdGVzOworCisgICAgYm9vbCBtX3N1c3BlbmRSZW5kZXJKb2JzOworICAg
IGJvb2wgbV9zdXNwZW5kUmVndWxhclJlbmRlckpvYnM7CisgICAgYm9vbCBtX2lzU2Nyb2xsaW5n
T3Jab29taW5nOworICAgIFdlYlBhZ2UqIG1fd2ViUGFnZTsKKyAgICBCYWNraW5nU3RvcmVDbGll
bnQqIG1fY2xpZW50OworICAgIE93blB0cjxSZW5kZXJRdWV1ZT4gbV9yZW5kZXJRdWV1ZTsKKyAg
ICBtdXRhYmxlIFBsYXRmb3JtOjpJbnRTaXplIG1fcHJldmlvdXNEZWx0YTsKKworICAgIGJvb2wg
bV9kZWZlcnNCbGl0OworICAgIGJvb2wgbV9oYXNCbGl0Sm9iczsKKworI2lmIFVTRShPUEVOVkcp
CisgICAgRUdMRGlzcGxheSBtX2VnbERpc3BsYXk7CisjZW5kaWYKKyAgICBtdXRhYmxlIHVuc2ln
bmVkIG1fZnJvbnRTdGF0ZTsKKyAgICBtdXRhYmxlIHVuc2lnbmVkIG1fYmFja1N0YXRlOworCisg
ICAgdW5zaWduZWQgbV9jdXJyZW50V2luZG93QmFja0J1ZmZlcjsKKyAgICBtdXRhYmxlIEJhY2tp
bmdTdG9yZVdpbmRvd0J1ZmZlclN0YXRlIG1fd2luZG93QnVmZmVyU3RhdGVbMl07CisKKyAgICBU
aWxlTWF0cml4RGlyZWN0aW9uIG1fcHJlZmVycmVkVGlsZU1hdHJpeERpbWVuc2lvbjsKKworICAg
IFBsYXRmb3JtOjpJbnRSZWN0IG1fdmlzaWJsZVRpbGVCdWZmZXJSZWN0OworCisgICAgLy8gTGFz
dCByZXNvcnQgdGltZXIgZm9yIHJlbmRlcmluZy4KKyAgICBPd25QdHI8V2ViQ29yZTo6VGltZXI8
QmFja2luZ1N0b3JlUHJpdmF0ZT4gPiBtX3JlbmRlclRpbWVyOworCisgICAgcHRocmVhZF9tdXRl
eF90IG1fbXV0ZXg7CisKKyAgICBpbnQgbV9ibGl0R2VuZXJhdGlvbjsKKyAgICBwdGhyZWFkX211
dGV4X3QgbV9ibGl0R2VuZXJhdGlvbkxvY2s7CisgICAgcHRocmVhZF9jb25kX3QgbV9ibGl0R2Vu
ZXJhdGlvbkNvbmQ7CisgICAgc3RydWN0IHRpbWVzcGVjIG1fY3VycmVudEJsaXRFbmQ7Cit9Owor
fSAvLyBuYW1lc3BhY2UgV2ViS2l0Cit9IC8vIG5hbWVzcGFjZSBCbGFja0JlcnJ5CisKKyNlbmRp
ZiAvLyBCYWNraW5nU3RvcmVfcF9oCi0tIAoxLjcuNC4xCgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>