<?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>34912</bug_id>
          
          <creation_ts>2010-02-12 16:14:43 -0800</creation_ts>
          <short_desc>audio engine: add ReverbConvolver class</short_desc>
          <delta_ts>2010-08-30 16:24:50 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dino</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>eric</cc>
    
    <cc>jorlow</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>190198</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-02-12 16:14:43 -0800</bug_when>
    <thetext>audio engine: add ReverbConvolver class</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190201</commentid>
    <comment_count>1</comment_count>
      <attachid>48675</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-02-12 16:18:13 -0800</bug_when>
    <thetext>Created attachment 48675
diagram describing operation of ReverbConvolver

The ReverbConvolver is able to perform extremely long real-time convolutions on a single audio channel. It uses multiple FFTConvolver objects as well as an input buffer and an accumulation buffer. Note that it&apos;s possible to get a multi-threaded implementation by exploiting the parallelism. Also note that the leading sections of the long impulse response are processed in the real-time thread for minimum latency. In theory it&apos;s possible to get zero latency if the very first FFTConvolver is replaced with a DirectConvolver (not using a FFT).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190202</commentid>
    <comment_count>2</comment_count>
      <attachid>48676</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-02-12 16:19:55 -0800</bug_when>
    <thetext>Created attachment 48676
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>190204</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-02-12 16:22:43 -0800</bug_when>
    <thetext>One thing I know I&apos;ll have to change here is how I deal with threading.
Right now, I&apos;m explicitly using pthreads, but this won&apos;t be cross-platform.
Do we have a cross-platform threading abstraction I can use?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>198984</commentid>
    <comment_count>4</comment_count>
      <attachid>48676</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-12 04:43:35 -0800</bug_when>
    <thetext>Comment on attachment 48676
Patch

I&apos;ll take a closer look once these comments are addressed.


&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.cpp b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; new file mode 100644
&gt; index 0000000..0594c8c
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; @@ -0,0 +1,476 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;AudioBus.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +const int kInputBufferSize = 8 * 16384;
&gt; +
&gt; +// We only process the leading portion of the impulse response in the real-time thread.  We don&apos;t exceed this length.
&gt; +// It turns out then, that the background thread has about 278msec of scheduling slop
&gt; +const size_t kRealtimeFrameLimit = 8192  + 4096; // ~278msec @ 44.1KHz

How was this measured?  On what platforms?  How will we make sure that this stays close to reality?  (I.e. can we make a layout test that verifies this or something?)

&gt; +
&gt; +const size_t kMinFFTSize = 256;
&gt; +const size_t kMaxRealtimeFFTSize = 2048;

I believe the preferred style is LikeThis.  I.e. no k prefix.  It&apos;s unfortunate that there are so many examples of the k prefix (and other styles, IIRC).

&gt; +
&gt; +static void* BackgroundThreadDispatch(void* p)

p is not a very good variable name.

&gt; +{
&gt; +    ReverbConvolver* This = static_cast&lt;ReverbConvolver*&gt;(p);
&gt; +    This-&gt;backgroundThreadEntry();
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse,
&gt; +                                 size_t renderSliceSize,
&gt; +                                 size_t maxFFTSize,
&gt; +                                 size_t convolverRenderPhase,
&gt; +                                 bool useBackgroundThreads)
&gt; +    : m_impulseResponseLength(impulseResponse-&gt;frameSize())
&gt; +    , m_accumulationBuffer(impulseResponse-&gt;frameSize() + renderSliceSize)
&gt; +    , m_inputBuffer(kInputBufferSize)
&gt; +    , m_renderSliceSize(renderSliceSize)
&gt; +    , m_useBackgroundThreads(useBackgroundThreads)
&gt; +    , m_wantsToExit(false)
&gt; +{
&gt; +    m_minFFTSize = kMinFFTSize; // First stage will have this size
&gt; +                                // successive stages will double in size each time

This comment could have all just gone on the same line.  WebKit does not share Chromium&apos;s 80 col limit.

&gt; +
&gt; +    m_maxFFTSize = maxFFTSize; // until we hit |m_maxFFTSize|
&gt; +
&gt; +    // If we are using background threads then don&apos;t exceed this FFT size for the
&gt; +    // stages which run in the real-time thread.  This avoids having only one or two
&gt; +    // large stages (size 16384 or so) at the end which take a lot of time every several
&gt; +    // processing slices.  This way we amortize the cost over more processing slices.
&gt; +    m_maxRealtimeFFTSize = kMaxRealtimeFFTSize;
&gt; +
&gt; +    // For the moment, a good way to know if we have real-time constraint
&gt; +    // is to check if we&apos;re using background threads.  Otherwise, assume we&apos;re
&gt; +    // being run from a command-line tool.
&gt; +    bool hasRealtimeConstraint = useBackgroundThreads;

Is any such &quot;command line tool&quot; intended to be upstreamed?  If not, this support should be removed.

&gt; +    float* response = impulseResponse-&gt;data();
&gt; +    size_t totalResponseLength = impulseResponse-&gt;frameSize();
&gt; +
&gt; +    ReverbAccumulationBuffer* accumBufferP = 0;
&gt; +

This is an example of where you bleed vertical space when you probably don&apos;t need to.

&gt; +    accumBufferP = &amp;m_accumulationBuffer;
&gt; +
&gt; +    // Because we&apos;re not using direct-convolution first the leading portion, the reverb
&gt; +    // has an overall latency of half the first-stage FFT size
&gt; +    size_t reverbTotalLatency = m_minFFTSize / 2;
&gt; +
&gt; +    size_t stageOffset = 0;
&gt; +    int i = 0;
&gt; +    size_t fftSize = m_minFFTSize;
&gt; +

Ditto.

&gt; +    while (stageOffset &lt; totalResponseLength) {
&gt; +        size_t stageSize = fftSize / 2;
&gt; +
&gt; +        // For the last stage, it&apos;s possible that |stageOffset| is such that we&apos;re straddling the end
&gt; +        // of the impulse response buffer (if we use |stageSize|), so reduce the last stage&apos;s
&gt; +        // length...
&gt; +
&gt; +        // May have to reduce length of last stage (clip to very end of response)
&gt; +        if (stageSize + stageOffset &gt; totalResponseLength)
&gt; +            stageSize = totalResponseLength - stageOffset;
&gt; +
&gt; +        // This &quot;staggers&quot; the time when each FFT happens so they don&apos;t all happen at the same time
&gt; +        int renderPhase = convolverRenderPhase + i * renderSliceSize;
&gt; +
&gt; +        ReverbConvolverStage* stage = new ReverbConvolverStage(response,
&gt; +                                                               totalResponseLength,
&gt; +                                                               reverbTotalLatency,
&gt; +                                                               stageOffset,
&gt; +                                                               stageSize,
&gt; +                                                               fftSize,
&gt; +                                                               renderPhase,
&gt; +                                                               renderSliceSize,
&gt; +                                                               accumBufferP);

This should all be on one line.  It should use a ::create function.  The ::create function should return a PassOwnPtr&lt;&gt;.  Avoid manual memory management at all costs.

&gt; +
&gt; +        bool isBackgroundStage = false;
&gt; +
&gt; +        if (stageOffset &lt;= kRealtimeFrameLimit)
&gt; +            m_stages.append(stage);
&gt; +        else {
&gt; +            if (this-&gt;useBackgroundThreads()) {
&gt; +                m_backgroundStages.append(stage);
&gt; +                isBackgroundStage = true;
&gt; +            } else
&gt; +                m_stages.append(stage);
&gt; +        }
&gt; +
&gt; +        stageOffset += stageSize;
&gt; +        i++;
&gt; +
&gt; +        // Figure out next FFT size
&gt; +        fftSize *= 2;
&gt; +        if (hasRealtimeConstraint &amp;&amp; !isBackgroundStage &amp;&amp; fftSize &gt; m_maxRealtimeFFTSize)
&gt; +            fftSize = m_maxRealtimeFFTSize;
&gt; +        if (fftSize &gt; m_maxFFTSize)
&gt; +            fftSize = m_maxFFTSize;
&gt; +    }
&gt; +
&gt; +    // Start up background thread
&gt; +    // FIXME: would be better to up the thread priority here.  It doesn&apos;t need to be real-time, but higher than the default...
&gt; +    if (this-&gt;useBackgroundThreads() &amp;&amp; m_backgroundStages.size() &gt; 0)
&gt; +        pthread_create(&amp;m_backgroundThread, 0, BackgroundThreadDispatch, this);
&gt; +    else
&gt; +        m_backgroundThread = 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::~ReverbConvolver()
&gt; +{
&gt; +    // Wait for background thread to stop
&gt; +    if (useBackgroundThreads() &amp;&amp; m_backgroundThread) {
&gt; +        m_wantsToExit = true;
&gt; +        pthread_join(m_backgroundThread, 0);
&gt; +    }
&gt; +
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        delete m_stages[i];
&gt; +
&gt; +    for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +        delete m_backgroundStages[i];
&gt; +}
&gt; +
&gt; +void ReverbConvolver::backgroundThreadEntry()
&gt; +{
&gt; +    while (!m_wantsToExit) {
&gt; +        // Check to see if there&apos;s any more input to consume
&gt; +        int writeIndex = m_inputBuffer.writeIndex();
&gt; +
&gt; +        // Even though it doesn&apos;t seem like every stage needs to maintain its own version of |readIndex| 
&gt; +        // we do this in case we want to run in more than one background thread

Add a period to the end of this.

&gt; +        int readIndex;
&gt; +
&gt; +        while ((readIndex = m_backgroundStages[0]-&gt;inputReadIndex()) != writeIndex) { // FIXME : do better to detect buffer overrun...
&gt; +            // FIXME : remove hard-coded value
&gt; +            const int kSliceSize = 128;
&gt; +
&gt; +            // Accumulate contributions from each stage
&gt; +            for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +                m_backgroundStages[i]-&gt;processInBackground(this, kSliceSize);
&gt; +        }
&gt; +
&gt; +        // Sleep 10ms
&gt; +        usleep(10000); // FIXME : this really isn&apos;t ideal - could use wait/signal
&gt; +    }
&gt; +}
&gt; +
&gt; +size_t ReverbConvolver::impulseResponseLength()
&gt; +{
&gt; +    return m_impulseResponseLength;
&gt; +}
&gt; +
&gt; +void ReverbConvolver::process(float* sourceP,
&gt; +                              float* destP,
&gt; +                              size_t framesToProcess)

All on the same line.

&gt; +{
&gt; +    // Feed input buffer (read by all threads)
&gt; +    m_inputBuffer.write(sourceP, framesToProcess);
&gt; +
&gt; +    // Accumulate contributions from each stage
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;process(sourceP, framesToProcess);
&gt; +
&gt; +    // Finally read from accumulation buffer
&gt; +    m_accumulationBuffer.readAndClear(destP, framesToProcess);
&gt; +}
&gt; +
&gt; +void ReverbConvolver::reset()
&gt; +{
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;reset();
&gt; +
&gt; +    for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +        m_backgroundStages[i]-&gt;reset();
&gt; +
&gt; +    m_accumulationBuffer.reset();
&gt; +    m_inputBuffer.reset();
&gt; +}
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +
&gt; +ReverbConvolverStage::ReverbConvolverStage(float* impulseResponse,
&gt; +                                           size_t responseLength,
&gt; +                                           size_t reverbTotalLatency,
&gt; +                                           size_t stageOffset,
&gt; +                                           size_t stageLength,
&gt; +                                           size_t fftSize,
&gt; +                                           size_t renderPhase,
&gt; +                                           size_t renderSliceSize,
&gt; +                                           ReverbAccumulationBuffer* accumulationBuffer)

I&apos;m not sure, but I believe this should be on the same line...even though the initializing list below is supposed to be split.

&gt; +    : m_fftKernel(fftSize)
&gt; +    , m_accumulationBuffer(accumulationBuffer)
&gt; +    , m_accumulationReadIndex(0)
&gt; +    , m_inputReadIndex(0)
&gt; +    , m_accumulationReadTimeFrame(0)
&gt; +    , m_impulseResponseLength(responseLength)
&gt; +{
&gt; +    m_fftKernel.doPaddedFFT(impulseResponse + stageOffset, stageLength);
&gt; +
&gt; +    m_convolver = new FFTConvolver(fftSize);
&gt; +
&gt; +    m_tempBuffer.allocate(renderSliceSize);
&gt; +
&gt; +    // The convolution stage at offset |stageOffset| needs to have a corresponding delay to cancel out the offset
&gt; +    size_t totalDelay = stageOffset + reverbTotalLatency;
&gt; +
&gt; +    // But, the FFT convolution itself incurs |fftSize| / 2 latency, so subtract this out...
&gt; +    size_t halfSize = fftSize / 2;
&gt; +    if (totalDelay &gt;= halfSize)
&gt; +        totalDelay -= halfSize;
&gt; +
&gt; +    // FIXME : DEAL with case when total delay is less than fftSize/2....
&gt; +
&gt; +    // We divide up the total delay, into pre and post delay sections so that we can
&gt; +    // schedule at exactly the moment when the FFT will happen.  This is coordinated
&gt; +    // with the other stages, so they don&apos;t all do their FFTs at the same time...
&gt; +
&gt; +    int m = (halfSize &lt;= totalDelay) ? halfSize : totalDelay;
&gt; +    m_preDelayLength = (totalDelay &gt; 0) ? (renderPhase % m) : 0;
&gt; +
&gt; +    if (m_preDelayLength &gt; totalDelay)
&gt; +        m_preDelayLength = 0;
&gt; +
&gt; +    m_postDelayLength = totalDelay - m_preDelayLength;
&gt; +    m_preReadWriteIndex = 0;
&gt; +    m_framesProcessed = 0; // total frames processed so far
&gt; +
&gt; +    m_preDelayBuffer.allocate(m_preDelayLength &lt; fftSize ? fftSize : m_preDelayLength);
&gt; +}
&gt; +
&gt; +ReverbConvolverStage::~ReverbConvolverStage()
&gt; +{
&gt; +    delete m_convolver;

Avoid manual memory management.  Use stuff like OwnPtrs.

&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::processInBackground(ReverbConvolver* convolver,
&gt; +                                               size_t framesToProcess)
&gt; +{
&gt; +    ReverbInputBuffer&amp; inputBuffer = convolver-&gt;inputBuffer();
&gt; +
&gt; +    float* sourceP = inputBuffer.directReadFrom(&amp;m_inputReadIndex, framesToProcess);
&gt; +
&gt; +    process(sourceP, framesToProcess);
&gt; +}
&gt; +
&gt; +void  ReverbConvolverStage::process(float* sourceP,
&gt; +                                    size_t framesToProcess)
&gt; +{
&gt; +    //
&gt; +    // FIXME : do sanity check on framesToProcess versus delay buffer size
&gt; +    //
&gt; +
&gt; +    // Get pointer to pre-delay stream : note special handling of zero delay
&gt; +    float* preDelayedSourceP = sourceP;
&gt; +    float* preDelayBufferP = m_preDelayBuffer;
&gt; +    float* tempP = preDelayBufferP;
&gt; +    if (m_preDelayLength &gt; 0) {
&gt; +        preDelayedSourceP = preDelayBufferP + m_preReadWriteIndex;
&gt; +        tempP = m_tempBuffer;
&gt; +    }
&gt; +
&gt; +    int writeIndex = 0;
&gt; +
&gt; +    if (m_framesProcessed &lt; m_preDelayLength) {
&gt; +        // For the first |m_preDelayLength| frames don&apos;t process the convolver, instead simply buffer in the pre-delay
&gt; +
&gt; +        // While buffering the pre-delay, we still need to update our index
&gt; +        m_accumulationBuffer-&gt;updateReadIndex(&amp;m_accumulationReadIndex, framesToProcess);
&gt; +    } else {
&gt; +        // Now, run the convolution (into the delay buffer)
&gt; +        // An expensive FFT will happen every (fftSize/2) frames
&gt; +        // We process in-place here...
&gt; +        m_convolver-&gt;process(&amp;m_fftKernel,
&gt; +                             preDelayedSourceP,
&gt; +                             tempP,
&gt; +                             framesToProcess);
&gt; +
&gt; +        // Now accumulate into reverb&apos;s accumulation buffer
&gt; +        // FIXME : really need to have locking mechanism here!!
&gt; +        writeIndex = m_accumulationBuffer-&gt;accumulate(tempP,
&gt; +                                                      framesToProcess,
&gt; +                                                      &amp;m_accumulationReadIndex,
&gt; +                                                      m_postDelayLength);
&gt; +    }
&gt; +
&gt; +    // Finally copy input to pre-delay
&gt; +    if (m_preDelayLength &gt; 0) {
&gt; +        memcpy(preDelayedSourceP, sourceP, sizeof(float) * framesToProcess);
&gt; +        m_preReadWriteIndex += framesToProcess;
&gt; +
&gt; +        if (m_preReadWriteIndex &gt;= m_preDelayLength)
&gt; +            m_preReadWriteIndex = 0; // should only be &lt;=
&gt; +    }
&gt; +
&gt; +#if 0

Typically we like to avoid dead code in the tree like this.  Has this perhaps served its purpose, so we can get rid of it?

&gt; +    // TESTING - sanity check
&gt; +    int timelineReadFrame = m_accumulationBuffer-&gt;readTimeFrame();
&gt; +    int timelineWriteFrame = m_accumulationReadTimeFrame + m_postDelayLength;
&gt; +
&gt; +    // printf(&quot;%p %p: ReverbConvolverStage::process(%d) : (%d \t %d)\n&quot;, pthread_self(), this, m_fftKernel.fftSize(), timelineWriteFrame, timelineReadFrame);
&gt; +
&gt; +    if (timelineReadFrame &gt; timelineWriteFrame)
&gt; +        printf(&quot;%p %p: ReverbConvolverStage::process(%d) : (%d \t %d)\n&quot;, pthread_self(), this, m_fftKernel.fftSize(), timelineWriteFrame, timelineReadFrame);
&gt; +
&gt; +    if (timelineWriteFrame &gt; timelineReadFrame + m_impulseResponseLength)
&gt; +        printf(&quot;%p %p: ReverbConvolverStage::process(%d) : (%d \t %d)\n&quot;, pthread_self(), this, m_fftKernel.fftSize(), timelineWriteFrame, timelineReadFrame);
&gt; +#endif
&gt; +
&gt; +    m_accumulationReadTimeFrame += framesToProcess;
&gt; +    m_framesProcessed += framesToProcess;
&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::reset()
&gt; +{
&gt; +    m_convolver-&gt;reset();
&gt; +    m_preDelayBuffer.zero();
&gt; +    m_accumulationReadIndex = 0;
&gt; +    m_inputReadIndex = 0;
&gt; +    m_framesProcessed = 0;
&gt; +    m_accumulationReadTimeFrame = 0;
&gt; +}
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +
&gt; +ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_length(length)
&gt; +    , m_readIndex(0)
&gt; +    , m_readTimeFrame(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::readAndClear(float* destP, size_t nframes)
&gt; +{
&gt; +    assert(m_readIndex &lt;= m_length);
&gt; +    size_t framesAvailable = m_length - m_readIndex;
&gt; +    size_t nframes1 = (nframes &lt;= framesAvailable) ? nframes : framesAvailable;
&gt; +    size_t nframes2 = nframes - nframes1;
&gt; +
&gt; +    float* sourceP = m_buffer;
&gt; +    memcpy(destP, sourceP + m_readIndex, sizeof(float) * nframes1);
&gt; +    memset(sourceP + m_readIndex, 0, sizeof(float) * nframes1);
&gt; +
&gt; +    // Handle wrap-around if necessary
&gt; +    if (nframes2 &gt; 0) {
&gt; +        memcpy(destP + nframes1, sourceP, sizeof(float) * nframes2);
&gt; +        memset(sourceP, 0, sizeof(float) * nframes2);
&gt; +    }
&gt; +
&gt; +    m_readIndex = (m_readIndex + nframes) % m_length;
&gt; +    m_readTimeFrame += nframes;
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::updateReadIndex(int* readIndex, size_t nframes)
&gt; +{
&gt; +    // Update caller&apos;s |readIndex|
&gt; +    *readIndex = (*readIndex + nframes) % m_length;
&gt; +}
&gt; +
&gt; +int ReverbAccumulationBuffer::accumulate(float* sourceP,
&gt; +                                         size_t nframes,
&gt; +                                         int* readIndex,
&gt; +                                         size_t delayFrames)
&gt; +{
&gt; +    size_t writeIndex = (*readIndex + delayFrames) % m_length;
&gt; +
&gt; +    // Update caller&apos;s |readIndex|
&gt; +    *readIndex = (*readIndex + nframes) % m_length;
&gt; +
&gt; +    assert(writeIndex &lt;= m_length);
&gt; +    size_t framesAvailable = m_length - writeIndex;
&gt; +    size_t nframes1 = (nframes &lt;= framesAvailable) ? nframes : framesAvailable;
&gt; +    size_t nframes2 = nframes - nframes1;
&gt; +
&gt; +    float* destP = m_buffer;
&gt; +
&gt; +    vadd(sourceP,
&gt; +         1,
&gt; +         destP + writeIndex,
&gt; +         1,
&gt; +         destP + writeIndex,
&gt; +         1,
&gt; +         nframes1);
&gt; +
&gt; +    // Handle wrap-around if necessary
&gt; +    if (nframes2 &gt; 0) {
&gt; +        vadd(sourceP + nframes1,
&gt; +             1,
&gt; +             destP,
&gt; +             1,
&gt; +             destP,
&gt; +             1,
&gt; +             nframes2);

Don&apos;t split

&gt; +    }
&gt; +
&gt; +    return writeIndex;
&gt; +}
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

This isn&apos;t really WebKit&apos;s style.

&gt; +
&gt; +ReverbInputBuffer::ReverbInputBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_length(length)
&gt; +    , m_writeIndex(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::write(float* sourceP, size_t nframes)
&gt; +{
&gt; +    memcpy(m_buffer.data() + m_writeIndex, sourceP, sizeof(float) * nframes);
&gt; +
&gt; +    m_writeIndex += nframes;
&gt; +    assert(m_writeIndex &lt;= m_length);
&gt; +
&gt; +    if (m_writeIndex &gt;= m_length)
&gt; +        m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +float* ReverbInputBuffer::directReadFrom(int* index, size_t nframes)
&gt; +{
&gt; +    assert(*index &gt;= 0 &amp;&amp; *index + nframes &lt;= m_length);
&gt; +    float* sourceP = m_buffer;
&gt; +    float* p = sourceP + *index;
&gt; +
&gt; +    // Update index
&gt; +    *index = (*index + nframes) % m_length;
&gt; +
&gt; +    return p;
&gt; +}
&gt; +
&gt; +} // namespace WebCore
&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.h b/WebCore/platform/audio/ReverbConvolver.h
&gt; new file mode 100644
&gt; index 0000000..e37ccf9
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.h
&gt; @@ -0,0 +1,226 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolver_h
&gt; +#define ReverbConvolver_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTConvolver.h&quot;
&gt; +#include &lt;pthread.h&gt;

There&apos;s thread abstractions in wtf.  Please use those.

&gt; +#include &lt;wtf/Vector.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class AudioChannel;
&gt; +class ReverbConvolver;
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// ReverbAccumulationBuffer is a circular delay buffer with one client reading
&gt; +// from it and multiple clients writing/accumulating to it at different delay
&gt; +// offsets from the read position.  The read operation will zero the memory
&gt; +// just read from the buffer, so it will be ready for accumulation the next
&gt; +// time around.
&gt; +//
&gt; +class ReverbAccumulationBuffer {

Each class should have its own .h file and .cpp file.

&gt; +public:
&gt; +    ReverbAccumulationBuffer(size_t length);
&gt; +
&gt; +    // This will read from, then clear-out |nframes|
&gt; +    void readAndClear(float* destP, size_t nframes);
&gt; +
&gt; +    // Each ReverbConvolverStage will accumulate its output at the appropriate delay from the read position.
&gt; +    // We need to pass in and update |readIndex| here, since each ReverbConvolverStage may be running in
&gt; +    // a different thread than the realtime thread calling ReadAndClear() and maintaining |m_readIndex|
&gt; +    // Returns the |writeIndex| where the accumulation took place
&gt; +    int accumulate(float* sourceP,
&gt; +                   size_t nframes,
&gt; +                   int* readIndex,
&gt; +                   size_t delayFrames);

Don&apos;t split things onto multiple lines like this unless you have a _really_ good reason.

&gt; +
&gt; +    size_t readIndex() const { return m_readIndex; }
&gt; +    size_t readTimeFrame() const { return m_readTimeFrame; }
&gt; +
&gt; +    void updateReadIndex(int* readIndex, size_t nframes);
&gt; +
&gt; +    void reset()
&gt; +    {
&gt; +        m_buffer.zero();
&gt; +        m_readIndex = 0;
&gt; +        m_readTimeFrame = 0;
&gt; +    }
&gt; +
&gt; +private:
&gt; +    AudioFloatArray m_buffer;
&gt; +    size_t m_length;
&gt; +    size_t m_readIndex;
&gt; +    size_t m_readTimeFrame; // for debugging (frame on continuous timeline)
&gt; +};
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// ReverbInputBuffer is used to buffer input samples for deferred processing by the background threads
&gt; +class ReverbInputBuffer {
&gt; +public:
&gt; +    ReverbInputBuffer(size_t length);
&gt; +
&gt; +    // The realtime audio thread keeps writing samples here.
&gt; +    // The assumption is that the buffer&apos;s length is evenly divisible by |nframes|  (for nearly all cases this will be fine)
&gt; +    // FIXME : remove |nframes| restriction...

Use FIXME: not FIXME :.  Here and lots of places.

&gt; +    void write(float* sourceP, size_t nframes);
&gt; +
&gt; +    // Background threads can call this to check if there&apos;s anything to read...
&gt; +    // FIXME : create better system to check for buffer overruns / error conditions...
&gt; +    size_t writeIndex() const { return m_writeIndex; }
&gt; +
&gt; +    // The individual background threads read here (and hope that they can keep up with the buffer writing)
&gt; +    // |index| is updated with the next index to read from...
&gt; +    // The assumption is that the buffer&apos;s length is evenly divisible by |nframes|
&gt; +    // FIXME : remove |nframes| restriction...
&gt; +    float* directReadFrom(int* index, size_t nframes);
&gt; +
&gt; +    void reset()
&gt; +    {
&gt; +        m_buffer.zero();
&gt; +        m_writeIndex = 0;
&gt; +    }
&gt; +
&gt; +private:
&gt; +    AudioFloatArray m_buffer;
&gt; +    size_t m_length;
&gt; +    size_t m_writeIndex;
&gt; +};
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +// A ReverbConvolverStage represents the convolution associated with a sub-section of a large impulse response.
&gt; +// It incorporates a delay line to account for the offset of the sub-section within the larger impulse response.
&gt; +class ReverbConvolverStage {
&gt; +public:
&gt; +    // |renderPhase| is useful to know so that we can manipulate the
&gt; +    // pre versus post delay so that stages will perform their heavy work
&gt; +    // (FFT processing) on different slices to balance the load in a real-time thread
&gt; +    ReverbConvolverStage(float* impulseResponse,
&gt; +                         size_t responseLength,
&gt; +                         size_t reverbTotalLatency,
&gt; +                         size_t stageOffset,
&gt; +                         size_t stageLength,
&gt; +                         size_t fftSize,
&gt; +                         size_t renderPhase,
&gt; +                         size_t renderSliceSize,
&gt; +                         ReverbAccumulationBuffer* accumulationBuffer);
&gt; +
&gt; +    virtual ~ReverbConvolverStage();
&gt; +
&gt; +    // WARNING: |framesToProcess| must be such that it evenly divides the delay buffer size (stage_offset)
&gt; +    void process(float* sourceP, size_t framesToProcess);
&gt; +
&gt; +    void processInBackground(ReverbConvolver* convolver, size_t framesToProcess);
&gt; +
&gt; +    void reset();
&gt; +
&gt; +    // Useful for background processing
&gt; +    int inputReadIndex() const { return m_inputReadIndex; }
&gt; +
&gt; +private:
&gt; +    FFTFrame m_fftKernel;
&gt; +    FFTConvolver* m_convolver;
&gt; +
&gt; +    AudioFloatArray m_preDelayBuffer;
&gt; +
&gt; +    ReverbAccumulationBuffer* m_accumulationBuffer;
&gt; +    int m_accumulationReadIndex;
&gt; +    int m_inputReadIndex;
&gt; +
&gt; +    int m_accumulationReadTimeFrame; // for testing (frame on continuous timeline)
&gt; +
&gt; +    size_t m_preDelayLength;
&gt; +    size_t m_postDelayLength;
&gt; +    size_t m_preReadWriteIndex;
&gt; +    size_t m_framesProcessed;
&gt; +
&gt; +    AudioFloatArray m_tempBuffer;
&gt; +
&gt; +    size_t m_impulseResponseLength;
&gt; +};
&gt; +
&gt; +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; +class ReverbConvolver {
&gt; +public:
&gt; +    // |maxFFTSize| can be adjusted (from say 2048 to 32768) depending on how much precision is necessary.
&gt; +    // For certain tweaky de-convolving applications the phase errors add up quickly and lead to non-sensical results with
&gt; +    // larger FFT sizes and single-precision floats.  In these cases 2048 is a good size.
&gt; +    // If not doing multi-threaded convolution, then should not go &gt; 8192.
&gt; +    ReverbConvolver(AudioChannel* impulseResponse,
&gt; +                    size_t renderSliceSize,
&gt; +                    size_t maxFFTSize,
&gt; +                    size_t convolverRenderPhase,
&gt; +                    bool useBackgroundThreads);
&gt; +
&gt; +    virtual ~ReverbConvolver();
&gt; +
&gt; +    void process(float* sourceP,
&gt; +                 float* destP,
&gt; +                 size_t framesToProcess);
&gt; +
&gt; +    void reset();
&gt; +
&gt; +    size_t impulseResponseLength();
&gt; +
&gt; +    void backgroundThreadEntry();
&gt; +    ReverbInputBuffer&amp; inputBuffer() { return m_inputBuffer; }
&gt; +
&gt; +    bool useBackgroundThreads() const { return m_useBackgroundThreads; }
&gt; +
&gt; +private:
&gt; +    Vector&lt;ReverbConvolverStage*&gt; m_stages;
&gt; +    Vector&lt;ReverbConvolverStage*&gt; m_backgroundStages;
&gt; +    size_t m_impulseResponseLength;
&gt; +
&gt; +    ReverbAccumulationBuffer m_accumulationBuffer;
&gt; +
&gt; +    // For multithreading
&gt; +    ReverbInputBuffer m_inputBuffer;
&gt; +
&gt; +    // We&apos;re given a rendering hint, so the FFTs can be optimized to not all occur at the same time
&gt; +    // (very bad when rendering on a real-time thread)
&gt; +    size_t m_renderSliceSize;
&gt; +
&gt; +    // First stage will be of size |m_minFFTSize|.  Each next stage will be twice as big until we hit |m_maxFFTSize|
&gt; +    size_t m_minFFTSize;
&gt; +    size_t m_maxFFTSize;
&gt; +
&gt; +    // But don&apos;t exceed this size in the real-time thread (if we&apos;re doing background processing)
&gt; +    size_t m_maxRealtimeFFTSize;
&gt; +
&gt; +    // FIXME : use thread abstraction (assuming pthreads here)
&gt; +    bool m_useBackgroundThreads;
&gt; +    pthread_t m_backgroundThread;
&gt; +    bool m_wantsToExit;
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbConvolver_h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199912</commentid>
    <comment_count>5</comment_count>
      <attachid>50748</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-15 16:12:46 -0700</bug_when>
    <thetext>Created attachment 50748
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199913</commentid>
    <comment_count>6</comment_count>
      <attachid>50749</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-15 16:14:53 -0700</bug_when>
    <thetext>Created attachment 50749
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199914</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-15 16:16:09 -0700</bug_when>
    <thetext>Hi Jeremy,</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199923</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-15 16:23:51 -0700</bug_when>
    <thetext>Hi Jeremy, thanks very much for your review!

I tried carefully to address your style comments, but you can check and maybe you&apos;ll find a few more :)

You had two more complex questions which I&apos;ll try to address:

&gt; How was this measured?  On what platforms?  How will we make sure that this
&gt; stays close to reality?  (I.e. can we make a layout test that verifies this or
&gt; something?)

I added some more comments here.  Later on in the code I had a block which
was #if 0 for testing which could at some point be part of a test to make sure the background thread is working properly.  For now I&apos;ve removed this &quot;dead&quot; code.  For a layout test, we would have to create a &quot;special&quot; testing javascript API which could report any problems back.  Or maybe there&apos;s a simpler way...


&gt; Is any such &quot;command line tool&quot; intended to be upstreamed?  If not, this
&gt; support should be removed.

I believe that we should, since the tools are very important for any javascript developers wanting to create their own custom impulse responses.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200813</commentid>
    <comment_count>9</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-17 08:46:46 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; Hi Jeremy, thanks very much for your review!
&gt; 
&gt; I tried carefully to address your style comments, but you can check and maybe
&gt; you&apos;ll find a few more :)
&gt; 
&gt; You had two more complex questions which I&apos;ll try to address:
&gt; 
&gt; &gt; How was this measured?  On what platforms?  How will we make sure that this
&gt; &gt; stays close to reality?  (I.e. can we make a layout test that verifies this or
&gt; &gt; something?)
&gt; 
&gt; I added some more comments here.  Later on in the code I had a block which
&gt; was #if 0 for testing which could at some point be part of a test to make sure
&gt; the background thread is working properly.  For now I&apos;ve removed this &quot;dead&quot;
&gt; code.  For a layout test, we would have to create a &quot;special&quot; testing
&gt; javascript API which could report any problems back.  Or maybe there&apos;s a
&gt; simpler way...

Yeah, normally you add special methods to the layoutTestController.  Your code might be a good candidate for unit testing, though.  I believe there&apos;s some unit testing being done now on WebCore code.  If so, it&apos;d be great if we could plug into whatever frameworks are available.  Ping fishd/dglazkov about this. 
 
&gt; &gt; Is any such &quot;command line tool&quot; intended to be upstreamed?  If not, this
&gt; &gt; support should be removed.
&gt; 
&gt; I believe that we should, since the tools are very important for any javascript
&gt; developers wanting to create their own custom impulse responses.

Sounds good.  Lets try to keep the footprint of extra code required for this to a minimum though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200829</commentid>
    <comment_count>10</comment_count>
      <attachid>50749</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-17 09:47:25 -0700</bug_when>
    <thetext>Comment on attachment 50749
Patch

More comments.  Still haven&apos;t really looked at the semantics of the code...just the syntax.


&gt; diff --git a/WebCore/platform/audio/ReverbAccumulationBuffer.cpp b/WebCore/platform/audio/ReverbAccumulationBuffer.cpp
&gt; new file mode 100644
&gt; index 0000000..a0e0dc5
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbAccumulationBuffer.cpp
&gt; @@ -0,0 +1,101 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;

Is this file mac specific?

&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_length(length)
&gt; +    , m_readIndex(0)
&gt; +    , m_readTimeFrame(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::readAndClear(float* destP, size_t nframes)
&gt; +{
&gt; +    ASSERT(m_readIndex &lt;= m_length);
&gt; +    size_t framesAvailable = m_length - m_readIndex;
&gt; +    size_t nframes1 = (nframes &lt;= framesAvailable) ? nframes : framesAvailable;
&gt; +    size_t nframes2 = nframes - nframes1;
&gt; +
&gt; +    float* sourceP = m_buffer;
&gt; +    memcpy(destP, sourceP + m_readIndex, sizeof(float) * nframes1);
&gt; +    memset(sourceP + m_readIndex, 0, sizeof(float) * nframes1);
&gt; +
&gt; +    // Handle wrap-around if necessary
&gt; +    if (nframes2 &gt; 0) {
&gt; +        memcpy(destP + nframes1, sourceP, sizeof(float) * nframes2);
&gt; +        memset(sourceP, 0, sizeof(float) * nframes2);
&gt; +    }
&gt; +
&gt; +    m_readIndex = (m_readIndex + nframes) % m_length;
&gt; +    m_readTimeFrame += nframes;
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::updateReadIndex(int* readIndex, size_t nframes)
&gt; +{
&gt; +    // Update caller&apos;s |readIndex|
&gt; +    *readIndex = (*readIndex + nframes) % m_length;
&gt; +}
&gt; +
&gt; +int ReverbAccumulationBuffer::accumulate(float* sourceP, size_t nframes, int* readIndex, size_t delayFrames)
&gt; +{
&gt; +    size_t writeIndex = (*readIndex + delayFrames) % m_length;
&gt; +
&gt; +    // Update caller&apos;s |readIndex|
&gt; +    *readIndex = (*readIndex + nframes) % m_length;
&gt; +
&gt; +    ASSERT(writeIndex &lt;= m_length);
&gt; +    size_t framesAvailable = m_length - writeIndex;
&gt; +    size_t nframes1 = (nframes &lt;= framesAvailable) ? nframes : framesAvailable;
&gt; +    size_t nframes2 = nframes - nframes1;
&gt; +
&gt; +    float* destP = m_buffer;
&gt; +
&gt; +    vadd(sourceP, 1, destP + writeIndex, 1, destP + writeIndex, 1, nframes1);
&gt; +
&gt; +    // Handle wrap-around if necessary
&gt; +    if (nframes2 &gt; 0)
&gt; +        vadd(sourceP + nframes1, 1, destP, 1, destP, 1, nframes2);
&gt; +
&gt; +    return writeIndex;
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::reset()
&gt; +{
&gt; +    m_buffer.zero();
&gt; +    m_readIndex = 0;
&gt; +    m_readTimeFrame = 0;
&gt; +}
&gt; +
&gt; +} // namespace WebCore
&gt; diff --git a/WebCore/platform/audio/ReverbAccumulationBuffer.h b/WebCore/platform/audio/ReverbAccumulationBuffer.h
&gt; new file mode 100644
&gt; index 0000000..6a5a65c
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbAccumulationBuffer.h
&gt; @@ -0,0 +1,68 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbAccumulationBuffer_h
&gt; +#define ReverbAccumulationBuffer_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +// ReverbAccumulationBuffer is a circular delay buffer with one client reading from it and multiple clients
&gt; +// writing/accumulating to it at different delay offsets from the read position.  The read operation will zero the memory
&gt; +// just read from the buffer, so it will be ready for accumulation the next time around.
&gt; +class ReverbAccumulationBuffer {
&gt; +public:
&gt; +    ReverbAccumulationBuffer(size_t length);

This should be private and you should have a ::create() factory (static function) that&apos;s public.

&gt; +
&gt; +    // This will read from, then clear-out |nframes|
&gt; +    void readAndClear(float* destP, size_t nframes);
&gt; +
&gt; +    // Each ReverbConvolverStage will accumulate its output at the appropriate delay from the read position.
&gt; +    // We need to pass in and update |readIndex| here, since each ReverbConvolverStage may be running in
&gt; +    // a different thread than the realtime thread calling ReadAndClear() and maintaining |m_readIndex|
&gt; +    // Returns the |writeIndex| where the accumulation took place
&gt; +    int accumulate(float* sourceP, size_t nframes, int* readIndex, size_t delayFrames);
&gt; +
&gt; +    size_t readIndex() const { return m_readIndex; }
&gt; +    void updateReadIndex(int* readIndex, size_t nframes);
&gt; +
&gt; +    size_t readTimeFrame() const { return m_readTimeFrame; }
&gt; +
&gt; +    void reset();
&gt; +
&gt; +private:
&gt; +    AudioFloatArray m_buffer;
&gt; +    size_t m_length;
&gt; +    size_t m_readIndex;
&gt; +    size_t m_readTimeFrame; // for debugging (frame on continuous timeline)
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbAccumulationBuffer_h
&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.cpp b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; new file mode 100644
&gt; index 0000000..d1bf559
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; @@ -0,0 +1,196 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;AudioBus.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +const int InputBufferSize = 8 * 16384;
&gt; +
&gt; +// We only process the leading portion of the impulse response in the real-time thread.  We don&apos;t exceed this length.
&gt; +// It turns out then, that the background thread has about 278msec of scheduling slop.
&gt; +// Empirically, this has been found to be a good compromise between giving enough time for scheduling slop,
&gt; +// while still minimizing the amount of processing done in the primary (high-priority) thread.
&gt; +// This was found to be a good value on Mac OS X, and may work well on other platforms as well, assuming
&gt; +// the very rough scheduling latencies are similar on these time-scales.  Of course, this code may need to be
&gt; +// tuned for individual platforms if this assumption is found to be incorrect.
&gt; +const size_t RealtimeFrameLimit = 8192  + 4096; // ~278msec @ 44.1KHz

Still not super happy about this solution, but I guess we should wait until it actually needs per-platform tuning to add in such code.

&gt; +const size_t MinFFTSize = 256;
&gt; +const size_t MaxRealtimeFFTSize = 2048;
&gt; +
&gt; +static void* BackgroundThreadDispatch(void* threadData)
&gt; +{
&gt; +    ReverbConvolver* reverbConvolver = static_cast&lt;ReverbConvolver*&gt;(threadData);
&gt; +    reverbConvolver-&gt;backgroundThreadEntry();
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads)
&gt; +    : m_impulseResponseLength(impulseResponse-&gt;frameSize())
&gt; +    , m_accumulationBuffer(impulseResponse-&gt;frameSize() + renderSliceSize)
&gt; +    , m_inputBuffer(InputBufferSize)
&gt; +    , m_renderSliceSize(renderSliceSize)
&gt; +    , m_useBackgroundThreads(useBackgroundThreads)
&gt; +    , m_wantsToExit(false)
&gt; +{
&gt; +    m_minFFTSize = MinFFTSize; // First stage will have this size - successive stages will double in size each time
&gt; +    m_maxFFTSize = maxFFTSize; // until we hit |m_maxFFTSize|

nit: I&apos;m not aware of any other part of the code that uses |&apos;s and I think it&apos;s pretty clear m_maxFFTSize is a variable.  If you can find other places in the code that use them or if there are individual cases that are hard to read without them, go ahead and leave them in.  Otherwise, please remove.

And why aren&apos;t these initialized up above?

&gt; +
&gt; +    // If we are using background threads then don&apos;t exceed this FFT size for the
&gt; +    // stages which run in the real-time thread.  This avoids having only one or two
&gt; +    // large stages (size 16384 or so) at the end which take a lot of time every several
&gt; +    // processing slices.  This way we amortize the cost over more processing slices.
&gt; +    m_maxRealtimeFFTSize = MaxRealtimeFFTSize;

Even these probably should be initialized in the first part of the constructor, but since these comments are long, it kind of makes sense why you did this, I suppose.

&gt; +
&gt; +    // For the moment, a good way to know if we have real-time constraint is to check if we&apos;re using background threads.
&gt; +    // Otherwise, assume we&apos;re being run from a command-line tool.
&gt; +    bool hasRealtimeConstraint = useBackgroundThreads;
&gt; +
&gt; +    float* response = impulseResponse-&gt;data();
&gt; +    size_t totalResponseLength = impulseResponse-&gt;frameSize();
&gt; +    ReverbAccumulationBuffer* accumBufferP = &amp;m_accumulationBuffer;
&gt; +
&gt; +    // Because we&apos;re not using direct-convolution in the leading portion, the reverb has an overall latency of half the first-stage FFT size
&gt; +    size_t reverbTotalLatency = m_minFFTSize / 2;
&gt; +
&gt; +    size_t stageOffset = 0;
&gt; +    int i = 0;
&gt; +    size_t fftSize = m_minFFTSize;
&gt; +    while (stageOffset &lt; totalResponseLength) {
&gt; +        size_t stageSize = fftSize / 2;
&gt; +
&gt; +        // For the last stage, it&apos;s possible that |stageOffset| is such that we&apos;re straddling the end
&gt; +        // of the impulse response buffer (if we use |stageSize|), so reduce the last stage&apos;s length...
&gt; +        if (stageSize + stageOffset &gt; totalResponseLength)
&gt; +            stageSize = totalResponseLength - stageOffset;
&gt; +
&gt; +        // This &quot;staggers&quot; the time when each FFT happens so they don&apos;t all happen at the same time
&gt; +        int renderPhase = convolverRenderPhase + i * renderSliceSize;
&gt; +
&gt; +        ReverbConvolverStage* stage = new ReverbConvolverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSize, renderPhase, renderSliceSize, accumBufferP);

This should be an OwnPtr.

&gt; +
&gt; +        bool isBackgroundStage = false;
&gt; +
&gt; +        if (stageOffset &lt;= RealtimeFrameLimit)
&gt; +            m_stages.append(stage);
&gt; +        else {
&gt; +            if (this-&gt;useBackgroundThreads()) {
&gt; +                m_backgroundStages.append(stage);
&gt; +                isBackgroundStage = true;
&gt; +            } else
&gt; +                m_stages.append(stage);
&gt; +        }
&gt; +
&gt; +        stageOffset += stageSize;
&gt; +        i++;

++i.

&gt; +
&gt; +        // Figure out next FFT size
&gt; +        fftSize *= 2;
&gt; +        if (hasRealtimeConstraint &amp;&amp; !isBackgroundStage &amp;&amp; fftSize &gt; m_maxRealtimeFFTSize)
&gt; +            fftSize = m_maxRealtimeFFTSize;
&gt; +        if (fftSize &gt; m_maxFFTSize)
&gt; +            fftSize = m_maxFFTSize;
&gt; +    }
&gt; +
&gt; +    // Start up background thread
&gt; +    // FIXME: would be better to up the thread priority here.  It doesn&apos;t need to be real-time, but higher than the default...
&gt; +    if (this-&gt;useBackgroundThreads() &amp;&amp; m_backgroundStages.size() &gt; 0)
&gt; +        m_backgroundThread = createThread(BackgroundThreadDispatch, this, &quot;convolution background thread&quot;);
&gt; +    else
&gt; +        m_backgroundThread = 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::~ReverbConvolver()
&gt; +{
&gt; +    // Wait for background thread to stop
&gt; +    if (useBackgroundThreads() &amp;&amp; m_backgroundThread) {
&gt; +        m_wantsToExit = true;
&gt; +        waitForThreadCompletion(m_backgroundThread, 0);
&gt; +    }
&gt; +}
&gt; +
&gt; +void ReverbConvolver::backgroundThreadEntry()
&gt; +{
&gt; +    while (!m_wantsToExit) {
&gt; +        // Check to see if there&apos;s any more input to consume
&gt; +        int writeIndex = m_inputBuffer.writeIndex();
&gt; +
&gt; +        // Even though it doesn&apos;t seem like every stage needs to maintain its own version of |readIndex| 
&gt; +        // we do this in case we want to run in more than one background thread.
&gt; +        int readIndex;
&gt; +
&gt; +        while ((readIndex = m_backgroundStages[0]-&gt;inputReadIndex()) != writeIndex) { // FIXME: do better to detect buffer overrun...
&gt; +            // FIXME: remove hard-coded value
&gt; +            const int kSliceSize = 128;
&gt; +
&gt; +            // Accumulate contributions from each stage
&gt; +            for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +                m_backgroundStages[i]-&gt;processInBackground(this, kSliceSize);
&gt; +        }
&gt; +
&gt; +        // Sleep 10ms
&gt; +        usleep(10000); // FIXME: although it works well in practice, this really isn&apos;t ideal - could use wait/signal

There&apos;s probably something in wtf that&apos;ll do this for you now.  Please take a look and consider fixing this now.


&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.h b/WebCore/platform/audio/ReverbConvolver.h
&gt; new file mode 100644
&gt; index 0000000..8cc1d9e
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.h
&gt; @@ -0,0 +1,96 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolver_h
&gt; +#define ReverbConvolver_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTConvolver.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +#include &quot;ReverbConvolverStage.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/RefCounted.h&gt;
&gt; +#include &lt;wtf/Threading.h&gt;
&gt; +#include &lt;wtf/Vector.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class AudioChannel;
&gt; +
&gt; +class ReverbConvolver {
&gt; +public:
&gt; +    // |maxFFTSize| can be adjusted (from say 2048 to 32768) depending on how much precision is necessary.
&gt; +    // For certain tweaky de-convolving applications the phase errors add up quickly and lead to non-sensical results with
&gt; +    // larger FFT sizes and single-precision floats.  In these cases 2048 is a good size.
&gt; +    // If not doing multi-threaded convolution, then should not go &gt; 8192.
&gt; +    ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads);

Here and in all of your classes, the constructors should be private and you should have factory functions instead.  The factory functions should return either PassOwnPtr&lt;&gt; or PassRefPtr&lt;&gt;.  This minimizes the number of places where memory leaks can start and makes it clear whether it&apos;s ref counted or not.

&gt; +
&gt; +    virtual ~ReverbConvolver();

Doesn&apos;t seem like this needs to be virtual.  Only make it virtual if it&apos;s subclassed and needs it.

&gt; +
&gt; +    void process(float* sourceP, float* destP, size_t framesToProcess);
&gt; +
&gt; +    void reset();
&gt; +
&gt; +    size_t impulseResponseLength();
&gt; +
&gt; +    ReverbInputBuffer&amp; inputBuffer() { return m_inputBuffer; }

This should return a pointer.  Do not pass around references unless they&apos;re const.

&gt; +
&gt; +    bool useBackgroundThreads() const { return m_useBackgroundThreads; }
&gt; +
&gt; +    void backgroundThreadEntry();
&gt; +
&gt; +private:
&gt; +    Vector&lt;OwnPtr&lt;ReverbConvolverStage&gt; &gt; m_stages;
&gt; +    Vector&lt;OwnPtr&lt;ReverbConvolverStage&gt; &gt; m_backgroundStages;

Be careful with this stuff.  I checked and there are other cases of Vector&lt;OwnPtr&lt;&gt;&gt;&apos;s, but it seems a tad dangerous (in terms of accidentally claiming ownership and thus making the OwnPtr in the vector point to 0.  But, like I said, it&apos;s done elsewhere and you can certainly do it safely if you&apos;re just a little careful.

&gt; +    size_t m_impulseResponseLength;
&gt; +
&gt; +    ReverbAccumulationBuffer m_accumulationBuffer;
&gt; +
&gt; +    // For multithreading
&gt; +    ReverbInputBuffer m_inputBuffer;

The comment isn&apos;t very clear.

&gt; +
&gt; +    // We&apos;re given a rendering hint, so the FFTs can be optimized to not all occur at the same time
&gt; +    // (very bad when rendering on a real-time thread)
&gt; +    size_t m_renderSliceSize;
&gt; +
&gt; +    // First stage will be of size |m_minFFTSize|.  Each next stage will be twice as big until we hit |m_maxFFTSize|
&gt; +    size_t m_minFFTSize;
&gt; +    size_t m_maxFFTSize;
&gt; +
&gt; +    // But don&apos;t exceed this size in the real-time thread (if we&apos;re doing background processing)

In general, I&apos;d rather you used punctuation at the end of all sentences, but there&apos;s plenty who don&apos;t.  So it&apos;s up to you, I guess.

&gt; +    size_t m_maxRealtimeFFTSize;
&gt; +
&gt; +    bool m_useBackgroundThreads;
&gt; +    ThreadIdentifier m_backgroundThread;
&gt; +    bool m_wantsToExit;
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbConvolver_h
&gt; diff --git a/WebCore/platform/audio/ReverbConvolverStage.cpp b/WebCore/platform/audio/ReverbConvolverStage.cpp
&gt; new file mode 100644
&gt; index 0000000..cb6956d
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolverStage.cpp
&gt; @@ -0,0 +1,145 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolverStage.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbConvolverStage::ReverbConvolverStage(float* impulseResponse, size_t responseLength, size_t reverbTotalLatency, size_t stageOffset, size_t stageLength,
&gt; +                                           size_t fftSize, size_t renderPhase, size_t renderSliceSize, ReverbAccumulationBuffer* accumulationBuffer)
&gt; +    : m_fftKernel(fftSize)
&gt; +    , m_accumulationBuffer(accumulationBuffer)
&gt; +    , m_accumulationReadIndex(0)
&gt; +    , m_inputReadIndex(0)
&gt; +    , m_accumulationReadTimeFrame(0)
&gt; +    , m_impulseResponseLength(responseLength)
&gt; +{
&gt; +    m_fftKernel.doPaddedFFT(impulseResponse + stageOffset, stageLength);
&gt; +
&gt; +    m_convolver = new FFTConvolver(fftSize);
&gt; +
&gt; +    m_tempBuffer.allocate(renderSliceSize);
&gt; +
&gt; +    // The convolution stage at offset |stageOffset| needs to have a corresponding delay to cancel out the offset
&gt; +    size_t totalDelay = stageOffset + reverbTotalLatency;
&gt; +
&gt; +    // But, the FFT convolution itself incurs |fftSize| / 2 latency, so subtract this out...
&gt; +    size_t halfSize = fftSize / 2;
&gt; +    if (totalDelay &gt;= halfSize)
&gt; +        totalDelay -= halfSize;
&gt; +
&gt; +    // FIXME: DEAL with case when total delay is less than fftSize/2....
&gt; +
&gt; +    // We divide up the total delay, into pre and post delay sections so that we can
&gt; +    // schedule at exactly the moment when the FFT will happen.  This is coordinated
&gt; +    // with the other stages, so they don&apos;t all do their FFTs at the same time...
&gt; +
&gt; +    int m = (halfSize &lt;= totalDelay) ? halfSize : totalDelay;
&gt; +    m_preDelayLength = (totalDelay &gt; 0) ? (renderPhase % m) : 0;
&gt; +
&gt; +    if (m_preDelayLength &gt; totalDelay)
&gt; +        m_preDelayLength = 0;
&gt; +
&gt; +    m_postDelayLength = totalDelay - m_preDelayLength;
&gt; +    m_preReadWriteIndex = 0;
&gt; +    m_framesProcessed = 0; // total frames processed so far
&gt; +
&gt; +    m_preDelayBuffer.allocate(m_preDelayLength &lt; fftSize ? fftSize : m_preDelayLength);
&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::processInBackground(ReverbConvolver* convolver,
&gt; +                                               size_t framesToProcess)

no need to split lines

&gt; +{
&gt; +    ReverbInputBuffer&amp; inputBuffer = convolver-&gt;inputBuffer();
&gt; +    float* sourceP = inputBuffer.directReadFrom(&amp;m_inputReadIndex, framesToProcess);
&gt; +    process(sourceP, framesToProcess);
&gt; +}
&gt; +
&gt; +void  ReverbConvolverStage::process(float* sourceP,
&gt; +                                    size_t framesToProcess)

no need to split lines</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200924</commentid>
    <comment_count>11</comment_count>
      <attachid>50945</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-17 13:01:57 -0700</bug_when>
    <thetext>Created attachment 50945
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200943</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-17 13:35:07 -0700</bug_when>
    <thetext>Hi Jeremy, I addressed a bunch of your comments.  Once again, I really appreciate your help.  Here are some comments on the remaining issues:

&gt; Is this file mac specific?

No, it&apos;s a cross-platform abstraction which declares the necessary DSP functions
It&apos;s in another patch:
https://bugs.webkit.org/show_bug.cgi?id=34452

&gt;This should be private and you should have a ::create() factory (static
&gt;function) that&apos;s public.

This is in regards to ReverbAccumulationBuffer which is a helper class only used by ReverbConvolver.  It&apos;s used directly as a composed member object there, so the object lifetime is taken care of automatically.  Dimitri Glazkov told me it&apos;s definitely OK to have helper classes which can be used as stack-based objects and directly as composed members of other classes with no need for ::create() and private constructor.

&gt; Still not super happy about this solution, but I guess we should wait until it
&gt; actually needs per-platform tuning to add in such code.

Yeah, I understand your feeling.  Unfortunately, this is the messy world of real-time systems where scheduler performance of different OS kernel&apos;s may come into play.  In this particular case, I think it will be OK.  But it&apos;s one of several things to be tested and tuned (if necessary) per-platform.

&gt; This should be an OwnPtr.

The pointer is being put either into m_backgroundStages or m_stages which are both Vector&lt;OwnPtr&lt;ReverbConvolverStage&gt; &gt;
I *did* make the local pointer into a PassOwnPtr&lt;ReverbConvolverStage&gt;
I found that the compiler was not happy if I used OwnPtr in the local variable in addition to the Vector...

&gt; There&apos;s probably something in wtf that&apos;ll do this for you now.  Please take a
&gt; look and consider fixing this now.

I hunted all over for a sleep(), usleep(), nanosleep() abstraction in wtf, but did not find it.  I think a good place to put one would be in &lt;wtf/Threading.h&gt;
But I&apos;m not sure how to implement that for all platforms yet.

&gt; Here and in all of your classes, the constructors should be private and you
&gt; should have factory functions instead.  The factory functions should return
&gt; either PassOwnPtr&lt;&gt; or PassRefPtr&lt;&gt;.  This minimizes the number of places &gt; where memory leaks can start and makes it clear whether it&apos;s ref counted or 
&gt; not.

Dimitri assured me that it&apos;s OK to not use ::create() methods / private-constructors (in order to be able to use as stack-based objects, composed member variables, etc.).  The case where it is required is when it will be ref-counted (RefPtr&lt;&gt;) which is not the case here.

&gt; Doesn&apos;t seem like this needs to be virtual.  Only make it virtual if it&apos;s
&gt; subclassed and needs it.

I *did* remove the virtual, but I tend to *always* use virtual for destructors unless I know for a fact that I need the object to occupy an exact number of bytes (to overlay a struct, for example) or if there are other clear performance reasons not to.  The reason is that it&apos;s very easy to create difficult to track down bugs if you later sub-class and forget the virtual.

&gt; Be careful with this stuff.  I checked and there are other cases of
&gt; Vector&lt;OwnPtr&lt;&gt;&gt;&apos;s, but it seems a tad dangerous (in terms of accidentally
&gt; claiming ownership and thus making the OwnPtr in the vector point to 0.  But,
&gt; like I said, it&apos;s done elsewhere and you can certainly do it safely if you&apos;re
&gt; just a little careful.

Yeah I&apos;m trying to be pretty paranoid when using this kind of stuff.  But, I&apos;m not sure what the alternative is here if you want to use OwnPtr, since it is indeed a Vector of them that I&apos;m keeping track of...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>200964</commentid>
    <comment_count>13</comment_count>
      <attachid>50957</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-17 14:17:00 -0700</bug_when>
    <thetext>Created attachment 50957
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202449</commentid>
    <comment_count>14</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-22 05:22:54 -0700</bug_when>
    <thetext>&gt; I *did* remove the virtual, but I tend to *always* use virtual for destructors
&gt; unless I know for a fact that I need the object to occupy an exact number of
&gt; bytes (to overlay a struct, for example) or if there are other clear
&gt; performance reasons not to.  The reason is that it&apos;s very easy to create
&gt; difficult to track down bugs if you later sub-class and forget the virtual.

Understood, but in general we try hard to avoid making things virtual in WebKit.  I also think it&apos;s a good habit to always double check whenever you subclass something that the parent has a virtual destructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202450</commentid>
    <comment_count>15</comment_count>
      <attachid>50957</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-22 05:30:08 -0700</bug_when>
    <thetext>Comment on attachment 50957
Patch

&gt; +ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads)
&gt; +    : m_impulseResponseLength(impulseResponse-&gt;frameSize())
&gt; +    , m_accumulationBuffer(impulseResponse-&gt;frameSize() + renderSliceSize)
&gt; +    , m_inputBuffer(InputBufferSize)
&gt; +    , m_renderSliceSize(renderSliceSize)
&gt; +    , m_minFFTSize(MinFFTSize) // First stage will have this size - successive stages will double in size each time
&gt; +    , m_maxFFTSize(maxFFTSize) // until we hit m_maxFFTSize
&gt; +    , m_useBackgroundThreads(useBackgroundThreads)
&gt; +    , m_wantsToExit(false)
&gt; +{
&gt; +    // If we are using background threads then don&apos;t exceed this FFT size for the
&gt; +    // stages which run in the real-time thread.  This avoids having only one or two
&gt; +    // large stages (size 16384 or so) at the end which take a lot of time every several
&gt; +    // processing slices.  This way we amortize the cost over more processing slices.
&gt; +    m_maxRealtimeFFTSize = MaxRealtimeFFTSize;
&gt; +
&gt; +    // For the moment, a good way to know if we have real-time constraint is to check if we&apos;re using background threads.
&gt; +    // Otherwise, assume we&apos;re being run from a command-line tool.
&gt; +    bool hasRealtimeConstraint = useBackgroundThreads;
&gt; +
&gt; +    float* response = impulseResponse-&gt;data();
&gt; +    size_t totalResponseLength = impulseResponse-&gt;frameSize();
&gt; +    ReverbAccumulationBuffer* accumBufferP = &amp;m_accumulationBuffer;
&gt; +
&gt; +    // Because we&apos;re not using direct-convolution in the leading portion, the reverb has an overall latency of half the first-stage FFT size
&gt; +    size_t reverbTotalLatency = m_minFFTSize / 2;
&gt; +
&gt; +    size_t stageOffset = 0;
&gt; +    int i = 0;
&gt; +    size_t fftSize = m_minFFTSize;
&gt; +    while (stageOffset &lt; totalResponseLength) {
&gt; +        size_t stageSize = fftSize / 2;
&gt; +
&gt; +        // For the last stage, it&apos;s possible that stageOffset is such that we&apos;re straddling the end
&gt; +        // of the impulse response buffer (if we use stageSize), so reduce the last stage&apos;s length...
&gt; +        if (stageSize + stageOffset &gt; totalResponseLength)
&gt; +            stageSize = totalResponseLength - stageOffset;
&gt; +
&gt; +        // This &quot;staggers&quot; the time when each FFT happens so they don&apos;t all happen at the same time
&gt; +        int renderPhase = convolverRenderPhase + i * renderSliceSize;
&gt; +
&gt; +        PassOwnPtr&lt;ReverbConvolverStage&gt; stage(new ReverbConvolverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSize, renderPhase, renderSliceSize, accumBufferP));

Always use ___Ptr&apos;s as member and automatic/local variables.  Use Pass___Ptr&apos;s as method parameters and return values.  You might want to re-read the PassRefPtr doc (just google that word) if you don&apos;t understand why.


&gt; +void ReverbConvolver::backgroundThreadEntry()
&gt; +{
&gt; +    while (!m_wantsToExit) {
&gt; +        // Check to see if there&apos;s any more input to consume
&gt; +        int writeIndex = m_inputBuffer.writeIndex();
&gt; +
&gt; +        // Even though it doesn&apos;t seem like every stage needs to maintain its own version of readIndex 
&gt; +        // we do this in case we want to run in more than one background thread.
&gt; +        int readIndex;
&gt; +
&gt; +        while ((readIndex = m_backgroundStages[0]-&gt;inputReadIndex()) != writeIndex) { // FIXME: do better to detect buffer overrun...
&gt; +            // FIXME: remove hard-coded value
&gt; +            const int kSliceSize = 128;
&gt; +
&gt; +            // Accumulate contributions from each stage
&gt; +            for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +                m_backgroundStages[i]-&gt;processInBackground(this, kSliceSize);
&gt; +        }
&gt; +
&gt; +        // Sleep 10ms
&gt; +        usleep(10000); // FIXME: although it works well in practice, this really isn&apos;t ideal - could use wait/signal

Sorry, what I was suggesting you do is make this use condition variables now rather than leaving it a FIXME.  WebCore/storage/StorageAreaSync does something like this IIRC.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202508</commentid>
    <comment_count>16</comment_count>
      <attachid>50957</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-22 08:31:33 -0700</bug_when>
    <thetext>Comment on attachment 50957
Patch

&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbAccumulationBuffer.cpp
&gt; @@ -0,0 +1,101 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_length(length)
&gt; +    , m_readIndex(0)
&gt; +    , m_readTimeFrame(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::readAndClear(float* destP, size_t nframes)

destP and nframes are not the best variables names.  Same goes for nframes1 and 2.  I don&apos;t think it gets too much in the way of readability here, but it&apos;s a good practice to get into...even if it means a bit more typing and thinking about what to name stuff.

&gt; +{
&gt; +    ASSERT(m_readIndex &lt;= m_length);
&gt; +    size_t framesAvailable = m_length - m_readIndex;
&gt; +    size_t nframes1 = (nframes &lt;= framesAvailable) ? nframes : framesAvailable;

min(nframes, framseAvailable)

&gt; +    size_t nframes2 = nframes - nframes1;
&gt; +
&gt; +    float* sourceP = m_buffer;
&gt; +    memcpy(destP, sourceP + m_readIndex, sizeof(float) * nframes1);
&gt; +    memset(sourceP + m_readIndex, 0, sizeof(float) * nframes1);
&gt; +
&gt; +    // Handle wrap-around if necessary
&gt; +    if (nframes2 &gt; 0) {
&gt; +        memcpy(destP + nframes1, sourceP, sizeof(float) * nframes2);
&gt; +        memset(sourceP, 0, sizeof(float) * nframes2);
&gt; +    }
&gt; +
&gt; +    m_readIndex = (m_readIndex + nframes) % m_length;

You could avoid the division by adding |m_readIndex = nframes2| in the if and adding an else to it that sets |m_readIndex += nframes1|.  Its probably over optimizing, but...  (Your choice.)

&gt; +    m_readTimeFrame += nframes;
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::updateReadIndex(int* readIndex, size_t nframes)
&gt; +{

First of all, this could be const.

Seconly, I&apos;m not sure whether this is better or it&apos;s better to do this logic in the caller.  If you had a length getter method, then you could just do this up one level.  On the other hand, I see this is a weird case of a more general pattern that you follow.  If you still think this is best, it&apos;s OK with me though.

&gt; +    // Update caller&apos;s readIndex
&gt; +    *readIndex = (*readIndex + nframes) % m_length;
&gt; +}
&gt; +
&gt; +int ReverbAccumulationBuffer::accumulate(float* sourceP, size_t nframes, int* readIndex, size_t delayFrames)
&gt; +{
&gt; +    size_t writeIndex = (*readIndex + delayFrames) % m_length;
&gt; +
&gt; +    // Update caller&apos;s readIndex
&gt; +    *readIndex = (*readIndex + nframes) % m_length;

If you change above, change this.




&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbInputBuffer.cpp
&gt; @@ -0,0 +1,70 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbInputBuffer::ReverbInputBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_length(length)
&gt; +    , m_writeIndex(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::write(float* sourceP, size_t nframes)
&gt; +{
&gt; +    memcpy(m_buffer.data() + m_writeIndex, sourceP, sizeof(float) * nframes);
&gt; +
&gt; +    m_writeIndex += nframes;
&gt; +    ASSERT(m_writeIndex &lt;= m_length);

Do this check before we potentially corrupt memory.  If it&apos;s over, that&apos;s really bad...right?  Maybe even use CRASH() here?  Otherwise you probably should handle this case more gracefully.

&gt; +
&gt; +    if (m_writeIndex &gt;= m_length)
&gt; +        m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +float* ReverbInputBuffer::directReadFrom(int* index, size_t nframes)
&gt; +{
&gt; +    ASSERT(*index &gt;= 0 &amp;&amp; *index + nframes &lt;= m_length);

ditto

&gt; +    float* sourceP = m_buffer;
&gt; +    float* p = sourceP + *index;
&gt; +
&gt; +    // Update index
&gt; +    *index = (*index + nframes) % m_length;
&gt; +
&gt; +    return p;
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::reset()
&gt; +{
&gt; +    m_buffer.zero();
&gt; +    m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +} // namespace WebCore
&gt; diff --git a/WebCore/platform/audio/ReverbInputBuffer.h b/WebCore/platform/audio/ReverbInputBuffer.h
&gt; new file mode 100644
&gt; index 0000000..0b80f42
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbInputBuffer.h
&gt; @@ -0,0 +1,66 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbInputBuffer_h
&gt; +#define ReverbInputBuffer_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +// ReverbInputBuffer is used to buffer input samples for deferred processing by the background threads

Period.  Here and elsewhere please.

&gt; +class ReverbInputBuffer {
&gt; +public:
&gt; +    ReverbInputBuffer(size_t length);
&gt; +
&gt; +    // The realtime audio thread keeps writing samples here.
&gt; +    // The assumption is that the buffer&apos;s length is evenly divisible by nframes  (for nearly all cases this will be fine)
&gt; +    // FIXME: remove nframes restriction...
&gt; +    void write(float* sourceP, size_t nframes);
&gt; +
&gt; +    // Background threads can call this to check if there&apos;s anything to read...
&gt; +    // FIXME: create better system to check for buffer overruns / error conditions...

I&apos;m not sure if this fixme is actually useful.

&gt; +    size_t writeIndex() const { return m_writeIndex; }
&gt; +
&gt; +    // The individual background threads read here (and hope that they can keep up with the buffer writing)
&gt; +    // index is updated with the next index to read from...
&gt; +    // The assumption is that the buffer&apos;s length is evenly divisible by nframes
&gt; +    // FIXME: remove nframes restriction...
&gt; +    float* directReadFrom(int* index, size_t nframes);
&gt; +
&gt; +    void reset();
&gt; +
&gt; +private:
&gt; +    AudioFloatArray m_buffer;
&gt; +    size_t m_length;

Doesn&apos;t the buffer itself know its length?

&gt; +    size_t m_writeIndex;
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbInputBuffer_h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202524</commentid>
    <comment_count>17</comment_count>
      <attachid>50957</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-22 09:07:40 -0700</bug_when>
    <thetext>Comment on attachment 50957
Patch

Some more...

&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolverStage.h
&gt; @@ -0,0 +1,85 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolverStage_h
&gt; +#define ReverbConvolverStage_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTConvolver.h&quot;

Forward declare rather than including since it&apos;s only an OwnPtr.

&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/PassOwnPtr.h&gt;

This isn&apos;t used.


Try to avoid adding includes to .h files whenever possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202758</commentid>
    <comment_count>18</comment_count>
      <attachid>51354</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-22 14:32:14 -0700</bug_when>
    <thetext>Created attachment 51354
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202770</commentid>
    <comment_count>19</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-22 14:45:56 -0700</bug_when>
    <thetext>Hi Jeremy, I&apos;ve addressed most of your comments.  Here are my comments about the others:

&gt;Always use ___Ptr&apos;s as member and automatic/local variables.  Use Pass___Ptr&apos;s
&gt;as method parameters and return values.  You might want to re-read the
&gt;PassRefPtr doc (just google that word) if you don&apos;t understand why.

I&apos;ve found that this can work with RefPtr, but not with OwnPtr (won&apos;t compile).  It looks like in the case of OwnPtr, it&apos;s not reference counted and you can&apos;t assign from one OwnPtr to another.  The current code does the right thing, but another option is to just forget the PassOwnPtr and use a straight pointer as the local variable.  It gets appended to a Vector&lt;OwnPtr&lt;&gt; &gt; so the memory management is handled.

&gt; Forward declare rather than including since it&apos;s only an OwnPtr.
In general I always try to follow that principle.  I was able to get rid of
#include &quot;FFTConvolver.h&quot;
but then had to add in
#include &quot;FFTFrame.h&quot;
since I&apos;m using object composition.
I was able to get rid of OwnPtr.h and PassOwnPtr.h though - thanks...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>202773</commentid>
    <comment_count>20</comment_count>
      <attachid>51358</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-22 14:52:37 -0700</bug_when>
    <thetext>Created attachment 51358
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203099</commentid>
    <comment_count>21</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-23 10:32:19 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Hi Jeremy, I&apos;ve addressed most of your comments.  Here are my comments about
&gt; the others:
&gt; 
&gt; &gt;Always use ___Ptr&apos;s as member and automatic/local variables.  Use Pass___Ptr&apos;s
&gt; &gt;as method parameters and return values.  You might want to re-read the
&gt; &gt;PassRefPtr doc (just google that word) if you don&apos;t understand why.
&gt; 
&gt; I&apos;ve found that this can work with RefPtr, but not with OwnPtr (won&apos;t compile).
&gt;  It looks like in the case of OwnPtr, it&apos;s not reference counted and you can&apos;t
&gt; assign from one OwnPtr to another.  The current code does the right thing, but
&gt; another option is to just forget the PassOwnPtr and use a straight pointer as
&gt; the local variable.  It gets appended to a Vector&lt;OwnPtr&lt;&gt; &gt; so the memory
&gt; management is handled.

The point of the OwnPtr is that it&apos;ll get deleted if you go out of scope.  I don&apos;t know what you&apos;re doing wrong here, but there are a LOT of examples in the code of how to do this properly.  Make sure you have PassOwnPtr.h included in the file.  It should know how to convert stuff from an OwnPtr to a PassOwnPtr.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203103</commentid>
    <comment_count>22</comment_count>
      <attachid>51358</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-23 10:41:37 -0700</bug_when>
    <thetext>Comment on attachment 51358
Patch

Getting really close on RevertAccumulationBuffer and ReverbInputBuffer.  You might want to split them into their own patch to make reviewing easier.  I&apos;ll look at the other half soon.


&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbAccumulationBuffer.cpp
&gt; @@ -0,0 +1,108 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbAccumulationBuffer::ReverbAccumulationBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_readIndex(0)
&gt; +    , m_readTimeFrame(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbAccumulationBuffer::readAndClear(float* destination, size_t numberOfFrames)

Thanks for making these variable names better...but I think the same can be said for a lot of the variable names in these files.  Can you please do a pass?  Spell things out and err on the side of variables being too long to make thing readable.

&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolverStage.h
&gt; @@ -0,0 +1,84 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolverStage_h
&gt; +#define ReverbConvolverStage_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTFrame.h&quot;

You should include wtf/OwnPtr since it&apos;s used below.

&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbInputBuffer.cpp
&gt; @@ -0,0 +1,77 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbInputBuffer::ReverbInputBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_writeIndex(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::write(float* sourceP, size_t numberOfFrames)
&gt; +{
&gt; +    size_t bufferLength = m_buffer.size();
&gt; +    bool isCopyGood = m_writeIndex + numberOfFrames &lt;= bufferLength;
&gt; +    ASSERT(isCopyGood);
&gt; +    if (!isCopyGood)

isCopySafe seems like a better name

&gt; +        return;
&gt; +        
&gt; +    memcpy(m_buffer.data() + m_writeIndex, sourceP, sizeof(float) * numberOfFrames);
&gt; +
&gt; +    m_writeIndex += numberOfFrames;
&gt; +    ASSERT(m_writeIndex &lt;= bufferLength);
&gt; +
&gt; +    if (m_writeIndex &gt;= bufferLength)
&gt; +        m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +float* ReverbInputBuffer::directReadFrom(int* index, size_t numberOfFrames)
&gt; +{
&gt; +    size_t bufferLength = m_buffer.size();
&gt; +    bool isPtrGood = *index &gt;= 0 &amp;&amp; *index + numberOfFrames &lt;= bufferLength;
&gt; +    ASSERT(isPtrGood);
&gt; +    float* sourceP = m_buffer;
&gt; +    float* p = isPtrGood ? sourceP + *index : 0; // pointer should always be good - force read from 0 to expose bug otherwise

Usually you spell out words like Pointer instead of using Ptr.

If your intention is to crash the program, using CRASH() is better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203155</commentid>
    <comment_count>23</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-23 12:46:20 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #19)
&gt; &gt; Hi Jeremy, I&apos;ve addressed most of your comments.  Here are my comments about
&gt; &gt; the others:
&gt; &gt; 
&gt; &gt; &gt;Always use ___Ptr&apos;s as member and automatic/local variables.  Use Pass___Ptr&apos;s
&gt; &gt; &gt;as method parameters and return values.  You might want to re-read the
&gt; &gt; &gt;PassRefPtr doc (just google that word) if you don&apos;t understand why.
&gt; &gt; 
&gt; &gt; I&apos;ve found that this can work with RefPtr, but not with OwnPtr (won&apos;t compile).
&gt; &gt;  It looks like in the case of OwnPtr, it&apos;s not reference counted and you can&apos;t
&gt; &gt; assign from one OwnPtr to another.  The current code does the right thing, but
&gt; &gt; another option is to just forget the PassOwnPtr and use a straight pointer as
&gt; &gt; the local variable.  It gets appended to a Vector&lt;OwnPtr&lt;&gt; &gt; so the memory
&gt; &gt; management is handled.
&gt; 
&gt; The point of the OwnPtr is that it&apos;ll get deleted if you go out of scope.  I
&gt; don&apos;t know what you&apos;re doing wrong here, but there are a LOT of examples in the
&gt; code of how to do this properly.  Make sure you have PassOwnPtr.h included in
&gt; the file.  It should know how to convert stuff from an OwnPtr to a PassOwnPtr.

I had Dimitri take a look and he&apos;s pretty sure it&apos;s not possible to do this in this particular case.  I&apos;ve created a simple test case to illustrate how this won&apos;t compile:

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

class Test {
public:
    Test() { printf(&quot;%p: Test::Test()\n&quot;, this); }
    ~Test() { printf(&quot;%p: Test::~Test()\n&quot;, this); }
};

Vector&lt;OwnPtr&lt;Test&gt; &gt; testList;

void test()
{
    OwnPtr&lt;Test&gt; p(new Test());  // &lt;------------ WON&apos;T COMPILE
    testList.append(p);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

If you change the test() function to be:

void test()
{
    Test* p = new Test(); // &lt; ---- WILL COMPILE
    testList.append(p);
}

Then it *will* compile.  The issue is that you cannot assign from one OwnPtr to another OwnPtr, and this is what is happening when you call the append() method.  Please have a close look at the exact usage in my code - thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203250</commentid>
    <comment_count>24</comment_count>
      <attachid>51461</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-23 15:20:58 -0700</bug_when>
    <thetext>Created attachment 51461
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203256</commentid>
    <comment_count>25</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-23 15:27:02 -0700</bug_when>
    <thetext>Hi Jeremy, I addressed your last comments (see my other comment about the OwnPtr).

I took some time to scan through the files and improve all the variable names I could find.  Also, I added a few more safety checks / ASSERTs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203378</commentid>
    <comment_count>26</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 04:50:01 -0700</bug_when>
    <thetext>(In reply to comment #23)
&gt; (In reply to comment #21)
&gt; &gt; (In reply to comment #19)
&gt; &gt; &gt; Hi Jeremy, I&apos;ve addressed most of your comments.  Here are my comments about
&gt; &gt; &gt; the others:
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt;Always use ___Ptr&apos;s as member and automatic/local variables.  Use Pass___Ptr&apos;s
&gt; &gt; &gt; &gt;as method parameters and return values.  You might want to re-read the
&gt; &gt; &gt; &gt;PassRefPtr doc (just google that word) if you don&apos;t understand why.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;ve found that this can work with RefPtr, but not with OwnPtr (won&apos;t compile).
&gt; &gt; &gt;  It looks like in the case of OwnPtr, it&apos;s not reference counted and you can&apos;t
&gt; &gt; &gt; assign from one OwnPtr to another.  The current code does the right thing, but
&gt; &gt; &gt; another option is to just forget the PassOwnPtr and use a straight pointer as
&gt; &gt; &gt; the local variable.  It gets appended to a Vector&lt;OwnPtr&lt;&gt; &gt; so the memory
&gt; &gt; &gt; management is handled.
&gt; &gt; 
&gt; &gt; The point of the OwnPtr is that it&apos;ll get deleted if you go out of scope.  I
&gt; &gt; don&apos;t know what you&apos;re doing wrong here, but there are a LOT of examples in the
&gt; &gt; code of how to do this properly.  Make sure you have PassOwnPtr.h included in
&gt; &gt; the file.  It should know how to convert stuff from an OwnPtr to a PassOwnPtr.
&gt; 
&gt; I had Dimitri take a look and he&apos;s pretty sure it&apos;s not possible to do this in
&gt; this particular case.  I&apos;ve created a simple test case to illustrate how this
&gt; won&apos;t compile:
&gt; 
&gt; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; 
&gt; class Test {
&gt; public:
&gt;     Test() { printf(&quot;%p: Test::Test()\n&quot;, this); }
&gt;     ~Test() { printf(&quot;%p: Test::~Test()\n&quot;, this); }
&gt; };
&gt; 
&gt; Vector&lt;OwnPtr&lt;Test&gt; &gt; testList;
&gt; 
&gt; void test()
&gt; {
&gt;     OwnPtr&lt;Test&gt; p(new Test());  // &lt;------------ WON&apos;T COMPILE
&gt;     testList.append(p);
&gt; }
&gt; 
&gt; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
&gt; 
&gt; If you change the test() function to be:
&gt; 
&gt; void test()
&gt; {
&gt;     Test* p = new Test(); // &lt; ---- WILL COMPILE
&gt;     testList.append(p);
&gt; }
&gt; 
&gt; Then it *will* compile.  The issue is that you cannot assign from one OwnPtr to
&gt; another OwnPtr, and this is what is happening when you call the append()
&gt; method.  Please have a close look at the exact usage in my code - thanks.

I see.  I guess you&apos;d have to convert to a PassOwnPtr in the middle.

Ok, well I guess the original way you did it is good then.  Sorry for sending you on a run-around like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203544</commentid>
    <comment_count>27</comment_count>
      <attachid>51461</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-24 12:48:19 -0700</bug_when>
    <thetext>Comment on attachment 51461
Patch

Few more comments.  (Didn&apos;t have time to do the full review.  Sorry.  Hopefully I can tomorrow and we can get this finished with.


&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.cpp b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; new file mode 100644
&gt; index 0000000..7ce7df8
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; @@ -0,0 +1,223 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;AudioBus.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +const int InputBufferSize = 8 * 16384;
&gt; +
&gt; +// We only process the leading portion of the impulse response in the real-time thread.  We don&apos;t exceed this length.
&gt; +// It turns out then, that the background thread has about 278msec of scheduling slop.
&gt; +// Empirically, this has been found to be a good compromise between giving enough time for scheduling slop,
&gt; +// while still minimizing the amount of processing done in the primary (high-priority) thread.
&gt; +// This was found to be a good value on Mac OS X, and may work well on other platforms as well, assuming
&gt; +// the very rough scheduling latencies are similar on these time-scales.  Of course, this code may need to be
&gt; +// tuned for individual platforms if this assumption is found to be incorrect.
&gt; +const size_t RealtimeFrameLimit = 8192  + 4096; // ~278msec @ 44.1KHz
&gt; +
&gt; +const size_t MinFFTSize = 256;
&gt; +const size_t MaxRealtimeFFTSize = 2048;
&gt; +
&gt; +static void* BackgroundThreadDispatch(void* threadData)

Lower case first letter.  Also I&apos;d call it backgroundThreadEntry or backgroundThreadEntryHelper.

&gt; +{
&gt; +    ReverbConvolver* reverbConvolver = static_cast&lt;ReverbConvolver*&gt;(threadData);
&gt; +    reverbConvolver-&gt;backgroundThreadEntry();
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads)
&gt; +    : m_impulseResponseLength(impulseResponse-&gt;frameSize())
&gt; +    , m_accumulationBuffer(impulseResponse-&gt;frameSize() + renderSliceSize)
&gt; +    , m_inputBuffer(InputBufferSize)
&gt; +    , m_renderSliceSize(renderSliceSize)
&gt; +    , m_minFFTSize(MinFFTSize) // First stage will have this size - successive stages will double in size each time
&gt; +    , m_maxFFTSize(maxFFTSize) // until we hit m_maxFFTSize
&gt; +    , m_useBackgroundThreads(useBackgroundThreads)
&gt; +    , m_wantsToExit(false)
&gt; +    , m_moreInputBuffered(false)
&gt; +{
&gt; +    // If we are using background threads then don&apos;t exceed this FFT size for the
&gt; +    // stages which run in the real-time thread.  This avoids having only one or two
&gt; +    // large stages (size 16384 or so) at the end which take a lot of time every several
&gt; +    // processing slices.  This way we amortize the cost over more processing slices.
&gt; +    m_maxRealtimeFFTSize = MaxRealtimeFFTSize;
&gt; +
&gt; +    // For the moment, a good way to know if we have real-time constraint is to check if we&apos;re using background threads.
&gt; +    // Otherwise, assume we&apos;re being run from a command-line tool.
&gt; +    bool hasRealtimeConstraint = useBackgroundThreads;
&gt; +
&gt; +    float* response = impulseResponse-&gt;data();
&gt; +    size_t totalResponseLength = impulseResponse-&gt;frameSize();
&gt; +
&gt; +    // Because we&apos;re not using direct-convolution in the leading portion, the reverb has an overall latency of half the first-stage FFT size
&gt; +    size_t reverbTotalLatency = m_minFFTSize / 2;
&gt; +
&gt; +    size_t stageOffset = 0;
&gt; +    int i = 0;
&gt; +    size_t fftSize = m_minFFTSize;
&gt; +    while (stageOffset &lt; totalResponseLength) {
&gt; +        size_t stageSize = fftSize / 2;
&gt; +
&gt; +        // For the last stage, it&apos;s possible that stageOffset is such that we&apos;re straddling the end
&gt; +        // of the impulse response buffer (if we use stageSize), so reduce the last stage&apos;s length...
&gt; +        if (stageSize + stageOffset &gt; totalResponseLength)
&gt; +            stageSize = totalResponseLength - stageOffset;
&gt; +
&gt; +        // This &quot;staggers&quot; the time when each FFT happens so they don&apos;t all happen at the same time
&gt; +        int renderPhase = convolverRenderPhase + i * renderSliceSize;
&gt; +
&gt; +        ReverbConvolverStage* stage = new ReverbConvolverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSize, renderPhase, renderSliceSize, &amp;m_accumulationBuffer);
&gt; +
&gt; +        bool isBackgroundStage = false;
&gt; +
&gt; +        if (stageOffset &lt;= RealtimeFrameLimit)
&gt; +            m_stages.append(stage);
&gt; +        else {
&gt; +            if (this-&gt;useBackgroundThreads()) {
&gt; +                m_backgroundStages.append(stage);
&gt; +                isBackgroundStage = true;
&gt; +            } else
&gt; +                m_stages.append(stage);
&gt; +        }

This seems nicer:

if (this-&gt;useBackgroundThreads() &amp;&amp; stageOffset &gt; RealtimeFrameLimit) {
    m_backgroundStages.append(stage);
    isBackgroundStage = true;
} else
    m_stages.append(stage);

&gt; +
&gt; +        stageOffset += stageSize;
&gt; +        ++i;
&gt; +
&gt; +        // Figure out next FFT size
&gt; +        fftSize *= 2;
&gt; +        if (hasRealtimeConstraint &amp;&amp; !isBackgroundStage &amp;&amp; fftSize &gt; m_maxRealtimeFFTSize)
&gt; +            fftSize = m_maxRealtimeFFTSize;
&gt; +        if (fftSize &gt; m_maxFFTSize)
&gt; +            fftSize = m_maxFFTSize;
&gt; +    }
&gt; +
&gt; +    // Start up background thread
&gt; +    // FIXME: would be better to up the thread priority here.  It doesn&apos;t need to be real-time, but higher than the default...
&gt; +    if (this-&gt;useBackgroundThreads() &amp;&amp; m_backgroundStages.size() &gt; 0)
&gt; +        m_backgroundThread = createThread(BackgroundThreadDispatch, this, &quot;convolution background thread&quot;);

Hmm...so each impulse response has its own background thread?  That seems a bit excessive, but no need to fix now I suppose.

&gt; +    else
&gt; +        m_backgroundThread = 0;

Don&apos;t do this here.  Instead initialize it to 0 at the beginning.  It&apos;ll then be overridden if the thread is create.

&gt; +}
&gt; +
&gt; +ReverbConvolver::~ReverbConvolver()
&gt; +{
&gt; +    // Wait for background thread to stop
&gt; +    if (useBackgroundThreads() &amp;&amp; m_backgroundThread) {
&gt; +        m_wantsToExit = true;
&gt; +
&gt; +        // Wake up thread so it can return - don&apos;t use MutexLocker since lock must be unlocked before we call waitForThreadCompletion().
&gt; +        m_backgroundThreadLock.lock();
&gt; +        m_moreInputBuffered = true;

Kill this.

Not sure if you actually need to do the locking here.  Verify what I&apos;m saying tho...last time I tried to do anything complex with condition variables was a couple years ago.  :-)

&gt; +        m_backgroundThreadCondition.signal();
&gt; +        m_backgroundThreadLock.unlock();

IIRC, it&apos;s better to signal outside of the lock so that it doesn&apos;t wake up, try to get the lock, and then sleep again.

Also, use MutextLocker with {}&apos;s to scope it.

&gt; +
&gt; +        waitForThreadCompletion(m_backgroundThread, 0);
&gt; +    }
&gt; +}
&gt; +
&gt; +void ReverbConvolver::backgroundThreadEntry()
&gt; +{
&gt; +    while (!m_wantsToExit) {
&gt; +        // Check to see if there&apos;s any more input to consume
&gt; +        int writeIndex = m_inputBuffer.writeIndex();
&gt; +
&gt; +        // Even though it doesn&apos;t seem like every stage needs to maintain its own version of readIndex 
&gt; +        // we do this in case we want to run in more than one background thread.
&gt; +        int readIndex;
&gt; +
&gt; +        while ((readIndex = m_backgroundStages[0]-&gt;inputReadIndex()) != writeIndex) { // FIXME: do better to detect buffer overrun...
&gt; +            // FIXME: remove hard-coded value
&gt; +            const int SliceSize = 128;
&gt; +
&gt; +            // Accumulate contributions from each stage
&gt; +            for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +                m_backgroundStages[i]-&gt;processInBackground(this, SliceSize);
&gt; +        }
&gt; +
&gt; +        // Wait for realtime thread to give us more input
&gt; +        m_moreInputBuffered = false;        
&gt; +        MutexLocker locker(m_backgroundThreadLock);
&gt; +        while (!m_moreInputBuffered)

&amp;&amp; !m_wantsToExit)

&gt; +            m_backgroundThreadCondition.wait(m_backgroundThreadLock);
&gt; +    }
&gt; +}
&gt; +
&gt; +size_t ReverbConvolver::impulseResponseLength()
&gt; +{
&gt; +    return m_impulseResponseLength;
&gt; +}
&gt; +
&gt; +void ReverbConvolver::process(float* source, float* destination, size_t framesToProcess)
&gt; +{
&gt; +    bool isSafe = source &amp;&amp; destination;
&gt; +    ASSERT(isSafe);
&gt; +    if (!isSafe)
&gt; +        return;
&gt; +
&gt; +    // Feed input buffer (read by all threads)
&gt; +    m_inputBuffer.write(source, framesToProcess);
&gt; +
&gt; +    // Accumulate contributions from each stage
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;process(source, framesToProcess);
&gt; +
&gt; +    // Finally read from accumulation buffer
&gt; +    m_accumulationBuffer.readAndClear(destination, framesToProcess);
&gt; +        
&gt; +    // Now that we&apos;ve buffered more input, wake up our background thread.
&gt; +    
&gt; +    // Not using a MutexLocker looks strange, but we use a tryLock() instead because this is run on the real-time
&gt; +    // thread where it is a disaster for the lock to be contended (causes audio glitching).  It&apos;s OK if we fail to
&gt; +    // signal from time to time, since we&apos;ll get to it the next time we&apos;re called.  We&apos;re called repeatedly
&gt; +    // and frequently (around every 3ms).  The background thread is processing well into the future and has a considerable amount of 
&gt; +    // leeway here...
&gt; +    if (m_backgroundThreadLock.tryLock()) {
&gt; +        m_moreInputBuffered = true;
&gt; +        m_backgroundThreadCondition.signal();
&gt; +        m_backgroundThreadLock.unlock();

I&apos;m pretty sure you can simply set the variable to try and send the signal (without the try lock here).  As long as the consumer has something that causes a read barrier (which I believe the mutex will) you should be OK.  It might be a good idea to write a simple app to verify all this threading stuff (whether you go with your model or my suggestion) works as expected though.  :-)

&gt; +    }
&gt; +}
&gt; +
&gt; +void ReverbConvolver::reset()
&gt; +{
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;reset();
&gt; +
&gt; +    for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +        m_backgroundStages[i]-&gt;reset();
&gt; +
&gt; +    m_accumulationBuffer.reset();
&gt; +    m_inputBuffer.reset();
&gt; +}
&gt; +
&gt; +} // namespace WebCore
&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.h b/WebCore/platform/audio/ReverbConvolver.h
&gt; new file mode 100644
&gt; index 0000000..0f7aeb7
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.h
&gt; @@ -0,0 +1,100 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolver_h
&gt; +#define ReverbConvolver_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTConvolver.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +#include &quot;ReverbConvolverStage.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/RefCounted.h&gt;
&gt; +#include &lt;wtf/Threading.h&gt;
&gt; +#include &lt;wtf/Vector.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class AudioChannel;
&gt; +
&gt; +class ReverbConvolver {
&gt; +public:
&gt; +    // maxFFTSize can be adjusted (from say 2048 to 32768) depending on how much precision is necessary.
&gt; +    // For certain tweaky de-convolving applications the phase errors add up quickly and lead to non-sensical results with
&gt; +    // larger FFT sizes and single-precision floats.  In these cases 2048 is a good size.
&gt; +    // If not doing multi-threaded convolution, then should not go &gt; 8192.
&gt; +    ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads);
&gt; +
&gt; +    ~ReverbConvolver();
&gt; +
&gt; +    void process(float* source, float* destination, size_t framesToProcess);

nit: spaces between all of these methods seems a bit excessive.  Maybe group them together a bit?

&gt; +    void reset();
&gt; +
&gt; +    size_t impulseResponseLength();
&gt; +
&gt; +    ReverbInputBuffer* inputBuffer() { return &amp;m_inputBuffer; }
&gt; +
&gt; +    bool useBackgroundThreads() const { return m_useBackgroundThreads; }
&gt; +
&gt; +    void backgroundThreadEntry();
&gt; +
&gt; +private:
&gt; +    Vector&lt;OwnPtr&lt;ReverbConvolverStage&gt; &gt; m_stages;
&gt; +    Vector&lt;OwnPtr&lt;ReverbConvolverStage&gt; &gt; m_backgroundStages;
&gt; +    size_t m_impulseResponseLength;
&gt; +
&gt; +    ReverbAccumulationBuffer m_accumulationBuffer;
&gt; +
&gt; +    // One or more background threads read from this input buffer which is fed from the realtime thread.
&gt; +    ReverbInputBuffer m_inputBuffer;
&gt; +
&gt; +    // We&apos;re given a rendering hint, so the FFTs can be optimized to not all occur at the same time
&gt; +    // (very bad when rendering on a real-time thread).
&gt; +    size_t m_renderSliceSize;
&gt; +
&gt; +    // First stage will be of size m_minFFTSize.  Each next stage will be twice as big until we hit m_maxFFTSize.
&gt; +    size_t m_minFFTSize;
&gt; +    size_t m_maxFFTSize;
&gt; +
&gt; +    // But don&apos;t exceed this size in the real-time thread (if we&apos;re doing background processing).
&gt; +    size_t m_maxRealtimeFFTSize;
&gt; +
&gt; +    // Background thread and synchronization
&gt; +    bool m_useBackgroundThreads;
&gt; +    ThreadIdentifier m_backgroundThread;
&gt; +    bool m_wantsToExit;
&gt; +    bool m_moreInputBuffered;
&gt; +    mutable Mutex m_backgroundThreadLock;
&gt; +    mutable ThreadCondition m_backgroundThreadCondition;
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbConvolver_h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204001</commentid>
    <comment_count>28</comment_count>
      <attachid>51461</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-25 05:16:57 -0700</bug_when>
    <thetext>Comment on attachment 51461
Patch

This + my other comments and this should be about ready for an r+.  Sorry it took so long.


&gt; diff --git a/WebCore/platform/audio/ReverbConvolver.cpp b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; new file mode 100644
&gt; index 0000000..7ce7df8
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolver.cpp
&gt; @@ -0,0 +1,223 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;AudioBus.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +const int InputBufferSize = 8 * 16384;
&gt; +
&gt; +// We only process the leading portion of the impulse response in the real-time thread.  We don&apos;t exceed this length.
&gt; +// It turns out then, that the background thread has about 278msec of scheduling slop.
&gt; +// Empirically, this has been found to be a good compromise between giving enough time for scheduling slop,
&gt; +// while still minimizing the amount of processing done in the primary (high-priority) thread.
&gt; +// This was found to be a good value on Mac OS X, and may work well on other platforms as well, assuming
&gt; +// the very rough scheduling latencies are similar on these time-scales.  Of course, this code may need to be
&gt; +// tuned for individual platforms if this assumption is found to be incorrect.
&gt; +const size_t RealtimeFrameLimit = 8192  + 4096; // ~278msec @ 44.1KHz
&gt; +
&gt; +const size_t MinFFTSize = 256;
&gt; +const size_t MaxRealtimeFFTSize = 2048;
&gt; +
&gt; +static void* BackgroundThreadDispatch(void* threadData)
&gt; +{
&gt; +    ReverbConvolver* reverbConvolver = static_cast&lt;ReverbConvolver*&gt;(threadData);
&gt; +    reverbConvolver-&gt;backgroundThreadEntry();
&gt; +    return 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::ReverbConvolver(AudioChannel* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t convolverRenderPhase, bool useBackgroundThreads)
&gt; +    : m_impulseResponseLength(impulseResponse-&gt;frameSize())
&gt; +    , m_accumulationBuffer(impulseResponse-&gt;frameSize() + renderSliceSize)
&gt; +    , m_inputBuffer(InputBufferSize)
&gt; +    , m_renderSliceSize(renderSliceSize)
&gt; +    , m_minFFTSize(MinFFTSize) // First stage will have this size - successive stages will double in size each time
&gt; +    , m_maxFFTSize(maxFFTSize) // until we hit m_maxFFTSize
&gt; +    , m_useBackgroundThreads(useBackgroundThreads)
&gt; +    , m_wantsToExit(false)
&gt; +    , m_moreInputBuffered(false)
&gt; +{
&gt; +    // If we are using background threads then don&apos;t exceed this FFT size for the
&gt; +    // stages which run in the real-time thread.  This avoids having only one or two
&gt; +    // large stages (size 16384 or so) at the end which take a lot of time every several
&gt; +    // processing slices.  This way we amortize the cost over more processing slices.
&gt; +    m_maxRealtimeFFTSize = MaxRealtimeFFTSize;
&gt; +
&gt; +    // For the moment, a good way to know if we have real-time constraint is to check if we&apos;re using background threads.
&gt; +    // Otherwise, assume we&apos;re being run from a command-line tool.
&gt; +    bool hasRealtimeConstraint = useBackgroundThreads;
&gt; +
&gt; +    float* response = impulseResponse-&gt;data();
&gt; +    size_t totalResponseLength = impulseResponse-&gt;frameSize();
&gt; +
&gt; +    // Because we&apos;re not using direct-convolution in the leading portion, the reverb has an overall latency of half the first-stage FFT size
&gt; +    size_t reverbTotalLatency = m_minFFTSize / 2;
&gt; +
&gt; +    size_t stageOffset = 0;
&gt; +    int i = 0;
&gt; +    size_t fftSize = m_minFFTSize;
&gt; +    while (stageOffset &lt; totalResponseLength) {
&gt; +        size_t stageSize = fftSize / 2;
&gt; +
&gt; +        // For the last stage, it&apos;s possible that stageOffset is such that we&apos;re straddling the end
&gt; +        // of the impulse response buffer (if we use stageSize), so reduce the last stage&apos;s length...
&gt; +        if (stageSize + stageOffset &gt; totalResponseLength)
&gt; +            stageSize = totalResponseLength - stageOffset;
&gt; +
&gt; +        // This &quot;staggers&quot; the time when each FFT happens so they don&apos;t all happen at the same time
&gt; +        int renderPhase = convolverRenderPhase + i * renderSliceSize;
&gt; +
&gt; +        ReverbConvolverStage* stage = new ReverbConvolverStage(response, totalResponseLength, reverbTotalLatency, stageOffset, stageSize, fftSize, renderPhase, renderSliceSize, &amp;m_accumulationBuffer);

If you do keep this a raw pointer keep it as close as possible to where it gets assigned to an OwnPtr.

And, not to beat a dead horse, but did you try making this an OwnPtr and then call .release() on that when passing it to the array?  I think that&apos;d work and I think it&apos;d be the best.

&gt; +
&gt; +        bool isBackgroundStage = false;
&gt; +
&gt; +        if (stageOffset &lt;= RealtimeFrameLimit)
&gt; +            m_stages.append(stage);
&gt; +        else {
&gt; +            if (this-&gt;useBackgroundThreads()) {
&gt; +                m_backgroundStages.append(stage);
&gt; +                isBackgroundStage = true;
&gt; +            } else
&gt; +                m_stages.append(stage);
&gt; +        }
&gt; +
&gt; +        stageOffset += stageSize;
&gt; +        ++i;
&gt; +
&gt; +        // Figure out next FFT size
&gt; +        fftSize *= 2;
&gt; +        if (hasRealtimeConstraint &amp;&amp; !isBackgroundStage &amp;&amp; fftSize &gt; m_maxRealtimeFFTSize)
&gt; +            fftSize = m_maxRealtimeFFTSize;
&gt; +        if (fftSize &gt; m_maxFFTSize)
&gt; +            fftSize = m_maxFFTSize;
&gt; +    }
&gt; +
&gt; +    // Start up background thread
&gt; +    // FIXME: would be better to up the thread priority here.  It doesn&apos;t need to be real-time, but higher than the default...
&gt; +    if (this-&gt;useBackgroundThreads() &amp;&amp; m_backgroundStages.size() &gt; 0)
&gt; +        m_backgroundThread = createThread(BackgroundThreadDispatch, this, &quot;convolution background thread&quot;);
&gt; +    else
&gt; +        m_backgroundThread = 0;
&gt; +}
&gt; +
&gt; +ReverbConvolver::~ReverbConvolver()
&gt; +{
&gt; +    // Wait for background thread to stop
&gt; +    if (useBackgroundThreads() &amp;&amp; m_backgroundThread) {
&gt; +        m_wantsToExit = true;
&gt; +
&gt; +        // Wake up thread so it can return - don&apos;t use MutexLocker since lock must be unlocked before we call waitForThreadCompletion().
&gt; +        m_backgroundThreadLock.lock();
&gt; +        m_moreInputBuffered = true;
&gt; +        m_backgroundThreadCondition.signal();
&gt; +        m_backgroundThreadLock.unlock();
&gt; +
&gt; +        waitForThreadCompletion(m_backgroundThread, 0);
&gt; +    }
&gt; +}
&gt; +
&gt; +void ReverbConvolver::backgroundThreadEntry()
&gt; +{
&gt; +    while (!m_wantsToExit) {
&gt; +        // Check to see if there&apos;s any more input to consume
&gt; +        int writeIndex = m_inputBuffer.writeIndex();
&gt; +
&gt; +        // Even though it doesn&apos;t seem like every stage needs to maintain its own version of readIndex 
&gt; +        // we do this in case we want to run in more than one background thread.
&gt; +        int readIndex;
&gt; +
&gt; +        while ((readIndex = m_backgroundStages[0]-&gt;inputReadIndex()) != writeIndex) { // FIXME: do better to detect buffer overrun...
&gt; +            // FIXME: remove hard-coded value

Why is this hard coded?  Is removing it an optimization (fine to leave for now, but describe more) or code cleanup (probably best to just do now if possible...otherwise describe why not done now in fixme.)

&gt; +            const int SliceSize = 128;
&gt; +
&gt; +            // Accumulate contributions from each stage
&gt; +            for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +                m_backgroundStages[i]-&gt;processInBackground(this, SliceSize);
&gt; +        }
&gt; +
&gt; +        // Wait for realtime thread to give us more input
&gt; +        m_moreInputBuffered = false;        
&gt; +        MutexLocker locker(m_backgroundThreadLock);
&gt; +        while (!m_moreInputBuffered)
&gt; +            m_backgroundThreadCondition.wait(m_backgroundThreadLock);

Shouldn&apos;t this while loop go at the beginning??  You can scope the MutexLocker with {}&apos;s.

&gt; +    }
&gt; +}
&gt; +
&gt; +size_t ReverbConvolver::impulseResponseLength()
&gt; +{
&gt; +    return m_impulseResponseLength;

Can probably be const and inlined.

&gt; +}
&gt; +
&gt; +void ReverbConvolver::process(float* source, float* destination, size_t framesToProcess)
&gt; +{
&gt; +    bool isSafe = source &amp;&amp; destination;
&gt; +    ASSERT(isSafe);
&gt; +    if (!isSafe)
&gt; +        return;
&gt; +
&gt; +    // Feed input buffer (read by all threads)
&gt; +    m_inputBuffer.write(source, framesToProcess);
&gt; +
&gt; +    // Accumulate contributions from each stage
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;process(source, framesToProcess);
&gt; +
&gt; +    // Finally read from accumulation buffer
&gt; +    m_accumulationBuffer.readAndClear(destination, framesToProcess);
&gt; +        
&gt; +    // Now that we&apos;ve buffered more input, wake up our background thread.
&gt; +    
&gt; +    // Not using a MutexLocker looks strange, but we use a tryLock() instead because this is run on the real-time
&gt; +    // thread where it is a disaster for the lock to be contended (causes audio glitching).  It&apos;s OK if we fail to
&gt; +    // signal from time to time, since we&apos;ll get to it the next time we&apos;re called.  We&apos;re called repeatedly
&gt; +    // and frequently (around every 3ms).  The background thread is processing well into the future and has a considerable amount of 
&gt; +    // leeway here...
&gt; +    if (m_backgroundThreadLock.tryLock()) {
&gt; +        m_moreInputBuffered = true;
&gt; +        m_backgroundThreadCondition.signal();
&gt; +        m_backgroundThreadLock.unlock();
&gt; +    }
&gt; +}
&gt; +
&gt; +void ReverbConvolver::reset()
&gt; +{
&gt; +    for (size_t i = 0; i &lt; m_stages.size(); ++i)
&gt; +        m_stages[i]-&gt;reset();
&gt; +
&gt; +    for (size_t i = 0; i &lt; m_backgroundStages.size(); ++i)
&gt; +        m_backgroundStages[i]-&gt;reset();
&gt; +
&gt; +    m_accumulationBuffer.reset();
&gt; +    m_inputBuffer.reset();
&gt; +}
&gt; +
&gt; +} // namespace WebCore

&gt; diff --git a/WebCore/platform/audio/ReverbConvolverStage.cpp b/WebCore/platform/audio/ReverbConvolverStage.cpp
&gt; new file mode 100644
&gt; index 0000000..f687753
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolverStage.cpp
&gt; @@ -0,0 +1,164 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbConvolverStage.h&quot;
&gt; +
&gt; +#include &quot;Accelerate.h&quot;
&gt; +#include &quot;ReverbAccumulationBuffer.h&quot;
&gt; +#include &quot;ReverbConvolver.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +#include &lt;wtf/PassOwnPtr.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbConvolverStage::ReverbConvolverStage(float* impulseResponse, size_t responseLength, size_t reverbTotalLatency, size_t stageOffset, size_t stageLength,
&gt; +                                           size_t fftSize, size_t renderPhase, size_t renderSliceSize, ReverbAccumulationBuffer* accumulationBuffer)
&gt; +    : m_fftKernel(fftSize)
&gt; +    , m_accumulationBuffer(accumulationBuffer)
&gt; +    , m_accumulationReadIndex(0)
&gt; +    , m_inputReadIndex(0)
&gt; +    , m_impulseResponseLength(responseLength)
&gt; +{
&gt; +    ASSERT(impulseResponse);
&gt; +    ASSERT(accumulationBuffer);
&gt; +    
&gt; +    m_fftKernel.doPaddedFFT(impulseResponse + stageOffset, stageLength);
&gt; +
&gt; +    m_convolver = new FFTConvolver(fftSize);
&gt; +
&gt; +    m_temporaryBuffer.allocate(renderSliceSize);
&gt; +
&gt; +    // The convolution stage at offset stageOffset needs to have a corresponding delay to cancel out the offset.
&gt; +    size_t totalDelay = stageOffset + reverbTotalLatency;
&gt; +
&gt; +

Tidy up whitespace a bit....no 2 lines here...some of the lines above can maybe be condensed a bit...etc

&gt; +    // But, the FFT convolution itself incurs fftSize / 2 latency, so subtract this out...
&gt; +    size_t halfSize = fftSize / 2;
&gt; +    ASSERT(totalDelay &gt;= halfSize);
&gt; +    if (totalDelay &gt;= halfSize)
&gt; +        totalDelay -= halfSize;
&gt; +
&gt; +    // We divide up the total delay, into pre and post delay sections so that we can schedule at exactly the moment when the FFT will happen.
&gt; +    // This is coordinated with the other stages, so they don&apos;t all do their FFTs at the same time...
&gt; +

Maybe delete this newline.

&gt; +    int maxPreDelayLength = std::min(halfSize, totalDelay);
&gt; +    m_preDelayLength = totalDelay &gt; 0 ? renderPhase % maxPreDelayLength : 0;
&gt; +
&gt; +    if (m_preDelayLength &gt; totalDelay)
&gt; +        m_preDelayLength = 0;
&gt; +
&gt; +    m_postDelayLength = totalDelay - m_preDelayLength;
&gt; +    m_preReadWriteIndex = 0;
&gt; +    m_framesProcessed = 0; // total frames processed so far
&gt; +
&gt; +    m_preDelayBuffer.allocate(m_preDelayLength &lt; fftSize ? fftSize : m_preDelayLength);
&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::processInBackground(ReverbConvolver* convolver, size_t framesToProcess)
&gt; +{
&gt; +    ReverbInputBuffer* inputBuffer = convolver-&gt;inputBuffer();
&gt; +    float* source = inputBuffer-&gt;directReadFrom(&amp;m_inputReadIndex, framesToProcess);
&gt; +    process(source, framesToProcess);
&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::process(float* source, size_t framesToProcess)
&gt; +{
&gt; +    ASSERT(source);
&gt; +    if (!source)
&gt; +        return;
&gt; +    
&gt; +    // Deal with pre-delay stream : note special handling of zero delay.
&gt; +
&gt; +    float* preDelayedSource;
&gt; +    float* temporaryBuffer;
&gt; +    if (m_preDelayLength &gt; 0) {
&gt; +        // Handles both the read case (call to process() ) and the write case (memcpy() )
&gt; +        bool isPreDelaySafe = m_preReadWriteIndex + framesToProcess &lt;= m_preDelayBuffer.size();
&gt; +        ASSERT(isPreDelaySafe);
&gt; +        if (!isPreDelaySafe)
&gt; +            return;
&gt; +
&gt; +        bool isTemporaryBufferSafe = framesToProcess &lt;= m_temporaryBuffer.size();
&gt; +        ASSERT(isTemporaryBufferSafe);
&gt; +        if (!isTemporaryBufferSafe)
&gt; +            return;

This can be pulled out of the if statement and put below.

&gt; +
&gt; +        preDelayedSource = m_preDelayBuffer.data() + m_preReadWriteIndex;
&gt; +        temporaryBuffer = m_temporaryBuffer;        
&gt; +    } else {
&gt; +        // Zero delay
&gt; +        preDelayedSource = source;
&gt; +        temporaryBuffer = m_preDelayBuffer.data();
&gt; +        
&gt; +        bool isTemporaryBufferSafe = framesToProcess &lt;= m_preDelayBuffer.size();
&gt; +        ASSERT(isTemporaryBufferSafe);
&gt; +        if (!isTemporaryBufferSafe)
&gt; +            return;
&gt; +    }
&gt; +
&gt; +    int writeIndex = 0;
&gt; +
&gt; +    if (m_framesProcessed &lt; m_preDelayLength) {
&gt; +        // For the first m_preDelayLength frames don&apos;t process the convolver, instead simply buffer in the pre-delay.
&gt; +        // But while buffering the pre-delay, we still need to update our index.
&gt; +        m_accumulationBuffer-&gt;updateReadIndex(&amp;m_accumulationReadIndex, framesToProcess);
&gt; +    } else {
&gt; +        // Now, run the convolution (into the delay buffer).
&gt; +        // An expensive FFT will happen every fftSize / 2 frames.
&gt; +        // We process in-place here...
&gt; +        m_convolver-&gt;process(&amp;m_fftKernel, preDelayedSource, temporaryBuffer, framesToProcess);
&gt; +
&gt; +        // Now accumulate into reverb&apos;s accumulation buffer.
&gt; +        writeIndex = m_accumulationBuffer-&gt;accumulate(temporaryBuffer, framesToProcess, &amp;m_accumulationReadIndex, m_postDelayLength);
&gt; +    }
&gt; +
&gt; +    // Finally copy input to pre-delay.
&gt; +    if (m_preDelayLength &gt; 0) {
&gt; +        memcpy(preDelayedSource, source, sizeof(float) * framesToProcess);
&gt; +        m_preReadWriteIndex += framesToProcess;
&gt; +
&gt; +        ASSERT(m_preReadWriteIndex &lt;= m_preDelayLength);
&gt; +        if (m_preReadWriteIndex &gt;= m_preDelayLength)
&gt; +            m_preReadWriteIndex = 0;
&gt; +    }
&gt; +
&gt; +    m_framesProcessed += framesToProcess;
&gt; +}
&gt; +
&gt; +void ReverbConvolverStage::reset()
&gt; +{
&gt; +    m_convolver-&gt;reset();
&gt; +    m_preDelayBuffer.zero();
&gt; +    m_accumulationReadIndex = 0;
&gt; +    m_inputReadIndex = 0;
&gt; +    m_framesProcessed = 0;
&gt; +}
&gt; +
&gt; +} // namespace WebCore
&gt; diff --git a/WebCore/platform/audio/ReverbConvolverStage.h b/WebCore/platform/audio/ReverbConvolverStage.h
&gt; new file mode 100644
&gt; index 0000000..88351af
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbConvolverStage.h
&gt; @@ -0,0 +1,83 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#ifndef ReverbConvolverStage_h
&gt; +#define ReverbConvolverStage_h
&gt; +
&gt; +#include &quot;AudioFloatArray.h&quot;
&gt; +#include &quot;FFTFrame.h&quot;
&gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +class ReverbAccumulationBuffer;
&gt; +class ReverbConvolver;
&gt; +class FFTConvolver;
&gt; +    
&gt; +// A ReverbConvolverStage represents the convolution associated with a sub-section of a large impulse response.
&gt; +// It incorporates a delay line to account for the offset of the sub-section within the larger impulse response.
&gt; +class ReverbConvolverStage {
&gt; +public:
&gt; +    // renderPhase is useful to know so that we can manipulate the pre versus post delay so that stages will perform
&gt; +    // their heavy work (FFT processing) on different slices to balance the load in a real-time thread.
&gt; +    ReverbConvolverStage(float* impulseResponse, size_t responseLength, size_t reverbTotalLatency, size_t stageOffset, size_t stageLength,
&gt; +                         size_t fftSize, size_t renderPhase, size_t renderSliceSize, ReverbAccumulationBuffer* accumulationBuffer);
&gt; +
&gt; +    // WARNING: framesToProcess must be such that it evenly divides the delay buffer size (stage_offset).
&gt; +    void process(float* source, size_t framesToProcess);
&gt; +
&gt; +    void processInBackground(ReverbConvolver* convolver, size_t framesToProcess);
&gt; +
&gt; +    void reset();
&gt; +
&gt; +    // Useful for background processing
&gt; +    int inputReadIndex() const { return m_inputReadIndex; }
&gt; +
&gt; +private:
&gt; +    FFTFrame m_fftKernel;
&gt; +    OwnPtr&lt;FFTConvolver&gt; m_convolver;
&gt; +
&gt; +    AudioFloatArray m_preDelayBuffer;
&gt; +
&gt; +    ReverbAccumulationBuffer* m_accumulationBuffer;

Gotta be careful about lifetime issues with stuff like this, but what you&apos;ve got looks good.  It&apos;s possible the destructor would kill the RevertAccumulationBuffer first, but there should never be any ReverbConvolverStage code running at that time, and this class should be deleted in the same destructor.

&gt; +    int m_accumulationReadIndex;
&gt; +    int m_inputReadIndex;
&gt; +
&gt; +    size_t m_preDelayLength;
&gt; +    size_t m_postDelayLength;
&gt; +    size_t m_preReadWriteIndex;
&gt; +    size_t m_framesProcessed;
&gt; +
&gt; +    AudioFloatArray m_temporaryBuffer;
&gt; +
&gt; +    size_t m_impulseResponseLength;
&gt; +};
&gt; +
&gt; +} // namespace WebCore
&gt; +
&gt; +#endif // ReverbConvolverStage_h
&gt; diff --git a/WebCore/platform/audio/ReverbInputBuffer.cpp b/WebCore/platform/audio/ReverbInputBuffer.cpp
&gt; new file mode 100644
&gt; index 0000000..1c4fb71
&gt; --- /dev/null
&gt; +++ b/WebCore/platform/audio/ReverbInputBuffer.cpp
&gt; @@ -0,0 +1,79 @@
&gt; +/*
&gt; + * Copyright (C) 2010 Google Inc. All rights reserved.
&gt; + *
&gt; + * Redistribution and use in source and binary forms, with or without
&gt; + * modification, are permitted provided that the following conditions
&gt; + * are met:
&gt; + *
&gt; + * 1.  Redistributions of source code must retain the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer.
&gt; + * 2.  Redistributions in binary form must reproduce the above copyright
&gt; + *     notice, this list of conditions and the following disclaimer in the
&gt; + *     documentation and/or other materials provided with the distribution.
&gt; + * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
&gt; + *     its contributors may be used to endorse or promote products derived
&gt; + *     from this software without specific prior written permission.
&gt; + *
&gt; + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS &quot;AS IS&quot; AND ANY
&gt; + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
&gt; + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
&gt; + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
&gt; + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
&gt; + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
&gt; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
&gt; + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
&gt; + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
&gt; + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
&gt; + */
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;ReverbInputBuffer.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +
&gt; +ReverbInputBuffer::ReverbInputBuffer(size_t length)
&gt; +    : m_buffer(length)
&gt; +    , m_writeIndex(0)
&gt; +{
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::write(float* sourceP, size_t numberOfFrames)
&gt; +{
&gt; +    size_t bufferLength = m_buffer.size();
&gt; +    bool isCopySafe = m_writeIndex + numberOfFrames &lt;= bufferLength;
&gt; +    ASSERT(isCopySafe);
&gt; +    if (!isCopySafe)
&gt; +        return;
&gt; +        
&gt; +    memcpy(m_buffer.data() + m_writeIndex, sourceP, sizeof(float) * numberOfFrames);
&gt; +
&gt; +    m_writeIndex += numberOfFrames;
&gt; +    ASSERT(m_writeIndex &lt;= bufferLength);
&gt; +
&gt; +    if (m_writeIndex &gt;= bufferLength)
&gt; +        m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +float* ReverbInputBuffer::directReadFrom(int* readIndex, size_t numberOfFrames)
&gt; +{
&gt; +    size_t bufferLength = m_buffer.size();
&gt; +    bool isPointerGood = *readIndex &gt;= 0 &amp;&amp; *readIndex + numberOfFrames &lt;= bufferLength;
&gt; +    if (!isPointerGood)
&gt; +        CRASH();

What would happen if you just returned here?  Maybe you could just fill in zeros after asserting?

&gt; +        
&gt; +    float* sourceP = m_buffer;
&gt; +    float* p = sourceP + *readIndex;
&gt; +
&gt; +    // Update readIndex
&gt; +    *readIndex = (*readIndex + numberOfFrames) % bufferLength;
&gt; +
&gt; +    return p;
&gt; +}
&gt; +
&gt; +void ReverbInputBuffer::reset()
&gt; +{
&gt; +    m_buffer.zero();
&gt; +    m_writeIndex = 0;
&gt; +}
&gt; +
&gt; +} // namespace WebCore</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205660</commentid>
    <comment_count>29</comment_count>
      <attachid>51964</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-29 14:11:14 -0700</bug_when>
    <thetext>Created attachment 51964
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205667</commentid>
    <comment_count>30</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-29 14:24:10 -0700</bug_when>
    <thetext>Hi Jeremy, hopefully my latest changes address the last of your comments.

&gt; Hmm...so each impulse response has its own background thread?  That seems a bit excessive, but no need to fix now I suppose.

Good observation.  It&apos;s actually a good thing if the machine has enough cores to really get the advantage of the other threads.  On the Mac on Snow Leopard, it might be possible to take advantage of &quot;Grand Central Dispatch&quot;, but otherwise it would be possible to check the number of cores on the machine and try to optimally farm out worker threads to best match the number of cores.  But this is an optimization which isn&apos;t critical to the fairly good performance we&apos;re already seeing...

&gt; IIRC, it&apos;s better to signal outside of the lock so that it doesn&apos;t wake up, try
&gt; to get the lock, and then sleep again.
&gt; Also, use MutextLocker with {}&apos;s to scope it.

I&apos;m pretty sure it has to be signaled inside the lock which is the pattern I&apos;ve seen in other code like this, and also seems to be the pattern used elsewhere in WebKit.

&gt; I&apos;m pretty sure you can simply set the variable to try and send the signal
&gt; (without the try lock here).  As long as the consumer has something that causes
&gt; a read barrier (which I believe the mutex will) you should be OK.  It might be
&gt; a good idea to write a simple app to verify all this threading stuff (whether
&gt; you go with your model or my suggestion) works as expected though.  :-)

I think there are some race conditions which can happen if you don&apos;t actually get the lock here.

&gt; If you do keep this a raw pointer keep it as close as possible to where it gets
&gt; assigned to an OwnPtr.
&gt; And, not to beat a dead horse, but did you try making this an OwnPtr and then
&gt; call .release() on that when passing it to the array?  I think that&apos;d work and
&gt; I think it&apos;d be the best.

Good call - this seems to work and be the best solution...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>205699</commentid>
    <comment_count>31</comment_count>
      <attachid>51975</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-03-29 15:26:34 -0700</bug_when>
    <thetext>Created attachment 51975
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206006</commentid>
    <comment_count>32</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-30 07:50:36 -0700</bug_when>
    <thetext>&gt; &gt; IIRC, it&apos;s better to signal outside of the lock so that it doesn&apos;t wake up, try
&gt; &gt; to get the lock, and then sleep again.
&gt; &gt; Also, use MutextLocker with {}&apos;s to scope it.
&gt; 
&gt; I&apos;m pretty sure it has to be signaled inside the lock which is the pattern I&apos;ve
&gt; seen in other code like this, and also seems to be the pattern used elsewhere
&gt; in WebKit.

Doing so seems always safe, so I&apos;m fine leaving things as is and not trying to over-optimize.

&gt; 
&gt; &gt; I&apos;m pretty sure you can simply set the variable to try and send the signal
&gt; &gt; (without the try lock here).  As long as the consumer has something that causes
&gt; &gt; a read barrier (which I believe the mutex will) you should be OK.  It might be
&gt; &gt; a good idea to write a simple app to verify all this threading stuff (whether
&gt; &gt; you go with your model or my suggestion) works as expected though.  :-)
&gt; 
&gt; I think there are some race conditions which can happen if you don&apos;t actually
&gt; get the lock here.

Sure, but what you have right now is a race condition as well.  That said, I guess I don&apos;t think making a race condition more subtle is much help.

Are you sure you&apos;re not being overly paranoid about the lock?  I suppose it&apos;s possible that one of the background threads could take the lock and then do a context switch in the couple instructions before the lock is given up, but that seems fairly unlikely.  And modern OSs have heuristics to try and avoid stuff like that, typically.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>206009</commentid>
    <comment_count>33</comment_count>
      <attachid>51975</attachid>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-03-30 07:58:02 -0700</bug_when>
    <thetext>Comment on attachment 51975
Patch

r=me but this should go to the branch not trunk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215618</commentid>
    <comment_count>34</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-04-21 18:22:34 -0700</bug_when>
    <thetext>Any update?  Should this still be r+ in the pending-commit list?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215626</commentid>
    <comment_count>35</comment_count>
    <who name="Jeremy Orlow">jorlow</who>
    <bug_when>2010-04-21 18:27:12 -0700</bug_when>
    <thetext>Chris is on vacation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>216495</commentid>
    <comment_count>36</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-04-23 11:36:46 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; Chris is on vacation.

just got back - will soon check lots of stuff into a branch, then we can sort out landing this</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219962</commentid>
    <comment_count>37</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-05-02 19:14:40 -0700</bug_when>
    <thetext>Was this landed in the big audio branch landing?  If so, please close so it&apos;s not in webkit.org/pending-commit anymore.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>220236</commentid>
    <comment_count>38</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-05-03 12:15:59 -0700</bug_when>
    <thetext>(In reply to comment #37)
&gt; Was this landed in the big audio branch landing?  If so, please close so it&apos;s
&gt; not in webkit.org/pending-commit anymore.

This still needs to land in trunk.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>226167</commentid>
    <comment_count>39</comment_count>
      <attachid>51975</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-05-14 23:51:13 -0700</bug_when>
    <thetext>Comment on attachment 51975
Patch

Removing the r+ until you all sort out whether this is landing on trunk or on branch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270099</commentid>
    <comment_count>40</comment_count>
      <attachid>65615</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-26 13:52:15 -0700</bug_when>
    <thetext>Created attachment 65615
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270101</commentid>
    <comment_count>41</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-26 13:55:50 -0700</bug_when>
    <thetext>This has already been R+ by Jeremy Orlow.  This new patch introduces the WEB_AUDIO feature enable.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271610</commentid>
    <comment_count>42</comment_count>
      <attachid>65615</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-30 13:43:32 -0700</bug_when>
    <thetext>Comment on attachment 65615
Patch

I skimmed briefly through this but am r+&apos;ing based on earlier review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271705</commentid>
    <comment_count>43</comment_count>
      <attachid>65615</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 15:43:23 -0700</bug_when>
    <thetext>Comment on attachment 65615
Patch

Clearing flags on attachment: 65615

Committed r66419: &lt;http://trac.webkit.org/changeset/66419&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271706</commentid>
    <comment_count>44</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-08-30 15:43:30 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271733</commentid>
    <comment_count>45</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-30 16:24:50 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/66419 might have broken Qt Linux Release
The following changes are on the blame list:
http://trac.webkit.org/changeset/66418
http://trac.webkit.org/changeset/66419
http://trac.webkit.org/changeset/66420
http://trac.webkit.org/changeset/66421</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>48675</attachid>
            <date>2010-02-12 16:18:13 -0800</date>
            <delta_ts>2010-02-12 16:18:13 -0800</delta_ts>
            <desc>diagram describing operation of ReverbConvolver</desc>
            <filename>reverb-convolver.png</filename>
            <type>image/png</type>
            <size>107008</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">iVBORw0KGgoAAAANSUhEUgAAAuMAAAKUCAIAAAAhOKGKAAACPmlDQ1BJQ0MgUHJvZmlsZQAAeAGt
k01r1FAUht/MUKpYixbpdKNkIepilJApVFdOOx9l2jCGmSmj7jJJJhmdZGKSGbUq9Ae4cueiIH6A
C7dSLQh1J0LxoyD2H7ivqCA1npuYtAuLG09I7pPDe84999x7gfRXxXG6KQCW7bu12Rn+4qXL/PAm
OAzhADLYr6ieMy3LEkn2sG+fSE22cZrleiesf994uHLsycvV5bsfz9/ZIyh2j7o0IcBlyXHEiDjP
uBVxg/F13/FJYzJWTUUjvk2cdRu1AvFT4lEj4heMWxG/YTxQDRb7mViwtY4NpPYRn9V0TyXOExua
p1rElIeDZfUof5rlPKU6LsWm3xMfZ32hkaw3S+G/yH9vx6dQHc+pCxO7fCfmgbGjwAq3o9saD3vF
jb/12jkxTMeNuMDQjyDYIu3wKrDtBsHP5SDYfkxzbAJr19S+Owi1VCC3DvzrP1pzlB34QGsgC/fo
7xz1JVQJwKM1oLEESDTep/FkBjh8C5BB/jxSuVz8Rj0kN3CwWJIkXpwUppplJvyvZnX7tFehjdF3
xG5VL9A4Qe8Xx5cbMXuDeinmdqdciVlTirQXkX7RLFRjbrvlWsxXlDlWd5hTtxfqMTvd8Oz/mWsm
0eteKdEsmo1mrHf7tYWYr/bmE72mF5Pa7G6V3acwZ8evJPWjiBIkeniImISAKTRRhhydSYrAoWfA
g4w4J9VfvwqWmGe3+fqNcK8LPeem2zFMn5+mG6ln+YqtnsnyoiCcw2+PgrJyQ/6A/QAAIABJREFU
eAHs3XeABEWZNvBPophFMSugIoogKmZQEDCeeqiA55kAz5xPjHfmwJkF79RTz3in4JmziBgABVQQ
A0ZAQQQTiiKgon6/3QfKvpnd2dmZnpme3ao/eqqr33rDU29XvV1V3XOpv/71r/+vpopARaAiUBGo
CFQEKgKdRGCDTmpVlaoIVAQqAhWBikBFoCKwgECNVKofVAQqAhWBikBFoCLQXQRqpNLdtqmaVQQq
AhWBikBFoCJQI5XqAxWBikBFoCJQEagIdBeBGql0t22qZhWBikBFoCJQEagI1Eil+kBFoCJQEagI
VAQqAt1FoEYq3W2bqllFoCJQEagIVAQqAjVSqT5QEagIVAQqAhWBikB3EaiRSnfbpmpWEagIVAQq
AhWBikCNVKoPVAQqAhWBikBFoCLQXQRqpNLdtqmaVQQqAhWBikBFoCJQI5XqAxWBikBFoCJQEagI
dBeBGql0t22qZhWBikBFoCJQEagI1Eil+kBFoCJQEagIVAQqAt1FoEYq3W2bqllbCPz85z//9a9/
vRy3P//5zxdeeOFyV2t5DwKnnnrqRRdd1FNYTysCFYGKwOQQqJFKL7aXutSlPvCBD/SWtnd+73vf
+yEPeUh7/JbgNGkTlhDZ4SKByB577PHLX/5yOR3f/e53b7HFFstdHbn8Xe9616abbjq4+h//+Mcj
jzzy3HPPHUw2zNVhxA3DZ0WaN7/5zf/xH/+xIlklqAhUBCoCbSFQI5W2kByWj1Hzjne847DUlW5s
BP7rv/7r+te//jbbbDM2p9UxuMENbvDQhz50cB3xE3/49re/PZhsmKvDiBuGz4o0T3ziE//t3/5t
wBzVihwqQUWgIlARWBUCG62KuhKPj8CTn/zk8ZlUDkMiYELlpS996Rve8IYh6Vsku8NiapHhYFZT
E3fNa15z5513fs1rXvPCF75wsEr1akWgIlARaAWBeZpTOeyww3SRzalyKyn/+Z//CYi//OUvL3/5
y295y1tuvfXW1lbOOOOMoPOc5zznla985Zve9KbtttvubW97m97cloVc+utf/3qPe9zDpQE4qnLz
m9/8cpe73C1ucYv3vve9ofzUpz513/ve97jjjtt9992vfe1r3+1ud/vRj36US+edd97jHve4G9/4
xhT75Cc/ud9++33pS1/q4f+v//qvBx10kEJ81P3iF79497vf3RP/gQce+Jvf/OaAAw7Ycsstb3e7
233+859Pxcc85jFvf/vbn/nMZ2J7k5vcxAhBc5c+8pGP7LnnnqFx/PCHP3zPe96znCbzi1/84nnP
e97Nbnaz61znOv/wD/9QbJd52MMeZqYBYsYbw3lPRadN6E455RQlX/jCF0wAxOSPf/zjpcpb3/pW
SF71qlcFLxrlZ511Fkr5fffd91rXupY5pGOPPbbQrxZVdf/pn/4JH40IOm0dVsNYcfjhh0P1rne9
a6r87ne/e8QjHoHVtttu+9SnPvXMM88sWn3mM5+5y13uYhjWHMV/fv/73z/2sY/VIptvvvm97nWv
733ve6FfrlEKNxkMsZKxxAOZY445Zv/9999qq6122mmn+BK3uc997oPgUY961Dve8Q4Zkyt0uPKV
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
kYpzvF6OzQAAAABJRU5ErkJggg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>48676</attachid>
            <date>2010-02-12 16:19:55 -0800</date>
            <delta_ts>2010-03-15 16:12:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100212161954.patch</filename>
            <type>text/plain</type>
            <size>29557</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ODY2ZjZkOC4uNTEyZmU5NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MiBAQAorMjAxMC0wMi0xMiAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBubyBqYXZhc2NyaXB0IEFQSQorCisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2gpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29u
dm9sdmVyOjpSZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjp+UmV2ZXJiQ29udm9sdmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZl
cjo6YmFja2dyb3VuZFRocmVhZEVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZv
bHZlcjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNv
bnZvbHZlcjo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OnJl
c2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252
b2x2ZXJTdGFnZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6flJl
dmVyYkNvbnZvbHZlclN0YWdlKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0
YWdlOjpwcm9jZXNzSW5CYWNrZ3JvdW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZv
bHZlclN0YWdlOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0
YWdlOjpyZXNldCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6
OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJB
Y2N1bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1
dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVy
YkNvbnZvbHZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlv
bkJ1ZmZlcjo6cmVhZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlv
bkJ1ZmZlcjo6cmVhZFRpbWVGcmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVy
Ojp3cml0ZUluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjpyZXNl
dCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6aW5wdXRSZWFkSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjppbnB1dEJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OnVzZUJhY2tncm91bmRUaHJlYWRzKToK
KwogMjAxMC0wMi0wOSAgQ2hyaXMgUm9nZXJzICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9S
ZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1
OTRjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNv
bnZvbHZlci5jcHAKQEAgLTAsMCArMSw0NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMu
ICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3Ig
dGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisjaW5j
bHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQga0lu
cHV0QnVmZmVyU2l6ZSA9IDggKiAxNjM4NDsKKworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFk
aW5nIHBvcnRpb24gb2YgdGhlIGltcHVsc2UgcmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJl
YWQuICBXZSBkb24ndCBleGNlZWQgdGhpcyBsZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwg
dGhhdCB0aGUgYmFja2dyb3VuZCB0aHJlYWQgaGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGlu
ZyBzbG9wCitjb25zdCBzaXplX3Qga1JlYWx0aW1lRnJhbWVMaW1pdCA9IDgxOTIgICsgNDA5Njsg
Ly8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBrTWluRkZUU2l6ZSA9IDI1NjsK
K2NvbnN0IHNpemVfdCBrTWF4UmVhbHRpbWVGRlRTaXplID0gMjA0ODsKKworc3RhdGljIHZvaWQq
IEJhY2tncm91bmRUaHJlYWREaXNwYXRjaCh2b2lkKiBwKQoreworICAgIFJldmVyYkNvbnZvbHZl
ciogVGhpcyA9IHN0YXRpY19jYXN0PFJldmVyYkNvbnZvbHZlcio+KHApOworICAgIFRoaXMtPmJh
Y2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAwOworfQorCitSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW5kZXJTbGljZVNpemUsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWF4RkZUU2l6ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb252b2x2ZXJSZW5kZXJQaGFzZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlQmFja2dyb3VuZFRocmVhZHMp
CisgICAgOiBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aChpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6
ZSgpKQorICAgICwgbV9hY2N1bXVsYXRpb25CdWZmZXIoaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNp
emUoKSArIHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1faW5wdXRCdWZmZXIoa0lucHV0QnVmZmVy
U2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xpY2VTaXplKHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1f
dXNlQmFja2dyb3VuZFRocmVhZHModXNlQmFja2dyb3VuZFRocmVhZHMpCisgICAgLCBtX3dhbnRz
VG9FeGl0KGZhbHNlKQoreworICAgIG1fbWluRkZUU2l6ZSA9IGtNaW5GRlRTaXplOyAvLyBGaXJz
dCBzdGFnZSB3aWxsIGhhdmUgdGhpcyBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIHN1Y2Nlc3NpdmUgc3RhZ2VzIHdpbGwgZG91YmxlIGluIHNpemUgZWFjaCB0aW1lCisK
KyAgICBtX21heEZGVFNpemUgPSBtYXhGRlRTaXplOyAvLyB1bnRpbCB3ZSBoaXQgfG1fbWF4RkZU
U2l6ZXwKKworICAgIC8vIElmIHdlIGFyZSB1c2luZyBiYWNrZ3JvdW5kIHRocmVhZHMgdGhlbiBk
b24ndCBleGNlZWQgdGhpcyBGRlQgc2l6ZSBmb3IgdGhlCisgICAgLy8gc3RhZ2VzIHdoaWNoIHJ1
biBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFRoaXMgYXZvaWRzIGhhdmluZyBvbmx5IG9uZSBv
ciB0d28KKyAgICAvLyBsYXJnZSBzdGFnZXMgKHNpemUgMTYzODQgb3Igc28pIGF0IHRoZSBlbmQg
d2hpY2ggdGFrZSBhIGxvdCBvZiB0aW1lIGV2ZXJ5IHNldmVyYWwKKyAgICAvLyBwcm9jZXNzaW5n
IHNsaWNlcy4gIFRoaXMgd2F5IHdlIGFtb3J0aXplIHRoZSBjb3N0IG92ZXIgbW9yZSBwcm9jZXNz
aW5nIHNsaWNlcy4KKyAgICBtX21heFJlYWx0aW1lRkZUU2l6ZSA9IGtNYXhSZWFsdGltZUZGVFNp
emU7CisKKyAgICAvLyBGb3IgdGhlIG1vbWVudCwgYSBnb29kIHdheSB0byBrbm93IGlmIHdlIGhh
dmUgcmVhbC10aW1lIGNvbnN0cmFpbnQKKyAgICAvLyBpcyB0byBjaGVjayBpZiB3ZSdyZSB1c2lu
ZyBiYWNrZ3JvdW5kIHRocmVhZHMuICBPdGhlcndpc2UsIGFzc3VtZSB3ZSdyZQorICAgIC8vIGJl
aW5nIHJ1biBmcm9tIGEgY29tbWFuZC1saW5lIHRvb2wuCisgICAgYm9vbCBoYXNSZWFsdGltZUNv
bnN0cmFpbnQgPSB1c2VCYWNrZ3JvdW5kVGhyZWFkczsKKworICAgIGZsb2F0KiByZXNwb25zZSA9
IGltcHVsc2VSZXNwb25zZS0+ZGF0YSgpOworICAgIHNpemVfdCB0b3RhbFJlc3BvbnNlTGVuZ3Ro
ID0gaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKTsKKworICAgIFJldmVyYkFjY3VtdWxhdGlv
bkJ1ZmZlciogYWNjdW1CdWZmZXJQID0gMDsKKworICAgIGFjY3VtQnVmZmVyUCA9ICZtX2FjY3Vt
dWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIEJlY2F1c2Ugd2UncmUgbm90IHVzaW5nIGRpcmVjdC1j
b252b2x1dGlvbiBmaXJzdCB0aGUgbGVhZGluZyBwb3J0aW9uLCB0aGUgcmV2ZXJiCisgICAgLy8g
aGFzIGFuIG92ZXJhbGwgbGF0ZW5jeSBvZiBoYWxmIHRoZSBmaXJzdC1zdGFnZSBGRlQgc2l6ZQor
ICAgIHNpemVfdCByZXZlcmJUb3RhbExhdGVuY3kgPSBtX21pbkZGVFNpemUgLyAyOworCisgICAg
c2l6ZV90IHN0YWdlT2Zmc2V0ID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgc2l6ZV90IGZmdFNp
emUgPSBtX21pbkZGVFNpemU7CisKKyAgICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3Bv
bnNlTGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKwor
ICAgICAgICAvLyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCB8c3RhZ2VP
ZmZzZXR8IGlzIHN1Y2ggdGhhdCB3ZSdyZSBzdHJhZGRsaW5nIHRoZSBlbmQKKyAgICAgICAgLy8g
b2YgdGhlIGltcHVsc2UgcmVzcG9uc2UgYnVmZmVyIChpZiB3ZSB1c2UgfHN0YWdlU2l6ZXwpLCBz
byByZWR1Y2UgdGhlIGxhc3Qgc3RhZ2UncworICAgICAgICAvLyBsZW5ndGguLi4KKworICAgICAg
ICAvLyBNYXkgaGF2ZSB0byByZWR1Y2UgbGVuZ3RoIG9mIGxhc3Qgc3RhZ2UgKGNsaXAgdG8gdmVy
eSBlbmQgb2YgcmVzcG9uc2UpCisgICAgICAgIGlmIChzdGFnZVNpemUgKyBzdGFnZU9mZnNldCA+
IHRvdGFsUmVzcG9uc2VMZW5ndGgpCisgICAgICAgICAgICBzdGFnZVNpemUgPSB0b3RhbFJlc3Bv
bnNlTGVuZ3RoIC0gc3RhZ2VPZmZzZXQ7CisKKyAgICAgICAgLy8gVGhpcyAic3RhZ2dlcnMiIHRo
ZSB0aW1lIHdoZW4gZWFjaCBGRlQgaGFwcGVucyBzbyB0aGV5IGRvbid0IGFsbCBoYXBwZW4gYXQg
dGhlIHNhbWUgdGltZQorICAgICAgICBpbnQgcmVuZGVyUGhhc2UgPSBjb252b2x2ZXJSZW5kZXJQ
aGFzZSArIGkgKiByZW5kZXJTbGljZVNpemU7CisKKyAgICAgICAgUmV2ZXJiQ29udm9sdmVyU3Rh
Z2UqIHN0YWdlID0gbmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJlc3BvbnNlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90
YWxSZXNwb25zZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyYlRvdGFsTGF0ZW5jeSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdl
T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc3RhZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZ0U2l6ZSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclBo
YXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgcmVuZGVyU2xpY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1CdWZmZXJQKTsKKworICAg
ICAgICBib29sIGlzQmFja2dyb3VuZFN0YWdlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHN0YWdl
T2Zmc2V0IDw9IGtSZWFsdGltZUZyYW1lTGltaXQpCisgICAgICAgICAgICBtX3N0YWdlcy5hcHBl
bmQoc3RhZ2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT51c2VCYWNr
Z3JvdW5kVGhyZWFkcygpKSB7CisgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzLmFw
cGVuZChzdGFnZSk7CisgICAgICAgICAgICAgICAgaXNCYWNrZ3JvdW5kU3RhZ2UgPSB0cnVlOwor
ICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbV9zdGFnZXMuYXBwZW5kKHN0YWdl
KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6ZTsKKyAgICAg
ICAgaSsrOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQorICAgICAgICBm
ZnRTaXplICo9IDI7CisgICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQgJiYgIWlzQmFj
a2dyb3VuZFN0YWdlICYmIGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkKKyAgICAgICAg
ICAgIGZmdFNpemUgPSBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYgKGZmdFNpemUg
PiBtX21heEZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRTaXplOworICAg
IH0KKworICAgIC8vIFN0YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8gRklYTUU6IHdv
dWxkIGJlIGJldHRlciB0byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJdCBkb2Vzbid0
IG5lZWQgdG8gYmUgcmVhbC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1bHQuLi4KKyAg
ICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91bmRTdGFnZXMu
c2l6ZSgpID4gMCkKKyAgICAgICAgcHRocmVhZF9jcmVhdGUoJm1fYmFja2dyb3VuZFRocmVhZCwg
MCwgQmFja2dyb3VuZFRocmVhZERpc3BhdGNoLCB0aGlzKTsKKyAgICBlbHNlCisgICAgICAgIG1f
YmFja2dyb3VuZFRocmVhZCA9IDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZv
bHZlcigpCit7CisgICAgLy8gV2FpdCBmb3IgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAg
IGlmICh1c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFRocmVhZCkgeworICAg
ICAgICBtX3dhbnRzVG9FeGl0ID0gdHJ1ZTsKKyAgICAgICAgcHRocmVhZF9qb2luKG1fYmFja2dy
b3VuZFRocmVhZCwgMCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N0
YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAgZGVsZXRlIG1fc3RhZ2VzW2ldOworCisgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAg
ICAgIGRlbGV0ZSBtX2JhY2tncm91bmRTdGFnZXNbaV07Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9s
dmVyOjpiYWNrZ3JvdW5kVGhyZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhp
dCkgeworICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgbW9yZSBpbnB1dCB0
byBjb25zdW1lCisgICAgICAgIGludCB3cml0ZUluZGV4ID0gbV9pbnB1dEJ1ZmZlci53cml0ZUlu
ZGV4KCk7CisKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzZWVtIGxpa2UgZXZl
cnkgc3RhZ2UgbmVlZHMgdG8gbWFpbnRhaW4gaXRzIG93biB2ZXJzaW9uIG9mIHxyZWFkSW5kZXh8
IAorICAgICAgICAvLyB3ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0
aGFuIG9uZSBiYWNrZ3JvdW5kIHRocmVhZAorICAgICAgICBpbnQgcmVhZEluZGV4OworCisgICAg
ICAgIHdoaWxlICgocmVhZEluZGV4ID0gbV9iYWNrZ3JvdW5kU3RhZ2VzWzBdLT5pbnB1dFJlYWRJ
bmRleCgpKSAhPSB3cml0ZUluZGV4KSB7IC8vIEZJWE1FIDogZG8gYmV0dGVyIHRvIGRldGVjdCBi
dWZmZXIgb3ZlcnJ1bi4uLgorICAgICAgICAgICAgLy8gRklYTUUgOiByZW1vdmUgaGFyZC1jb2Rl
ZCB2YWx1ZQorICAgICAgICAgICAgY29uc3QgaW50IGtTbGljZVNpemUgPSAxMjg7CisKKyAgICAg
ICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAgICAg
ICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsg
KytpKQorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdlc1tpXS0+cHJvY2Vzc0luQmFj
a2dyb3VuZCh0aGlzLCBrU2xpY2VTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNsZWVw
IDEwbXMKKyAgICAgICAgdXNsZWVwKDEwMDAwKTsgLy8gRklYTUUgOiB0aGlzIHJlYWxseSBpc24n
dCBpZGVhbCAtIGNvdWxkIHVzZSB3YWl0L3NpZ25hbAorICAgIH0KK30KKworc2l6ZV90IFJldmVy
YkNvbnZvbHZlcjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKCkKK3sKKyAgICByZXR1cm4gbV9pbXB1
bHNlUmVzcG9uc2VMZW5ndGg7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpwcm9jZXNzKGZs
b2F0KiBzb3VyY2VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRlc3RQ
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykK
K3sKKyAgICAvLyBGZWVkIGlucHV0IGJ1ZmZlciAocmVhZCBieSBhbGwgdGhyZWFkcykKKyAgICBt
X2lucHV0QnVmZmVyLndyaXRlKHNvdXJjZVAsIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBB
Y2N1bXVsYXRlIGNvbnRyaWJ1dGlvbnMgZnJvbSBlYWNoIHN0YWdlCisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX3N0YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9zdGFnZXNbaV0tPnBy
b2Nlc3Moc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBm
cm9tIGFjY3VtdWxhdGlvbiBidWZmZXIKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5k
Q2xlYXIoZGVzdFAsIGZyYW1lc1RvUHJvY2Vzcyk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVy
OjpyZXNldCgpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N0YWdlcy5zaXplKCk7
ICsraSkKKyAgICAgICAgbV9zdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IG1fYmFja2dyb3VuZFN0YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9iYWNr
Z3JvdW5kU3RhZ2VzW2ldLT5yZXNldCgpOworCisgICAgbV9hY2N1bXVsYXRpb25CdWZmZXIucmVz
ZXQoKTsKKyAgICBtX2lucHV0QnVmZmVyLnJlc2V0KCk7Cit9CisKKy8vIH5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fgorLy8gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1JldmVyYkNvbnZvbHZlclN0YWdl
OjpSZXZlcmJDb252b2x2ZXJTdGFnZShmbG9hdCogaW1wdWxzZVJlc3BvbnNlLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZXNwb25zZUxlbmd0aCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmV2ZXJi
VG90YWxMYXRlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHNpemVfdCBzdGFnZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlbmRlclBoYXNlLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW5kZXJTbGljZVNpemUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVm
ZmVyKiBhY2N1bXVsYXRpb25CdWZmZXIpCisgICAgOiBtX2ZmdEtlcm5lbChmZnRTaXplKQorICAg
ICwgbV9hY2N1bXVsYXRpb25CdWZmZXIoYWNjdW11bGF0aW9uQnVmZmVyKQorICAgICwgbV9hY2N1
bXVsYXRpb25SZWFkSW5kZXgoMCkKKyAgICAsIG1faW5wdXRSZWFkSW5kZXgoMCkKKyAgICAsIG1f
YWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSgwKQorICAgICwgbV9pbXB1bHNlUmVzcG9uc2VMZW5n
dGgocmVzcG9uc2VMZW5ndGgpCit7CisgICAgbV9mZnRLZXJuZWwuZG9QYWRkZWRGRlQoaW1wdWxz
ZVJlc3BvbnNlICsgc3RhZ2VPZmZzZXQsIHN0YWdlTGVuZ3RoKTsKKworICAgIG1fY29udm9sdmVy
ID0gbmV3IEZGVENvbnZvbHZlcihmZnRTaXplKTsKKworICAgIG1fdGVtcEJ1ZmZlci5hbGxvY2F0
ZShyZW5kZXJTbGljZVNpemUpOworCisgICAgLy8gVGhlIGNvbnZvbHV0aW9uIHN0YWdlIGF0IG9m
ZnNldCB8c3RhZ2VPZmZzZXR8IG5lZWRzIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlbGF5IHRv
IGNhbmNlbCBvdXQgdGhlIG9mZnNldAorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZz
ZXQgKyByZXZlcmJUb3RhbExhdGVuY3k7CisKKyAgICAvLyBCdXQsIHRoZSBGRlQgY29udm9sdXRp
b24gaXRzZWxmIGluY3VycyB8ZmZ0U2l6ZXwgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMg
b3V0Li4uCisgICAgc2l6ZV90IGhhbGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgaWYgKHRvdGFs
RGVsYXkgPj0gaGFsZlNpemUpCisgICAgICAgIHRvdGFsRGVsYXkgLT0gaGFsZlNpemU7CisKKyAg
ICAvLyBGSVhNRSA6IERFQUwgd2l0aCBjYXNlIHdoZW4gdG90YWwgZGVsYXkgaXMgbGVzcyB0aGFu
IGZmdFNpemUvMi4uLi4KKworICAgIC8vIFdlIGRpdmlkZSB1cCB0aGUgdG90YWwgZGVsYXksIGlu
dG8gcHJlIGFuZCBwb3N0IGRlbGF5IHNlY3Rpb25zIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gc2No
ZWR1bGUgYXQgZXhhY3RseSB0aGUgbW9tZW50IHdoZW4gdGhlIEZGVCB3aWxsIGhhcHBlbi4gIFRo
aXMgaXMgY29vcmRpbmF0ZWQKKyAgICAvLyB3aXRoIHRoZSBvdGhlciBzdGFnZXMsIHNvIHRoZXkg
ZG9uJ3QgYWxsIGRvIHRoZWlyIEZGVHMgYXQgdGhlIHNhbWUgdGltZS4uLgorCisgICAgaW50IG0g
PSAoaGFsZlNpemUgPD0gdG90YWxEZWxheSkgPyBoYWxmU2l6ZSA6IHRvdGFsRGVsYXk7CisgICAg
bV9wcmVEZWxheUxlbmd0aCA9ICh0b3RhbERlbGF5ID4gMCkgPyAocmVuZGVyUGhhc2UgJSBtKSA6
IDA7CisKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IHRvdGFsRGVsYXkpCisgICAgICAgIG1f
cHJlRGVsYXlMZW5ndGggPSAwOworCisgICAgbV9wb3N0RGVsYXlMZW5ndGggPSB0b3RhbERlbGF5
IC0gbV9wcmVEZWxheUxlbmd0aDsKKyAgICBtX3ByZVJlYWRXcml0ZUluZGV4ID0gMDsKKyAgICBt
X2ZyYW1lc1Byb2Nlc3NlZCA9IDA7IC8vIHRvdGFsIGZyYW1lcyBwcm9jZXNzZWQgc28gZmFyCisK
KyAgICBtX3ByZURlbGF5QnVmZmVyLmFsbG9jYXRlKG1fcHJlRGVsYXlMZW5ndGggPCBmZnRTaXpl
ID8gZmZ0U2l6ZSA6IG1fcHJlRGVsYXlMZW5ndGgpOworfQorCitSZXZlcmJDb252b2x2ZXJTdGFn
ZTo6flJldmVyYkNvbnZvbHZlclN0YWdlKCkKK3sKKyAgICBkZWxldGUgbV9jb252b2x2ZXI7Cit9
CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJi
Q29udm9sdmVyKiBjb252b2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgUmV2ZXJiSW5wdXRC
dWZmZXImIGlucHV0QnVmZmVyID0gY29udm9sdmVyLT5pbnB1dEJ1ZmZlcigpOworCisgICAgZmxv
YXQqIHNvdXJjZVAgPSBpbnB1dEJ1ZmZlci5kaXJlY3RSZWFkRnJvbSgmbV9pbnB1dFJlYWRJbmRl
eCwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHByb2Nlc3Moc291cmNlUCwgZnJhbWVzVG9Qcm9j
ZXNzKTsKK30KKwordm9pZCAgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3MoZmxvYXQqIHNv
dXJjZVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKQoreworICAgIC8vCisgICAgLy8gRklYTUUgOiBkbyBzYW5pdHkgY2hlY2sgb24g
ZnJhbWVzVG9Qcm9jZXNzIHZlcnN1cyBkZWxheSBidWZmZXIgc2l6ZQorICAgIC8vCisKKyAgICAv
LyBHZXQgcG9pbnRlciB0byBwcmUtZGVsYXkgc3RyZWFtIDogbm90ZSBzcGVjaWFsIGhhbmRsaW5n
IG9mIHplcm8gZGVsYXkKKyAgICBmbG9hdCogcHJlRGVsYXllZFNvdXJjZVAgPSBzb3VyY2VQOwor
ICAgIGZsb2F0KiBwcmVEZWxheUJ1ZmZlclAgPSBtX3ByZURlbGF5QnVmZmVyOworICAgIGZsb2F0
KiB0ZW1wUCA9IHByZURlbGF5QnVmZmVyUDsKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDAp
IHsKKyAgICAgICAgcHJlRGVsYXllZFNvdXJjZVAgPSBwcmVEZWxheUJ1ZmZlclAgKyBtX3ByZVJl
YWRXcml0ZUluZGV4OworICAgICAgICB0ZW1wUCA9IG1fdGVtcEJ1ZmZlcjsKKyAgICB9CisKKyAg
ICBpbnQgd3JpdGVJbmRleCA9IDA7CisKKyAgICBpZiAobV9mcmFtZXNQcm9jZXNzZWQgPCBtX3By
ZURlbGF5TGVuZ3RoKSB7CisgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgfG1fcHJlRGVsYXlMZW5n
dGh8IGZyYW1lcyBkb24ndCBwcm9jZXNzIHRoZSBjb252b2x2ZXIsIGluc3RlYWQgc2ltcGx5IGJ1
ZmZlciBpbiB0aGUgcHJlLWRlbGF5CisKKyAgICAgICAgLy8gV2hpbGUgYnVmZmVyaW5nIHRoZSBw
cmUtZGVsYXksIHdlIHN0aWxsIG5lZWQgdG8gdXBkYXRlIG91ciBpbmRleAorICAgICAgICBtX2Fj
Y3VtdWxhdGlvbkJ1ZmZlci0+dXBkYXRlUmVhZEluZGV4KCZtX2FjY3VtdWxhdGlvblJlYWRJbmRl
eCwgZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3csIHJ1biB0
aGUgY29udm9sdXRpb24gKGludG8gdGhlIGRlbGF5IGJ1ZmZlcikKKyAgICAgICAgLy8gQW4gZXhw
ZW5zaXZlIEZGVCB3aWxsIGhhcHBlbiBldmVyeSAoZmZ0U2l6ZS8yKSBmcmFtZXMKKyAgICAgICAg
Ly8gV2UgcHJvY2VzcyBpbi1wbGFjZSBoZXJlLi4uCisgICAgICAgIG1fY29udm9sdmVyLT5wcm9j
ZXNzKCZtX2ZmdEtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlRGVsYXll
ZFNvdXJjZVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBQLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgICAgIC8vIE5vdyBh
Y2N1bXVsYXRlIGludG8gcmV2ZXJiJ3MgYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgICAgICAvLyBG
SVhNRSA6IHJlYWxseSBuZWVkIHRvIGhhdmUgbG9ja2luZyBtZWNoYW5pc20gaGVyZSEhCisgICAg
ICAgIHdyaXRlSW5kZXggPSBtX2FjY3VtdWxhdGlvbkJ1ZmZlci0+YWNjdW11bGF0ZSh0ZW1wUCwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZy
YW1lc1RvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcG9zdERlbGF5TGVuZ3RoKTsK
KyAgICB9CisKKyAgICAvLyBGaW5hbGx5IGNvcHkgaW5wdXQgdG8gcHJlLWRlbGF5CisgICAgaWYg
KG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShwcmVEZWxheWVkU291cmNl
UCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIG1f
cHJlUmVhZFdyaXRlSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAgICAgIGlmIChtX3By
ZVJlYWRXcml0ZUluZGV4ID49IG1fcHJlRGVsYXlMZW5ndGgpCisgICAgICAgICAgICBtX3ByZVJl
YWRXcml0ZUluZGV4ID0gMDsgLy8gc2hvdWxkIG9ubHkgYmUgPD0KKyAgICB9CisKKyNpZiAwCisg
ICAgLy8gVEVTVElORyAtIHNhbml0eSBjaGVjaworICAgIGludCB0aW1lbGluZVJlYWRGcmFtZSA9
IG1fYWNjdW11bGF0aW9uQnVmZmVyLT5yZWFkVGltZUZyYW1lKCk7CisgICAgaW50IHRpbWVsaW5l
V3JpdGVGcmFtZSA9IG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSArIG1fcG9zdERlbGF5TGVu
Z3RoOworCisgICAgLy8gcHJpbnRmKCIlcCAlcDogUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nl
c3MoJWQpIDogKCVkIFx0ICVkKVxuIiwgcHRocmVhZF9zZWxmKCksIHRoaXMsIG1fZmZ0S2VybmVs
LmZmdFNpemUoKSwgdGltZWxpbmVXcml0ZUZyYW1lLCB0aW1lbGluZVJlYWRGcmFtZSk7CisKKyAg
ICBpZiAodGltZWxpbmVSZWFkRnJhbWUgPiB0aW1lbGluZVdyaXRlRnJhbWUpCisgICAgICAgIHBy
aW50ZigiJXAgJXA6IFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzKCVkKSA6ICglZCBcdCAl
ZClcbiIsIHB0aHJlYWRfc2VsZigpLCB0aGlzLCBtX2ZmdEtlcm5lbC5mZnRTaXplKCksIHRpbWVs
aW5lV3JpdGVGcmFtZSwgdGltZWxpbmVSZWFkRnJhbWUpOworCisgICAgaWYgKHRpbWVsaW5lV3Jp
dGVGcmFtZSA+IHRpbWVsaW5lUmVhZEZyYW1lICsgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgpCisg
ICAgICAgIHByaW50ZigiJXAgJXA6IFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzKCVkKSA6
ICglZCBcdCAlZClcbiIsIHB0aHJlYWRfc2VsZigpLCB0aGlzLCBtX2ZmdEtlcm5lbC5mZnRTaXpl
KCksIHRpbWVsaW5lV3JpdGVGcmFtZSwgdGltZWxpbmVSZWFkRnJhbWUpOworI2VuZGlmCisKKyAg
ICBtX2FjY3VtdWxhdGlvblJlYWRUaW1lRnJhbWUgKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIG1f
ZnJhbWVzUHJvY2Vzc2VkICs9IGZyYW1lc1RvUHJvY2VzczsKK30KKwordm9pZCBSZXZlcmJDb252
b2x2ZXJTdGFnZTo6cmVzZXQoKQoreworICAgIG1fY29udm9sdmVyLT5yZXNldCgpOworICAgIG1f
cHJlRGVsYXlCdWZmZXIuemVybygpOworICAgIG1fYWNjdW11bGF0aW9uUmVhZEluZGV4ID0gMDsK
KyAgICBtX2lucHV0UmVhZEluZGV4ID0gMDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7Cisg
ICAgbV9hY2N1bXVsYXRpb25SZWFkVGltZUZyYW1lID0gMDsKK30KKworLy8gfn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+CisvLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1f
YnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAsIG1fcmVhZEluZGV4
KDApCisgICAgLCBtX3JlYWRUaW1lRnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcihmbG9hdCogZGVzdFAsIHNpemVfdCBuZnJhbWVzKQor
eworICAgIGFzc2VydChtX3JlYWRJbmRleCA8PSBtX2xlbmd0aCk7CisgICAgc2l6ZV90IGZyYW1l
c0F2YWlsYWJsZSA9IG1fbGVuZ3RoIC0gbV9yZWFkSW5kZXg7CisgICAgc2l6ZV90IG5mcmFtZXMx
ID0gKG5mcmFtZXMgPD0gZnJhbWVzQXZhaWxhYmxlKSA/IG5mcmFtZXMgOiBmcmFtZXNBdmFpbGFi
bGU7CisgICAgc2l6ZV90IG5mcmFtZXMyID0gbmZyYW1lcyAtIG5mcmFtZXMxOworCisgICAgZmxv
YXQqIHNvdXJjZVAgPSBtX2J1ZmZlcjsKKyAgICBtZW1jcHkoZGVzdFAsIHNvdXJjZVAgKyBtX3Jl
YWRJbmRleCwgc2l6ZW9mKGZsb2F0KSAqIG5mcmFtZXMxKTsKKyAgICBtZW1zZXQoc291cmNlUCAr
IG1fcmVhZEluZGV4LCAwLCBzaXplb2YoZmxvYXQpICogbmZyYW1lczEpOworCisgICAgLy8gSGFu
ZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vzc2FyeQorICAgIGlmIChuZnJhbWVzMiA+IDApIHsKKyAg
ICAgICAgbWVtY3B5KGRlc3RQICsgbmZyYW1lczEsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBu
ZnJhbWVzMik7CisgICAgICAgIG1lbXNldChzb3VyY2VQLCAwLCBzaXplb2YoZmxvYXQpICogbmZy
YW1lczIpOworICAgIH0KKworICAgIG1fcmVhZEluZGV4ID0gKG1fcmVhZEluZGV4ICsgbmZyYW1l
cykgJSBtX2xlbmd0aDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgKz0gbmZyYW1lczsKK30KKwordm9p
ZCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRl
eCwgc2l6ZV90IG5mcmFtZXMpCit7CisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHxyZWFkSW5kZXh8
CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZEluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0aDsKK30K
KworaW50IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6YWNjdW11bGF0ZShmbG9hdCogc291cmNl
UCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5mcmFt
ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVhZElu
ZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGVs
YXlGcmFtZXMpCit7CisgICAgc2l6ZV90IHdyaXRlSW5kZXggPSAoKnJlYWRJbmRleCArIGRlbGF5
RnJhbWVzKSAlIG1fbGVuZ3RoOworCisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHxyZWFkSW5kZXh8
CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZEluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0aDsKKwor
ICAgIGFzc2VydCh3cml0ZUluZGV4IDw9IG1fbGVuZ3RoKTsKKyAgICBzaXplX3QgZnJhbWVzQXZh
aWxhYmxlID0gbV9sZW5ndGggLSB3cml0ZUluZGV4OworICAgIHNpemVfdCBuZnJhbWVzMSA9IChu
ZnJhbWVzIDw9IGZyYW1lc0F2YWlsYWJsZSkgPyBuZnJhbWVzIDogZnJhbWVzQXZhaWxhYmxlOwor
ICAgIHNpemVfdCBuZnJhbWVzMiA9IG5mcmFtZXMgLSBuZnJhbWVzMTsKKworICAgIGZsb2F0KiBk
ZXN0UCA9IG1fYnVmZmVyOworCisgICAgdmFkZChzb3VyY2VQLAorICAgICAgICAgMSwKKyAgICAg
ICAgIGRlc3RQICsgd3JpdGVJbmRleCwKKyAgICAgICAgIDEsCisgICAgICAgICBkZXN0UCArIHdy
aXRlSW5kZXgsCisgICAgICAgICAxLAorICAgICAgICAgbmZyYW1lczEpOworCisgICAgLy8gSGFu
ZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vzc2FyeQorICAgIGlmIChuZnJhbWVzMiA+IDApIHsKKyAg
ICAgICAgdmFkZChzb3VyY2VQICsgbmZyYW1lczEsCisgICAgICAgICAgICAgMSwKKyAgICAgICAg
ICAgICBkZXN0UCwKKyAgICAgICAgICAgICAxLAorICAgICAgICAgICAgIGRlc3RQLAorICAgICAg
ICAgICAgIDEsCisgICAgICAgICAgICAgbmZyYW1lczIpOworICAgIH0KKworICAgIHJldHVybiB3
cml0ZUluZGV4OworfQorCisvLyB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKy8vIH5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fgorCitSZXZlcmJJbnB1dEJ1ZmZlcjo6UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90
IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fbGVuZ3RoKGxlbmd0aCkK
KyAgICAsIG1fd3JpdGVJbmRleCgwKQoreworfQorCit2b2lkIFJldmVyYklucHV0QnVmZmVyOjp3
cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG5mcmFtZXMpCit7CisgICAgbWVtY3B5KG1fYnVm
ZmVyLmRhdGEoKSArIG1fd3JpdGVJbmRleCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIG5mcmFt
ZXMpOworCisgICAgbV93cml0ZUluZGV4ICs9IG5mcmFtZXM7CisgICAgYXNzZXJ0KG1fd3JpdGVJ
bmRleCA8PSBtX2xlbmd0aCk7CisKKyAgICBpZiAobV93cml0ZUluZGV4ID49IG1fbGVuZ3RoKQor
ICAgICAgICBtX3dyaXRlSW5kZXggPSAwOworfQorCitmbG9hdCogUmV2ZXJiSW5wdXRCdWZmZXI6
OmRpcmVjdFJlYWRGcm9tKGludCogaW5kZXgsIHNpemVfdCBuZnJhbWVzKQoreworICAgIGFzc2Vy
dCgqaW5kZXggPj0gMCAmJiAqaW5kZXggKyBuZnJhbWVzIDw9IG1fbGVuZ3RoKTsKKyAgICBmbG9h
dCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIGZsb2F0KiBwID0gc291cmNlUCArICppbmRleDsK
KworICAgIC8vIFVwZGF0ZSBpbmRleAorICAgICppbmRleCA9ICgqaW5kZXggKyBuZnJhbWVzKSAl
IG1fbGVuZ3RoOworCisgICAgcmV0dXJuIHA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmggYi9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmUzN2NjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwg
SW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBSZXZlcmJDb252b2x2ZXJfaAorI2RlZmluZSBSZXZlcmJDb252b2x2ZXJfaAorCisjaW5jbHVk
ZSAiQXVkaW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAiRkZUQ29udm9sdmVyLmgiCisjaW5jbHVk
ZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBBdWRpb0NoYW5uZWw7CitjbGFzcyBSZXZlcmJDb252b2x2ZXI7CisKKy8v
IH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyIGlzIGEg
Y2lyY3VsYXIgZGVsYXkgYnVmZmVyIHdpdGggb25lIGNsaWVudCByZWFkaW5nCisvLyBmcm9tIGl0
IGFuZCBtdWx0aXBsZSBjbGllbnRzIHdyaXRpbmcvYWNjdW11bGF0aW5nIHRvIGl0IGF0IGRpZmZl
cmVudCBkZWxheQorLy8gb2Zmc2V0cyBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLiAgVGhlIHJlYWQg
b3BlcmF0aW9uIHdpbGwgemVybyB0aGUgbWVtb3J5CisvLyBqdXN0IHJlYWQgZnJvbSB0aGUgYnVm
ZmVyLCBzbyBpdCB3aWxsIGJlIHJlYWR5IGZvciBhY2N1bXVsYXRpb24gdGhlIG5leHQKKy8vIHRp
bWUgYXJvdW5kLgorLy8KK2NsYXNzIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciB7CitwdWJsaWM6
CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKHNpemVfdCBsZW5ndGgpOworCisgICAgLy8g
VGhpcyB3aWxsIHJlYWQgZnJvbSwgdGhlbiBjbGVhci1vdXQgfG5mcmFtZXN8CisgICAgdm9pZCBy
ZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RQLCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICAvLyBFYWNo
IFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11bGF0ZSBpdHMgb3V0cHV0IGF0IHRoZSBh
cHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLgorICAgIC8vIFdlIG5lZWQg
dG8gcGFzcyBpbiBhbmQgdXBkYXRlIHxyZWFkSW5kZXh8IGhlcmUsIHNpbmNlIGVhY2ggUmV2ZXJi
Q29udm9sdmVyU3RhZ2UgbWF5IGJlIHJ1bm5pbmcgaW4KKyAgICAvLyBhIGRpZmZlcmVudCB0aHJl
YWQgdGhhbiB0aGUgcmVhbHRpbWUgdGhyZWFkIGNhbGxpbmcgUmVhZEFuZENsZWFyKCkgYW5kIG1h
aW50YWluaW5nIHxtX3JlYWRJbmRleHwKKyAgICAvLyBSZXR1cm5zIHRoZSB8d3JpdGVJbmRleHwg
d2hlcmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAgaW50IGFjY3VtdWxhdGUoZmxv
YXQqIHNvdXJjZVAsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5mcmFtZXMsCisgICAgICAg
ICAgICAgICAgICAgaW50KiByZWFkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRl
bGF5RnJhbWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3Jl
YWRJbmRleDsgfQorICAgIHNpemVfdCByZWFkVGltZUZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9y
ZWFkVGltZUZyYW1lOyB9CisKKyAgICB2b2lkIHVwZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRl
eCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgdm9pZCByZXNldCgpCisgICAgeworICAgICAgICBt
X2J1ZmZlci56ZXJvKCk7CisgICAgICAgIG1fcmVhZEluZGV4ID0gMDsKKyAgICAgICAgbV9yZWFk
VGltZUZyYW1lID0gMDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5IG1f
YnVmZmVyOworICAgIHNpemVfdCBtX2xlbmd0aDsKKyAgICBzaXplX3QgbV9yZWFkSW5kZXg7Cisg
ICAgc2l6ZV90IG1fcmVhZFRpbWVGcmFtZTsgLy8gZm9yIGRlYnVnZ2luZyAoZnJhbWUgb24gY29u
dGludW91cyB0aW1lbGluZSkKK307CisKKy8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gUmV2
ZXJiSW5wdXRCdWZmZXIgaXMgdXNlZCB0byBidWZmZXIgaW5wdXQgc2FtcGxlcyBmb3IgZGVmZXJy
ZWQgcHJvY2Vzc2luZyBieSB0aGUgYmFja2dyb3VuZCB0aHJlYWRzCitjbGFzcyBSZXZlcmJJbnB1
dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7
CisKKyAgICAvLyBUaGUgcmVhbHRpbWUgYXVkaW8gdGhyZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxl
cyBoZXJlLgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0
aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IHxuZnJhbWVzfCAgKGZvciBuZWFybHkgYWxsIGNhc2Vz
IHRoaXMgd2lsbCBiZSBmaW5lKQorICAgIC8vIEZJWE1FIDogcmVtb3ZlIHxuZnJhbWVzfCByZXN0
cmljdGlvbi4uLgorICAgIHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVz
KTsKKworICAgIC8vIEJhY2tncm91bmQgdGhyZWFkcyBjYW4gY2FsbCB0aGlzIHRvIGNoZWNrIGlm
IHRoZXJlJ3MgYW55dGhpbmcgdG8gcmVhZC4uLgorICAgIC8vIEZJWE1FIDogY3JlYXRlIGJldHRl
ciBzeXN0ZW0gdG8gY2hlY2sgZm9yIGJ1ZmZlciBvdmVycnVucyAvIGVycm9yIGNvbmRpdGlvbnMu
Li4KKyAgICBzaXplX3Qgd3JpdGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JpdGVJbmRleDsg
fQorCisgICAgLy8gVGhlIGluZGl2aWR1YWwgYmFja2dyb3VuZCB0aHJlYWRzIHJlYWQgaGVyZSAo
YW5kIGhvcGUgdGhhdCB0aGV5IGNhbiBrZWVwIHVwIHdpdGggdGhlIGJ1ZmZlciB3cml0aW5nKQor
ICAgIC8vIHxpbmRleHwgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IGluZGV4IHRvIHJlYWQgZnJv
bS4uLgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBp
cyBldmVubHkgZGl2aXNpYmxlIGJ5IHxuZnJhbWVzfAorICAgIC8vIEZJWE1FIDogcmVtb3ZlIHxu
ZnJhbWVzfCByZXN0cmljdGlvbi4uLgorICAgIGZsb2F0KiBkaXJlY3RSZWFkRnJvbShpbnQqIGlu
ZGV4LCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAg
IG1fYnVmZmVyLnplcm8oKTsKKyAgICAgICAgbV93cml0ZUluZGV4ID0gMDsKKyAgICB9CisKK3By
aXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5IG1fYnVmZmVyOworICAgIHNpemVfdCBtX2xlbmd0
aDsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4OworfTsKKworLy8gfn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+CisvLyBBIFJldmVyYkNvbnZvbHZlclN0YWdlIHJlcHJlc2VudHMgdGhlIGNvbnZvbHV0aW9u
IGFzc29jaWF0ZWQgd2l0aCBhIHN1Yi1zZWN0aW9uIG9mIGEgbGFyZ2UgaW1wdWxzZSByZXNwb25z
ZS4KKy8vIEl0IGluY29ycG9yYXRlcyBhIGRlbGF5IGxpbmUgdG8gYWNjb3VudCBmb3IgdGhlIG9m
ZnNldCBvZiB0aGUgc3ViLXNlY3Rpb24gd2l0aGluIHRoZSBsYXJnZXIgaW1wdWxzZSByZXNwb25z
ZS4KK2NsYXNzIFJldmVyYkNvbnZvbHZlclN0YWdlIHsKK3B1YmxpYzoKKyAgICAvLyB8cmVuZGVy
UGhhc2V8IGlzIHVzZWZ1bCB0byBrbm93IHNvIHRoYXQgd2UgY2FuIG1hbmlwdWxhdGUgdGhlCisg
ICAgLy8gcHJlIHZlcnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdpbGwgcGVyZm9ybSB0
aGVpciBoZWF2eSB3b3JrCisgICAgLy8gKEZGVCBwcm9jZXNzaW5nKSBvbiBkaWZmZXJlbnQgc2xp
Y2VzIHRvIGJhbGFuY2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFkCisgICAgUmV2ZXJi
Q29udm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICBzaXplX3QgcmVzcG9uc2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAg
c2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
X3Qgc3RhZ2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0YWdlTGVu
Z3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmZnRTaXplLAorICAgICAgICAg
ICAgICAgICAgICAgICAgIHNpemVfdCByZW5kZXJQaGFzZSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplX3QgcmVuZGVyU2xpY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogYWNjdW11bGF0aW9uQnVmZmVyKTsKKworICAgIHZpcnR1
YWwgflJldmVyYkNvbnZvbHZlclN0YWdlKCk7CisKKyAgICAvLyBXQVJOSU5HOiB8ZnJhbWVzVG9Q
cm9jZXNzfCBtdXN0IGJlIHN1Y2ggdGhhdCBpdCBldmVubHkgZGl2aWRlcyB0aGUgZGVsYXkgYnVm
ZmVyIHNpemUgKHN0YWdlX29mZnNldCkKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZVAs
IHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5k
KFJldmVyYkNvbnZvbHZlciogY29udm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKwor
ICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIFVzZWZ1bCBmb3IgYmFja2dyb3VuZCBwcm9jZXNz
aW5nCisgICAgaW50IGlucHV0UmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbnB1dFJlYWRJ
bmRleDsgfQorCitwcml2YXRlOgorICAgIEZGVEZyYW1lIG1fZmZ0S2VybmVsOworICAgIEZGVENv
bnZvbHZlciogbV9jb252b2x2ZXI7CisKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9wcmVEZWxheUJ1
ZmZlcjsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogbV9hY2N1bXVsYXRpb25CdWZm
ZXI7CisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZEluZGV4OworICAgIGludCBtX2lucHV0UmVh
ZEluZGV4OworCisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZTsgLy8gZm9yIHRl
c3RpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCisKKyAgICBzaXplX3QgbV9wcmVE
ZWxheUxlbmd0aDsKKyAgICBzaXplX3QgbV9wb3N0RGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1f
cHJlUmVhZFdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG1fZnJhbWVzUHJvY2Vzc2VkOworCisgICAg
QXVkaW9GbG9hdEFycmF5IG1fdGVtcEJ1ZmZlcjsKKworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNw
b25zZUxlbmd0aDsKK307CisKKy8vIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+
fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorY2xhc3MgUmV2ZXJi
Q29udm9sdmVyIHsKK3B1YmxpYzoKKyAgICAvLyB8bWF4RkZUU2l6ZXwgY2FuIGJlIGFkanVzdGVk
IChmcm9tIHNheSAyMDQ4IHRvIDMyNzY4KSBkZXBlbmRpbmcgb24gaG93IG11Y2ggcHJlY2lzaW9u
IGlzIG5lY2Vzc2FyeS4KKyAgICAvLyBGb3IgY2VydGFpbiB0d2Vha3kgZGUtY29udm9sdmluZyBh
cHBsaWNhdGlvbnMgdGhlIHBoYXNlIGVycm9ycyBhZGQgdXAgcXVpY2tseSBhbmQgbGVhZCB0byBu
b24tc2Vuc2ljYWwgcmVzdWx0cyB3aXRoCisgICAgLy8gbGFyZ2VyIEZGVCBzaXplcyBhbmQgc2lu
Z2xlLXByZWNpc2lvbiBmbG9hdHMuICBJbiB0aGVzZSBjYXNlcyAyMDQ4IGlzIGEgZ29vZCBzaXpl
LgorICAgIC8vIElmIG5vdCBkb2luZyBtdWx0aS10aHJlYWRlZCBjb252b2x1dGlvbiwgdGhlbiBz
aG91bGQgbm90IGdvID4gODE5Mi4KKyAgICBSZXZlcmJDb252b2x2ZXIoQXVkaW9DaGFubmVsKiBp
bXB1bHNlUmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW5kZXJTbGljZVNp
emUsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhGRlRTaXplLAorICAgICAgICAgICAg
ICAgICAgICBzaXplX3QgY29udm9sdmVyUmVuZGVyUGhhc2UsCisgICAgICAgICAgICAgICAgICAg
IGJvb2wgdXNlQmFja2dyb3VuZFRocmVhZHMpOworCisgICAgdmlydHVhbCB+UmV2ZXJiQ29udm9s
dmVyKCk7CisKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsCisgICAgICAgICAgICAg
ICAgIGZsb2F0KiBkZXN0UCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUHJvY2Vz
cyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBzaXplX3QgaW1wdWxzZVJlc3BvbnNlTGVu
Z3RoKCk7CisKKyAgICB2b2lkIGJhY2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIFJldmVyYklu
cHV0QnVmZmVyJiBpbnB1dEJ1ZmZlcigpIHsgcmV0dXJuIG1faW5wdXRCdWZmZXI7IH0KKworICAg
IGJvb2wgdXNlQmFja2dyb3VuZFRocmVhZHMoKSBjb25zdCB7IHJldHVybiBtX3VzZUJhY2tncm91
bmRUaHJlYWRzOyB9CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPFJldmVyYkNvbnZvbHZlclN0YWdl
Kj4gbV9zdGFnZXM7CisgICAgVmVjdG9yPFJldmVyYkNvbnZvbHZlclN0YWdlKj4gbV9iYWNrZ3Jv
dW5kU3RhZ2VzOworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKKworICAgIFJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIEZv
ciBtdWx0aXRocmVhZGluZworICAgIFJldmVyYklucHV0QnVmZmVyIG1faW5wdXRCdWZmZXI7CisK
KyAgICAvLyBXZSdyZSBnaXZlbiBhIHJlbmRlcmluZyBoaW50LCBzbyB0aGUgRkZUcyBjYW4gYmUg
b3B0aW1pemVkIHRvIG5vdCBhbGwgb2NjdXIgYXQgdGhlIHNhbWUgdGltZQorICAgIC8vICh2ZXJ5
IGJhZCB3aGVuIHJlbmRlcmluZyBvbiBhIHJlYWwtdGltZSB0aHJlYWQpCisgICAgc2l6ZV90IG1f
cmVuZGVyU2xpY2VTaXplOworCisgICAgLy8gRmlyc3Qgc3RhZ2Ugd2lsbCBiZSBvZiBzaXplIHxt
X21pbkZGVFNpemV8LiAgRWFjaCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2UgYXMgYmlnIHVudGls
IHdlIGhpdCB8bV9tYXhGRlRTaXplfAorICAgIHNpemVfdCBtX21pbkZGVFNpemU7CisgICAgc2l6
ZV90IG1fbWF4RkZUU2l6ZTsKKworICAgIC8vIEJ1dCBkb24ndCBleGNlZWQgdGhpcyBzaXplIGlu
IHRoZSByZWFsLXRpbWUgdGhyZWFkIChpZiB3ZSdyZSBkb2luZyBiYWNrZ3JvdW5kIHByb2Nlc3Np
bmcpCisgICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRTaXplOworCisgICAgLy8gRklYTUUgOiB1
c2UgdGhyZWFkIGFic3RyYWN0aW9uIChhc3N1bWluZyBwdGhyZWFkcyBoZXJlKQorICAgIGJvb2wg
bV91c2VCYWNrZ3JvdW5kVGhyZWFkczsKKyAgICBwdGhyZWFkX3QgbV9iYWNrZ3JvdW5kVGhyZWFk
OworICAgIGJvb2wgbV93YW50c1RvRXhpdDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50748</attachid>
            <date>2010-03-15 16:12:46 -0700</date>
            <delta_ts>2010-03-15 16:14:49 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100315161245.patch</filename>
            <type>text/plain</type>
            <size>38739</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uZGI2Yzk4NiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0xNSAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlv
L1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkQW5kQ2xlYXIpOgor
ICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjp1cGRhdGVSZWFkSW5k
ZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVs
YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZElu
ZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZFRp
bWVGcmFtZSk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcDog
QWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2gpOgorICAg
ICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpSZXZlcmJDb252b2x2ZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp+UmV2ZXJiQ29udm9sdmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6YmFja2dyb3VuZFRocmVhZEVudHJ5KToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJD
b3JlOjpSZXZlcmJDb252b2x2ZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9S
ZXZlcmJDb252b2x2ZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OmlucHV0QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6dXNl
QmFja2dyb3VuZFRocmVhZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZv
bHZlclN0YWdlLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJT
dGFnZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29u
dm9sdmVyU3RhZ2U6OnByb2Nlc3NJbkJhY2tncm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3MpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29u
dm9sdmVyU3RhZ2U6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252
b2x2ZXJTdGFnZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0
YWdlOjppbnB1dFJlYWRJbmRleCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5w
dXRCdWZmZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVy
OjpSZXZlcmJJbnB1dEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1dEJ1ZmZl
cjo6d3JpdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OmRpcmVjdFJl
YWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjpyZXNldCk6Cisg
ICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGVJbmRleCk6CisKIDIwMTAtMDMt
MDUgIENzYWJhIE9zenRyb2dvbsOhYyAgPG9zc3lAd2Via2l0Lm9yZz4KIAogICAgICAgICBVbnJl
dmlld2VkIGJ1aWxkZml4IGFmdGVyIHI1NTU5My4gKFRvIGZpeCBRdCAtLW1pbmltYWwgYnVpbGQu
KQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZm
ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTBkYzUKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlci5jcHAKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhl
IG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0
aCkKKyAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAsIG1fcmVhZEluZGV4KDApCisgICAgLCBt
X3JlYWRUaW1lRnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6
OnJlYWRBbmRDbGVhcihmbG9hdCogZGVzdFAsIHNpemVfdCBuZnJhbWVzKQoreworICAgIEFTU0VS
VChtX3JlYWRJbmRleCA8PSBtX2xlbmd0aCk7CisgICAgc2l6ZV90IGZyYW1lc0F2YWlsYWJsZSA9
IG1fbGVuZ3RoIC0gbV9yZWFkSW5kZXg7CisgICAgc2l6ZV90IG5mcmFtZXMxID0gKG5mcmFtZXMg
PD0gZnJhbWVzQXZhaWxhYmxlKSA/IG5mcmFtZXMgOiBmcmFtZXNBdmFpbGFibGU7CisgICAgc2l6
ZV90IG5mcmFtZXMyID0gbmZyYW1lcyAtIG5mcmFtZXMxOworCisgICAgZmxvYXQqIHNvdXJjZVAg
PSBtX2J1ZmZlcjsKKyAgICBtZW1jcHkoZGVzdFAsIHNvdXJjZVAgKyBtX3JlYWRJbmRleCwgc2l6
ZW9mKGZsb2F0KSAqIG5mcmFtZXMxKTsKKyAgICBtZW1zZXQoc291cmNlUCArIG1fcmVhZEluZGV4
LCAwLCBzaXplb2YoZmxvYXQpICogbmZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJv
dW5kIGlmIG5lY2Vzc2FyeQorICAgIGlmIChuZnJhbWVzMiA+IDApIHsKKyAgICAgICAgbWVtY3B5
KGRlc3RQICsgbmZyYW1lczEsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBuZnJhbWVzMik7Cisg
ICAgICAgIG1lbXNldChzb3VyY2VQLCAwLCBzaXplb2YoZmxvYXQpICogbmZyYW1lczIpOworICAg
IH0KKworICAgIG1fcmVhZEluZGV4ID0gKG1fcmVhZEluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0
aDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgKz0gbmZyYW1lczsKK30KKwordm9pZCBSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG5m
cmFtZXMpCit7CisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHxyZWFkSW5kZXh8CisgICAgKnJlYWRJ
bmRleCA9ICgqcmVhZEluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0aDsKK30KKworaW50IFJldmVy
YkFjY3VtdWxhdGlvbkJ1ZmZlcjo6YWNjdW11bGF0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG5m
cmFtZXMsIGludCogcmVhZEluZGV4LCBzaXplX3QgZGVsYXlGcmFtZXMpCit7CisgICAgc2l6ZV90
IHdyaXRlSW5kZXggPSAoKnJlYWRJbmRleCArIGRlbGF5RnJhbWVzKSAlIG1fbGVuZ3RoOworCisg
ICAgLy8gVXBkYXRlIGNhbGxlcidzIHxyZWFkSW5kZXh8CisgICAgKnJlYWRJbmRleCA9ICgqcmVh
ZEluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0aDsKKworICAgIEFTU0VSVCh3cml0ZUluZGV4IDw9
IG1fbGVuZ3RoKTsKKyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gbV9sZW5ndGggLSB3cml0
ZUluZGV4OworICAgIHNpemVfdCBuZnJhbWVzMSA9IChuZnJhbWVzIDw9IGZyYW1lc0F2YWlsYWJs
ZSkgPyBuZnJhbWVzIDogZnJhbWVzQXZhaWxhYmxlOworICAgIHNpemVfdCBuZnJhbWVzMiA9IG5m
cmFtZXMgLSBuZnJhbWVzMTsKKworICAgIGZsb2F0KiBkZXN0UCA9IG1fYnVmZmVyOworCisgICAg
dmFkZChzb3VyY2VQLCAxLCBkZXN0UCArIHdyaXRlSW5kZXgsIDEsIGRlc3RQICsgd3JpdGVJbmRl
eCwgMSwgbmZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vzc2Fy
eQorICAgIGlmIChuZnJhbWVzMiA+IDApCisgICAgICAgIHZhZGQoc291cmNlUCArIG5mcmFtZXMx
LCAxLCBkZXN0UCwgMSwgZGVzdFAsIDEsIG5mcmFtZXMyKTsKKworICAgIHJldHVybiB3cml0ZUlu
ZGV4OworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQoKQoreworICAg
IG1fYnVmZmVyLnplcm8oKTsKKyAgICBtX3JlYWRJbmRleCA9IDA7CisgICAgbV9yZWFkVGltZUZy
YW1lID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNmE1YTY1YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmgKQEAgLTAsMCArMSw2OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKKyNkZWZpbmUgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKKy8vIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBpcyBhIGNpcmN1bGFy
IGRlbGF5IGJ1ZmZlciB3aXRoIG9uZSBjbGllbnQgcmVhZGluZyBmcm9tIGl0IGFuZCBtdWx0aXBs
ZSBjbGllbnRzCisvLyB3cml0aW5nL2FjY3VtdWxhdGluZyB0byBpdCBhdCBkaWZmZXJlbnQgZGVs
YXkgb2Zmc2V0cyBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLiAgVGhlIHJlYWQgb3BlcmF0aW9uIHdp
bGwgemVybyB0aGUgbWVtb3J5CisvLyBqdXN0IHJlYWQgZnJvbSB0aGUgYnVmZmVyLCBzbyBpdCB3
aWxsIGJlIHJlYWR5IGZvciBhY2N1bXVsYXRpb24gdGhlIG5leHQgdGltZSBhcm91bmQuCitjbGFz
cyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIgeworcHVibGljOgorICAgIFJldmVyYkFjY3VtdWxh
dGlvbkJ1ZmZlcihzaXplX3QgbGVuZ3RoKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWFkIGZyb20s
IHRoZW4gY2xlYXItb3V0IHxuZnJhbWVzfAorICAgIHZvaWQgcmVhZEFuZENsZWFyKGZsb2F0KiBk
ZXN0UCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgLy8gRWFjaCBSZXZlcmJDb252b2x2ZXJTdGFn
ZSB3aWxsIGFjY3VtdWxhdGUgaXRzIG91dHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgZGVsYXkgZnJv
bSB0aGUgcmVhZCBwb3NpdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW4gYW5kIHVwZGF0
ZSB8cmVhZEluZGV4fCBoZXJlLCBzaW5jZSBlYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIG1heSBi
ZSBydW5uaW5nIGluCisgICAgLy8gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlIHJlYWx0aW1l
IHRocmVhZCBjYWxsaW5nIFJlYWRBbmRDbGVhcigpIGFuZCBtYWludGFpbmluZyB8bV9yZWFkSW5k
ZXh8CisgICAgLy8gUmV0dXJucyB0aGUgfHdyaXRlSW5kZXh8IHdoZXJlIHRoZSBhY2N1bXVsYXRp
b24gdG9vayBwbGFjZQorICAgIGludCBhY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2VQLCBzaXplX3Qg
bmZyYW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcyk7CisKKyAgICBzaXpl
X3QgcmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkSW5kZXg7IH0KKyAgICB2b2lkIHVw
ZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgc2l6
ZV90IHJlYWRUaW1lRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX3JlYWRUaW1lRnJhbWU7IH0KKwor
ICAgIHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9idWZm
ZXI7CisgICAgc2l6ZV90IG1fbGVuZ3RoOworICAgIHNpemVfdCBtX3JlYWRJbmRleDsKKyAgICBz
aXplX3QgbV9yZWFkVGltZUZyYW1lOyAvLyBmb3IgZGVidWdnaW5nIChmcmFtZSBvbiBjb250aW51
b3VzIHRpbWVsaW5lKQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJi
Q29udm9sdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWJmNTU5
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2
ZXIuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVp
dGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlJldmVyYkNvbnZvbHZlci5oIgorCisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUg
IkF1ZGlvQnVzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IElucHV0QnVm
ZmVyU2l6ZSA9IDggKiAxNjM4NDsKKworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFkaW5nIHBv
cnRpb24gb2YgdGhlIGltcHVsc2UgcmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQuICBX
ZSBkb24ndCBleGNlZWQgdGhpcyBsZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwgdGhhdCB0
aGUgYmFja2dyb3VuZCB0aHJlYWQgaGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGluZyBzbG9w
LgorLy8gRW1waXJpY2FsbHksIHRoaXMgaGFzIGJlZW4gZm91bmQgdG8gYmUgYSBnb29kIGNvbXBy
b21pc2UgYmV0d2VlbiBnaXZpbmcgZW5vdWdoIHRpbWUgZm9yIHNjaGVkdWxpbmcgc2xvcCwKKy8v
IHdoaWxlIHN0aWxsIG1pbmltaXppbmcgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIGRvbmUgaW4g
dGhlIHByaW1hcnkgKGhpZ2gtcHJpb3JpdHkpIHRocmVhZC4KKy8vIFRoaXMgd2FzIGZvdW5kIHRv
IGJlIGEgZ29vZCB2YWx1ZSBvbiBNYWMgT1MgWCwgYW5kIG1heSB3b3JrIHdlbGwgb24gb3RoZXIg
cGxhdGZvcm1zIGFzIHdlbGwsIGFzc3VtaW5nCisvLyB0aGUgdmVyeSByb3VnaCBzY2hlZHVsaW5n
IGxhdGVuY2llcyBhcmUgc2ltaWxhciBvbiB0aGVzZSB0aW1lLXNjYWxlcy4gIE9mIGNvdXJzZSwg
dGhpcyBjb2RlIG1heSBuZWVkIHRvIGJlCisvLyB0dW5lZCBmb3IgaW5kaXZpZHVhbCBwbGF0Zm9y
bXMgaWYgdGhpcyBhc3N1bXB0aW9uIGlzIGZvdW5kIHRvIGJlIGluY29ycmVjdC4KK2NvbnN0IHNp
emVfdCBSZWFsdGltZUZyYW1lTGltaXQgPSA4MTkyICArIDQwOTY7IC8vIH4yNzhtc2VjIEAgNDQu
MUtIegorCitjb25zdCBzaXplX3QgTWluRkZUU2l6ZSA9IDI1NjsKK2NvbnN0IHNpemVfdCBNYXhS
ZWFsdGltZUZGVFNpemUgPSAyMDQ4OworCitzdGF0aWMgdm9pZCogQmFja2dyb3VuZFRocmVhZERp
c3BhdGNoKHZvaWQqIHRocmVhZERhdGEpCit7CisgICAgUmV2ZXJiQ29udm9sdmVyKiByZXZlcmJD
b252b2x2ZXIgPSBzdGF0aWNfY2FzdDxSZXZlcmJDb252b2x2ZXIqPih0aHJlYWREYXRhKTsKKyAg
ICByZXZlcmJDb252b2x2ZXItPmJhY2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAw
OworfQorCitSZXZlcmJDb252b2x2ZXI6OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGlt
cHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUs
IHNpemVfdCBjb252b2x2ZXJSZW5kZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcykK
KyAgICA6IG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXpl
KCkpCisgICAgLCBtX2FjY3VtdWxhdGlvbkJ1ZmZlcihpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6
ZSgpICsgcmVuZGVyU2xpY2VTaXplKQorICAgICwgbV9pbnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNp
emUpCisgICAgLCBtX3JlbmRlclNsaWNlU2l6ZShyZW5kZXJTbGljZVNpemUpCisgICAgLCBtX3Vz
ZUJhY2tncm91bmRUaHJlYWRzKHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgICwgbV93YW50c1Rv
RXhpdChmYWxzZSkKK3sKKyAgICBtX21pbkZGVFNpemUgPSBNaW5GRlRTaXplOyAvLyBGaXJzdCBz
dGFnZSB3aWxsIGhhdmUgdGhpcyBzaXplIC0gc3VjY2Vzc2l2ZSBzdGFnZXMgd2lsbCBkb3VibGUg
aW4gc2l6ZSBlYWNoIHRpbWUKKyAgICBtX21heEZGVFNpemUgPSBtYXhGRlRTaXplOyAvLyB1bnRp
bCB3ZSBoaXQgfG1fbWF4RkZUU2l6ZXwKKworICAgIC8vIElmIHdlIGFyZSB1c2luZyBiYWNrZ3Jv
dW5kIHRocmVhZHMgdGhlbiBkb24ndCBleGNlZWQgdGhpcyBGRlQgc2l6ZSBmb3IgdGhlCisgICAg
Ly8gc3RhZ2VzIHdoaWNoIHJ1biBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFRoaXMgYXZvaWRz
IGhhdmluZyBvbmx5IG9uZSBvciB0d28KKyAgICAvLyBsYXJnZSBzdGFnZXMgKHNpemUgMTYzODQg
b3Igc28pIGF0IHRoZSBlbmQgd2hpY2ggdGFrZSBhIGxvdCBvZiB0aW1lIGV2ZXJ5IHNldmVyYWwK
KyAgICAvLyBwcm9jZXNzaW5nIHNsaWNlcy4gIFRoaXMgd2F5IHdlIGFtb3J0aXplIHRoZSBjb3N0
IG92ZXIgbW9yZSBwcm9jZXNzaW5nIHNsaWNlcy4KKyAgICBtX21heFJlYWx0aW1lRkZUU2l6ZSA9
IE1heFJlYWx0aW1lRkZUU2l6ZTsKKworICAgIC8vIEZvciB0aGUgbW9tZW50LCBhIGdvb2Qgd2F5
IHRvIGtub3cgaWYgd2UgaGF2ZSByZWFsLXRpbWUgY29uc3RyYWludCBpcyB0byBjaGVjayBpZiB3
ZSdyZSB1c2luZyBiYWNrZ3JvdW5kIHRocmVhZHMuCisgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUg
d2UncmUgYmVpbmcgcnVuIGZyb20gYSBjb21tYW5kLWxpbmUgdG9vbC4KKyAgICBib29sIGhhc1Jl
YWx0aW1lQ29uc3RyYWludCA9IHVzZUJhY2tncm91bmRUaHJlYWRzOworCisgICAgZmxvYXQqIHJl
c3BvbnNlID0gaW1wdWxzZVJlc3BvbnNlLT5kYXRhKCk7CisgICAgc2l6ZV90IHRvdGFsUmVzcG9u
c2VMZW5ndGggPSBpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpOworICAgIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciogYWNjdW1CdWZmZXJQID0gJm1fYWNjdW11bGF0aW9uQnVmZmVyOworCisg
ICAgLy8gQmVjYXVzZSB3ZSdyZSBub3QgdXNpbmcgZGlyZWN0LWNvbnZvbHV0aW9uIGluIHRoZSBs
ZWFkaW5nIHBvcnRpb24sIHRoZSByZXZlcmIgaGFzIGFuIG92ZXJhbGwgbGF0ZW5jeSBvZiBoYWxm
IHRoZSBmaXJzdC1zdGFnZSBGRlQgc2l6ZQorICAgIHNpemVfdCByZXZlcmJUb3RhbExhdGVuY3kg
PSBtX21pbkZGVFNpemUgLyAyOworCisgICAgc2l6ZV90IHN0YWdlT2Zmc2V0ID0gMDsKKyAgICBp
bnQgaSA9IDA7CisgICAgc2l6ZV90IGZmdFNpemUgPSBtX21pbkZGVFNpemU7CisgICAgd2hpbGUg
KHN0YWdlT2Zmc2V0IDwgdG90YWxSZXNwb25zZUxlbmd0aCkgeworICAgICAgICBzaXplX3Qgc3Rh
Z2VTaXplID0gZmZ0U2l6ZSAvIDI7CisKKyAgICAgICAgLy8gRm9yIHRoZSBsYXN0IHN0YWdlLCBp
dCdzIHBvc3NpYmxlIHRoYXQgfHN0YWdlT2Zmc2V0fCBpcyBzdWNoIHRoYXQgd2UncmUgc3RyYWRk
bGluZyB0aGUgZW5kCisgICAgICAgIC8vIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciAo
aWYgd2UgdXNlIHxzdGFnZVNpemV8KSwgc28gcmVkdWNlIHRoZSBsYXN0IHN0YWdlJ3MgbGVuZ3Ro
Li4uCisgICAgICAgIGlmIChzdGFnZVNpemUgKyBzdGFnZU9mZnNldCA+IHRvdGFsUmVzcG9uc2VM
ZW5ndGgpCisgICAgICAgICAgICBzdGFnZVNpemUgPSB0b3RhbFJlc3BvbnNlTGVuZ3RoIC0gc3Rh
Z2VPZmZzZXQ7CisKKyAgICAgICAgLy8gVGhpcyAic3RhZ2dlcnMiIHRoZSB0aW1lIHdoZW4gZWFj
aCBGRlQgaGFwcGVucyBzbyB0aGV5IGRvbid0IGFsbCBoYXBwZW4gYXQgdGhlIHNhbWUgdGltZQor
ICAgICAgICBpbnQgcmVuZGVyUGhhc2UgPSBjb252b2x2ZXJSZW5kZXJQaGFzZSArIGkgKiByZW5k
ZXJTbGljZVNpemU7CisKKyAgICAgICAgUmV2ZXJiQ29udm9sdmVyU3RhZ2UqIHN0YWdlID0gbmV3
IFJldmVyYkNvbnZvbHZlclN0YWdlKHJlc3BvbnNlLCB0b3RhbFJlc3BvbnNlTGVuZ3RoLCByZXZl
cmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zmc2V0LCBzdGFnZVNpemUsIGZmdFNpemUsIHJlbmRlclBo
YXNlLCByZW5kZXJTbGljZVNpemUsIGFjY3VtQnVmZmVyUCk7CisKKyAgICAgICAgYm9vbCBpc0Jh
Y2tncm91bmRTdGFnZSA9IGZhbHNlOworCisgICAgICAgIGlmIChzdGFnZU9mZnNldCA8PSBSZWFs
dGltZUZyYW1lTGltaXQpCisgICAgICAgICAgICBtX3N0YWdlcy5hcHBlbmQoc3RhZ2UpOworICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT51c2VCYWNrZ3JvdW5kVGhyZWFkcygp
KSB7CisgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzLmFwcGVuZChzdGFnZSk7Cisg
ICAgICAgICAgICAgICAgaXNCYWNrZ3JvdW5kU3RhZ2UgPSB0cnVlOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgbV9zdGFnZXMuYXBwZW5kKHN0YWdlKTsKKyAgICAgICAgfQor
CisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6ZTsKKyAgICAgICAgaSsrOworCisgICAg
ICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQorICAgICAgICBmZnRTaXplICo9IDI7Cisg
ICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQgJiYgIWlzQmFja2dyb3VuZFN0YWdlICYm
IGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkKKyAgICAgICAgICAgIGZmdFNpemUgPSBt
X21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYgKGZmdFNpemUgPiBtX21heEZGVFNpemUp
CisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRTaXplOworICAgIH0KKworICAgIC8vIFN0
YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0
byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJdCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVh
bC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1bHQuLi4KKyAgICBpZiAodGhpcy0+dXNl
QmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpID4gMCkKKyAg
ICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gY3JlYXRlVGhyZWFkKEJhY2tncm91bmRUaHJlYWRE
aXNwYXRjaCwgdGhpcywgImNvbnZvbHV0aW9uIGJhY2tncm91bmQgdGhyZWFkIik7CisgICAgZWxz
ZQorICAgICAgICBtX2JhY2tncm91bmRUaHJlYWQgPSAwOworfQorCitSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIoKQoreworICAgIC8vIFdhaXQgZm9yIGJhY2tncm91bmQgdGhyZWFk
IHRvIHN0b3AKKyAgICBpZiAodXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91bmRU
aHJlYWQpIHsKKyAgICAgICAgbV93YW50c1RvRXhpdCA9IHRydWU7CisgICAgICAgIHdhaXRGb3JU
aHJlYWRDb21wbGV0aW9uKG1fYmFja2dyb3VuZFRocmVhZCwgMCk7CisgICAgfQorfQorCit2b2lk
IFJldmVyYkNvbnZvbHZlcjo6YmFja2dyb3VuZFRocmVhZEVudHJ5KCkKK3sKKyAgICB3aGlsZSAo
IW1fd2FudHNUb0V4aXQpIHsKKyAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZXJlJ3MgYW55
IG1vcmUgaW5wdXQgdG8gY29uc3VtZQorICAgICAgICBpbnQgd3JpdGVJbmRleCA9IG1faW5wdXRC
dWZmZXIud3JpdGVJbmRleCgpOworCisgICAgICAgIC8vIEV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qg
c2VlbSBsaWtlIGV2ZXJ5IHN0YWdlIG5lZWRzIHRvIG1haW50YWluIGl0cyBvd24gdmVyc2lvbiBv
ZiB8cmVhZEluZGV4fCAKKyAgICAgICAgLy8gd2UgZG8gdGhpcyBpbiBjYXNlIHdlIHdhbnQgdG8g
cnVuIGluIG1vcmUgdGhhbiBvbmUgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgICAgIGludCByZWFk
SW5kZXg7CisKKyAgICAgICAgd2hpbGUgKChyZWFkSW5kZXggPSBtX2JhY2tncm91bmRTdGFnZXNb
MF0tPmlucHV0UmVhZEluZGV4KCkpICE9IHdyaXRlSW5kZXgpIHsgLy8gRklYTUU6IGRvIGJldHRl
ciB0byBkZXRlY3QgYnVmZmVyIG92ZXJydW4uLi4KKyAgICAgICAgICAgIC8vIEZJWE1FOiByZW1v
dmUgaGFyZC1jb2RlZCB2YWx1ZQorICAgICAgICAgICAgY29uc3QgaW50IGtTbGljZVNpemUgPSAx
Mjg7CisKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2gg
c3RhZ2UKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3Rh
Z2VzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdlc1tpXS0+
cHJvY2Vzc0luQmFja2dyb3VuZCh0aGlzLCBrU2xpY2VTaXplKTsKKyAgICAgICAgfQorCisgICAg
ICAgIC8vIFNsZWVwIDEwbXMKKyAgICAgICAgdXNsZWVwKDEwMDAwKTsgLy8gRklYTUU6IGFsdGhv
dWdoIGl0IHdvcmtzIHdlbGwgaW4gcHJhY3RpY2UsIHRoaXMgcmVhbGx5IGlzbid0IGlkZWFsIC0g
Y291bGQgdXNlIHdhaXQvc2lnbmFsCisgICAgfQorfQorCitzaXplX3QgUmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgoKQoreworICAgIHJldHVybiBtX2ltcHVsc2VSZXNwb25z
ZUxlbmd0aDsKK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OnByb2Nlc3MoZmxvYXQqIHNvdXJj
ZVAsIGZsb2F0KiBkZXN0UCwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyAgICAvLyBGZWVk
IGlucHV0IGJ1ZmZlciAocmVhZCBieSBhbGwgdGhyZWFkcykKKyAgICBtX2lucHV0QnVmZmVyLndy
aXRlKHNvdXJjZVAsIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBBY2N1bXVsYXRlIGNvbnRy
aWJ1dGlvbnMgZnJvbSBlYWNoIHN0YWdlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N0
YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9zdGFnZXNbaV0tPnByb2Nlc3Moc291cmNlUCwg
ZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBmcm9tIGFjY3VtdWxhdGlv
biBidWZmZXIKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5kQ2xlYXIoZGVzdFAsIGZy
YW1lc1RvUHJvY2Vzcyk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpyZXNldCgpCit7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N0YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAg
bV9zdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fYmFj
a2dyb3VuZFN0YWdlcy5zaXplKCk7ICsraSkKKyAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzW2ld
LT5yZXNldCgpOworCisgICAgbV9hY2N1bXVsYXRpb25CdWZmZXIucmVzZXQoKTsKKyAgICBtX2lu
cHV0QnVmZmVyLnJlc2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmggYi9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjhjYzFkOWUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYkNvbnZvbHZlci5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNv
bnZvbHZlcl9oCisjZGVmaW5lIFJldmVyYkNvbnZvbHZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zs
b2F0QXJyYXkuaCIKKyNpbmNsdWRlICJGRlRDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJB
Y2N1bXVsYXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgor
I2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgor
I2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBB
dWRpb0NoYW5uZWw7CisKK2NsYXNzIFJldmVyYkNvbnZvbHZlciB7CitwdWJsaWM6CisgICAgLy8g
fG1heEZGVFNpemV8IGNhbiBiZSBhZGp1c3RlZCAoZnJvbSBzYXkgMjA0OCB0byAzMjc2OCkgZGVw
ZW5kaW5nIG9uIGhvdyBtdWNoIHByZWNpc2lvbiBpcyBuZWNlc3NhcnkuCisgICAgLy8gRm9yIGNl
cnRhaW4gdHdlYWt5IGRlLWNvbnZvbHZpbmcgYXBwbGljYXRpb25zIHRoZSBwaGFzZSBlcnJvcnMg
YWRkIHVwIHF1aWNrbHkgYW5kIGxlYWQgdG8gbm9uLXNlbnNpY2FsIHJlc3VsdHMgd2l0aAorICAg
IC8vIGxhcmdlciBGRlQgc2l6ZXMgYW5kIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRzLiAgSW4gdGhl
c2UgY2FzZXMgMjA0OCBpcyBhIGdvb2Qgc2l6ZS4KKyAgICAvLyBJZiBub3QgZG9pbmcgbXVsdGkt
dGhyZWFkZWQgY29udm9sdXRpb24sIHRoZW4gc2hvdWxkIG5vdCBnbyA+IDgxOTIuCisgICAgUmV2
ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVy
U2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNl
LCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKTsKKworICAgIHZpcnR1YWwgflJldmVyYkNvbnZv
bHZlcigpOworCisgICAgdm9pZCBwcm9jZXNzKGZsb2F0KiBzb3VyY2VQLCBmbG9hdCogZGVzdFAs
IHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCByZXNldCgpOworCisgICAgc2l6
ZV90IGltcHVsc2VSZXNwb25zZUxlbmd0aCgpOworCisgICAgUmV2ZXJiSW5wdXRCdWZmZXImIGlu
cHV0QnVmZmVyKCkgeyByZXR1cm4gbV9pbnB1dEJ1ZmZlcjsgfQorCisgICAgYm9vbCB1c2VCYWNr
Z3JvdW5kVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlQmFja2dyb3VuZFRocmVhZHM7IH0K
KworICAgIHZvaWQgYmFja2dyb3VuZFRocmVhZEVudHJ5KCk7CisKK3ByaXZhdGU6CisgICAgVmVj
dG9yPE93blB0cjxSZXZlcmJDb252b2x2ZXJTdGFnZT4gPiBtX3N0YWdlczsKKyAgICBWZWN0b3I8
T3duUHRyPFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fYmFja2dyb3VuZFN0YWdlczsKKyAgICBz
aXplX3QgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGg7CisKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIgbV9hY2N1bXVsYXRpb25CdWZmZXI7CisKKyAgICAvLyBGb3IgbXVsdGl0aHJlYWRpbmcK
KyAgICBSZXZlcmJJbnB1dEJ1ZmZlciBtX2lucHV0QnVmZmVyOworCisgICAgLy8gV2UncmUgZ2l2
ZW4gYSByZW5kZXJpbmcgaGludCwgc28gdGhlIEZGVHMgY2FuIGJlIG9wdGltaXplZCB0byBub3Qg
YWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAvLyAodmVyeSBiYWQgd2hlbiByZW5kZXJp
bmcgb24gYSByZWFsLXRpbWUgdGhyZWFkKQorICAgIHNpemVfdCBtX3JlbmRlclNsaWNlU2l6ZTsK
KworICAgIC8vIEZpcnN0IHN0YWdlIHdpbGwgYmUgb2Ygc2l6ZSB8bV9taW5GRlRTaXplfC4gIEVh
Y2ggbmV4dCBzdGFnZSB3aWxsIGJlIHR3aWNlIGFzIGJpZyB1bnRpbCB3ZSBoaXQgfG1fbWF4RkZU
U2l6ZXwKKyAgICBzaXplX3QgbV9taW5GRlRTaXplOworICAgIHNpemVfdCBtX21heEZGVFNpemU7
CisKKyAgICAvLyBCdXQgZG9uJ3QgZXhjZWVkIHRoaXMgc2l6ZSBpbiB0aGUgcmVhbC10aW1lIHRo
cmVhZCAoaWYgd2UncmUgZG9pbmcgYmFja2dyb3VuZCBwcm9jZXNzaW5nKQorICAgIHNpemVfdCBt
X21heFJlYWx0aW1lRkZUU2l6ZTsKKworICAgIGJvb2wgbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsK
KyAgICBUaHJlYWRJZGVudGlmaWVyIG1fYmFja2dyb3VuZFRocmVhZDsKKyAgICBib29sIG1fd2Fu
dHNUb0V4aXQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZl
cmJDb252b2x2ZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJD
b252b2x2ZXJTdGFnZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZl
clN0YWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjY5NTZkCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJT
dGFnZS5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhl
IG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKyNp
bmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252
b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJJbnB1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK1JldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZShmbG9h
dCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VMZW5ndGgsIHNpemVfdCByZXZlcmJU
b3RhbExhdGVuY3ksIHNpemVfdCBzdGFnZU9mZnNldCwgc2l6ZV90IHN0YWdlTGVuZ3RoLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmZnRTaXplLCBz
aXplX3QgcmVuZGVyUGhhc2UsIHNpemVfdCByZW5kZXJTbGljZVNpemUsIFJldmVyYkFjY3VtdWxh
dGlvbkJ1ZmZlciogYWNjdW11bGF0aW9uQnVmZmVyKQorICAgIDogbV9mZnRLZXJuZWwoZmZ0U2l6
ZSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVmZmVyKGFjY3VtdWxhdGlvbkJ1ZmZlcikKKyAgICAs
IG1fYWNjdW11bGF0aW9uUmVhZEluZGV4KDApCisgICAgLCBtX2lucHV0UmVhZEluZGV4KDApCisg
ICAgLCBtX2FjY3VtdWxhdGlvblJlYWRUaW1lRnJhbWUoMCkKKyAgICAsIG1faW1wdWxzZVJlc3Bv
bnNlTGVuZ3RoKHJlc3BvbnNlTGVuZ3RoKQoreworICAgIG1fZmZ0S2VybmVsLmRvUGFkZGVkRkZU
KGltcHVsc2VSZXNwb25zZSArIHN0YWdlT2Zmc2V0LCBzdGFnZUxlbmd0aCk7CisKKyAgICBtX2Nv
bnZvbHZlciA9IG5ldyBGRlRDb252b2x2ZXIoZmZ0U2l6ZSk7CisKKyAgICBtX3RlbXBCdWZmZXIu
YWxsb2NhdGUocmVuZGVyU2xpY2VTaXplKTsKKworICAgIC8vIFRoZSBjb252b2x1dGlvbiBzdGFn
ZSBhdCBvZmZzZXQgfHN0YWdlT2Zmc2V0fCBuZWVkcyB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBk
ZWxheSB0byBjYW5jZWwgb3V0IHRoZSBvZmZzZXQKKyAgICBzaXplX3QgdG90YWxEZWxheSA9IHN0
YWdlT2Zmc2V0ICsgcmV2ZXJiVG90YWxMYXRlbmN5OworCisgICAgLy8gQnV0LCB0aGUgRkZUIGNv
bnZvbHV0aW9uIGl0c2VsZiBpbmN1cnMgfGZmdFNpemV8IC8gMiBsYXRlbmN5LCBzbyBzdWJ0cmFj
dCB0aGlzIG91dC4uLgorICAgIHNpemVfdCBoYWxmU2l6ZSA9IGZmdFNpemUgLyAyOworICAgIGlm
ICh0b3RhbERlbGF5ID49IGhhbGZTaXplKQorICAgICAgICB0b3RhbERlbGF5IC09IGhhbGZTaXpl
OworCisgICAgLy8gRklYTUU6IERFQUwgd2l0aCBjYXNlIHdoZW4gdG90YWwgZGVsYXkgaXMgbGVz
cyB0aGFuIGZmdFNpemUvMi4uLi4KKworICAgIC8vIFdlIGRpdmlkZSB1cCB0aGUgdG90YWwgZGVs
YXksIGludG8gcHJlIGFuZCBwb3N0IGRlbGF5IHNlY3Rpb25zIHNvIHRoYXQgd2UgY2FuCisgICAg
Ly8gc2NoZWR1bGUgYXQgZXhhY3RseSB0aGUgbW9tZW50IHdoZW4gdGhlIEZGVCB3aWxsIGhhcHBl
bi4gIFRoaXMgaXMgY29vcmRpbmF0ZWQKKyAgICAvLyB3aXRoIHRoZSBvdGhlciBzdGFnZXMsIHNv
IHRoZXkgZG9uJ3QgYWxsIGRvIHRoZWlyIEZGVHMgYXQgdGhlIHNhbWUgdGltZS4uLgorCisgICAg
aW50IG0gPSAoaGFsZlNpemUgPD0gdG90YWxEZWxheSkgPyBoYWxmU2l6ZSA6IHRvdGFsRGVsYXk7
CisgICAgbV9wcmVEZWxheUxlbmd0aCA9ICh0b3RhbERlbGF5ID4gMCkgPyAocmVuZGVyUGhhc2Ug
JSBtKSA6IDA7CisKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IHRvdGFsRGVsYXkpCisgICAg
ICAgIG1fcHJlRGVsYXlMZW5ndGggPSAwOworCisgICAgbV9wb3N0RGVsYXlMZW5ndGggPSB0b3Rh
bERlbGF5IC0gbV9wcmVEZWxheUxlbmd0aDsKKyAgICBtX3ByZVJlYWRXcml0ZUluZGV4ID0gMDsK
KyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7IC8vIHRvdGFsIGZyYW1lcyBwcm9jZXNzZWQgc28g
ZmFyCisKKyAgICBtX3ByZURlbGF5QnVmZmVyLmFsbG9jYXRlKG1fcHJlRGVsYXlMZW5ndGggPCBm
ZnRTaXplID8gZmZ0U2l6ZSA6IG1fcHJlRGVsYXlMZW5ndGgpOworfQorCit2b2lkIFJldmVyYkNv
bnZvbHZlclN0YWdlOjpwcm9jZXNzSW5CYWNrZ3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29udm9s
dmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXpl
X3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIFJldmVyYklucHV0QnVmZmVyJiBpbnB1dEJ1ZmZl
ciA9IGNvbnZvbHZlci0+aW5wdXRCdWZmZXIoKTsKKyAgICBmbG9hdCogc291cmNlUCA9IGlucHV0
QnVmZmVyLmRpcmVjdFJlYWRGcm9tKCZtX2lucHV0UmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3Mp
OworICAgIHByb2Nlc3Moc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCAgUmV2
ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIC8v
CisgICAgLy8gRklYTUU6IGRvIHNhbml0eSBjaGVjayBvbiBmcmFtZXNUb1Byb2Nlc3MgdmVyc3Vz
IGRlbGF5IGJ1ZmZlciBzaXplCisgICAgLy8KKworICAgIC8vIEdldCBwb2ludGVyIHRvIHByZS1k
ZWxheSBzdHJlYW0gOiBub3RlIHNwZWNpYWwgaGFuZGxpbmcgb2YgemVybyBkZWxheQorICAgIGZs
b2F0KiBwcmVEZWxheWVkU291cmNlUCA9IHNvdXJjZVA7CisgICAgZmxvYXQqIHByZURlbGF5QnVm
ZmVyUCA9IG1fcHJlRGVsYXlCdWZmZXI7CisgICAgZmxvYXQqIHRlbXBQID0gcHJlRGVsYXlCdWZm
ZXJQOworICAgIGlmIChtX3ByZURlbGF5TGVuZ3RoID4gMCkgeworICAgICAgICBwcmVEZWxheWVk
U291cmNlUCA9IHByZURlbGF5QnVmZmVyUCArIG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAgICAg
IHRlbXBQID0gbV90ZW1wQnVmZmVyOworICAgIH0KKworICAgIGludCB3cml0ZUluZGV4ID0gMDsK
KworICAgIGlmIChtX2ZyYW1lc1Byb2Nlc3NlZCA8IG1fcHJlRGVsYXlMZW5ndGgpIHsKKyAgICAg
ICAgLy8gRm9yIHRoZSBmaXJzdCB8bV9wcmVEZWxheUxlbmd0aHwgZnJhbWVzIGRvbid0IHByb2Nl
c3MgdGhlIGNvbnZvbHZlciwgaW5zdGVhZCBzaW1wbHkgYnVmZmVyIGluIHRoZSBwcmUtZGVsYXku
CisgICAgICAgIC8vIEJ1dCB3aGlsZSBidWZmZXJpbmcgdGhlIHByZS1kZWxheSwgd2Ugc3RpbGwg
bmVlZCB0byB1cGRhdGUgb3VyIGluZGV4LgorICAgICAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci0+
dXBkYXRlUmVhZEluZGV4KCZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgZnJhbWVzVG9Qcm9jZXNz
KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3csIHJ1biB0aGUgY29udm9sdXRpb24gKGlu
dG8gdGhlIGRlbGF5IGJ1ZmZlcikKKyAgICAgICAgLy8gQW4gZXhwZW5zaXZlIEZGVCB3aWxsIGhh
cHBlbiBldmVyeSAoZmZ0U2l6ZS8yKSBmcmFtZXMKKyAgICAgICAgLy8gV2UgcHJvY2VzcyBpbi1w
bGFjZSBoZXJlLi4uCisgICAgICAgIG1fY29udm9sdmVyLT5wcm9jZXNzKCZtX2ZmdEtlcm5lbCwg
cHJlRGVsYXllZFNvdXJjZVAsIHRlbXBQLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgICAgIC8v
IE5vdyBhY2N1bXVsYXRlIGludG8gcmV2ZXJiJ3MgYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgICAg
ICAvLyBGSVhNRTogcmVhbGx5IG5lZWQgdG8gaGF2ZSBsb2NraW5nIG1lY2hhbmlzbSBoZXJlISEK
KyAgICAgICAgd3JpdGVJbmRleCA9IG1fYWNjdW11bGF0aW9uQnVmZmVyLT5hY2N1bXVsYXRlKHRl
bXBQLCBmcmFtZXNUb1Byb2Nlc3MsICZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgbV9wb3N0RGVs
YXlMZW5ndGgpOworICAgIH0KKworICAgIC8vIEZpbmFsbHkgY29weSBpbnB1dCB0byBwcmUtZGVs
YXkKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHByZURl
bGF5ZWRTb3VyY2VQLCBzb3VyY2VQLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNzKTsK
KyAgICAgICAgbV9wcmVSZWFkV3JpdGVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAgICAg
ICAgaWYgKG1fcHJlUmVhZFdyaXRlSW5kZXggPj0gbV9wcmVEZWxheUxlbmd0aCkKKyAgICAgICAg
ICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOyAvLyBzaG91bGQgb25seSBiZSA8PQorICAgIH0K
KworICAgIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSArPSBmcmFtZXNUb1Byb2Nlc3M7Cisg
ICAgbV9mcmFtZXNQcm9jZXNzZWQgKz0gZnJhbWVzVG9Qcm9jZXNzOworfQorCit2b2lkIFJldmVy
YkNvbnZvbHZlclN0YWdlOjpyZXNldCgpCit7CisgICAgbV9jb252b2x2ZXItPnJlc2V0KCk7Cisg
ICAgbV9wcmVEZWxheUJ1ZmZlci56ZXJvKCk7CisgICAgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgg
PSAwOworICAgIG1faW5wdXRSZWFkSW5kZXggPSAwOworICAgIG1fZnJhbWVzUHJvY2Vzc2VkID0g
MDsKKyAgICBtX2FjY3VtdWxhdGlvblJlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNv
bnZvbHZlclN0YWdlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0
YWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4OTcxMAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2Uu
aApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0
aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBv
ZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCisjZGVm
aW5lIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5o
IgorI2luY2x1ZGUgIkZGVENvbnZvbHZlci5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjsKK2NsYXNzIFJldmVyYkNvbnZvbHZlcjsKKyAgICAK
Ky8vIEEgUmV2ZXJiQ29udm9sdmVyU3RhZ2UgcmVwcmVzZW50cyB0aGUgY29udm9sdXRpb24gYXNz
b2NpYXRlZCB3aXRoIGEgc3ViLXNlY3Rpb24gb2YgYSBsYXJnZSBpbXB1bHNlIHJlc3BvbnNlLgor
Ly8gSXQgaW5jb3Jwb3JhdGVzIGEgZGVsYXkgbGluZSB0byBhY2NvdW50IGZvciB0aGUgb2Zmc2V0
IG9mIHRoZSBzdWItc2VjdGlvbiB3aXRoaW4gdGhlIGxhcmdlciBpbXB1bHNlIHJlc3BvbnNlLgor
Y2xhc3MgUmV2ZXJiQ29udm9sdmVyU3RhZ2UgeworcHVibGljOgorICAgIC8vIHxyZW5kZXJQaGFz
ZXwgaXMgdXNlZnVsIHRvIGtub3cgc28gdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgcHJlIHZl
cnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdpbGwgcGVyZm9ybQorICAgIC8vIHRoZWly
IGhlYXZ5IHdvcmsgKEZGVCBwcm9jZXNzaW5nKSBvbiBkaWZmZXJlbnQgc2xpY2VzIHRvIGJhbGFu
Y2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFkLgorICAgIFJldmVyYkNvbnZvbHZlclN0
YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90
IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5n
dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5k
ZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVy
KiBhY2N1bXVsYXRpb25CdWZmZXIpOworCisgICAgLy8gV0FSTklORzogfGZyYW1lc1RvUHJvY2Vz
c3wgbXVzdCBiZSBzdWNoIHRoYXQgaXQgZXZlbmx5IGRpdmlkZXMgdGhlIGRlbGF5IGJ1ZmZlciBz
aXplIChzdGFnZV9vZmZzZXQpCisgICAgdm9pZCBwcm9jZXNzKGZsb2F0KiBzb3VyY2VQLCBzaXpl
X3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQgcHJvY2Vzc0luQmFja2dyb3VuZChSZXZl
cmJDb252b2x2ZXIqIGNvbnZvbHZlciwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2
b2lkIHJlc2V0KCk7CisKKyAgICAvLyBVc2VmdWwgZm9yIGJhY2tncm91bmQgcHJvY2Vzc2luZwor
ICAgIGludCBpbnB1dFJlYWRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5wdXRSZWFkSW5kZXg7
IH0KKworcHJpdmF0ZToKKyAgICBGRlRGcmFtZSBtX2ZmdEtlcm5lbDsKKyAgICBPd25QdHI8RkZU
Q29udm9sdmVyPiBtX2NvbnZvbHZlcjsKKworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3ByZURlbGF5
QnVmZmVyOworCisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBtX2FjY3VtdWxhdGlvbkJ1
ZmZlcjsKKyAgICBpbnQgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXg7CisgICAgaW50IG1faW5wdXRS
ZWFkSW5kZXg7CisKKyAgICBpbnQgbV9hY2N1bXVsYXRpb25SZWFkVGltZUZyYW1lOyAvLyBmb3Ig
dGVzdGluZyAoZnJhbWUgb24gY29udGludW91cyB0aW1lbGluZSkKKworICAgIHNpemVfdCBtX3By
ZURlbGF5TGVuZ3RoOworICAgIHNpemVfdCBtX3Bvc3REZWxheUxlbmd0aDsKKyAgICBzaXplX3Qg
bV9wcmVSZWFkV3JpdGVJbmRleDsKKyAgICBzaXplX3QgbV9mcmFtZXNQcm9jZXNzZWQ7CisKKyAg
ICBBdWRpb0Zsb2F0QXJyYXkgbV90ZW1wQnVmZmVyOworCisgICAgc2l6ZV90IG1faW1wdWxzZVJl
c3BvbnNlTGVuZ3RoOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
UmV2ZXJiQ29udm9sdmVyU3RhZ2VfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9SZXZlcmJJbnB1dEJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklu
cHV0QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGE3N2Fk
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1
ZmZlci5jcHAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUg
bmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJSZXZlcmJJbnB1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JldmVyYklu
cHV0QnVmZmVyOjpSZXZlcmJJbnB1dEJ1ZmZlcihzaXplX3QgbGVuZ3RoKQorICAgIDogbV9idWZm
ZXIobGVuZ3RoKQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQorICAgICwgbV93cml0ZUluZGV4KDAp
Cit7Cit9CisKK3ZvaWQgUmV2ZXJiSW5wdXRCdWZmZXI6OndyaXRlKGZsb2F0KiBzb3VyY2VQLCBz
aXplX3QgbmZyYW1lcykKK3sKKyAgICBtZW1jcHkobV9idWZmZXIuZGF0YSgpICsgbV93cml0ZUlu
ZGV4LCBzb3VyY2VQLCBzaXplb2YoZmxvYXQpICogbmZyYW1lcyk7CisKKyAgICBtX3dyaXRlSW5k
ZXggKz0gbmZyYW1lczsKKyAgICBBU1NFUlQobV93cml0ZUluZGV4IDw9IG1fbGVuZ3RoKTsKKwor
ICAgIGlmIChtX3dyaXRlSW5kZXggPj0gbV9sZW5ndGgpCisgICAgICAgIG1fd3JpdGVJbmRleCA9
IDA7Cit9CisKK2Zsb2F0KiBSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20oaW50KiBp
bmRleCwgc2l6ZV90IG5mcmFtZXMpCit7CisgICAgQVNTRVJUKCppbmRleCA+PSAwICYmICppbmRl
eCArIG5mcmFtZXMgPD0gbV9sZW5ndGgpOworICAgIGZsb2F0KiBzb3VyY2VQID0gbV9idWZmZXI7
CisgICAgZmxvYXQqIHAgPSBzb3VyY2VQICsgKmluZGV4OworCisgICAgLy8gVXBkYXRlIGluZGV4
CisgICAgKmluZGV4ID0gKCppbmRleCArIG5mcmFtZXMpICUgbV9sZW5ndGg7CisKKyAgICByZXR1
cm4gcDsKK30KKwordm9pZCBSZXZlcmJJbnB1dEJ1ZmZlcjo6cmVzZXQoKQoreworICAgIG1fYnVm
ZmVyLnplcm8oKTsKKyAgICBtX3dyaXRlSW5kZXggPSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVm
ZmVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmgKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxNjY3MgotLS0gL2Rldi9udWxsCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaApAQCAtMCwwICsxLDY2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBs
ZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBSZXZlcmJJbnB1dEJ1ZmZlcl9oCisjZGVmaW5lIFJldmVyYklucHV0QnVm
ZmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKy8vIFJldmVyYklucHV0QnVmZmVyIGlzIHVzZWQgdG8gYnVmZmVyIGlucHV0IHNhbXBs
ZXMgZm9yIGRlZmVycmVkIHByb2Nlc3NpbmcgYnkgdGhlIGJhY2tncm91bmQgdGhyZWFkcworY2xh
c3MgUmV2ZXJiSW5wdXRCdWZmZXIgeworcHVibGljOgorICAgIFJldmVyYklucHV0QnVmZmVyKHNp
emVfdCBsZW5ndGgpOworCisgICAgLy8gVGhlIHJlYWx0aW1lIGF1ZGlvIHRocmVhZCBrZWVwcyB3
cml0aW5nIHNhbXBsZXMgaGVyZS4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBi
dWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJsZSBieSB8bmZyYW1lc3wgIChmb3IgbmVh
cmx5IGFsbCBjYXNlcyB0aGlzIHdpbGwgYmUgZmluZSkKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHxu
ZnJhbWVzfCByZXN0cmljdGlvbi4uLgorICAgIHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNp
emVfdCBuZnJhbWVzKTsKKworICAgIC8vIEJhY2tncm91bmQgdGhyZWFkcyBjYW4gY2FsbCB0aGlz
IHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW55dGhpbmcgdG8gcmVhZC4uLgorICAgIC8vIEZJWE1FOiBj
cmVhdGUgYmV0dGVyIHN5c3RlbSB0byBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIC8gZXJyb3Ig
Y29uZGl0aW9ucy4uLgorICAgIHNpemVfdCB3cml0ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV93
cml0ZUluZGV4OyB9CisKKyAgICAvLyBUaGUgaW5kaXZpZHVhbCBiYWNrZ3JvdW5kIHRocmVhZHMg
cmVhZCBoZXJlIChhbmQgaG9wZSB0aGF0IHRoZXkgY2FuIGtlZXAgdXAgd2l0aCB0aGUgYnVmZmVy
IHdyaXRpbmcpCisgICAgLy8gfGluZGV4fCBpcyB1cGRhdGVkIHdpdGggdGhlIG5leHQgaW5kZXgg
dG8gcmVhZCBmcm9tLi4uCisgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYnVmZmVy
J3MgbGVuZ3RoIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgfG5mcmFtZXN8CisgICAgLy8gRklYTUU6
IHJlbW92ZSB8bmZyYW1lc3wgcmVzdHJpY3Rpb24uLi4KKyAgICBmbG9hdCogZGlyZWN0UmVhZEZy
b20oaW50KiBpbmRleCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgdm9pZCByZXNldCgpOworCitw
cml2YXRlOgorICAgIEF1ZGlvRmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV9sZW5n
dGg7CisgICAgc2l6ZV90IG1fd3JpdGVJbmRleDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFJldmVyYklucHV0QnVmZmVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50749</attachid>
            <date>2010-03-15 16:14:53 -0700</date>
            <delta_ts>2010-03-17 13:01:54 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100315161452.patch</filename>
            <type>text/plain</type>
            <size>38768</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uYzdjM2ZlMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0xNSAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBqYXZhc2NyaXB0IEFQSSBpcyBub3QgeWV0IGhvb2tlZCB1
cAorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dy
b3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVm
ZmVyOjp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0wNSAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIgcjU1NTkz
LiAoVG8gZml4IFF0IC0tbWluaW1hbCBidWlsZC4pCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYTBlMGRjNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIu
aCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3Qg
bGVuZ3RoKQorICAgIDogbV9idWZmZXIobGVuZ3RoKQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQor
ICAgICwgbV9yZWFkSW5kZXgoMCkKKyAgICAsIG1fcmVhZFRpbWVGcmFtZSgwKQoreworfQorCit2
b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZEFuZENsZWFyKGZsb2F0KiBkZXN0UCwg
c2l6ZV90IG5mcmFtZXMpCit7CisgICAgQVNTRVJUKG1fcmVhZEluZGV4IDw9IG1fbGVuZ3RoKTsK
KyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gbV9sZW5ndGggLSBtX3JlYWRJbmRleDsKKyAg
ICBzaXplX3QgbmZyYW1lczEgPSAobmZyYW1lcyA8PSBmcmFtZXNBdmFpbGFibGUpID8gbmZyYW1l
cyA6IGZyYW1lc0F2YWlsYWJsZTsKKyAgICBzaXplX3QgbmZyYW1lczIgPSBuZnJhbWVzIC0gbmZy
YW1lczE7CisKKyAgICBmbG9hdCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIG1lbWNweShkZXN0
UCwgc291cmNlUCArIG1fcmVhZEluZGV4LCBzaXplb2YoZmxvYXQpICogbmZyYW1lczEpOworICAg
IG1lbXNldChzb3VyY2VQICsgbV9yZWFkSW5kZXgsIDAsIHNpemVvZihmbG9hdCkgKiBuZnJhbWVz
MSk7CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG5m
cmFtZXMyID4gMCkgeworICAgICAgICBtZW1jcHkoZGVzdFAgKyBuZnJhbWVzMSwgc291cmNlUCwg
c2l6ZW9mKGZsb2F0KSAqIG5mcmFtZXMyKTsKKyAgICAgICAgbWVtc2V0KHNvdXJjZVAsIDAsIHNp
emVvZihmbG9hdCkgKiBuZnJhbWVzMik7CisgICAgfQorCisgICAgbV9yZWFkSW5kZXggPSAobV9y
ZWFkSW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3RoOworICAgIG1fcmVhZFRpbWVGcmFtZSArPSBu
ZnJhbWVzOworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6dXBkYXRlUmVhZElu
ZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbmZyYW1lcykKK3sKKyAgICAvLyBVcGRhdGUgY2Fs
bGVyJ3MgfHJlYWRJbmRleHwKKyAgICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBuZnJhbWVz
KSAlIG1fbGVuZ3RoOworfQorCitpbnQgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVs
YXRlKGZsb2F0KiBzb3VyY2VQLCBzaXplX3QgbmZyYW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVf
dCBkZWxheUZyYW1lcykKK3sKKyAgICBzaXplX3Qgd3JpdGVJbmRleCA9ICgqcmVhZEluZGV4ICsg
ZGVsYXlGcmFtZXMpICUgbV9sZW5ndGg7CisKKyAgICAvLyBVcGRhdGUgY2FsbGVyJ3MgfHJlYWRJ
bmRleHwKKyAgICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3Ro
OworCisgICAgQVNTRVJUKHdyaXRlSW5kZXggPD0gbV9sZW5ndGgpOworICAgIHNpemVfdCBmcmFt
ZXNBdmFpbGFibGUgPSBtX2xlbmd0aCAtIHdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG5mcmFtZXMx
ID0gKG5mcmFtZXMgPD0gZnJhbWVzQXZhaWxhYmxlKSA/IG5mcmFtZXMgOiBmcmFtZXNBdmFpbGFi
bGU7CisgICAgc2l6ZV90IG5mcmFtZXMyID0gbmZyYW1lcyAtIG5mcmFtZXMxOworCisgICAgZmxv
YXQqIGRlc3RQID0gbV9idWZmZXI7CisKKyAgICB2YWRkKHNvdXJjZVAsIDEsIGRlc3RQICsgd3Jp
dGVJbmRleCwgMSwgZGVzdFAgKyB3cml0ZUluZGV4LCAxLCBuZnJhbWVzMSk7CisKKyAgICAvLyBI
YW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG5mcmFtZXMyID4gMCkKKyAg
ICAgICAgdmFkZChzb3VyY2VQICsgbmZyYW1lczEsIDEsIGRlc3RQLCAxLCBkZXN0UCwgMSwgbmZy
YW1lczIpOworCisgICAgcmV0dXJuIHdyaXRlSW5kZXg7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fcmVh
ZEluZGV4ID0gMDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVhNjVjCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXJfaAorI2RlZmluZSBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaAorCisjaW5jbHVkZSAi
QXVkaW9GbG9hdEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyIGlzIGEgY2lyY3VsYXIgZGVsYXkgYnVmZmVyIHdpdGggb25lIGNsaWVu
dCByZWFkaW5nIGZyb20gaXQgYW5kIG11bHRpcGxlIGNsaWVudHMKKy8vIHdyaXRpbmcvYWNjdW11
bGF0aW5nIHRvIGl0IGF0IGRpZmZlcmVudCBkZWxheSBvZmZzZXRzIGZyb20gdGhlIHJlYWQgcG9z
aXRpb24uICBUaGUgcmVhZCBvcGVyYXRpb24gd2lsbCB6ZXJvIHRoZSBtZW1vcnkKKy8vIGp1c3Qg
cmVhZCBmcm9tIHRoZSBidWZmZXIsIHNvIGl0IHdpbGwgYmUgcmVhZHkgZm9yIGFjY3VtdWxhdGlv
biB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KK2NsYXNzIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciB7
CitwdWJsaWM6CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKHNpemVfdCBsZW5ndGgpOwor
CisgICAgLy8gVGhpcyB3aWxsIHJlYWQgZnJvbSwgdGhlbiBjbGVhci1vdXQgfG5mcmFtZXN8Cisg
ICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RQLCBzaXplX3QgbmZyYW1lcyk7CisKKyAg
ICAvLyBFYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11bGF0ZSBpdHMgb3V0cHV0
IGF0IHRoZSBhcHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLgorICAgIC8v
IFdlIG5lZWQgdG8gcGFzcyBpbiBhbmQgdXBkYXRlIHxyZWFkSW5kZXh8IGhlcmUsIHNpbmNlIGVh
Y2ggUmV2ZXJiQ29udm9sdmVyU3RhZ2UgbWF5IGJlIHJ1bm5pbmcgaW4KKyAgICAvLyBhIGRpZmZl
cmVudCB0aHJlYWQgdGhhbiB0aGUgcmVhbHRpbWUgdGhyZWFkIGNhbGxpbmcgUmVhZEFuZENsZWFy
KCkgYW5kIG1haW50YWluaW5nIHxtX3JlYWRJbmRleHwKKyAgICAvLyBSZXR1cm5zIHRoZSB8d3Jp
dGVJbmRleHwgd2hlcmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAgaW50IGFjY3Vt
dWxhdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVzLCBpbnQqIHJlYWRJbmRleCwgc2l6
ZV90IGRlbGF5RnJhbWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgoKSBjb25zdCB7IHJldHVy
biBtX3JlYWRJbmRleDsgfQorICAgIHZvaWQgdXBkYXRlUmVhZEluZGV4KGludCogcmVhZEluZGV4
LCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICBzaXplX3QgcmVhZFRpbWVGcmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcmVhZFRpbWVGcmFtZTsgfQorCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRl
OgorICAgIEF1ZGlvRmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV9sZW5ndGg7Cisg
ICAgc2l6ZV90IG1fcmVhZEluZGV4OworICAgIHNpemVfdCBtX3JlYWRUaW1lRnJhbWU7IC8vIGZv
ciBkZWJ1Z2dpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYmY1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAKQEAgLTAsMCArMSwxOTYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisKKyNpbmNs
dWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjb25zdCBpbnQgSW5wdXRCdWZmZXJTaXplID0gOCAqIDE2Mzg0OworCisvLyBX
ZSBvbmx5IHByb2Nlc3MgdGhlIGxlYWRpbmcgcG9ydGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25z
ZSBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFdlIGRvbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4K
Ky8vIEl0IHR1cm5zIG91dCB0aGVuLCB0aGF0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBoYXMgYWJv
dXQgMjc4bXNlYyBvZiBzY2hlZHVsaW5nIHNsb3AuCisvLyBFbXBpcmljYWxseSwgdGhpcyBoYXMg
YmVlbiBmb3VuZCB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGdpdmluZyBlbm91Z2gg
dGltZSBmb3Igc2NoZWR1bGluZyBzbG9wLAorLy8gd2hpbGUgc3RpbGwgbWluaW1pemluZyB0aGUg
YW1vdW50IG9mIHByb2Nlc3NpbmcgZG9uZSBpbiB0aGUgcHJpbWFyeSAoaGlnaC1wcmlvcml0eSkg
dGhyZWFkLgorLy8gVGhpcyB3YXMgZm91bmQgdG8gYmUgYSBnb29kIHZhbHVlIG9uIE1hYyBPUyBY
LCBhbmQgbWF5IHdvcmsgd2VsbCBvbiBvdGhlciBwbGF0Zm9ybXMgYXMgd2VsbCwgYXNzdW1pbmcK
Ky8vIHRoZSB2ZXJ5IHJvdWdoIHNjaGVkdWxpbmcgbGF0ZW5jaWVzIGFyZSBzaW1pbGFyIG9uIHRo
ZXNlIHRpbWUtc2NhbGVzLiAgT2YgY291cnNlLCB0aGlzIGNvZGUgbWF5IG5lZWQgdG8gYmUKKy8v
IHR1bmVkIGZvciBpbmRpdmlkdWFsIHBsYXRmb3JtcyBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZm91
bmQgdG8gYmUgaW5jb3JyZWN0LgorY29uc3Qgc2l6ZV90IFJlYWx0aW1lRnJhbWVMaW1pdCA9IDgx
OTIgICsgNDA5NjsgLy8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBNaW5GRlRT
aXplID0gMjU2OworY29uc3Qgc2l6ZV90IE1heFJlYWx0aW1lRkZUU2l6ZSA9IDIwNDg7CisKK3N0
YXRpYyB2b2lkKiBCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2godm9pZCogdGhyZWFkRGF0YSkKK3sK
KyAgICBSZXZlcmJDb252b2x2ZXIqIHJldmVyYkNvbnZvbHZlciA9IHN0YXRpY19jYXN0PFJldmVy
YkNvbnZvbHZlcio+KHRocmVhZERhdGEpOworICAgIHJldmVyYkNvbnZvbHZlci0+YmFja2dyb3Vu
ZFRocmVhZEVudHJ5KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6UmV2
ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVy
U2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNl
LCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgIDogbV9pbXB1bHNlUmVzcG9uc2VMZW5n
dGgoaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVm
ZmVyKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkgKyByZW5kZXJTbGljZVNpemUpCisgICAg
LCBtX2lucHV0QnVmZmVyKElucHV0QnVmZmVyU2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xpY2VTaXpl
KHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1fdXNlQmFja2dyb3VuZFRocmVhZHModXNlQmFja2dy
b3VuZFRocmVhZHMpCisgICAgLCBtX3dhbnRzVG9FeGl0KGZhbHNlKQoreworICAgIG1fbWluRkZU
U2l6ZSA9IE1pbkZGVFNpemU7IC8vIEZpcnN0IHN0YWdlIHdpbGwgaGF2ZSB0aGlzIHNpemUgLSBz
dWNjZXNzaXZlIHN0YWdlcyB3aWxsIGRvdWJsZSBpbiBzaXplIGVhY2ggdGltZQorICAgIG1fbWF4
RkZUU2l6ZSA9IG1heEZGVFNpemU7IC8vIHVudGlsIHdlIGhpdCB8bV9tYXhGRlRTaXplfAorCisg
ICAgLy8gSWYgd2UgYXJlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcyB0aGVuIGRvbid0IGV4Y2Vl
ZCB0aGlzIEZGVCBzaXplIGZvciB0aGUKKyAgICAvLyBzdGFnZXMgd2hpY2ggcnVuIGluIHRoZSBy
ZWFsLXRpbWUgdGhyZWFkLiAgVGhpcyBhdm9pZHMgaGF2aW5nIG9ubHkgb25lIG9yIHR3bworICAg
IC8vIGxhcmdlIHN0YWdlcyAoc2l6ZSAxNjM4NCBvciBzbykgYXQgdGhlIGVuZCB3aGljaCB0YWtl
IGEgbG90IG9mIHRpbWUgZXZlcnkgc2V2ZXJhbAorICAgIC8vIHByb2Nlc3Npbmcgc2xpY2VzLiAg
VGhpcyB3YXkgd2UgYW1vcnRpemUgdGhlIGNvc3Qgb3ZlciBtb3JlIHByb2Nlc3Npbmcgc2xpY2Vz
LgorICAgIG1fbWF4UmVhbHRpbWVGRlRTaXplID0gTWF4UmVhbHRpbWVGRlRTaXplOworCisgICAg
Ly8gRm9yIHRoZSBtb21lbnQsIGEgZ29vZCB3YXkgdG8ga25vdyBpZiB3ZSBoYXZlIHJlYWwtdGlt
ZSBjb25zdHJhaW50IGlzIHRvIGNoZWNrIGlmIHdlJ3JlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFk
cy4KKyAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSB3ZSdyZSBiZWluZyBydW4gZnJvbSBhIGNvbW1h
bmQtbGluZSB0b29sLgorICAgIGJvb2wgaGFzUmVhbHRpbWVDb25zdHJhaW50ID0gdXNlQmFja2dy
b3VuZFRocmVhZHM7CisKKyAgICBmbG9hdCogcmVzcG9uc2UgPSBpbXB1bHNlUmVzcG9uc2UtPmRh
dGEoKTsKKyAgICBzaXplX3QgdG90YWxSZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNwb25zZS0+
ZnJhbWVTaXplKCk7CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bUJ1ZmZlclAg
PSAmbV9hY2N1bXVsYXRpb25CdWZmZXI7CisKKyAgICAvLyBCZWNhdXNlIHdlJ3JlIG5vdCB1c2lu
ZyBkaXJlY3QtY29udm9sdXRpb24gaW4gdGhlIGxlYWRpbmcgcG9ydGlvbiwgdGhlIHJldmVyYiBo
YXMgYW4gb3ZlcmFsbCBsYXRlbmN5IG9mIGhhbGYgdGhlIGZpcnN0LXN0YWdlIEZGVCBzaXplCisg
ICAgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSA9IG1fbWluRkZUU2l6ZSAvIDI7CisKKyAgICBz
aXplX3Qgc3RhZ2VPZmZzZXQgPSAwOworICAgIGludCBpID0gMDsKKyAgICBzaXplX3QgZmZ0U2l6
ZSA9IG1fbWluRkZUU2l6ZTsKKyAgICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3BvbnNl
TGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKworICAg
ICAgICAvLyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCB8c3RhZ2VPZmZz
ZXR8IGlzIHN1Y2ggdGhhdCB3ZSdyZSBzdHJhZGRsaW5nIHRoZSBlbmQKKyAgICAgICAgLy8gb2Yg
dGhlIGltcHVsc2UgcmVzcG9uc2UgYnVmZmVyIChpZiB3ZSB1c2UgfHN0YWdlU2l6ZXwpLCBzbyBy
ZWR1Y2UgdGhlIGxhc3Qgc3RhZ2UncyBsZW5ndGguLi4KKyAgICAgICAgaWYgKHN0YWdlU2l6ZSAr
IHN0YWdlT2Zmc2V0ID4gdG90YWxSZXNwb25zZUxlbmd0aCkKKyAgICAgICAgICAgIHN0YWdlU2l6
ZSA9IHRvdGFsUmVzcG9uc2VMZW5ndGggLSBzdGFnZU9mZnNldDsKKworICAgICAgICAvLyBUaGlz
ICJzdGFnZ2VycyIgdGhlIHRpbWUgd2hlbiBlYWNoIEZGVCBoYXBwZW5zIHNvIHRoZXkgZG9uJ3Qg
YWxsIGhhcHBlbiBhdCB0aGUgc2FtZSB0aW1lCisgICAgICAgIGludCByZW5kZXJQaGFzZSA9IGNv
bnZvbHZlclJlbmRlclBoYXNlICsgaSAqIHJlbmRlclNsaWNlU2l6ZTsKKworICAgICAgICBSZXZl
cmJDb252b2x2ZXJTdGFnZSogc3RhZ2UgPSBuZXcgUmV2ZXJiQ29udm9sdmVyU3RhZ2UocmVzcG9u
c2UsIHRvdGFsUmVzcG9uc2VMZW5ndGgsIHJldmVyYlRvdGFsTGF0ZW5jeSwgc3RhZ2VPZmZzZXQs
IHN0YWdlU2l6ZSwgZmZ0U2l6ZSwgcmVuZGVyUGhhc2UsIHJlbmRlclNsaWNlU2l6ZSwgYWNjdW1C
dWZmZXJQKTsKKworICAgICAgICBib29sIGlzQmFja2dyb3VuZFN0YWdlID0gZmFsc2U7CisKKyAg
ICAgICAgaWYgKHN0YWdlT2Zmc2V0IDw9IFJlYWx0aW1lRnJhbWVMaW1pdCkKKyAgICAgICAgICAg
IG1fc3RhZ2VzLmFwcGVuZChzdGFnZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYg
KHRoaXMtPnVzZUJhY2tncm91bmRUaHJlYWRzKCkpIHsKKyAgICAgICAgICAgICAgICBtX2JhY2tn
cm91bmRTdGFnZXMuYXBwZW5kKHN0YWdlKTsKKyAgICAgICAgICAgICAgICBpc0JhY2tncm91bmRT
dGFnZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtX3N0YWdl
cy5hcHBlbmQoc3RhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgc3RhZ2VPZmZzZXQgKz0gc3Rh
Z2VTaXplOworICAgICAgICBpKys7CisKKyAgICAgICAgLy8gRmlndXJlIG91dCBuZXh0IEZGVCBz
aXplCisgICAgICAgIGZmdFNpemUgKj0gMjsKKyAgICAgICAgaWYgKGhhc1JlYWx0aW1lQ29uc3Ry
YWludCAmJiAhaXNCYWNrZ3JvdW5kU3RhZ2UgJiYgZmZ0U2l6ZSA+IG1fbWF4UmVhbHRpbWVGRlRT
aXplKQorICAgICAgICAgICAgZmZ0U2l6ZSA9IG1fbWF4UmVhbHRpbWVGRlRTaXplOworICAgICAg
ICBpZiAoZmZ0U2l6ZSA+IG1fbWF4RkZUU2l6ZSkKKyAgICAgICAgICAgIGZmdFNpemUgPSBtX21h
eEZGVFNpemU7CisgICAgfQorCisgICAgLy8gU3RhcnQgdXAgYmFja2dyb3VuZCB0aHJlYWQKKyAg
ICAvLyBGSVhNRTogd291bGQgYmUgYmV0dGVyIHRvIHVwIHRoZSB0aHJlYWQgcHJpb3JpdHkgaGVy
ZS4gIEl0IGRvZXNuJ3QgbmVlZCB0byBiZSByZWFsLXRpbWUsIGJ1dCBoaWdoZXIgdGhhbiB0aGUg
ZGVmYXVsdC4uLgorICAgIGlmICh0aGlzLT51c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFj
a2dyb3VuZFN0YWdlcy5zaXplKCkgPiAwKQorICAgICAgICBtX2JhY2tncm91bmRUaHJlYWQgPSBj
cmVhdGVUaHJlYWQoQmFja2dyb3VuZFRocmVhZERpc3BhdGNoLCB0aGlzLCAiY29udm9sdXRpb24g
YmFja2dyb3VuZCB0aHJlYWQiKTsKKyAgICBlbHNlCisgICAgICAgIG1fYmFja2dyb3VuZFRocmVh
ZCA9IDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZvbHZlcigpCit7CisgICAg
Ly8gV2FpdCBmb3IgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAgIGlmICh1c2VCYWNrZ3Jv
dW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFRocmVhZCkgeworICAgICAgICBtX3dhbnRzVG9F
eGl0ID0gdHJ1ZTsKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24obV9iYWNrZ3JvdW5k
VGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpiYWNrZ3JvdW5k
VGhyZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhpdCkgeworICAgICAgICAv
LyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgbW9yZSBpbnB1dCB0byBjb25zdW1lCisgICAg
ICAgIGludCB3cml0ZUluZGV4ID0gbV9pbnB1dEJ1ZmZlci53cml0ZUluZGV4KCk7CisKKyAgICAg
ICAgLy8gRXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzZWVtIGxpa2UgZXZlcnkgc3RhZ2UgbmVlZHMg
dG8gbWFpbnRhaW4gaXRzIG93biB2ZXJzaW9uIG9mIHxyZWFkSW5kZXh8IAorICAgICAgICAvLyB3
ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0aGFuIG9uZSBiYWNrZ3Jv
dW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsKKworICAgICAgICB3aGlsZSAoKHJl
YWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5wdXRSZWFkSW5kZXgoKSkgIT0gd3Jp
dGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRldGVjdCBidWZmZXIgb3ZlcnJ1bi4u
LgorICAgICAgICAgICAgLy8gRklYTUU6IHJlbW92ZSBoYXJkLWNvZGVkIHZhbHVlCisgICAgICAg
ICAgICBjb25zdCBpbnQga1NsaWNlU2l6ZSA9IDEyODsKKworICAgICAgICAgICAgLy8gQWNjdW11
bGF0ZSBjb250cmlidXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgICAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzW2ldLT5wcm9jZXNzSW5CYWNrZ3JvdW5kKHRoaXMsIGtT
bGljZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgMTBtcworICAgICAgICB1
c2xlZXAoMTAwMDApOyAvLyBGSVhNRTogYWx0aG91Z2ggaXQgd29ya3Mgd2VsbCBpbiBwcmFjdGlj
ZSwgdGhpcyByZWFsbHkgaXNuJ3QgaWRlYWwgLSBjb3VsZCB1c2Ugd2FpdC9zaWduYWwKKyAgICB9
Cit9CisKK3NpemVfdCBSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VSZXNwb25zZUxlbmd0aCgpCit7
CisgICAgcmV0dXJuIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoOworfQorCit2b2lkIFJldmVyYkNv
bnZvbHZlcjo6cHJvY2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQqIGRlc3RQLCBzaXplX3QgZnJh
bWVzVG9Qcm9jZXNzKQoreworICAgIC8vIEZlZWQgaW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0
aHJlYWRzKQorICAgIG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNz
KTsKKworICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBt
X3N0YWdlc1tpXS0+cHJvY2Vzcyhzb3VyY2VQLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8g
RmluYWxseSByZWFkIGZyb20gYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgIG1fYWNjdW11bGF0aW9u
QnVmZmVyLnJlYWRBbmRDbGVhcihkZXN0UCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBS
ZXZlcmJDb252b2x2ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
c3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQor
ICAgICAgICBtX2JhY2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxh
dGlvbkJ1ZmZlci5yZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9S
ZXZlcmJDb252b2x2ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVy
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjMWQ5ZQotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKQEAgLTAs
MCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUgUmV2ZXJiQ29u
dm9sdmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgIkZGVENv
bnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1
ZGUgIlJldmVyYkNvbnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIu
aCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4K
KyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xhc3MgUmV2ZXJi
Q29udm9sdmVyIHsKK3B1YmxpYzoKKyAgICAvLyB8bWF4RkZUU2l6ZXwgY2FuIGJlIGFkanVzdGVk
IChmcm9tIHNheSAyMDQ4IHRvIDMyNzY4KSBkZXBlbmRpbmcgb24gaG93IG11Y2ggcHJlY2lzaW9u
IGlzIG5lY2Vzc2FyeS4KKyAgICAvLyBGb3IgY2VydGFpbiB0d2Vha3kgZGUtY29udm9sdmluZyBh
cHBsaWNhdGlvbnMgdGhlIHBoYXNlIGVycm9ycyBhZGQgdXAgcXVpY2tseSBhbmQgbGVhZCB0byBu
b24tc2Vuc2ljYWwgcmVzdWx0cyB3aXRoCisgICAgLy8gbGFyZ2VyIEZGVCBzaXplcyBhbmQgc2lu
Z2xlLXByZWNpc2lvbiBmbG9hdHMuICBJbiB0aGVzZSBjYXNlcyAyMDQ4IGlzIGEgZ29vZCBzaXpl
LgorICAgIC8vIElmIG5vdCBkb2luZyBtdWx0aS10aHJlYWRlZCBjb252b2x1dGlvbiwgdGhlbiBz
aG91bGQgbm90IGdvID4gODE5Mi4KKyAgICBSZXZlcmJDb252b2x2ZXIoQXVkaW9DaGFubmVsKiBp
bXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZW5kZXJTbGljZVNpemUsIHNpemVfdCBtYXhGRlRTaXpl
LCBzaXplX3QgY29udm9sdmVyUmVuZGVyUGhhc2UsIGJvb2wgdXNlQmFja2dyb3VuZFRocmVhZHMp
OworCisgICAgdmlydHVhbCB+UmV2ZXJiQ29udm9sdmVyKCk7CisKKyAgICB2b2lkIHByb2Nlc3Mo
ZmxvYXQqIHNvdXJjZVAsIGZsb2F0KiBkZXN0UCwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisK
KyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICBzaXplX3QgaW1wdWxzZVJlc3BvbnNlTGVuZ3RoKCk7
CisKKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIoKSB7IHJldHVybiBtX2lucHV0
QnVmZmVyOyB9CisKKyAgICBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKCkgY29uc3QgeyByZXR1
cm4gbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsgfQorCisgICAgdm9pZCBiYWNrZ3JvdW5kVGhyZWFk
RW50cnkoKTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZvbHZlclN0
YWdlPiA+IG1fc3RhZ2VzOworICAgIFZlY3RvcjxPd25QdHI8UmV2ZXJiQ29udm9sdmVyU3RhZ2U+
ID4gbV9iYWNrZ3JvdW5kU3RhZ2VzOworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0
aDsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsK
KworICAgIC8vIEZvciBtdWx0aXRocmVhZGluZworICAgIFJldmVyYklucHV0QnVmZmVyIG1faW5w
dXRCdWZmZXI7CisKKyAgICAvLyBXZSdyZSBnaXZlbiBhIHJlbmRlcmluZyBoaW50LCBzbyB0aGUg
RkZUcyBjYW4gYmUgb3B0aW1pemVkIHRvIG5vdCBhbGwgb2NjdXIgYXQgdGhlIHNhbWUgdGltZQor
ICAgIC8vICh2ZXJ5IGJhZCB3aGVuIHJlbmRlcmluZyBvbiBhIHJlYWwtdGltZSB0aHJlYWQpCisg
ICAgc2l6ZV90IG1fcmVuZGVyU2xpY2VTaXplOworCisgICAgLy8gRmlyc3Qgc3RhZ2Ugd2lsbCBi
ZSBvZiBzaXplIHxtX21pbkZGVFNpemV8LiAgRWFjaCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2Ug
YXMgYmlnIHVudGlsIHdlIGhpdCB8bV9tYXhGRlRTaXplfAorICAgIHNpemVfdCBtX21pbkZGVFNp
emU7CisgICAgc2l6ZV90IG1fbWF4RkZUU2l6ZTsKKworICAgIC8vIEJ1dCBkb24ndCBleGNlZWQg
dGhpcyBzaXplIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkIChpZiB3ZSdyZSBkb2luZyBiYWNrZ3Jv
dW5kIHByb2Nlc3NpbmcpCisgICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRTaXplOworCisgICAg
Ym9vbCBtX3VzZUJhY2tncm91bmRUaHJlYWRzOworICAgIFRocmVhZElkZW50aWZpZXIgbV9iYWNr
Z3JvdW5kVGhyZWFkOworICAgIGJvb2wgbV93YW50c1RvRXhpdDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlcl9oCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmNiNjk1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcApAQCAtMCwwICsxLDE0NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgor
CisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYklu
cHV0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiQ29udm9sdmVyU3Rh
Z2U6OlJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCBy
ZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zm
c2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJl
bmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZm
ZXIpCisgICAgOiBtX2ZmdEtlcm5lbChmZnRTaXplKQorICAgICwgbV9hY2N1bXVsYXRpb25CdWZm
ZXIoYWNjdW11bGF0aW9uQnVmZmVyKQorICAgICwgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgoMCkK
KyAgICAsIG1faW5wdXRSZWFkSW5kZXgoMCkKKyAgICAsIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVG
cmFtZSgwKQorICAgICwgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgocmVzcG9uc2VMZW5ndGgpCit7
CisgICAgbV9mZnRLZXJuZWwuZG9QYWRkZWRGRlQoaW1wdWxzZVJlc3BvbnNlICsgc3RhZ2VPZmZz
ZXQsIHN0YWdlTGVuZ3RoKTsKKworICAgIG1fY29udm9sdmVyID0gbmV3IEZGVENvbnZvbHZlcihm
ZnRTaXplKTsKKworICAgIG1fdGVtcEJ1ZmZlci5hbGxvY2F0ZShyZW5kZXJTbGljZVNpemUpOwor
CisgICAgLy8gVGhlIGNvbnZvbHV0aW9uIHN0YWdlIGF0IG9mZnNldCB8c3RhZ2VPZmZzZXR8IG5l
ZWRzIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlbGF5IHRvIGNhbmNlbCBvdXQgdGhlIG9mZnNl
dAorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZzZXQgKyByZXZlcmJUb3RhbExhdGVu
Y3k7CisKKyAgICAvLyBCdXQsIHRoZSBGRlQgY29udm9sdXRpb24gaXRzZWxmIGluY3VycyB8ZmZ0
U2l6ZXwgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMgb3V0Li4uCisgICAgc2l6ZV90IGhh
bGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgaWYgKHRvdGFsRGVsYXkgPj0gaGFsZlNpemUpCisg
ICAgICAgIHRvdGFsRGVsYXkgLT0gaGFsZlNpemU7CisKKyAgICAvLyBGSVhNRTogREVBTCB3aXRo
IGNhc2Ugd2hlbiB0b3RhbCBkZWxheSBpcyBsZXNzIHRoYW4gZmZ0U2l6ZS8yLi4uLgorCisgICAg
Ly8gV2UgZGl2aWRlIHVwIHRoZSB0b3RhbCBkZWxheSwgaW50byBwcmUgYW5kIHBvc3QgZGVsYXkg
c2VjdGlvbnMgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyBzY2hlZHVsZSBhdCBleGFjdGx5IHRoZSBt
b21lbnQgd2hlbiB0aGUgRkZUIHdpbGwgaGFwcGVuLiAgVGhpcyBpcyBjb29yZGluYXRlZAorICAg
IC8vIHdpdGggdGhlIG90aGVyIHN0YWdlcywgc28gdGhleSBkb24ndCBhbGwgZG8gdGhlaXIgRkZU
cyBhdCB0aGUgc2FtZSB0aW1lLi4uCisKKyAgICBpbnQgbSA9IChoYWxmU2l6ZSA8PSB0b3RhbERl
bGF5KSA/IGhhbGZTaXplIDogdG90YWxEZWxheTsKKyAgICBtX3ByZURlbGF5TGVuZ3RoID0gKHRv
dGFsRGVsYXkgPiAwKSA/IChyZW5kZXJQaGFzZSAlIG0pIDogMDsKKworICAgIGlmIChtX3ByZURl
bGF5TGVuZ3RoID4gdG90YWxEZWxheSkKKyAgICAgICAgbV9wcmVEZWxheUxlbmd0aCA9IDA7CisK
KyAgICBtX3Bvc3REZWxheUxlbmd0aCA9IHRvdGFsRGVsYXkgLSBtX3ByZURlbGF5TGVuZ3RoOwor
ICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOworICAgIG1fZnJhbWVzUHJvY2Vzc2VkID0gMDsg
Ly8gdG90YWwgZnJhbWVzIHByb2Nlc3NlZCBzbyBmYXIKKworICAgIG1fcHJlRGVsYXlCdWZmZXIu
YWxsb2NhdGUobV9wcmVEZWxheUxlbmd0aCA8IGZmdFNpemUgPyBmZnRTaXplIDogbV9wcmVEZWxh
eUxlbmd0aCk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3NJbkJhY2tn
cm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAg
UmV2ZXJiSW5wdXRCdWZmZXImIGlucHV0QnVmZmVyID0gY29udm9sdmVyLT5pbnB1dEJ1ZmZlcigp
OworICAgIGZsb2F0KiBzb3VyY2VQID0gaW5wdXRCdWZmZXIuZGlyZWN0UmVhZEZyb20oJm1faW5w
dXRSZWFkSW5kZXgsIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgcHJvY2Vzcyhzb3VyY2VQLCBmcmFt
ZXNUb1Byb2Nlc3MpOworfQorCit2b2lkICBSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyhm
bG9hdCogc291cmNlUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgLy8KKyAgICAvLyBGSVhNRTogZG8gc2FuaXR5IGNo
ZWNrIG9uIGZyYW1lc1RvUHJvY2VzcyB2ZXJzdXMgZGVsYXkgYnVmZmVyIHNpemUKKyAgICAvLwor
CisgICAgLy8gR2V0IHBvaW50ZXIgdG8gcHJlLWRlbGF5IHN0cmVhbSA6IG5vdGUgc3BlY2lhbCBo
YW5kbGluZyBvZiB6ZXJvIGRlbGF5CisgICAgZmxvYXQqIHByZURlbGF5ZWRTb3VyY2VQID0gc291
cmNlUDsKKyAgICBmbG9hdCogcHJlRGVsYXlCdWZmZXJQID0gbV9wcmVEZWxheUJ1ZmZlcjsKKyAg
ICBmbG9hdCogdGVtcFAgPSBwcmVEZWxheUJ1ZmZlclA7CisgICAgaWYgKG1fcHJlRGVsYXlMZW5n
dGggPiAwKSB7CisgICAgICAgIHByZURlbGF5ZWRTb3VyY2VQID0gcHJlRGVsYXlCdWZmZXJQICsg
bV9wcmVSZWFkV3JpdGVJbmRleDsKKyAgICAgICAgdGVtcFAgPSBtX3RlbXBCdWZmZXI7CisgICAg
fQorCisgICAgaW50IHdyaXRlSW5kZXggPSAwOworCisgICAgaWYgKG1fZnJhbWVzUHJvY2Vzc2Vk
IDwgbV9wcmVEZWxheUxlbmd0aCkgeworICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHxtX3ByZURl
bGF5TGVuZ3RofCBmcmFtZXMgZG9uJ3QgcHJvY2VzcyB0aGUgY29udm9sdmVyLCBpbnN0ZWFkIHNp
bXBseSBidWZmZXIgaW4gdGhlIHByZS1kZWxheS4KKyAgICAgICAgLy8gQnV0IHdoaWxlIGJ1ZmZl
cmluZyB0aGUgcHJlLWRlbGF5LCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5kZXguCisg
ICAgICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLT51cGRhdGVSZWFkSW5kZXgoJm1fYWNjdW11bGF0
aW9uUmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8v
IE5vdywgcnVuIHRoZSBjb252b2x1dGlvbiAoaW50byB0aGUgZGVsYXkgYnVmZmVyKQorICAgICAg
ICAvLyBBbiBleHBlbnNpdmUgRkZUIHdpbGwgaGFwcGVuIGV2ZXJ5IChmZnRTaXplLzIpIGZyYW1l
cworICAgICAgICAvLyBXZSBwcm9jZXNzIGluLXBsYWNlIGhlcmUuLi4KKyAgICAgICAgbV9jb252
b2x2ZXItPnByb2Nlc3MoJm1fZmZ0S2VybmVsLCBwcmVEZWxheWVkU291cmNlUCwgdGVtcFAsIGZy
YW1lc1RvUHJvY2Vzcyk7CisKKyAgICAgICAgLy8gTm93IGFjY3VtdWxhdGUgaW50byByZXZlcmIn
cyBhY2N1bXVsYXRpb24gYnVmZmVyCisgICAgICAgIC8vIEZJWE1FOiByZWFsbHkgbmVlZCB0byBo
YXZlIGxvY2tpbmcgbWVjaGFuaXNtIGhlcmUhIQorICAgICAgICB3cml0ZUluZGV4ID0gbV9hY2N1
bXVsYXRpb25CdWZmZXItPmFjY3VtdWxhdGUodGVtcFAsIGZyYW1lc1RvUHJvY2VzcywgJm1fYWNj
dW11bGF0aW9uUmVhZEluZGV4LCBtX3Bvc3REZWxheUxlbmd0aCk7CisgICAgfQorCisgICAgLy8g
RmluYWxseSBjb3B5IGlucHV0IHRvIHByZS1kZWxheQorICAgIGlmIChtX3ByZURlbGF5TGVuZ3Ro
ID4gMCkgeworICAgICAgICBtZW1jcHkocHJlRGVsYXllZFNvdXJjZVAsIHNvdXJjZVAsIHNpemVv
ZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICBtX3ByZVJlYWRXcml0ZUluZGV4
ICs9IGZyYW1lc1RvUHJvY2VzczsKKworICAgICAgICBpZiAobV9wcmVSZWFkV3JpdGVJbmRleCA+
PSBtX3ByZURlbGF5TGVuZ3RoKQorICAgICAgICAgICAgbV9wcmVSZWFkV3JpdGVJbmRleCA9IDA7
IC8vIHNob3VsZCBvbmx5IGJlIDw9CisgICAgfQorCisgICAgbV9hY2N1bXVsYXRpb25SZWFkVGlt
ZUZyYW1lICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCArPSBmcmFt
ZXNUb1Byb2Nlc3M7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnJlc2V0KCkKK3sK
KyAgICBtX2NvbnZvbHZlci0+cmVzZXQoKTsKKyAgICBtX3ByZURlbGF5QnVmZmVyLnplcm8oKTsK
KyAgICBtX2FjY3VtdWxhdGlvblJlYWRJbmRleCA9IDA7CisgICAgbV9pbnB1dFJlYWRJbmRleCA9
IDA7CisgICAgbV9mcmFtZXNQcm9jZXNzZWQgPSAwOworICAgIG1fYWNjdW11bGF0aW9uUmVhZFRp
bWVGcmFtZSA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4wYTg5NzEwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMg
Q09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRT
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAq
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVm
IFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAor
CisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAiRkZUQ29udm9sdmVyLmgi
CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOwor
Y2xhc3MgUmV2ZXJiQ29udm9sdmVyOworICAgIAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFnZSBy
ZXByZXNlbnRzIHRoZSBjb252b2x1dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlvbiBv
ZiBhIGxhcmdlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBs
aW5lIHRvIGFjY291bnQgZm9yIHRoZSBvZmZzZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0
aGUgbGFyZ2VyIGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7
CitwdWJsaWM6CisgICAgLy8gfHJlbmRlclBoYXNlfCBpcyB1c2VmdWwgdG8ga25vdyBzbyB0aGF0
IHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBwcmUgdmVyc3VzIHBvc3QgZGVsYXkgc28gdGhhdCBzdGFn
ZXMgd2lsbCBwZXJmb3JtCisgICAgLy8gdGhlaXIgaGVhdnkgd29yayAoRkZUIHByb2Nlc3Npbmcp
IG9uIGRpZmZlcmVudCBzbGljZXMgdG8gYmFsYW5jZSB0aGUgbG9hZCBpbiBhIHJlYWwtdGltZSB0
aHJlYWQuCisgICAgUmV2ZXJiQ29udm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwg
c2l6ZV90IHJlc3BvbnNlTGVuZ3RoLCBzaXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5LCBzaXplX3Qg
c3RhZ2VPZmZzZXQsIHNpemVfdCBzdGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICBzaXplX3QgZmZ0U2l6ZSwgc2l6ZV90IHJlbmRlclBoYXNlLCBzaXplX3QgcmVuZGVyU2xpY2VT
aXplLCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtdWxhdGlvbkJ1ZmZlcik7CisKKyAg
ICAvLyBXQVJOSU5HOiB8ZnJhbWVzVG9Qcm9jZXNzfCBtdXN0IGJlIHN1Y2ggdGhhdCBpdCBldmVu
bHkgZGl2aWRlcyB0aGUgZGVsYXkgYnVmZmVyIHNpemUgKHN0YWdlX29mZnNldCkKKyAgICB2b2lk
IHByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAg
dm9pZCBwcm9jZXNzSW5CYWNrZ3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29udm9sdmVyLCBzaXpl
X3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIFVzZWZ1
bCBmb3IgYmFja2dyb3VuZCBwcm9jZXNzaW5nCisgICAgaW50IGlucHV0UmVhZEluZGV4KCkgY29u
c3QgeyByZXR1cm4gbV9pbnB1dFJlYWRJbmRleDsgfQorCitwcml2YXRlOgorICAgIEZGVEZyYW1l
IG1fZmZ0S2VybmVsOworICAgIE93blB0cjxGRlRDb252b2x2ZXI+IG1fY29udm9sdmVyOworCisg
ICAgQXVkaW9GbG9hdEFycmF5IG1fcHJlRGVsYXlCdWZmZXI7CisKKyAgICBSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXIqIG1fYWNjdW11bGF0aW9uQnVmZmVyOworICAgIGludCBtX2FjY3VtdWxhdGlv
blJlYWRJbmRleDsKKyAgICBpbnQgbV9pbnB1dFJlYWRJbmRleDsKKworICAgIGludCBtX2FjY3Vt
dWxhdGlvblJlYWRUaW1lRnJhbWU7IC8vIGZvciB0ZXN0aW5nIChmcmFtZSBvbiBjb250aW51b3Vz
IHRpbWVsaW5lKQorCisgICAgc2l6ZV90IG1fcHJlRGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1f
cG9zdERlbGF5TGVuZ3RoOworICAgIHNpemVfdCBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgIHNp
emVfdCBtX2ZyYW1lc1Byb2Nlc3NlZDsKKworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBCdWZm
ZXI7CisKKyAgICBzaXplX3QgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGg7Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTc3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmNwcApAQCAtMCwwICsxLDcwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21w
dXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQK
KyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVy
KHNpemVfdCBsZW5ndGgpCisgICAgOiBtX2J1ZmZlcihsZW5ndGgpCisgICAgLCBtX2xlbmd0aChs
ZW5ndGgpCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKK3sKK30KKwordm9pZCBSZXZlcmJJbnB1dEJ1
ZmZlcjo6d3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVzKQoreworICAgIG1lbWNw
eShtX2J1ZmZlci5kYXRhKCkgKyBtX3dyaXRlSW5kZXgsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkg
KiBuZnJhbWVzKTsKKworICAgIG1fd3JpdGVJbmRleCArPSBuZnJhbWVzOworICAgIEFTU0VSVCht
X3dyaXRlSW5kZXggPD0gbV9sZW5ndGgpOworCisgICAgaWYgKG1fd3JpdGVJbmRleCA+PSBtX2xl
bmd0aCkKKyAgICAgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworZmxvYXQqIFJldmVyYklucHV0
QnVmZmVyOjpkaXJlY3RSZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbmZyYW1lcykKK3sKKyAg
ICBBU1NFUlQoKmluZGV4ID49IDAgJiYgKmluZGV4ICsgbmZyYW1lcyA8PSBtX2xlbmd0aCk7Cisg
ICAgZmxvYXQqIHNvdXJjZVAgPSBtX2J1ZmZlcjsKKyAgICBmbG9hdCogcCA9IHNvdXJjZVAgKyAq
aW5kZXg7CisKKyAgICAvLyBVcGRhdGUgaW5kZXgKKyAgICAqaW5kZXggPSAoKmluZGV4ICsgbmZy
YW1lcykgJSBtX2xlbmd0aDsKKworICAgIHJldHVybiBwOworfQorCit2b2lkIFJldmVyYklucHV0
QnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fd3JpdGVJbmRl
eCA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vUmV2ZXJiSW5wdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li4xNjE2NjcyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYklucHV0QnVm
ZmVyX2gKKyNkZWZpbmUgUmV2ZXJiSW5wdXRCdWZmZXJfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9h
dEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiSW5wdXRCdWZmZXIg
aXMgdXNlZCB0byBidWZmZXIgaW5wdXQgc2FtcGxlcyBmb3IgZGVmZXJyZWQgcHJvY2Vzc2luZyBi
eSB0aGUgYmFja2dyb3VuZCB0aHJlYWRzCitjbGFzcyBSZXZlcmJJbnB1dEJ1ZmZlciB7CitwdWJs
aWM6CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvLyBUaGUg
cmVhbHRpbWUgYXVkaW8gdGhyZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxlcyBoZXJlLgorICAgIC8v
IFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBldmVubHkgZGl2
aXNpYmxlIGJ5IHxuZnJhbWVzfCAgKGZvciBuZWFybHkgYWxsIGNhc2VzIHRoaXMgd2lsbCBiZSBm
aW5lKQorICAgIC8vIEZJWE1FOiByZW1vdmUgfG5mcmFtZXN8IHJlc3RyaWN0aW9uLi4uCisgICAg
dm9pZCB3cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgLy8gQmFj
a2dyb3VuZCB0aHJlYWRzIGNhbiBjYWxsIHRoaXMgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnl0aGlu
ZyB0byByZWFkLi4uCisgICAgLy8gRklYTUU6IGNyZWF0ZSBiZXR0ZXIgc3lzdGVtIHRvIGNoZWNr
IGZvciBidWZmZXIgb3ZlcnJ1bnMgLyBlcnJvciBjb25kaXRpb25zLi4uCisgICAgc2l6ZV90IHdy
aXRlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3dyaXRlSW5kZXg7IH0KKworICAgIC8vIFRoZSBp
bmRpdmlkdWFsIGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGhlcmUgKGFuZCBob3BlIHRoYXQgdGhl
eSBjYW4ga2VlcCB1cCB3aXRoIHRoZSBidWZmZXIgd3JpdGluZykKKyAgICAvLyB8aW5kZXh8IGlz
IHVwZGF0ZWQgd2l0aCB0aGUgbmV4dCBpbmRleCB0byByZWFkIGZyb20uLi4KKyAgICAvLyBUaGUg
YXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBidWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJs
ZSBieSB8bmZyYW1lc3wKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHxuZnJhbWVzfCByZXN0cmljdGlv
bi4uLgorICAgIGZsb2F0KiBkaXJlY3RSZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbmZyYW1l
cyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5
IG1fYnVmZmVyOworICAgIHNpemVfdCBtX2xlbmd0aDsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4
OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiSW5wdXRC
dWZmZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50945</attachid>
            <date>2010-03-17 13:01:57 -0700</date>
            <delta_ts>2010-03-17 14:16:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100317130156.patch</filename>
            <type>text/plain</type>
            <size>38753</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uYTc0NmM0NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0xNyAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBubyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dy
b3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVm
ZmVyOjp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0wNSAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIgcjU1NTkz
LiAoVG8gZml4IFF0IC0tbWluaW1hbCBidWlsZC4pCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYTBlMGRjNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIu
aCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3Qg
bGVuZ3RoKQorICAgIDogbV9idWZmZXIobGVuZ3RoKQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQor
ICAgICwgbV9yZWFkSW5kZXgoMCkKKyAgICAsIG1fcmVhZFRpbWVGcmFtZSgwKQoreworfQorCit2
b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZEFuZENsZWFyKGZsb2F0KiBkZXN0UCwg
c2l6ZV90IG5mcmFtZXMpCit7CisgICAgQVNTRVJUKG1fcmVhZEluZGV4IDw9IG1fbGVuZ3RoKTsK
KyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gbV9sZW5ndGggLSBtX3JlYWRJbmRleDsKKyAg
ICBzaXplX3QgbmZyYW1lczEgPSAobmZyYW1lcyA8PSBmcmFtZXNBdmFpbGFibGUpID8gbmZyYW1l
cyA6IGZyYW1lc0F2YWlsYWJsZTsKKyAgICBzaXplX3QgbmZyYW1lczIgPSBuZnJhbWVzIC0gbmZy
YW1lczE7CisKKyAgICBmbG9hdCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIG1lbWNweShkZXN0
UCwgc291cmNlUCArIG1fcmVhZEluZGV4LCBzaXplb2YoZmxvYXQpICogbmZyYW1lczEpOworICAg
IG1lbXNldChzb3VyY2VQICsgbV9yZWFkSW5kZXgsIDAsIHNpemVvZihmbG9hdCkgKiBuZnJhbWVz
MSk7CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG5m
cmFtZXMyID4gMCkgeworICAgICAgICBtZW1jcHkoZGVzdFAgKyBuZnJhbWVzMSwgc291cmNlUCwg
c2l6ZW9mKGZsb2F0KSAqIG5mcmFtZXMyKTsKKyAgICAgICAgbWVtc2V0KHNvdXJjZVAsIDAsIHNp
emVvZihmbG9hdCkgKiBuZnJhbWVzMik7CisgICAgfQorCisgICAgbV9yZWFkSW5kZXggPSAobV9y
ZWFkSW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3RoOworICAgIG1fcmVhZFRpbWVGcmFtZSArPSBu
ZnJhbWVzOworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6dXBkYXRlUmVhZElu
ZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbmZyYW1lcykKK3sKKyAgICAvLyBVcGRhdGUgY2Fs
bGVyJ3MgfHJlYWRJbmRleHwKKyAgICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBuZnJhbWVz
KSAlIG1fbGVuZ3RoOworfQorCitpbnQgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVs
YXRlKGZsb2F0KiBzb3VyY2VQLCBzaXplX3QgbmZyYW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVf
dCBkZWxheUZyYW1lcykKK3sKKyAgICBzaXplX3Qgd3JpdGVJbmRleCA9ICgqcmVhZEluZGV4ICsg
ZGVsYXlGcmFtZXMpICUgbV9sZW5ndGg7CisKKyAgICAvLyBVcGRhdGUgY2FsbGVyJ3MgfHJlYWRJ
bmRleHwKKyAgICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3Ro
OworCisgICAgQVNTRVJUKHdyaXRlSW5kZXggPD0gbV9sZW5ndGgpOworICAgIHNpemVfdCBmcmFt
ZXNBdmFpbGFibGUgPSBtX2xlbmd0aCAtIHdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG5mcmFtZXMx
ID0gKG5mcmFtZXMgPD0gZnJhbWVzQXZhaWxhYmxlKSA/IG5mcmFtZXMgOiBmcmFtZXNBdmFpbGFi
bGU7CisgICAgc2l6ZV90IG5mcmFtZXMyID0gbmZyYW1lcyAtIG5mcmFtZXMxOworCisgICAgZmxv
YXQqIGRlc3RQID0gbV9idWZmZXI7CisKKyAgICB2YWRkKHNvdXJjZVAsIDEsIGRlc3RQICsgd3Jp
dGVJbmRleCwgMSwgZGVzdFAgKyB3cml0ZUluZGV4LCAxLCBuZnJhbWVzMSk7CisKKyAgICAvLyBI
YW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG5mcmFtZXMyID4gMCkKKyAg
ICAgICAgdmFkZChzb3VyY2VQICsgbmZyYW1lczEsIDEsIGRlc3RQLCAxLCBkZXN0UCwgMSwgbmZy
YW1lczIpOworCisgICAgcmV0dXJuIHdyaXRlSW5kZXg7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fcmVh
ZEluZGV4ID0gMDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVhNjVjCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXIuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXJfaAorI2RlZmluZSBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaAorCisjaW5jbHVkZSAi
QXVkaW9GbG9hdEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyIGlzIGEgY2lyY3VsYXIgZGVsYXkgYnVmZmVyIHdpdGggb25lIGNsaWVu
dCByZWFkaW5nIGZyb20gaXQgYW5kIG11bHRpcGxlIGNsaWVudHMKKy8vIHdyaXRpbmcvYWNjdW11
bGF0aW5nIHRvIGl0IGF0IGRpZmZlcmVudCBkZWxheSBvZmZzZXRzIGZyb20gdGhlIHJlYWQgcG9z
aXRpb24uICBUaGUgcmVhZCBvcGVyYXRpb24gd2lsbCB6ZXJvIHRoZSBtZW1vcnkKKy8vIGp1c3Qg
cmVhZCBmcm9tIHRoZSBidWZmZXIsIHNvIGl0IHdpbGwgYmUgcmVhZHkgZm9yIGFjY3VtdWxhdGlv
biB0aGUgbmV4dCB0aW1lIGFyb3VuZC4KK2NsYXNzIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciB7
CitwdWJsaWM6CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKHNpemVfdCBsZW5ndGgpOwor
CisgICAgLy8gVGhpcyB3aWxsIHJlYWQgZnJvbSwgdGhlbiBjbGVhci1vdXQgfG5mcmFtZXN8Cisg
ICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RQLCBzaXplX3QgbmZyYW1lcyk7CisKKyAg
ICAvLyBFYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11bGF0ZSBpdHMgb3V0cHV0
IGF0IHRoZSBhcHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLgorICAgIC8v
IFdlIG5lZWQgdG8gcGFzcyBpbiBhbmQgdXBkYXRlIHxyZWFkSW5kZXh8IGhlcmUsIHNpbmNlIGVh
Y2ggUmV2ZXJiQ29udm9sdmVyU3RhZ2UgbWF5IGJlIHJ1bm5pbmcgaW4KKyAgICAvLyBhIGRpZmZl
cmVudCB0aHJlYWQgdGhhbiB0aGUgcmVhbHRpbWUgdGhyZWFkIGNhbGxpbmcgUmVhZEFuZENsZWFy
KCkgYW5kIG1haW50YWluaW5nIHxtX3JlYWRJbmRleHwKKyAgICAvLyBSZXR1cm5zIHRoZSB8d3Jp
dGVJbmRleHwgd2hlcmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAgaW50IGFjY3Vt
dWxhdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVzLCBpbnQqIHJlYWRJbmRleCwgc2l6
ZV90IGRlbGF5RnJhbWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgoKSBjb25zdCB7IHJldHVy
biBtX3JlYWRJbmRleDsgfQorICAgIHZvaWQgdXBkYXRlUmVhZEluZGV4KGludCogcmVhZEluZGV4
LCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICBzaXplX3QgcmVhZFRpbWVGcmFtZSgpIGNvbnN0IHsg
cmV0dXJuIG1fcmVhZFRpbWVGcmFtZTsgfQorCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRl
OgorICAgIEF1ZGlvRmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV9sZW5ndGg7Cisg
ICAgc2l6ZV90IG1fcmVhZEluZGV4OworICAgIHNpemVfdCBtX3JlYWRUaW1lRnJhbWU7IC8vIGZv
ciBkZWJ1Z2dpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaApk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTgzODgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAg
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisKKyNpbmNs
dWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjb25zdCBpbnQgSW5wdXRCdWZmZXJTaXplID0gOCAqIDE2Mzg0OworCisvLyBX
ZSBvbmx5IHByb2Nlc3MgdGhlIGxlYWRpbmcgcG9ydGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25z
ZSBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFdlIGRvbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4K
Ky8vIEl0IHR1cm5zIG91dCB0aGVuLCB0aGF0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBoYXMgYWJv
dXQgMjc4bXNlYyBvZiBzY2hlZHVsaW5nIHNsb3AuCisvLyBFbXBpcmljYWxseSwgdGhpcyBoYXMg
YmVlbiBmb3VuZCB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGdpdmluZyBlbm91Z2gg
dGltZSBmb3Igc2NoZWR1bGluZyBzbG9wLAorLy8gd2hpbGUgc3RpbGwgbWluaW1pemluZyB0aGUg
YW1vdW50IG9mIHByb2Nlc3NpbmcgZG9uZSBpbiB0aGUgcHJpbWFyeSAoaGlnaC1wcmlvcml0eSkg
dGhyZWFkLgorLy8gVGhpcyB3YXMgZm91bmQgdG8gYmUgYSBnb29kIHZhbHVlIG9uIE1hYyBPUyBY
LCBhbmQgbWF5IHdvcmsgd2VsbCBvbiBvdGhlciBwbGF0Zm9ybXMgYXMgd2VsbCwgYXNzdW1pbmcK
Ky8vIHRoZSB2ZXJ5IHJvdWdoIHNjaGVkdWxpbmcgbGF0ZW5jaWVzIGFyZSBzaW1pbGFyIG9uIHRo
ZXNlIHRpbWUtc2NhbGVzLiAgT2YgY291cnNlLCB0aGlzIGNvZGUgbWF5IG5lZWQgdG8gYmUKKy8v
IHR1bmVkIGZvciBpbmRpdmlkdWFsIHBsYXRmb3JtcyBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZm91
bmQgdG8gYmUgaW5jb3JyZWN0LgorY29uc3Qgc2l6ZV90IFJlYWx0aW1lRnJhbWVMaW1pdCA9IDgx
OTIgICsgNDA5NjsgLy8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBNaW5GRlRT
aXplID0gMjU2OworY29uc3Qgc2l6ZV90IE1heFJlYWx0aW1lRkZUU2l6ZSA9IDIwNDg7CisKK3N0
YXRpYyB2b2lkKiBCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2godm9pZCogdGhyZWFkRGF0YSkKK3sK
KyAgICBSZXZlcmJDb252b2x2ZXIqIHJldmVyYkNvbnZvbHZlciA9IHN0YXRpY19jYXN0PFJldmVy
YkNvbnZvbHZlcio+KHRocmVhZERhdGEpOworICAgIHJldmVyYkNvbnZvbHZlci0+YmFja2dyb3Vu
ZFRocmVhZEVudHJ5KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6UmV2
ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVy
U2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNl
LCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgIDogbV9pbXB1bHNlUmVzcG9uc2VMZW5n
dGgoaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVm
ZmVyKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkgKyByZW5kZXJTbGljZVNpemUpCisgICAg
LCBtX2lucHV0QnVmZmVyKElucHV0QnVmZmVyU2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xpY2VTaXpl
KHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1fbWluRkZUU2l6ZShNaW5GRlRTaXplKSAvLyBGaXJz
dCBzdGFnZSB3aWxsIGhhdmUgdGhpcyBzaXplIC0gc3VjY2Vzc2l2ZSBzdGFnZXMgd2lsbCBkb3Vi
bGUgaW4gc2l6ZSBlYWNoIHRpbWUKKyAgICAsIG1fbWF4RkZUU2l6ZShtYXhGRlRTaXplKSAvLyB1
bnRpbCB3ZSBoaXQgbV9tYXhGRlRTaXplCisgICAgLCBtX3VzZUJhY2tncm91bmRUaHJlYWRzKHVz
ZUJhY2tncm91bmRUaHJlYWRzKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKK3sKKyAgICAv
LyBJZiB3ZSBhcmUgdXNpbmcgYmFja2dyb3VuZCB0aHJlYWRzIHRoZW4gZG9uJ3QgZXhjZWVkIHRo
aXMgRkZUIHNpemUgZm9yIHRoZQorICAgIC8vIHN0YWdlcyB3aGljaCBydW4gaW4gdGhlIHJlYWwt
dGltZSB0aHJlYWQuICBUaGlzIGF2b2lkcyBoYXZpbmcgb25seSBvbmUgb3IgdHdvCisgICAgLy8g
bGFyZ2Ugc3RhZ2VzIChzaXplIDE2Mzg0IG9yIHNvKSBhdCB0aGUgZW5kIHdoaWNoIHRha2UgYSBs
b3Qgb2YgdGltZSBldmVyeSBzZXZlcmFsCisgICAgLy8gcHJvY2Vzc2luZyBzbGljZXMuICBUaGlz
IHdheSB3ZSBhbW9ydGl6ZSB0aGUgY29zdCBvdmVyIG1vcmUgcHJvY2Vzc2luZyBzbGljZXMuCisg
ICAgbV9tYXhSZWFsdGltZUZGVFNpemUgPSBNYXhSZWFsdGltZUZGVFNpemU7CisKKyAgICAvLyBG
b3IgdGhlIG1vbWVudCwgYSBnb29kIHdheSB0byBrbm93IGlmIHdlIGhhdmUgcmVhbC10aW1lIGNv
bnN0cmFpbnQgaXMgdG8gY2hlY2sgaWYgd2UncmUgdXNpbmcgYmFja2dyb3VuZCB0aHJlYWRzLgor
ICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIHdlJ3JlIGJlaW5nIHJ1biBmcm9tIGEgY29tbWFuZC1s
aW5lIHRvb2wuCisgICAgYm9vbCBoYXNSZWFsdGltZUNvbnN0cmFpbnQgPSB1c2VCYWNrZ3JvdW5k
VGhyZWFkczsKKworICAgIGZsb2F0KiByZXNwb25zZSA9IGltcHVsc2VSZXNwb25zZS0+ZGF0YSgp
OworICAgIHNpemVfdCB0b3RhbFJlc3BvbnNlTGVuZ3RoID0gaW1wdWxzZVJlc3BvbnNlLT5mcmFt
ZVNpemUoKTsKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtQnVmZmVyUCA9ICZt
X2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIEJlY2F1c2Ugd2UncmUgbm90IHVzaW5nIGRp
cmVjdC1jb252b2x1dGlvbiBpbiB0aGUgbGVhZGluZyBwb3J0aW9uLCB0aGUgcmV2ZXJiIGhhcyBh
biBvdmVyYWxsIGxhdGVuY3kgb2YgaGFsZiB0aGUgZmlyc3Qtc3RhZ2UgRkZUIHNpemUKKyAgICBz
aXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5ID0gbV9taW5GRlRTaXplIC8gMjsKKworICAgIHNpemVf
dCBzdGFnZU9mZnNldCA9IDA7CisgICAgaW50IGkgPSAwOworICAgIHNpemVfdCBmZnRTaXplID0g
bV9taW5GRlRTaXplOworICAgIHdoaWxlIChzdGFnZU9mZnNldCA8IHRvdGFsUmVzcG9uc2VMZW5n
dGgpIHsKKyAgICAgICAgc2l6ZV90IHN0YWdlU2l6ZSA9IGZmdFNpemUgLyAyOworCisgICAgICAg
IC8vIEZvciB0aGUgbGFzdCBzdGFnZSwgaXQncyBwb3NzaWJsZSB0aGF0IHN0YWdlT2Zmc2V0IGlz
IHN1Y2ggdGhhdCB3ZSdyZSBzdHJhZGRsaW5nIHRoZSBlbmQKKyAgICAgICAgLy8gb2YgdGhlIGlt
cHVsc2UgcmVzcG9uc2UgYnVmZmVyIChpZiB3ZSB1c2Ugc3RhZ2VTaXplKSwgc28gcmVkdWNlIHRo
ZSBsYXN0IHN0YWdlJ3MgbGVuZ3RoLi4uCisgICAgICAgIGlmIChzdGFnZVNpemUgKyBzdGFnZU9m
ZnNldCA+IHRvdGFsUmVzcG9uc2VMZW5ndGgpCisgICAgICAgICAgICBzdGFnZVNpemUgPSB0b3Rh
bFJlc3BvbnNlTGVuZ3RoIC0gc3RhZ2VPZmZzZXQ7CisKKyAgICAgICAgLy8gVGhpcyAic3RhZ2dl
cnMiIHRoZSB0aW1lIHdoZW4gZWFjaCBGRlQgaGFwcGVucyBzbyB0aGV5IGRvbid0IGFsbCBoYXBw
ZW4gYXQgdGhlIHNhbWUgdGltZQorICAgICAgICBpbnQgcmVuZGVyUGhhc2UgPSBjb252b2x2ZXJS
ZW5kZXJQaGFzZSArIGkgKiByZW5kZXJTbGljZVNpemU7CisKKyAgICAgICAgUGFzc093blB0cjxS
ZXZlcmJDb252b2x2ZXJTdGFnZT4gc3RhZ2UobmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJlc3Bv
bnNlLCB0b3RhbFJlc3BvbnNlTGVuZ3RoLCByZXZlcmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zmc2V0
LCBzdGFnZVNpemUsIGZmdFNpemUsIHJlbmRlclBoYXNlLCByZW5kZXJTbGljZVNpemUsIGFjY3Vt
QnVmZmVyUCkpOworCisgICAgICAgIGJvb2wgaXNCYWNrZ3JvdW5kU3RhZ2UgPSBmYWxzZTsKKwor
ICAgICAgICBpZiAoc3RhZ2VPZmZzZXQgPD0gUmVhbHRpbWVGcmFtZUxpbWl0KQorICAgICAgICAg
ICAgbV9zdGFnZXMuYXBwZW5kKHN0YWdlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBp
ZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSkgeworICAgICAgICAgICAgICAgIG1fYmFj
a2dyb3VuZFN0YWdlcy5hcHBlbmQoc3RhZ2UpOworICAgICAgICAgICAgICAgIGlzQmFja2dyb3Vu
ZFN0YWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG1fc3Rh
Z2VzLmFwcGVuZChzdGFnZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGFnZU9mZnNldCArPSBz
dGFnZVNpemU7CisgICAgICAgICsraTsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IG5leHQgRkZU
IHNpemUKKyAgICAgICAgZmZ0U2l6ZSAqPSAyOworICAgICAgICBpZiAoaGFzUmVhbHRpbWVDb25z
dHJhaW50ICYmICFpc0JhY2tncm91bmRTdGFnZSAmJiBmZnRTaXplID4gbV9tYXhSZWFsdGltZUZG
VFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhSZWFsdGltZUZGVFNpemU7CisgICAg
ICAgIGlmIChmZnRTaXplID4gbV9tYXhGRlRTaXplKQorICAgICAgICAgICAgZmZ0U2l6ZSA9IG1f
bWF4RkZUU2l6ZTsKKyAgICB9CisKKyAgICAvLyBTdGFydCB1cCBiYWNrZ3JvdW5kIHRocmVhZAor
ICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gdXAgdGhlIHRocmVhZCBwcmlvcml0eSBo
ZXJlLiAgSXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlYWwtdGltZSwgYnV0IGhpZ2hlciB0aGFuIHRo
ZSBkZWZhdWx0Li4uCisgICAgaWYgKHRoaXMtPnVzZUJhY2tncm91bmRUaHJlYWRzKCkgJiYgbV9i
YWNrZ3JvdW5kU3RhZ2VzLnNpemUoKSA+IDApCisgICAgICAgIG1fYmFja2dyb3VuZFRocmVhZCA9
IGNyZWF0ZVRocmVhZChCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2gsIHRoaXMsICJjb252b2x1dGlv
biBiYWNrZ3JvdW5kIHRocmVhZCIpOworICAgIGVsc2UKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhy
ZWFkID0gMDsKK30KKworUmV2ZXJiQ29udm9sdmVyOjp+UmV2ZXJiQ29udm9sdmVyKCkKK3sKKyAg
ICAvLyBXYWl0IGZvciBiYWNrZ3JvdW5kIHRocmVhZCB0byBzdG9wCisgICAgaWYgKHVzZUJhY2tn
cm91bmRUaHJlYWRzKCkgJiYgbV9iYWNrZ3JvdW5kVGhyZWFkKSB7CisgICAgICAgIG1fd2FudHNU
b0V4aXQgPSB0cnVlOworICAgICAgICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbihtX2JhY2tncm91
bmRUaHJlYWQsIDApOworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OmJhY2tncm91
bmRUaHJlYWRFbnRyeSgpCit7CisgICAgd2hpbGUgKCFtX3dhbnRzVG9FeGl0KSB7CisgICAgICAg
IC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFueSBtb3JlIGlucHV0IHRvIGNvbnN1bWUKKyAg
ICAgICAgaW50IHdyaXRlSW5kZXggPSBtX2lucHV0QnVmZmVyLndyaXRlSW5kZXgoKTsKKworICAg
ICAgICAvLyBFdmVuIHRob3VnaCBpdCBkb2Vzbid0IHNlZW0gbGlrZSBldmVyeSBzdGFnZSBuZWVk
cyB0byBtYWludGFpbiBpdHMgb3duIHZlcnNpb24gb2YgcmVhZEluZGV4IAorICAgICAgICAvLyB3
ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0aGFuIG9uZSBiYWNrZ3Jv
dW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsKKworICAgICAgICB3aGlsZSAoKHJl
YWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5wdXRSZWFkSW5kZXgoKSkgIT0gd3Jp
dGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRldGVjdCBidWZmZXIgb3ZlcnJ1bi4u
LgorICAgICAgICAgICAgLy8gRklYTUU6IHJlbW92ZSBoYXJkLWNvZGVkIHZhbHVlCisgICAgICAg
ICAgICBjb25zdCBpbnQga1NsaWNlU2l6ZSA9IDEyODsKKworICAgICAgICAgICAgLy8gQWNjdW11
bGF0ZSBjb250cmlidXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgICAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAg
ICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzW2ldLT5wcm9jZXNzSW5CYWNrZ3JvdW5kKHRoaXMsIGtT
bGljZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgMTBtcworICAgICAgICB1
c2xlZXAoMTAwMDApOyAvLyBGSVhNRTogYWx0aG91Z2ggaXQgd29ya3Mgd2VsbCBpbiBwcmFjdGlj
ZSwgdGhpcyByZWFsbHkgaXNuJ3QgaWRlYWwgLSBjb3VsZCB1c2Ugd2FpdC9zaWduYWwKKyAgICB9
Cit9CisKK3NpemVfdCBSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VSZXNwb25zZUxlbmd0aCgpCit7
CisgICAgcmV0dXJuIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoOworfQorCit2b2lkIFJldmVyYkNv
bnZvbHZlcjo6cHJvY2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQqIGRlc3RQLCBzaXplX3QgZnJh
bWVzVG9Qcm9jZXNzKQoreworICAgIC8vIEZlZWQgaW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0
aHJlYWRzKQorICAgIG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNz
KTsKKworICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBt
X3N0YWdlc1tpXS0+cHJvY2Vzcyhzb3VyY2VQLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8g
RmluYWxseSByZWFkIGZyb20gYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgIG1fYWNjdW11bGF0aW9u
QnVmZmVyLnJlYWRBbmRDbGVhcihkZXN0UCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBS
ZXZlcmJDb252b2x2ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
c3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQor
ICAgICAgICBtX2JhY2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxh
dGlvbkJ1ZmZlci5yZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9S
ZXZlcmJDb252b2x2ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVy
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhMjc1MgotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKQEAgLTAs
MCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUgUmV2ZXJiQ29u
dm9sdmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgIkZGVENv
bnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1
ZGUgIlJldmVyYkNvbnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIu
aCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4K
KyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xhc3MgUmV2ZXJi
Q29udm9sdmVyIHsKK3B1YmxpYzoKKyAgICAvLyBtYXhGRlRTaXplIGNhbiBiZSBhZGp1c3RlZCAo
ZnJvbSBzYXkgMjA0OCB0byAzMjc2OCkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHByZWNpc2lvbiBp
cyBuZWNlc3NhcnkuCisgICAgLy8gRm9yIGNlcnRhaW4gdHdlYWt5IGRlLWNvbnZvbHZpbmcgYXBw
bGljYXRpb25zIHRoZSBwaGFzZSBlcnJvcnMgYWRkIHVwIHF1aWNrbHkgYW5kIGxlYWQgdG8gbm9u
LXNlbnNpY2FsIHJlc3VsdHMgd2l0aAorICAgIC8vIGxhcmdlciBGRlQgc2l6ZXMgYW5kIHNpbmds
ZS1wcmVjaXNpb24gZmxvYXRzLiAgSW4gdGhlc2UgY2FzZXMgMjA0OCBpcyBhIGdvb2Qgc2l6ZS4K
KyAgICAvLyBJZiBub3QgZG9pbmcgbXVsdGktdGhyZWFkZWQgY29udm9sdXRpb24sIHRoZW4gc2hv
dWxkIG5vdCBnbyA+IDgxOTIuCisgICAgUmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1w
dWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwg
c2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKTsK
KworICAgIH5SZXZlcmJDb252b2x2ZXIoKTsKKworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogc291
cmNlUCwgZmxvYXQqIGRlc3RQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQg
cmVzZXQoKTsKKworICAgIHNpemVfdCBpbXB1bHNlUmVzcG9uc2VMZW5ndGgoKTsKKworICAgIFJl
dmVyYklucHV0QnVmZmVyKiBpbnB1dEJ1ZmZlcigpIHsgcmV0dXJuICZtX2lucHV0QnVmZmVyOyB9
CisKKyAgICBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VC
YWNrZ3JvdW5kVGhyZWFkczsgfQorCisgICAgdm9pZCBiYWNrZ3JvdW5kVGhyZWFkRW50cnkoKTsK
KworcHJpdmF0ZToKKyAgICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1f
c3RhZ2VzOworICAgIFZlY3RvcjxPd25QdHI8UmV2ZXJiQ29udm9sdmVyU3RhZ2U+ID4gbV9iYWNr
Z3JvdW5kU3RhZ2VzOworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKKworICAg
IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8v
IE9uZSBvciBtb3JlIGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGZyb20gdGhpcyBpbnB1dCBidWZm
ZXIgd2hpY2ggaXMgZmVkIGZyb20gdGhlIHJlYWx0aW1lIHRocmVhZC4KKyAgICBSZXZlcmJJbnB1
dEJ1ZmZlciBtX2lucHV0QnVmZmVyOworCisgICAgLy8gV2UncmUgZ2l2ZW4gYSByZW5kZXJpbmcg
aGludCwgc28gdGhlIEZGVHMgY2FuIGJlIG9wdGltaXplZCB0byBub3QgYWxsIG9jY3VyIGF0IHRo
ZSBzYW1lIHRpbWUKKyAgICAvLyAodmVyeSBiYWQgd2hlbiByZW5kZXJpbmcgb24gYSByZWFsLXRp
bWUgdGhyZWFkKS4KKyAgICBzaXplX3QgbV9yZW5kZXJTbGljZVNpemU7CisKKyAgICAvLyBGaXJz
dCBzdGFnZSB3aWxsIGJlIG9mIHNpemUgbV9taW5GRlRTaXplLiAgRWFjaCBuZXh0IHN0YWdlIHdp
bGwgYmUgdHdpY2UgYXMgYmlnIHVudGlsIHdlIGhpdCBtX21heEZGVFNpemUuCisgICAgc2l6ZV90
IG1fbWluRkZUU2l6ZTsKKyAgICBzaXplX3QgbV9tYXhGRlRTaXplOworCisgICAgLy8gQnV0IGRv
bid0IGV4Y2VlZCB0aGlzIHNpemUgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQgKGlmIHdlJ3JlIGRv
aW5nIGJhY2tncm91bmQgcHJvY2Vzc2luZykuCisgICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRT
aXplOworCisgICAgYm9vbCBtX3VzZUJhY2tncm91bmRUaHJlYWRzOworICAgIFRocmVhZElkZW50
aWZpZXIgbV9iYWNrZ3JvdW5kVGhyZWFkOworICAgIGJvb2wgbV93YW50c1RvRXhpdDsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlcl9oCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjhkMDAKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcApAQCAtMCww
ICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2
ZXJTdGFnZS5oIgorCisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIlJldmVyYkFj
Y3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlci5oIgorI2luY2x1
ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJi
Q29udm9sdmVyU3RhZ2U6OlJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9u
c2UsIHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6
ZV90IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFz
ZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1
bXVsYXRpb25CdWZmZXIpCisgICAgOiBtX2ZmdEtlcm5lbChmZnRTaXplKQorICAgICwgbV9hY2N1
bXVsYXRpb25CdWZmZXIoYWNjdW11bGF0aW9uQnVmZmVyKQorICAgICwgbV9hY2N1bXVsYXRpb25S
ZWFkSW5kZXgoMCkKKyAgICAsIG1faW5wdXRSZWFkSW5kZXgoMCkKKyAgICAsIG1fYWNjdW11bGF0
aW9uUmVhZFRpbWVGcmFtZSgwKQorICAgICwgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgocmVzcG9u
c2VMZW5ndGgpCit7CisgICAgbV9mZnRLZXJuZWwuZG9QYWRkZWRGRlQoaW1wdWxzZVJlc3BvbnNl
ICsgc3RhZ2VPZmZzZXQsIHN0YWdlTGVuZ3RoKTsKKworICAgIG1fY29udm9sdmVyID0gbmV3IEZG
VENvbnZvbHZlcihmZnRTaXplKTsKKworICAgIG1fdGVtcEJ1ZmZlci5hbGxvY2F0ZShyZW5kZXJT
bGljZVNpemUpOworCisgICAgLy8gVGhlIGNvbnZvbHV0aW9uIHN0YWdlIGF0IG9mZnNldCB8c3Rh
Z2VPZmZzZXR8IG5lZWRzIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlbGF5IHRvIGNhbmNlbCBv
dXQgdGhlIG9mZnNldAorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZzZXQgKyByZXZl
cmJUb3RhbExhdGVuY3k7CisKKyAgICAvLyBCdXQsIHRoZSBGRlQgY29udm9sdXRpb24gaXRzZWxm
IGluY3VycyB8ZmZ0U2l6ZXwgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMgb3V0Li4uCisg
ICAgc2l6ZV90IGhhbGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgaWYgKHRvdGFsRGVsYXkgPj0g
aGFsZlNpemUpCisgICAgICAgIHRvdGFsRGVsYXkgLT0gaGFsZlNpemU7CisKKyAgICAvLyBGSVhN
RTogREVBTCB3aXRoIGNhc2Ugd2hlbiB0b3RhbCBkZWxheSBpcyBsZXNzIHRoYW4gZmZ0U2l6ZS8y
Li4uLgorCisgICAgLy8gV2UgZGl2aWRlIHVwIHRoZSB0b3RhbCBkZWxheSwgaW50byBwcmUgYW5k
IHBvc3QgZGVsYXkgc2VjdGlvbnMgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyBzY2hlZHVsZSBhdCBl
eGFjdGx5IHRoZSBtb21lbnQgd2hlbiB0aGUgRkZUIHdpbGwgaGFwcGVuLiAgVGhpcyBpcyBjb29y
ZGluYXRlZAorICAgIC8vIHdpdGggdGhlIG90aGVyIHN0YWdlcywgc28gdGhleSBkb24ndCBhbGwg
ZG8gdGhlaXIgRkZUcyBhdCB0aGUgc2FtZSB0aW1lLi4uCisKKyAgICBpbnQgbSA9IChoYWxmU2l6
ZSA8PSB0b3RhbERlbGF5KSA/IGhhbGZTaXplIDogdG90YWxEZWxheTsKKyAgICBtX3ByZURlbGF5
TGVuZ3RoID0gKHRvdGFsRGVsYXkgPiAwKSA/IChyZW5kZXJQaGFzZSAlIG0pIDogMDsKKworICAg
IGlmIChtX3ByZURlbGF5TGVuZ3RoID4gdG90YWxEZWxheSkKKyAgICAgICAgbV9wcmVEZWxheUxl
bmd0aCA9IDA7CisKKyAgICBtX3Bvc3REZWxheUxlbmd0aCA9IHRvdGFsRGVsYXkgLSBtX3ByZURl
bGF5TGVuZ3RoOworICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOworICAgIG1fZnJhbWVzUHJv
Y2Vzc2VkID0gMDsgLy8gdG90YWwgZnJhbWVzIHByb2Nlc3NlZCBzbyBmYXIKKworICAgIG1fcHJl
RGVsYXlCdWZmZXIuYWxsb2NhdGUobV9wcmVEZWxheUxlbmd0aCA8IGZmdFNpemUgPyBmZnRTaXpl
IDogbV9wcmVEZWxheUxlbmd0aCk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnBy
b2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFt
ZXNUb1Byb2Nlc3MpCit7CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIqIGlucHV0QnVmZmVyID0gY29u
dm9sdmVyLT5pbnB1dEJ1ZmZlcigpOworICAgIGZsb2F0KiBzb3VyY2VQID0gaW5wdXRCdWZmZXIt
PmRpcmVjdFJlYWRGcm9tKCZtX2lucHV0UmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAg
IHByb2Nlc3Moc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCAgUmV2ZXJiQ29u
dm9sdmVyU3RhZ2U6OnByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBmcmFtZXNUb1Byb2Nl
c3MpCit7CisgICAgLy8KKyAgICAvLyBGSVhNRTogZG8gc2FuaXR5IGNoZWNrIG9uIGZyYW1lc1Rv
UHJvY2VzcyB2ZXJzdXMgZGVsYXkgYnVmZmVyIHNpemUKKyAgICAvLworCisgICAgLy8gR2V0IHBv
aW50ZXIgdG8gcHJlLWRlbGF5IHN0cmVhbSA6IG5vdGUgc3BlY2lhbCBoYW5kbGluZyBvZiB6ZXJv
IGRlbGF5CisgICAgZmxvYXQqIHByZURlbGF5ZWRTb3VyY2VQID0gc291cmNlUDsKKyAgICBmbG9h
dCogcHJlRGVsYXlCdWZmZXJQID0gbV9wcmVEZWxheUJ1ZmZlcjsKKyAgICBmbG9hdCogdGVtcFAg
PSBwcmVEZWxheUJ1ZmZlclA7CisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAg
ICAgIHByZURlbGF5ZWRTb3VyY2VQID0gcHJlRGVsYXlCdWZmZXJQICsgbV9wcmVSZWFkV3JpdGVJ
bmRleDsKKyAgICAgICAgdGVtcFAgPSBtX3RlbXBCdWZmZXI7CisgICAgfQorCisgICAgaW50IHdy
aXRlSW5kZXggPSAwOworCisgICAgaWYgKG1fZnJhbWVzUHJvY2Vzc2VkIDwgbV9wcmVEZWxheUxl
bmd0aCkgeworICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IHxtX3ByZURlbGF5TGVuZ3RofCBmcmFt
ZXMgZG9uJ3QgcHJvY2VzcyB0aGUgY29udm9sdmVyLCBpbnN0ZWFkIHNpbXBseSBidWZmZXIgaW4g
dGhlIHByZS1kZWxheS4KKyAgICAgICAgLy8gQnV0IHdoaWxlIGJ1ZmZlcmluZyB0aGUgcHJlLWRl
bGF5LCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5kZXguCisgICAgICAgIG1fYWNjdW11
bGF0aW9uQnVmZmVyLT51cGRhdGVSZWFkSW5kZXgoJm1fYWNjdW11bGF0aW9uUmVhZEluZGV4LCBm
cmFtZXNUb1Byb2Nlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vdywgcnVuIHRoZSBj
b252b2x1dGlvbiAoaW50byB0aGUgZGVsYXkgYnVmZmVyKQorICAgICAgICAvLyBBbiBleHBlbnNp
dmUgRkZUIHdpbGwgaGFwcGVuIGV2ZXJ5IChmZnRTaXplLzIpIGZyYW1lcworICAgICAgICAvLyBX
ZSBwcm9jZXNzIGluLXBsYWNlIGhlcmUuLi4KKyAgICAgICAgbV9jb252b2x2ZXItPnByb2Nlc3Mo
Jm1fZmZ0S2VybmVsLCBwcmVEZWxheWVkU291cmNlUCwgdGVtcFAsIGZyYW1lc1RvUHJvY2Vzcyk7
CisKKyAgICAgICAgLy8gTm93IGFjY3VtdWxhdGUgaW50byByZXZlcmIncyBhY2N1bXVsYXRpb24g
YnVmZmVyCisgICAgICAgIC8vIEZJWE1FOiByZWFsbHkgbmVlZCB0byBoYXZlIGxvY2tpbmcgbWVj
aGFuaXNtIGhlcmUhIQorICAgICAgICB3cml0ZUluZGV4ID0gbV9hY2N1bXVsYXRpb25CdWZmZXIt
PmFjY3VtdWxhdGUodGVtcFAsIGZyYW1lc1RvUHJvY2VzcywgJm1fYWNjdW11bGF0aW9uUmVhZElu
ZGV4LCBtX3Bvc3REZWxheUxlbmd0aCk7CisgICAgfQorCisgICAgLy8gRmluYWxseSBjb3B5IGlu
cHV0IHRvIHByZS1kZWxheQorICAgIGlmIChtX3ByZURlbGF5TGVuZ3RoID4gMCkgeworICAgICAg
ICBtZW1jcHkocHJlRGVsYXllZFNvdXJjZVAsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBmcmFt
ZXNUb1Byb2Nlc3MpOworICAgICAgICBtX3ByZVJlYWRXcml0ZUluZGV4ICs9IGZyYW1lc1RvUHJv
Y2VzczsKKworICAgICAgICBpZiAobV9wcmVSZWFkV3JpdGVJbmRleCA+PSBtX3ByZURlbGF5TGVu
Z3RoKQorICAgICAgICAgICAgbV9wcmVSZWFkV3JpdGVJbmRleCA9IDA7IC8vIHNob3VsZCBvbmx5
IGJlIDw9CisgICAgfQorCisgICAgbV9hY2N1bXVsYXRpb25SZWFkVGltZUZyYW1lICs9IGZyYW1l
c1RvUHJvY2VzczsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCArPSBmcmFtZXNUb1Byb2Nlc3M7Cit9
CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnJlc2V0KCkKK3sKKyAgICBtX2NvbnZvbHZl
ci0+cmVzZXQoKTsKKyAgICBtX3ByZURlbGF5QnVmZmVyLnplcm8oKTsKKyAgICBtX2FjY3VtdWxh
dGlvblJlYWRJbmRleCA9IDA7CisgICAgbV9pbnB1dFJlYWRJbmRleCA9IDA7CisgICAgbV9mcmFt
ZXNQcm9jZXNzZWQgPSAwOworICAgIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSA9IDA7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2
ZXJiQ29udm9sdmVyU3RhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4w
YTg5NzEwCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJD
b252b2x2ZXJTdGFnZS5oCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZl
clN0YWdlX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAorCisjaW5jbHVkZSAiQXVk
aW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAiRkZUQ29udm9sdmVyLmgiCisjaW5jbHVkZSA8d3Rm
L093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOworY2xhc3MgUmV2ZXJiQ29u
dm9sdmVyOworICAgIAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFnZSByZXByZXNlbnRzIHRoZSBj
b252b2x1dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlvbiBvZiBhIGxhcmdlIGltcHVs
c2UgcmVzcG9uc2UuCisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBsaW5lIHRvIGFjY291bnQg
Zm9yIHRoZSBvZmZzZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0aGUgbGFyZ2VyIGltcHVs
c2UgcmVzcG9uc2UuCitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7CitwdWJsaWM6CisgICAg
Ly8gfHJlbmRlclBoYXNlfCBpcyB1c2VmdWwgdG8ga25vdyBzbyB0aGF0IHdlIGNhbiBtYW5pcHVs
YXRlIHRoZSBwcmUgdmVyc3VzIHBvc3QgZGVsYXkgc28gdGhhdCBzdGFnZXMgd2lsbCBwZXJmb3Jt
CisgICAgLy8gdGhlaXIgaGVhdnkgd29yayAoRkZUIHByb2Nlc3NpbmcpIG9uIGRpZmZlcmVudCBz
bGljZXMgdG8gYmFsYW5jZSB0aGUgbG9hZCBpbiBhIHJlYWwtdGltZSB0aHJlYWQuCisgICAgUmV2
ZXJiQ29udm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNl
TGVuZ3RoLCBzaXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5LCBzaXplX3Qgc3RhZ2VPZmZzZXQsIHNp
emVfdCBzdGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZmZ0U2l6
ZSwgc2l6ZV90IHJlbmRlclBoYXNlLCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXIqIGFjY3VtdWxhdGlvbkJ1ZmZlcik7CisKKyAgICAvLyBXQVJOSU5HOiB8
ZnJhbWVzVG9Qcm9jZXNzfCBtdXN0IGJlIHN1Y2ggdGhhdCBpdCBldmVubHkgZGl2aWRlcyB0aGUg
ZGVsYXkgYnVmZmVyIHNpemUgKHN0YWdlX29mZnNldCkKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQq
IHNvdXJjZVAsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCBwcm9jZXNzSW5C
YWNrZ3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29udm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Qcm9j
ZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIFVzZWZ1bCBmb3IgYmFja2dyb3Vu
ZCBwcm9jZXNzaW5nCisgICAgaW50IGlucHV0UmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9p
bnB1dFJlYWRJbmRleDsgfQorCitwcml2YXRlOgorICAgIEZGVEZyYW1lIG1fZmZ0S2VybmVsOwor
ICAgIE93blB0cjxGRlRDb252b2x2ZXI+IG1fY29udm9sdmVyOworCisgICAgQXVkaW9GbG9hdEFy
cmF5IG1fcHJlRGVsYXlCdWZmZXI7CisKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIG1f
YWNjdW11bGF0aW9uQnVmZmVyOworICAgIGludCBtX2FjY3VtdWxhdGlvblJlYWRJbmRleDsKKyAg
ICBpbnQgbV9pbnB1dFJlYWRJbmRleDsKKworICAgIGludCBtX2FjY3VtdWxhdGlvblJlYWRUaW1l
RnJhbWU7IC8vIGZvciB0ZXN0aW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5lKQorCisg
ICAgc2l6ZV90IG1fcHJlRGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1fcG9zdERlbGF5TGVuZ3Ro
OworICAgIHNpemVfdCBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgIHNpemVfdCBtX2ZyYW1lc1By
b2Nlc3NlZDsKKworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBCdWZmZXI7CisKKyAgICBzaXpl
X3QgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGg7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmQwYTc3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlv
L1JldmVyYklucHV0QnVmZmVyLmNwcApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFw
cGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworUmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKHNpemVfdCBsZW5ndGgp
CisgICAgOiBtX2J1ZmZlcihsZW5ndGgpCisgICAgLCBtX2xlbmd0aChsZW5ndGgpCisgICAgLCBt
X3dyaXRlSW5kZXgoMCkKK3sKK30KKwordm9pZCBSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGUoZmxv
YXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVzKQoreworICAgIG1lbWNweShtX2J1ZmZlci5kYXRh
KCkgKyBtX3dyaXRlSW5kZXgsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBuZnJhbWVzKTsKKwor
ICAgIG1fd3JpdGVJbmRleCArPSBuZnJhbWVzOworICAgIEFTU0VSVChtX3dyaXRlSW5kZXggPD0g
bV9sZW5ndGgpOworCisgICAgaWYgKG1fd3JpdGVJbmRleCA+PSBtX2xlbmd0aCkKKyAgICAgICAg
bV93cml0ZUluZGV4ID0gMDsKK30KKworZmxvYXQqIFJldmVyYklucHV0QnVmZmVyOjpkaXJlY3RS
ZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbmZyYW1lcykKK3sKKyAgICBBU1NFUlQoKmluZGV4
ID49IDAgJiYgKmluZGV4ICsgbmZyYW1lcyA8PSBtX2xlbmd0aCk7CisgICAgZmxvYXQqIHNvdXJj
ZVAgPSBtX2J1ZmZlcjsKKyAgICBmbG9hdCogcCA9IHNvdXJjZVAgKyAqaW5kZXg7CisKKyAgICAv
LyBVcGRhdGUgaW5kZXgKKyAgICAqaW5kZXggPSAoKmluZGV4ICsgbmZyYW1lcykgJSBtX2xlbmd0
aDsKKworICAgIHJldHVybiBwOworfQorCit2b2lkIFJldmVyYklucHV0QnVmZmVyOjpyZXNldCgp
Cit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fd3JpdGVJbmRleCA9IDA7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiSW5wdXRCdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRC
dWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjE2NjcyCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5o
CkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9m
CisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYklucHV0QnVmZmVyX2gKKyNkZWZpbmUg
UmV2ZXJiSW5wdXRCdWZmZXJfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiSW5wdXRCdWZmZXIgaXMgdXNlZCB0byBidWZm
ZXIgaW5wdXQgc2FtcGxlcyBmb3IgZGVmZXJyZWQgcHJvY2Vzc2luZyBieSB0aGUgYmFja2dyb3Vu
ZCB0aHJlYWRzCitjbGFzcyBSZXZlcmJJbnB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgUmV2ZXJi
SW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvLyBUaGUgcmVhbHRpbWUgYXVkaW8g
dGhyZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxlcyBoZXJlLgorICAgIC8vIFRoZSBhc3N1bXB0aW9u
IGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IHxuZnJh
bWVzfCAgKGZvciBuZWFybHkgYWxsIGNhc2VzIHRoaXMgd2lsbCBiZSBmaW5lKQorICAgIC8vIEZJ
WE1FOiByZW1vdmUgfG5mcmFtZXN8IHJlc3RyaWN0aW9uLi4uCisgICAgdm9pZCB3cml0ZShmbG9h
dCogc291cmNlUCwgc2l6ZV90IG5mcmFtZXMpOworCisgICAgLy8gQmFja2dyb3VuZCB0aHJlYWRz
IGNhbiBjYWxsIHRoaXMgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnl0aGluZyB0byByZWFkLi4uCisg
ICAgLy8gRklYTUU6IGNyZWF0ZSBiZXR0ZXIgc3lzdGVtIHRvIGNoZWNrIGZvciBidWZmZXIgb3Zl
cnJ1bnMgLyBlcnJvciBjb25kaXRpb25zLi4uCisgICAgc2l6ZV90IHdyaXRlSW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX3dyaXRlSW5kZXg7IH0KKworICAgIC8vIFRoZSBpbmRpdmlkdWFsIGJhY2tn
cm91bmQgdGhyZWFkcyByZWFkIGhlcmUgKGFuZCBob3BlIHRoYXQgdGhleSBjYW4ga2VlcCB1cCB3
aXRoIHRoZSBidWZmZXIgd3JpdGluZykKKyAgICAvLyB8aW5kZXh8IGlzIHVwZGF0ZWQgd2l0aCB0
aGUgbmV4dCBpbmRleCB0byByZWFkIGZyb20uLi4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0
aGF0IHRoZSBidWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJsZSBieSB8bmZyYW1lc3wK
KyAgICAvLyBGSVhNRTogcmVtb3ZlIHxuZnJhbWVzfCByZXN0cmljdGlvbi4uLgorICAgIGZsb2F0
KiBkaXJlY3RSZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICB2b2lk
IHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5IG1fYnVmZmVyOworICAg
IHNpemVfdCBtX2xlbmd0aDsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4OworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiSW5wdXRCdWZmZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50957</attachid>
            <date>2010-03-17 14:17:00 -0700</date>
            <delta_ts>2010-03-22 14:32:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100317141659.patch</filename>
            <type>text/plain</type>
            <size>38721</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uYTc0NmM0NCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0xNyAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBubyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dy
b3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVm
ZmVyOjp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0wNSAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIgcjU1NTkz
LiAoVG8gZml4IFF0IC0tbWluaW1hbCBidWlsZC4pCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uNzhjYTU1YQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIu
aCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3Qg
bGVuZ3RoKQorICAgIDogbV9idWZmZXIobGVuZ3RoKQorICAgICwgbV9sZW5ndGgobGVuZ3RoKQor
ICAgICwgbV9yZWFkSW5kZXgoMCkKKyAgICAsIG1fcmVhZFRpbWVGcmFtZSgwKQoreworfQorCit2
b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZEFuZENsZWFyKGZsb2F0KiBkZXN0UCwg
c2l6ZV90IG5mcmFtZXMpCit7CisgICAgQVNTRVJUKG1fcmVhZEluZGV4IDw9IG1fbGVuZ3RoKTsK
KyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gbV9sZW5ndGggLSBtX3JlYWRJbmRleDsKKyAg
ICBzaXplX3QgbmZyYW1lczEgPSAobmZyYW1lcyA8PSBmcmFtZXNBdmFpbGFibGUpID8gbmZyYW1l
cyA6IGZyYW1lc0F2YWlsYWJsZTsKKyAgICBzaXplX3QgbmZyYW1lczIgPSBuZnJhbWVzIC0gbmZy
YW1lczE7CisKKyAgICBmbG9hdCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIG1lbWNweShkZXN0
UCwgc291cmNlUCArIG1fcmVhZEluZGV4LCBzaXplb2YoZmxvYXQpICogbmZyYW1lczEpOworICAg
IG1lbXNldChzb3VyY2VQICsgbV9yZWFkSW5kZXgsIDAsIHNpemVvZihmbG9hdCkgKiBuZnJhbWVz
MSk7CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG5m
cmFtZXMyID4gMCkgeworICAgICAgICBtZW1jcHkoZGVzdFAgKyBuZnJhbWVzMSwgc291cmNlUCwg
c2l6ZW9mKGZsb2F0KSAqIG5mcmFtZXMyKTsKKyAgICAgICAgbWVtc2V0KHNvdXJjZVAsIDAsIHNp
emVvZihmbG9hdCkgKiBuZnJhbWVzMik7CisgICAgfQorCisgICAgbV9yZWFkSW5kZXggPSAobV9y
ZWFkSW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3RoOworICAgIG1fcmVhZFRpbWVGcmFtZSArPSBu
ZnJhbWVzOworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6dXBkYXRlUmVhZElu
ZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbmZyYW1lcykKK3sKKyAgICAvLyBVcGRhdGUgY2Fs
bGVyJ3MgcmVhZEluZGV4CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZEluZGV4ICsgbmZyYW1lcykg
JSBtX2xlbmd0aDsKK30KKworaW50IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6YWNjdW11bGF0
ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG5mcmFtZXMsIGludCogcmVhZEluZGV4LCBzaXplX3Qg
ZGVsYXlGcmFtZXMpCit7CisgICAgc2l6ZV90IHdyaXRlSW5kZXggPSAoKnJlYWRJbmRleCArIGRl
bGF5RnJhbWVzKSAlIG1fbGVuZ3RoOworCisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHJlYWRJbmRl
eAorICAgICpyZWFkSW5kZXggPSAoKnJlYWRJbmRleCArIG5mcmFtZXMpICUgbV9sZW5ndGg7CisK
KyAgICBBU1NFUlQod3JpdGVJbmRleCA8PSBtX2xlbmd0aCk7CisgICAgc2l6ZV90IGZyYW1lc0F2
YWlsYWJsZSA9IG1fbGVuZ3RoIC0gd3JpdGVJbmRleDsKKyAgICBzaXplX3QgbmZyYW1lczEgPSAo
bmZyYW1lcyA8PSBmcmFtZXNBdmFpbGFibGUpID8gbmZyYW1lcyA6IGZyYW1lc0F2YWlsYWJsZTsK
KyAgICBzaXplX3QgbmZyYW1lczIgPSBuZnJhbWVzIC0gbmZyYW1lczE7CisKKyAgICBmbG9hdCog
ZGVzdFAgPSBtX2J1ZmZlcjsKKworICAgIHZhZGQoc291cmNlUCwgMSwgZGVzdFAgKyB3cml0ZUlu
ZGV4LCAxLCBkZXN0UCArIHdyaXRlSW5kZXgsIDEsIG5mcmFtZXMxKTsKKworICAgIC8vIEhhbmRs
ZSB3cmFwLWFyb3VuZCBpZiBuZWNlc3NhcnkKKyAgICBpZiAobmZyYW1lczIgPiAwKQorICAgICAg
ICB2YWRkKHNvdXJjZVAgKyBuZnJhbWVzMSwgMSwgZGVzdFAsIDEsIGRlc3RQLCAxLCBuZnJhbWVz
Mik7CisKKyAgICByZXR1cm4gd3JpdGVJbmRleDsKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXI6OnJlc2V0KCkKK3sKKyAgICBtX2J1ZmZlci56ZXJvKCk7CisgICAgbV9yZWFkSW5k
ZXggPSAwOworICAgIG1fcmVhZFRpbWVGcmFtZSA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0
aW9uQnVmZmVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMzUxMGIKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0
aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5h
bWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZl
cl9oCisjZGVmaW5lIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcl9oCisKKyNpbmNsdWRlICJBdWRp
b0Zsb2F0QXJyYXkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXIgaXMgYSBjaXJjdWxhciBkZWxheSBidWZmZXIgd2l0aCBvbmUgY2xpZW50IHJl
YWRpbmcgZnJvbSBpdCBhbmQgbXVsdGlwbGUgY2xpZW50cworLy8gd3JpdGluZy9hY2N1bXVsYXRp
bmcgdG8gaXQgYXQgZGlmZmVyZW50IGRlbGF5IG9mZnNldHMgZnJvbSB0aGUgcmVhZCBwb3NpdGlv
bi4gIFRoZSByZWFkIG9wZXJhdGlvbiB3aWxsIHplcm8gdGhlIG1lbW9yeQorLy8ganVzdCByZWFk
IGZyb20gdGhlIGJ1ZmZlciwgc28gaXQgd2lsbCBiZSByZWFkeSBmb3IgYWNjdW11bGF0aW9uIHRo
ZSBuZXh0IHRpbWUgYXJvdW5kLgorY2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyIHsKK3B1
YmxpYzoKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAg
ICAvLyBUaGlzIHdpbGwgcmVhZCBmcm9tLCB0aGVuIGNsZWFyLW91dCBuZnJhbWVzCisgICAgdm9p
ZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RQLCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICAvLyBF
YWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11bGF0ZSBpdHMgb3V0cHV0IGF0IHRo
ZSBhcHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBvc2l0aW9uLgorICAgIC8vIFdlIG5l
ZWQgdG8gcGFzcyBpbiBhbmQgdXBkYXRlIHJlYWRJbmRleCBoZXJlLCBzaW5jZSBlYWNoIFJldmVy
YkNvbnZvbHZlclN0YWdlIG1heSBiZSBydW5uaW5nIGluCisgICAgLy8gYSBkaWZmZXJlbnQgdGhy
ZWFkIHRoYW4gdGhlIHJlYWx0aW1lIHRocmVhZCBjYWxsaW5nIFJlYWRBbmRDbGVhcigpIGFuZCBt
YWludGFpbmluZyBtX3JlYWRJbmRleAorICAgIC8vIFJldHVybnMgdGhlIHdyaXRlSW5kZXggd2hl
cmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAgaW50IGFjY3VtdWxhdGUoZmxvYXQq
IHNvdXJjZVAsIHNpemVfdCBuZnJhbWVzLCBpbnQqIHJlYWRJbmRleCwgc2l6ZV90IGRlbGF5RnJh
bWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3JlYWRJbmRl
eDsgfQorICAgIHZvaWQgdXBkYXRlUmVhZEluZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbmZy
YW1lcyk7CisKKyAgICBzaXplX3QgcmVhZFRpbWVGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVh
ZFRpbWVGcmFtZTsgfQorCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRlOgorICAgIEF1ZGlv
RmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV9sZW5ndGg7CisgICAgc2l6ZV90IG1f
cmVhZEluZGV4OworICAgIHNpemVfdCBtX3JlYWRUaW1lRnJhbWU7IC8vIGZvciBkZWJ1Z2dpbmcg
KGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmM5NTgzODgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisKKyNpbmNsdWRlICJBY2NlbGVy
YXRlLmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
b25zdCBpbnQgSW5wdXRCdWZmZXJTaXplID0gOCAqIDE2Mzg0OworCisvLyBXZSBvbmx5IHByb2Nl
c3MgdGhlIGxlYWRpbmcgcG9ydGlvbiBvZiB0aGUgaW1wdWxzZSByZXNwb25zZSBpbiB0aGUgcmVh
bC10aW1lIHRocmVhZC4gIFdlIGRvbid0IGV4Y2VlZCB0aGlzIGxlbmd0aC4KKy8vIEl0IHR1cm5z
IG91dCB0aGVuLCB0aGF0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBoYXMgYWJvdXQgMjc4bXNlYyBv
ZiBzY2hlZHVsaW5nIHNsb3AuCisvLyBFbXBpcmljYWxseSwgdGhpcyBoYXMgYmVlbiBmb3VuZCB0
byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGdpdmluZyBlbm91Z2ggdGltZSBmb3Igc2No
ZWR1bGluZyBzbG9wLAorLy8gd2hpbGUgc3RpbGwgbWluaW1pemluZyB0aGUgYW1vdW50IG9mIHBy
b2Nlc3NpbmcgZG9uZSBpbiB0aGUgcHJpbWFyeSAoaGlnaC1wcmlvcml0eSkgdGhyZWFkLgorLy8g
VGhpcyB3YXMgZm91bmQgdG8gYmUgYSBnb29kIHZhbHVlIG9uIE1hYyBPUyBYLCBhbmQgbWF5IHdv
cmsgd2VsbCBvbiBvdGhlciBwbGF0Zm9ybXMgYXMgd2VsbCwgYXNzdW1pbmcKKy8vIHRoZSB2ZXJ5
IHJvdWdoIHNjaGVkdWxpbmcgbGF0ZW5jaWVzIGFyZSBzaW1pbGFyIG9uIHRoZXNlIHRpbWUtc2Nh
bGVzLiAgT2YgY291cnNlLCB0aGlzIGNvZGUgbWF5IG5lZWQgdG8gYmUKKy8vIHR1bmVkIGZvciBp
bmRpdmlkdWFsIHBsYXRmb3JtcyBpZiB0aGlzIGFzc3VtcHRpb24gaXMgZm91bmQgdG8gYmUgaW5j
b3JyZWN0LgorY29uc3Qgc2l6ZV90IFJlYWx0aW1lRnJhbWVMaW1pdCA9IDgxOTIgICsgNDA5Njsg
Ly8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBNaW5GRlRTaXplID0gMjU2Owor
Y29uc3Qgc2l6ZV90IE1heFJlYWx0aW1lRkZUU2l6ZSA9IDIwNDg7CisKK3N0YXRpYyB2b2lkKiBC
YWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2godm9pZCogdGhyZWFkRGF0YSkKK3sKKyAgICBSZXZlcmJD
b252b2x2ZXIqIHJldmVyYkNvbnZvbHZlciA9IHN0YXRpY19jYXN0PFJldmVyYkNvbnZvbHZlcio+
KHRocmVhZERhdGEpOworICAgIHJldmVyYkNvbnZvbHZlci0+YmFja2dyb3VuZFRocmVhZEVudHJ5
KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6UmV2ZXJiQ29udm9sdmVy
KEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBz
aXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJh
Y2tncm91bmRUaHJlYWRzKQorICAgIDogbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgoaW1wdWxzZVJl
c3BvbnNlLT5mcmFtZVNpemUoKSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVmZmVyKGltcHVsc2VS
ZXNwb25zZS0+ZnJhbWVTaXplKCkgKyByZW5kZXJTbGljZVNpemUpCisgICAgLCBtX2lucHV0QnVm
ZmVyKElucHV0QnVmZmVyU2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xpY2VTaXplKHJlbmRlclNsaWNl
U2l6ZSkKKyAgICAsIG1fbWluRkZUU2l6ZShNaW5GRlRTaXplKSAvLyBGaXJzdCBzdGFnZSB3aWxs
IGhhdmUgdGhpcyBzaXplIC0gc3VjY2Vzc2l2ZSBzdGFnZXMgd2lsbCBkb3VibGUgaW4gc2l6ZSBl
YWNoIHRpbWUKKyAgICAsIG1fbWF4RkZUU2l6ZShtYXhGRlRTaXplKSAvLyB1bnRpbCB3ZSBoaXQg
bV9tYXhGRlRTaXplCisgICAgLCBtX3VzZUJhY2tncm91bmRUaHJlYWRzKHVzZUJhY2tncm91bmRU
aHJlYWRzKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKK3sKKyAgICAvLyBJZiB3ZSBhcmUg
dXNpbmcgYmFja2dyb3VuZCB0aHJlYWRzIHRoZW4gZG9uJ3QgZXhjZWVkIHRoaXMgRkZUIHNpemUg
Zm9yIHRoZQorICAgIC8vIHN0YWdlcyB3aGljaCBydW4gaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQu
ICBUaGlzIGF2b2lkcyBoYXZpbmcgb25seSBvbmUgb3IgdHdvCisgICAgLy8gbGFyZ2Ugc3RhZ2Vz
IChzaXplIDE2Mzg0IG9yIHNvKSBhdCB0aGUgZW5kIHdoaWNoIHRha2UgYSBsb3Qgb2YgdGltZSBl
dmVyeSBzZXZlcmFsCisgICAgLy8gcHJvY2Vzc2luZyBzbGljZXMuICBUaGlzIHdheSB3ZSBhbW9y
dGl6ZSB0aGUgY29zdCBvdmVyIG1vcmUgcHJvY2Vzc2luZyBzbGljZXMuCisgICAgbV9tYXhSZWFs
dGltZUZGVFNpemUgPSBNYXhSZWFsdGltZUZGVFNpemU7CisKKyAgICAvLyBGb3IgdGhlIG1vbWVu
dCwgYSBnb29kIHdheSB0byBrbm93IGlmIHdlIGhhdmUgcmVhbC10aW1lIGNvbnN0cmFpbnQgaXMg
dG8gY2hlY2sgaWYgd2UncmUgdXNpbmcgYmFja2dyb3VuZCB0aHJlYWRzLgorICAgIC8vIE90aGVy
d2lzZSwgYXNzdW1lIHdlJ3JlIGJlaW5nIHJ1biBmcm9tIGEgY29tbWFuZC1saW5lIHRvb2wuCisg
ICAgYm9vbCBoYXNSZWFsdGltZUNvbnN0cmFpbnQgPSB1c2VCYWNrZ3JvdW5kVGhyZWFkczsKKwor
ICAgIGZsb2F0KiByZXNwb25zZSA9IGltcHVsc2VSZXNwb25zZS0+ZGF0YSgpOworICAgIHNpemVf
dCB0b3RhbFJlc3BvbnNlTGVuZ3RoID0gaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKTsKKyAg
ICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtQnVmZmVyUCA9ICZtX2FjY3VtdWxhdGlv
bkJ1ZmZlcjsKKworICAgIC8vIEJlY2F1c2Ugd2UncmUgbm90IHVzaW5nIGRpcmVjdC1jb252b2x1
dGlvbiBpbiB0aGUgbGVhZGluZyBwb3J0aW9uLCB0aGUgcmV2ZXJiIGhhcyBhbiBvdmVyYWxsIGxh
dGVuY3kgb2YgaGFsZiB0aGUgZmlyc3Qtc3RhZ2UgRkZUIHNpemUKKyAgICBzaXplX3QgcmV2ZXJi
VG90YWxMYXRlbmN5ID0gbV9taW5GRlRTaXplIC8gMjsKKworICAgIHNpemVfdCBzdGFnZU9mZnNl
dCA9IDA7CisgICAgaW50IGkgPSAwOworICAgIHNpemVfdCBmZnRTaXplID0gbV9taW5GRlRTaXpl
OworICAgIHdoaWxlIChzdGFnZU9mZnNldCA8IHRvdGFsUmVzcG9uc2VMZW5ndGgpIHsKKyAgICAg
ICAgc2l6ZV90IHN0YWdlU2l6ZSA9IGZmdFNpemUgLyAyOworCisgICAgICAgIC8vIEZvciB0aGUg
bGFzdCBzdGFnZSwgaXQncyBwb3NzaWJsZSB0aGF0IHN0YWdlT2Zmc2V0IGlzIHN1Y2ggdGhhdCB3
ZSdyZSBzdHJhZGRsaW5nIHRoZSBlbmQKKyAgICAgICAgLy8gb2YgdGhlIGltcHVsc2UgcmVzcG9u
c2UgYnVmZmVyIChpZiB3ZSB1c2Ugc3RhZ2VTaXplKSwgc28gcmVkdWNlIHRoZSBsYXN0IHN0YWdl
J3MgbGVuZ3RoLi4uCisgICAgICAgIGlmIChzdGFnZVNpemUgKyBzdGFnZU9mZnNldCA+IHRvdGFs
UmVzcG9uc2VMZW5ndGgpCisgICAgICAgICAgICBzdGFnZVNpemUgPSB0b3RhbFJlc3BvbnNlTGVu
Z3RoIC0gc3RhZ2VPZmZzZXQ7CisKKyAgICAgICAgLy8gVGhpcyAic3RhZ2dlcnMiIHRoZSB0aW1l
IHdoZW4gZWFjaCBGRlQgaGFwcGVucyBzbyB0aGV5IGRvbid0IGFsbCBoYXBwZW4gYXQgdGhlIHNh
bWUgdGltZQorICAgICAgICBpbnQgcmVuZGVyUGhhc2UgPSBjb252b2x2ZXJSZW5kZXJQaGFzZSAr
IGkgKiByZW5kZXJTbGljZVNpemU7CisKKyAgICAgICAgUGFzc093blB0cjxSZXZlcmJDb252b2x2
ZXJTdGFnZT4gc3RhZ2UobmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJlc3BvbnNlLCB0b3RhbFJl
c3BvbnNlTGVuZ3RoLCByZXZlcmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zmc2V0LCBzdGFnZVNpemUs
IGZmdFNpemUsIHJlbmRlclBoYXNlLCByZW5kZXJTbGljZVNpemUsIGFjY3VtQnVmZmVyUCkpOwor
CisgICAgICAgIGJvb2wgaXNCYWNrZ3JvdW5kU3RhZ2UgPSBmYWxzZTsKKworICAgICAgICBpZiAo
c3RhZ2VPZmZzZXQgPD0gUmVhbHRpbWVGcmFtZUxpbWl0KQorICAgICAgICAgICAgbV9zdGFnZXMu
YXBwZW5kKHN0YWdlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodGhpcy0+dXNl
QmFja2dyb3VuZFRocmVhZHMoKSkgeworICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdl
cy5hcHBlbmQoc3RhZ2UpOworICAgICAgICAgICAgICAgIGlzQmFja2dyb3VuZFN0YWdlID0gdHJ1
ZTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIG1fc3RhZ2VzLmFwcGVuZChz
dGFnZSk7CisgICAgICAgIH0KKworICAgICAgICBzdGFnZU9mZnNldCArPSBzdGFnZVNpemU7Cisg
ICAgICAgICsraTsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IG5leHQgRkZUIHNpemUKKyAgICAg
ICAgZmZ0U2l6ZSAqPSAyOworICAgICAgICBpZiAoaGFzUmVhbHRpbWVDb25zdHJhaW50ICYmICFp
c0JhY2tncm91bmRTdGFnZSAmJiBmZnRTaXplID4gbV9tYXhSZWFsdGltZUZGVFNpemUpCisgICAg
ICAgICAgICBmZnRTaXplID0gbV9tYXhSZWFsdGltZUZGVFNpemU7CisgICAgICAgIGlmIChmZnRT
aXplID4gbV9tYXhGRlRTaXplKQorICAgICAgICAgICAgZmZ0U2l6ZSA9IG1fbWF4RkZUU2l6ZTsK
KyAgICB9CisKKyAgICAvLyBTdGFydCB1cCBiYWNrZ3JvdW5kIHRocmVhZAorICAgIC8vIEZJWE1F
OiB3b3VsZCBiZSBiZXR0ZXIgdG8gdXAgdGhlIHRocmVhZCBwcmlvcml0eSBoZXJlLiAgSXQgZG9l
c24ndCBuZWVkIHRvIGJlIHJlYWwtdGltZSwgYnV0IGhpZ2hlciB0aGFuIHRoZSBkZWZhdWx0Li4u
CisgICAgaWYgKHRoaXMtPnVzZUJhY2tncm91bmRUaHJlYWRzKCkgJiYgbV9iYWNrZ3JvdW5kU3Rh
Z2VzLnNpemUoKSA+IDApCisgICAgICAgIG1fYmFja2dyb3VuZFRocmVhZCA9IGNyZWF0ZVRocmVh
ZChCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2gsIHRoaXMsICJjb252b2x1dGlvbiBiYWNrZ3JvdW5k
IHRocmVhZCIpOworICAgIGVsc2UKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gMDsKK30K
KworUmV2ZXJiQ29udm9sdmVyOjp+UmV2ZXJiQ29udm9sdmVyKCkKK3sKKyAgICAvLyBXYWl0IGZv
ciBiYWNrZ3JvdW5kIHRocmVhZCB0byBzdG9wCisgICAgaWYgKHVzZUJhY2tncm91bmRUaHJlYWRz
KCkgJiYgbV9iYWNrZ3JvdW5kVGhyZWFkKSB7CisgICAgICAgIG1fd2FudHNUb0V4aXQgPSB0cnVl
OworICAgICAgICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbihtX2JhY2tncm91bmRUaHJlYWQsIDAp
OworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OmJhY2tncm91bmRUaHJlYWRFbnRy
eSgpCit7CisgICAgd2hpbGUgKCFtX3dhbnRzVG9FeGl0KSB7CisgICAgICAgIC8vIENoZWNrIHRv
IHNlZSBpZiB0aGVyZSdzIGFueSBtb3JlIGlucHV0IHRvIGNvbnN1bWUKKyAgICAgICAgaW50IHdy
aXRlSW5kZXggPSBtX2lucHV0QnVmZmVyLndyaXRlSW5kZXgoKTsKKworICAgICAgICAvLyBFdmVu
IHRob3VnaCBpdCBkb2Vzbid0IHNlZW0gbGlrZSBldmVyeSBzdGFnZSBuZWVkcyB0byBtYWludGFp
biBpdHMgb3duIHZlcnNpb24gb2YgcmVhZEluZGV4IAorICAgICAgICAvLyB3ZSBkbyB0aGlzIGlu
IGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0aGFuIG9uZSBiYWNrZ3JvdW5kIHRocmVhZC4K
KyAgICAgICAgaW50IHJlYWRJbmRleDsKKworICAgICAgICB3aGlsZSAoKHJlYWRJbmRleCA9IG1f
YmFja2dyb3VuZFN0YWdlc1swXS0+aW5wdXRSZWFkSW5kZXgoKSkgIT0gd3JpdGVJbmRleCkgeyAv
LyBGSVhNRTogZG8gYmV0dGVyIHRvIGRldGVjdCBidWZmZXIgb3ZlcnJ1bi4uLgorICAgICAgICAg
ICAgLy8gRklYTUU6IHJlbW92ZSBoYXJkLWNvZGVkIHZhbHVlCisgICAgICAgICAgICBjb25zdCBp
bnQga1NsaWNlU2l6ZSA9IDEyODsKKworICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSBjb250cmli
dXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgICAgICAgICAgbV9iYWNr
Z3JvdW5kU3RhZ2VzW2ldLT5wcm9jZXNzSW5CYWNrZ3JvdW5kKHRoaXMsIGtTbGljZVNpemUpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gU2xlZXAgMTBtcworICAgICAgICB1c2xlZXAoMTAwMDAp
OyAvLyBGSVhNRTogYWx0aG91Z2ggaXQgd29ya3Mgd2VsbCBpbiBwcmFjdGljZSwgdGhpcyByZWFs
bHkgaXNuJ3QgaWRlYWwgLSBjb3VsZCB1c2Ugd2FpdC9zaWduYWwKKyAgICB9Cit9CisKK3NpemVf
dCBSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VSZXNwb25zZUxlbmd0aCgpCit7CisgICAgcmV0dXJu
IG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoOworfQorCit2b2lkIFJldmVyYkNvbnZvbHZlcjo6cHJv
Y2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQqIGRlc3RQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNz
KQoreworICAgIC8vIEZlZWQgaW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0aHJlYWRzKQorICAg
IG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNlUCwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8v
IEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+
cHJvY2Vzcyhzb3VyY2VQLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gRmluYWxseSByZWFk
IGZyb20gYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLnJlYWRB
bmRDbGVhcihkZXN0UCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBSZXZlcmJDb252b2x2
ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUo
KTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX2Jh
Y2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5y
ZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2
ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhMjc1MgotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKQEAgLTAsMCArMSw5NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyX2gKKwor
I2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgIkZGVENvbnZvbHZlci5oIgor
I2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNv
bnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKyNpbmNsdWRl
IDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3
dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xhc3MgUmV2ZXJiQ29udm9sdmVyIHsK
K3B1YmxpYzoKKyAgICAvLyBtYXhGRlRTaXplIGNhbiBiZSBhZGp1c3RlZCAoZnJvbSBzYXkgMjA0
OCB0byAzMjc2OCkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHByZWNpc2lvbiBpcyBuZWNlc3Nhcnku
CisgICAgLy8gRm9yIGNlcnRhaW4gdHdlYWt5IGRlLWNvbnZvbHZpbmcgYXBwbGljYXRpb25zIHRo
ZSBwaGFzZSBlcnJvcnMgYWRkIHVwIHF1aWNrbHkgYW5kIGxlYWQgdG8gbm9uLXNlbnNpY2FsIHJl
c3VsdHMgd2l0aAorICAgIC8vIGxhcmdlciBGRlQgc2l6ZXMgYW5kIHNpbmdsZS1wcmVjaXNpb24g
ZmxvYXRzLiAgSW4gdGhlc2UgY2FzZXMgMjA0OCBpcyBhIGdvb2Qgc2l6ZS4KKyAgICAvLyBJZiBu
b3QgZG9pbmcgbXVsdGktdGhyZWFkZWQgY29udm9sdXRpb24sIHRoZW4gc2hvdWxkIG5vdCBnbyA+
IDgxOTIuCisgICAgUmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNl
LCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZv
bHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKTsKKworICAgIH5SZXZl
cmJDb252b2x2ZXIoKTsKKworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQq
IGRlc3RQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKwor
ICAgIHNpemVfdCBpbXB1bHNlUmVzcG9uc2VMZW5ndGgoKTsKKworICAgIFJldmVyYklucHV0QnVm
ZmVyKiBpbnB1dEJ1ZmZlcigpIHsgcmV0dXJuICZtX2lucHV0QnVmZmVyOyB9CisKKyAgICBib29s
IHVzZUJhY2tncm91bmRUaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VCYWNrZ3JvdW5kVGhy
ZWFkczsgfQorCisgICAgdm9pZCBiYWNrZ3JvdW5kVGhyZWFkRW50cnkoKTsKKworcHJpdmF0ZToK
KyAgICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fc3RhZ2VzOworICAg
IFZlY3RvcjxPd25QdHI8UmV2ZXJiQ29udm9sdmVyU3RhZ2U+ID4gbV9iYWNrZ3JvdW5kU3RhZ2Vz
OworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKKworICAgIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIE9uZSBvciBtb3Jl
IGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGZyb20gdGhpcyBpbnB1dCBidWZmZXIgd2hpY2ggaXMg
ZmVkIGZyb20gdGhlIHJlYWx0aW1lIHRocmVhZC4KKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciBtX2lu
cHV0QnVmZmVyOworCisgICAgLy8gV2UncmUgZ2l2ZW4gYSByZW5kZXJpbmcgaGludCwgc28gdGhl
IEZGVHMgY2FuIGJlIG9wdGltaXplZCB0byBub3QgYWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUK
KyAgICAvLyAodmVyeSBiYWQgd2hlbiByZW5kZXJpbmcgb24gYSByZWFsLXRpbWUgdGhyZWFkKS4K
KyAgICBzaXplX3QgbV9yZW5kZXJTbGljZVNpemU7CisKKyAgICAvLyBGaXJzdCBzdGFnZSB3aWxs
IGJlIG9mIHNpemUgbV9taW5GRlRTaXplLiAgRWFjaCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2Ug
YXMgYmlnIHVudGlsIHdlIGhpdCBtX21heEZGVFNpemUuCisgICAgc2l6ZV90IG1fbWluRkZUU2l6
ZTsKKyAgICBzaXplX3QgbV9tYXhGRlRTaXplOworCisgICAgLy8gQnV0IGRvbid0IGV4Y2VlZCB0
aGlzIHNpemUgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQgKGlmIHdlJ3JlIGRvaW5nIGJhY2tncm91
bmQgcHJvY2Vzc2luZykuCisgICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRTaXplOworCisgICAg
Ym9vbCBtX3VzZUJhY2tncm91bmRUaHJlYWRzOworICAgIFRocmVhZElkZW50aWZpZXIgbV9iYWNr
Z3JvdW5kVGhyZWFkOworICAgIGJvb2wgbV93YW50c1RvRXhpdDsKK307CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlcl9oCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjQ5YTM3YjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcApAQCAtMCwwICsxLDE0MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgor
CisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYklu
cHV0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiQ29udm9sdmVyU3Rh
Z2U6OlJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCBy
ZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zm
c2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJl
bmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZm
ZXIpCisgICAgOiBtX2ZmdEtlcm5lbChmZnRTaXplKQorICAgICwgbV9hY2N1bXVsYXRpb25CdWZm
ZXIoYWNjdW11bGF0aW9uQnVmZmVyKQorICAgICwgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgoMCkK
KyAgICAsIG1faW5wdXRSZWFkSW5kZXgoMCkKKyAgICAsIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVG
cmFtZSgwKQorICAgICwgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgocmVzcG9uc2VMZW5ndGgpCit7
CisgICAgbV9mZnRLZXJuZWwuZG9QYWRkZWRGRlQoaW1wdWxzZVJlc3BvbnNlICsgc3RhZ2VPZmZz
ZXQsIHN0YWdlTGVuZ3RoKTsKKworICAgIG1fY29udm9sdmVyID0gbmV3IEZGVENvbnZvbHZlcihm
ZnRTaXplKTsKKworICAgIG1fdGVtcEJ1ZmZlci5hbGxvY2F0ZShyZW5kZXJTbGljZVNpemUpOwor
CisgICAgLy8gVGhlIGNvbnZvbHV0aW9uIHN0YWdlIGF0IG9mZnNldCBzdGFnZU9mZnNldCBuZWVk
cyB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBkZWxheSB0byBjYW5jZWwgb3V0IHRoZSBvZmZzZXQK
KyAgICBzaXplX3QgdG90YWxEZWxheSA9IHN0YWdlT2Zmc2V0ICsgcmV2ZXJiVG90YWxMYXRlbmN5
OworCisgICAgLy8gQnV0LCB0aGUgRkZUIGNvbnZvbHV0aW9uIGl0c2VsZiBpbmN1cnMgZmZ0U2l6
ZSAvIDIgbGF0ZW5jeSwgc28gc3VidHJhY3QgdGhpcyBvdXQuLi4KKyAgICBzaXplX3QgaGFsZlNp
emUgPSBmZnRTaXplIC8gMjsKKyAgICBpZiAodG90YWxEZWxheSA+PSBoYWxmU2l6ZSkKKyAgICAg
ICAgdG90YWxEZWxheSAtPSBoYWxmU2l6ZTsKKworICAgIC8vIEZJWE1FOiBERUFMIHdpdGggY2Fz
ZSB3aGVuIHRvdGFsIGRlbGF5IGlzIGxlc3MgdGhhbiBmZnRTaXplLzIuLi4uCisKKyAgICAvLyBX
ZSBkaXZpZGUgdXAgdGhlIHRvdGFsIGRlbGF5LCBpbnRvIHByZSBhbmQgcG9zdCBkZWxheSBzZWN0
aW9ucyBzbyB0aGF0IHdlIGNhbgorICAgIC8vIHNjaGVkdWxlIGF0IGV4YWN0bHkgdGhlIG1vbWVu
dCB3aGVuIHRoZSBGRlQgd2lsbCBoYXBwZW4uICBUaGlzIGlzIGNvb3JkaW5hdGVkCisgICAgLy8g
d2l0aCB0aGUgb3RoZXIgc3RhZ2VzLCBzbyB0aGV5IGRvbid0IGFsbCBkbyB0aGVpciBGRlRzIGF0
IHRoZSBzYW1lIHRpbWUuLi4KKworICAgIGludCBtID0gKGhhbGZTaXplIDw9IHRvdGFsRGVsYXkp
ID8gaGFsZlNpemUgOiB0b3RhbERlbGF5OworICAgIG1fcHJlRGVsYXlMZW5ndGggPSAodG90YWxE
ZWxheSA+IDApID8gKHJlbmRlclBoYXNlICUgbSkgOiAwOworCisgICAgaWYgKG1fcHJlRGVsYXlM
ZW5ndGggPiB0b3RhbERlbGF5KQorICAgICAgICBtX3ByZURlbGF5TGVuZ3RoID0gMDsKKworICAg
IG1fcG9zdERlbGF5TGVuZ3RoID0gdG90YWxEZWxheSAtIG1fcHJlRGVsYXlMZW5ndGg7CisgICAg
bV9wcmVSZWFkV3JpdGVJbmRleCA9IDA7CisgICAgbV9mcmFtZXNQcm9jZXNzZWQgPSAwOyAvLyB0
b3RhbCBmcmFtZXMgcHJvY2Vzc2VkIHNvIGZhcgorCisgICAgbV9wcmVEZWxheUJ1ZmZlci5hbGxv
Y2F0ZShtX3ByZURlbGF5TGVuZ3RoIDwgZmZ0U2l6ZSA/IGZmdFNpemUgOiBtX3ByZURlbGF5TGVu
Z3RoKTsKK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dyb3Vu
ZChSZXZlcmJDb252b2x2ZXIqIGNvbnZvbHZlciwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sK
KyAgICBSZXZlcmJJbnB1dEJ1ZmZlciogaW5wdXRCdWZmZXIgPSBjb252b2x2ZXItPmlucHV0QnVm
ZmVyKCk7CisgICAgZmxvYXQqIHNvdXJjZVAgPSBpbnB1dEJ1ZmZlci0+ZGlyZWN0UmVhZEZyb20o
Jm1faW5wdXRSZWFkSW5kZXgsIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgcHJvY2Vzcyhzb3VyY2VQ
LCBmcmFtZXNUb1Byb2Nlc3MpOworfQorCit2b2lkICBSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJv
Y2VzcyhmbG9hdCogc291cmNlUCwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyAgICAvLwor
ICAgIC8vIEZJWE1FOiBkbyBzYW5pdHkgY2hlY2sgb24gZnJhbWVzVG9Qcm9jZXNzIHZlcnN1cyBk
ZWxheSBidWZmZXIgc2l6ZQorICAgIC8vCisKKyAgICAvLyBHZXQgcG9pbnRlciB0byBwcmUtZGVs
YXkgc3RyZWFtIDogbm90ZSBzcGVjaWFsIGhhbmRsaW5nIG9mIHplcm8gZGVsYXkKKyAgICBmbG9h
dCogcHJlRGVsYXllZFNvdXJjZVAgPSBzb3VyY2VQOworICAgIGZsb2F0KiBwcmVEZWxheUJ1ZmZl
clAgPSBtX3ByZURlbGF5QnVmZmVyOworICAgIGZsb2F0KiB0ZW1wUCA9IHByZURlbGF5QnVmZmVy
UDsKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgcHJlRGVsYXllZFNv
dXJjZVAgPSBwcmVEZWxheUJ1ZmZlclAgKyBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgICAgICB0
ZW1wUCA9IG1fdGVtcEJ1ZmZlcjsKKyAgICB9CisKKyAgICBpbnQgd3JpdGVJbmRleCA9IDA7CisK
KyAgICBpZiAobV9mcmFtZXNQcm9jZXNzZWQgPCBtX3ByZURlbGF5TGVuZ3RoKSB7CisgICAgICAg
IC8vIEZvciB0aGUgZmlyc3QgbV9wcmVEZWxheUxlbmd0aCBmcmFtZXMgZG9uJ3QgcHJvY2VzcyB0
aGUgY29udm9sdmVyLCBpbnN0ZWFkIHNpbXBseSBidWZmZXIgaW4gdGhlIHByZS1kZWxheS4KKyAg
ICAgICAgLy8gQnV0IHdoaWxlIGJ1ZmZlcmluZyB0aGUgcHJlLWRlbGF5LCB3ZSBzdGlsbCBuZWVk
IHRvIHVwZGF0ZSBvdXIgaW5kZXguCisgICAgICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLT51cGRh
dGVSZWFkSW5kZXgoJm1fYWNjdW11bGF0aW9uUmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vdywgcnVuIHRoZSBjb252b2x1dGlvbiAoaW50byB0
aGUgZGVsYXkgYnVmZmVyKQorICAgICAgICAvLyBBbiBleHBlbnNpdmUgRkZUIHdpbGwgaGFwcGVu
IGV2ZXJ5IChmZnRTaXplLzIpIGZyYW1lcworICAgICAgICAvLyBXZSBwcm9jZXNzIGluLXBsYWNl
IGhlcmUuLi4KKyAgICAgICAgbV9jb252b2x2ZXItPnByb2Nlc3MoJm1fZmZ0S2VybmVsLCBwcmVE
ZWxheWVkU291cmNlUCwgdGVtcFAsIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAgICAgLy8gTm93
IGFjY3VtdWxhdGUgaW50byByZXZlcmIncyBhY2N1bXVsYXRpb24gYnVmZmVyCisgICAgICAgIC8v
IEZJWE1FOiByZWFsbHkgbmVlZCB0byBoYXZlIGxvY2tpbmcgbWVjaGFuaXNtIGhlcmUhIQorICAg
ICAgICB3cml0ZUluZGV4ID0gbV9hY2N1bXVsYXRpb25CdWZmZXItPmFjY3VtdWxhdGUodGVtcFAs
IGZyYW1lc1RvUHJvY2VzcywgJm1fYWNjdW11bGF0aW9uUmVhZEluZGV4LCBtX3Bvc3REZWxheUxl
bmd0aCk7CisgICAgfQorCisgICAgLy8gRmluYWxseSBjb3B5IGlucHV0IHRvIHByZS1kZWxheQor
ICAgIGlmIChtX3ByZURlbGF5TGVuZ3RoID4gMCkgeworICAgICAgICBtZW1jcHkocHJlRGVsYXll
ZFNvdXJjZVAsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAg
ICAgICBtX3ByZVJlYWRXcml0ZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKworICAgICAgICBp
ZiAobV9wcmVSZWFkV3JpdGVJbmRleCA+PSBtX3ByZURlbGF5TGVuZ3RoKQorICAgICAgICAgICAg
bV9wcmVSZWFkV3JpdGVJbmRleCA9IDA7IC8vIHNob3VsZCBvbmx5IGJlIDw9CisgICAgfQorCisg
ICAgbV9hY2N1bXVsYXRpb25SZWFkVGltZUZyYW1lICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICBt
X2ZyYW1lc1Byb2Nlc3NlZCArPSBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKK3ZvaWQgUmV2ZXJiQ29u
dm9sdmVyU3RhZ2U6OnJlc2V0KCkKK3sKKyAgICBtX2NvbnZvbHZlci0+cmVzZXQoKTsKKyAgICBt
X3ByZURlbGF5QnVmZmVyLnplcm8oKTsKKyAgICBtX2FjY3VtdWxhdGlvblJlYWRJbmRleCA9IDA7
CisgICAgbV9pbnB1dFJlYWRJbmRleCA9IDA7CisgICAgbV9mcmFtZXNQcm9jZXNzZWQgPSAwOwor
ICAgIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9s
dmVyU3RhZ2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2Uu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU1NTdhCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5oCkBA
IC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisg
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKyNkZWZpbmUg
UmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisj
aW5jbHVkZSAiRkZUQ29udm9sdmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1
ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOworY2xhc3MgUmV2ZXJiQ29udm9sdmVyOworICAgIAorLy8g
QSBSZXZlcmJDb252b2x2ZXJTdGFnZSByZXByZXNlbnRzIHRoZSBjb252b2x1dGlvbiBhc3NvY2lh
dGVkIHdpdGggYSBzdWItc2VjdGlvbiBvZiBhIGxhcmdlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBJ
dCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBsaW5lIHRvIGFjY291bnQgZm9yIHRoZSBvZmZzZXQgb2Yg
dGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0aGUgbGFyZ2VyIGltcHVsc2UgcmVzcG9uc2UuCitjbGFz
cyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7CitwdWJsaWM6CisgICAgLy8gcmVuZGVyUGhhc2UgaXMg
dXNlZnVsIHRvIGtub3cgc28gdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgcHJlIHZlcnN1cyBw
b3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdpbGwgcGVyZm9ybQorICAgIC8vIHRoZWlyIGhlYXZ5
IHdvcmsgKEZGVCBwcm9jZXNzaW5nKSBvbiBkaWZmZXJlbnQgc2xpY2VzIHRvIGJhbGFuY2UgdGhl
IGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFkLgorICAgIFJldmVyYkNvbnZvbHZlclN0YWdlKGZs
b2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVy
YlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisg
ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFz
ZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1
bXVsYXRpb25CdWZmZXIpOworCisgICAgLy8gV0FSTklORzogZnJhbWVzVG9Qcm9jZXNzIG11c3Qg
YmUgc3VjaCB0aGF0IGl0IGV2ZW5seSBkaXZpZGVzIHRoZSBkZWxheSBidWZmZXIgc2l6ZSAoc3Rh
Z2Vfb2Zmc2V0KQorICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogc291cmNlUCwgc2l6ZV90IGZyYW1l
c1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHByb2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJiQ29udm9s
dmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCByZXNl
dCgpOworCisgICAgLy8gVXNlZnVsIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcKKyAgICBpbnQg
aW5wdXRSZWFkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lucHV0UmVhZEluZGV4OyB9CisKK3By
aXZhdGU6CisgICAgRkZURnJhbWUgbV9mZnRLZXJuZWw7CisgICAgT3duUHRyPEZGVENvbnZvbHZl
cj4gbV9jb252b2x2ZXI7CisKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9wcmVEZWxheUJ1ZmZlcjsK
KworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogbV9hY2N1bXVsYXRpb25CdWZmZXI7Cisg
ICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZEluZGV4OworICAgIGludCBtX2lucHV0UmVhZEluZGV4
OworCisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZTsgLy8gZm9yIHRlc3Rpbmcg
KGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCisKKyAgICBzaXplX3QgbV9wcmVEZWxheUxl
bmd0aDsKKyAgICBzaXplX3QgbV9wb3N0RGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1fcHJlUmVh
ZFdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG1fZnJhbWVzUHJvY2Vzc2VkOworCisgICAgQXVkaW9G
bG9hdEFycmF5IG1fdGVtcEJ1ZmZlcjsKKworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxl
bmd0aDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJldmVyYkNv
bnZvbHZlclN0YWdlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJi
SW5wdXRCdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZl
ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBhNzdhZAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3Bw
CkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9m
CisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1Mg
T0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgor
ICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJi
SW5wdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZlcmJJbnB1dEJ1ZmZl
cjo6UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0
aCkKKyAgICAsIG1fbGVuZ3RoKGxlbmd0aCkKKyAgICAsIG1fd3JpdGVJbmRleCgwKQoreworfQor
Cit2b2lkIFJldmVyYklucHV0QnVmZmVyOjp3cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG5m
cmFtZXMpCit7CisgICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG1fd3JpdGVJbmRleCwgc291
cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIG5mcmFtZXMpOworCisgICAgbV93cml0ZUluZGV4ICs9IG5m
cmFtZXM7CisgICAgQVNTRVJUKG1fd3JpdGVJbmRleCA8PSBtX2xlbmd0aCk7CisKKyAgICBpZiAo
bV93cml0ZUluZGV4ID49IG1fbGVuZ3RoKQorICAgICAgICBtX3dyaXRlSW5kZXggPSAwOworfQor
CitmbG9hdCogUmV2ZXJiSW5wdXRCdWZmZXI6OmRpcmVjdFJlYWRGcm9tKGludCogaW5kZXgsIHNp
emVfdCBuZnJhbWVzKQoreworICAgIEFTU0VSVCgqaW5kZXggPj0gMCAmJiAqaW5kZXggKyBuZnJh
bWVzIDw9IG1fbGVuZ3RoKTsKKyAgICBmbG9hdCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIGZs
b2F0KiBwID0gc291cmNlUCArICppbmRleDsKKworICAgIC8vIFVwZGF0ZSBpbmRleAorICAgICpp
bmRleCA9ICgqaW5kZXggKyBuZnJhbWVzKSAlIG1fbGVuZ3RoOworCisgICAgcmV0dXJuIHA7Cit9
CisKK3ZvaWQgUmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KCkKK3sKKyAgICBtX2J1ZmZlci56ZXJv
KCk7CisgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODBmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmgKQEAgLTAsMCArMSw2NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgUmV2ZXJiSW5wdXRCdWZmZXJfaAorI2RlZmluZSBSZXZlcmJJbnB1dEJ1ZmZlcl9oCisK
KyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBSZXZlcmJJbnB1dEJ1ZmZlciBpcyB1c2VkIHRvIGJ1ZmZlciBpbnB1dCBzYW1wbGVzIGZvciBk
ZWZlcnJlZCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZ3JvdW5kIHRocmVhZHMKK2NsYXNzIFJldmVy
YklucHV0QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBSZXZlcmJJbnB1dEJ1ZmZlcihzaXplX3QgbGVu
Z3RoKTsKKworICAgIC8vIFRoZSByZWFsdGltZSBhdWRpbyB0aHJlYWQga2VlcHMgd3JpdGluZyBz
YW1wbGVzIGhlcmUuCisgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYnVmZmVyJ3Mg
bGVuZ3RoIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgbmZyYW1lcyAgKGZvciBuZWFybHkgYWxsIGNh
c2VzIHRoaXMgd2lsbCBiZSBmaW5lKQorICAgIC8vIEZJWE1FOiByZW1vdmUgbmZyYW1lcyByZXN0
cmljdGlvbi4uLgorICAgIHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBuZnJhbWVz
KTsKKworICAgIC8vIEJhY2tncm91bmQgdGhyZWFkcyBjYW4gY2FsbCB0aGlzIHRvIGNoZWNrIGlm
IHRoZXJlJ3MgYW55dGhpbmcgdG8gcmVhZC4uLgorICAgIC8vIEZJWE1FOiBjcmVhdGUgYmV0dGVy
IHN5c3RlbSB0byBjaGVjayBmb3IgYnVmZmVyIG92ZXJydW5zIC8gZXJyb3IgY29uZGl0aW9ucy4u
LgorICAgIHNpemVfdCB3cml0ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV93cml0ZUluZGV4OyB9
CisKKyAgICAvLyBUaGUgaW5kaXZpZHVhbCBiYWNrZ3JvdW5kIHRocmVhZHMgcmVhZCBoZXJlIChh
bmQgaG9wZSB0aGF0IHRoZXkgY2FuIGtlZXAgdXAgd2l0aCB0aGUgYnVmZmVyIHdyaXRpbmcpCisg
ICAgLy8gaW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IGluZGV4IHRvIHJlYWQgZnJvbS4u
LgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBl
dmVubHkgZGl2aXNpYmxlIGJ5IG5mcmFtZXMKKyAgICAvLyBGSVhNRTogcmVtb3ZlIG5mcmFtZXMg
cmVzdHJpY3Rpb24uLi4KKyAgICBmbG9hdCogZGlyZWN0UmVhZEZyb20oaW50KiBpbmRleCwgc2l6
ZV90IG5mcmFtZXMpOworCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRlOgorICAgIEF1ZGlv
RmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV9sZW5ndGg7CisgICAgc2l6ZV90IG1f
d3JpdGVJbmRleDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJl
dmVyYklucHV0QnVmZmVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51354</attachid>
            <date>2010-03-22 14:32:14 -0700</date>
            <delta_ts>2010-03-22 14:52:33 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100322143213.patch</filename>
            <type>text/plain</type>
            <size>40798</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uZWRhZjdiNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0yMiAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dy
b3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVm
ZmVyOjp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0wNSAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIgcjU1NTkz
LiAoVG8gZml4IFF0IC0tbWluaW1hbCBidWlsZC4pCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uOWI3YjFlMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcApAQCAtMCwwICsxLDEwOCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIu
aCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3Qg
bGVuZ3RoKQorICAgIDogbV9idWZmZXIobGVuZ3RoKQorICAgICwgbV9yZWFkSW5kZXgoMCkKKyAg
ICAsIG1fcmVhZFRpbWVGcmFtZSgwKQoreworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlcjo6cmVhZEFuZENsZWFyKGZsb2F0KiBkZXN0aW5hdGlvbiwgc2l6ZV90IG51bWJlck9mRnJh
bWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAg
Ym9vbCBpc0NvcHlTYWZlID0gbV9yZWFkSW5kZXggPD0gYnVmZmVyTGVuZ3RoICYmIG51bWJlck9m
RnJhbWVzIDw9IGJ1ZmZlckxlbmd0aDsKKyAgICAKKyAgICBBU1NFUlQoaXNDb3B5U2FmZSk7Cisg
ICAgaWYgKCFpc0NvcHlTYWZlKQorICAgICAgICByZXR1cm47CisKKyAgICBzaXplX3QgZnJhbWVz
QXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gbV9yZWFkSW5kZXg7CisgICAgc2l6ZV90IG51bWJl
ck9mRnJhbWVzMSA9IHN0ZDo6bWluKG51bWJlck9mRnJhbWVzLCBmcmFtZXNBdmFpbGFibGUpOwor
ICAgIHNpemVfdCBudW1iZXJPZkZyYW1lczIgPSBudW1iZXJPZkZyYW1lcyAtIG51bWJlck9mRnJh
bWVzMTsKKworICAgIGZsb2F0KiBzb3VyY2UgPSBtX2J1ZmZlcjsKKyAgICBtZW1jcHkoZGVzdGlu
YXRpb24sIHNvdXJjZSArIG1fcmVhZEluZGV4LCBzaXplb2YoZmxvYXQpICogbnVtYmVyT2ZGcmFt
ZXMxKTsKKyAgICBtZW1zZXQoc291cmNlICsgbV9yZWFkSW5kZXgsIDAsIHNpemVvZihmbG9hdCkg
KiBudW1iZXJPZkZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vz
c2FyeQorICAgIGlmIChudW1iZXJPZkZyYW1lczIgPiAwKSB7CisgICAgICAgIG1lbWNweShkZXN0
aW5hdGlvbiArIG51bWJlck9mRnJhbWVzMSwgc291cmNlLCBzaXplb2YoZmxvYXQpICogbnVtYmVy
T2ZGcmFtZXMyKTsKKyAgICAgICAgbWVtc2V0KHNvdXJjZSwgMCwgc2l6ZW9mKGZsb2F0KSAqIG51
bWJlck9mRnJhbWVzMik7CisgICAgfQorCisgICAgbV9yZWFkSW5kZXggPSAobV9yZWFkSW5kZXgg
KyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5ndGg7CisgICAgbV9yZWFkVGltZUZyYW1lICs9
IG51bWJlck9mRnJhbWVzOworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6dXBk
YXRlUmVhZEluZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbmZyYW1lcykgY29uc3QKK3sKKyAg
ICAvLyBVcGRhdGUgY2FsbGVyJ3MgcmVhZEluZGV4CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZElu
ZGV4ICsgbmZyYW1lcykgJSBtX2J1ZmZlci5zaXplKCk7Cit9CisKK2ludCBSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OmFjY3VtdWxhdGUoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IG5mcmFtZXMsIGlu
dCogcmVhZEluZGV4LCBzaXplX3QgZGVsYXlGcmFtZXMpCit7CisgICAgc2l6ZV90IGJ1ZmZlckxl
bmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICAKKyAgICBzaXplX3Qgd3JpdGVJbmRleCA9ICgq
cmVhZEluZGV4ICsgZGVsYXlGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworCisgICAgLy8gVXBkYXRl
IGNhbGxlcidzIHJlYWRJbmRleAorICAgICpyZWFkSW5kZXggPSAoKnJlYWRJbmRleCArIG5mcmFt
ZXMpICUgYnVmZmVyTGVuZ3RoOworCisgICAgQVNTRVJUKHdyaXRlSW5kZXggPD0gYnVmZmVyTGVu
Z3RoKTsKKyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gd3JpdGVJ
bmRleDsKKyAgICBzaXplX3QgbmZyYW1lczEgPSAobmZyYW1lcyA8PSBmcmFtZXNBdmFpbGFibGUp
ID8gbmZyYW1lcyA6IGZyYW1lc0F2YWlsYWJsZTsKKyAgICBzaXplX3QgbmZyYW1lczIgPSBuZnJh
bWVzIC0gbmZyYW1lczE7CisKKyAgICBmbG9hdCogZGVzdGluYXRpb24gPSBtX2J1ZmZlcjsKKwor
ICAgIHZhZGQoc291cmNlLCAxLCBkZXN0aW5hdGlvbiArIHdyaXRlSW5kZXgsIDEsIGRlc3RpbmF0
aW9uICsgd3JpdGVJbmRleCwgMSwgbmZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJv
dW5kIGlmIG5lY2Vzc2FyeQorICAgIGlmIChuZnJhbWVzMiA+IDApCisgICAgICAgIHZhZGQoc291
cmNlICsgbmZyYW1lczEsIDEsIGRlc3RpbmF0aW9uLCAxLCBkZXN0aW5hdGlvbiwgMSwgbmZyYW1l
czIpOworCisgICAgcmV0dXJuIHdyaXRlSW5kZXg7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11bGF0
aW9uQnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fcmVhZElu
ZGV4ID0gMDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxh
dGlvbkJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGEwNzczCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVp
dGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBu
YW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJBY2N1bXVsYXRpb25CdWZm
ZXJfaAorI2RlZmluZSBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaAorCisjaW5jbHVkZSAiQXVk
aW9GbG9hdEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyIGlzIGEgY2lyY3VsYXIgZGVsYXkgYnVmZmVyIHdpdGggb25lIGNsaWVudCBy
ZWFkaW5nIGZyb20gaXQgYW5kIG11bHRpcGxlIGNsaWVudHMKKy8vIHdyaXRpbmcvYWNjdW11bGF0
aW5nIHRvIGl0IGF0IGRpZmZlcmVudCBkZWxheSBvZmZzZXRzIGZyb20gdGhlIHJlYWQgcG9zaXRp
b24uICBUaGUgcmVhZCBvcGVyYXRpb24gd2lsbCB6ZXJvIHRoZSBtZW1vcnkKKy8vIGp1c3QgcmVh
ZCBmcm9tIHRoZSBidWZmZXIsIHNvIGl0IHdpbGwgYmUgcmVhZHkgZm9yIGFjY3VtdWxhdGlvbiB0
aGUgbmV4dCB0aW1lIGFyb3VuZC4KK2NsYXNzIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciB7Citw
dWJsaWM6CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKHNpemVfdCBsZW5ndGgpOworCisg
ICAgLy8gVGhpcyB3aWxsIHJlYWQgZnJvbSwgdGhlbiBjbGVhci1vdXQgbnVtYmVyT2ZGcmFtZXMK
KyAgICB2b2lkIHJlYWRBbmRDbGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBudW1iZXJP
ZkZyYW1lcyk7CisKKyAgICAvLyBFYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11
bGF0ZSBpdHMgb3V0cHV0IGF0IHRoZSBhcHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBv
c2l0aW9uLgorICAgIC8vIFdlIG5lZWQgdG8gcGFzcyBpbiBhbmQgdXBkYXRlIHJlYWRJbmRleCBo
ZXJlLCBzaW5jZSBlYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIG1heSBiZSBydW5uaW5nIGluCisg
ICAgLy8gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlIHJlYWx0aW1lIHRocmVhZCBjYWxsaW5n
IFJlYWRBbmRDbGVhcigpIGFuZCBtYWludGFpbmluZyBtX3JlYWRJbmRleAorICAgIC8vIFJldHVy
bnMgdGhlIHdyaXRlSW5kZXggd2hlcmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAg
aW50IGFjY3VtdWxhdGUoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBpbnQq
IHJlYWRJbmRleCwgc2l6ZV90IGRlbGF5RnJhbWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgo
KSBjb25zdCB7IHJldHVybiBtX3JlYWRJbmRleDsgfQorICAgIHZvaWQgdXBkYXRlUmVhZEluZGV4
KGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpIGNvbnN0OworCisgICAgc2l6
ZV90IHJlYWRUaW1lRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX3JlYWRUaW1lRnJhbWU7IH0KKwor
ICAgIHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9idWZm
ZXI7CisgICAgc2l6ZV90IG1fcmVhZEluZGV4OworICAgIHNpemVfdCBtX3JlYWRUaW1lRnJhbWU7
IC8vIGZvciBkZWJ1Z2dpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCit9OworCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJBY2N1bXVsYXRpb25CdWZm
ZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDI0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAKQEAgLTAsMCArMSwyMTkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisK
KyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitjb25zdCBpbnQgSW5wdXRCdWZmZXJTaXplID0gOCAqIDE2Mzg0Owor
CisvLyBXZSBvbmx5IHByb2Nlc3MgdGhlIGxlYWRpbmcgcG9ydGlvbiBvZiB0aGUgaW1wdWxzZSBy
ZXNwb25zZSBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFdlIGRvbid0IGV4Y2VlZCB0aGlzIGxl
bmd0aC4KKy8vIEl0IHR1cm5zIG91dCB0aGVuLCB0aGF0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBo
YXMgYWJvdXQgMjc4bXNlYyBvZiBzY2hlZHVsaW5nIHNsb3AuCisvLyBFbXBpcmljYWxseSwgdGhp
cyBoYXMgYmVlbiBmb3VuZCB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGdpdmluZyBl
bm91Z2ggdGltZSBmb3Igc2NoZWR1bGluZyBzbG9wLAorLy8gd2hpbGUgc3RpbGwgbWluaW1pemlu
ZyB0aGUgYW1vdW50IG9mIHByb2Nlc3NpbmcgZG9uZSBpbiB0aGUgcHJpbWFyeSAoaGlnaC1wcmlv
cml0eSkgdGhyZWFkLgorLy8gVGhpcyB3YXMgZm91bmQgdG8gYmUgYSBnb29kIHZhbHVlIG9uIE1h
YyBPUyBYLCBhbmQgbWF5IHdvcmsgd2VsbCBvbiBvdGhlciBwbGF0Zm9ybXMgYXMgd2VsbCwgYXNz
dW1pbmcKKy8vIHRoZSB2ZXJ5IHJvdWdoIHNjaGVkdWxpbmcgbGF0ZW5jaWVzIGFyZSBzaW1pbGFy
IG9uIHRoZXNlIHRpbWUtc2NhbGVzLiAgT2YgY291cnNlLCB0aGlzIGNvZGUgbWF5IG5lZWQgdG8g
YmUKKy8vIHR1bmVkIGZvciBpbmRpdmlkdWFsIHBsYXRmb3JtcyBpZiB0aGlzIGFzc3VtcHRpb24g
aXMgZm91bmQgdG8gYmUgaW5jb3JyZWN0LgorY29uc3Qgc2l6ZV90IFJlYWx0aW1lRnJhbWVMaW1p
dCA9IDgxOTIgICsgNDA5NjsgLy8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBN
aW5GRlRTaXplID0gMjU2OworY29uc3Qgc2l6ZV90IE1heFJlYWx0aW1lRkZUU2l6ZSA9IDIwNDg7
CisKK3N0YXRpYyB2b2lkKiBCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2godm9pZCogdGhyZWFkRGF0
YSkKK3sKKyAgICBSZXZlcmJDb252b2x2ZXIqIHJldmVyYkNvbnZvbHZlciA9IHN0YXRpY19jYXN0
PFJldmVyYkNvbnZvbHZlcio+KHRocmVhZERhdGEpOworICAgIHJldmVyYkNvbnZvbHZlci0+YmFj
a2dyb3VuZFRocmVhZEVudHJ5KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1JldmVyYkNvbnZvbHZl
cjo6UmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3Qg
cmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRl
clBoYXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgIDogbV9pbXB1bHNlUmVzcG9u
c2VMZW5ndGgoaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKSkKKyAgICAsIG1fYWNjdW11bGF0
aW9uQnVmZmVyKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkgKyByZW5kZXJTbGljZVNpemUp
CisgICAgLCBtX2lucHV0QnVmZmVyKElucHV0QnVmZmVyU2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xp
Y2VTaXplKHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1fbWluRkZUU2l6ZShNaW5GRlRTaXplKSAv
LyBGaXJzdCBzdGFnZSB3aWxsIGhhdmUgdGhpcyBzaXplIC0gc3VjY2Vzc2l2ZSBzdGFnZXMgd2ls
bCBkb3VibGUgaW4gc2l6ZSBlYWNoIHRpbWUKKyAgICAsIG1fbWF4RkZUU2l6ZShtYXhGRlRTaXpl
KSAvLyB1bnRpbCB3ZSBoaXQgbV9tYXhGRlRTaXplCisgICAgLCBtX3VzZUJhY2tncm91bmRUaHJl
YWRzKHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKKyAg
ICAsIG1fbW9yZUlucHV0QnVmZmVyZWQoZmFsc2UpCit7CisgICAgLy8gSWYgd2UgYXJlIHVzaW5n
IGJhY2tncm91bmQgdGhyZWFkcyB0aGVuIGRvbid0IGV4Y2VlZCB0aGlzIEZGVCBzaXplIGZvciB0
aGUKKyAgICAvLyBzdGFnZXMgd2hpY2ggcnVuIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkLiAgVGhp
cyBhdm9pZHMgaGF2aW5nIG9ubHkgb25lIG9yIHR3bworICAgIC8vIGxhcmdlIHN0YWdlcyAoc2l6
ZSAxNjM4NCBvciBzbykgYXQgdGhlIGVuZCB3aGljaCB0YWtlIGEgbG90IG9mIHRpbWUgZXZlcnkg
c2V2ZXJhbAorICAgIC8vIHByb2Nlc3Npbmcgc2xpY2VzLiAgVGhpcyB3YXkgd2UgYW1vcnRpemUg
dGhlIGNvc3Qgb3ZlciBtb3JlIHByb2Nlc3Npbmcgc2xpY2VzLgorICAgIG1fbWF4UmVhbHRpbWVG
RlRTaXplID0gTWF4UmVhbHRpbWVGRlRTaXplOworCisgICAgLy8gRm9yIHRoZSBtb21lbnQsIGEg
Z29vZCB3YXkgdG8ga25vdyBpZiB3ZSBoYXZlIHJlYWwtdGltZSBjb25zdHJhaW50IGlzIHRvIGNo
ZWNrIGlmIHdlJ3JlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcy4KKyAgICAvLyBPdGhlcndpc2Us
IGFzc3VtZSB3ZSdyZSBiZWluZyBydW4gZnJvbSBhIGNvbW1hbmQtbGluZSB0b29sLgorICAgIGJv
b2wgaGFzUmVhbHRpbWVDb25zdHJhaW50ID0gdXNlQmFja2dyb3VuZFRocmVhZHM7CisKKyAgICBm
bG9hdCogcmVzcG9uc2UgPSBpbXB1bHNlUmVzcG9uc2UtPmRhdGEoKTsKKyAgICBzaXplX3QgdG90
YWxSZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCk7CisgICAgUmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bUJ1ZmZlclAgPSAmbV9hY2N1bXVsYXRpb25CdWZm
ZXI7CisKKyAgICAvLyBCZWNhdXNlIHdlJ3JlIG5vdCB1c2luZyBkaXJlY3QtY29udm9sdXRpb24g
aW4gdGhlIGxlYWRpbmcgcG9ydGlvbiwgdGhlIHJldmVyYiBoYXMgYW4gb3ZlcmFsbCBsYXRlbmN5
IG9mIGhhbGYgdGhlIGZpcnN0LXN0YWdlIEZGVCBzaXplCisgICAgc2l6ZV90IHJldmVyYlRvdGFs
TGF0ZW5jeSA9IG1fbWluRkZUU2l6ZSAvIDI7CisKKyAgICBzaXplX3Qgc3RhZ2VPZmZzZXQgPSAw
OworICAgIGludCBpID0gMDsKKyAgICBzaXplX3QgZmZ0U2l6ZSA9IG1fbWluRkZUU2l6ZTsKKyAg
ICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3BvbnNlTGVuZ3RoKSB7CisgICAgICAgIHNp
emVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKworICAgICAgICAvLyBGb3IgdGhlIGxhc3Qg
c3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCBzdGFnZU9mZnNldCBpcyBzdWNoIHRoYXQgd2UncmUg
c3RyYWRkbGluZyB0aGUgZW5kCisgICAgICAgIC8vIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIGJ1
ZmZlciAoaWYgd2UgdXNlIHN0YWdlU2l6ZSksIHNvIHJlZHVjZSB0aGUgbGFzdCBzdGFnZSdzIGxl
bmd0aC4uLgorICAgICAgICBpZiAoc3RhZ2VTaXplICsgc3RhZ2VPZmZzZXQgPiB0b3RhbFJlc3Bv
bnNlTGVuZ3RoKQorICAgICAgICAgICAgc3RhZ2VTaXplID0gdG90YWxSZXNwb25zZUxlbmd0aCAt
IHN0YWdlT2Zmc2V0OworCisgICAgICAgIC8vIFRoaXMgInN0YWdnZXJzIiB0aGUgdGltZSB3aGVu
IGVhY2ggRkZUIGhhcHBlbnMgc28gdGhleSBkb24ndCBhbGwgaGFwcGVuIGF0IHRoZSBzYW1lIHRp
bWUKKyAgICAgICAgaW50IHJlbmRlclBoYXNlID0gY29udm9sdmVyUmVuZGVyUGhhc2UgKyBpICog
cmVuZGVyU2xpY2VTaXplOworCisgICAgICAgIFBhc3NPd25QdHI8UmV2ZXJiQ29udm9sdmVyU3Rh
Z2U+IHN0YWdlKG5ldyBSZXZlcmJDb252b2x2ZXJTdGFnZShyZXNwb25zZSwgdG90YWxSZXNwb25z
ZUxlbmd0aCwgcmV2ZXJiVG90YWxMYXRlbmN5LCBzdGFnZU9mZnNldCwgc3RhZ2VTaXplLCBmZnRT
aXplLCByZW5kZXJQaGFzZSwgcmVuZGVyU2xpY2VTaXplLCBhY2N1bUJ1ZmZlclApKTsKKworICAg
ICAgICBib29sIGlzQmFja2dyb3VuZFN0YWdlID0gZmFsc2U7CisKKyAgICAgICAgaWYgKHN0YWdl
T2Zmc2V0IDw9IFJlYWx0aW1lRnJhbWVMaW1pdCkKKyAgICAgICAgICAgIG1fc3RhZ2VzLmFwcGVu
ZChzdGFnZSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHRoaXMtPnVzZUJhY2tn
cm91bmRUaHJlYWRzKCkpIHsKKyAgICAgICAgICAgICAgICBtX2JhY2tncm91bmRTdGFnZXMuYXBw
ZW5kKHN0YWdlKTsKKyAgICAgICAgICAgICAgICBpc0JhY2tncm91bmRTdGFnZSA9IHRydWU7Cisg
ICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBtX3N0YWdlcy5hcHBlbmQoc3RhZ2Up
OworICAgICAgICB9CisKKyAgICAgICAgc3RhZ2VPZmZzZXQgKz0gc3RhZ2VTaXplOworICAgICAg
ICArK2k7CisKKyAgICAgICAgLy8gRmlndXJlIG91dCBuZXh0IEZGVCBzaXplCisgICAgICAgIGZm
dFNpemUgKj0gMjsKKyAgICAgICAgaWYgKGhhc1JlYWx0aW1lQ29uc3RyYWludCAmJiAhaXNCYWNr
Z3JvdW5kU3RhZ2UgJiYgZmZ0U2l6ZSA+IG1fbWF4UmVhbHRpbWVGRlRTaXplKQorICAgICAgICAg
ICAgZmZ0U2l6ZSA9IG1fbWF4UmVhbHRpbWVGRlRTaXplOworICAgICAgICBpZiAoZmZ0U2l6ZSA+
IG1fbWF4RkZUU2l6ZSkKKyAgICAgICAgICAgIGZmdFNpemUgPSBtX21heEZGVFNpemU7CisgICAg
fQorCisgICAgLy8gU3RhcnQgdXAgYmFja2dyb3VuZCB0aHJlYWQKKyAgICAvLyBGSVhNRTogd291
bGQgYmUgYmV0dGVyIHRvIHVwIHRoZSB0aHJlYWQgcHJpb3JpdHkgaGVyZS4gIEl0IGRvZXNuJ3Qg
bmVlZCB0byBiZSByZWFsLXRpbWUsIGJ1dCBoaWdoZXIgdGhhbiB0aGUgZGVmYXVsdC4uLgorICAg
IGlmICh0aGlzLT51c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFN0YWdlcy5z
aXplKCkgPiAwKQorICAgICAgICBtX2JhY2tncm91bmRUaHJlYWQgPSBjcmVhdGVUaHJlYWQoQmFj
a2dyb3VuZFRocmVhZERpc3BhdGNoLCB0aGlzLCAiY29udm9sdXRpb24gYmFja2dyb3VuZCB0aHJl
YWQiKTsKKyAgICBlbHNlCisgICAgICAgIG1fYmFja2dyb3VuZFRocmVhZCA9IDA7Cit9CisKK1Jl
dmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZvbHZlcigpCit7CisgICAgLy8gV2FpdCBmb3IgYmFj
a2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAgIGlmICh1c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYm
IG1fYmFja2dyb3VuZFRocmVhZCkgeworICAgICAgICBtX3dhbnRzVG9FeGl0ID0gdHJ1ZTsKKwor
ICAgICAgICAvLyBXYWtlIHVwIHRocmVhZCBzbyBpdCBjYW4gcmV0dXJuIC0gZG9uJ3QgdXNlIE11
dGV4TG9ja2VyIHNpbmNlIGxvY2sgbXVzdCBiZSB1bmxvY2tlZCBiZWZvcmUgd2UgY2FsbCB3YWl0
Rm9yVGhyZWFkQ29tcGxldGlvbigpLgorICAgICAgICBtX2JhY2tncm91bmRUaHJlYWRMb2NrLmxv
Y2soKTsKKyAgICAgICAgbV9tb3JlSW5wdXRCdWZmZXJlZCA9IHRydWU7CisgICAgICAgIG1fYmFj
a2dyb3VuZFRocmVhZENvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhy
ZWFkTG9jay51bmxvY2soKTsKKworICAgICAgICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbihtX2Jh
Y2tncm91bmRUaHJlYWQsIDApOworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OmJh
Y2tncm91bmRUaHJlYWRFbnRyeSgpCit7CisgICAgd2hpbGUgKCFtX3dhbnRzVG9FeGl0KSB7Cisg
ICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFueSBtb3JlIGlucHV0IHRvIGNvbnN1
bWUKKyAgICAgICAgaW50IHdyaXRlSW5kZXggPSBtX2lucHV0QnVmZmVyLndyaXRlSW5kZXgoKTsK
KworICAgICAgICAvLyBFdmVuIHRob3VnaCBpdCBkb2Vzbid0IHNlZW0gbGlrZSBldmVyeSBzdGFn
ZSBuZWVkcyB0byBtYWludGFpbiBpdHMgb3duIHZlcnNpb24gb2YgcmVhZEluZGV4IAorICAgICAg
ICAvLyB3ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0aGFuIG9uZSBi
YWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsKKworICAgICAgICB3aGls
ZSAoKHJlYWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5wdXRSZWFkSW5kZXgoKSkg
IT0gd3JpdGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRldGVjdCBidWZmZXIgb3Zl
cnJ1bi4uLgorICAgICAgICAgICAgLy8gRklYTUU6IHJlbW92ZSBoYXJkLWNvZGVkIHZhbHVlCisg
ICAgICAgICAgICBjb25zdCBpbnQga1NsaWNlU2l6ZSA9IDEyODsKKworICAgICAgICAgICAgLy8g
QWNjdW11bGF0ZSBjb250cmlidXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgICAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAg
ICAgICAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzW2ldLT5wcm9jZXNzSW5CYWNrZ3JvdW5kKHRo
aXMsIGtTbGljZVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBmb3IgcmVhbHRp
bWUgdGhyZWFkIHRvIGdpdmUgdXMgbW9yZSBpbnB1dAorICAgICAgICBtX21vcmVJbnB1dEJ1ZmZl
cmVkID0gZmFsc2U7ICAgICAgICAKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fYmFja2dy
b3VuZFRocmVhZExvY2spOworICAgICAgICB3aGlsZSAoIW1fbW9yZUlucHV0QnVmZmVyZWQpCisg
ICAgICAgICAgICBtX2JhY2tncm91bmRUaHJlYWRDb25kaXRpb24ud2FpdChtX2JhY2tncm91bmRU
aHJlYWRMb2NrKTsKKyAgICB9Cit9CisKK3NpemVfdCBSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VS
ZXNwb25zZUxlbmd0aCgpCit7CisgICAgcmV0dXJuIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoOwor
fQorCit2b2lkIFJldmVyYkNvbnZvbHZlcjo6cHJvY2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQq
IGRlc3RQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIC8vIEZlZWQgaW5wdXQgYnVm
ZmVyIChyZWFkIGJ5IGFsbCB0aHJlYWRzKQorICAgIG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNl
UCwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBm
cm9tIGVhY2ggc3RhZ2UKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUo
KTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cHJvY2Vzcyhzb3VyY2VQLCBmcmFtZXNUb1By
b2Nlc3MpOworCisgICAgLy8gRmluYWxseSByZWFkIGZyb20gYWNjdW11bGF0aW9uIGJ1ZmZlcgor
ICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLnJlYWRBbmRDbGVhcihkZXN0UCwgZnJhbWVzVG9Qcm9j
ZXNzKTsKKyAgICAgICAgCisgICAgLy8gTm93IHRoYXQgd2UndmUgYnVmZmVyZWQgbW9yZSBpbnB1
dCwgd2FrZSB1cCBvdXIgYmFja2dyb3VuZCB0aHJlYWQuCisgICAgCisgICAgLy8gTm90IHVzaW5n
IGEgTXV0ZXhMb2NrZXIgbG9va3Mgc3RyYW5nZSwgYnV0IHdlIHVzZSBhIHRyeUxvY2soKSBpbnN0
ZWFkIGJlY2F1c2UgdGhpcyBpcyBydW4gb24gdGhlIHJlYWwtdGltZQorICAgIC8vIHRocmVhZCB3
aGVyZSBpdCBpcyBhIGRpc2FzdGVyIGZvciB0aGUgbG9jayB0byBiZSBjb250ZW5kZWQgKGNhdXNl
cyBhdWRpbyBnbGl0Y2hpbmcpLiAgSXQncyBPSyBpZiB3ZSBmYWlsIHRvCisgICAgLy8gc2lnbmFs
IGZyb20gdGltZSB0byB0aW1lLCBzaW5jZSB3ZSdsbCBnZXQgdG8gaXQgdGhlIG5leHQgdGltZSB3
ZSdyZSBjYWxsZWQuICBXZSdyZSBjYWxsZWQgcmVwZWF0ZWRseQorICAgIC8vIGFuZCBmcmVxdWVu
dGx5IChhcm91bmQgZXZlcnkgM21zKS4gIFRoZSBiYWNrZ3JvdW5kIHRocmVhZCBpcyBwcm9jZXNz
aW5nIHdlbGwgaW50byB0aGUgZnV0dXJlIGFuZCBoYXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9m
IAorICAgIC8vIGxlZXdheSBoZXJlLi4uCisgICAgaWYgKG1fYmFja2dyb3VuZFRocmVhZExvY2su
dHJ5TG9jaygpKSB7CisgICAgICAgIG1fbW9yZUlucHV0QnVmZmVyZWQgPSB0cnVlOworICAgICAg
ICBtX2JhY2tncm91bmRUaHJlYWRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIG1fYmFja2dy
b3VuZFRocmVhZExvY2sudW5sb2NrKCk7CisgICAgfQorfQorCit2b2lkIFJldmVyYkNvbnZvbHZl
cjo6cmVzZXQoKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdGFnZXMuc2l6ZSgp
OyArK2kpCisgICAgICAgIG1fc3RhZ2VzW2ldLT5yZXNldCgpOworCisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBtX2JhY2tncm91bmRTdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fYmFj
a2dyb3VuZFN0YWdlc1tpXS0+cmVzZXQoKTsKKworICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLnJl
c2V0KCk7CisgICAgbV9pbnB1dEJ1ZmZlci5yZXNldCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZl
ci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTAyNjVmCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaApAQCAtMCwwICsxLDEwMCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyX2gKKwor
I2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgIkZGVENvbnZvbHZlci5oIgor
I2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNv
bnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKyNpbmNsdWRl
IDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3
dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xhc3MgUmV2ZXJiQ29udm9sdmVyIHsK
K3B1YmxpYzoKKyAgICAvLyBtYXhGRlRTaXplIGNhbiBiZSBhZGp1c3RlZCAoZnJvbSBzYXkgMjA0
OCB0byAzMjc2OCkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHByZWNpc2lvbiBpcyBuZWNlc3Nhcnku
CisgICAgLy8gRm9yIGNlcnRhaW4gdHdlYWt5IGRlLWNvbnZvbHZpbmcgYXBwbGljYXRpb25zIHRo
ZSBwaGFzZSBlcnJvcnMgYWRkIHVwIHF1aWNrbHkgYW5kIGxlYWQgdG8gbm9uLXNlbnNpY2FsIHJl
c3VsdHMgd2l0aAorICAgIC8vIGxhcmdlciBGRlQgc2l6ZXMgYW5kIHNpbmdsZS1wcmVjaXNpb24g
ZmxvYXRzLiAgSW4gdGhlc2UgY2FzZXMgMjA0OCBpcyBhIGdvb2Qgc2l6ZS4KKyAgICAvLyBJZiBu
b3QgZG9pbmcgbXVsdGktdGhyZWFkZWQgY29udm9sdXRpb24sIHRoZW4gc2hvdWxkIG5vdCBnbyA+
IDgxOTIuCisgICAgUmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNl
LCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZv
bHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKTsKKworICAgIH5SZXZl
cmJDb252b2x2ZXIoKTsKKworICAgIHZvaWQgcHJvY2VzcyhmbG9hdCogc291cmNlUCwgZmxvYXQq
IGRlc3RQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKwor
ICAgIHNpemVfdCBpbXB1bHNlUmVzcG9uc2VMZW5ndGgoKTsKKworICAgIFJldmVyYklucHV0QnVm
ZmVyKiBpbnB1dEJ1ZmZlcigpIHsgcmV0dXJuICZtX2lucHV0QnVmZmVyOyB9CisKKyAgICBib29s
IHVzZUJhY2tncm91bmRUaHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VCYWNrZ3JvdW5kVGhy
ZWFkczsgfQorCisgICAgdm9pZCBiYWNrZ3JvdW5kVGhyZWFkRW50cnkoKTsKKworcHJpdmF0ZToK
KyAgICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fc3RhZ2VzOworICAg
IFZlY3RvcjxPd25QdHI8UmV2ZXJiQ29udm9sdmVyU3RhZ2U+ID4gbV9iYWNrZ3JvdW5kU3RhZ2Vz
OworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKKworICAgIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIE9uZSBvciBtb3Jl
IGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGZyb20gdGhpcyBpbnB1dCBidWZmZXIgd2hpY2ggaXMg
ZmVkIGZyb20gdGhlIHJlYWx0aW1lIHRocmVhZC4KKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciBtX2lu
cHV0QnVmZmVyOworCisgICAgLy8gV2UncmUgZ2l2ZW4gYSByZW5kZXJpbmcgaGludCwgc28gdGhl
IEZGVHMgY2FuIGJlIG9wdGltaXplZCB0byBub3QgYWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUK
KyAgICAvLyAodmVyeSBiYWQgd2hlbiByZW5kZXJpbmcgb24gYSByZWFsLXRpbWUgdGhyZWFkKS4K
KyAgICBzaXplX3QgbV9yZW5kZXJTbGljZVNpemU7CisKKyAgICAvLyBGaXJzdCBzdGFnZSB3aWxs
IGJlIG9mIHNpemUgbV9taW5GRlRTaXplLiAgRWFjaCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2Ug
YXMgYmlnIHVudGlsIHdlIGhpdCBtX21heEZGVFNpemUuCisgICAgc2l6ZV90IG1fbWluRkZUU2l6
ZTsKKyAgICBzaXplX3QgbV9tYXhGRlRTaXplOworCisgICAgLy8gQnV0IGRvbid0IGV4Y2VlZCB0
aGlzIHNpemUgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQgKGlmIHdlJ3JlIGRvaW5nIGJhY2tncm91
bmQgcHJvY2Vzc2luZykuCisgICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRTaXplOworCisgICAg
Ly8gQmFja2dyb3VuZCB0aHJlYWQgYW5kIHN5bmNocm9uaXphdGlvbgorICAgIGJvb2wgbV91c2VC
YWNrZ3JvdW5kVGhyZWFkczsKKyAgICBUaHJlYWRJZGVudGlmaWVyIG1fYmFja2dyb3VuZFRocmVh
ZDsKKyAgICBib29sIG1fd2FudHNUb0V4aXQ7CisgICAgYm9vbCBtX21vcmVJbnB1dEJ1ZmZlcmVk
OworICAgIG11dGFibGUgTXV0ZXggbV9iYWNrZ3JvdW5kVGhyZWFkTG9jazsKKyAgICBtdXRhYmxl
IFRocmVhZENvbmRpdGlvbiBtX2JhY2tncm91bmRUaHJlYWRDb25kaXRpb247Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJDb252b2x2ZXJfaApkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAgYi9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWEzN2IyCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAKQEAgLTAsMCArMSwx
NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyU3Rh
Z2UuaCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJS
ZXZlcmJJbnB1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JldmVyYkNvbnZv
bHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZShmbG9hdCogaW1wdWxzZVJlc3BvbnNlLCBz
aXplX3QgcmVzcG9uc2VMZW5ndGgsIHNpemVfdCByZXZlcmJUb3RhbExhdGVuY3ksIHNpemVfdCBz
dGFnZU9mZnNldCwgc2l6ZV90IHN0YWdlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNpemVfdCBmZnRTaXplLCBzaXplX3QgcmVuZGVyUGhhc2UsIHNp
emVfdCByZW5kZXJTbGljZVNpemUsIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogYWNjdW11bGF0
aW9uQnVmZmVyKQorICAgIDogbV9mZnRLZXJuZWwoZmZ0U2l6ZSkKKyAgICAsIG1fYWNjdW11bGF0
aW9uQnVmZmVyKGFjY3VtdWxhdGlvbkJ1ZmZlcikKKyAgICAsIG1fYWNjdW11bGF0aW9uUmVhZElu
ZGV4KDApCisgICAgLCBtX2lucHV0UmVhZEluZGV4KDApCisgICAgLCBtX2FjY3VtdWxhdGlvblJl
YWRUaW1lRnJhbWUoMCkKKyAgICAsIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoKHJlc3BvbnNlTGVu
Z3RoKQoreworICAgIG1fZmZ0S2VybmVsLmRvUGFkZGVkRkZUKGltcHVsc2VSZXNwb25zZSArIHN0
YWdlT2Zmc2V0LCBzdGFnZUxlbmd0aCk7CisKKyAgICBtX2NvbnZvbHZlciA9IG5ldyBGRlRDb252
b2x2ZXIoZmZ0U2l6ZSk7CisKKyAgICBtX3RlbXBCdWZmZXIuYWxsb2NhdGUocmVuZGVyU2xpY2VT
aXplKTsKKworICAgIC8vIFRoZSBjb252b2x1dGlvbiBzdGFnZSBhdCBvZmZzZXQgc3RhZ2VPZmZz
ZXQgbmVlZHMgdG8gaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVsYXkgdG8gY2FuY2VsIG91dCB0aGUg
b2Zmc2V0CisgICAgc2l6ZV90IHRvdGFsRGVsYXkgPSBzdGFnZU9mZnNldCArIHJldmVyYlRvdGFs
TGF0ZW5jeTsKKworICAgIC8vIEJ1dCwgdGhlIEZGVCBjb252b2x1dGlvbiBpdHNlbGYgaW5jdXJz
IGZmdFNpemUgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMgb3V0Li4uCisgICAgc2l6ZV90
IGhhbGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgaWYgKHRvdGFsRGVsYXkgPj0gaGFsZlNpemUp
CisgICAgICAgIHRvdGFsRGVsYXkgLT0gaGFsZlNpemU7CisKKyAgICAvLyBGSVhNRTogREVBTCB3
aXRoIGNhc2Ugd2hlbiB0b3RhbCBkZWxheSBpcyBsZXNzIHRoYW4gZmZ0U2l6ZS8yLi4uLgorCisg
ICAgLy8gV2UgZGl2aWRlIHVwIHRoZSB0b3RhbCBkZWxheSwgaW50byBwcmUgYW5kIHBvc3QgZGVs
YXkgc2VjdGlvbnMgc28gdGhhdCB3ZSBjYW4KKyAgICAvLyBzY2hlZHVsZSBhdCBleGFjdGx5IHRo
ZSBtb21lbnQgd2hlbiB0aGUgRkZUIHdpbGwgaGFwcGVuLiAgVGhpcyBpcyBjb29yZGluYXRlZAor
ICAgIC8vIHdpdGggdGhlIG90aGVyIHN0YWdlcywgc28gdGhleSBkb24ndCBhbGwgZG8gdGhlaXIg
RkZUcyBhdCB0aGUgc2FtZSB0aW1lLi4uCisKKyAgICBpbnQgbSA9IChoYWxmU2l6ZSA8PSB0b3Rh
bERlbGF5KSA/IGhhbGZTaXplIDogdG90YWxEZWxheTsKKyAgICBtX3ByZURlbGF5TGVuZ3RoID0g
KHRvdGFsRGVsYXkgPiAwKSA/IChyZW5kZXJQaGFzZSAlIG0pIDogMDsKKworICAgIGlmIChtX3By
ZURlbGF5TGVuZ3RoID4gdG90YWxEZWxheSkKKyAgICAgICAgbV9wcmVEZWxheUxlbmd0aCA9IDA7
CisKKyAgICBtX3Bvc3REZWxheUxlbmd0aCA9IHRvdGFsRGVsYXkgLSBtX3ByZURlbGF5TGVuZ3Ro
OworICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOworICAgIG1fZnJhbWVzUHJvY2Vzc2VkID0g
MDsgLy8gdG90YWwgZnJhbWVzIHByb2Nlc3NlZCBzbyBmYXIKKworICAgIG1fcHJlRGVsYXlCdWZm
ZXIuYWxsb2NhdGUobV9wcmVEZWxheUxlbmd0aCA8IGZmdFNpemUgPyBmZnRTaXplIDogbV9wcmVE
ZWxheUxlbmd0aCk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3NJbkJh
Y2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFtZXNUb1Byb2Nl
c3MpCit7CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIqIGlucHV0QnVmZmVyID0gY29udm9sdmVyLT5p
bnB1dEJ1ZmZlcigpOworICAgIGZsb2F0KiBzb3VyY2VQID0gaW5wdXRCdWZmZXItPmRpcmVjdFJl
YWRGcm9tKCZtX2lucHV0UmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIHByb2Nlc3Mo
c291cmNlUCwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCAgUmV2ZXJiQ29udm9sdmVyU3Rh
Z2U6OnByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7Cisg
ICAgLy8KKyAgICAvLyBGSVhNRTogZG8gc2FuaXR5IGNoZWNrIG9uIGZyYW1lc1RvUHJvY2VzcyB2
ZXJzdXMgZGVsYXkgYnVmZmVyIHNpemUKKyAgICAvLworCisgICAgLy8gR2V0IHBvaW50ZXIgdG8g
cHJlLWRlbGF5IHN0cmVhbSA6IG5vdGUgc3BlY2lhbCBoYW5kbGluZyBvZiB6ZXJvIGRlbGF5Cisg
ICAgZmxvYXQqIHByZURlbGF5ZWRTb3VyY2VQID0gc291cmNlUDsKKyAgICBmbG9hdCogcHJlRGVs
YXlCdWZmZXJQID0gbV9wcmVEZWxheUJ1ZmZlcjsKKyAgICBmbG9hdCogdGVtcFAgPSBwcmVEZWxh
eUJ1ZmZlclA7CisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAgICAgIHByZURl
bGF5ZWRTb3VyY2VQID0gcHJlRGVsYXlCdWZmZXJQICsgbV9wcmVSZWFkV3JpdGVJbmRleDsKKyAg
ICAgICAgdGVtcFAgPSBtX3RlbXBCdWZmZXI7CisgICAgfQorCisgICAgaW50IHdyaXRlSW5kZXgg
PSAwOworCisgICAgaWYgKG1fZnJhbWVzUHJvY2Vzc2VkIDwgbV9wcmVEZWxheUxlbmd0aCkgewor
ICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IG1fcHJlRGVsYXlMZW5ndGggZnJhbWVzIGRvbid0IHBy
b2Nlc3MgdGhlIGNvbnZvbHZlciwgaW5zdGVhZCBzaW1wbHkgYnVmZmVyIGluIHRoZSBwcmUtZGVs
YXkuCisgICAgICAgIC8vIEJ1dCB3aGlsZSBidWZmZXJpbmcgdGhlIHByZS1kZWxheSwgd2Ugc3Rp
bGwgbmVlZCB0byB1cGRhdGUgb3VyIGluZGV4LgorICAgICAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZl
ci0+dXBkYXRlUmVhZEluZGV4KCZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgZnJhbWVzVG9Qcm9j
ZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3csIHJ1biB0aGUgY29udm9sdXRpb24g
KGludG8gdGhlIGRlbGF5IGJ1ZmZlcikKKyAgICAgICAgLy8gQW4gZXhwZW5zaXZlIEZGVCB3aWxs
IGhhcHBlbiBldmVyeSAoZmZ0U2l6ZS8yKSBmcmFtZXMKKyAgICAgICAgLy8gV2UgcHJvY2VzcyBp
bi1wbGFjZSBoZXJlLi4uCisgICAgICAgIG1fY29udm9sdmVyLT5wcm9jZXNzKCZtX2ZmdEtlcm5l
bCwgcHJlRGVsYXllZFNvdXJjZVAsIHRlbXBQLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgICAg
IC8vIE5vdyBhY2N1bXVsYXRlIGludG8gcmV2ZXJiJ3MgYWNjdW11bGF0aW9uIGJ1ZmZlcgorICAg
ICAgICAvLyBGSVhNRTogcmVhbGx5IG5lZWQgdG8gaGF2ZSBsb2NraW5nIG1lY2hhbmlzbSBoZXJl
ISEKKyAgICAgICAgd3JpdGVJbmRleCA9IG1fYWNjdW11bGF0aW9uQnVmZmVyLT5hY2N1bXVsYXRl
KHRlbXBQLCBmcmFtZXNUb1Byb2Nlc3MsICZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgbV9wb3N0
RGVsYXlMZW5ndGgpOworICAgIH0KKworICAgIC8vIEZpbmFsbHkgY29weSBpbnB1dCB0byBwcmUt
ZGVsYXkKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHBy
ZURlbGF5ZWRTb3VyY2VQLCBzb3VyY2VQLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9jZXNz
KTsKKyAgICAgICAgbV9wcmVSZWFkV3JpdGVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisKKyAg
ICAgICAgaWYgKG1fcHJlUmVhZFdyaXRlSW5kZXggPj0gbV9wcmVEZWxheUxlbmd0aCkKKyAgICAg
ICAgICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOyAvLyBzaG91bGQgb25seSBiZSA8PQorICAg
IH0KKworICAgIG1fYWNjdW11bGF0aW9uUmVhZFRpbWVGcmFtZSArPSBmcmFtZXNUb1Byb2Nlc3M7
CisgICAgbV9mcmFtZXNQcm9jZXNzZWQgKz0gZnJhbWVzVG9Qcm9jZXNzOworfQorCit2b2lkIFJl
dmVyYkNvbnZvbHZlclN0YWdlOjpyZXNldCgpCit7CisgICAgbV9jb252b2x2ZXItPnJlc2V0KCk7
CisgICAgbV9wcmVEZWxheUJ1ZmZlci56ZXJvKCk7CisgICAgbV9hY2N1bXVsYXRpb25SZWFkSW5k
ZXggPSAwOworICAgIG1faW5wdXRSZWFkSW5kZXggPSAwOworICAgIG1fZnJhbWVzUHJvY2Vzc2Vk
ID0gMDsKKyAgICBtX2FjY3VtdWxhdGlvblJlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVy
YkNvbnZvbHZlclN0YWdlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZl
clN0YWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjMDZkMAotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3Rh
Z2UuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCisj
ZGVmaW5lIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJh
eS5oIgorI2luY2x1ZGUgIkZGVEZyYW1lLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2lu
Y2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3Mg
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOworY2xhc3MgUmV2ZXJiQ29udm9sdmVyOworY2xhc3Mg
RkZUQ29udm9sdmVyOworICAgIAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFnZSByZXByZXNlbnRz
IHRoZSBjb252b2x1dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlvbiBvZiBhIGxhcmdl
IGltcHVsc2UgcmVzcG9uc2UuCisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBsaW5lIHRvIGFj
Y291bnQgZm9yIHRoZSBvZmZzZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0aGUgbGFyZ2Vy
IGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7CitwdWJsaWM6
CisgICAgLy8gcmVuZGVyUGhhc2UgaXMgdXNlZnVsIHRvIGtub3cgc28gdGhhdCB3ZSBjYW4gbWFu
aXB1bGF0ZSB0aGUgcHJlIHZlcnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdpbGwgcGVy
Zm9ybQorICAgIC8vIHRoZWlyIGhlYXZ5IHdvcmsgKEZGVCBwcm9jZXNzaW5nKSBvbiBkaWZmZXJl
bnQgc2xpY2VzIHRvIGJhbGFuY2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFkLgorICAg
IFJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNw
b25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zmc2V0
LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZm
dFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJi
QWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZmZXIpOworCisgICAgLy8gV0FSTklO
RzogZnJhbWVzVG9Qcm9jZXNzIG11c3QgYmUgc3VjaCB0aGF0IGl0IGV2ZW5seSBkaXZpZGVzIHRo
ZSBkZWxheSBidWZmZXIgc2l6ZSAoc3RhZ2Vfb2Zmc2V0KQorICAgIHZvaWQgcHJvY2VzcyhmbG9h
dCogc291cmNlUCwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHByb2Nlc3NJ
bkJhY2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFtZXNUb1By
b2Nlc3MpOworCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gVXNlZnVsIGZvciBiYWNrZ3Jv
dW5kIHByb2Nlc3NpbmcKKyAgICBpbnQgaW5wdXRSZWFkSW5kZXgoKSBjb25zdCB7IHJldHVybiBt
X2lucHV0UmVhZEluZGV4OyB9CisKK3ByaXZhdGU6CisgICAgRkZURnJhbWUgbV9mZnRLZXJuZWw7
CisgICAgT3duUHRyPEZGVENvbnZvbHZlcj4gbV9jb252b2x2ZXI7CisKKyAgICBBdWRpb0Zsb2F0
QXJyYXkgbV9wcmVEZWxheUJ1ZmZlcjsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciog
bV9hY2N1bXVsYXRpb25CdWZmZXI7CisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZEluZGV4Owor
ICAgIGludCBtX2lucHV0UmVhZEluZGV4OworCisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZFRp
bWVGcmFtZTsgLy8gZm9yIHRlc3RpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCisK
KyAgICBzaXplX3QgbV9wcmVEZWxheUxlbmd0aDsKKyAgICBzaXplX3QgbV9wb3N0RGVsYXlMZW5n
dGg7CisgICAgc2l6ZV90IG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG1fZnJhbWVz
UHJvY2Vzc2VkOworCisgICAgQXVkaW9GbG9hdEFycmF5IG1fdGVtcEJ1ZmZlcjsKKworICAgIHNp
emVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMmY5NmUyOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitSZXZlcmJJbnB1dEJ1ZmZlcjo6UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0
aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fd3JpdGVJbmRleCgwKQoreworfQor
Cit2b2lkIFJldmVyYklucHV0QnVmZmVyOjp3cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG51
bWJlck9mRnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXpl
KCk7CisgICAgYm9vbCBpc0NvcHlHb29kID0gbV93cml0ZUluZGV4ICsgbnVtYmVyT2ZGcmFtZXMg
PD0gYnVmZmVyTGVuZ3RoOworICAgIEFTU0VSVChpc0NvcHlHb29kKTsKKyAgICBpZiAoIWlzQ29w
eUdvb2QpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgbWVtY3B5KG1fYnVmZmVyLmRh
dGEoKSArIG1fd3JpdGVJbmRleCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIG51bWJlck9mRnJh
bWVzKTsKKworICAgIG1fd3JpdGVJbmRleCArPSBudW1iZXJPZkZyYW1lczsKKyAgICBBU1NFUlQo
bV93cml0ZUluZGV4IDw9IGJ1ZmZlckxlbmd0aCk7CisKKyAgICBpZiAobV93cml0ZUluZGV4ID49
IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworZmxvYXQqIFJl
dmVyYklucHV0QnVmZmVyOjpkaXJlY3RSZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbnVtYmVy
T2ZGcmFtZXMpCit7CisgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsK
KyAgICBib29sIGlzUHRyR29vZCA9ICppbmRleCA+PSAwICYmICppbmRleCArIG51bWJlck9mRnJh
bWVzIDw9IGJ1ZmZlckxlbmd0aDsKKyAgICBBU1NFUlQoaXNQdHJHb29kKTsKKyAgICBmbG9hdCog
c291cmNlUCA9IG1fYnVmZmVyOworICAgIGZsb2F0KiBwID0gaXNQdHJHb29kID8gc291cmNlUCAr
ICppbmRleCA6IDA7IC8vIHBvaW50ZXIgc2hvdWxkIGFsd2F5cyBiZSBnb29kIC0gZm9yY2UgcmVh
ZCBmcm9tIDAgdG8gZXhwb3NlIGJ1ZyBvdGhlcndpc2UKKworICAgIC8vIFVwZGF0ZSBpbmRleAor
ICAgICppbmRleCA9ICgqaW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5ndGg7CisK
KyAgICByZXR1cm4gcDsKK30KKwordm9pZCBSZXZlcmJJbnB1dEJ1ZmZlcjo6cmVzZXQoKQorewor
ICAgIG1fYnVmZmVyLnplcm8oKTsKKyAgICBtX3dyaXRlSW5kZXggPSAwOworfQorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVy
YklucHV0QnVmZmVyLmggYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVy
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUxZjM1OAotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaApAQCAt
MCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJJbnB1dEJ1ZmZlcl9oCisjZGVmaW5lIFJldmVy
YklucHV0QnVmZmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKKy8vIFJldmVyYklucHV0QnVmZmVyIGlzIHVzZWQgdG8gYnVmZmVyIGlu
cHV0IHNhbXBsZXMgZm9yIGRlZmVycmVkIHByb2Nlc3NpbmcgYnkgdGhlIGJhY2tncm91bmQgdGhy
ZWFkcy4KK2NsYXNzIFJldmVyYklucHV0QnVmZmVyIHsKK3B1YmxpYzoKKyAgICBSZXZlcmJJbnB1
dEJ1ZmZlcihzaXplX3QgbGVuZ3RoKTsKKworICAgIC8vIFRoZSByZWFsdGltZSBhdWRpbyB0aHJl
YWQga2VlcHMgd3JpdGluZyBzYW1wbGVzIGhlcmUuCisgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMg
dGhhdCB0aGUgYnVmZmVyJ3MgbGVuZ3RoIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgbmZyYW1lcyAo
Zm9yIG5lYXJseSBhbGwgY2FzZXMgdGhpcyB3aWxsIGJlIGZpbmUpLgorICAgIC8vIEZJWE1FOiBy
ZW1vdmUgbmZyYW1lcyByZXN0cmljdGlvbi4uLgorICAgIHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJj
ZVAsIHNpemVfdCBuZnJhbWVzKTsKKworICAgIC8vIEJhY2tncm91bmQgdGhyZWFkcyBjYW4gY2Fs
bCB0aGlzIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYW55dGhpbmcgdG8gcmVhZC4uLgorICAgIHNpemVf
dCB3cml0ZUluZGV4KCkgY29uc3QgeyByZXR1cm4gbV93cml0ZUluZGV4OyB9CisKKyAgICAvLyBU
aGUgaW5kaXZpZHVhbCBiYWNrZ3JvdW5kIHRocmVhZHMgcmVhZCBoZXJlIChhbmQgaG9wZSB0aGF0
IHRoZXkgY2FuIGtlZXAgdXAgd2l0aCB0aGUgYnVmZmVyIHdyaXRpbmcpLgorICAgIC8vIGluZGV4
IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV4dCBpbmRleCB0byByZWFkIGZyb20uLi4KKyAgICAvLyBU
aGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBidWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlz
aWJsZSBieSBuZnJhbWVzLgorICAgIC8vIEZJWE1FOiByZW1vdmUgbmZyYW1lcyByZXN0cmljdGlv
bi4uLgorICAgIGZsb2F0KiBkaXJlY3RSZWFkRnJvbShpbnQqIGluZGV4LCBzaXplX3QgbmZyYW1l
cyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5
IG1fYnVmZmVyOworICAgIHNpemVfdCBtX3dyaXRlSW5kZXg7Cit9OworCit9IC8vIG5hbWVzcGFj
ZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJJbnB1dEJ1ZmZlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51358</attachid>
            <date>2010-03-22 14:52:37 -0700</date>
            <delta_ts>2010-03-23 15:20:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100322145236.patch</filename>
            <type>text/plain</type>
            <size>40799</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uYThmZWQ1NSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0yMiAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SXMKKworICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyOjpyZWFkQW5kQ2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyOjp1cGRhdGVSZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVsYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlv
L1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZEluZGV4KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZFRpbWVGcmFtZSk6CisgICAgICAgICogcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpC
YWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2gpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpSZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
Ojp+UmV2ZXJiQ29udm9sdmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6
YmFja2dyb3VuZFRocmVhZEVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZl
cjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZv
bHZlcjo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OnJlc2V0
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OmlucHV0QnVmZmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6dXNlQmFja2dyb3VuZFRocmVhZHMpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2Up
OgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3NJbkJhY2tn
cm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnByb2Nlc3Mp
OgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OnJlc2V0KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5oOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjppbnB1dFJlYWRJbmRleCk6CisgICAg
ICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjpSZXZlcmJJbnB1dEJ1ZmZlcik6CisgICAg
ICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGUpOgorICAgICAgICAoV2ViQ29y
ZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OmRpcmVjdFJlYWRGcm9tKToKKyAgICAgICAgKFdlYkNvcmU6
OlJldmVyYklucHV0QnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2
ZXJiSW5wdXRCdWZmZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1dEJ1
ZmZlcjo6d3JpdGVJbmRleCk6CisKIDIwMTAtMDMtMDUgIENzYWJhIE9zenRyb2dvbsOhYyAgPG9z
c3lAd2Via2l0Lm9yZz4KIAogICAgICAgICBVbnJldmlld2VkIGJ1aWxkZml4IGFmdGVyIHI1NTU5
My4gKFRvIGZpeCBRdCAtLW1pbmltYWwgYnVpbGQuKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLjliN2IxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKQEAgLTAsMCArMSwxMDggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVy
LmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIoc2l6ZV90
IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fcmVhZEluZGV4KDApCisg
ICAgLCBtX3JlYWRUaW1lRnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXI6OnJlYWRBbmRDbGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBudW1iZXJPZkZy
YW1lcykKK3sKKyAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIuc2l6ZSgpOworICAg
IGJvb2wgaXNDb3B5U2FmZSA9IG1fcmVhZEluZGV4IDw9IGJ1ZmZlckxlbmd0aCAmJiBudW1iZXJP
ZkZyYW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAgCisgICAgQVNTRVJUKGlzQ29weVNhZmUpOwor
ICAgIGlmICghaXNDb3B5U2FmZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2l6ZV90IGZyYW1l
c0F2YWlsYWJsZSA9IGJ1ZmZlckxlbmd0aCAtIG1fcmVhZEluZGV4OworICAgIHNpemVfdCBudW1i
ZXJPZkZyYW1lczEgPSBzdGQ6Om1pbihudW1iZXJPZkZyYW1lcywgZnJhbWVzQXZhaWxhYmxlKTsK
KyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMyID0gbnVtYmVyT2ZGcmFtZXMgLSBudW1iZXJPZkZy
YW1lczE7CisKKyAgICBmbG9hdCogc291cmNlID0gbV9idWZmZXI7CisgICAgbWVtY3B5KGRlc3Rp
bmF0aW9uLCBzb3VyY2UgKyBtX3JlYWRJbmRleCwgc2l6ZW9mKGZsb2F0KSAqIG51bWJlck9mRnJh
bWVzMSk7CisgICAgbWVtc2V0KHNvdXJjZSArIG1fcmVhZEluZGV4LCAwLCBzaXplb2YoZmxvYXQp
ICogbnVtYmVyT2ZGcmFtZXMxKTsKKworICAgIC8vIEhhbmRsZSB3cmFwLWFyb3VuZCBpZiBuZWNl
c3NhcnkKKyAgICBpZiAobnVtYmVyT2ZGcmFtZXMyID4gMCkgeworICAgICAgICBtZW1jcHkoZGVz
dGluYXRpb24gKyBudW1iZXJPZkZyYW1lczEsIHNvdXJjZSwgc2l6ZW9mKGZsb2F0KSAqIG51bWJl
ck9mRnJhbWVzMik7CisgICAgICAgIG1lbXNldChzb3VyY2UsIDAsIHNpemVvZihmbG9hdCkgKiBu
dW1iZXJPZkZyYW1lczIpOworICAgIH0KKworICAgIG1fcmVhZEluZGV4ID0gKG1fcmVhZEluZGV4
ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworICAgIG1fcmVhZFRpbWVGcmFtZSAr
PSBudW1iZXJPZkZyYW1lczsKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OnVw
ZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG5mcmFtZXMpIGNvbnN0Cit7Cisg
ICAgLy8gVXBkYXRlIGNhbGxlcidzIHJlYWRJbmRleAorICAgICpyZWFkSW5kZXggPSAoKnJlYWRJ
bmRleCArIG5mcmFtZXMpICUgbV9idWZmZXIuc2l6ZSgpOworfQorCitpbnQgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyOjphY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBuZnJhbWVzLCBp
bnQqIHJlYWRJbmRleCwgc2l6ZV90IGRlbGF5RnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJM
ZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgCisgICAgc2l6ZV90IHdyaXRlSW5kZXggPSAo
KnJlYWRJbmRleCArIGRlbGF5RnJhbWVzKSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIC8vIFVwZGF0
ZSBjYWxsZXIncyByZWFkSW5kZXgKKyAgICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBuZnJh
bWVzKSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIEFTU0VSVCh3cml0ZUluZGV4IDw9IGJ1ZmZlckxl
bmd0aCk7CisgICAgc2l6ZV90IGZyYW1lc0F2YWlsYWJsZSA9IGJ1ZmZlckxlbmd0aCAtIHdyaXRl
SW5kZXg7CisgICAgc2l6ZV90IG5mcmFtZXMxID0gKG5mcmFtZXMgPD0gZnJhbWVzQXZhaWxhYmxl
KSA/IG5mcmFtZXMgOiBmcmFtZXNBdmFpbGFibGU7CisgICAgc2l6ZV90IG5mcmFtZXMyID0gbmZy
YW1lcyAtIG5mcmFtZXMxOworCisgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gbV9idWZmZXI7CisK
KyAgICB2YWRkKHNvdXJjZSwgMSwgZGVzdGluYXRpb24gKyB3cml0ZUluZGV4LCAxLCBkZXN0aW5h
dGlvbiArIHdyaXRlSW5kZXgsIDEsIG5mcmFtZXMxKTsKKworICAgIC8vIEhhbmRsZSB3cmFwLWFy
b3VuZCBpZiBuZWNlc3NhcnkKKyAgICBpZiAobmZyYW1lczIgPiAwKQorICAgICAgICB2YWRkKHNv
dXJjZSArIG5mcmFtZXMxLCAxLCBkZXN0aW5hdGlvbiwgMSwgZGVzdGluYXRpb24sIDEsIG5mcmFt
ZXMyKTsKKworICAgIHJldHVybiB3cml0ZUluZGV4OworfQorCit2b2lkIFJldmVyYkFjY3VtdWxh
dGlvbkJ1ZmZlcjo6cmVzZXQoKQoreworICAgIG1fYnVmZmVyLnplcm8oKTsKKyAgICBtX3JlYWRJ
bmRleCA9IDA7CisgICAgbV9yZWFkVGltZUZyYW1lID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhMDc3MwotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUg
bmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQWNjdW11bGF0aW9uQnVm
ZmVyX2gKKyNkZWZpbmUgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKKworI2luY2x1ZGUgIkF1
ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciBpcyBhIGNpcmN1bGFyIGRlbGF5IGJ1ZmZlciB3aXRoIG9uZSBjbGllbnQg
cmVhZGluZyBmcm9tIGl0IGFuZCBtdWx0aXBsZSBjbGllbnRzCisvLyB3cml0aW5nL2FjY3VtdWxh
dGluZyB0byBpdCBhdCBkaWZmZXJlbnQgZGVsYXkgb2Zmc2V0cyBmcm9tIHRoZSByZWFkIHBvc2l0
aW9uLiAgVGhlIHJlYWQgb3BlcmF0aW9uIHdpbGwgemVybyB0aGUgbWVtb3J5CisvLyBqdXN0IHJl
YWQgZnJvbSB0aGUgYnVmZmVyLCBzbyBpdCB3aWxsIGJlIHJlYWR5IGZvciBhY2N1bXVsYXRpb24g
dGhlIG5leHQgdGltZSBhcm91bmQuCitjbGFzcyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIgewor
cHVibGljOgorICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3QgbGVuZ3RoKTsKKwor
ICAgIC8vIFRoaXMgd2lsbCByZWFkIGZyb20sIHRoZW4gY2xlYXItb3V0IG51bWJlck9mRnJhbWVz
CisgICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgbnVtYmVy
T2ZGcmFtZXMpOworCisgICAgLy8gRWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSB3aWxsIGFjY3Vt
dWxhdGUgaXRzIG91dHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgZGVsYXkgZnJvbSB0aGUgcmVhZCBw
b3NpdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW4gYW5kIHVwZGF0ZSByZWFkSW5kZXgg
aGVyZSwgc2luY2UgZWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSBtYXkgYmUgcnVubmluZyBpbgor
ICAgIC8vIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSByZWFsdGltZSB0aHJlYWQgY2FsbGlu
ZyBSZWFkQW5kQ2xlYXIoKSBhbmQgbWFpbnRhaW5pbmcgbV9yZWFkSW5kZXgKKyAgICAvLyBSZXR1
cm5zIHRoZSB3cml0ZUluZGV4IHdoZXJlIHRoZSBhY2N1bXVsYXRpb24gdG9vayBwbGFjZQorICAg
IGludCBhY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgaW50
KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcyk7CisKKyAgICBzaXplX3QgcmVhZEluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkSW5kZXg7IH0KKyAgICB2b2lkIHVwZGF0ZVJlYWRJbmRl
eChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKSBjb25zdDsKKworICAgIHNp
emVfdCByZWFkVGltZUZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkVGltZUZyYW1lOyB9CisK
KyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5IG1fYnVm
ZmVyOworICAgIHNpemVfdCBtX3JlYWRJbmRleDsKKyAgICBzaXplX3QgbV9yZWFkVGltZUZyYW1l
OyAvLyBmb3IgZGVidWdnaW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5lKQorfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiQWNjdW11bGF0aW9uQnVm
ZmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVy
LmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjAyNGRlCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCkBAIC0wLDAgKzEsMjE5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBs
ZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK
KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlci5oIgor
CisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIkF1ZGlvQnVzLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IElucHV0QnVmZmVyU2l6ZSA9IDggKiAxNjM4NDsK
KworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGltcHVsc2Ug
cmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQuICBXZSBkb24ndCBleGNlZWQgdGhpcyBs
ZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwgdGhhdCB0aGUgYmFja2dyb3VuZCB0aHJlYWQg
aGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGluZyBzbG9wLgorLy8gRW1waXJpY2FsbHksIHRo
aXMgaGFzIGJlZW4gZm91bmQgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBnaXZpbmcg
ZW5vdWdoIHRpbWUgZm9yIHNjaGVkdWxpbmcgc2xvcCwKKy8vIHdoaWxlIHN0aWxsIG1pbmltaXpp
bmcgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIGRvbmUgaW4gdGhlIHByaW1hcnkgKGhpZ2gtcHJp
b3JpdHkpIHRocmVhZC4KKy8vIFRoaXMgd2FzIGZvdW5kIHRvIGJlIGEgZ29vZCB2YWx1ZSBvbiBN
YWMgT1MgWCwgYW5kIG1heSB3b3JrIHdlbGwgb24gb3RoZXIgcGxhdGZvcm1zIGFzIHdlbGwsIGFz
c3VtaW5nCisvLyB0aGUgdmVyeSByb3VnaCBzY2hlZHVsaW5nIGxhdGVuY2llcyBhcmUgc2ltaWxh
ciBvbiB0aGVzZSB0aW1lLXNjYWxlcy4gIE9mIGNvdXJzZSwgdGhpcyBjb2RlIG1heSBuZWVkIHRv
IGJlCisvLyB0dW5lZCBmb3IgaW5kaXZpZHVhbCBwbGF0Zm9ybXMgaWYgdGhpcyBhc3N1bXB0aW9u
IGlzIGZvdW5kIHRvIGJlIGluY29ycmVjdC4KK2NvbnN0IHNpemVfdCBSZWFsdGltZUZyYW1lTGlt
aXQgPSA4MTkyICArIDQwOTY7IC8vIH4yNzhtc2VjIEAgNDQuMUtIegorCitjb25zdCBzaXplX3Qg
TWluRkZUU2l6ZSA9IDI1NjsKK2NvbnN0IHNpemVfdCBNYXhSZWFsdGltZUZGVFNpemUgPSAyMDQ4
OworCitzdGF0aWMgdm9pZCogQmFja2dyb3VuZFRocmVhZERpc3BhdGNoKHZvaWQqIHRocmVhZERh
dGEpCit7CisgICAgUmV2ZXJiQ29udm9sdmVyKiByZXZlcmJDb252b2x2ZXIgPSBzdGF0aWNfY2Fz
dDxSZXZlcmJDb252b2x2ZXIqPih0aHJlYWREYXRhKTsKKyAgICByZXZlcmJDb252b2x2ZXItPmJh
Y2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAwOworfQorCitSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90
IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252b2x2ZXJSZW5k
ZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICA6IG1faW1wdWxzZVJlc3Bv
bnNlTGVuZ3RoKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkpCisgICAgLCBtX2FjY3VtdWxh
dGlvbkJ1ZmZlcihpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpICsgcmVuZGVyU2xpY2VTaXpl
KQorICAgICwgbV9pbnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNpemUpCisgICAgLCBtX3JlbmRlclNs
aWNlU2l6ZShyZW5kZXJTbGljZVNpemUpCisgICAgLCBtX21pbkZGVFNpemUoTWluRkZUU2l6ZSkg
Ly8gRmlyc3Qgc3RhZ2Ugd2lsbCBoYXZlIHRoaXMgc2l6ZSAtIHN1Y2Nlc3NpdmUgc3RhZ2VzIHdp
bGwgZG91YmxlIGluIHNpemUgZWFjaCB0aW1lCisgICAgLCBtX21heEZGVFNpemUobWF4RkZUU2l6
ZSkgLy8gdW50aWwgd2UgaGl0IG1fbWF4RkZUU2l6ZQorICAgICwgbV91c2VCYWNrZ3JvdW5kVGhy
ZWFkcyh1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICAsIG1fd2FudHNUb0V4aXQoZmFsc2UpCisg
ICAgLCBtX21vcmVJbnB1dEJ1ZmZlcmVkKGZhbHNlKQoreworICAgIC8vIElmIHdlIGFyZSB1c2lu
ZyBiYWNrZ3JvdW5kIHRocmVhZHMgdGhlbiBkb24ndCBleGNlZWQgdGhpcyBGRlQgc2l6ZSBmb3Ig
dGhlCisgICAgLy8gc3RhZ2VzIHdoaWNoIHJ1biBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFRo
aXMgYXZvaWRzIGhhdmluZyBvbmx5IG9uZSBvciB0d28KKyAgICAvLyBsYXJnZSBzdGFnZXMgKHNp
emUgMTYzODQgb3Igc28pIGF0IHRoZSBlbmQgd2hpY2ggdGFrZSBhIGxvdCBvZiB0aW1lIGV2ZXJ5
IHNldmVyYWwKKyAgICAvLyBwcm9jZXNzaW5nIHNsaWNlcy4gIFRoaXMgd2F5IHdlIGFtb3J0aXpl
IHRoZSBjb3N0IG92ZXIgbW9yZSBwcm9jZXNzaW5nIHNsaWNlcy4KKyAgICBtX21heFJlYWx0aW1l
RkZUU2l6ZSA9IE1heFJlYWx0aW1lRkZUU2l6ZTsKKworICAgIC8vIEZvciB0aGUgbW9tZW50LCBh
IGdvb2Qgd2F5IHRvIGtub3cgaWYgd2UgaGF2ZSByZWFsLXRpbWUgY29uc3RyYWludCBpcyB0byBj
aGVjayBpZiB3ZSdyZSB1c2luZyBiYWNrZ3JvdW5kIHRocmVhZHMuCisgICAgLy8gT3RoZXJ3aXNl
LCBhc3N1bWUgd2UncmUgYmVpbmcgcnVuIGZyb20gYSBjb21tYW5kLWxpbmUgdG9vbC4KKyAgICBi
b29sIGhhc1JlYWx0aW1lQ29uc3RyYWludCA9IHVzZUJhY2tncm91bmRUaHJlYWRzOworCisgICAg
ZmxvYXQqIHJlc3BvbnNlID0gaW1wdWxzZVJlc3BvbnNlLT5kYXRhKCk7CisgICAgc2l6ZV90IHRv
dGFsUmVzcG9uc2VMZW5ndGggPSBpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpOworICAgIFJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogYWNjdW1CdWZmZXJQID0gJm1fYWNjdW11bGF0aW9uQnVm
ZmVyOworCisgICAgLy8gQmVjYXVzZSB3ZSdyZSBub3QgdXNpbmcgZGlyZWN0LWNvbnZvbHV0aW9u
IGluIHRoZSBsZWFkaW5nIHBvcnRpb24sIHRoZSByZXZlcmIgaGFzIGFuIG92ZXJhbGwgbGF0ZW5j
eSBvZiBoYWxmIHRoZSBmaXJzdC1zdGFnZSBGRlQgc2l6ZQorICAgIHNpemVfdCByZXZlcmJUb3Rh
bExhdGVuY3kgPSBtX21pbkZGVFNpemUgLyAyOworCisgICAgc2l6ZV90IHN0YWdlT2Zmc2V0ID0g
MDsKKyAgICBpbnQgaSA9IDA7CisgICAgc2l6ZV90IGZmdFNpemUgPSBtX21pbkZGVFNpemU7Cisg
ICAgd2hpbGUgKHN0YWdlT2Zmc2V0IDwgdG90YWxSZXNwb25zZUxlbmd0aCkgeworICAgICAgICBz
aXplX3Qgc3RhZ2VTaXplID0gZmZ0U2l6ZSAvIDI7CisKKyAgICAgICAgLy8gRm9yIHRoZSBsYXN0
IHN0YWdlLCBpdCdzIHBvc3NpYmxlIHRoYXQgc3RhZ2VPZmZzZXQgaXMgc3VjaCB0aGF0IHdlJ3Jl
IHN0cmFkZGxpbmcgdGhlIGVuZAorICAgICAgICAvLyBvZiB0aGUgaW1wdWxzZSByZXNwb25zZSBi
dWZmZXIgKGlmIHdlIHVzZSBzdGFnZVNpemUpLCBzbyByZWR1Y2UgdGhlIGxhc3Qgc3RhZ2UncyBs
ZW5ndGguLi4KKyAgICAgICAgaWYgKHN0YWdlU2l6ZSArIHN0YWdlT2Zmc2V0ID4gdG90YWxSZXNw
b25zZUxlbmd0aCkKKyAgICAgICAgICAgIHN0YWdlU2l6ZSA9IHRvdGFsUmVzcG9uc2VMZW5ndGgg
LSBzdGFnZU9mZnNldDsKKworICAgICAgICAvLyBUaGlzICJzdGFnZ2VycyIgdGhlIHRpbWUgd2hl
biBlYWNoIEZGVCBoYXBwZW5zIHNvIHRoZXkgZG9uJ3QgYWxsIGhhcHBlbiBhdCB0aGUgc2FtZSB0
aW1lCisgICAgICAgIGludCByZW5kZXJQaGFzZSA9IGNvbnZvbHZlclJlbmRlclBoYXNlICsgaSAq
IHJlbmRlclNsaWNlU2l6ZTsKKworICAgICAgICBQYXNzT3duUHRyPFJldmVyYkNvbnZvbHZlclN0
YWdlPiBzdGFnZShuZXcgUmV2ZXJiQ29udm9sdmVyU3RhZ2UocmVzcG9uc2UsIHRvdGFsUmVzcG9u
c2VMZW5ndGgsIHJldmVyYlRvdGFsTGF0ZW5jeSwgc3RhZ2VPZmZzZXQsIHN0YWdlU2l6ZSwgZmZ0
U2l6ZSwgcmVuZGVyUGhhc2UsIHJlbmRlclNsaWNlU2l6ZSwgYWNjdW1CdWZmZXJQKSk7CisKKyAg
ICAgICAgYm9vbCBpc0JhY2tncm91bmRTdGFnZSA9IGZhbHNlOworCisgICAgICAgIGlmIChzdGFn
ZU9mZnNldCA8PSBSZWFsdGltZUZyYW1lTGltaXQpCisgICAgICAgICAgICBtX3N0YWdlcy5hcHBl
bmQoc3RhZ2UpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aGlzLT51c2VCYWNr
Z3JvdW5kVGhyZWFkcygpKSB7CisgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2VzLmFw
cGVuZChzdGFnZSk7CisgICAgICAgICAgICAgICAgaXNCYWNrZ3JvdW5kU3RhZ2UgPSB0cnVlOwor
ICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbV9zdGFnZXMuYXBwZW5kKHN0YWdl
KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6ZTsKKyAgICAg
ICAgKytpOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQorICAgICAgICBm
ZnRTaXplICo9IDI7CisgICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQgJiYgIWlzQmFj
a2dyb3VuZFN0YWdlICYmIGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkKKyAgICAgICAg
ICAgIGZmdFNpemUgPSBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYgKGZmdFNpemUg
PiBtX21heEZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRTaXplOworICAg
IH0KKworICAgIC8vIFN0YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8gRklYTUU6IHdv
dWxkIGJlIGJldHRlciB0byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJdCBkb2Vzbid0
IG5lZWQgdG8gYmUgcmVhbC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1bHQuLi4KKyAg
ICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91bmRTdGFnZXMu
c2l6ZSgpID4gMCkKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gY3JlYXRlVGhyZWFkKEJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCwgdGhpcywgImNvbnZvbHV0aW9uIGJhY2tncm91bmQgdGhy
ZWFkIik7CisgICAgZWxzZQorICAgICAgICBtX2JhY2tncm91bmRUaHJlYWQgPSAwOworfQorCitS
ZXZlcmJDb252b2x2ZXI6On5SZXZlcmJDb252b2x2ZXIoKQoreworICAgIC8vIFdhaXQgZm9yIGJh
Y2tncm91bmQgdGhyZWFkIHRvIHN0b3AKKyAgICBpZiAodXNlQmFja2dyb3VuZFRocmVhZHMoKSAm
JiBtX2JhY2tncm91bmRUaHJlYWQpIHsKKyAgICAgICAgbV93YW50c1RvRXhpdCA9IHRydWU7CisK
KyAgICAgICAgLy8gV2FrZSB1cCB0aHJlYWQgc28gaXQgY2FuIHJldHVybiAtIGRvbid0IHVzZSBN
dXRleExvY2tlciBzaW5jZSBsb2NrIG11c3QgYmUgdW5sb2NrZWQgYmVmb3JlIHdlIGNhbGwgd2Fp
dEZvclRocmVhZENvbXBsZXRpb24oKS4KKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkTG9jay5s
b2NrKCk7CisgICAgICAgIG1fbW9yZUlucHV0QnVmZmVyZWQgPSB0cnVlOworICAgICAgICBtX2Jh
Y2tncm91bmRUaHJlYWRDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIG1fYmFja2dyb3VuZFRo
cmVhZExvY2sudW5sb2NrKCk7CisKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24obV9i
YWNrZ3JvdW5kVGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhpdCkgewor
ICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlcmUncyBhbnkgbW9yZSBpbnB1dCB0byBjb25z
dW1lCisgICAgICAgIGludCB3cml0ZUluZGV4ID0gbV9pbnB1dEJ1ZmZlci53cml0ZUluZGV4KCk7
CisKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggaXQgZG9lc24ndCBzZWVtIGxpa2UgZXZlcnkgc3Rh
Z2UgbmVlZHMgdG8gbWFpbnRhaW4gaXRzIG93biB2ZXJzaW9uIG9mIHJlYWRJbmRleCAKKyAgICAg
ICAgLy8gd2UgZG8gdGhpcyBpbiBjYXNlIHdlIHdhbnQgdG8gcnVuIGluIG1vcmUgdGhhbiBvbmUg
YmFja2dyb3VuZCB0aHJlYWQuCisgICAgICAgIGludCByZWFkSW5kZXg7CisKKyAgICAgICAgd2hp
bGUgKChyZWFkSW5kZXggPSBtX2JhY2tncm91bmRTdGFnZXNbMF0tPmlucHV0UmVhZEluZGV4KCkp
ICE9IHdyaXRlSW5kZXgpIHsgLy8gRklYTUU6IGRvIGJldHRlciB0byBkZXRlY3QgYnVmZmVyIG92
ZXJydW4uLi4KKyAgICAgICAgICAgIC8vIEZJWE1FOiByZW1vdmUgaGFyZC1jb2RlZCB2YWx1ZQor
ICAgICAgICAgICAgY29uc3QgaW50IGtTbGljZVNpemUgPSAxMjg7CisKKyAgICAgICAgICAgIC8v
IEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAgICAgICAgICAgIGZv
ciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAg
ICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdlc1tpXS0+cHJvY2Vzc0luQmFja2dyb3VuZCh0
aGlzLCBrU2xpY2VTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdhaXQgZm9yIHJlYWx0
aW1lIHRocmVhZCB0byBnaXZlIHVzIG1vcmUgaW5wdXQKKyAgICAgICAgbV9tb3JlSW5wdXRCdWZm
ZXJlZCA9IGZhbHNlOyAgICAgICAgCisgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2JhY2tn
cm91bmRUaHJlYWRMb2NrKTsKKyAgICAgICAgd2hpbGUgKCFtX21vcmVJbnB1dEJ1ZmZlcmVkKQor
ICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLndhaXQobV9iYWNrZ3JvdW5k
VGhyZWFkTG9jayk7CisgICAgfQorfQorCitzaXplX3QgUmV2ZXJiQ29udm9sdmVyOjppbXB1bHNl
UmVzcG9uc2VMZW5ndGgoKQoreworICAgIHJldHVybiBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsK
K30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OnByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsIGZsb2F0
KiBkZXN0UCwgc2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyAgICAvLyBGZWVkIGlucHV0IGJ1
ZmZlciAocmVhZCBieSBhbGwgdGhyZWFkcykKKyAgICBtX2lucHV0QnVmZmVyLndyaXRlKHNvdXJj
ZVAsIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAvLyBBY2N1bXVsYXRlIGNvbnRyaWJ1dGlvbnMg
ZnJvbSBlYWNoIHN0YWdlCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3N0YWdlcy5zaXpl
KCk7ICsraSkKKyAgICAgICAgbV9zdGFnZXNbaV0tPnByb2Nlc3Moc291cmNlUCwgZnJhbWVzVG9Q
cm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBmcm9tIGFjY3VtdWxhdGlvbiBidWZmZXIK
KyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5kQ2xlYXIoZGVzdFAsIGZyYW1lc1RvUHJv
Y2Vzcyk7CisgICAgICAgIAorICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGJ1ZmZlcmVkIG1vcmUgaW5w
dXQsIHdha2UgdXAgb3VyIGJhY2tncm91bmQgdGhyZWFkLgorICAgIAorICAgIC8vIE5vdCB1c2lu
ZyBhIE11dGV4TG9ja2VyIGxvb2tzIHN0cmFuZ2UsIGJ1dCB3ZSB1c2UgYSB0cnlMb2NrKCkgaW5z
dGVhZCBiZWNhdXNlIHRoaXMgaXMgcnVuIG9uIHRoZSByZWFsLXRpbWUKKyAgICAvLyB0aHJlYWQg
d2hlcmUgaXQgaXMgYSBkaXNhc3RlciBmb3IgdGhlIGxvY2sgdG8gYmUgY29udGVuZGVkIChjYXVz
ZXMgYXVkaW8gZ2xpdGNoaW5nKS4gIEl0J3MgT0sgaWYgd2UgZmFpbCB0bworICAgIC8vIHNpZ25h
bCBmcm9tIHRpbWUgdG8gdGltZSwgc2luY2Ugd2UnbGwgZ2V0IHRvIGl0IHRoZSBuZXh0IHRpbWUg
d2UncmUgY2FsbGVkLiAgV2UncmUgY2FsbGVkIHJlcGVhdGVkbHkKKyAgICAvLyBhbmQgZnJlcXVl
bnRseSAoYXJvdW5kIGV2ZXJ5IDNtcykuICBUaGUgYmFja2dyb3VuZCB0aHJlYWQgaXMgcHJvY2Vz
c2luZyB3ZWxsIGludG8gdGhlIGZ1dHVyZSBhbmQgaGFzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBv
ZiAKKyAgICAvLyBsZWV3YXkgaGVyZS4uLgorICAgIGlmIChtX2JhY2tncm91bmRUaHJlYWRMb2Nr
LnRyeUxvY2soKSkgeworICAgICAgICBtX21vcmVJbnB1dEJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAg
ICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICBtX2JhY2tn
cm91bmRUaHJlYWRMb2NrLnVubG9jaygpOworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2
ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUo
KTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX2Jh
Y2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5y
ZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2
ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwMjY1ZgotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKQEAgLTAsMCArMSwxMDAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFJldmVyYkNvbnZvbHZlcl9oCisjZGVmaW5lIFJldmVyYkNvbnZvbHZlcl9oCisK
KyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKyNpbmNsdWRlICJGRlRDb252b2x2ZXIuaCIK
KyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJD
b252b2x2ZXJTdGFnZS5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8
d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBBdWRpb0NoYW5uZWw7CisKK2NsYXNzIFJldmVyYkNvbnZvbHZlciB7
CitwdWJsaWM6CisgICAgLy8gbWF4RkZUU2l6ZSBjYW4gYmUgYWRqdXN0ZWQgKGZyb20gc2F5IDIw
NDggdG8gMzI3NjgpIGRlcGVuZGluZyBvbiBob3cgbXVjaCBwcmVjaXNpb24gaXMgbmVjZXNzYXJ5
LgorICAgIC8vIEZvciBjZXJ0YWluIHR3ZWFreSBkZS1jb252b2x2aW5nIGFwcGxpY2F0aW9ucyB0
aGUgcGhhc2UgZXJyb3JzIGFkZCB1cCBxdWlja2x5IGFuZCBsZWFkIHRvIG5vbi1zZW5zaWNhbCBy
ZXN1bHRzIHdpdGgKKyAgICAvLyBsYXJnZXIgRkZUIHNpemVzIGFuZCBzaW5nbGUtcHJlY2lzaW9u
IGZsb2F0cy4gIEluIHRoZXNlIGNhc2VzIDIwNDggaXMgYSBnb29kIHNpemUuCisgICAgLy8gSWYg
bm90IGRvaW5nIG11bHRpLXRocmVhZGVkIGNvbnZvbHV0aW9uLCB0aGVuIHNob3VsZCBub3QgZ28g
PiA4MTkyLgorICAgIFJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25z
ZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252
b2x2ZXJSZW5kZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcyk7CisKKyAgICB+UmV2
ZXJiQ29udm9sdmVyKCk7CisKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZVAsIGZsb2F0
KiBkZXN0UCwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisK
KyAgICBzaXplX3QgaW1wdWxzZVJlc3BvbnNlTGVuZ3RoKCk7CisKKyAgICBSZXZlcmJJbnB1dEJ1
ZmZlciogaW5wdXRCdWZmZXIoKSB7IHJldHVybiAmbV9pbnB1dEJ1ZmZlcjsgfQorCisgICAgYm9v
bCB1c2VCYWNrZ3JvdW5kVGhyZWFkcygpIGNvbnN0IHsgcmV0dXJuIG1fdXNlQmFja2dyb3VuZFRo
cmVhZHM7IH0KKworICAgIHZvaWQgYmFja2dyb3VuZFRocmVhZEVudHJ5KCk7CisKK3ByaXZhdGU6
CisgICAgVmVjdG9yPE93blB0cjxSZXZlcmJDb252b2x2ZXJTdGFnZT4gPiBtX3N0YWdlczsKKyAg
ICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fYmFja2dyb3VuZFN0YWdl
czsKKyAgICBzaXplX3QgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGg7CisKKyAgICBSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXIgbV9hY2N1bXVsYXRpb25CdWZmZXI7CisKKyAgICAvLyBPbmUgb3IgbW9y
ZSBiYWNrZ3JvdW5kIHRocmVhZHMgcmVhZCBmcm9tIHRoaXMgaW5wdXQgYnVmZmVyIHdoaWNoIGlz
IGZlZCBmcm9tIHRoZSByZWFsdGltZSB0aHJlYWQuCisgICAgUmV2ZXJiSW5wdXRCdWZmZXIgbV9p
bnB1dEJ1ZmZlcjsKKworICAgIC8vIFdlJ3JlIGdpdmVuIGEgcmVuZGVyaW5nIGhpbnQsIHNvIHRo
ZSBGRlRzIGNhbiBiZSBvcHRpbWl6ZWQgdG8gbm90IGFsbCBvY2N1ciBhdCB0aGUgc2FtZSB0aW1l
CisgICAgLy8gKHZlcnkgYmFkIHdoZW4gcmVuZGVyaW5nIG9uIGEgcmVhbC10aW1lIHRocmVhZCku
CisgICAgc2l6ZV90IG1fcmVuZGVyU2xpY2VTaXplOworCisgICAgLy8gRmlyc3Qgc3RhZ2Ugd2ls
bCBiZSBvZiBzaXplIG1fbWluRkZUU2l6ZS4gIEVhY2ggbmV4dCBzdGFnZSB3aWxsIGJlIHR3aWNl
IGFzIGJpZyB1bnRpbCB3ZSBoaXQgbV9tYXhGRlRTaXplLgorICAgIHNpemVfdCBtX21pbkZGVFNp
emU7CisgICAgc2l6ZV90IG1fbWF4RkZUU2l6ZTsKKworICAgIC8vIEJ1dCBkb24ndCBleGNlZWQg
dGhpcyBzaXplIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkIChpZiB3ZSdyZSBkb2luZyBiYWNrZ3Jv
dW5kIHByb2Nlc3NpbmcpLgorICAgIHNpemVfdCBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKworICAg
IC8vIEJhY2tncm91bmQgdGhyZWFkIGFuZCBzeW5jaHJvbml6YXRpb24KKyAgICBib29sIG1fdXNl
QmFja2dyb3VuZFRocmVhZHM7CisgICAgVGhyZWFkSWRlbnRpZmllciBtX2JhY2tncm91bmRUaHJl
YWQ7CisgICAgYm9vbCBtX3dhbnRzVG9FeGl0OworICAgIGJvb2wgbV9tb3JlSW5wdXRCdWZmZXJl
ZDsKKyAgICBtdXRhYmxlIE11dGV4IG1fYmFja2dyb3VuZFRocmVhZExvY2s7CisgICAgbXV0YWJs
ZSBUaHJlYWRDb25kaXRpb24gbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uOworfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiQ29udm9sdmVyX2gKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkzZWExMAotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCkBAIC0wLDAgKzEs
MTQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBB
cHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0
cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlclN0
YWdlLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisjaW5jbHVkZSAi
UmV2ZXJiSW5wdXRCdWZmZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8
d3RmL1Bhc3NPd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZlcmJDb252b2x2
ZXJTdGFnZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6
ZV90IHJlc3BvbnNlTGVuZ3RoLCBzaXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5LCBzaXplX3Qgc3Rh
Z2VPZmZzZXQsIHNpemVfdCBzdGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBzaXplX3QgZmZ0U2l6ZSwgc2l6ZV90IHJlbmRlclBoYXNlLCBzaXpl
X3QgcmVuZGVyU2xpY2VTaXplLCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtdWxhdGlv
bkJ1ZmZlcikKKyAgICA6IG1fZmZ0S2VybmVsKGZmdFNpemUpCisgICAgLCBtX2FjY3VtdWxhdGlv
bkJ1ZmZlcihhY2N1bXVsYXRpb25CdWZmZXIpCisgICAgLCBtX2FjY3VtdWxhdGlvblJlYWRJbmRl
eCgwKQorICAgICwgbV9pbnB1dFJlYWRJbmRleCgwKQorICAgICwgbV9hY2N1bXVsYXRpb25SZWFk
VGltZUZyYW1lKDApCisgICAgLCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aChyZXNwb25zZUxlbmd0
aCkKK3sKKyAgICBtX2ZmdEtlcm5lbC5kb1BhZGRlZEZGVChpbXB1bHNlUmVzcG9uc2UgKyBzdGFn
ZU9mZnNldCwgc3RhZ2VMZW5ndGgpOworCisgICAgbV9jb252b2x2ZXIgPSBuZXcgRkZUQ29udm9s
dmVyKGZmdFNpemUpOworCisgICAgbV90ZW1wQnVmZmVyLmFsbG9jYXRlKHJlbmRlclNsaWNlU2l6
ZSk7CisKKyAgICAvLyBUaGUgY29udm9sdXRpb24gc3RhZ2UgYXQgb2Zmc2V0IHN0YWdlT2Zmc2V0
IG5lZWRzIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlbGF5IHRvIGNhbmNlbCBvdXQgdGhlIG9m
ZnNldAorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZzZXQgKyByZXZlcmJUb3RhbExh
dGVuY3k7CisKKyAgICAvLyBCdXQsIHRoZSBGRlQgY29udm9sdXRpb24gaXRzZWxmIGluY3VycyBm
ZnRTaXplIC8gMiBsYXRlbmN5LCBzbyBzdWJ0cmFjdCB0aGlzIG91dC4uLgorICAgIHNpemVfdCBo
YWxmU2l6ZSA9IGZmdFNpemUgLyAyOworICAgIGlmICh0b3RhbERlbGF5ID49IGhhbGZTaXplKQor
ICAgICAgICB0b3RhbERlbGF5IC09IGhhbGZTaXplOworCisgICAgLy8gRklYTUU6IERFQUwgd2l0
aCBjYXNlIHdoZW4gdG90YWwgZGVsYXkgaXMgbGVzcyB0aGFuIGZmdFNpemUvMi4uLi4KKworICAg
IC8vIFdlIGRpdmlkZSB1cCB0aGUgdG90YWwgZGVsYXksIGludG8gcHJlIGFuZCBwb3N0IGRlbGF5
IHNlY3Rpb25zIHNvIHRoYXQgd2UgY2FuCisgICAgLy8gc2NoZWR1bGUgYXQgZXhhY3RseSB0aGUg
bW9tZW50IHdoZW4gdGhlIEZGVCB3aWxsIGhhcHBlbi4gIFRoaXMgaXMgY29vcmRpbmF0ZWQKKyAg
ICAvLyB3aXRoIHRoZSBvdGhlciBzdGFnZXMsIHNvIHRoZXkgZG9uJ3QgYWxsIGRvIHRoZWlyIEZG
VHMgYXQgdGhlIHNhbWUgdGltZS4uLgorCisgICAgaW50IG0gPSAoaGFsZlNpemUgPD0gdG90YWxE
ZWxheSkgPyBoYWxmU2l6ZSA6IHRvdGFsRGVsYXk7CisgICAgbV9wcmVEZWxheUxlbmd0aCA9ICh0
b3RhbERlbGF5ID4gMCkgPyAocmVuZGVyUGhhc2UgJSBtKSA6IDA7CisKKyAgICBpZiAobV9wcmVE
ZWxheUxlbmd0aCA+IHRvdGFsRGVsYXkpCisgICAgICAgIG1fcHJlRGVsYXlMZW5ndGggPSAwOwor
CisgICAgbV9wb3N0RGVsYXlMZW5ndGggPSB0b3RhbERlbGF5IC0gbV9wcmVEZWxheUxlbmd0aDsK
KyAgICBtX3ByZVJlYWRXcml0ZUluZGV4ID0gMDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7
IC8vIHRvdGFsIGZyYW1lcyBwcm9jZXNzZWQgc28gZmFyCisKKyAgICBtX3ByZURlbGF5QnVmZmVy
LmFsbG9jYXRlKG1fcHJlRGVsYXlMZW5ndGggPCBmZnRTaXplID8gZmZ0U2l6ZSA6IG1fcHJlRGVs
YXlMZW5ndGgpOworfQorCit2b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzSW5CYWNr
Z3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29udm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNz
KQoreworICAgIFJldmVyYklucHV0QnVmZmVyKiBpbnB1dEJ1ZmZlciA9IGNvbnZvbHZlci0+aW5w
dXRCdWZmZXIoKTsKKyAgICBmbG9hdCogc291cmNlUCA9IGlucHV0QnVmZmVyLT5kaXJlY3RSZWFk
RnJvbSgmbV9pbnB1dFJlYWRJbmRleCwgZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICBwcm9jZXNzKHNv
dXJjZVAsIGZyYW1lc1RvUHJvY2Vzcyk7Cit9CisKK3ZvaWQgIFJldmVyYkNvbnZvbHZlclN0YWdl
Ojpwcm9jZXNzKGZsb2F0KiBzb3VyY2VQLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAg
IC8vCisgICAgLy8gRklYTUU6IGRvIHNhbml0eSBjaGVjayBvbiBmcmFtZXNUb1Byb2Nlc3MgdmVy
c3VzIGRlbGF5IGJ1ZmZlciBzaXplCisgICAgLy8KKworICAgIC8vIEdldCBwb2ludGVyIHRvIHBy
ZS1kZWxheSBzdHJlYW0gOiBub3RlIHNwZWNpYWwgaGFuZGxpbmcgb2YgemVybyBkZWxheQorICAg
IGZsb2F0KiBwcmVEZWxheWVkU291cmNlUCA9IHNvdXJjZVA7CisgICAgZmxvYXQqIHByZURlbGF5
QnVmZmVyUCA9IG1fcHJlRGVsYXlCdWZmZXI7CisgICAgZmxvYXQqIHRlbXBQID0gcHJlRGVsYXlC
dWZmZXJQOworICAgIGlmIChtX3ByZURlbGF5TGVuZ3RoID4gMCkgeworICAgICAgICBwcmVEZWxh
eWVkU291cmNlUCA9IHByZURlbGF5QnVmZmVyUCArIG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAg
ICAgIHRlbXBQID0gbV90ZW1wQnVmZmVyOworICAgIH0KKworICAgIGludCB3cml0ZUluZGV4ID0g
MDsKKworICAgIGlmIChtX2ZyYW1lc1Byb2Nlc3NlZCA8IG1fcHJlRGVsYXlMZW5ndGgpIHsKKyAg
ICAgICAgLy8gRm9yIHRoZSBmaXJzdCBtX3ByZURlbGF5TGVuZ3RoIGZyYW1lcyBkb24ndCBwcm9j
ZXNzIHRoZSBjb252b2x2ZXIsIGluc3RlYWQgc2ltcGx5IGJ1ZmZlciBpbiB0aGUgcHJlLWRlbGF5
LgorICAgICAgICAvLyBCdXQgd2hpbGUgYnVmZmVyaW5nIHRoZSBwcmUtZGVsYXksIHdlIHN0aWxs
IG5lZWQgdG8gdXBkYXRlIG91ciBpbmRleC4KKyAgICAgICAgbV9hY2N1bXVsYXRpb25CdWZmZXIt
PnVwZGF0ZVJlYWRJbmRleCgmbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgsIGZyYW1lc1RvUHJvY2Vz
cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm93LCBydW4gdGhlIGNvbnZvbHV0aW9uIChp
bnRvIHRoZSBkZWxheSBidWZmZXIpCisgICAgICAgIC8vIEFuIGV4cGVuc2l2ZSBGRlQgd2lsbCBo
YXBwZW4gZXZlcnkgKGZmdFNpemUvMikgZnJhbWVzCisgICAgICAgIC8vIFdlIHByb2Nlc3MgaW4t
cGxhY2UgaGVyZS4uLgorICAgICAgICBtX2NvbnZvbHZlci0+cHJvY2VzcygmbV9mZnRLZXJuZWws
IHByZURlbGF5ZWRTb3VyY2VQLCB0ZW1wUCwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgICAgICAv
LyBOb3cgYWNjdW11bGF0ZSBpbnRvIHJldmVyYidzIGFjY3VtdWxhdGlvbiBidWZmZXIKKyAgICAg
ICAgLy8gRklYTUU6IHJlYWxseSBuZWVkIHRvIGhhdmUgbG9ja2luZyBtZWNoYW5pc20gaGVyZSEh
CisgICAgICAgIHdyaXRlSW5kZXggPSBtX2FjY3VtdWxhdGlvbkJ1ZmZlci0+YWNjdW11bGF0ZSh0
ZW1wUCwgZnJhbWVzVG9Qcm9jZXNzLCAmbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgsIG1fcG9zdERl
bGF5TGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLyBGaW5hbGx5IGNvcHkgaW5wdXQgdG8gcHJlLWRl
bGF5CisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShwcmVE
ZWxheWVkU291cmNlUCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7
CisgICAgICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAg
ICAgIGlmIChtX3ByZVJlYWRXcml0ZUluZGV4ID49IG1fcHJlRGVsYXlMZW5ndGgpCisgICAgICAg
ICAgICBtX3ByZVJlYWRXcml0ZUluZGV4ID0gMDsgLy8gc2hvdWxkIG9ubHkgYmUgPD0KKyAgICB9
CisKKyAgICBtX2FjY3VtdWxhdGlvblJlYWRUaW1lRnJhbWUgKz0gZnJhbWVzVG9Qcm9jZXNzOwor
ICAgIG1fZnJhbWVzUHJvY2Vzc2VkICs9IGZyYW1lc1RvUHJvY2VzczsKK30KKwordm9pZCBSZXZl
cmJDb252b2x2ZXJTdGFnZTo6cmVzZXQoKQoreworICAgIG1fY29udm9sdmVyLT5yZXNldCgpOwor
ICAgIG1fcHJlRGVsYXlCdWZmZXIuemVybygpOworICAgIG1fYWNjdW11bGF0aW9uUmVhZEluZGV4
ID0gMDsKKyAgICBtX2lucHV0UmVhZEluZGV4ID0gMDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9
IDA7CisgICAgbV9hY2N1bXVsYXRpb25SZWFkVGltZUZyYW1lID0gMDsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJD
b252b2x2ZXJTdGFnZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJT
dGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWU4NjAKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdl
LmgKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAorI2Rl
ZmluZSBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXku
aCIKKyNpbmNsdWRlICJGRlRGcmFtZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjsKK2NsYXNzIFJldmVyYkNvbnZvbHZlcjsKK2NsYXNz
IEZGVENvbnZvbHZlcjsKKyAgICAKKy8vIEEgUmV2ZXJiQ29udm9sdmVyU3RhZ2UgcmVwcmVzZW50
cyB0aGUgY29udm9sdXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgc3ViLXNlY3Rpb24gb2YgYSBsYXJn
ZSBpbXB1bHNlIHJlc3BvbnNlLgorLy8gSXQgaW5jb3Jwb3JhdGVzIGEgZGVsYXkgbGluZSB0byBh
Y2NvdW50IGZvciB0aGUgb2Zmc2V0IG9mIHRoZSBzdWItc2VjdGlvbiB3aXRoaW4gdGhlIGxhcmdl
ciBpbXB1bHNlIHJlc3BvbnNlLgorY2xhc3MgUmV2ZXJiQ29udm9sdmVyU3RhZ2UgeworcHVibGlj
OgorICAgIC8vIHJlbmRlclBoYXNlIGlzIHVzZWZ1bCB0byBrbm93IHNvIHRoYXQgd2UgY2FuIG1h
bmlwdWxhdGUgdGhlIHByZSB2ZXJzdXMgcG9zdCBkZWxheSBzbyB0aGF0IHN0YWdlcyB3aWxsIHBl
cmZvcm0KKyAgICAvLyB0aGVpciBoZWF2eSB3b3JrIChGRlQgcHJvY2Vzc2luZykgb24gZGlmZmVy
ZW50IHNsaWNlcyB0byBiYWxhbmNlIHRoZSBsb2FkIGluIGEgcmVhbC10aW1lIHRocmVhZC4KKyAg
ICBSZXZlcmJDb252b2x2ZXJTdGFnZShmbG9hdCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVz
cG9uc2VMZW5ndGgsIHNpemVfdCByZXZlcmJUb3RhbExhdGVuY3ksIHNpemVfdCBzdGFnZU9mZnNl
dCwgc2l6ZV90IHN0YWdlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBm
ZnRTaXplLCBzaXplX3QgcmVuZGVyUGhhc2UsIHNpemVfdCByZW5kZXJTbGljZVNpemUsIFJldmVy
YkFjY3VtdWxhdGlvbkJ1ZmZlciogYWNjdW11bGF0aW9uQnVmZmVyKTsKKworICAgIC8vIFdBUk5J
Tkc6IGZyYW1lc1RvUHJvY2VzcyBtdXN0IGJlIHN1Y2ggdGhhdCBpdCBldmVubHkgZGl2aWRlcyB0
aGUgZGVsYXkgYnVmZmVyIHNpemUgKHN0YWdlX29mZnNldCkKKyAgICB2b2lkIHByb2Nlc3MoZmxv
YXQqIHNvdXJjZVAsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCBwcm9jZXNz
SW5CYWNrZ3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29udm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Q
cm9jZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIC8vIFVzZWZ1bCBmb3IgYmFja2dy
b3VuZCBwcm9jZXNzaW5nCisgICAgaW50IGlucHV0UmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4g
bV9pbnB1dFJlYWRJbmRleDsgfQorCitwcml2YXRlOgorICAgIEZGVEZyYW1lIG1fZmZ0S2VybmVs
OworICAgIE93blB0cjxGRlRDb252b2x2ZXI+IG1fY29udm9sdmVyOworCisgICAgQXVkaW9GbG9h
dEFycmF5IG1fcHJlRGVsYXlCdWZmZXI7CisKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIq
IG1fYWNjdW11bGF0aW9uQnVmZmVyOworICAgIGludCBtX2FjY3VtdWxhdGlvblJlYWRJbmRleDsK
KyAgICBpbnQgbV9pbnB1dFJlYWRJbmRleDsKKworICAgIGludCBtX2FjY3VtdWxhdGlvblJlYWRU
aW1lRnJhbWU7IC8vIGZvciB0ZXN0aW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5lKQor
CisgICAgc2l6ZV90IG1fcHJlRGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1fcG9zdERlbGF5TGVu
Z3RoOworICAgIHNpemVfdCBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgIHNpemVfdCBtX2ZyYW1l
c1Byb2Nlc3NlZDsKKworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBCdWZmZXI7CisKKyAgICBz
aXplX3QgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGg7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBSZXZlcmJDb252b2x2ZXJTdGFnZV9oCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjJmOTZlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYklucHV0QnVmZmVyLmNwcApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAo
IkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9t
IHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKHNpemVfdCBsZW5n
dGgpCisgICAgOiBtX2J1ZmZlcihsZW5ndGgpCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKK3sKK30K
Kwordm9pZCBSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBu
dW1iZXJPZkZyYW1lcykKK3sKKyAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIuc2l6
ZSgpOworICAgIGJvb2wgaXNDb3B5R29vZCA9IG1fd3JpdGVJbmRleCArIG51bWJlck9mRnJhbWVz
IDw9IGJ1ZmZlckxlbmd0aDsKKyAgICBBU1NFUlQoaXNDb3B5R29vZCk7CisgICAgaWYgKCFpc0Nv
cHlHb29kKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIG1lbWNweShtX2J1ZmZlci5k
YXRhKCkgKyBtX3dyaXRlSW5kZXgsIHNvdXJjZVAsIHNpemVvZihmbG9hdCkgKiBudW1iZXJPZkZy
YW1lcyk7CisKKyAgICBtX3dyaXRlSW5kZXggKz0gbnVtYmVyT2ZGcmFtZXM7CisgICAgQVNTRVJU
KG1fd3JpdGVJbmRleCA8PSBidWZmZXJMZW5ndGgpOworCisgICAgaWYgKG1fd3JpdGVJbmRleCA+
PSBidWZmZXJMZW5ndGgpCisgICAgICAgIG1fd3JpdGVJbmRleCA9IDA7Cit9CisKK2Zsb2F0KiBS
ZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20oaW50KiBpbmRleCwgc2l6ZV90IG51bWJl
ck9mRnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7
CisgICAgYm9vbCBpc1B0ckdvb2QgPSAqaW5kZXggPj0gMCAmJiAqaW5kZXggKyBudW1iZXJPZkZy
YW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAgQVNTRVJUKGlzUHRyR29vZCk7CisgICAgZmxvYXQq
IHNvdXJjZVAgPSBtX2J1ZmZlcjsKKyAgICBmbG9hdCogcCA9IGlzUHRyR29vZCA/IHNvdXJjZVAg
KyAqaW5kZXggOiAwOyAvLyBwb2ludGVyIHNob3VsZCBhbHdheXMgYmUgZ29vZCAtIGZvcmNlIHJl
YWQgZnJvbSAwIHRvIGV4cG9zZSBidWcgb3RoZXJ3aXNlCisKKyAgICAvLyBVcGRhdGUgaW5kZXgK
KyAgICAqaW5kZXggPSAoKmluZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOwor
CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgUmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KCkKK3sK
KyAgICBtX2J1ZmZlci56ZXJvKCk7CisgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZl
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWYzNTgKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmgKQEAg
LTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5h
bWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAq
ICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiSW5wdXRCdWZmZXJfaAorI2RlZmluZSBSZXZl
cmJJbnB1dEJ1ZmZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCisvLyBSZXZlcmJJbnB1dEJ1ZmZlciBpcyB1c2VkIHRvIGJ1ZmZlciBp
bnB1dCBzYW1wbGVzIGZvciBkZWZlcnJlZCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZ3JvdW5kIHRo
cmVhZHMuCitjbGFzcyBSZXZlcmJJbnB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgUmV2ZXJiSW5w
dXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvLyBUaGUgcmVhbHRpbWUgYXVkaW8gdGhy
ZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxlcyBoZXJlLgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlz
IHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IG5mcmFtZXMg
KGZvciBuZWFybHkgYWxsIGNhc2VzIHRoaXMgd2lsbCBiZSBmaW5lKS4KKyAgICAvLyBGSVhNRTog
cmVtb3ZlIG5mcmFtZXMgcmVzdHJpY3Rpb24uLi4KKyAgICB2b2lkIHdyaXRlKGZsb2F0KiBzb3Vy
Y2VQLCBzaXplX3QgbmZyYW1lcyk7CisKKyAgICAvLyBCYWNrZ3JvdW5kIHRocmVhZHMgY2FuIGNh
bGwgdGhpcyB0byBjaGVjayBpZiB0aGVyZSdzIGFueXRoaW5nIHRvIHJlYWQuLi4KKyAgICBzaXpl
X3Qgd3JpdGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JpdGVJbmRleDsgfQorCisgICAgLy8g
VGhlIGluZGl2aWR1YWwgYmFja2dyb3VuZCB0aHJlYWRzIHJlYWQgaGVyZSAoYW5kIGhvcGUgdGhh
dCB0aGV5IGNhbiBrZWVwIHVwIHdpdGggdGhlIGJ1ZmZlciB3cml0aW5nKS4KKyAgICAvLyBpbmRl
eCBpcyB1cGRhdGVkIHdpdGggdGhlIG5leHQgaW5kZXggdG8gcmVhZCBmcm9tLi4uCisgICAgLy8g
VGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYnVmZmVyJ3MgbGVuZ3RoIGlzIGV2ZW5seSBkaXZp
c2libGUgYnkgbmZyYW1lcy4KKyAgICAvLyBGSVhNRTogcmVtb3ZlIG5mcmFtZXMgcmVzdHJpY3Rp
b24uLi4KKyAgICBmbG9hdCogZGlyZWN0UmVhZEZyb20oaW50KiBpbmRleCwgc2l6ZV90IG5mcmFt
ZXMpOworCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRBcnJh
eSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4OworfTsKKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiSW5wdXRCdWZmZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51461</attachid>
            <date>2010-03-23 15:20:58 -0700</date>
            <delta_ts>2010-03-29 14:11:10 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100323152057.patch</filename>
            <type>text/plain</type>
            <size>41633</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MWYyZDg3NC4uMmU4NGM3MCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0yMyAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkJh
Y2tncm91bmRUaHJlYWREaXNwYXRjaCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2
ZXI6OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
On5SZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpi
YWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
OjppbXB1bHNlUmVzcG9uc2VMZW5ndGgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9s
dmVyOjpwcm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQp
OgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAg
ICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dy
b3VuZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6
CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAg
ICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVm
ZmVyOjp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0wNSAgQ3NhYmEgT3N6dHJvZ29uw6FjICA8b3Nz
eUB3ZWJraXQub3JnPgogCiAgICAgICAgIFVucmV2aWV3ZWQgYnVpbGRmaXggYWZ0ZXIgcjU1NTkz
LiAoVG8gZml4IFF0IC0tbWluaW1hbCBidWlsZC4pCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uYTBjZDFjYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcApAQCAtMCwwICsxLDExMiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIu
aCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitS
ZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3Qg
bGVuZ3RoKQorICAgIDogbV9idWZmZXIobGVuZ3RoKQorICAgICwgbV9yZWFkSW5kZXgoMCkKKyAg
ICAsIG1fcmVhZFRpbWVGcmFtZSgwKQoreworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlcjo6cmVhZEFuZENsZWFyKGZsb2F0KiBkZXN0aW5hdGlvbiwgc2l6ZV90IG51bWJlck9mRnJh
bWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAg
Ym9vbCBpc0NvcHlTYWZlID0gbV9yZWFkSW5kZXggPD0gYnVmZmVyTGVuZ3RoICYmIG51bWJlck9m
RnJhbWVzIDw9IGJ1ZmZlckxlbmd0aDsKKyAgICAKKyAgICBBU1NFUlQoaXNDb3B5U2FmZSk7Cisg
ICAgaWYgKCFpc0NvcHlTYWZlKQorICAgICAgICByZXR1cm47CisKKyAgICBzaXplX3QgZnJhbWVz
QXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gbV9yZWFkSW5kZXg7CisgICAgc2l6ZV90IG51bWJl
ck9mRnJhbWVzMSA9IHN0ZDo6bWluKG51bWJlck9mRnJhbWVzLCBmcmFtZXNBdmFpbGFibGUpOwor
ICAgIHNpemVfdCBudW1iZXJPZkZyYW1lczIgPSBudW1iZXJPZkZyYW1lcyAtIG51bWJlck9mRnJh
bWVzMTsKKworICAgIGZsb2F0KiBzb3VyY2UgPSBtX2J1ZmZlcjsKKyAgICBtZW1jcHkoZGVzdGlu
YXRpb24sIHNvdXJjZSArIG1fcmVhZEluZGV4LCBzaXplb2YoZmxvYXQpICogbnVtYmVyT2ZGcmFt
ZXMxKTsKKyAgICBtZW1zZXQoc291cmNlICsgbV9yZWFkSW5kZXgsIDAsIHNpemVvZihmbG9hdCkg
KiBudW1iZXJPZkZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vz
c2FyeQorICAgIGlmIChudW1iZXJPZkZyYW1lczIgPiAwKSB7CisgICAgICAgIG1lbWNweShkZXN0
aW5hdGlvbiArIG51bWJlck9mRnJhbWVzMSwgc291cmNlLCBzaXplb2YoZmxvYXQpICogbnVtYmVy
T2ZGcmFtZXMyKTsKKyAgICAgICAgbWVtc2V0KHNvdXJjZSwgMCwgc2l6ZW9mKGZsb2F0KSAqIG51
bWJlck9mRnJhbWVzMik7CisgICAgfQorCisgICAgbV9yZWFkSW5kZXggPSAobV9yZWFkSW5kZXgg
KyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5ndGg7CisgICAgbV9yZWFkVGltZUZyYW1lICs9
IG51bWJlck9mRnJhbWVzOworfQorCit2b2lkIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6dXBk
YXRlUmVhZEluZGV4KGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpIGNvbnN0
Cit7CisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHJlYWRJbmRleAorICAgICpyZWFkSW5kZXggPSAo
KnJlYWRJbmRleCArIG51bWJlck9mRnJhbWVzKSAlIG1fYnVmZmVyLnNpemUoKTsKK30KKworaW50
IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6YWNjdW11bGF0ZShmbG9hdCogc291cmNlLCBzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMsIGludCogcmVhZEluZGV4LCBzaXplX3QgZGVsYXlGcmFtZXMpCit7
CisgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICAKKyAgICBz
aXplX3Qgd3JpdGVJbmRleCA9ICgqcmVhZEluZGV4ICsgZGVsYXlGcmFtZXMpICUgYnVmZmVyTGVu
Z3RoOworCisgICAgLy8gVXBkYXRlIGNhbGxlcidzIHJlYWRJbmRleAorICAgICpyZWFkSW5kZXgg
PSAoKnJlYWRJbmRleCArIG51bWJlck9mRnJhbWVzKSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIHNp
emVfdCBmcmFtZXNBdmFpbGFibGUgPSBidWZmZXJMZW5ndGggLSB3cml0ZUluZGV4OworICAgIHNp
emVfdCBudW1iZXJPZkZyYW1lczEgPSBzdGQ6Om1pbihudW1iZXJPZkZyYW1lcywgZnJhbWVzQXZh
aWxhYmxlKTsKKyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMyID0gbnVtYmVyT2ZGcmFtZXMgLSBu
dW1iZXJPZkZyYW1lczE7CisKKyAgICBmbG9hdCogZGVzdGluYXRpb24gPSBtX2J1ZmZlcjsKKwor
ICAgIGJvb2wgaXNTYWZlID0gd3JpdGVJbmRleCA8PSBidWZmZXJMZW5ndGggJiYgbnVtYmVyT2ZG
cmFtZXMxICsgd3JpdGVJbmRleCA8PSBidWZmZXJMZW5ndGggJiYgbnVtYmVyT2ZGcmFtZXMyIDw9
IGJ1ZmZlckxlbmd0aDsKKyAgICBBU1NFUlQoaXNTYWZlKTsKKyAgICBpZiAoIWlzU2FmZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICB2YWRkKHNvdXJjZSwgMSwgZGVzdGluYXRpb24gKyB3cml0
ZUluZGV4LCAxLCBkZXN0aW5hdGlvbiArIHdyaXRlSW5kZXgsIDEsIG51bWJlck9mRnJhbWVzMSk7
CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG51bWJl
ck9mRnJhbWVzMiA+IDApICAgICAgIAorICAgICAgICB2YWRkKHNvdXJjZSArIG51bWJlck9mRnJh
bWVzMSwgMSwgZGVzdGluYXRpb24sIDEsIGRlc3RpbmF0aW9uLCAxLCBudW1iZXJPZkZyYW1lczIp
OworCisgICAgcmV0dXJuIHdyaXRlSW5kZXg7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fcmVhZEluZGV4
ID0gMDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlv
bkJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZm
ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGEwNzczCi0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZm
ZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhl
ciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1l
cyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJf
aAorI2RlZmluZSBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJfaAorCisjaW5jbHVkZSAiQXVkaW9G
bG9hdEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gUmV2ZXJiQWNjdW11bGF0
aW9uQnVmZmVyIGlzIGEgY2lyY3VsYXIgZGVsYXkgYnVmZmVyIHdpdGggb25lIGNsaWVudCByZWFk
aW5nIGZyb20gaXQgYW5kIG11bHRpcGxlIGNsaWVudHMKKy8vIHdyaXRpbmcvYWNjdW11bGF0aW5n
IHRvIGl0IGF0IGRpZmZlcmVudCBkZWxheSBvZmZzZXRzIGZyb20gdGhlIHJlYWQgcG9zaXRpb24u
ICBUaGUgcmVhZCBvcGVyYXRpb24gd2lsbCB6ZXJvIHRoZSBtZW1vcnkKKy8vIGp1c3QgcmVhZCBm
cm9tIHRoZSBidWZmZXIsIHNvIGl0IHdpbGwgYmUgcmVhZHkgZm9yIGFjY3VtdWxhdGlvbiB0aGUg
bmV4dCB0aW1lIGFyb3VuZC4KK2NsYXNzIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciB7CitwdWJs
aWM6CisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKHNpemVfdCBsZW5ndGgpOworCisgICAg
Ly8gVGhpcyB3aWxsIHJlYWQgZnJvbSwgdGhlbiBjbGVhci1vdXQgbnVtYmVyT2ZGcmFtZXMKKyAg
ICB2b2lkIHJlYWRBbmRDbGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBudW1iZXJPZkZy
YW1lcyk7CisKKyAgICAvLyBFYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIHdpbGwgYWNjdW11bGF0
ZSBpdHMgb3V0cHV0IGF0IHRoZSBhcHByb3ByaWF0ZSBkZWxheSBmcm9tIHRoZSByZWFkIHBvc2l0
aW9uLgorICAgIC8vIFdlIG5lZWQgdG8gcGFzcyBpbiBhbmQgdXBkYXRlIHJlYWRJbmRleCBoZXJl
LCBzaW5jZSBlYWNoIFJldmVyYkNvbnZvbHZlclN0YWdlIG1heSBiZSBydW5uaW5nIGluCisgICAg
Ly8gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlIHJlYWx0aW1lIHRocmVhZCBjYWxsaW5nIFJl
YWRBbmRDbGVhcigpIGFuZCBtYWludGFpbmluZyBtX3JlYWRJbmRleAorICAgIC8vIFJldHVybnMg
dGhlIHdyaXRlSW5kZXggd2hlcmUgdGhlIGFjY3VtdWxhdGlvbiB0b29rIHBsYWNlCisgICAgaW50
IGFjY3VtdWxhdGUoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBpbnQqIHJl
YWRJbmRleCwgc2l6ZV90IGRlbGF5RnJhbWVzKTsKKworICAgIHNpemVfdCByZWFkSW5kZXgoKSBj
b25zdCB7IHJldHVybiBtX3JlYWRJbmRleDsgfQorICAgIHZvaWQgdXBkYXRlUmVhZEluZGV4KGlu
dCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpIGNvbnN0OworCisgICAgc2l6ZV90
IHJlYWRUaW1lRnJhbWUoKSBjb25zdCB7IHJldHVybiBtX3JlYWRUaW1lRnJhbWU7IH0KKworICAg
IHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9idWZmZXI7
CisgICAgc2l6ZV90IG1fcmVhZEluZGV4OworICAgIHNpemVfdCBtX3JlYWRUaW1lRnJhbWU7IC8v
IGZvciBkZWJ1Z2dpbmcgKGZyYW1lIG9uIGNvbnRpbnVvdXMgdGltZWxpbmUpCit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXJf
aApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZTdkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAKQEAgLTAsMCArMSwyMjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisKKyNp
bmNsdWRlICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjb25zdCBpbnQgSW5wdXRCdWZmZXJTaXplID0gOCAqIDE2Mzg0OworCisv
LyBXZSBvbmx5IHByb2Nlc3MgdGhlIGxlYWRpbmcgcG9ydGlvbiBvZiB0aGUgaW1wdWxzZSByZXNw
b25zZSBpbiB0aGUgcmVhbC10aW1lIHRocmVhZC4gIFdlIGRvbid0IGV4Y2VlZCB0aGlzIGxlbmd0
aC4KKy8vIEl0IHR1cm5zIG91dCB0aGVuLCB0aGF0IHRoZSBiYWNrZ3JvdW5kIHRocmVhZCBoYXMg
YWJvdXQgMjc4bXNlYyBvZiBzY2hlZHVsaW5nIHNsb3AuCisvLyBFbXBpcmljYWxseSwgdGhpcyBo
YXMgYmVlbiBmb3VuZCB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIGdpdmluZyBlbm91
Z2ggdGltZSBmb3Igc2NoZWR1bGluZyBzbG9wLAorLy8gd2hpbGUgc3RpbGwgbWluaW1pemluZyB0
aGUgYW1vdW50IG9mIHByb2Nlc3NpbmcgZG9uZSBpbiB0aGUgcHJpbWFyeSAoaGlnaC1wcmlvcml0
eSkgdGhyZWFkLgorLy8gVGhpcyB3YXMgZm91bmQgdG8gYmUgYSBnb29kIHZhbHVlIG9uIE1hYyBP
UyBYLCBhbmQgbWF5IHdvcmsgd2VsbCBvbiBvdGhlciBwbGF0Zm9ybXMgYXMgd2VsbCwgYXNzdW1p
bmcKKy8vIHRoZSB2ZXJ5IHJvdWdoIHNjaGVkdWxpbmcgbGF0ZW5jaWVzIGFyZSBzaW1pbGFyIG9u
IHRoZXNlIHRpbWUtc2NhbGVzLiAgT2YgY291cnNlLCB0aGlzIGNvZGUgbWF5IG5lZWQgdG8gYmUK
Ky8vIHR1bmVkIGZvciBpbmRpdmlkdWFsIHBsYXRmb3JtcyBpZiB0aGlzIGFzc3VtcHRpb24gaXMg
Zm91bmQgdG8gYmUgaW5jb3JyZWN0LgorY29uc3Qgc2l6ZV90IFJlYWx0aW1lRnJhbWVMaW1pdCA9
IDgxOTIgICsgNDA5NjsgLy8gfjI3OG1zZWMgQCA0NC4xS0h6CisKK2NvbnN0IHNpemVfdCBNaW5G
RlRTaXplID0gMjU2OworY29uc3Qgc2l6ZV90IE1heFJlYWx0aW1lRkZUU2l6ZSA9IDIwNDg7CisK
K3N0YXRpYyB2b2lkKiBCYWNrZ3JvdW5kVGhyZWFkRGlzcGF0Y2godm9pZCogdGhyZWFkRGF0YSkK
K3sKKyAgICBSZXZlcmJDb252b2x2ZXIqIHJldmVyYkNvbnZvbHZlciA9IHN0YXRpY19jYXN0PFJl
dmVyYkNvbnZvbHZlcio+KHRocmVhZERhdGEpOworICAgIHJldmVyYkNvbnZvbHZlci0+YmFja2dy
b3VuZFRocmVhZEVudHJ5KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6
UmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVu
ZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBo
YXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgIDogbV9pbXB1bHNlUmVzcG9uc2VM
ZW5ndGgoaW1wdWxzZVJlc3BvbnNlLT5mcmFtZVNpemUoKSkKKyAgICAsIG1fYWNjdW11bGF0aW9u
QnVmZmVyKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkgKyByZW5kZXJTbGljZVNpemUpCisg
ICAgLCBtX2lucHV0QnVmZmVyKElucHV0QnVmZmVyU2l6ZSkKKyAgICAsIG1fcmVuZGVyU2xpY2VT
aXplKHJlbmRlclNsaWNlU2l6ZSkKKyAgICAsIG1fbWluRkZUU2l6ZShNaW5GRlRTaXplKSAvLyBG
aXJzdCBzdGFnZSB3aWxsIGhhdmUgdGhpcyBzaXplIC0gc3VjY2Vzc2l2ZSBzdGFnZXMgd2lsbCBk
b3VibGUgaW4gc2l6ZSBlYWNoIHRpbWUKKyAgICAsIG1fbWF4RkZUU2l6ZShtYXhGRlRTaXplKSAv
LyB1bnRpbCB3ZSBoaXQgbV9tYXhGRlRTaXplCisgICAgLCBtX3VzZUJhY2tncm91bmRUaHJlYWRz
KHVzZUJhY2tncm91bmRUaHJlYWRzKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKKyAgICAs
IG1fbW9yZUlucHV0QnVmZmVyZWQoZmFsc2UpCit7CisgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGJh
Y2tncm91bmQgdGhyZWFkcyB0aGVuIGRvbid0IGV4Y2VlZCB0aGlzIEZGVCBzaXplIGZvciB0aGUK
KyAgICAvLyBzdGFnZXMgd2hpY2ggcnVuIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkLiAgVGhpcyBh
dm9pZHMgaGF2aW5nIG9ubHkgb25lIG9yIHR3bworICAgIC8vIGxhcmdlIHN0YWdlcyAoc2l6ZSAx
NjM4NCBvciBzbykgYXQgdGhlIGVuZCB3aGljaCB0YWtlIGEgbG90IG9mIHRpbWUgZXZlcnkgc2V2
ZXJhbAorICAgIC8vIHByb2Nlc3Npbmcgc2xpY2VzLiAgVGhpcyB3YXkgd2UgYW1vcnRpemUgdGhl
IGNvc3Qgb3ZlciBtb3JlIHByb2Nlc3Npbmcgc2xpY2VzLgorICAgIG1fbWF4UmVhbHRpbWVGRlRT
aXplID0gTWF4UmVhbHRpbWVGRlRTaXplOworCisgICAgLy8gRm9yIHRoZSBtb21lbnQsIGEgZ29v
ZCB3YXkgdG8ga25vdyBpZiB3ZSBoYXZlIHJlYWwtdGltZSBjb25zdHJhaW50IGlzIHRvIGNoZWNr
IGlmIHdlJ3JlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcy4KKyAgICAvLyBPdGhlcndpc2UsIGFz
c3VtZSB3ZSdyZSBiZWluZyBydW4gZnJvbSBhIGNvbW1hbmQtbGluZSB0b29sLgorICAgIGJvb2wg
aGFzUmVhbHRpbWVDb25zdHJhaW50ID0gdXNlQmFja2dyb3VuZFRocmVhZHM7CisKKyAgICBmbG9h
dCogcmVzcG9uc2UgPSBpbXB1bHNlUmVzcG9uc2UtPmRhdGEoKTsKKyAgICBzaXplX3QgdG90YWxS
ZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCk7CisKKyAgICAvLyBC
ZWNhdXNlIHdlJ3JlIG5vdCB1c2luZyBkaXJlY3QtY29udm9sdXRpb24gaW4gdGhlIGxlYWRpbmcg
cG9ydGlvbiwgdGhlIHJldmVyYiBoYXMgYW4gb3ZlcmFsbCBsYXRlbmN5IG9mIGhhbGYgdGhlIGZp
cnN0LXN0YWdlIEZGVCBzaXplCisgICAgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSA9IG1fbWlu
RkZUU2l6ZSAvIDI7CisKKyAgICBzaXplX3Qgc3RhZ2VPZmZzZXQgPSAwOworICAgIGludCBpID0g
MDsKKyAgICBzaXplX3QgZmZ0U2l6ZSA9IG1fbWluRkZUU2l6ZTsKKyAgICB3aGlsZSAoc3RhZ2VP
ZmZzZXQgPCB0b3RhbFJlc3BvbnNlTGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUg
PSBmZnRTaXplIC8gMjsKKworICAgICAgICAvLyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9z
c2libGUgdGhhdCBzdGFnZU9mZnNldCBpcyBzdWNoIHRoYXQgd2UncmUgc3RyYWRkbGluZyB0aGUg
ZW5kCisgICAgICAgIC8vIG9mIHRoZSBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciAoaWYgd2UgdXNl
IHN0YWdlU2l6ZSksIHNvIHJlZHVjZSB0aGUgbGFzdCBzdGFnZSdzIGxlbmd0aC4uLgorICAgICAg
ICBpZiAoc3RhZ2VTaXplICsgc3RhZ2VPZmZzZXQgPiB0b3RhbFJlc3BvbnNlTGVuZ3RoKQorICAg
ICAgICAgICAgc3RhZ2VTaXplID0gdG90YWxSZXNwb25zZUxlbmd0aCAtIHN0YWdlT2Zmc2V0Owor
CisgICAgICAgIC8vIFRoaXMgInN0YWdnZXJzIiB0aGUgdGltZSB3aGVuIGVhY2ggRkZUIGhhcHBl
bnMgc28gdGhleSBkb24ndCBhbGwgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgaW50
IHJlbmRlclBoYXNlID0gY29udm9sdmVyUmVuZGVyUGhhc2UgKyBpICogcmVuZGVyU2xpY2VTaXpl
OworCisgICAgICAgIFJldmVyYkNvbnZvbHZlclN0YWdlKiBzdGFnZSA9IG5ldyBSZXZlcmJDb252
b2x2ZXJTdGFnZShyZXNwb25zZSwgdG90YWxSZXNwb25zZUxlbmd0aCwgcmV2ZXJiVG90YWxMYXRl
bmN5LCBzdGFnZU9mZnNldCwgc3RhZ2VTaXplLCBmZnRTaXplLCByZW5kZXJQaGFzZSwgcmVuZGVy
U2xpY2VTaXplLCAmbV9hY2N1bXVsYXRpb25CdWZmZXIpOworCisgICAgICAgIGJvb2wgaXNCYWNr
Z3JvdW5kU3RhZ2UgPSBmYWxzZTsKKworICAgICAgICBpZiAoc3RhZ2VPZmZzZXQgPD0gUmVhbHRp
bWVGcmFtZUxpbWl0KQorICAgICAgICAgICAgbV9zdGFnZXMuYXBwZW5kKHN0YWdlKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSkg
eworICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdlcy5hcHBlbmQoc3RhZ2UpOworICAg
ICAgICAgICAgICAgIGlzQmFja2dyb3VuZFN0YWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxz
ZQorICAgICAgICAgICAgICAgIG1fc3RhZ2VzLmFwcGVuZChzdGFnZSk7CisgICAgICAgIH0KKwor
ICAgICAgICBzdGFnZU9mZnNldCArPSBzdGFnZVNpemU7CisgICAgICAgICsraTsKKworICAgICAg
ICAvLyBGaWd1cmUgb3V0IG5leHQgRkZUIHNpemUKKyAgICAgICAgZmZ0U2l6ZSAqPSAyOworICAg
ICAgICBpZiAoaGFzUmVhbHRpbWVDb25zdHJhaW50ICYmICFpc0JhY2tncm91bmRTdGFnZSAmJiBm
ZnRTaXplID4gbV9tYXhSZWFsdGltZUZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9t
YXhSZWFsdGltZUZGVFNpemU7CisgICAgICAgIGlmIChmZnRTaXplID4gbV9tYXhGRlRTaXplKQor
ICAgICAgICAgICAgZmZ0U2l6ZSA9IG1fbWF4RkZUU2l6ZTsKKyAgICB9CisKKyAgICAvLyBTdGFy
dCB1cCBiYWNrZ3JvdW5kIHRocmVhZAorICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8g
dXAgdGhlIHRocmVhZCBwcmlvcml0eSBoZXJlLiAgSXQgZG9lc24ndCBuZWVkIHRvIGJlIHJlYWwt
dGltZSwgYnV0IGhpZ2hlciB0aGFuIHRoZSBkZWZhdWx0Li4uCisgICAgaWYgKHRoaXMtPnVzZUJh
Y2tncm91bmRUaHJlYWRzKCkgJiYgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKSA+IDApCisgICAg
ICAgIG1fYmFja2dyb3VuZFRocmVhZCA9IGNyZWF0ZVRocmVhZChCYWNrZ3JvdW5kVGhyZWFkRGlz
cGF0Y2gsIHRoaXMsICJjb252b2x1dGlvbiBiYWNrZ3JvdW5kIHRocmVhZCIpOworICAgIGVsc2UK
KyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gMDsKK30KKworUmV2ZXJiQ29udm9sdmVyOjp+
UmV2ZXJiQ29udm9sdmVyKCkKK3sKKyAgICAvLyBXYWl0IGZvciBiYWNrZ3JvdW5kIHRocmVhZCB0
byBzdG9wCisgICAgaWYgKHVzZUJhY2tncm91bmRUaHJlYWRzKCkgJiYgbV9iYWNrZ3JvdW5kVGhy
ZWFkKSB7CisgICAgICAgIG1fd2FudHNUb0V4aXQgPSB0cnVlOworCisgICAgICAgIC8vIFdha2Ug
dXAgdGhyZWFkIHNvIGl0IGNhbiByZXR1cm4gLSBkb24ndCB1c2UgTXV0ZXhMb2NrZXIgc2luY2Ug
bG9jayBtdXN0IGJlIHVubG9ja2VkIGJlZm9yZSB3ZSBjYWxsIHdhaXRGb3JUaHJlYWRDb21wbGV0
aW9uKCkuCisgICAgICAgIG1fYmFja2dyb3VuZFRocmVhZExvY2subG9jaygpOworICAgICAgICBt
X21vcmVJbnB1dEJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29u
ZGl0aW9uLnNpZ25hbCgpOworICAgICAgICBtX2JhY2tncm91bmRUaHJlYWRMb2NrLnVubG9jaygp
OworCisgICAgICAgIHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKG1fYmFja2dyb3VuZFRocmVhZCwg
MCk7CisgICAgfQorfQorCit2b2lkIFJldmVyYkNvbnZvbHZlcjo6YmFja2dyb3VuZFRocmVhZEVu
dHJ5KCkKK3sKKyAgICB3aGlsZSAoIW1fd2FudHNUb0V4aXQpIHsKKyAgICAgICAgLy8gQ2hlY2sg
dG8gc2VlIGlmIHRoZXJlJ3MgYW55IG1vcmUgaW5wdXQgdG8gY29uc3VtZQorICAgICAgICBpbnQg
d3JpdGVJbmRleCA9IG1faW5wdXRCdWZmZXIud3JpdGVJbmRleCgpOworCisgICAgICAgIC8vIEV2
ZW4gdGhvdWdoIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIGV2ZXJ5IHN0YWdlIG5lZWRzIHRvIG1haW50
YWluIGl0cyBvd24gdmVyc2lvbiBvZiByZWFkSW5kZXggCisgICAgICAgIC8vIHdlIGRvIHRoaXMg
aW4gY2FzZSB3ZSB3YW50IHRvIHJ1biBpbiBtb3JlIHRoYW4gb25lIGJhY2tncm91bmQgdGhyZWFk
LgorICAgICAgICBpbnQgcmVhZEluZGV4OworCisgICAgICAgIHdoaWxlICgocmVhZEluZGV4ID0g
bV9iYWNrZ3JvdW5kU3RhZ2VzWzBdLT5pbnB1dFJlYWRJbmRleCgpKSAhPSB3cml0ZUluZGV4KSB7
IC8vIEZJWE1FOiBkbyBiZXR0ZXIgdG8gZGV0ZWN0IGJ1ZmZlciBvdmVycnVuLi4uCisgICAgICAg
ICAgICAvLyBGSVhNRTogcmVtb3ZlIGhhcmQtY29kZWQgdmFsdWUKKyAgICAgICAgICAgIGNvbnN0
IGludCBTbGljZVNpemUgPSAxMjg7CisKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJp
YnV0aW9ucyBmcm9tIGVhY2ggc3RhZ2UKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIG1fYmFj
a2dyb3VuZFN0YWdlc1tpXS0+cHJvY2Vzc0luQmFja2dyb3VuZCh0aGlzLCBTbGljZVNpemUpOwor
ICAgICAgICB9CisKKyAgICAgICAgLy8gV2FpdCBmb3IgcmVhbHRpbWUgdGhyZWFkIHRvIGdpdmUg
dXMgbW9yZSBpbnB1dAorICAgICAgICBtX21vcmVJbnB1dEJ1ZmZlcmVkID0gZmFsc2U7ICAgICAg
ICAKKyAgICAgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fYmFja2dyb3VuZFRocmVhZExvY2spOwor
ICAgICAgICB3aGlsZSAoIW1fbW9yZUlucHV0QnVmZmVyZWQpCisgICAgICAgICAgICBtX2JhY2tn
cm91bmRUaHJlYWRDb25kaXRpb24ud2FpdChtX2JhY2tncm91bmRUaHJlYWRMb2NrKTsKKyAgICB9
Cit9CisKK3NpemVfdCBSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VSZXNwb25zZUxlbmd0aCgpCit7
CisgICAgcmV0dXJuIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoOworfQorCit2b2lkIFJldmVyYkNv
bnZvbHZlcjo6cHJvY2VzcyhmbG9hdCogc291cmNlLCBmbG9hdCogZGVzdGluYXRpb24sIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgYm9vbCBpc1NhZmUgPSBzb3VyY2UgJiYgZGVzdGlu
YXRpb247CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAgaWYgKCFpc1NhZmUpCisgICAgICAgIHJl
dHVybjsKKworICAgIC8vIEZlZWQgaW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0aHJlYWRzKQor
ICAgIG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNlLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAg
Ly8gQWNjdW11bGF0ZSBjb250cmlidXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgIGZvciAoc2l6
ZV90IGkgPSAwOyBpIDwgbV9zdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fc3RhZ2VzW2ld
LT5wcm9jZXNzKHNvdXJjZSwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVh
ZCBmcm9tIGFjY3VtdWxhdGlvbiBidWZmZXIKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFk
QW5kQ2xlYXIoZGVzdGluYXRpb24sIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIAorICAgIC8v
IE5vdyB0aGF0IHdlJ3ZlIGJ1ZmZlcmVkIG1vcmUgaW5wdXQsIHdha2UgdXAgb3VyIGJhY2tncm91
bmQgdGhyZWFkLgorICAgIAorICAgIC8vIE5vdCB1c2luZyBhIE11dGV4TG9ja2VyIGxvb2tzIHN0
cmFuZ2UsIGJ1dCB3ZSB1c2UgYSB0cnlMb2NrKCkgaW5zdGVhZCBiZWNhdXNlIHRoaXMgaXMgcnVu
IG9uIHRoZSByZWFsLXRpbWUKKyAgICAvLyB0aHJlYWQgd2hlcmUgaXQgaXMgYSBkaXNhc3RlciBm
b3IgdGhlIGxvY2sgdG8gYmUgY29udGVuZGVkIChjYXVzZXMgYXVkaW8gZ2xpdGNoaW5nKS4gIEl0
J3MgT0sgaWYgd2UgZmFpbCB0bworICAgIC8vIHNpZ25hbCBmcm9tIHRpbWUgdG8gdGltZSwgc2lu
Y2Ugd2UnbGwgZ2V0IHRvIGl0IHRoZSBuZXh0IHRpbWUgd2UncmUgY2FsbGVkLiAgV2UncmUgY2Fs
bGVkIHJlcGVhdGVkbHkKKyAgICAvLyBhbmQgZnJlcXVlbnRseSAoYXJvdW5kIGV2ZXJ5IDNtcyku
ICBUaGUgYmFja2dyb3VuZCB0aHJlYWQgaXMgcHJvY2Vzc2luZyB3ZWxsIGludG8gdGhlIGZ1dHVy
ZSBhbmQgaGFzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiAKKyAgICAvLyBsZWV3YXkgaGVyZS4u
LgorICAgIGlmIChtX2JhY2tncm91bmRUaHJlYWRMb2NrLnRyeUxvY2soKSkgeworICAgICAgICBt
X21vcmVJbnB1dEJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29u
ZGl0aW9uLnNpZ25hbCgpOworICAgICAgICBtX2JhY2tncm91bmRUaHJlYWRMb2NrLnVubG9jaygp
OworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdl
c1tpXS0+cmVzZXQoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5k
U3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX2JhY2tncm91bmRTdGFnZXNbaV0tPnJlc2V0
KCk7CisKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZXNldCgpOworICAgIG1faW5wdXRCdWZm
ZXIucmVzZXQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMGY3YWViNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2
ZXJiQ29udm9sdmVyLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZl
cl9oCisjZGVmaW5lIFJldmVyYkNvbnZvbHZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJy
YXkuaCIKKyNpbmNsdWRlICJGRlRDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgorI2luY2x1
ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1
ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorI2luY2x1
ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdWRpb0No
YW5uZWw7CisKK2NsYXNzIFJldmVyYkNvbnZvbHZlciB7CitwdWJsaWM6CisgICAgLy8gbWF4RkZU
U2l6ZSBjYW4gYmUgYWRqdXN0ZWQgKGZyb20gc2F5IDIwNDggdG8gMzI3NjgpIGRlcGVuZGluZyBv
biBob3cgbXVjaCBwcmVjaXNpb24gaXMgbmVjZXNzYXJ5LgorICAgIC8vIEZvciBjZXJ0YWluIHR3
ZWFreSBkZS1jb252b2x2aW5nIGFwcGxpY2F0aW9ucyB0aGUgcGhhc2UgZXJyb3JzIGFkZCB1cCBx
dWlja2x5IGFuZCBsZWFkIHRvIG5vbi1zZW5zaWNhbCByZXN1bHRzIHdpdGgKKyAgICAvLyBsYXJn
ZXIgRkZUIHNpemVzIGFuZCBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0cy4gIEluIHRoZXNlIGNhc2Vz
IDIwNDggaXMgYSBnb29kIHNpemUuCisgICAgLy8gSWYgbm90IGRvaW5nIG11bHRpLXRocmVhZGVk
IGNvbnZvbHV0aW9uLCB0aGVuIHNob3VsZCBub3QgZ28gPiA4MTkyLgorICAgIFJldmVyYkNvbnZv
bHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6
ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252b2x2ZXJSZW5kZXJQaGFzZSwgYm9vbCB1
c2VCYWNrZ3JvdW5kVGhyZWFkcyk7CisKKyAgICB+UmV2ZXJiQ29udm9sdmVyKCk7CisKKyAgICB2
b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgZnJh
bWVzVG9Qcm9jZXNzKTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHNpemVfdCBpbXB1bHNl
UmVzcG9uc2VMZW5ndGgoKTsKKworICAgIFJldmVyYklucHV0QnVmZmVyKiBpbnB1dEJ1ZmZlcigp
IHsgcmV0dXJuICZtX2lucHV0QnVmZmVyOyB9CisKKyAgICBib29sIHVzZUJhY2tncm91bmRUaHJl
YWRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsgfQorCisgICAgdm9p
ZCBiYWNrZ3JvdW5kVGhyZWFkRW50cnkoKTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8T3duUHRy
PFJldmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fc3RhZ2VzOworICAgIFZlY3RvcjxPd25QdHI8UmV2
ZXJiQ29udm9sdmVyU3RhZ2U+ID4gbV9iYWNrZ3JvdW5kU3RhZ2VzOworICAgIHNpemVfdCBtX2lt
cHVsc2VSZXNwb25zZUxlbmd0aDsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBtX2Fj
Y3VtdWxhdGlvbkJ1ZmZlcjsKKworICAgIC8vIE9uZSBvciBtb3JlIGJhY2tncm91bmQgdGhyZWFk
cyByZWFkIGZyb20gdGhpcyBpbnB1dCBidWZmZXIgd2hpY2ggaXMgZmVkIGZyb20gdGhlIHJlYWx0
aW1lIHRocmVhZC4KKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciBtX2lucHV0QnVmZmVyOworCisgICAg
Ly8gV2UncmUgZ2l2ZW4gYSByZW5kZXJpbmcgaGludCwgc28gdGhlIEZGVHMgY2FuIGJlIG9wdGlt
aXplZCB0byBub3QgYWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAvLyAodmVyeSBiYWQg
d2hlbiByZW5kZXJpbmcgb24gYSByZWFsLXRpbWUgdGhyZWFkKS4KKyAgICBzaXplX3QgbV9yZW5k
ZXJTbGljZVNpemU7CisKKyAgICAvLyBGaXJzdCBzdGFnZSB3aWxsIGJlIG9mIHNpemUgbV9taW5G
RlRTaXplLiAgRWFjaCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2UgYXMgYmlnIHVudGlsIHdlIGhp
dCBtX21heEZGVFNpemUuCisgICAgc2l6ZV90IG1fbWluRkZUU2l6ZTsKKyAgICBzaXplX3QgbV9t
YXhGRlRTaXplOworCisgICAgLy8gQnV0IGRvbid0IGV4Y2VlZCB0aGlzIHNpemUgaW4gdGhlIHJl
YWwtdGltZSB0aHJlYWQgKGlmIHdlJ3JlIGRvaW5nIGJhY2tncm91bmQgcHJvY2Vzc2luZykuCisg
ICAgc2l6ZV90IG1fbWF4UmVhbHRpbWVGRlRTaXplOworCisgICAgLy8gQmFja2dyb3VuZCB0aHJl
YWQgYW5kIHN5bmNocm9uaXphdGlvbgorICAgIGJvb2wgbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsK
KyAgICBUaHJlYWRJZGVudGlmaWVyIG1fYmFja2dyb3VuZFRocmVhZDsKKyAgICBib29sIG1fd2Fu
dHNUb0V4aXQ7CisgICAgYm9vbCBtX21vcmVJbnB1dEJ1ZmZlcmVkOworICAgIG11dGFibGUgTXV0
ZXggbV9iYWNrZ3JvdW5kVGhyZWFkTG9jazsKKyAgICBtdXRhYmxlIFRocmVhZENvbmRpdGlvbiBt
X2JhY2tncm91bmRUaHJlYWRDb25kaXRpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBSZXZlcmJDb252b2x2ZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5mNjg3NzUzCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRp
by9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMu
ICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZy
b20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCIKKworI2luY2x1ZGUg
IkFjY2VsZXJhdGUuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCIKKyNp
bmNsdWRlICJSZXZlcmJDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJJbnB1dEJ1ZmZlci5o
IgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252
b2x2ZXJTdGFnZShmbG9hdCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VMZW5ndGgs
IHNpemVfdCByZXZlcmJUb3RhbExhdGVuY3ksIHNpemVfdCBzdGFnZU9mZnNldCwgc2l6ZV90IHN0
YWdlTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNp
emVfdCBmZnRTaXplLCBzaXplX3QgcmVuZGVyUGhhc2UsIHNpemVfdCByZW5kZXJTbGljZVNpemUs
IFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogYWNjdW11bGF0aW9uQnVmZmVyKQorICAgIDogbV9m
ZnRLZXJuZWwoZmZ0U2l6ZSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVmZmVyKGFjY3VtdWxhdGlv
bkJ1ZmZlcikKKyAgICAsIG1fYWNjdW11bGF0aW9uUmVhZEluZGV4KDApCisgICAgLCBtX2lucHV0
UmVhZEluZGV4KDApCisgICAgLCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aChyZXNwb25zZUxlbmd0
aCkKK3sKKyAgICBBU1NFUlQoaW1wdWxzZVJlc3BvbnNlKTsKKyAgICBBU1NFUlQoYWNjdW11bGF0
aW9uQnVmZmVyKTsKKyAgICAKKyAgICBtX2ZmdEtlcm5lbC5kb1BhZGRlZEZGVChpbXB1bHNlUmVz
cG9uc2UgKyBzdGFnZU9mZnNldCwgc3RhZ2VMZW5ndGgpOworCisgICAgbV9jb252b2x2ZXIgPSBu
ZXcgRkZUQ29udm9sdmVyKGZmdFNpemUpOworCisgICAgbV90ZW1wb3JhcnlCdWZmZXIuYWxsb2Nh
dGUocmVuZGVyU2xpY2VTaXplKTsKKworICAgIC8vIFRoZSBjb252b2x1dGlvbiBzdGFnZSBhdCBv
ZmZzZXQgc3RhZ2VPZmZzZXQgbmVlZHMgdG8gaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVsYXkgdG8g
Y2FuY2VsIG91dCB0aGUgb2Zmc2V0LgorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZz
ZXQgKyByZXZlcmJUb3RhbExhdGVuY3k7CisKKworICAgIC8vIEJ1dCwgdGhlIEZGVCBjb252b2x1
dGlvbiBpdHNlbGYgaW5jdXJzIGZmdFNpemUgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMg
b3V0Li4uCisgICAgc2l6ZV90IGhhbGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgQVNTRVJUKHRv
dGFsRGVsYXkgPj0gaGFsZlNpemUpOworICAgIGlmICh0b3RhbERlbGF5ID49IGhhbGZTaXplKQor
ICAgICAgICB0b3RhbERlbGF5IC09IGhhbGZTaXplOworCisgICAgLy8gV2UgZGl2aWRlIHVwIHRo
ZSB0b3RhbCBkZWxheSwgaW50byBwcmUgYW5kIHBvc3QgZGVsYXkgc2VjdGlvbnMgc28gdGhhdCB3
ZSBjYW4gc2NoZWR1bGUgYXQgZXhhY3RseSB0aGUgbW9tZW50IHdoZW4gdGhlIEZGVCB3aWxsIGhh
cHBlbi4KKyAgICAvLyBUaGlzIGlzIGNvb3JkaW5hdGVkIHdpdGggdGhlIG90aGVyIHN0YWdlcywg
c28gdGhleSBkb24ndCBhbGwgZG8gdGhlaXIgRkZUcyBhdCB0aGUgc2FtZSB0aW1lLi4uCisKKyAg
ICBpbnQgbWF4UHJlRGVsYXlMZW5ndGggPSBzdGQ6Om1pbihoYWxmU2l6ZSwgdG90YWxEZWxheSk7
CisgICAgbV9wcmVEZWxheUxlbmd0aCA9IHRvdGFsRGVsYXkgPiAwID8gcmVuZGVyUGhhc2UgJSBt
YXhQcmVEZWxheUxlbmd0aCA6IDA7CisKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IHRvdGFs
RGVsYXkpCisgICAgICAgIG1fcHJlRGVsYXlMZW5ndGggPSAwOworCisgICAgbV9wb3N0RGVsYXlM
ZW5ndGggPSB0b3RhbERlbGF5IC0gbV9wcmVEZWxheUxlbmd0aDsKKyAgICBtX3ByZVJlYWRXcml0
ZUluZGV4ID0gMDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7IC8vIHRvdGFsIGZyYW1lcyBw
cm9jZXNzZWQgc28gZmFyCisKKyAgICBtX3ByZURlbGF5QnVmZmVyLmFsbG9jYXRlKG1fcHJlRGVs
YXlMZW5ndGggPCBmZnRTaXplID8gZmZ0U2l6ZSA6IG1fcHJlRGVsYXlMZW5ndGgpOworfQorCit2
b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzSW5CYWNrZ3JvdW5kKFJldmVyYkNvbnZv
bHZlciogY29udm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIFJldmVyYklu
cHV0QnVmZmVyKiBpbnB1dEJ1ZmZlciA9IGNvbnZvbHZlci0+aW5wdXRCdWZmZXIoKTsKKyAgICBm
bG9hdCogc291cmNlID0gaW5wdXRCdWZmZXItPmRpcmVjdFJlYWRGcm9tKCZtX2lucHV0UmVhZElu
ZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIHByb2Nlc3Moc291cmNlLCBmcmFtZXNUb1Byb2Nl
c3MpOworfQorCit2b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzKGZsb2F0KiBzb3Vy
Y2UsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQVNTRVJUKHNvdXJjZSk7CisgICAg
aWYgKCFzb3VyY2UpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBEZWFsIHdpdGggcHJl
LWRlbGF5IHN0cmVhbSA6IG5vdGUgc3BlY2lhbCBoYW5kbGluZyBvZiB6ZXJvIGRlbGF5LgorCisg
ICAgZmxvYXQqIHByZURlbGF5ZWRTb3VyY2U7CisgICAgZmxvYXQqIHRlbXBvcmFyeUJ1ZmZlcjsK
KyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgLy8gSGFuZGxlcyBib3Ro
IHRoZSByZWFkIGNhc2UgKGNhbGwgdG8gcHJvY2VzcygpICkgYW5kIHRoZSB3cml0ZSBjYXNlICht
ZW1jcHkoKSApCisgICAgICAgIGJvb2wgaXNQcmVEZWxheVNhZmUgPSBtX3ByZVJlYWRXcml0ZUlu
ZGV4ICsgZnJhbWVzVG9Qcm9jZXNzIDw9IG1fcHJlRGVsYXlCdWZmZXIuc2l6ZSgpOworICAgICAg
ICBBU1NFUlQoaXNQcmVEZWxheVNhZmUpOworICAgICAgICBpZiAoIWlzUHJlRGVsYXlTYWZlKQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJvb2wgaXNUZW1wb3JhcnlCdWZmZXJTYWZl
ID0gZnJhbWVzVG9Qcm9jZXNzIDw9IG1fdGVtcG9yYXJ5QnVmZmVyLnNpemUoKTsKKyAgICAgICAg
QVNTRVJUKGlzVGVtcG9yYXJ5QnVmZmVyU2FmZSk7CisgICAgICAgIGlmICghaXNUZW1wb3JhcnlC
dWZmZXJTYWZlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHByZURlbGF5ZWRTb3Vy
Y2UgPSBtX3ByZURlbGF5QnVmZmVyLmRhdGEoKSArIG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAg
ICAgIHRlbXBvcmFyeUJ1ZmZlciA9IG1fdGVtcG9yYXJ5QnVmZmVyOyAgICAgICAgCisgICAgfSBl
bHNlIHsKKyAgICAgICAgLy8gWmVybyBkZWxheQorICAgICAgICBwcmVEZWxheWVkU291cmNlID0g
c291cmNlOworICAgICAgICB0ZW1wb3JhcnlCdWZmZXIgPSBtX3ByZURlbGF5QnVmZmVyLmRhdGEo
KTsKKyAgICAgICAgCisgICAgICAgIGJvb2wgaXNUZW1wb3JhcnlCdWZmZXJTYWZlID0gZnJhbWVz
VG9Qcm9jZXNzIDw9IG1fcHJlRGVsYXlCdWZmZXIuc2l6ZSgpOworICAgICAgICBBU1NFUlQoaXNU
ZW1wb3JhcnlCdWZmZXJTYWZlKTsKKyAgICAgICAgaWYgKCFpc1RlbXBvcmFyeUJ1ZmZlclNhZmUp
CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IHdyaXRlSW5kZXggPSAwOwor
CisgICAgaWYgKG1fZnJhbWVzUHJvY2Vzc2VkIDwgbV9wcmVEZWxheUxlbmd0aCkgeworICAgICAg
ICAvLyBGb3IgdGhlIGZpcnN0IG1fcHJlRGVsYXlMZW5ndGggZnJhbWVzIGRvbid0IHByb2Nlc3Mg
dGhlIGNvbnZvbHZlciwgaW5zdGVhZCBzaW1wbHkgYnVmZmVyIGluIHRoZSBwcmUtZGVsYXkuCisg
ICAgICAgIC8vIEJ1dCB3aGlsZSBidWZmZXJpbmcgdGhlIHByZS1kZWxheSwgd2Ugc3RpbGwgbmVl
ZCB0byB1cGRhdGUgb3VyIGluZGV4LgorICAgICAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci0+dXBk
YXRlUmVhZEluZGV4KCZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgZnJhbWVzVG9Qcm9jZXNzKTsK
KyAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3csIHJ1biB0aGUgY29udm9sdXRpb24gKGludG8g
dGhlIGRlbGF5IGJ1ZmZlcikuCisgICAgICAgIC8vIEFuIGV4cGVuc2l2ZSBGRlQgd2lsbCBoYXBw
ZW4gZXZlcnkgZmZ0U2l6ZSAvIDIgZnJhbWVzLgorICAgICAgICAvLyBXZSBwcm9jZXNzIGluLXBs
YWNlIGhlcmUuLi4KKyAgICAgICAgbV9jb252b2x2ZXItPnByb2Nlc3MoJm1fZmZ0S2VybmVsLCBw
cmVEZWxheWVkU291cmNlLCB0ZW1wb3JhcnlCdWZmZXIsIGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAg
ICAgICAgLy8gTm93IGFjY3VtdWxhdGUgaW50byByZXZlcmIncyBhY2N1bXVsYXRpb24gYnVmZmVy
LgorICAgICAgICB3cml0ZUluZGV4ID0gbV9hY2N1bXVsYXRpb25CdWZmZXItPmFjY3VtdWxhdGUo
dGVtcG9yYXJ5QnVmZmVyLCBmcmFtZXNUb1Byb2Nlc3MsICZtX2FjY3VtdWxhdGlvblJlYWRJbmRl
eCwgbV9wb3N0RGVsYXlMZW5ndGgpOworICAgIH0KKworICAgIC8vIEZpbmFsbHkgY29weSBpbnB1
dCB0byBwcmUtZGVsYXkuCisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAgICAg
IG1lbWNweShwcmVEZWxheWVkU291cmNlLCBzb3VyY2UsIHNpemVvZihmbG9hdCkgKiBmcmFtZXNU
b1Byb2Nlc3MpOworICAgICAgICBtX3ByZVJlYWRXcml0ZUluZGV4ICs9IGZyYW1lc1RvUHJvY2Vz
czsKKworICAgICAgICBBU1NFUlQobV9wcmVSZWFkV3JpdGVJbmRleCA8PSBtX3ByZURlbGF5TGVu
Z3RoKTsKKyAgICAgICAgaWYgKG1fcHJlUmVhZFdyaXRlSW5kZXggPj0gbV9wcmVEZWxheUxlbmd0
aCkKKyAgICAgICAgICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOworICAgIH0KKworICAgIG1f
ZnJhbWVzUHJvY2Vzc2VkICs9IGZyYW1lc1RvUHJvY2VzczsKK30KKwordm9pZCBSZXZlcmJDb252
b2x2ZXJTdGFnZTo6cmVzZXQoKQoreworICAgIG1fY29udm9sdmVyLT5yZXNldCgpOworICAgIG1f
cHJlRGVsYXlCdWZmZXIuemVybygpOworICAgIG1fYWNjdW11bGF0aW9uUmVhZEluZGV4ID0gMDsK
KyAgICBtX2lucHV0UmVhZEluZGV4ID0gMDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
YXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2
ZXJiQ29udm9sdmVyU3RhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44
ODM1MWFmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJD
b252b2x2ZXJTdGFnZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJB
UyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICog
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZl
clN0YWdlX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAorCisjaW5jbHVkZSAiQXVk
aW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAiRkZURnJhbWUuaCIKKyNpbmNsdWRlIDx3dGYvT3du
UHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyOworY2xhc3MgUmV2ZXJiQ29udm9sdmVyOworY2xhc3MgRkZUQ29udm9sdmVyOworICAg
IAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFnZSByZXByZXNlbnRzIHRoZSBjb252b2x1dGlvbiBh
c3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlvbiBvZiBhIGxhcmdlIGltcHVsc2UgcmVzcG9uc2Uu
CisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBsaW5lIHRvIGFjY291bnQgZm9yIHRoZSBvZmZz
ZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0aGUgbGFyZ2VyIGltcHVsc2UgcmVzcG9uc2Uu
CitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7CitwdWJsaWM6CisgICAgLy8gcmVuZGVyUGhh
c2UgaXMgdXNlZnVsIHRvIGtub3cgc28gdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgcHJlIHZl
cnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdpbGwgcGVyZm9ybQorICAgIC8vIHRoZWly
IGhlYXZ5IHdvcmsgKEZGVCBwcm9jZXNzaW5nKSBvbiBkaWZmZXJlbnQgc2xpY2VzIHRvIGJhbGFu
Y2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFkLgorICAgIFJldmVyYkNvbnZvbHZlclN0
YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90
IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5n
dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5k
ZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVy
KiBhY2N1bXVsYXRpb25CdWZmZXIpOworCisgICAgLy8gV0FSTklORzogZnJhbWVzVG9Qcm9jZXNz
IG11c3QgYmUgc3VjaCB0aGF0IGl0IGV2ZW5seSBkaXZpZGVzIHRoZSBkZWxheSBidWZmZXIgc2l6
ZSAoc3RhZ2Vfb2Zmc2V0KS4KKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZSwgc2l6ZV90
IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHByb2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJi
Q29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9p
ZCByZXNldCgpOworCisgICAgLy8gVXNlZnVsIGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcKKyAg
ICBpbnQgaW5wdXRSZWFkSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lucHV0UmVhZEluZGV4OyB9
CisKK3ByaXZhdGU6CisgICAgRkZURnJhbWUgbV9mZnRLZXJuZWw7CisgICAgT3duUHRyPEZGVENv
bnZvbHZlcj4gbV9jb252b2x2ZXI7CisKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9wcmVEZWxheUJ1
ZmZlcjsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciogbV9hY2N1bXVsYXRpb25CdWZm
ZXI7CisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZEluZGV4OworICAgIGludCBtX2lucHV0UmVh
ZEluZGV4OworCisgICAgc2l6ZV90IG1fcHJlRGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1fcG9z
dERlbGF5TGVuZ3RoOworICAgIHNpemVfdCBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgIHNpemVf
dCBtX2ZyYW1lc1Byb2Nlc3NlZDsKKworICAgIEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBvcmFyeUJ1
ZmZlcjsKKworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aDsKK307CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0ZmI3MQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNzkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZlcmJJbnB1dEJ1ZmZlcjo6UmV2ZXJiSW5wdXRCdWZm
ZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fd3JpdGVJ
bmRleCgwKQoreworfQorCit2b2lkIFJldmVyYklucHV0QnVmZmVyOjp3cml0ZShmbG9hdCogc291
cmNlUCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGgg
PSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9vbCBpc0NvcHlTYWZlID0gbV93cml0ZUluZGV4ICsg
bnVtYmVyT2ZGcmFtZXMgPD0gYnVmZmVyTGVuZ3RoOworICAgIEFTU0VSVChpc0NvcHlTYWZlKTsK
KyAgICBpZiAoIWlzQ29weVNhZmUpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgbWVt
Y3B5KG1fYnVmZmVyLmRhdGEoKSArIG1fd3JpdGVJbmRleCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0
KSAqIG51bWJlck9mRnJhbWVzKTsKKworICAgIG1fd3JpdGVJbmRleCArPSBudW1iZXJPZkZyYW1l
czsKKyAgICBBU1NFUlQobV93cml0ZUluZGV4IDw9IGJ1ZmZlckxlbmd0aCk7CisKKyAgICBpZiAo
bV93cml0ZUluZGV4ID49IGJ1ZmZlckxlbmd0aCkKKyAgICAgICAgbV93cml0ZUluZGV4ID0gMDsK
K30KKworZmxvYXQqIFJldmVyYklucHV0QnVmZmVyOjpkaXJlY3RSZWFkRnJvbShpbnQqIHJlYWRJ
bmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGgg
PSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9vbCBpc1BvaW50ZXJHb29kID0gKnJlYWRJbmRleCA+
PSAwICYmICpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAg
aWYgKCFpc1BvaW50ZXJHb29kKQorICAgICAgICBDUkFTSCgpOworICAgICAgICAKKyAgICBmbG9h
dCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIGZsb2F0KiBwID0gc291cmNlUCArICpyZWFkSW5k
ZXg7CisKKyAgICAvLyBVcGRhdGUgcmVhZEluZGV4CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZElu
ZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworCisgICAgcmV0dXJuIHA7Cit9
CisKK3ZvaWQgUmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KCkKK3sKKyAgICBtX2J1ZmZlci56ZXJv
KCk7CisgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oIGIv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWNmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmgKQEAgLTAsMCArMSw2NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
Zm5kZWYgUmV2ZXJiSW5wdXRCdWZmZXJfaAorI2RlZmluZSBSZXZlcmJJbnB1dEJ1ZmZlcl9oCisK
KyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBSZXZlcmJJbnB1dEJ1ZmZlciBpcyB1c2VkIHRvIGJ1ZmZlciBpbnB1dCBzYW1wbGVzIGZvciBk
ZWZlcnJlZCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZ3JvdW5kIHRocmVhZHMuCitjbGFzcyBSZXZl
cmJJbnB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxl
bmd0aCk7CisKKyAgICAvLyBUaGUgcmVhbHRpbWUgYXVkaW8gdGhyZWFkIGtlZXBzIHdyaXRpbmcg
c2FtcGxlcyBoZXJlLgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidz
IGxlbmd0aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IG51bWJlck9mRnJhbWVzIChmb3IgbmVhcmx5
IGFsbCBjYXNlcyB0aGlzIHdpbGwgYmUgZmluZSkuCisgICAgLy8gRklYTUU6IHJlbW92ZSBudW1i
ZXJPZkZyYW1lcyByZXN0cmljdGlvbi4uLgorICAgIHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJjZVAs
IHNpemVfdCBudW1iZXJPZkZyYW1lcyk7CisKKyAgICAvLyBCYWNrZ3JvdW5kIHRocmVhZHMgY2Fu
IGNhbGwgdGhpcyB0byBjaGVjayBpZiB0aGVyZSdzIGFueXRoaW5nIHRvIHJlYWQuLi4KKyAgICBz
aXplX3Qgd3JpdGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fd3JpdGVJbmRleDsgfQorCisgICAg
Ly8gVGhlIGluZGl2aWR1YWwgYmFja2dyb3VuZCB0aHJlYWRzIHJlYWQgaGVyZSAoYW5kIGhvcGUg
dGhhdCB0aGV5IGNhbiBrZWVwIHVwIHdpdGggdGhlIGJ1ZmZlciB3cml0aW5nKS4KKyAgICAvLyBy
ZWFkSW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IHJlYWRJbmRleCB0byByZWFkIGZyb20u
Li4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBidWZmZXIncyBsZW5ndGggaXMg
ZXZlbmx5IGRpdmlzaWJsZSBieSBudW1iZXJPZkZyYW1lcy4KKyAgICAvLyBGSVhNRTogcmVtb3Zl
IG51bWJlck9mRnJhbWVzIHJlc3RyaWN0aW9uLi4uCisgICAgZmxvYXQqIGRpcmVjdFJlYWRGcm9t
KGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpOworCisgICAgdm9pZCByZXNl
dCgpOworCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXpl
X3QgbV93cml0ZUluZGV4OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYg
Ly8gUmV2ZXJiSW5wdXRCdWZmZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51964</attachid>
            <date>2010-03-29 14:11:14 -0700</date>
            <delta_ts>2010-03-29 15:26:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100329141113.patch</filename>
            <type>text/plain</type>
            <size>41651</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmFhMDU1Mi4uZjYwODMxYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0yOSAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmJh
Y2tncm91bmRUaHJlYWRFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6On5S
ZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpiYWNr
Z3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpw
cm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQpOgorICAg
ICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAgICog
cGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dyb3Vu
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAgICAq
IHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAgICAg
KiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJ
bnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVy
Ojp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0yOSAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2ds
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwY2QxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKQEAgLTAs
MCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fcmVh
ZEluZGV4KDApCisgICAgLCBtX3JlYWRUaW1lRnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJB
Y2N1bXVsYXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVf
dCBudW1iZXJPZkZyYW1lcykKK3sKKyAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIu
c2l6ZSgpOworICAgIGJvb2wgaXNDb3B5U2FmZSA9IG1fcmVhZEluZGV4IDw9IGJ1ZmZlckxlbmd0
aCAmJiBudW1iZXJPZkZyYW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAgCisgICAgQVNTRVJUKGlz
Q29weVNhZmUpOworICAgIGlmICghaXNDb3B5U2FmZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
c2l6ZV90IGZyYW1lc0F2YWlsYWJsZSA9IGJ1ZmZlckxlbmd0aCAtIG1fcmVhZEluZGV4OworICAg
IHNpemVfdCBudW1iZXJPZkZyYW1lczEgPSBzdGQ6Om1pbihudW1iZXJPZkZyYW1lcywgZnJhbWVz
QXZhaWxhYmxlKTsKKyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMyID0gbnVtYmVyT2ZGcmFtZXMg
LSBudW1iZXJPZkZyYW1lczE7CisKKyAgICBmbG9hdCogc291cmNlID0gbV9idWZmZXI7CisgICAg
bWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UgKyBtX3JlYWRJbmRleCwgc2l6ZW9mKGZsb2F0KSAq
IG51bWJlck9mRnJhbWVzMSk7CisgICAgbWVtc2V0KHNvdXJjZSArIG1fcmVhZEluZGV4LCAwLCBz
aXplb2YoZmxvYXQpICogbnVtYmVyT2ZGcmFtZXMxKTsKKworICAgIC8vIEhhbmRsZSB3cmFwLWFy
b3VuZCBpZiBuZWNlc3NhcnkKKyAgICBpZiAobnVtYmVyT2ZGcmFtZXMyID4gMCkgeworICAgICAg
ICBtZW1jcHkoZGVzdGluYXRpb24gKyBudW1iZXJPZkZyYW1lczEsIHNvdXJjZSwgc2l6ZW9mKGZs
b2F0KSAqIG51bWJlck9mRnJhbWVzMik7CisgICAgICAgIG1lbXNldChzb3VyY2UsIDAsIHNpemVv
ZihmbG9hdCkgKiBudW1iZXJPZkZyYW1lczIpOworICAgIH0KKworICAgIG1fcmVhZEluZGV4ID0g
KG1fcmVhZEluZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworICAgIG1fcmVh
ZFRpbWVGcmFtZSArPSBudW1iZXJPZkZyYW1lczsKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9m
RnJhbWVzKSBjb25zdAoreworICAgIC8vIFVwZGF0ZSBjYWxsZXIncyByZWFkSW5kZXgKKyAgICAq
cmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBtX2J1ZmZlci5zaXpl
KCk7Cit9CisKK2ludCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUoZmxvYXQq
IHNvdXJjZSwgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBpbnQqIHJlYWRJbmRleCwgc2l6ZV90IGRl
bGF5RnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7
CisgICAgCisgICAgc2l6ZV90IHdyaXRlSW5kZXggPSAoKnJlYWRJbmRleCArIGRlbGF5RnJhbWVz
KSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIC8vIFVwZGF0ZSBjYWxsZXIncyByZWFkSW5kZXgKKyAg
ICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5n
dGg7CisKKyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gd3JpdGVJ
bmRleDsKKyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMxID0gc3RkOjptaW4obnVtYmVyT2ZGcmFt
ZXMsIGZyYW1lc0F2YWlsYWJsZSk7CisgICAgc2l6ZV90IG51bWJlck9mRnJhbWVzMiA9IG51bWJl
ck9mRnJhbWVzIC0gbnVtYmVyT2ZGcmFtZXMxOworCisgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0g
bV9idWZmZXI7CisKKyAgICBib29sIGlzU2FmZSA9IHdyaXRlSW5kZXggPD0gYnVmZmVyTGVuZ3Ro
ICYmIG51bWJlck9mRnJhbWVzMSArIHdyaXRlSW5kZXggPD0gYnVmZmVyTGVuZ3RoICYmIG51bWJl
ck9mRnJhbWVzMiA8PSBidWZmZXJMZW5ndGg7CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAgaWYg
KCFpc1NhZmUpCisgICAgICAgIHJldHVybiAwOworCisgICAgdmFkZChzb3VyY2UsIDEsIGRlc3Rp
bmF0aW9uICsgd3JpdGVJbmRleCwgMSwgZGVzdGluYXRpb24gKyB3cml0ZUluZGV4LCAxLCBudW1i
ZXJPZkZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vzc2FyeQor
ICAgIGlmIChudW1iZXJPZkZyYW1lczIgPiAwKSAgICAgICAKKyAgICAgICAgdmFkZChzb3VyY2Ug
KyBudW1iZXJPZkZyYW1lczEsIDEsIGRlc3RpbmF0aW9uLCAxLCBkZXN0aW5hdGlvbiwgMSwgbnVt
YmVyT2ZGcmFtZXMyKTsKKworICAgIHJldHVybiB3cml0ZUluZGV4OworfQorCit2b2lkIFJldmVy
YkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQoKQoreworICAgIG1fYnVmZmVyLnplcm8oKTsKKyAg
ICBtX3JlYWRJbmRleCA9IDA7CisgICAgbV9yZWFkVGltZUZyYW1lID0gMDsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRh
MDc3MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIp
IG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyX2gKKyNkZWZpbmUgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKKworI2lu
Y2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBpcyBhIGNpcmN1bGFyIGRlbGF5IGJ1ZmZlciB3aXRoIG9u
ZSBjbGllbnQgcmVhZGluZyBmcm9tIGl0IGFuZCBtdWx0aXBsZSBjbGllbnRzCisvLyB3cml0aW5n
L2FjY3VtdWxhdGluZyB0byBpdCBhdCBkaWZmZXJlbnQgZGVsYXkgb2Zmc2V0cyBmcm9tIHRoZSBy
ZWFkIHBvc2l0aW9uLiAgVGhlIHJlYWQgb3BlcmF0aW9uIHdpbGwgemVybyB0aGUgbWVtb3J5Cisv
LyBqdXN0IHJlYWQgZnJvbSB0aGUgYnVmZmVyLCBzbyBpdCB3aWxsIGJlIHJlYWR5IGZvciBhY2N1
bXVsYXRpb24gdGhlIG5leHQgdGltZSBhcm91bmQuCitjbGFzcyBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIgeworcHVibGljOgorICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3QgbGVu
Z3RoKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWFkIGZyb20sIHRoZW4gY2xlYXItb3V0IG51bWJl
ck9mRnJhbWVzCisgICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMpOworCisgICAgLy8gRWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSB3
aWxsIGFjY3VtdWxhdGUgaXRzIG91dHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgZGVsYXkgZnJvbSB0
aGUgcmVhZCBwb3NpdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW4gYW5kIHVwZGF0ZSBy
ZWFkSW5kZXggaGVyZSwgc2luY2UgZWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSBtYXkgYmUgcnVu
bmluZyBpbgorICAgIC8vIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSByZWFsdGltZSB0aHJl
YWQgY2FsbGluZyBSZWFkQW5kQ2xlYXIoKSBhbmQgbWFpbnRhaW5pbmcgbV9yZWFkSW5kZXgKKyAg
ICAvLyBSZXR1cm5zIHRoZSB3cml0ZUluZGV4IHdoZXJlIHRoZSBhY2N1bXVsYXRpb24gdG9vayBw
bGFjZQorICAgIGludCBhY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBudW1iZXJPZkZy
YW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcyk7CisKKyAgICBzaXplX3Qg
cmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkSW5kZXg7IH0KKyAgICB2b2lkIHVwZGF0
ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKSBjb25zdDsK
KworICAgIHNpemVfdCByZWFkVGltZUZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkVGltZUZy
YW1lOyB9CisKKyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFy
cmF5IG1fYnVmZmVyOworICAgIHNpemVfdCBtX3JlYWRJbmRleDsKKyAgICBzaXplX3QgbV9yZWFk
VGltZUZyYW1lOyAvLyBmb3IgZGVidWdnaW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5l
KQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJi
Q29udm9sdmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjAyYTA0Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCkBAIC0w
LDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZv
bHZlci5oIgorCisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIkF1ZGlvQnVzLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IElucHV0QnVmZmVyU2l6ZSA9IDgg
KiAxNjM4NDsKKworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhl
IGltcHVsc2UgcmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQuICBXZSBkb24ndCBleGNl
ZWQgdGhpcyBsZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwgdGhhdCB0aGUgYmFja2dyb3Vu
ZCB0aHJlYWQgaGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGluZyBzbG9wLgorLy8gRW1waXJp
Y2FsbHksIHRoaXMgaGFzIGJlZW4gZm91bmQgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2Vl
biBnaXZpbmcgZW5vdWdoIHRpbWUgZm9yIHNjaGVkdWxpbmcgc2xvcCwKKy8vIHdoaWxlIHN0aWxs
IG1pbmltaXppbmcgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIGRvbmUgaW4gdGhlIHByaW1hcnkg
KGhpZ2gtcHJpb3JpdHkpIHRocmVhZC4KKy8vIFRoaXMgd2FzIGZvdW5kIHRvIGJlIGEgZ29vZCB2
YWx1ZSBvbiBNYWMgT1MgWCwgYW5kIG1heSB3b3JrIHdlbGwgb24gb3RoZXIgcGxhdGZvcm1zIGFz
IHdlbGwsIGFzc3VtaW5nCisvLyB0aGUgdmVyeSByb3VnaCBzY2hlZHVsaW5nIGxhdGVuY2llcyBh
cmUgc2ltaWxhciBvbiB0aGVzZSB0aW1lLXNjYWxlcy4gIE9mIGNvdXJzZSwgdGhpcyBjb2RlIG1h
eSBuZWVkIHRvIGJlCisvLyB0dW5lZCBmb3IgaW5kaXZpZHVhbCBwbGF0Zm9ybXMgaWYgdGhpcyBh
c3N1bXB0aW9uIGlzIGZvdW5kIHRvIGJlIGluY29ycmVjdC4KK2NvbnN0IHNpemVfdCBSZWFsdGlt
ZUZyYW1lTGltaXQgPSA4MTkyICArIDQwOTY7IC8vIH4yNzhtc2VjIEAgNDQuMUtIegorCitjb25z
dCBzaXplX3QgTWluRkZUU2l6ZSA9IDI1NjsKK2NvbnN0IHNpemVfdCBNYXhSZWFsdGltZUZGVFNp
emUgPSAyMDQ4OworCitzdGF0aWMgdm9pZCogYmFja2dyb3VuZFRocmVhZEVudHJ5KHZvaWQqIHRo
cmVhZERhdGEpCit7CisgICAgUmV2ZXJiQ29udm9sdmVyKiByZXZlcmJDb252b2x2ZXIgPSBzdGF0
aWNfY2FzdDxSZXZlcmJDb252b2x2ZXIqPih0aHJlYWREYXRhKTsKKyAgICByZXZlcmJDb252b2x2
ZXItPmJhY2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAwOworfQorCitSZXZlcmJD
b252b2x2ZXI6OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwg
c2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252b2x2
ZXJSZW5kZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICA6IG1faW1wdWxz
ZVJlc3BvbnNlTGVuZ3RoKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkpCisgICAgLCBtX2Fj
Y3VtdWxhdGlvbkJ1ZmZlcihpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpICsgcmVuZGVyU2xp
Y2VTaXplKQorICAgICwgbV9pbnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNpemUpCisgICAgLCBtX3Jl
bmRlclNsaWNlU2l6ZShyZW5kZXJTbGljZVNpemUpCisgICAgLCBtX21pbkZGVFNpemUoTWluRkZU
U2l6ZSkgLy8gRmlyc3Qgc3RhZ2Ugd2lsbCBoYXZlIHRoaXMgc2l6ZSAtIHN1Y2Nlc3NpdmUgc3Rh
Z2VzIHdpbGwgZG91YmxlIGluIHNpemUgZWFjaCB0aW1lCisgICAgLCBtX21heEZGVFNpemUobWF4
RkZUU2l6ZSkgLy8gdW50aWwgd2UgaGl0IG1fbWF4RkZUU2l6ZQorICAgICwgbV91c2VCYWNrZ3Jv
dW5kVGhyZWFkcyh1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICAsIG1fYmFja2dyb3VuZFRocmVh
ZCgwKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKKyAgICAsIG1fbW9yZUlucHV0QnVmZmVy
ZWQoZmFsc2UpCit7CisgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcyB0
aGVuIGRvbid0IGV4Y2VlZCB0aGlzIEZGVCBzaXplIGZvciB0aGUKKyAgICAvLyBzdGFnZXMgd2hp
Y2ggcnVuIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkLiAgVGhpcyBhdm9pZHMgaGF2aW5nIG9ubHkg
b25lIG9yIHR3bworICAgIC8vIGxhcmdlIHN0YWdlcyAoc2l6ZSAxNjM4NCBvciBzbykgYXQgdGhl
IGVuZCB3aGljaCB0YWtlIGEgbG90IG9mIHRpbWUgZXZlcnkgc2V2ZXJhbAorICAgIC8vIHByb2Nl
c3Npbmcgc2xpY2VzLiAgVGhpcyB3YXkgd2UgYW1vcnRpemUgdGhlIGNvc3Qgb3ZlciBtb3JlIHBy
b2Nlc3Npbmcgc2xpY2VzLgorICAgIG1fbWF4UmVhbHRpbWVGRlRTaXplID0gTWF4UmVhbHRpbWVG
RlRTaXplOworCisgICAgLy8gRm9yIHRoZSBtb21lbnQsIGEgZ29vZCB3YXkgdG8ga25vdyBpZiB3
ZSBoYXZlIHJlYWwtdGltZSBjb25zdHJhaW50IGlzIHRvIGNoZWNrIGlmIHdlJ3JlIHVzaW5nIGJh
Y2tncm91bmQgdGhyZWFkcy4KKyAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSB3ZSdyZSBiZWluZyBy
dW4gZnJvbSBhIGNvbW1hbmQtbGluZSB0b29sLgorICAgIGJvb2wgaGFzUmVhbHRpbWVDb25zdHJh
aW50ID0gdXNlQmFja2dyb3VuZFRocmVhZHM7CisKKyAgICBmbG9hdCogcmVzcG9uc2UgPSBpbXB1
bHNlUmVzcG9uc2UtPmRhdGEoKTsKKyAgICBzaXplX3QgdG90YWxSZXNwb25zZUxlbmd0aCA9IGlt
cHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCk7CisKKyAgICAvLyBCZWNhdXNlIHdlJ3JlIG5vdCB1
c2luZyBkaXJlY3QtY29udm9sdXRpb24gaW4gdGhlIGxlYWRpbmcgcG9ydGlvbiwgdGhlIHJldmVy
YiBoYXMgYW4gb3ZlcmFsbCBsYXRlbmN5IG9mIGhhbGYgdGhlIGZpcnN0LXN0YWdlIEZGVCBzaXpl
CisgICAgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSA9IG1fbWluRkZUU2l6ZSAvIDI7CisKKyAg
ICBzaXplX3Qgc3RhZ2VPZmZzZXQgPSAwOworICAgIGludCBpID0gMDsKKyAgICBzaXplX3QgZmZ0
U2l6ZSA9IG1fbWluRkZUU2l6ZTsKKyAgICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3Bv
bnNlTGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKwor
ICAgICAgICAvLyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCBzdGFnZU9m
ZnNldCBpcyBzdWNoIHRoYXQgd2UncmUgc3RyYWRkbGluZyB0aGUgZW5kCisgICAgICAgIC8vIG9m
IHRoZSBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciAoaWYgd2UgdXNlIHN0YWdlU2l6ZSksIHNvIHJl
ZHVjZSB0aGUgbGFzdCBzdGFnZSdzIGxlbmd0aC4uLgorICAgICAgICBpZiAoc3RhZ2VTaXplICsg
c3RhZ2VPZmZzZXQgPiB0b3RhbFJlc3BvbnNlTGVuZ3RoKQorICAgICAgICAgICAgc3RhZ2VTaXpl
ID0gdG90YWxSZXNwb25zZUxlbmd0aCAtIHN0YWdlT2Zmc2V0OworCisgICAgICAgIC8vIFRoaXMg
InN0YWdnZXJzIiB0aGUgdGltZSB3aGVuIGVhY2ggRkZUIGhhcHBlbnMgc28gdGhleSBkb24ndCBh
bGwgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgaW50IHJlbmRlclBoYXNlID0gY29u
dm9sdmVyUmVuZGVyUGhhc2UgKyBpICogcmVuZGVyU2xpY2VTaXplOworCisgICAgICAgIE93blB0
cjxSZXZlcmJDb252b2x2ZXJTdGFnZT4gc3RhZ2UobmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJl
c3BvbnNlLCB0b3RhbFJlc3BvbnNlTGVuZ3RoLCByZXZlcmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zm
c2V0LCBzdGFnZVNpemUsIGZmdFNpemUsIHJlbmRlclBoYXNlLCByZW5kZXJTbGljZVNpemUsICZt
X2FjY3VtdWxhdGlvbkJ1ZmZlcikpOworCisgICAgICAgIGJvb2wgaXNCYWNrZ3JvdW5kU3RhZ2Ug
PSBmYWxzZTsKKworICAgICAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBz
dGFnZU9mZnNldCA+IFJlYWx0aW1lRnJhbWVMaW1pdCkgeworICAgICAgICAgICAgbV9iYWNrZ3Jv
dW5kU3RhZ2VzLmFwcGVuZChzdGFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgaXNCYWNrZ3Jv
dW5kU3RhZ2UgPSB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fc3RhZ2VzLmFw
cGVuZChzdGFnZS5yZWxlYXNlKCkpOworCisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6
ZTsKKyAgICAgICAgKytpOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQor
ICAgICAgICBmZnRTaXplICo9IDI7CisgICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQg
JiYgIWlzQmFja2dyb3VuZFN0YWdlICYmIGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkK
KyAgICAgICAgICAgIGZmdFNpemUgPSBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYg
KGZmdFNpemUgPiBtX21heEZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRT
aXplOworICAgIH0KKworICAgIC8vIFN0YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8g
RklYTUU6IHdvdWxkIGJlIGJldHRlciB0byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJ
dCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVhbC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1
bHQuLi4KKyAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91
bmRTdGFnZXMuc2l6ZSgpID4gMCkKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gY3JlYXRl
VGhyZWFkKFdlYkNvcmU6OmJhY2tncm91bmRUaHJlYWRFbnRyeSwgdGhpcywgImNvbnZvbHV0aW9u
IGJhY2tncm91bmQgdGhyZWFkIik7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZv
bHZlcigpCit7CisgICAgLy8gV2FpdCBmb3IgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAg
IGlmICh1c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFRocmVhZCkgeworICAg
ICAgICBtX3dhbnRzVG9FeGl0ID0gdHJ1ZTsKKworICAgICAgICAvLyBXYWtlIHVwIHRocmVhZCBz
byBpdCBjYW4gcmV0dXJuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tl
cihtX2JhY2tncm91bmRUaHJlYWRMb2NrKTsKKyAgICAgICAgICAgIG1fbW9yZUlucHV0QnVmZmVy
ZWQgPSB0cnVlOworICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25h
bCgpOworICAgICAgICB9CisKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24obV9iYWNr
Z3JvdW5kVGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpiYWNr
Z3JvdW5kVGhyZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhpdCkgeworICAg
ICAgICAvLyBXYWl0IGZvciByZWFsdGltZSB0aHJlYWQgdG8gZ2l2ZSB1cyBtb3JlIGlucHV0Cisg
ICAgICAgIG1fbW9yZUlucHV0QnVmZmVyZWQgPSBmYWxzZTsgICAgICAgIAorICAgICAgICB7Cisg
ICAgICAgICAgICBNdXRleExvY2tlciBsb2NrZXIobV9iYWNrZ3JvdW5kVGhyZWFkTG9jayk7Cisg
ICAgICAgICAgICB3aGlsZSAoIW1fbW9yZUlucHV0QnVmZmVyZWQgJiYgIW1fd2FudHNUb0V4aXQp
CisgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLndhaXQobV9iYWNr
Z3JvdW5kVGhyZWFkTG9jayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGFsbCBv
ZiB0aGUgc3RhZ2VzIHVudGlsIHRoZWlyIHJlYWQgaW5kaWNlcyByZWFjaCB0aGUgaW5wdXQgYnVm
ZmVyJ3Mgd3JpdGUgaW5kZXgKKyAgICAgICAgaW50IHdyaXRlSW5kZXggPSBtX2lucHV0QnVmZmVy
LndyaXRlSW5kZXgoKTsKKworICAgICAgICAvLyBFdmVuIHRob3VnaCBpdCBkb2Vzbid0IHNlZW0g
bGlrZSBldmVyeSBzdGFnZSBuZWVkcyB0byBtYWludGFpbiBpdHMgb3duIHZlcnNpb24gb2YgcmVh
ZEluZGV4IAorICAgICAgICAvLyB3ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4g
bW9yZSB0aGFuIG9uZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsK
KworICAgICAgICB3aGlsZSAoKHJlYWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5w
dXRSZWFkSW5kZXgoKSkgIT0gd3JpdGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRl
dGVjdCBidWZmZXIgb3ZlcnJ1bi4uLgorICAgICAgICAgICAgLy8gVGhlIFJldmVyYkNvbnZvbHZl
clN0YWdlcyBuZWVkIHRvIHByb2Nlc3MgaW4gYW1vdW50cyB3aGljaCBldmVubHkgZGl2aWRlIGhh
bGYgdGhlIEZGVCBzaXplCisgICAgICAgICAgICBjb25zdCBpbnQgU2xpY2VTaXplID0gTWluRkZU
U2l6ZSAvIDI7CisKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9t
IGVhY2ggc3RhZ2UKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3Jv
dW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdl
c1tpXS0+cHJvY2Vzc0luQmFja2dyb3VuZCh0aGlzLCBTbGljZVNpemUpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIFJldmVyYkNvbnZvbHZlcjo6cHJvY2VzcyhmbG9hdCogc291cmNlLCBm
bG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgYm9vbCBp
c1NhZmUgPSBzb3VyY2UgJiYgZGVzdGluYXRpb247CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAg
aWYgKCFpc1NhZmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZlZWQgaW5wdXQgYnVmZmVy
IChyZWFkIGJ5IGFsbCB0aHJlYWRzKQorICAgIG1faW5wdXRCdWZmZXIud3JpdGUoc291cmNlLCBm
cmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gQWNjdW11bGF0ZSBjb250cmlidXRpb25zIGZyb20g
ZWFjaCBzdGFnZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdGFnZXMuc2l6ZSgpOyAr
K2kpCisgICAgICAgIG1fc3RhZ2VzW2ldLT5wcm9jZXNzKHNvdXJjZSwgZnJhbWVzVG9Qcm9jZXNz
KTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBmcm9tIGFjY3VtdWxhdGlvbiBidWZmZXIKKyAgICBt
X2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5kQ2xlYXIoZGVzdGluYXRpb24sIGZyYW1lc1RvUHJv
Y2Vzcyk7CisgICAgICAgIAorICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGJ1ZmZlcmVkIG1vcmUgaW5w
dXQsIHdha2UgdXAgb3VyIGJhY2tncm91bmQgdGhyZWFkLgorICAgIAorICAgIC8vIE5vdCB1c2lu
ZyBhIE11dGV4TG9ja2VyIGxvb2tzIHN0cmFuZ2UsIGJ1dCB3ZSB1c2UgYSB0cnlMb2NrKCkgaW5z
dGVhZCBiZWNhdXNlIHRoaXMgaXMgcnVuIG9uIHRoZSByZWFsLXRpbWUKKyAgICAvLyB0aHJlYWQg
d2hlcmUgaXQgaXMgYSBkaXNhc3RlciBmb3IgdGhlIGxvY2sgdG8gYmUgY29udGVuZGVkIChjYXVz
ZXMgYXVkaW8gZ2xpdGNoaW5nKS4gIEl0J3MgT0sgaWYgd2UgZmFpbCB0bworICAgIC8vIHNpZ25h
bCBmcm9tIHRpbWUgdG8gdGltZSwgc2luY2Ugd2UnbGwgZ2V0IHRvIGl0IHRoZSBuZXh0IHRpbWUg
d2UncmUgY2FsbGVkLiAgV2UncmUgY2FsbGVkIHJlcGVhdGVkbHkKKyAgICAvLyBhbmQgZnJlcXVl
bnRseSAoYXJvdW5kIGV2ZXJ5IDNtcykuICBUaGUgYmFja2dyb3VuZCB0aHJlYWQgaXMgcHJvY2Vz
c2luZyB3ZWxsIGludG8gdGhlIGZ1dHVyZSBhbmQgaGFzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBv
ZiAKKyAgICAvLyBsZWV3YXkgaGVyZS4uLgorICAgIGlmIChtX2JhY2tncm91bmRUaHJlYWRMb2Nr
LnRyeUxvY2soKSkgeworICAgICAgICBtX21vcmVJbnB1dEJ1ZmZlcmVkID0gdHJ1ZTsKKyAgICAg
ICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICBtX2JhY2tn
cm91bmRUaHJlYWRMb2NrLnVubG9jaygpOworICAgIH0KK30KKwordm9pZCBSZXZlcmJDb252b2x2
ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fc3RhZ2VzLnNpemUo
KTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX2Jh
Y2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5y
ZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2
ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhMTA5NwotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKQEAgLTAsMCArMSw5NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEu
ICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29t
cHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
CisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
QU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
CisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBP
TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVyX2gKKwor
I2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1ZGUgIkZGVENvbnZvbHZlci5oIgor
I2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1ZGUgIlJldmVyYkNv
bnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKyNpbmNsdWRl
IDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3
dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xhc3MgUmV2ZXJiQ29udm9sdmVyIHsK
K3B1YmxpYzoKKyAgICAvLyBtYXhGRlRTaXplIGNhbiBiZSBhZGp1c3RlZCAoZnJvbSBzYXkgMjA0
OCB0byAzMjc2OCkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHByZWNpc2lvbiBpcyBuZWNlc3Nhcnku
CisgICAgLy8gRm9yIGNlcnRhaW4gdHdlYWt5IGRlLWNvbnZvbHZpbmcgYXBwbGljYXRpb25zIHRo
ZSBwaGFzZSBlcnJvcnMgYWRkIHVwIHF1aWNrbHkgYW5kIGxlYWQgdG8gbm9uLXNlbnNpY2FsIHJl
c3VsdHMgd2l0aAorICAgIC8vIGxhcmdlciBGRlQgc2l6ZXMgYW5kIHNpbmdsZS1wcmVjaXNpb24g
ZmxvYXRzLiAgSW4gdGhlc2UgY2FzZXMgMjA0OCBpcyBhIGdvb2Qgc2l6ZS4KKyAgICAvLyBJZiBu
b3QgZG9pbmcgbXVsdGktdGhyZWFkZWQgY29udm9sdXRpb24sIHRoZW4gc2hvdWxkIG5vdCBnbyA+
IDgxOTIuCisgICAgUmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hhbm5lbCogaW1wdWxzZVJlc3BvbnNl
LCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4RkZUU2l6ZSwgc2l6ZV90IGNvbnZv
bHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJhY2tncm91bmRUaHJlYWRzKTsKKyAgICB+UmV2ZXJi
Q29udm9sdmVyKCk7CisKKyAgICB2b2lkIHByb2Nlc3MoZmxvYXQqIHNvdXJjZSwgZmxvYXQqIGRl
c3RpbmF0aW9uLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICB2b2lkIHJlc2V0KCk7CisK
KyAgICBzaXplX3QgaW1wdWxzZVJlc3BvbnNlTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pbXB1
bHNlUmVzcG9uc2VMZW5ndGg7IH0KKworICAgIFJldmVyYklucHV0QnVmZmVyKiBpbnB1dEJ1ZmZl
cigpIHsgcmV0dXJuICZtX2lucHV0QnVmZmVyOyB9CisKKyAgICBib29sIHVzZUJhY2tncm91bmRU
aHJlYWRzKCkgY29uc3QgeyByZXR1cm4gbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsgfQorICAgIHZv
aWQgYmFja2dyb3VuZFRocmVhZEVudHJ5KCk7CisKK3ByaXZhdGU6CisgICAgVmVjdG9yPE93blB0
cjxSZXZlcmJDb252b2x2ZXJTdGFnZT4gPiBtX3N0YWdlczsKKyAgICBWZWN0b3I8T3duUHRyPFJl
dmVyYkNvbnZvbHZlclN0YWdlPiA+IG1fYmFja2dyb3VuZFN0YWdlczsKKyAgICBzaXplX3QgbV9p
bXB1bHNlUmVzcG9uc2VMZW5ndGg7CisKKyAgICBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIgbV9h
Y2N1bXVsYXRpb25CdWZmZXI7CisKKyAgICAvLyBPbmUgb3IgbW9yZSBiYWNrZ3JvdW5kIHRocmVh
ZHMgcmVhZCBmcm9tIHRoaXMgaW5wdXQgYnVmZmVyIHdoaWNoIGlzIGZlZCBmcm9tIHRoZSByZWFs
dGltZSB0aHJlYWQuCisgICAgUmV2ZXJiSW5wdXRCdWZmZXIgbV9pbnB1dEJ1ZmZlcjsKKworICAg
IC8vIFdlJ3JlIGdpdmVuIGEgcmVuZGVyaW5nIGhpbnQsIHNvIHRoZSBGRlRzIGNhbiBiZSBvcHRp
bWl6ZWQgdG8gbm90IGFsbCBvY2N1ciBhdCB0aGUgc2FtZSB0aW1lCisgICAgLy8gKHZlcnkgYmFk
IHdoZW4gcmVuZGVyaW5nIG9uIGEgcmVhbC10aW1lIHRocmVhZCkuCisgICAgc2l6ZV90IG1fcmVu
ZGVyU2xpY2VTaXplOworCisgICAgLy8gRmlyc3Qgc3RhZ2Ugd2lsbCBiZSBvZiBzaXplIG1fbWlu
RkZUU2l6ZS4gIEVhY2ggbmV4dCBzdGFnZSB3aWxsIGJlIHR3aWNlIGFzIGJpZyB1bnRpbCB3ZSBo
aXQgbV9tYXhGRlRTaXplLgorICAgIHNpemVfdCBtX21pbkZGVFNpemU7CisgICAgc2l6ZV90IG1f
bWF4RkZUU2l6ZTsKKworICAgIC8vIEJ1dCBkb24ndCBleGNlZWQgdGhpcyBzaXplIGluIHRoZSBy
ZWFsLXRpbWUgdGhyZWFkIChpZiB3ZSdyZSBkb2luZyBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcpLgor
ICAgIHNpemVfdCBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKworICAgIC8vIEJhY2tncm91bmQgdGhy
ZWFkIGFuZCBzeW5jaHJvbml6YXRpb24KKyAgICBib29sIG1fdXNlQmFja2dyb3VuZFRocmVhZHM7
CisgICAgVGhyZWFkSWRlbnRpZmllciBtX2JhY2tncm91bmRUaHJlYWQ7CisgICAgYm9vbCBtX3dh
bnRzVG9FeGl0OworICAgIGJvb2wgbV9tb3JlSW5wdXRCdWZmZXJlZDsKKyAgICBtdXRhYmxlIE11
dGV4IG1fYmFja2dyb3VuZFRocmVhZExvY2s7CisgICAgbXV0YWJsZSBUaHJlYWRDb25kaXRpb24g
bV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gUmV2ZXJiQ29udm9sdmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9h
dWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uN2E4YjY4MQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5j
LiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBm
cm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENP
TlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlclN0YWdlLmgiCisKKyNpbmNsdWRl
ICJBY2NlbGVyYXRlLmgiCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmgiCisj
aW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIu
aCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZlcmJDb252b2x2ZXJTdGFnZTo6UmV2ZXJiQ29u
dm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlTGVuZ3Ro
LCBzaXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5LCBzaXplX3Qgc3RhZ2VPZmZzZXQsIHNpemVfdCBz
dGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz
aXplX3QgZmZ0U2l6ZSwgc2l6ZV90IHJlbmRlclBoYXNlLCBzaXplX3QgcmVuZGVyU2xpY2VTaXpl
LCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtdWxhdGlvbkJ1ZmZlcikKKyAgICA6IG1f
ZmZ0S2VybmVsKGZmdFNpemUpCisgICAgLCBtX2FjY3VtdWxhdGlvbkJ1ZmZlcihhY2N1bXVsYXRp
b25CdWZmZXIpCisgICAgLCBtX2FjY3VtdWxhdGlvblJlYWRJbmRleCgwKQorICAgICwgbV9pbnB1
dFJlYWRJbmRleCgwKQorICAgICwgbV9pbXB1bHNlUmVzcG9uc2VMZW5ndGgocmVzcG9uc2VMZW5n
dGgpCit7CisgICAgQVNTRVJUKGltcHVsc2VSZXNwb25zZSk7CisgICAgQVNTRVJUKGFjY3VtdWxh
dGlvbkJ1ZmZlcik7CisgICAgCisgICAgbV9mZnRLZXJuZWwuZG9QYWRkZWRGRlQoaW1wdWxzZVJl
c3BvbnNlICsgc3RhZ2VPZmZzZXQsIHN0YWdlTGVuZ3RoKTsKKyAgICBtX2NvbnZvbHZlciA9IG5l
dyBGRlRDb252b2x2ZXIoZmZ0U2l6ZSk7CisgICAgbV90ZW1wb3JhcnlCdWZmZXIuYWxsb2NhdGUo
cmVuZGVyU2xpY2VTaXplKTsKKworICAgIC8vIFRoZSBjb252b2x1dGlvbiBzdGFnZSBhdCBvZmZz
ZXQgc3RhZ2VPZmZzZXQgbmVlZHMgdG8gaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZGVsYXkgdG8gY2Fu
Y2VsIG91dCB0aGUgb2Zmc2V0LgorICAgIHNpemVfdCB0b3RhbERlbGF5ID0gc3RhZ2VPZmZzZXQg
KyByZXZlcmJUb3RhbExhdGVuY3k7CisKKyAgICAvLyBCdXQsIHRoZSBGRlQgY29udm9sdXRpb24g
aXRzZWxmIGluY3VycyBmZnRTaXplIC8gMiBsYXRlbmN5LCBzbyBzdWJ0cmFjdCB0aGlzIG91dC4u
LgorICAgIHNpemVfdCBoYWxmU2l6ZSA9IGZmdFNpemUgLyAyOworICAgIEFTU0VSVCh0b3RhbERl
bGF5ID49IGhhbGZTaXplKTsKKyAgICBpZiAodG90YWxEZWxheSA+PSBoYWxmU2l6ZSkKKyAgICAg
ICAgdG90YWxEZWxheSAtPSBoYWxmU2l6ZTsKKworICAgIC8vIFdlIGRpdmlkZSB1cCB0aGUgdG90
YWwgZGVsYXksIGludG8gcHJlIGFuZCBwb3N0IGRlbGF5IHNlY3Rpb25zIHNvIHRoYXQgd2UgY2Fu
IHNjaGVkdWxlIGF0IGV4YWN0bHkgdGhlIG1vbWVudCB3aGVuIHRoZSBGRlQgd2lsbCBoYXBwZW4u
CisgICAgLy8gVGhpcyBpcyBjb29yZGluYXRlZCB3aXRoIHRoZSBvdGhlciBzdGFnZXMsIHNvIHRo
ZXkgZG9uJ3QgYWxsIGRvIHRoZWlyIEZGVHMgYXQgdGhlIHNhbWUgdGltZS4uLgorICAgIGludCBt
YXhQcmVEZWxheUxlbmd0aCA9IHN0ZDo6bWluKGhhbGZTaXplLCB0b3RhbERlbGF5KTsKKyAgICBt
X3ByZURlbGF5TGVuZ3RoID0gdG90YWxEZWxheSA+IDAgPyByZW5kZXJQaGFzZSAlIG1heFByZURl
bGF5TGVuZ3RoIDogMDsKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IHRvdGFsRGVsYXkpCisg
ICAgICAgIG1fcHJlRGVsYXlMZW5ndGggPSAwOworCisgICAgbV9wb3N0RGVsYXlMZW5ndGggPSB0
b3RhbERlbGF5IC0gbV9wcmVEZWxheUxlbmd0aDsKKyAgICBtX3ByZVJlYWRXcml0ZUluZGV4ID0g
MDsKKyAgICBtX2ZyYW1lc1Byb2Nlc3NlZCA9IDA7IC8vIHRvdGFsIGZyYW1lcyBwcm9jZXNzZWQg
c28gZmFyCisKKyAgICBtX3ByZURlbGF5QnVmZmVyLmFsbG9jYXRlKG1fcHJlRGVsYXlMZW5ndGgg
PCBmZnRTaXplID8gZmZ0U2l6ZSA6IG1fcHJlRGVsYXlMZW5ndGgpOworfQorCit2b2lkIFJldmVy
YkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzSW5CYWNrZ3JvdW5kKFJldmVyYkNvbnZvbHZlciogY29u
dm9sdmVyLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIFJldmVyYklucHV0QnVmZmVy
KiBpbnB1dEJ1ZmZlciA9IGNvbnZvbHZlci0+aW5wdXRCdWZmZXIoKTsKKyAgICBmbG9hdCogc291
cmNlID0gaW5wdXRCdWZmZXItPmRpcmVjdFJlYWRGcm9tKCZtX2lucHV0UmVhZEluZGV4LCBmcmFt
ZXNUb1Byb2Nlc3MpOworICAgIHByb2Nlc3Moc291cmNlLCBmcmFtZXNUb1Byb2Nlc3MpOworfQor
Cit2b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpwcm9jZXNzKGZsb2F0KiBzb3VyY2UsIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgQVNTRVJUKHNvdXJjZSk7CisgICAgaWYgKCFzb3Vy
Y2UpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBEZWFsIHdpdGggcHJlLWRlbGF5IHN0
cmVhbSA6IG5vdGUgc3BlY2lhbCBoYW5kbGluZyBvZiB6ZXJvIGRlbGF5LgorCisgICAgZmxvYXQq
IHByZURlbGF5ZWRTb3VyY2U7CisgICAgZmxvYXQqIHRlbXBvcmFyeUJ1ZmZlcjsKKyAgICBib29s
IGlzVGVtcG9yYXJ5QnVmZmVyU2FmZSA9IGZhbHNlOworICAgIGlmIChtX3ByZURlbGF5TGVuZ3Ro
ID4gMCkgeworICAgICAgICAvLyBIYW5kbGVzIGJvdGggdGhlIHJlYWQgY2FzZSAoY2FsbCB0byBw
cm9jZXNzKCkgKSBhbmQgdGhlIHdyaXRlIGNhc2UgKG1lbWNweSgpICkKKyAgICAgICAgYm9vbCBp
c1ByZURlbGF5U2FmZSA9IG1fcHJlUmVhZFdyaXRlSW5kZXggKyBmcmFtZXNUb1Byb2Nlc3MgPD0g
bV9wcmVEZWxheUJ1ZmZlci5zaXplKCk7CisgICAgICAgIEFTU0VSVChpc1ByZURlbGF5U2FmZSk7
CisgICAgICAgIGlmICghaXNQcmVEZWxheVNhZmUpCisgICAgICAgICAgICByZXR1cm47CisKKyAg
ICAgICAgaXNUZW1wb3JhcnlCdWZmZXJTYWZlID0gZnJhbWVzVG9Qcm9jZXNzIDw9IG1fdGVtcG9y
YXJ5QnVmZmVyLnNpemUoKTsKKworICAgICAgICBwcmVEZWxheWVkU291cmNlID0gbV9wcmVEZWxh
eUJ1ZmZlci5kYXRhKCkgKyBtX3ByZVJlYWRXcml0ZUluZGV4OworICAgICAgICB0ZW1wb3JhcnlC
dWZmZXIgPSBtX3RlbXBvcmFyeUJ1ZmZlcjsgICAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAg
IC8vIFplcm8gZGVsYXkKKyAgICAgICAgcHJlRGVsYXllZFNvdXJjZSA9IHNvdXJjZTsKKyAgICAg
ICAgdGVtcG9yYXJ5QnVmZmVyID0gbV9wcmVEZWxheUJ1ZmZlci5kYXRhKCk7CisgICAgICAgIAor
ICAgICAgICBpc1RlbXBvcmFyeUJ1ZmZlclNhZmUgPSBmcmFtZXNUb1Byb2Nlc3MgPD0gbV9wcmVE
ZWxheUJ1ZmZlci5zaXplKCk7CisgICAgfQorICAgIAorICAgIEFTU0VSVChpc1RlbXBvcmFyeUJ1
ZmZlclNhZmUpOworICAgIGlmICghaXNUZW1wb3JhcnlCdWZmZXJTYWZlKQorICAgICAgICByZXR1
cm47CisKKyAgICBpbnQgd3JpdGVJbmRleCA9IDA7CisKKyAgICBpZiAobV9mcmFtZXNQcm9jZXNz
ZWQgPCBtX3ByZURlbGF5TGVuZ3RoKSB7CisgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgbV9wcmVE
ZWxheUxlbmd0aCBmcmFtZXMgZG9uJ3QgcHJvY2VzcyB0aGUgY29udm9sdmVyLCBpbnN0ZWFkIHNp
bXBseSBidWZmZXIgaW4gdGhlIHByZS1kZWxheS4KKyAgICAgICAgLy8gQnV0IHdoaWxlIGJ1ZmZl
cmluZyB0aGUgcHJlLWRlbGF5LCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5kZXguCisg
ICAgICAgIG1fYWNjdW11bGF0aW9uQnVmZmVyLT51cGRhdGVSZWFkSW5kZXgoJm1fYWNjdW11bGF0
aW9uUmVhZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8v
IE5vdywgcnVuIHRoZSBjb252b2x1dGlvbiAoaW50byB0aGUgZGVsYXkgYnVmZmVyKS4KKyAgICAg
ICAgLy8gQW4gZXhwZW5zaXZlIEZGVCB3aWxsIGhhcHBlbiBldmVyeSBmZnRTaXplIC8gMiBmcmFt
ZXMuCisgICAgICAgIC8vIFdlIHByb2Nlc3MgaW4tcGxhY2UgaGVyZS4uLgorICAgICAgICBtX2Nv
bnZvbHZlci0+cHJvY2VzcygmbV9mZnRLZXJuZWwsIHByZURlbGF5ZWRTb3VyY2UsIHRlbXBvcmFy
eUJ1ZmZlciwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgICAgICAvLyBOb3cgYWNjdW11bGF0ZSBp
bnRvIHJldmVyYidzIGFjY3VtdWxhdGlvbiBidWZmZXIuCisgICAgICAgIHdyaXRlSW5kZXggPSBt
X2FjY3VtdWxhdGlvbkJ1ZmZlci0+YWNjdW11bGF0ZSh0ZW1wb3JhcnlCdWZmZXIsIGZyYW1lc1Rv
UHJvY2VzcywgJm1fYWNjdW11bGF0aW9uUmVhZEluZGV4LCBtX3Bvc3REZWxheUxlbmd0aCk7Cisg
ICAgfQorCisgICAgLy8gRmluYWxseSBjb3B5IGlucHV0IHRvIHByZS1kZWxheS4KKyAgICBpZiAo
bV9wcmVEZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHByZURlbGF5ZWRTb3VyY2Us
IHNvdXJjZSwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIG1fcHJl
UmVhZFdyaXRlSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAgICAgIEFTU0VSVChtX3By
ZVJlYWRXcml0ZUluZGV4IDw9IG1fcHJlRGVsYXlMZW5ndGgpOworICAgICAgICBpZiAobV9wcmVS
ZWFkV3JpdGVJbmRleCA+PSBtX3ByZURlbGF5TGVuZ3RoKQorICAgICAgICAgICAgbV9wcmVSZWFk
V3JpdGVJbmRleCA9IDA7CisgICAgfQorCisgICAgbV9mcmFtZXNQcm9jZXNzZWQgKz0gZnJhbWVz
VG9Qcm9jZXNzOworfQorCit2b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpyZXNldCgpCit7Cisg
ICAgbV9jb252b2x2ZXItPnJlc2V0KCk7CisgICAgbV9wcmVEZWxheUJ1ZmZlci56ZXJvKCk7Cisg
ICAgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXggPSAwOworICAgIG1faW5wdXRSZWFkSW5kZXggPSAw
OworICAgIG1fZnJhbWVzUHJvY2Vzc2VkID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFn
ZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MzUxYWYKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmgKQEAgLTAsMCAr
MSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2Yg
QXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBp
dHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaAorI2RlZmluZSBSZXZlcmJD
b252b2x2ZXJTdGFnZV9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKyNpbmNsdWRl
ICJGRlRGcmFtZS5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI7CitjbGFzcyBSZXZlcmJDb252
b2x2ZXI7CitjbGFzcyBGRlRDb252b2x2ZXI7CisgICAgCisvLyBBIFJldmVyYkNvbnZvbHZlclN0
YWdlIHJlcHJlc2VudHMgdGhlIGNvbnZvbHV0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHN1Yi1zZWN0
aW9uIG9mIGEgbGFyZ2UgaW1wdWxzZSByZXNwb25zZS4KKy8vIEl0IGluY29ycG9yYXRlcyBhIGRl
bGF5IGxpbmUgdG8gYWNjb3VudCBmb3IgdGhlIG9mZnNldCBvZiB0aGUgc3ViLXNlY3Rpb24gd2l0
aGluIHRoZSBsYXJnZXIgaW1wdWxzZSByZXNwb25zZS4KK2NsYXNzIFJldmVyYkNvbnZvbHZlclN0
YWdlIHsKK3B1YmxpYzoKKyAgICAvLyByZW5kZXJQaGFzZSBpcyB1c2VmdWwgdG8ga25vdyBzbyB0
aGF0IHdlIGNhbiBtYW5pcHVsYXRlIHRoZSBwcmUgdmVyc3VzIHBvc3QgZGVsYXkgc28gdGhhdCBz
dGFnZXMgd2lsbCBwZXJmb3JtCisgICAgLy8gdGhlaXIgaGVhdnkgd29yayAoRkZUIHByb2Nlc3Np
bmcpIG9uIGRpZmZlcmVudCBzbGljZXMgdG8gYmFsYW5jZSB0aGUgbG9hZCBpbiBhIHJlYWwtdGlt
ZSB0aHJlYWQuCisgICAgUmV2ZXJiQ29udm9sdmVyU3RhZ2UoZmxvYXQqIGltcHVsc2VSZXNwb25z
ZSwgc2l6ZV90IHJlc3BvbnNlTGVuZ3RoLCBzaXplX3QgcmV2ZXJiVG90YWxMYXRlbmN5LCBzaXpl
X3Qgc3RhZ2VPZmZzZXQsIHNpemVfdCBzdGFnZUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICBzaXplX3QgZmZ0U2l6ZSwgc2l6ZV90IHJlbmRlclBoYXNlLCBzaXplX3QgcmVuZGVyU2xp
Y2VTaXplLCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIqIGFjY3VtdWxhdGlvbkJ1ZmZlcik7CisK
KyAgICAvLyBXQVJOSU5HOiBmcmFtZXNUb1Byb2Nlc3MgbXVzdCBiZSBzdWNoIHRoYXQgaXQgZXZl
bmx5IGRpdmlkZXMgdGhlIGRlbGF5IGJ1ZmZlciBzaXplIChzdGFnZV9vZmZzZXQpLgorICAgIHZv
aWQgcHJvY2VzcyhmbG9hdCogc291cmNlLCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAg
IHZvaWQgcHJvY2Vzc0luQmFja2dyb3VuZChSZXZlcmJDb252b2x2ZXIqIGNvbnZvbHZlciwgc2l6
ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLyBVc2Vm
dWwgZm9yIGJhY2tncm91bmQgcHJvY2Vzc2luZworICAgIGludCBpbnB1dFJlYWRJbmRleCgpIGNv
bnN0IHsgcmV0dXJuIG1faW5wdXRSZWFkSW5kZXg7IH0KKworcHJpdmF0ZToKKyAgICBGRlRGcmFt
ZSBtX2ZmdEtlcm5lbDsKKyAgICBPd25QdHI8RkZUQ29udm9sdmVyPiBtX2NvbnZvbHZlcjsKKwor
ICAgIEF1ZGlvRmxvYXRBcnJheSBtX3ByZURlbGF5QnVmZmVyOworCisgICAgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyKiBtX2FjY3VtdWxhdGlvbkJ1ZmZlcjsKKyAgICBpbnQgbV9hY2N1bXVsYXRp
b25SZWFkSW5kZXg7CisgICAgaW50IG1faW5wdXRSZWFkSW5kZXg7CisKKyAgICBzaXplX3QgbV9w
cmVEZWxheUxlbmd0aDsKKyAgICBzaXplX3QgbV9wb3N0RGVsYXlMZW5ndGg7CisgICAgc2l6ZV90
IG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG1fZnJhbWVzUHJvY2Vzc2VkOworCisg
ICAgQXVkaW9GbG9hdEFycmF5IG1fdGVtcG9yYXJ5QnVmZmVyOworCisgICAgc2l6ZV90IG1faW1w
dWxzZVJlc3BvbnNlTGVuZ3RoOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gUmV2ZXJiQ29udm9sdmVyU3RhZ2VfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1Jl
dmVyYklucHV0QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5i
NGFhYzNlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJ
bnB1dEJ1ZmZlci5jcHAKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5v
ciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJSZXZlcmJJbnB1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Jl
dmVyYklucHV0QnVmZmVyOjpSZXZlcmJJbnB1dEJ1ZmZlcihzaXplX3QgbGVuZ3RoKQorICAgIDog
bV9idWZmZXIobGVuZ3RoKQorICAgICwgbV93cml0ZUluZGV4KDApCit7Cit9CisKK3ZvaWQgUmV2
ZXJiSW5wdXRCdWZmZXI6OndyaXRlKGZsb2F0KiBzb3VyY2VQLCBzaXplX3QgbnVtYmVyT2ZGcmFt
ZXMpCit7CisgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICBi
b29sIGlzQ29weVNhZmUgPSBtX3dyaXRlSW5kZXggKyBudW1iZXJPZkZyYW1lcyA8PSBidWZmZXJM
ZW5ndGg7CisgICAgQVNTRVJUKGlzQ29weVNhZmUpOworICAgIGlmICghaXNDb3B5U2FmZSkKKyAg
ICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBtZW1jcHkobV9idWZmZXIuZGF0YSgpICsgbV93
cml0ZUluZGV4LCBzb3VyY2VQLCBzaXplb2YoZmxvYXQpICogbnVtYmVyT2ZGcmFtZXMpOworCisg
ICAgbV93cml0ZUluZGV4ICs9IG51bWJlck9mRnJhbWVzOworICAgIEFTU0VSVChtX3dyaXRlSW5k
ZXggPD0gYnVmZmVyTGVuZ3RoKTsKKworICAgIGlmIChtX3dyaXRlSW5kZXggPj0gYnVmZmVyTGVu
Z3RoKQorICAgICAgICBtX3dyaXRlSW5kZXggPSAwOworfQorCitmbG9hdCogUmV2ZXJiSW5wdXRC
dWZmZXI6OmRpcmVjdFJlYWRGcm9tKGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFt
ZXMpCit7CisgICAgc2l6ZV90IGJ1ZmZlckxlbmd0aCA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICBi
b29sIGlzUG9pbnRlckdvb2QgPSByZWFkSW5kZXggJiYgKnJlYWRJbmRleCA+PSAwICYmICpyZWFk
SW5kZXggKyBudW1iZXJPZkZyYW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAgQVNTRVJUKGlzUG9p
bnRlckdvb2QpOworICAgIGlmICghaXNQb2ludGVyR29vZCkgeworICAgICAgICAvLyBTaG91bGQg
bmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlIGJ1dCByZXR1cm4gcG9pbnRlciB0byBzdGFydCBvZiBi
dWZmZXIgKGF2b2lkIGNyYXNoKQorICAgICAgICBpZiAocmVhZEluZGV4KQorICAgICAgICAgICAg
KnJlYWRJbmRleCA9IDA7CisgICAgICAgIHJldHVybiBtX2J1ZmZlci5kYXRhKCk7CisgICAgfQor
ICAgICAgICAKKyAgICBmbG9hdCogc291cmNlUCA9IG1fYnVmZmVyOworICAgIGZsb2F0KiBwID0g
c291cmNlUCArICpyZWFkSW5kZXg7CisKKyAgICAvLyBVcGRhdGUgcmVhZEluZGV4CisgICAgKnJl
YWRJbmRleCA9ICgqcmVhZEluZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOwor
CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQgUmV2ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KCkKK3sK
KyAgICBtX2J1ZmZlci56ZXJvKCk7CisgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZl
cmJJbnB1dEJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZl
ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOWNmNDEKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYklucHV0QnVmZmVyLmgKQEAg
LTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIgdGhlIG5h
bWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAq
ICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisg
KiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBV
U0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiSW5wdXRCdWZmZXJfaAorI2RlZmluZSBSZXZl
cmJJbnB1dEJ1ZmZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCisvLyBSZXZlcmJJbnB1dEJ1ZmZlciBpcyB1c2VkIHRvIGJ1ZmZlciBp
bnB1dCBzYW1wbGVzIGZvciBkZWZlcnJlZCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNrZ3JvdW5kIHRo
cmVhZHMuCitjbGFzcyBSZXZlcmJJbnB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAgUmV2ZXJiSW5w
dXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvLyBUaGUgcmVhbHRpbWUgYXVkaW8gdGhy
ZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxlcyBoZXJlLgorICAgIC8vIFRoZSBhc3N1bXB0aW9uIGlz
IHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5IG51bWJlck9m
RnJhbWVzIChmb3IgbmVhcmx5IGFsbCBjYXNlcyB0aGlzIHdpbGwgYmUgZmluZSkuCisgICAgLy8g
RklYTUU6IHJlbW92ZSBudW1iZXJPZkZyYW1lcyByZXN0cmljdGlvbi4uLgorICAgIHZvaWQgd3Jp
dGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBudW1iZXJPZkZyYW1lcyk7CisKKyAgICAvLyBCYWNr
Z3JvdW5kIHRocmVhZHMgY2FuIGNhbGwgdGhpcyB0byBjaGVjayBpZiB0aGVyZSdzIGFueXRoaW5n
IHRvIHJlYWQuLi4KKyAgICBzaXplX3Qgd3JpdGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1fd3Jp
dGVJbmRleDsgfQorCisgICAgLy8gVGhlIGluZGl2aWR1YWwgYmFja2dyb3VuZCB0aHJlYWRzIHJl
YWQgaGVyZSAoYW5kIGhvcGUgdGhhdCB0aGV5IGNhbiBrZWVwIHVwIHdpdGggdGhlIGJ1ZmZlciB3
cml0aW5nKS4KKyAgICAvLyByZWFkSW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXh0IHJlYWRJ
bmRleCB0byByZWFkIGZyb20uLi4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRoZSBi
dWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJsZSBieSBudW1iZXJPZkZyYW1lcy4KKyAg
ICAvLyBGSVhNRTogcmVtb3ZlIG51bWJlck9mRnJhbWVzIHJlc3RyaWN0aW9uLi4uCisgICAgZmxv
YXQqIGRpcmVjdFJlYWRGcm9tKGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMp
OworCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRBcnJheSBt
X2J1ZmZlcjsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4OworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiSW5wdXRCdWZmZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51975</attachid>
            <date>2010-03-29 15:26:34 -0700</date>
            <delta_ts>2010-08-26 13:52:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100329152632.patch</filename>
            <type>text/plain</type>
            <size>42042</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YmFhMDU1Mi4uZjYwODMxYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0NyBAQAorMjAxMC0wMy0yOSAgQ2hyaXMgUm9nZXJz
ICA8Y3JvZ2Vyc0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGF1ZGlvIGVuZ2luZTogYWRkIFJldmVyYkNvbnZvbHZlciBjbGFzcwor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzQ5MTIKKwor
ICAgICAgICBObyB0ZXN0cyBzaW5jZSBub3QgeWV0IGNvbm5lY3RlZCB0byBqYXZhc2NyaXB0IEFQ
SQorCisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OlJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1bXVs
YXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkSW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkVGltZUZyYW1lKToKKyAgICAgICAgKiBwbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OmJh
Y2tncm91bmRUaHJlYWRFbnRyeSk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6
OlJldmVyYkNvbnZvbHZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6On5S
ZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpiYWNr
Z3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyOjpw
cm9jZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6cmVzZXQpOgorICAg
ICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW1wdWxzZVJlc3BvbnNlTGVuZ3RoKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6aW5wdXRCdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmV2ZXJiQ29udm9sdmVyOjp1c2VCYWNrZ3JvdW5kVGhyZWFkcyk6CisgICAgICAgICog
cGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dyb3Vu
ZCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2Vzcyk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQpOgorICAgICAgICAq
IHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6OmlucHV0UmVhZEluZGV4KToKKyAgICAgICAg
KiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OlJldmVyYklucHV0QnVmZmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjp3cml0ZSk6CisgICAgICAgIChXZWJDb3JlOjpS
ZXZlcmJJbnB1dEJ1ZmZlcjo6ZGlyZWN0UmVhZEZyb20pOgorICAgICAgICAoV2ViQ29yZTo6UmV2
ZXJiSW5wdXRCdWZmZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJJ
bnB1dEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVy
Ojp3cml0ZUluZGV4KToKKwogMjAxMC0wMy0yOSAgS2VubmV0aCBSdXNzZWxsICA8a2JyQGdvb2ds
ZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlzaGVyLgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwY2QxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5jcHAKQEAgLTAs
MCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyLmgiCisKKyNpbmNsdWRlICJBY2NlbGVyYXRlLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fcmVh
ZEluZGV4KDApCisgICAgLCBtX3JlYWRUaW1lRnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJB
Y2N1bXVsYXRpb25CdWZmZXI6OnJlYWRBbmRDbGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVf
dCBudW1iZXJPZkZyYW1lcykKK3sKKyAgICBzaXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIu
c2l6ZSgpOworICAgIGJvb2wgaXNDb3B5U2FmZSA9IG1fcmVhZEluZGV4IDw9IGJ1ZmZlckxlbmd0
aCAmJiBudW1iZXJPZkZyYW1lcyA8PSBidWZmZXJMZW5ndGg7CisgICAgCisgICAgQVNTRVJUKGlz
Q29weVNhZmUpOworICAgIGlmICghaXNDb3B5U2FmZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
c2l6ZV90IGZyYW1lc0F2YWlsYWJsZSA9IGJ1ZmZlckxlbmd0aCAtIG1fcmVhZEluZGV4OworICAg
IHNpemVfdCBudW1iZXJPZkZyYW1lczEgPSBzdGQ6Om1pbihudW1iZXJPZkZyYW1lcywgZnJhbWVz
QXZhaWxhYmxlKTsKKyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMyID0gbnVtYmVyT2ZGcmFtZXMg
LSBudW1iZXJPZkZyYW1lczE7CisKKyAgICBmbG9hdCogc291cmNlID0gbV9idWZmZXI7CisgICAg
bWVtY3B5KGRlc3RpbmF0aW9uLCBzb3VyY2UgKyBtX3JlYWRJbmRleCwgc2l6ZW9mKGZsb2F0KSAq
IG51bWJlck9mRnJhbWVzMSk7CisgICAgbWVtc2V0KHNvdXJjZSArIG1fcmVhZEluZGV4LCAwLCBz
aXplb2YoZmxvYXQpICogbnVtYmVyT2ZGcmFtZXMxKTsKKworICAgIC8vIEhhbmRsZSB3cmFwLWFy
b3VuZCBpZiBuZWNlc3NhcnkKKyAgICBpZiAobnVtYmVyT2ZGcmFtZXMyID4gMCkgeworICAgICAg
ICBtZW1jcHkoZGVzdGluYXRpb24gKyBudW1iZXJPZkZyYW1lczEsIHNvdXJjZSwgc2l6ZW9mKGZs
b2F0KSAqIG51bWJlck9mRnJhbWVzMik7CisgICAgICAgIG1lbXNldChzb3VyY2UsIDAsIHNpemVv
ZihmbG9hdCkgKiBudW1iZXJPZkZyYW1lczIpOworICAgIH0KKworICAgIG1fcmVhZEluZGV4ID0g
KG1fcmVhZEluZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworICAgIG1fcmVh
ZFRpbWVGcmFtZSArPSBudW1iZXJPZkZyYW1lczsKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRp
b25CdWZmZXI6OnVwZGF0ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9m
RnJhbWVzKSBjb25zdAoreworICAgIC8vIFVwZGF0ZSBjYWxsZXIncyByZWFkSW5kZXgKKyAgICAq
cmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBtX2J1ZmZlci5zaXpl
KCk7Cit9CisKK2ludCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OmFjY3VtdWxhdGUoZmxvYXQq
IHNvdXJjZSwgc2l6ZV90IG51bWJlck9mRnJhbWVzLCBpbnQqIHJlYWRJbmRleCwgc2l6ZV90IGRl
bGF5RnJhbWVzKQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7
CisgICAgCisgICAgc2l6ZV90IHdyaXRlSW5kZXggPSAoKnJlYWRJbmRleCArIGRlbGF5RnJhbWVz
KSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIC8vIFVwZGF0ZSBjYWxsZXIncyByZWFkSW5kZXgKKyAg
ICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5n
dGg7CisKKyAgICBzaXplX3QgZnJhbWVzQXZhaWxhYmxlID0gYnVmZmVyTGVuZ3RoIC0gd3JpdGVJ
bmRleDsKKyAgICBzaXplX3QgbnVtYmVyT2ZGcmFtZXMxID0gc3RkOjptaW4obnVtYmVyT2ZGcmFt
ZXMsIGZyYW1lc0F2YWlsYWJsZSk7CisgICAgc2l6ZV90IG51bWJlck9mRnJhbWVzMiA9IG51bWJl
ck9mRnJhbWVzIC0gbnVtYmVyT2ZGcmFtZXMxOworCisgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0g
bV9idWZmZXI7CisKKyAgICBib29sIGlzU2FmZSA9IHdyaXRlSW5kZXggPD0gYnVmZmVyTGVuZ3Ro
ICYmIG51bWJlck9mRnJhbWVzMSArIHdyaXRlSW5kZXggPD0gYnVmZmVyTGVuZ3RoICYmIG51bWJl
ck9mRnJhbWVzMiA8PSBidWZmZXJMZW5ndGg7CisgICAgQVNTRVJUKGlzU2FmZSk7CisgICAgaWYg
KCFpc1NhZmUpCisgICAgICAgIHJldHVybiAwOworCisgICAgdmFkZChzb3VyY2UsIDEsIGRlc3Rp
bmF0aW9uICsgd3JpdGVJbmRleCwgMSwgZGVzdGluYXRpb24gKyB3cml0ZUluZGV4LCAxLCBudW1i
ZXJPZkZyYW1lczEpOworCisgICAgLy8gSGFuZGxlIHdyYXAtYXJvdW5kIGlmIG5lY2Vzc2FyeQor
ICAgIGlmIChudW1iZXJPZkZyYW1lczIgPiAwKSAgICAgICAKKyAgICAgICAgdmFkZChzb3VyY2Ug
KyBudW1iZXJPZkZyYW1lczEsIDEsIGRlc3RpbmF0aW9uLCAxLCBkZXN0aW5hdGlvbiwgMSwgbnVt
YmVyT2ZGcmFtZXMyKTsKKworICAgIHJldHVybiB3cml0ZUluZGV4OworfQorCit2b2lkIFJldmVy
YkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQoKQoreworICAgIG1fYnVmZmVyLnplcm8oKTsKKyAg
ICBtX3JlYWRJbmRleCA9IDA7CisgICAgbV9yZWFkVGltZUZyYW1lID0gMDsKK30KKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZl
cmJBY2N1bXVsYXRpb25CdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRh
MDc3MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIp
IG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyX2gKKyNkZWZpbmUgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKKworI2lu
Y2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFJl
dmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBpcyBhIGNpcmN1bGFyIGRlbGF5IGJ1ZmZlciB3aXRoIG9u
ZSBjbGllbnQgcmVhZGluZyBmcm9tIGl0IGFuZCBtdWx0aXBsZSBjbGllbnRzCisvLyB3cml0aW5n
L2FjY3VtdWxhdGluZyB0byBpdCBhdCBkaWZmZXJlbnQgZGVsYXkgb2Zmc2V0cyBmcm9tIHRoZSBy
ZWFkIHBvc2l0aW9uLiAgVGhlIHJlYWQgb3BlcmF0aW9uIHdpbGwgemVybyB0aGUgbWVtb3J5Cisv
LyBqdXN0IHJlYWQgZnJvbSB0aGUgYnVmZmVyLCBzbyBpdCB3aWxsIGJlIHJlYWR5IGZvciBhY2N1
bXVsYXRpb24gdGhlIG5leHQgdGltZSBhcm91bmQuCitjbGFzcyBSZXZlcmJBY2N1bXVsYXRpb25C
dWZmZXIgeworcHVibGljOgorICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3QgbGVu
Z3RoKTsKKworICAgIC8vIFRoaXMgd2lsbCByZWFkIGZyb20sIHRoZW4gY2xlYXItb3V0IG51bWJl
ck9mRnJhbWVzCisgICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXpl
X3QgbnVtYmVyT2ZGcmFtZXMpOworCisgICAgLy8gRWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSB3
aWxsIGFjY3VtdWxhdGUgaXRzIG91dHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgZGVsYXkgZnJvbSB0
aGUgcmVhZCBwb3NpdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW4gYW5kIHVwZGF0ZSBy
ZWFkSW5kZXggaGVyZSwgc2luY2UgZWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSBtYXkgYmUgcnVu
bmluZyBpbgorICAgIC8vIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSByZWFsdGltZSB0aHJl
YWQgY2FsbGluZyBSZWFkQW5kQ2xlYXIoKSBhbmQgbWFpbnRhaW5pbmcgbV9yZWFkSW5kZXgKKyAg
ICAvLyBSZXR1cm5zIHRoZSB3cml0ZUluZGV4IHdoZXJlIHRoZSBhY2N1bXVsYXRpb24gdG9vayBw
bGFjZQorICAgIGludCBhY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBudW1iZXJPZkZy
YW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcyk7CisKKyAgICBzaXplX3Qg
cmVhZEluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkSW5kZXg7IH0KKyAgICB2b2lkIHVwZGF0
ZVJlYWRJbmRleChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKSBjb25zdDsK
KworICAgIHNpemVfdCByZWFkVGltZUZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkVGltZUZy
YW1lOyB9CisKKyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFy
cmF5IG1fYnVmZmVyOworICAgIHNpemVfdCBtX3JlYWRJbmRleDsKKyAgICBzaXplX3QgbV9yZWFk
VGltZUZyYW1lOyAvLyBmb3IgZGVidWdnaW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5l
KQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiQWNjdW11
bGF0aW9uQnVmZmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJi
Q29udm9sdmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWM0OGRlCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuY3BwCkBAIC0w
LDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFt
ZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICog
ICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlJldmVyYkNvbnZv
bHZlci5oIgorCisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIkF1ZGlvQnVzLmgi
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IElucHV0QnVmZmVyU2l6ZSA9IDgg
KiAxNjM4NDsKKworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhl
IGltcHVsc2UgcmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQuICBXZSBkb24ndCBleGNl
ZWQgdGhpcyBsZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwgdGhhdCB0aGUgYmFja2dyb3Vu
ZCB0aHJlYWQgaGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGluZyBzbG9wLgorLy8gRW1waXJp
Y2FsbHksIHRoaXMgaGFzIGJlZW4gZm91bmQgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2Vl
biBnaXZpbmcgZW5vdWdoIHRpbWUgZm9yIHNjaGVkdWxpbmcgc2xvcCwKKy8vIHdoaWxlIHN0aWxs
IG1pbmltaXppbmcgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIGRvbmUgaW4gdGhlIHByaW1hcnkg
KGhpZ2gtcHJpb3JpdHkpIHRocmVhZC4KKy8vIFRoaXMgd2FzIGZvdW5kIHRvIGJlIGEgZ29vZCB2
YWx1ZSBvbiBNYWMgT1MgWCwgYW5kIG1heSB3b3JrIHdlbGwgb24gb3RoZXIgcGxhdGZvcm1zIGFz
IHdlbGwsIGFzc3VtaW5nCisvLyB0aGUgdmVyeSByb3VnaCBzY2hlZHVsaW5nIGxhdGVuY2llcyBh
cmUgc2ltaWxhciBvbiB0aGVzZSB0aW1lLXNjYWxlcy4gIE9mIGNvdXJzZSwgdGhpcyBjb2RlIG1h
eSBuZWVkIHRvIGJlCisvLyB0dW5lZCBmb3IgaW5kaXZpZHVhbCBwbGF0Zm9ybXMgaWYgdGhpcyBh
c3N1bXB0aW9uIGlzIGZvdW5kIHRvIGJlIGluY29ycmVjdC4KK2NvbnN0IHNpemVfdCBSZWFsdGlt
ZUZyYW1lTGltaXQgPSA4MTkyICArIDQwOTY7IC8vIH4yNzhtc2VjIEAgNDQuMUtIegorCitjb25z
dCBzaXplX3QgTWluRkZUU2l6ZSA9IDI1NjsKK2NvbnN0IHNpemVfdCBNYXhSZWFsdGltZUZGVFNp
emUgPSAyMDQ4OworCitzdGF0aWMgdm9pZCogYmFja2dyb3VuZFRocmVhZEVudHJ5KHZvaWQqIHRo
cmVhZERhdGEpCit7CisgICAgUmV2ZXJiQ29udm9sdmVyKiByZXZlcmJDb252b2x2ZXIgPSBzdGF0
aWNfY2FzdDxSZXZlcmJDb252b2x2ZXIqPih0aHJlYWREYXRhKTsKKyAgICByZXZlcmJDb252b2x2
ZXItPmJhY2tncm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAwOworfQorCitSZXZlcmJD
b252b2x2ZXI6OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwg
c2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252b2x2
ZXJSZW5kZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICA6IG1faW1wdWxz
ZVJlc3BvbnNlTGVuZ3RoKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkpCisgICAgLCBtX2Fj
Y3VtdWxhdGlvbkJ1ZmZlcihpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpICsgcmVuZGVyU2xp
Y2VTaXplKQorICAgICwgbV9pbnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNpemUpCisgICAgLCBtX3Jl
bmRlclNsaWNlU2l6ZShyZW5kZXJTbGljZVNpemUpCisgICAgLCBtX21pbkZGVFNpemUoTWluRkZU
U2l6ZSkgLy8gRmlyc3Qgc3RhZ2Ugd2lsbCBoYXZlIHRoaXMgc2l6ZSAtIHN1Y2Nlc3NpdmUgc3Rh
Z2VzIHdpbGwgZG91YmxlIGluIHNpemUgZWFjaCB0aW1lCisgICAgLCBtX21heEZGVFNpemUobWF4
RkZUU2l6ZSkgLy8gdW50aWwgd2UgaGl0IG1fbWF4RkZUU2l6ZQorICAgICwgbV91c2VCYWNrZ3Jv
dW5kVGhyZWFkcyh1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICAsIG1fYmFja2dyb3VuZFRocmVh
ZCgwKQorICAgICwgbV93YW50c1RvRXhpdChmYWxzZSkKKyAgICAsIG1fbW9yZUlucHV0QnVmZmVy
ZWQoZmFsc2UpCit7CisgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcyB0
aGVuIGRvbid0IGV4Y2VlZCB0aGlzIEZGVCBzaXplIGZvciB0aGUKKyAgICAvLyBzdGFnZXMgd2hp
Y2ggcnVuIGluIHRoZSByZWFsLXRpbWUgdGhyZWFkLiAgVGhpcyBhdm9pZHMgaGF2aW5nIG9ubHkg
b25lIG9yIHR3bworICAgIC8vIGxhcmdlIHN0YWdlcyAoc2l6ZSAxNjM4NCBvciBzbykgYXQgdGhl
IGVuZCB3aGljaCB0YWtlIGEgbG90IG9mIHRpbWUgZXZlcnkgc2V2ZXJhbAorICAgIC8vIHByb2Nl
c3Npbmcgc2xpY2VzLiAgVGhpcyB3YXkgd2UgYW1vcnRpemUgdGhlIGNvc3Qgb3ZlciBtb3JlIHBy
b2Nlc3Npbmcgc2xpY2VzLgorICAgIG1fbWF4UmVhbHRpbWVGRlRTaXplID0gTWF4UmVhbHRpbWVG
RlRTaXplOworCisgICAgLy8gRm9yIHRoZSBtb21lbnQsIGEgZ29vZCB3YXkgdG8ga25vdyBpZiB3
ZSBoYXZlIHJlYWwtdGltZSBjb25zdHJhaW50IGlzIHRvIGNoZWNrIGlmIHdlJ3JlIHVzaW5nIGJh
Y2tncm91bmQgdGhyZWFkcy4KKyAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSB3ZSdyZSBiZWluZyBy
dW4gZnJvbSBhIGNvbW1hbmQtbGluZSB0b29sLgorICAgIGJvb2wgaGFzUmVhbHRpbWVDb25zdHJh
aW50ID0gdXNlQmFja2dyb3VuZFRocmVhZHM7CisKKyAgICBmbG9hdCogcmVzcG9uc2UgPSBpbXB1
bHNlUmVzcG9uc2UtPmRhdGEoKTsKKyAgICBzaXplX3QgdG90YWxSZXNwb25zZUxlbmd0aCA9IGlt
cHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCk7CisKKyAgICAvLyBCZWNhdXNlIHdlJ3JlIG5vdCB1
c2luZyBkaXJlY3QtY29udm9sdXRpb24gaW4gdGhlIGxlYWRpbmcgcG9ydGlvbiwgdGhlIHJldmVy
YiBoYXMgYW4gb3ZlcmFsbCBsYXRlbmN5IG9mIGhhbGYgdGhlIGZpcnN0LXN0YWdlIEZGVCBzaXpl
CisgICAgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSA9IG1fbWluRkZUU2l6ZSAvIDI7CisKKyAg
ICBzaXplX3Qgc3RhZ2VPZmZzZXQgPSAwOworICAgIGludCBpID0gMDsKKyAgICBzaXplX3QgZmZ0
U2l6ZSA9IG1fbWluRkZUU2l6ZTsKKyAgICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3Bv
bnNlTGVuZ3RoKSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKwor
ICAgICAgICAvLyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCBzdGFnZU9m
ZnNldCBpcyBzdWNoIHRoYXQgd2UncmUgc3RyYWRkbGluZyB0aGUgZW5kCisgICAgICAgIC8vIG9m
IHRoZSBpbXB1bHNlIHJlc3BvbnNlIGJ1ZmZlciAoaWYgd2UgdXNlIHN0YWdlU2l6ZSksIHNvIHJl
ZHVjZSB0aGUgbGFzdCBzdGFnZSdzIGxlbmd0aC4uLgorICAgICAgICBpZiAoc3RhZ2VTaXplICsg
c3RhZ2VPZmZzZXQgPiB0b3RhbFJlc3BvbnNlTGVuZ3RoKQorICAgICAgICAgICAgc3RhZ2VTaXpl
ID0gdG90YWxSZXNwb25zZUxlbmd0aCAtIHN0YWdlT2Zmc2V0OworCisgICAgICAgIC8vIFRoaXMg
InN0YWdnZXJzIiB0aGUgdGltZSB3aGVuIGVhY2ggRkZUIGhhcHBlbnMgc28gdGhleSBkb24ndCBh
bGwgaGFwcGVuIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgaW50IHJlbmRlclBoYXNlID0gY29u
dm9sdmVyUmVuZGVyUGhhc2UgKyBpICogcmVuZGVyU2xpY2VTaXplOworCisgICAgICAgIE93blB0
cjxSZXZlcmJDb252b2x2ZXJTdGFnZT4gc3RhZ2UobmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJl
c3BvbnNlLCB0b3RhbFJlc3BvbnNlTGVuZ3RoLCByZXZlcmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zm
c2V0LCBzdGFnZVNpemUsIGZmdFNpemUsIHJlbmRlclBoYXNlLCByZW5kZXJTbGljZVNpemUsICZt
X2FjY3VtdWxhdGlvbkJ1ZmZlcikpOworCisgICAgICAgIGJvb2wgaXNCYWNrZ3JvdW5kU3RhZ2Ug
PSBmYWxzZTsKKworICAgICAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBz
dGFnZU9mZnNldCA+IFJlYWx0aW1lRnJhbWVMaW1pdCkgeworICAgICAgICAgICAgbV9iYWNrZ3Jv
dW5kU3RhZ2VzLmFwcGVuZChzdGFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgaXNCYWNrZ3Jv
dW5kU3RhZ2UgPSB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fc3RhZ2VzLmFw
cGVuZChzdGFnZS5yZWxlYXNlKCkpOworCisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6
ZTsKKyAgICAgICAgKytpOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQor
ICAgICAgICBmZnRTaXplICo9IDI7CisgICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQg
JiYgIWlzQmFja2dyb3VuZFN0YWdlICYmIGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkK
KyAgICAgICAgICAgIGZmdFNpemUgPSBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYg
KGZmdFNpemUgPiBtX21heEZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRT
aXplOworICAgIH0KKworICAgIC8vIFN0YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8g
RklYTUU6IHdvdWxkIGJlIGJldHRlciB0byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJ
dCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVhbC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1
bHQuLi4KKyAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91
bmRTdGFnZXMuc2l6ZSgpID4gMCkKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gY3JlYXRl
VGhyZWFkKFdlYkNvcmU6OmJhY2tncm91bmRUaHJlYWRFbnRyeSwgdGhpcywgImNvbnZvbHV0aW9u
IGJhY2tncm91bmQgdGhyZWFkIik7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZv
bHZlcigpCit7CisgICAgLy8gV2FpdCBmb3IgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAg
IGlmICh1c2VCYWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFRocmVhZCkgeworICAg
ICAgICBtX3dhbnRzVG9FeGl0ID0gdHJ1ZTsKKworICAgICAgICAvLyBXYWtlIHVwIHRocmVhZCBz
byBpdCBjYW4gcmV0dXJuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tl
cihtX2JhY2tncm91bmRUaHJlYWRMb2NrKTsKKyAgICAgICAgICAgIG1fbW9yZUlucHV0QnVmZmVy
ZWQgPSB0cnVlOworICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25h
bCgpOworICAgICAgICB9CisKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24obV9iYWNr
Z3JvdW5kVGhyZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpiYWNr
Z3JvdW5kVGhyZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhpdCkgeworICAg
ICAgICAvLyBXYWl0IGZvciByZWFsdGltZSB0aHJlYWQgdG8gZ2l2ZSB1cyBtb3JlIGlucHV0Cisg
ICAgICAgIG1fbW9yZUlucHV0QnVmZmVyZWQgPSBmYWxzZTsgICAgICAgIAorICAgICAgICB7Cisg
ICAgICAgICAgICBNdXRleExvY2tlciBsb2NrZXIobV9iYWNrZ3JvdW5kVGhyZWFkTG9jayk7Cisg
ICAgICAgICAgICB3aGlsZSAoIW1fbW9yZUlucHV0QnVmZmVyZWQgJiYgIW1fd2FudHNUb0V4aXQp
CisgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLndhaXQobV9iYWNr
Z3JvdW5kVGhyZWFkTG9jayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGFsbCBv
ZiB0aGUgc3RhZ2VzIHVudGlsIHRoZWlyIHJlYWQgaW5kaWNlcyByZWFjaCB0aGUgaW5wdXQgYnVm
ZmVyJ3Mgd3JpdGUgaW5kZXgKKyAgICAgICAgaW50IHdyaXRlSW5kZXggPSBtX2lucHV0QnVmZmVy
LndyaXRlSW5kZXgoKTsKKworICAgICAgICAvLyBFdmVuIHRob3VnaCBpdCBkb2Vzbid0IHNlZW0g
bGlrZSBldmVyeSBzdGFnZSBuZWVkcyB0byBtYWludGFpbiBpdHMgb3duIHZlcnNpb24gb2YgcmVh
ZEluZGV4IAorICAgICAgICAvLyB3ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4g
bW9yZSB0aGFuIG9uZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsK
KworICAgICAgICB3aGlsZSAoKHJlYWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5w
dXRSZWFkSW5kZXgoKSkgIT0gd3JpdGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRl
dGVjdCBidWZmZXIgb3ZlcnJ1bi4uLgorICAgICAgICAgICAgLy8gVGhlIFJldmVyYkNvbnZvbHZl
clN0YWdlcyBuZWVkIHRvIHByb2Nlc3MgaW4gYW1vdW50cyB3aGljaCBldmVubHkgZGl2aWRlIGhh
bGYgdGhlIEZGVCBzaXplCisgICAgICAgICAgICBjb25zdCBpbnQgU2xpY2VTaXplID0gTWluRkZU
U2l6ZSAvIDI7CisKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9t
IGVhY2ggc3RhZ2UKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3Jv
dW5kU3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdl
c1tpXS0+cHJvY2Vzc0luQmFja2dyb3VuZCh0aGlzLCBTbGljZVNpemUpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIFJldmVyYkNvbnZvbHZlcjo6cHJvY2VzcyhBdWRpb0NoYW5uZWwqIHNv
dXJjZUNoYW5uZWwsIEF1ZGlvQ2hhbm5lbCogZGVzdGluYXRpb25DaGFubmVsLCBzaXplX3QgZnJh
bWVzVG9Qcm9jZXNzKQoreworICAgIGJvb2wgaXNTYWZlID0gc291cmNlQ2hhbm5lbCAmJiBkZXN0
aW5hdGlvbkNoYW5uZWwgJiYgc291cmNlQ2hhbm5lbC0+ZnJhbWVTaXplKCkgPj0gZnJhbWVzVG9Q
cm9jZXNzICYmIGRlc3RpbmF0aW9uQ2hhbm5lbC0+ZnJhbWVTaXplKCkgPj0gZnJhbWVzVG9Qcm9j
ZXNzOworICAgIEFTU0VSVChpc1NhZmUpOworICAgIGlmICghaXNTYWZlKQorICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgIGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VDaGFubmVsLT5kYXRhKCk7
CisgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25DaGFubmVsLT5kYXRhKCk7Cisg
ICAgYm9vbCBpc0RhdGFTYWZlID0gc291cmNlICYmIGRlc3RpbmF0aW9uOworICAgIEFTU0VSVChp
c0RhdGFTYWZlKTsKKyAgICBpZiAoIWlzRGF0YVNhZmUpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIEZlZWQgaW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0aHJlYWRzKQorICAgIG1faW5wdXRC
dWZmZXIud3JpdGUoc291cmNlLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gQWNjdW11bGF0
ZSBjb250cmlidXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgbV9zdGFnZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fc3RhZ2VzW2ldLT5wcm9jZXNzKHNv
dXJjZSwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBmcm9tIGFjY3Vt
dWxhdGlvbiBidWZmZXIKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5kQ2xlYXIoZGVz
dGluYXRpb24sIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIAorICAgIC8vIE5vdyB0aGF0IHdl
J3ZlIGJ1ZmZlcmVkIG1vcmUgaW5wdXQsIHdha2UgdXAgb3VyIGJhY2tncm91bmQgdGhyZWFkLgor
ICAgIAorICAgIC8vIE5vdCB1c2luZyBhIE11dGV4TG9ja2VyIGxvb2tzIHN0cmFuZ2UsIGJ1dCB3
ZSB1c2UgYSB0cnlMb2NrKCkgaW5zdGVhZCBiZWNhdXNlIHRoaXMgaXMgcnVuIG9uIHRoZSByZWFs
LXRpbWUKKyAgICAvLyB0aHJlYWQgd2hlcmUgaXQgaXMgYSBkaXNhc3RlciBmb3IgdGhlIGxvY2sg
dG8gYmUgY29udGVuZGVkIChjYXVzZXMgYXVkaW8gZ2xpdGNoaW5nKS4gIEl0J3MgT0sgaWYgd2Ug
ZmFpbCB0bworICAgIC8vIHNpZ25hbCBmcm9tIHRpbWUgdG8gdGltZSwgc2luY2Ugd2UnbGwgZ2V0
IHRvIGl0IHRoZSBuZXh0IHRpbWUgd2UncmUgY2FsbGVkLiAgV2UncmUgY2FsbGVkIHJlcGVhdGVk
bHkKKyAgICAvLyBhbmQgZnJlcXVlbnRseSAoYXJvdW5kIGV2ZXJ5IDNtcykuICBUaGUgYmFja2dy
b3VuZCB0aHJlYWQgaXMgcHJvY2Vzc2luZyB3ZWxsIGludG8gdGhlIGZ1dHVyZSBhbmQgaGFzIGEg
Y29uc2lkZXJhYmxlIGFtb3VudCBvZiAKKyAgICAvLyBsZWV3YXkgaGVyZS4uLgorICAgIGlmICht
X2JhY2tncm91bmRUaHJlYWRMb2NrLnRyeUxvY2soKSkgeworICAgICAgICBtX21vcmVJbnB1dEJ1
ZmZlcmVkID0gdHJ1ZTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25h
bCgpOworICAgICAgICBtX2JhY2tncm91bmRUaHJlYWRMb2NrLnVubG9jaygpOworICAgIH0KK30K
Kwordm9pZCBSZXZlcmJDb252b2x2ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG1fc3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQo
KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUo
KTsgKytpKQorICAgICAgICBtX2JhY2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBt
X2FjY3VtdWxhdGlvbkJ1ZmZlci5yZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsK
K30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJi
Q29udm9sdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzdkMwot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVy
LmgKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9T
UyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9G
CisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQ29udm9sdmVyX2gKKyNkZWZpbmUg
UmV2ZXJiQ29udm9sdmVyX2gKKworI2luY2x1ZGUgIkF1ZGlvRmxvYXRBcnJheS5oIgorI2luY2x1
ZGUgIkZGVENvbnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5o
IgorI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlclN0YWdlLmgiCisjaW5jbHVkZSAiUmV2ZXJiSW5w
dXRCdWZmZXIuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1JlZkNv
dW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQ2hhbm5lbDsKKworY2xh
c3MgUmV2ZXJiQ29udm9sdmVyIHsKK3B1YmxpYzoKKyAgICAvLyBtYXhGRlRTaXplIGNhbiBiZSBh
ZGp1c3RlZCAoZnJvbSBzYXkgMjA0OCB0byAzMjc2OCkgZGVwZW5kaW5nIG9uIGhvdyBtdWNoIHBy
ZWNpc2lvbiBpcyBuZWNlc3NhcnkuCisgICAgLy8gRm9yIGNlcnRhaW4gdHdlYWt5IGRlLWNvbnZv
bHZpbmcgYXBwbGljYXRpb25zIHRoZSBwaGFzZSBlcnJvcnMgYWRkIHVwIHF1aWNrbHkgYW5kIGxl
YWQgdG8gbm9uLXNlbnNpY2FsIHJlc3VsdHMgd2l0aAorICAgIC8vIGxhcmdlciBGRlQgc2l6ZXMg
YW5kIHNpbmdsZS1wcmVjaXNpb24gZmxvYXRzLiAgSW4gdGhlc2UgY2FzZXMgMjA0OCBpcyBhIGdv
b2Qgc2l6ZS4KKyAgICAvLyBJZiBub3QgZG9pbmcgbXVsdGktdGhyZWFkZWQgY29udm9sdXRpb24s
IHRoZW4gc2hvdWxkIG5vdCBnbyA+IDgxOTIuCisgICAgUmV2ZXJiQ29udm9sdmVyKEF1ZGlvQ2hh
bm5lbCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVuZGVyU2xpY2VTaXplLCBzaXplX3QgbWF4
RkZUU2l6ZSwgc2l6ZV90IGNvbnZvbHZlclJlbmRlclBoYXNlLCBib29sIHVzZUJhY2tncm91bmRU
aHJlYWRzKTsKKyAgICB+UmV2ZXJiQ29udm9sdmVyKCk7CisKKyAgICB2b2lkIHByb2Nlc3MoQXVk
aW9DaGFubmVsKiBzb3VyY2VDaGFubmVsLCBBdWRpb0NoYW5uZWwqIGRlc3RpbmF0aW9uQ2hhbm5l
bCwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgdm9pZCByZXNldCgpOworCisgICAgc2l6
ZV90IGltcHVsc2VSZXNwb25zZUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faW1wdWxzZVJlc3Bv
bnNlTGVuZ3RoOyB9CisKKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciogaW5wdXRCdWZmZXIoKSB7IHJl
dHVybiAmbV9pbnB1dEJ1ZmZlcjsgfQorCisgICAgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcygp
IGNvbnN0IHsgcmV0dXJuIG1fdXNlQmFja2dyb3VuZFRocmVhZHM7IH0KKyAgICB2b2lkIGJhY2tn
cm91bmRUaHJlYWRFbnRyeSgpOworCitwcml2YXRlOgorICAgIFZlY3RvcjxPd25QdHI8UmV2ZXJi
Q29udm9sdmVyU3RhZ2U+ID4gbV9zdGFnZXM7CisgICAgVmVjdG9yPE93blB0cjxSZXZlcmJDb252
b2x2ZXJTdGFnZT4gPiBtX2JhY2tncm91bmRTdGFnZXM7CisgICAgc2l6ZV90IG1faW1wdWxzZVJl
c3BvbnNlTGVuZ3RoOworCisgICAgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyIG1fYWNjdW11bGF0
aW9uQnVmZmVyOworCisgICAgLy8gT25lIG9yIG1vcmUgYmFja2dyb3VuZCB0aHJlYWRzIHJlYWQg
ZnJvbSB0aGlzIGlucHV0IGJ1ZmZlciB3aGljaCBpcyBmZWQgZnJvbSB0aGUgcmVhbHRpbWUgdGhy
ZWFkLgorICAgIFJldmVyYklucHV0QnVmZmVyIG1faW5wdXRCdWZmZXI7CisKKyAgICAvLyBXZSdy
ZSBnaXZlbiBhIHJlbmRlcmluZyBoaW50LCBzbyB0aGUgRkZUcyBjYW4gYmUgb3B0aW1pemVkIHRv
IG5vdCBhbGwgb2NjdXIgYXQgdGhlIHNhbWUgdGltZQorICAgIC8vICh2ZXJ5IGJhZCB3aGVuIHJl
bmRlcmluZyBvbiBhIHJlYWwtdGltZSB0aHJlYWQpLgorICAgIHNpemVfdCBtX3JlbmRlclNsaWNl
U2l6ZTsKKworICAgIC8vIEZpcnN0IHN0YWdlIHdpbGwgYmUgb2Ygc2l6ZSBtX21pbkZGVFNpemUu
ICBFYWNoIG5leHQgc3RhZ2Ugd2lsbCBiZSB0d2ljZSBhcyBiaWcgdW50aWwgd2UgaGl0IG1fbWF4
RkZUU2l6ZS4KKyAgICBzaXplX3QgbV9taW5GRlRTaXplOworICAgIHNpemVfdCBtX21heEZGVFNp
emU7CisKKyAgICAvLyBCdXQgZG9uJ3QgZXhjZWVkIHRoaXMgc2l6ZSBpbiB0aGUgcmVhbC10aW1l
IHRocmVhZCAoaWYgd2UncmUgZG9pbmcgYmFja2dyb3VuZCBwcm9jZXNzaW5nKS4KKyAgICBzaXpl
X3QgbV9tYXhSZWFsdGltZUZGVFNpemU7CisKKyAgICAvLyBCYWNrZ3JvdW5kIHRocmVhZCBhbmQg
c3luY2hyb25pemF0aW9uCisgICAgYm9vbCBtX3VzZUJhY2tncm91bmRUaHJlYWRzOworICAgIFRo
cmVhZElkZW50aWZpZXIgbV9iYWNrZ3JvdW5kVGhyZWFkOworICAgIGJvb2wgbV93YW50c1RvRXhp
dDsKKyAgICBib29sIG1fbW9yZUlucHV0QnVmZmVyZWQ7CisgICAgbXV0YWJsZSBNdXRleCBtX2Jh
Y2tncm91bmRUaHJlYWRMb2NrOworICAgIG11dGFibGUgVGhyZWFkQ29uZGl0aW9uIG1fYmFja2dy
b3VuZFRocmVhZENvbmRpdGlvbjsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIFJldmVyYkNvbnZvbHZlcl9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2
ZXJiQ29udm9sdmVyU3RhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjdhOGI2ODEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVy
YkNvbnZvbHZlclN0YWdlLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgorCisjaW5jbHVkZSAiQWNjZWxl
cmF0ZS5oIgorI2luY2x1ZGUgIlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oIgorI2luY2x1ZGUg
IlJldmVyYkNvbnZvbHZlci5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVmZmVyLmgiCisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiQ29udm9sdmVyU3RhZ2U6OlJldmVyYkNvbnZvbHZlclN0
YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90
IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5n
dGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZm
dFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgUmV2ZXJi
QWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZmZXIpCisgICAgOiBtX2ZmdEtlcm5l
bChmZnRTaXplKQorICAgICwgbV9hY2N1bXVsYXRpb25CdWZmZXIoYWNjdW11bGF0aW9uQnVmZmVy
KQorICAgICwgbV9hY2N1bXVsYXRpb25SZWFkSW5kZXgoMCkKKyAgICAsIG1faW5wdXRSZWFkSW5k
ZXgoMCkKKyAgICAsIG1faW1wdWxzZVJlc3BvbnNlTGVuZ3RoKHJlc3BvbnNlTGVuZ3RoKQorewor
ICAgIEFTU0VSVChpbXB1bHNlUmVzcG9uc2UpOworICAgIEFTU0VSVChhY2N1bXVsYXRpb25CdWZm
ZXIpOworICAgIAorICAgIG1fZmZ0S2VybmVsLmRvUGFkZGVkRkZUKGltcHVsc2VSZXNwb25zZSAr
IHN0YWdlT2Zmc2V0LCBzdGFnZUxlbmd0aCk7CisgICAgbV9jb252b2x2ZXIgPSBuZXcgRkZUQ29u
dm9sdmVyKGZmdFNpemUpOworICAgIG1fdGVtcG9yYXJ5QnVmZmVyLmFsbG9jYXRlKHJlbmRlclNs
aWNlU2l6ZSk7CisKKyAgICAvLyBUaGUgY29udm9sdXRpb24gc3RhZ2UgYXQgb2Zmc2V0IHN0YWdl
T2Zmc2V0IG5lZWRzIHRvIGhhdmUgYSBjb3JyZXNwb25kaW5nIGRlbGF5IHRvIGNhbmNlbCBvdXQg
dGhlIG9mZnNldC4KKyAgICBzaXplX3QgdG90YWxEZWxheSA9IHN0YWdlT2Zmc2V0ICsgcmV2ZXJi
VG90YWxMYXRlbmN5OworCisgICAgLy8gQnV0LCB0aGUgRkZUIGNvbnZvbHV0aW9uIGl0c2VsZiBp
bmN1cnMgZmZ0U2l6ZSAvIDIgbGF0ZW5jeSwgc28gc3VidHJhY3QgdGhpcyBvdXQuLi4KKyAgICBz
aXplX3QgaGFsZlNpemUgPSBmZnRTaXplIC8gMjsKKyAgICBBU1NFUlQodG90YWxEZWxheSA+PSBo
YWxmU2l6ZSk7CisgICAgaWYgKHRvdGFsRGVsYXkgPj0gaGFsZlNpemUpCisgICAgICAgIHRvdGFs
RGVsYXkgLT0gaGFsZlNpemU7CisKKyAgICAvLyBXZSBkaXZpZGUgdXAgdGhlIHRvdGFsIGRlbGF5
LCBpbnRvIHByZSBhbmQgcG9zdCBkZWxheSBzZWN0aW9ucyBzbyB0aGF0IHdlIGNhbiBzY2hlZHVs
ZSBhdCBleGFjdGx5IHRoZSBtb21lbnQgd2hlbiB0aGUgRkZUIHdpbGwgaGFwcGVuLgorICAgIC8v
IFRoaXMgaXMgY29vcmRpbmF0ZWQgd2l0aCB0aGUgb3RoZXIgc3RhZ2VzLCBzbyB0aGV5IGRvbid0
IGFsbCBkbyB0aGVpciBGRlRzIGF0IHRoZSBzYW1lIHRpbWUuLi4KKyAgICBpbnQgbWF4UHJlRGVs
YXlMZW5ndGggPSBzdGQ6Om1pbihoYWxmU2l6ZSwgdG90YWxEZWxheSk7CisgICAgbV9wcmVEZWxh
eUxlbmd0aCA9IHRvdGFsRGVsYXkgPiAwID8gcmVuZGVyUGhhc2UgJSBtYXhQcmVEZWxheUxlbmd0
aCA6IDA7CisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiB0b3RhbERlbGF5KQorICAgICAgICBt
X3ByZURlbGF5TGVuZ3RoID0gMDsKKworICAgIG1fcG9zdERlbGF5TGVuZ3RoID0gdG90YWxEZWxh
eSAtIG1fcHJlRGVsYXlMZW5ndGg7CisgICAgbV9wcmVSZWFkV3JpdGVJbmRleCA9IDA7CisgICAg
bV9mcmFtZXNQcm9jZXNzZWQgPSAwOyAvLyB0b3RhbCBmcmFtZXMgcHJvY2Vzc2VkIHNvIGZhcgor
CisgICAgbV9wcmVEZWxheUJ1ZmZlci5hbGxvY2F0ZShtX3ByZURlbGF5TGVuZ3RoIDwgZmZ0U2l6
ZSA/IGZmdFNpemUgOiBtX3ByZURlbGF5TGVuZ3RoKTsKK30KKwordm9pZCBSZXZlcmJDb252b2x2
ZXJTdGFnZTo6cHJvY2Vzc0luQmFja2dyb3VuZChSZXZlcmJDb252b2x2ZXIqIGNvbnZvbHZlciwg
c2l6ZV90IGZyYW1lc1RvUHJvY2VzcykKK3sKKyAgICBSZXZlcmJJbnB1dEJ1ZmZlciogaW5wdXRC
dWZmZXIgPSBjb252b2x2ZXItPmlucHV0QnVmZmVyKCk7CisgICAgZmxvYXQqIHNvdXJjZSA9IGlu
cHV0QnVmZmVyLT5kaXJlY3RSZWFkRnJvbSgmbV9pbnB1dFJlYWRJbmRleCwgZnJhbWVzVG9Qcm9j
ZXNzKTsKKyAgICBwcm9jZXNzKHNvdXJjZSwgZnJhbWVzVG9Qcm9jZXNzKTsKK30KKwordm9pZCBS
ZXZlcmJDb252b2x2ZXJTdGFnZTo6cHJvY2VzcyhmbG9hdCogc291cmNlLCBzaXplX3QgZnJhbWVz
VG9Qcm9jZXNzKQoreworICAgIEFTU0VSVChzb3VyY2UpOworICAgIGlmICghc291cmNlKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgLy8gRGVhbCB3aXRoIHByZS1kZWxheSBzdHJlYW0gOiBu
b3RlIHNwZWNpYWwgaGFuZGxpbmcgb2YgemVybyBkZWxheS4KKworICAgIGZsb2F0KiBwcmVEZWxh
eWVkU291cmNlOworICAgIGZsb2F0KiB0ZW1wb3JhcnlCdWZmZXI7CisgICAgYm9vbCBpc1RlbXBv
cmFyeUJ1ZmZlclNhZmUgPSBmYWxzZTsKKyAgICBpZiAobV9wcmVEZWxheUxlbmd0aCA+IDApIHsK
KyAgICAgICAgLy8gSGFuZGxlcyBib3RoIHRoZSByZWFkIGNhc2UgKGNhbGwgdG8gcHJvY2Vzcygp
ICkgYW5kIHRoZSB3cml0ZSBjYXNlIChtZW1jcHkoKSApCisgICAgICAgIGJvb2wgaXNQcmVEZWxh
eVNhZmUgPSBtX3ByZVJlYWRXcml0ZUluZGV4ICsgZnJhbWVzVG9Qcm9jZXNzIDw9IG1fcHJlRGVs
YXlCdWZmZXIuc2l6ZSgpOworICAgICAgICBBU1NFUlQoaXNQcmVEZWxheVNhZmUpOworICAgICAg
ICBpZiAoIWlzUHJlRGVsYXlTYWZlKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlz
VGVtcG9yYXJ5QnVmZmVyU2FmZSA9IGZyYW1lc1RvUHJvY2VzcyA8PSBtX3RlbXBvcmFyeUJ1ZmZl
ci5zaXplKCk7CisKKyAgICAgICAgcHJlRGVsYXllZFNvdXJjZSA9IG1fcHJlRGVsYXlCdWZmZXIu
ZGF0YSgpICsgbV9wcmVSZWFkV3JpdGVJbmRleDsKKyAgICAgICAgdGVtcG9yYXJ5QnVmZmVyID0g
bV90ZW1wb3JhcnlCdWZmZXI7ICAgICAgICAKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBaZXJv
IGRlbGF5CisgICAgICAgIHByZURlbGF5ZWRTb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRlbXBv
cmFyeUJ1ZmZlciA9IG1fcHJlRGVsYXlCdWZmZXIuZGF0YSgpOworICAgICAgICAKKyAgICAgICAg
aXNUZW1wb3JhcnlCdWZmZXJTYWZlID0gZnJhbWVzVG9Qcm9jZXNzIDw9IG1fcHJlRGVsYXlCdWZm
ZXIuc2l6ZSgpOworICAgIH0KKyAgICAKKyAgICBBU1NFUlQoaXNUZW1wb3JhcnlCdWZmZXJTYWZl
KTsKKyAgICBpZiAoIWlzVGVtcG9yYXJ5QnVmZmVyU2FmZSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaW50IHdyaXRlSW5kZXggPSAwOworCisgICAgaWYgKG1fZnJhbWVzUHJvY2Vzc2VkIDwgbV9w
cmVEZWxheUxlbmd0aCkgeworICAgICAgICAvLyBGb3IgdGhlIGZpcnN0IG1fcHJlRGVsYXlMZW5n
dGggZnJhbWVzIGRvbid0IHByb2Nlc3MgdGhlIGNvbnZvbHZlciwgaW5zdGVhZCBzaW1wbHkgYnVm
ZmVyIGluIHRoZSBwcmUtZGVsYXkuCisgICAgICAgIC8vIEJ1dCB3aGlsZSBidWZmZXJpbmcgdGhl
IHByZS1kZWxheSwgd2Ugc3RpbGwgbmVlZCB0byB1cGRhdGUgb3VyIGluZGV4LgorICAgICAgICBt
X2FjY3VtdWxhdGlvbkJ1ZmZlci0+dXBkYXRlUmVhZEluZGV4KCZtX2FjY3VtdWxhdGlvblJlYWRJ
bmRleCwgZnJhbWVzVG9Qcm9jZXNzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOb3csIHJ1
biB0aGUgY29udm9sdXRpb24gKGludG8gdGhlIGRlbGF5IGJ1ZmZlcikuCisgICAgICAgIC8vIEFu
IGV4cGVuc2l2ZSBGRlQgd2lsbCBoYXBwZW4gZXZlcnkgZmZ0U2l6ZSAvIDIgZnJhbWVzLgorICAg
ICAgICAvLyBXZSBwcm9jZXNzIGluLXBsYWNlIGhlcmUuLi4KKyAgICAgICAgbV9jb252b2x2ZXIt
PnByb2Nlc3MoJm1fZmZ0S2VybmVsLCBwcmVEZWxheWVkU291cmNlLCB0ZW1wb3JhcnlCdWZmZXIs
IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICAgICAgLy8gTm93IGFjY3VtdWxhdGUgaW50byByZXZl
cmIncyBhY2N1bXVsYXRpb24gYnVmZmVyLgorICAgICAgICB3cml0ZUluZGV4ID0gbV9hY2N1bXVs
YXRpb25CdWZmZXItPmFjY3VtdWxhdGUodGVtcG9yYXJ5QnVmZmVyLCBmcmFtZXNUb1Byb2Nlc3Ms
ICZtX2FjY3VtdWxhdGlvblJlYWRJbmRleCwgbV9wb3N0RGVsYXlMZW5ndGgpOworICAgIH0KKwor
ICAgIC8vIEZpbmFsbHkgY29weSBpbnB1dCB0byBwcmUtZGVsYXkuCisgICAgaWYgKG1fcHJlRGVs
YXlMZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShwcmVEZWxheWVkU291cmNlLCBzb3VyY2Us
IHNpemVvZihmbG9hdCkgKiBmcmFtZXNUb1Byb2Nlc3MpOworICAgICAgICBtX3ByZVJlYWRXcml0
ZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKworICAgICAgICBBU1NFUlQobV9wcmVSZWFkV3Jp
dGVJbmRleCA8PSBtX3ByZURlbGF5TGVuZ3RoKTsKKyAgICAgICAgaWYgKG1fcHJlUmVhZFdyaXRl
SW5kZXggPj0gbV9wcmVEZWxheUxlbmd0aCkKKyAgICAgICAgICAgIG1fcHJlUmVhZFdyaXRlSW5k
ZXggPSAwOworICAgIH0KKworICAgIG1fZnJhbWVzUHJvY2Vzc2VkICs9IGZyYW1lc1RvUHJvY2Vz
czsKK30KKwordm9pZCBSZXZlcmJDb252b2x2ZXJTdGFnZTo6cmVzZXQoKQoreworICAgIG1fY29u
dm9sdmVyLT5yZXNldCgpOworICAgIG1fcHJlRGVsYXlCdWZmZXIuemVybygpOworICAgIG1fYWNj
dW11bGF0aW9uUmVhZEluZGV4ID0gMDsKKyAgICBtX2lucHV0UmVhZEluZGV4ID0gMDsKKyAgICBt
X2ZyYW1lc1Byb2Nlc3NlZCA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAt
LWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCBiL1dl
YkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODM1MWFmCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5oCkBAIC0wLDAgKzEsODMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICog
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKyNkZWZpbmUgUmV2ZXJiQ29udm9sdmVy
U3RhZ2VfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAiRkZURnJh
bWUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
Y2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOworY2xhc3MgUmV2ZXJiQ29udm9sdmVyOwor
Y2xhc3MgRkZUQ29udm9sdmVyOworICAgIAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFnZSByZXBy
ZXNlbnRzIHRoZSBjb252b2x1dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlvbiBvZiBh
IGxhcmdlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxheSBsaW5l
IHRvIGFjY291bnQgZm9yIHRoZSBvZmZzZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhpbiB0aGUg
bGFyZ2VyIGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFnZSB7Citw
dWJsaWM6CisgICAgLy8gcmVuZGVyUGhhc2UgaXMgdXNlZnVsIHRvIGtub3cgc28gdGhhdCB3ZSBj
YW4gbWFuaXB1bGF0ZSB0aGUgcHJlIHZlcnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3RhZ2VzIHdp
bGwgcGVyZm9ybQorICAgIC8vIHRoZWlyIGhlYXZ5IHdvcmsgKEZGVCBwcm9jZXNzaW5nKSBvbiBk
aWZmZXJlbnQgc2xpY2VzIHRvIGJhbGFuY2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUgdGhyZWFk
LgorICAgIFJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2UsIHNpemVf
dCByZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90IHN0YWdl
T2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6
ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwg
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZmZXIpOworCisgICAgLy8g
V0FSTklORzogZnJhbWVzVG9Qcm9jZXNzIG11c3QgYmUgc3VjaCB0aGF0IGl0IGV2ZW5seSBkaXZp
ZGVzIHRoZSBkZWxheSBidWZmZXIgc2l6ZSAoc3RhZ2Vfb2Zmc2V0KS4KKyAgICB2b2lkIHByb2Nl
c3MoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2b2lkIHBy
b2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVfdCBmcmFt
ZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gVXNlZnVsIGZvciBi
YWNrZ3JvdW5kIHByb2Nlc3NpbmcKKyAgICBpbnQgaW5wdXRSZWFkSW5kZXgoKSBjb25zdCB7IHJl
dHVybiBtX2lucHV0UmVhZEluZGV4OyB9CisKK3ByaXZhdGU6CisgICAgRkZURnJhbWUgbV9mZnRL
ZXJuZWw7CisgICAgT3duUHRyPEZGVENvbnZvbHZlcj4gbV9jb252b2x2ZXI7CisKKyAgICBBdWRp
b0Zsb2F0QXJyYXkgbV9wcmVEZWxheUJ1ZmZlcjsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1
ZmZlciogbV9hY2N1bXVsYXRpb25CdWZmZXI7CisgICAgaW50IG1fYWNjdW11bGF0aW9uUmVhZElu
ZGV4OworICAgIGludCBtX2lucHV0UmVhZEluZGV4OworCisgICAgc2l6ZV90IG1fcHJlRGVsYXlM
ZW5ndGg7CisgICAgc2l6ZV90IG1fcG9zdERlbGF5TGVuZ3RoOworICAgIHNpemVfdCBtX3ByZVJl
YWRXcml0ZUluZGV4OworICAgIHNpemVfdCBtX2ZyYW1lc1Byb2Nlc3NlZDsKKworICAgIEF1ZGlv
RmxvYXRBcnJheSBtX3RlbXBvcmFyeUJ1ZmZlcjsKKworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNw
b25zZUxlbmd0aDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJl
dmVyYkNvbnZvbHZlclN0YWdlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiSW5wdXRCdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1
dEJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRhYWMzZQot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZm
ZXIuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0
aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5h
bWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
UmV2ZXJiSW5wdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZlcmJJbnB1
dEJ1ZmZlcjo6UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1fYnVmZmVy
KGxlbmd0aCkKKyAgICAsIG1fd3JpdGVJbmRleCgwKQoreworfQorCit2b2lkIFJldmVyYklucHV0
QnVmZmVyOjp3cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKQorewor
ICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9vbCBpc0Nv
cHlTYWZlID0gbV93cml0ZUluZGV4ICsgbnVtYmVyT2ZGcmFtZXMgPD0gYnVmZmVyTGVuZ3RoOwor
ICAgIEFTU0VSVChpc0NvcHlTYWZlKTsKKyAgICBpZiAoIWlzQ29weVNhZmUpCisgICAgICAgIHJl
dHVybjsKKyAgICAgICAgCisgICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG1fd3JpdGVJbmRl
eCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIG51bWJlck9mRnJhbWVzKTsKKworICAgIG1fd3Jp
dGVJbmRleCArPSBudW1iZXJPZkZyYW1lczsKKyAgICBBU1NFUlQobV93cml0ZUluZGV4IDw9IGJ1
ZmZlckxlbmd0aCk7CisKKyAgICBpZiAobV93cml0ZUluZGV4ID49IGJ1ZmZlckxlbmd0aCkKKyAg
ICAgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworZmxvYXQqIFJldmVyYklucHV0QnVmZmVyOjpk
aXJlY3RSZWFkRnJvbShpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKQorewor
ICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9vbCBpc1Bv
aW50ZXJHb29kID0gcmVhZEluZGV4ICYmICpyZWFkSW5kZXggPj0gMCAmJiAqcmVhZEluZGV4ICsg
bnVtYmVyT2ZGcmFtZXMgPD0gYnVmZmVyTGVuZ3RoOworICAgIEFTU0VSVChpc1BvaW50ZXJHb29k
KTsKKyAgICBpZiAoIWlzUG9pbnRlckdvb2QpIHsKKyAgICAgICAgLy8gU2hvdWxkIG5ldmVyIGhh
cHBlbiBpbiBwcmFjdGljZSBidXQgcmV0dXJuIHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVmZmVyIChh
dm9pZCBjcmFzaCkKKyAgICAgICAgaWYgKHJlYWRJbmRleCkKKyAgICAgICAgICAgICpyZWFkSW5k
ZXggPSAwOworICAgICAgICByZXR1cm4gbV9idWZmZXIuZGF0YSgpOworICAgIH0KKyAgICAgICAg
CisgICAgZmxvYXQqIHNvdXJjZVAgPSBtX2J1ZmZlcjsKKyAgICBmbG9hdCogcCA9IHNvdXJjZVAg
KyAqcmVhZEluZGV4OworCisgICAgLy8gVXBkYXRlIHJlYWRJbmRleAorICAgICpyZWFkSW5kZXgg
PSAoKnJlYWRJbmRleCArIG51bWJlck9mRnJhbWVzKSAlIGJ1ZmZlckxlbmd0aDsKKworICAgIHJl
dHVybiBwOworfQorCit2b2lkIFJldmVyYklucHV0QnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9i
dWZmZXIuemVybygpOworICAgIG1fd3JpdGVJbmRleCA9IDA7Cit9CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRC
dWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTljZjQxCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oCkBAIC0wLDAgKzEs
NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFJldmVyYklucHV0QnVmZmVyX2gKKyNkZWZpbmUgUmV2ZXJiSW5wdXRC
dWZmZXJfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworLy8gUmV2ZXJiSW5wdXRCdWZmZXIgaXMgdXNlZCB0byBidWZmZXIgaW5wdXQgc2Ft
cGxlcyBmb3IgZGVmZXJyZWQgcHJvY2Vzc2luZyBieSB0aGUgYmFja2dyb3VuZCB0aHJlYWRzLgor
Y2xhc3MgUmV2ZXJiSW5wdXRCdWZmZXIgeworcHVibGljOgorICAgIFJldmVyYklucHV0QnVmZmVy
KHNpemVfdCBsZW5ndGgpOworCisgICAgLy8gVGhlIHJlYWx0aW1lIGF1ZGlvIHRocmVhZCBrZWVw
cyB3cml0aW5nIHNhbXBsZXMgaGVyZS4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHRo
ZSBidWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJsZSBieSBudW1iZXJPZkZyYW1lcyAo
Zm9yIG5lYXJseSBhbGwgY2FzZXMgdGhpcyB3aWxsIGJlIGZpbmUpLgorICAgIC8vIEZJWE1FOiBy
ZW1vdmUgbnVtYmVyT2ZGcmFtZXMgcmVzdHJpY3Rpb24uLi4KKyAgICB2b2lkIHdyaXRlKGZsb2F0
KiBzb3VyY2VQLCBzaXplX3QgbnVtYmVyT2ZGcmFtZXMpOworCisgICAgLy8gQmFja2dyb3VuZCB0
aHJlYWRzIGNhbiBjYWxsIHRoaXMgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnl0aGluZyB0byByZWFk
Li4uCisgICAgc2l6ZV90IHdyaXRlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtX3dyaXRlSW5kZXg7
IH0KKworICAgIC8vIFRoZSBpbmRpdmlkdWFsIGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGhlcmUg
KGFuZCBob3BlIHRoYXQgdGhleSBjYW4ga2VlcCB1cCB3aXRoIHRoZSBidWZmZXIgd3JpdGluZyku
CisgICAgLy8gcmVhZEluZGV4IGlzIHVwZGF0ZWQgd2l0aCB0aGUgbmV4dCByZWFkSW5kZXggdG8g
cmVhZCBmcm9tLi4uCisgICAgLy8gVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB0aGUgYnVmZmVyJ3Mg
bGVuZ3RoIGlzIGV2ZW5seSBkaXZpc2libGUgYnkgbnVtYmVyT2ZGcmFtZXMuCisgICAgLy8gRklY
TUU6IHJlbW92ZSBudW1iZXJPZkZyYW1lcyByZXN0cmljdGlvbi4uLgorICAgIGZsb2F0KiBkaXJl
Y3RSZWFkRnJvbShpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKTsKKworICAg
IHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9idWZmZXI7
CisgICAgc2l6ZV90IG1fd3JpdGVJbmRleDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmIC8vIFJldmVyYklucHV0QnVmZmVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65615</attachid>
            <date>2010-08-26 13:52:15 -0700</date>
            <delta_ts>2010-08-30 15:43:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-34912-20100826135214.patch</filename>
            <type>text/plain</type>
            <size>42629</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjEzMCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNDggQEAKKzIwMTAtMDgtMjYgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBh
dWRpbyBlbmdpbmU6IGFkZCBSZXZlcmJDb252b2x2ZXIgY2xhc3MKKyAgICAgICAgaHR0cHM6Ly9i
dWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM0OTEyCisKKyAgICAgICAgTm8gbmV3IHRl
c3RzIHNpbmNlIGF1ZGlvIEFQSSBpcyBub3QgeWV0IGltcGxlbWVudGVkLgorCisgICAgICAgICog
cGxhdGZvcm0vYXVkaW86IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkFj
Y3VtdWxhdGlvbkJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNj
dW11bGF0aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjpyZWFkQW5kQ2xlYXIpOgorICAgICAgICAo
V2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjp1cGRhdGVSZWFkSW5kZXgpOgorICAg
ICAgICAoV2ViQ29yZTo6UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVsYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVzZXQpOgorICAgICAg
ICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oOiBBZGRlZC4KKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZEluZGV4KToKKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcjo6cmVhZFRpbWVGcmFtZSk6
CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpiYWNrZ3JvdW5kVGhyZWFkRW50cnkpOgorICAgICAgICAoV2ViQ29y
ZTo6UmV2ZXJiQ29udm9sdmVyOjpSZXZlcmJDb252b2x2ZXIpOgorICAgICAgICAoV2ViQ29yZTo6
UmV2ZXJiQ29udm9sdmVyOjp+UmV2ZXJiQ29udm9sdmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJl
dmVyYkNvbnZvbHZlcjo6YmFja2dyb3VuZFRocmVhZEVudHJ5KToKKyAgICAgICAgKFdlYkNvcmU6
OlJldmVyYkNvbnZvbHZlcjo6cHJvY2Vzcyk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252
b2x2ZXI6OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIu
aDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OmltcHVsc2VSZXNw
b25zZUxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXI6OmlucHV0QnVm
ZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlcjo6dXNlQmFja2dyb3VuZFRo
cmVhZHMpOgorICAgICAgICAqIHBsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNw
cDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJDb252b2x2ZXJTdGFnZTo6UmV2ZXJi
Q29udm9sdmVyU3RhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6
OnByb2Nlc3NJbkJhY2tncm91bmQpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVy
U3RhZ2U6OnByb2Nlc3MpOgorICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiQ29udm9sdmVyU3RhZ2U6
OnJlc2V0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXJTdGFnZS5o
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYkNvbnZvbHZlclN0YWdlOjppbnB1dFJl
YWRJbmRleCk6CisgICAgICAgICogcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjpSZXZlcmJJbnB1
dEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6UmV2ZXJiSW5wdXRCdWZmZXI6OmRpcmVjdFJlYWRGcm9tKToKKyAg
ICAgICAgKFdlYkNvcmU6OlJldmVyYklucHV0QnVmZmVyOjpyZXNldCk6CisgICAgICAgICogcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpSZXZlcmJJbnB1dEJ1ZmZlcjo6d3JpdGVJbmRleCk6CisKIDIwMTAtMDgtMjYgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
S2VubmV0aCBSdXNzZWxsLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1
bXVsYXRpb25CdWZmZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vYXVkaW8vUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisg
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FV
RElPKQorCisjaW5jbHVkZSAiUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyLmgiCisKKyNpbmNsdWRl
ICJBY2NlbGVyYXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUmV2ZXJiQWNjdW11bGF0
aW9uQnVmZmVyOjpSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6
IG1fYnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fcmVhZEluZGV4KDApCisgICAgLCBtX3JlYWRUaW1l
RnJhbWUoMCkKK3sKK30KKwordm9pZCBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXI6OnJlYWRBbmRD
bGVhcihmbG9hdCogZGVzdGluYXRpb24sIHNpemVfdCBudW1iZXJPZkZyYW1lcykKK3sKKyAgICBz
aXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIuc2l6ZSgpOworICAgIGJvb2wgaXNDb3B5U2Fm
ZSA9IG1fcmVhZEluZGV4IDw9IGJ1ZmZlckxlbmd0aCAmJiBudW1iZXJPZkZyYW1lcyA8PSBidWZm
ZXJMZW5ndGg7CisgICAgCisgICAgQVNTRVJUKGlzQ29weVNhZmUpOworICAgIGlmICghaXNDb3B5
U2FmZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2l6ZV90IGZyYW1lc0F2YWlsYWJsZSA9IGJ1
ZmZlckxlbmd0aCAtIG1fcmVhZEluZGV4OworICAgIHNpemVfdCBudW1iZXJPZkZyYW1lczEgPSBz
dGQ6Om1pbihudW1iZXJPZkZyYW1lcywgZnJhbWVzQXZhaWxhYmxlKTsKKyAgICBzaXplX3QgbnVt
YmVyT2ZGcmFtZXMyID0gbnVtYmVyT2ZGcmFtZXMgLSBudW1iZXJPZkZyYW1lczE7CisKKyAgICBm
bG9hdCogc291cmNlID0gbV9idWZmZXIuZGF0YSgpOworICAgIG1lbWNweShkZXN0aW5hdGlvbiwg
c291cmNlICsgbV9yZWFkSW5kZXgsIHNpemVvZihmbG9hdCkgKiBudW1iZXJPZkZyYW1lczEpOwor
ICAgIG1lbXNldChzb3VyY2UgKyBtX3JlYWRJbmRleCwgMCwgc2l6ZW9mKGZsb2F0KSAqIG51bWJl
ck9mRnJhbWVzMSk7CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5Cisg
ICAgaWYgKG51bWJlck9mRnJhbWVzMiA+IDApIHsKKyAgICAgICAgbWVtY3B5KGRlc3RpbmF0aW9u
ICsgbnVtYmVyT2ZGcmFtZXMxLCBzb3VyY2UsIHNpemVvZihmbG9hdCkgKiBudW1iZXJPZkZyYW1l
czIpOworICAgICAgICBtZW1zZXQoc291cmNlLCAwLCBzaXplb2YoZmxvYXQpICogbnVtYmVyT2ZG
cmFtZXMyKTsKKyAgICB9CisKKyAgICBtX3JlYWRJbmRleCA9IChtX3JlYWRJbmRleCArIG51bWJl
ck9mRnJhbWVzKSAlIGJ1ZmZlckxlbmd0aDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgKz0gbnVtYmVy
T2ZGcmFtZXM7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOjp1cGRhdGVSZWFk
SW5kZXgoaW50KiByZWFkSW5kZXgsIHNpemVfdCBudW1iZXJPZkZyYW1lcykgY29uc3QKK3sKKyAg
ICAvLyBVcGRhdGUgY2FsbGVyJ3MgcmVhZEluZGV4CisgICAgKnJlYWRJbmRleCA9ICgqcmVhZElu
ZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgbV9idWZmZXIuc2l6ZSgpOworfQorCitpbnQgUmV2ZXJi
QWNjdW11bGF0aW9uQnVmZmVyOjphY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBudW1i
ZXJPZkZyYW1lcywgaW50KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcykKK3sKKyAgICBz
aXplX3QgYnVmZmVyTGVuZ3RoID0gbV9idWZmZXIuc2l6ZSgpOworICAgIAorICAgIHNpemVfdCB3
cml0ZUluZGV4ID0gKCpyZWFkSW5kZXggKyBkZWxheUZyYW1lcykgJSBidWZmZXJMZW5ndGg7CisK
KyAgICAvLyBVcGRhdGUgY2FsbGVyJ3MgcmVhZEluZGV4CisgICAgKnJlYWRJbmRleCA9ICgqcmVh
ZEluZGV4ICsgbnVtYmVyT2ZGcmFtZXMpICUgYnVmZmVyTGVuZ3RoOworCisgICAgc2l6ZV90IGZy
YW1lc0F2YWlsYWJsZSA9IGJ1ZmZlckxlbmd0aCAtIHdyaXRlSW5kZXg7CisgICAgc2l6ZV90IG51
bWJlck9mRnJhbWVzMSA9IHN0ZDo6bWluKG51bWJlck9mRnJhbWVzLCBmcmFtZXNBdmFpbGFibGUp
OworICAgIHNpemVfdCBudW1iZXJPZkZyYW1lczIgPSBudW1iZXJPZkZyYW1lcyAtIG51bWJlck9m
RnJhbWVzMTsKKworICAgIGZsb2F0KiBkZXN0aW5hdGlvbiA9IG1fYnVmZmVyLmRhdGEoKTsKKwor
ICAgIGJvb2wgaXNTYWZlID0gd3JpdGVJbmRleCA8PSBidWZmZXJMZW5ndGggJiYgbnVtYmVyT2ZG
cmFtZXMxICsgd3JpdGVJbmRleCA8PSBidWZmZXJMZW5ndGggJiYgbnVtYmVyT2ZGcmFtZXMyIDw9
IGJ1ZmZlckxlbmd0aDsKKyAgICBBU1NFUlQoaXNTYWZlKTsKKyAgICBpZiAoIWlzU2FmZSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICB2YWRkKHNvdXJjZSwgMSwgZGVzdGluYXRpb24gKyB3cml0
ZUluZGV4LCAxLCBkZXN0aW5hdGlvbiArIHdyaXRlSW5kZXgsIDEsIG51bWJlck9mRnJhbWVzMSk7
CisKKyAgICAvLyBIYW5kbGUgd3JhcC1hcm91bmQgaWYgbmVjZXNzYXJ5CisgICAgaWYgKG51bWJl
ck9mRnJhbWVzMiA+IDApICAgICAgIAorICAgICAgICB2YWRkKHNvdXJjZSArIG51bWJlck9mRnJh
bWVzMSwgMSwgZGVzdGluYXRpb24sIDEsIGRlc3RpbmF0aW9uLCAxLCBudW1iZXJPZkZyYW1lczIp
OworCisgICAgcmV0dXJuIHdyaXRlSW5kZXg7Cit9CisKK3ZvaWQgUmV2ZXJiQWNjdW11bGF0aW9u
QnVmZmVyOjpyZXNldCgpCit7CisgICAgbV9idWZmZXIuemVybygpOworICAgIG1fcmVhZEluZGV4
ID0gMDsKKyAgICBtX3JlYWRUaW1lRnJhbWUgPSAwOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2F1ZGlvL1JldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlci5oCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5l
aXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUg
bmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwor
ICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiQWNjdW11bGF0aW9uQnVm
ZmVyX2gKKyNkZWZpbmUgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyX2gKKworI2luY2x1ZGUgIkF1
ZGlvRmxvYXRBcnJheS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciBpcyBhIGNpcmN1bGFyIGRlbGF5IGJ1ZmZlciB3aXRoIG9uZSBjbGllbnQg
cmVhZGluZyBmcm9tIGl0IGFuZCBtdWx0aXBsZSBjbGllbnRzCisvLyB3cml0aW5nL2FjY3VtdWxh
dGluZyB0byBpdCBhdCBkaWZmZXJlbnQgZGVsYXkgb2Zmc2V0cyBmcm9tIHRoZSByZWFkIHBvc2l0
aW9uLiAgVGhlIHJlYWQgb3BlcmF0aW9uIHdpbGwgemVybyB0aGUgbWVtb3J5CisvLyBqdXN0IHJl
YWQgZnJvbSB0aGUgYnVmZmVyLCBzbyBpdCB3aWxsIGJlIHJlYWR5IGZvciBhY2N1bXVsYXRpb24g
dGhlIG5leHQgdGltZSBhcm91bmQuCitjbGFzcyBSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIgewor
cHVibGljOgorICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlcihzaXplX3QgbGVuZ3RoKTsKKwor
ICAgIC8vIFRoaXMgd2lsbCByZWFkIGZyb20sIHRoZW4gY2xlYXItb3V0IG51bWJlck9mRnJhbWVz
CisgICAgdm9pZCByZWFkQW5kQ2xlYXIoZmxvYXQqIGRlc3RpbmF0aW9uLCBzaXplX3QgbnVtYmVy
T2ZGcmFtZXMpOworCisgICAgLy8gRWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSB3aWxsIGFjY3Vt
dWxhdGUgaXRzIG91dHB1dCBhdCB0aGUgYXBwcm9wcmlhdGUgZGVsYXkgZnJvbSB0aGUgcmVhZCBw
b3NpdGlvbi4KKyAgICAvLyBXZSBuZWVkIHRvIHBhc3MgaW4gYW5kIHVwZGF0ZSByZWFkSW5kZXgg
aGVyZSwgc2luY2UgZWFjaCBSZXZlcmJDb252b2x2ZXJTdGFnZSBtYXkgYmUgcnVubmluZyBpbgor
ICAgIC8vIGEgZGlmZmVyZW50IHRocmVhZCB0aGFuIHRoZSByZWFsdGltZSB0aHJlYWQgY2FsbGlu
ZyBSZWFkQW5kQ2xlYXIoKSBhbmQgbWFpbnRhaW5pbmcgbV9yZWFkSW5kZXgKKyAgICAvLyBSZXR1
cm5zIHRoZSB3cml0ZUluZGV4IHdoZXJlIHRoZSBhY2N1bXVsYXRpb24gdG9vayBwbGFjZQorICAg
IGludCBhY2N1bXVsYXRlKGZsb2F0KiBzb3VyY2UsIHNpemVfdCBudW1iZXJPZkZyYW1lcywgaW50
KiByZWFkSW5kZXgsIHNpemVfdCBkZWxheUZyYW1lcyk7CisKKyAgICBzaXplX3QgcmVhZEluZGV4
KCkgY29uc3QgeyByZXR1cm4gbV9yZWFkSW5kZXg7IH0KKyAgICB2b2lkIHVwZGF0ZVJlYWRJbmRl
eChpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVzKSBjb25zdDsKKworICAgIHNp
emVfdCByZWFkVGltZUZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV9yZWFkVGltZUZyYW1lOyB9CisK
KyAgICB2b2lkIHJlc2V0KCk7CisKK3ByaXZhdGU6CisgICAgQXVkaW9GbG9hdEFycmF5IG1fYnVm
ZmVyOworICAgIHNpemVfdCBtX3JlYWRJbmRleDsKKyAgICBzaXplX3QgbV9yZWFkVGltZUZyYW1l
OyAvLyBmb3IgZGVidWdnaW5nIChmcmFtZSBvbiBjb250aW51b3VzIHRpbWVsaW5lKQorfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiQWNjdW11bGF0aW9uQnVm
ZmVyX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5jcHAJ
KHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlci5j
cHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikg
bm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
CisjaWYgRU5BQkxFKFdFQl9BVURJTykKKworI2luY2x1ZGUgIlJldmVyYkNvbnZvbHZlci5oIgor
CisjaW5jbHVkZSAiQWNjZWxlcmF0ZS5oIgorI2luY2x1ZGUgIkF1ZGlvQnVzLmgiCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY29uc3QgaW50IElucHV0QnVmZmVyU2l6ZSA9IDggKiAxNjM4NDsK
KworLy8gV2Ugb25seSBwcm9jZXNzIHRoZSBsZWFkaW5nIHBvcnRpb24gb2YgdGhlIGltcHVsc2Ug
cmVzcG9uc2UgaW4gdGhlIHJlYWwtdGltZSB0aHJlYWQuICBXZSBkb24ndCBleGNlZWQgdGhpcyBs
ZW5ndGguCisvLyBJdCB0dXJucyBvdXQgdGhlbiwgdGhhdCB0aGUgYmFja2dyb3VuZCB0aHJlYWQg
aGFzIGFib3V0IDI3OG1zZWMgb2Ygc2NoZWR1bGluZyBzbG9wLgorLy8gRW1waXJpY2FsbHksIHRo
aXMgaGFzIGJlZW4gZm91bmQgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBnaXZpbmcg
ZW5vdWdoIHRpbWUgZm9yIHNjaGVkdWxpbmcgc2xvcCwKKy8vIHdoaWxlIHN0aWxsIG1pbmltaXpp
bmcgdGhlIGFtb3VudCBvZiBwcm9jZXNzaW5nIGRvbmUgaW4gdGhlIHByaW1hcnkgKGhpZ2gtcHJp
b3JpdHkpIHRocmVhZC4KKy8vIFRoaXMgd2FzIGZvdW5kIHRvIGJlIGEgZ29vZCB2YWx1ZSBvbiBN
YWMgT1MgWCwgYW5kIG1heSB3b3JrIHdlbGwgb24gb3RoZXIgcGxhdGZvcm1zIGFzIHdlbGwsIGFz
c3VtaW5nCisvLyB0aGUgdmVyeSByb3VnaCBzY2hlZHVsaW5nIGxhdGVuY2llcyBhcmUgc2ltaWxh
ciBvbiB0aGVzZSB0aW1lLXNjYWxlcy4gIE9mIGNvdXJzZSwgdGhpcyBjb2RlIG1heSBuZWVkIHRv
IGJlCisvLyB0dW5lZCBmb3IgaW5kaXZpZHVhbCBwbGF0Zm9ybXMgaWYgdGhpcyBhc3N1bXB0aW9u
IGlzIGZvdW5kIHRvIGJlIGluY29ycmVjdC4KK2NvbnN0IHNpemVfdCBSZWFsdGltZUZyYW1lTGlt
aXQgPSA4MTkyICArIDQwOTY7IC8vIH4yNzhtc2VjIEAgNDQuMUtIegorCitjb25zdCBzaXplX3Qg
TWluRkZUU2l6ZSA9IDI1NjsKK2NvbnN0IHNpemVfdCBNYXhSZWFsdGltZUZGVFNpemUgPSAyMDQ4
OworCitzdGF0aWMgdm9pZCogYmFja2dyb3VuZFRocmVhZEVudHJ5KHZvaWQqIHRocmVhZERhdGEp
Cit7CisgICAgUmV2ZXJiQ29udm9sdmVyKiByZXZlcmJDb252b2x2ZXIgPSBzdGF0aWNfY2FzdDxS
ZXZlcmJDb252b2x2ZXIqPih0aHJlYWREYXRhKTsKKyAgICByZXZlcmJDb252b2x2ZXItPmJhY2tn
cm91bmRUaHJlYWRFbnRyeSgpOworICAgIHJldHVybiAwOworfQorCitSZXZlcmJDb252b2x2ZXI6
OlJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwqIGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJl
bmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNpemUsIHNpemVfdCBjb252b2x2ZXJSZW5kZXJQ
aGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICA6IG1faW1wdWxzZVJlc3BvbnNl
TGVuZ3RoKGltcHVsc2VSZXNwb25zZS0+ZnJhbWVTaXplKCkpCisgICAgLCBtX2FjY3VtdWxhdGlv
bkJ1ZmZlcihpbXB1bHNlUmVzcG9uc2UtPmZyYW1lU2l6ZSgpICsgcmVuZGVyU2xpY2VTaXplKQor
ICAgICwgbV9pbnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNpemUpCisgICAgLCBtX3JlbmRlclNsaWNl
U2l6ZShyZW5kZXJTbGljZVNpemUpCisgICAgLCBtX21pbkZGVFNpemUoTWluRkZUU2l6ZSkgLy8g
Rmlyc3Qgc3RhZ2Ugd2lsbCBoYXZlIHRoaXMgc2l6ZSAtIHN1Y2Nlc3NpdmUgc3RhZ2VzIHdpbGwg
ZG91YmxlIGluIHNpemUgZWFjaCB0aW1lCisgICAgLCBtX21heEZGVFNpemUobWF4RkZUU2l6ZSkg
Ly8gdW50aWwgd2UgaGl0IG1fbWF4RkZUU2l6ZQorICAgICwgbV91c2VCYWNrZ3JvdW5kVGhyZWFk
cyh1c2VCYWNrZ3JvdW5kVGhyZWFkcykKKyAgICAsIG1fYmFja2dyb3VuZFRocmVhZCgwKQorICAg
ICwgbV93YW50c1RvRXhpdChmYWxzZSkKKyAgICAsIG1fbW9yZUlucHV0QnVmZmVyZWQoZmFsc2Up
Cit7CisgICAgLy8gSWYgd2UgYXJlIHVzaW5nIGJhY2tncm91bmQgdGhyZWFkcyB0aGVuIGRvbid0
IGV4Y2VlZCB0aGlzIEZGVCBzaXplIGZvciB0aGUKKyAgICAvLyBzdGFnZXMgd2hpY2ggcnVuIGlu
IHRoZSByZWFsLXRpbWUgdGhyZWFkLiAgVGhpcyBhdm9pZHMgaGF2aW5nIG9ubHkgb25lIG9yIHR3
bworICAgIC8vIGxhcmdlIHN0YWdlcyAoc2l6ZSAxNjM4NCBvciBzbykgYXQgdGhlIGVuZCB3aGlj
aCB0YWtlIGEgbG90IG9mIHRpbWUgZXZlcnkgc2V2ZXJhbAorICAgIC8vIHByb2Nlc3Npbmcgc2xp
Y2VzLiAgVGhpcyB3YXkgd2UgYW1vcnRpemUgdGhlIGNvc3Qgb3ZlciBtb3JlIHByb2Nlc3Npbmcg
c2xpY2VzLgorICAgIG1fbWF4UmVhbHRpbWVGRlRTaXplID0gTWF4UmVhbHRpbWVGRlRTaXplOwor
CisgICAgLy8gRm9yIHRoZSBtb21lbnQsIGEgZ29vZCB3YXkgdG8ga25vdyBpZiB3ZSBoYXZlIHJl
YWwtdGltZSBjb25zdHJhaW50IGlzIHRvIGNoZWNrIGlmIHdlJ3JlIHVzaW5nIGJhY2tncm91bmQg
dGhyZWFkcy4KKyAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSB3ZSdyZSBiZWluZyBydW4gZnJvbSBh
IGNvbW1hbmQtbGluZSB0b29sLgorICAgIGJvb2wgaGFzUmVhbHRpbWVDb25zdHJhaW50ID0gdXNl
QmFja2dyb3VuZFRocmVhZHM7CisKKyAgICBmbG9hdCogcmVzcG9uc2UgPSBpbXB1bHNlUmVzcG9u
c2UtPmRhdGEoKTsKKyAgICBzaXplX3QgdG90YWxSZXNwb25zZUxlbmd0aCA9IGltcHVsc2VSZXNw
b25zZS0+ZnJhbWVTaXplKCk7CisKKyAgICAvLyBCZWNhdXNlIHdlJ3JlIG5vdCB1c2luZyBkaXJl
Y3QtY29udm9sdXRpb24gaW4gdGhlIGxlYWRpbmcgcG9ydGlvbiwgdGhlIHJldmVyYiBoYXMgYW4g
b3ZlcmFsbCBsYXRlbmN5IG9mIGhhbGYgdGhlIGZpcnN0LXN0YWdlIEZGVCBzaXplCisgICAgc2l6
ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSA9IG1fbWluRkZUU2l6ZSAvIDI7CisKKyAgICBzaXplX3Qg
c3RhZ2VPZmZzZXQgPSAwOworICAgIGludCBpID0gMDsKKyAgICBzaXplX3QgZmZ0U2l6ZSA9IG1f
bWluRkZUU2l6ZTsKKyAgICB3aGlsZSAoc3RhZ2VPZmZzZXQgPCB0b3RhbFJlc3BvbnNlTGVuZ3Ro
KSB7CisgICAgICAgIHNpemVfdCBzdGFnZVNpemUgPSBmZnRTaXplIC8gMjsKKworICAgICAgICAv
LyBGb3IgdGhlIGxhc3Qgc3RhZ2UsIGl0J3MgcG9zc2libGUgdGhhdCBzdGFnZU9mZnNldCBpcyBz
dWNoIHRoYXQgd2UncmUgc3RyYWRkbGluZyB0aGUgZW5kCisgICAgICAgIC8vIG9mIHRoZSBpbXB1
bHNlIHJlc3BvbnNlIGJ1ZmZlciAoaWYgd2UgdXNlIHN0YWdlU2l6ZSksIHNvIHJlZHVjZSB0aGUg
bGFzdCBzdGFnZSdzIGxlbmd0aC4uLgorICAgICAgICBpZiAoc3RhZ2VTaXplICsgc3RhZ2VPZmZz
ZXQgPiB0b3RhbFJlc3BvbnNlTGVuZ3RoKQorICAgICAgICAgICAgc3RhZ2VTaXplID0gdG90YWxS
ZXNwb25zZUxlbmd0aCAtIHN0YWdlT2Zmc2V0OworCisgICAgICAgIC8vIFRoaXMgInN0YWdnZXJz
IiB0aGUgdGltZSB3aGVuIGVhY2ggRkZUIGhhcHBlbnMgc28gdGhleSBkb24ndCBhbGwgaGFwcGVu
IGF0IHRoZSBzYW1lIHRpbWUKKyAgICAgICAgaW50IHJlbmRlclBoYXNlID0gY29udm9sdmVyUmVu
ZGVyUGhhc2UgKyBpICogcmVuZGVyU2xpY2VTaXplOworCisgICAgICAgIE93blB0cjxSZXZlcmJD
b252b2x2ZXJTdGFnZT4gc3RhZ2UobmV3IFJldmVyYkNvbnZvbHZlclN0YWdlKHJlc3BvbnNlLCB0
b3RhbFJlc3BvbnNlTGVuZ3RoLCByZXZlcmJUb3RhbExhdGVuY3ksIHN0YWdlT2Zmc2V0LCBzdGFn
ZVNpemUsIGZmdFNpemUsIHJlbmRlclBoYXNlLCByZW5kZXJTbGljZVNpemUsICZtX2FjY3VtdWxh
dGlvbkJ1ZmZlcikpOworCisgICAgICAgIGJvb2wgaXNCYWNrZ3JvdW5kU3RhZ2UgPSBmYWxzZTsK
KworICAgICAgICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBzdGFnZU9mZnNl
dCA+IFJlYWx0aW1lRnJhbWVMaW1pdCkgeworICAgICAgICAgICAgbV9iYWNrZ3JvdW5kU3RhZ2Vz
LmFwcGVuZChzdGFnZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgaXNCYWNrZ3JvdW5kU3RhZ2Ug
PSB0cnVlOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fc3RhZ2VzLmFwcGVuZChzdGFn
ZS5yZWxlYXNlKCkpOworCisgICAgICAgIHN0YWdlT2Zmc2V0ICs9IHN0YWdlU2l6ZTsKKyAgICAg
ICAgKytpOworCisgICAgICAgIC8vIEZpZ3VyZSBvdXQgbmV4dCBGRlQgc2l6ZQorICAgICAgICBm
ZnRTaXplICo9IDI7CisgICAgICAgIGlmIChoYXNSZWFsdGltZUNvbnN0cmFpbnQgJiYgIWlzQmFj
a2dyb3VuZFN0YWdlICYmIGZmdFNpemUgPiBtX21heFJlYWx0aW1lRkZUU2l6ZSkKKyAgICAgICAg
ICAgIGZmdFNpemUgPSBtX21heFJlYWx0aW1lRkZUU2l6ZTsKKyAgICAgICAgaWYgKGZmdFNpemUg
PiBtX21heEZGVFNpemUpCisgICAgICAgICAgICBmZnRTaXplID0gbV9tYXhGRlRTaXplOworICAg
IH0KKworICAgIC8vIFN0YXJ0IHVwIGJhY2tncm91bmQgdGhyZWFkCisgICAgLy8gRklYTUU6IHdv
dWxkIGJlIGJldHRlciB0byB1cCB0aGUgdGhyZWFkIHByaW9yaXR5IGhlcmUuICBJdCBkb2Vzbid0
IG5lZWQgdG8gYmUgcmVhbC10aW1lLCBidXQgaGlnaGVyIHRoYW4gdGhlIGRlZmF1bHQuLi4KKyAg
ICBpZiAodGhpcy0+dXNlQmFja2dyb3VuZFRocmVhZHMoKSAmJiBtX2JhY2tncm91bmRTdGFnZXMu
c2l6ZSgpID4gMCkKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkID0gY3JlYXRlVGhyZWFkKFdl
YkNvcmU6OmJhY2tncm91bmRUaHJlYWRFbnRyeSwgdGhpcywgImNvbnZvbHV0aW9uIGJhY2tncm91
bmQgdGhyZWFkIik7Cit9CisKK1JldmVyYkNvbnZvbHZlcjo6flJldmVyYkNvbnZvbHZlcigpCit7
CisgICAgLy8gV2FpdCBmb3IgYmFja2dyb3VuZCB0aHJlYWQgdG8gc3RvcAorICAgIGlmICh1c2VC
YWNrZ3JvdW5kVGhyZWFkcygpICYmIG1fYmFja2dyb3VuZFRocmVhZCkgeworICAgICAgICBtX3dh
bnRzVG9FeGl0ID0gdHJ1ZTsKKworICAgICAgICAvLyBXYWtlIHVwIHRocmVhZCBzbyBpdCBjYW4g
cmV0dXJuCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4TG9ja2VyIGxvY2tlcihtX2JhY2tn
cm91bmRUaHJlYWRMb2NrKTsKKyAgICAgICAgICAgIG1fbW9yZUlucHV0QnVmZmVyZWQgPSB0cnVl
OworICAgICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25hbCgpOworICAg
ICAgICB9CisKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24obV9iYWNrZ3JvdW5kVGhy
ZWFkLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyOjpiYWNrZ3JvdW5kVGhy
ZWFkRW50cnkoKQoreworICAgIHdoaWxlICghbV93YW50c1RvRXhpdCkgeworICAgICAgICAvLyBX
YWl0IGZvciByZWFsdGltZSB0aHJlYWQgdG8gZ2l2ZSB1cyBtb3JlIGlucHV0CisgICAgICAgIG1f
bW9yZUlucHV0QnVmZmVyZWQgPSBmYWxzZTsgICAgICAgIAorICAgICAgICB7CisgICAgICAgICAg
ICBNdXRleExvY2tlciBsb2NrZXIobV9iYWNrZ3JvdW5kVGhyZWFkTG9jayk7CisgICAgICAgICAg
ICB3aGlsZSAoIW1fbW9yZUlucHV0QnVmZmVyZWQgJiYgIW1fd2FudHNUb0V4aXQpCisgICAgICAg
ICAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLndhaXQobV9iYWNrZ3JvdW5kVGhy
ZWFkTG9jayk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGFsbCBvZiB0aGUgc3Rh
Z2VzIHVudGlsIHRoZWlyIHJlYWQgaW5kaWNlcyByZWFjaCB0aGUgaW5wdXQgYnVmZmVyJ3Mgd3Jp
dGUgaW5kZXgKKyAgICAgICAgaW50IHdyaXRlSW5kZXggPSBtX2lucHV0QnVmZmVyLndyaXRlSW5k
ZXgoKTsKKworICAgICAgICAvLyBFdmVuIHRob3VnaCBpdCBkb2Vzbid0IHNlZW0gbGlrZSBldmVy
eSBzdGFnZSBuZWVkcyB0byBtYWludGFpbiBpdHMgb3duIHZlcnNpb24gb2YgcmVhZEluZGV4IAor
ICAgICAgICAvLyB3ZSBkbyB0aGlzIGluIGNhc2Ugd2Ugd2FudCB0byBydW4gaW4gbW9yZSB0aGFu
IG9uZSBiYWNrZ3JvdW5kIHRocmVhZC4KKyAgICAgICAgaW50IHJlYWRJbmRleDsKKworICAgICAg
ICB3aGlsZSAoKHJlYWRJbmRleCA9IG1fYmFja2dyb3VuZFN0YWdlc1swXS0+aW5wdXRSZWFkSW5k
ZXgoKSkgIT0gd3JpdGVJbmRleCkgeyAvLyBGSVhNRTogZG8gYmV0dGVyIHRvIGRldGVjdCBidWZm
ZXIgb3ZlcnJ1bi4uLgorICAgICAgICAgICAgLy8gVGhlIFJldmVyYkNvbnZvbHZlclN0YWdlcyBu
ZWVkIHRvIHByb2Nlc3MgaW4gYW1vdW50cyB3aGljaCBldmVubHkgZGl2aWRlIGhhbGYgdGhlIEZG
VCBzaXplCisgICAgICAgICAgICBjb25zdCBpbnQgU2xpY2VTaXplID0gTWluRkZUU2l6ZSAvIDI7
CisKKyAgICAgICAgICAgIC8vIEFjY3VtdWxhdGUgY29udHJpYnV0aW9ucyBmcm9tIGVhY2ggc3Rh
Z2UKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2Vz
LnNpemUoKTsgKytpKQorICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZFN0YWdlc1tpXS0+cHJv
Y2Vzc0luQmFja2dyb3VuZCh0aGlzLCBTbGljZVNpemUpOworICAgICAgICB9CisgICAgfQorfQor
Cit2b2lkIFJldmVyYkNvbnZvbHZlcjo6cHJvY2VzcyhBdWRpb0NoYW5uZWwqIHNvdXJjZUNoYW5u
ZWwsIEF1ZGlvQ2hhbm5lbCogZGVzdGluYXRpb25DaGFubmVsLCBzaXplX3QgZnJhbWVzVG9Qcm9j
ZXNzKQoreworICAgIGJvb2wgaXNTYWZlID0gc291cmNlQ2hhbm5lbCAmJiBkZXN0aW5hdGlvbkNo
YW5uZWwgJiYgc291cmNlQ2hhbm5lbC0+ZnJhbWVTaXplKCkgPj0gZnJhbWVzVG9Qcm9jZXNzICYm
IGRlc3RpbmF0aW9uQ2hhbm5lbC0+ZnJhbWVTaXplKCkgPj0gZnJhbWVzVG9Qcm9jZXNzOworICAg
IEFTU0VSVChpc1NhZmUpOworICAgIGlmICghaXNTYWZlKQorICAgICAgICByZXR1cm47CisgICAg
ICAgIAorICAgIGZsb2F0KiBzb3VyY2UgPSBzb3VyY2VDaGFubmVsLT5kYXRhKCk7CisgICAgZmxv
YXQqIGRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25DaGFubmVsLT5kYXRhKCk7CisgICAgYm9vbCBp
c0RhdGFTYWZlID0gc291cmNlICYmIGRlc3RpbmF0aW9uOworICAgIEFTU0VSVChpc0RhdGFTYWZl
KTsKKyAgICBpZiAoIWlzRGF0YVNhZmUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZlZWQg
aW5wdXQgYnVmZmVyIChyZWFkIGJ5IGFsbCB0aHJlYWRzKQorICAgIG1faW5wdXRCdWZmZXIud3Jp
dGUoc291cmNlLCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgLy8gQWNjdW11bGF0ZSBjb250cmli
dXRpb25zIGZyb20gZWFjaCBzdGFnZQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9zdGFn
ZXMuc2l6ZSgpOyArK2kpCisgICAgICAgIG1fc3RhZ2VzW2ldLT5wcm9jZXNzKHNvdXJjZSwgZnJh
bWVzVG9Qcm9jZXNzKTsKKworICAgIC8vIEZpbmFsbHkgcmVhZCBmcm9tIGFjY3VtdWxhdGlvbiBi
dWZmZXIKKyAgICBtX2FjY3VtdWxhdGlvbkJ1ZmZlci5yZWFkQW5kQ2xlYXIoZGVzdGluYXRpb24s
IGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIAorICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGJ1ZmZl
cmVkIG1vcmUgaW5wdXQsIHdha2UgdXAgb3VyIGJhY2tncm91bmQgdGhyZWFkLgorICAgIAorICAg
IC8vIE5vdCB1c2luZyBhIE11dGV4TG9ja2VyIGxvb2tzIHN0cmFuZ2UsIGJ1dCB3ZSB1c2UgYSB0
cnlMb2NrKCkgaW5zdGVhZCBiZWNhdXNlIHRoaXMgaXMgcnVuIG9uIHRoZSByZWFsLXRpbWUKKyAg
ICAvLyB0aHJlYWQgd2hlcmUgaXQgaXMgYSBkaXNhc3RlciBmb3IgdGhlIGxvY2sgdG8gYmUgY29u
dGVuZGVkIChjYXVzZXMgYXVkaW8gZ2xpdGNoaW5nKS4gIEl0J3MgT0sgaWYgd2UgZmFpbCB0bwor
ICAgIC8vIHNpZ25hbCBmcm9tIHRpbWUgdG8gdGltZSwgc2luY2Ugd2UnbGwgZ2V0IHRvIGl0IHRo
ZSBuZXh0IHRpbWUgd2UncmUgY2FsbGVkLiAgV2UncmUgY2FsbGVkIHJlcGVhdGVkbHkKKyAgICAv
LyBhbmQgZnJlcXVlbnRseSAoYXJvdW5kIGV2ZXJ5IDNtcykuICBUaGUgYmFja2dyb3VuZCB0aHJl
YWQgaXMgcHJvY2Vzc2luZyB3ZWxsIGludG8gdGhlIGZ1dHVyZSBhbmQgaGFzIGEgY29uc2lkZXJh
YmxlIGFtb3VudCBvZiAKKyAgICAvLyBsZWV3YXkgaGVyZS4uLgorICAgIGlmIChtX2JhY2tncm91
bmRUaHJlYWRMb2NrLnRyeUxvY2soKSkgeworICAgICAgICBtX21vcmVJbnB1dEJ1ZmZlcmVkID0g
dHJ1ZTsKKyAgICAgICAgbV9iYWNrZ3JvdW5kVGhyZWFkQ29uZGl0aW9uLnNpZ25hbCgpOworICAg
ICAgICBtX2JhY2tncm91bmRUaHJlYWRMb2NrLnVubG9jaygpOworICAgIH0KK30KKwordm9pZCBS
ZXZlcmJDb252b2x2ZXI6OnJlc2V0KCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
c3RhZ2VzLnNpemUoKTsgKytpKQorICAgICAgICBtX3N0YWdlc1tpXS0+cmVzZXQoKTsKKworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9iYWNrZ3JvdW5kU3RhZ2VzLnNpemUoKTsgKytpKQor
ICAgICAgICBtX2JhY2tncm91bmRTdGFnZXNbaV0tPnJlc2V0KCk7CisKKyAgICBtX2FjY3VtdWxh
dGlvbkJ1ZmZlci5yZXNldCgpOworICAgIG1faW5wdXRCdWZmZXIucmVzZXQoKTsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJDb252b2x2ZXIuaAkocmV2aXNpb24gMCkKKysr
IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiQ29udm9sdmVyLmgJKHJldmlzaW9uIDApCkBA
IC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisg
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQor
ICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICog
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZlcl9oCisjZGVmaW5lIFJldmVy
YkNvbnZvbHZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIKKyNpbmNsdWRlICJG
RlRDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCIKKyNp
bmNsdWRlICJSZXZlcmJDb252b2x2ZXJTdGFnZS5oIgorI2luY2x1ZGUgIlJldmVyYklucHV0QnVm
ZmVyLmgiCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVk
Lmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBdWRpb0NoYW5uZWw7CisKK2NsYXNzIFJl
dmVyYkNvbnZvbHZlciB7CitwdWJsaWM6CisgICAgLy8gbWF4RkZUU2l6ZSBjYW4gYmUgYWRqdXN0
ZWQgKGZyb20gc2F5IDIwNDggdG8gMzI3NjgpIGRlcGVuZGluZyBvbiBob3cgbXVjaCBwcmVjaXNp
b24gaXMgbmVjZXNzYXJ5LgorICAgIC8vIEZvciBjZXJ0YWluIHR3ZWFreSBkZS1jb252b2x2aW5n
IGFwcGxpY2F0aW9ucyB0aGUgcGhhc2UgZXJyb3JzIGFkZCB1cCBxdWlja2x5IGFuZCBsZWFkIHRv
IG5vbi1zZW5zaWNhbCByZXN1bHRzIHdpdGgKKyAgICAvLyBsYXJnZXIgRkZUIHNpemVzIGFuZCBz
aW5nbGUtcHJlY2lzaW9uIGZsb2F0cy4gIEluIHRoZXNlIGNhc2VzIDIwNDggaXMgYSBnb29kIHNp
emUuCisgICAgLy8gSWYgbm90IGRvaW5nIG11bHRpLXRocmVhZGVkIGNvbnZvbHV0aW9uLCB0aGVu
IHNob3VsZCBub3QgZ28gPiA4MTkyLgorICAgIFJldmVyYkNvbnZvbHZlcihBdWRpb0NoYW5uZWwq
IGltcHVsc2VSZXNwb25zZSwgc2l6ZV90IHJlbmRlclNsaWNlU2l6ZSwgc2l6ZV90IG1heEZGVFNp
emUsIHNpemVfdCBjb252b2x2ZXJSZW5kZXJQaGFzZSwgYm9vbCB1c2VCYWNrZ3JvdW5kVGhyZWFk
cyk7CisgICAgflJldmVyYkNvbnZvbHZlcigpOworCisgICAgdm9pZCBwcm9jZXNzKEF1ZGlvQ2hh
bm5lbCogc291cmNlQ2hhbm5lbCwgQXVkaW9DaGFubmVsKiBkZXN0aW5hdGlvbkNoYW5uZWwsIHNp
emVfdCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHNpemVfdCBp
bXB1bHNlUmVzcG9uc2VMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX2ltcHVsc2VSZXNwb25zZUxl
bmd0aDsgfQorCisgICAgUmV2ZXJiSW5wdXRCdWZmZXIqIGlucHV0QnVmZmVyKCkgeyByZXR1cm4g
Jm1faW5wdXRCdWZmZXI7IH0KKworICAgIGJvb2wgdXNlQmFja2dyb3VuZFRocmVhZHMoKSBjb25z
dCB7IHJldHVybiBtX3VzZUJhY2tncm91bmRUaHJlYWRzOyB9CisgICAgdm9pZCBiYWNrZ3JvdW5k
VGhyZWFkRW50cnkoKTsKKworcHJpdmF0ZToKKyAgICBWZWN0b3I8T3duUHRyPFJldmVyYkNvbnZv
bHZlclN0YWdlPiA+IG1fc3RhZ2VzOworICAgIFZlY3RvcjxPd25QdHI8UmV2ZXJiQ29udm9sdmVy
U3RhZ2U+ID4gbV9iYWNrZ3JvdW5kU3RhZ2VzOworICAgIHNpemVfdCBtX2ltcHVsc2VSZXNwb25z
ZUxlbmd0aDsKKworICAgIFJldmVyYkFjY3VtdWxhdGlvbkJ1ZmZlciBtX2FjY3VtdWxhdGlvbkJ1
ZmZlcjsKKworICAgIC8vIE9uZSBvciBtb3JlIGJhY2tncm91bmQgdGhyZWFkcyByZWFkIGZyb20g
dGhpcyBpbnB1dCBidWZmZXIgd2hpY2ggaXMgZmVkIGZyb20gdGhlIHJlYWx0aW1lIHRocmVhZC4K
KyAgICBSZXZlcmJJbnB1dEJ1ZmZlciBtX2lucHV0QnVmZmVyOworCisgICAgLy8gV2UncmUgZ2l2
ZW4gYSByZW5kZXJpbmcgaGludCwgc28gdGhlIEZGVHMgY2FuIGJlIG9wdGltaXplZCB0byBub3Qg
YWxsIG9jY3VyIGF0IHRoZSBzYW1lIHRpbWUKKyAgICAvLyAodmVyeSBiYWQgd2hlbiByZW5kZXJp
bmcgb24gYSByZWFsLXRpbWUgdGhyZWFkKS4KKyAgICBzaXplX3QgbV9yZW5kZXJTbGljZVNpemU7
CisKKyAgICAvLyBGaXJzdCBzdGFnZSB3aWxsIGJlIG9mIHNpemUgbV9taW5GRlRTaXplLiAgRWFj
aCBuZXh0IHN0YWdlIHdpbGwgYmUgdHdpY2UgYXMgYmlnIHVudGlsIHdlIGhpdCBtX21heEZGVFNp
emUuCisgICAgc2l6ZV90IG1fbWluRkZUU2l6ZTsKKyAgICBzaXplX3QgbV9tYXhGRlRTaXplOwor
CisgICAgLy8gQnV0IGRvbid0IGV4Y2VlZCB0aGlzIHNpemUgaW4gdGhlIHJlYWwtdGltZSB0aHJl
YWQgKGlmIHdlJ3JlIGRvaW5nIGJhY2tncm91bmQgcHJvY2Vzc2luZykuCisgICAgc2l6ZV90IG1f
bWF4UmVhbHRpbWVGRlRTaXplOworCisgICAgLy8gQmFja2dyb3VuZCB0aHJlYWQgYW5kIHN5bmNo
cm9uaXphdGlvbgorICAgIGJvb2wgbV91c2VCYWNrZ3JvdW5kVGhyZWFkczsKKyAgICBUaHJlYWRJ
ZGVudGlmaWVyIG1fYmFja2dyb3VuZFRocmVhZDsKKyAgICBib29sIG1fd2FudHNUb0V4aXQ7Cisg
ICAgYm9vbCBtX21vcmVJbnB1dEJ1ZmZlcmVkOworICAgIG11dGFibGUgTXV0ZXggbV9iYWNrZ3Jv
dW5kVGhyZWFkTG9jazsKKyAgICBtdXRhYmxlIFRocmVhZENvbmRpdGlvbiBtX2JhY2tncm91bmRU
aHJlYWRDb25kaXRpb247Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAv
LyBSZXZlcmJDb252b2x2ZXJfaApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJD
b252b2x2ZXJTdGFnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9S
ZXZlcmJDb252b2x2ZXJTdGFnZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx
NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisj
aW5jbHVkZSAiUmV2ZXJiQ29udm9sdmVyU3RhZ2UuaCIKKworI2luY2x1ZGUgIkFjY2VsZXJhdGUu
aCIKKyNpbmNsdWRlICJSZXZlcmJBY2N1bXVsYXRpb25CdWZmZXIuaCIKKyNpbmNsdWRlICJSZXZl
cmJDb252b2x2ZXIuaCIKKyNpbmNsdWRlICJSZXZlcmJJbnB1dEJ1ZmZlci5oIgorI2luY2x1ZGUg
PHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK1JldmVyYkNvbnZvbHZlclN0YWdlOjpSZXZlcmJDb252b2x2ZXJTdGFnZShm
bG9hdCogaW1wdWxzZVJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VMZW5ndGgsIHNpemVfdCByZXZl
cmJUb3RhbExhdGVuY3ksIHNpemVfdCBzdGFnZU9mZnNldCwgc2l6ZV90IHN0YWdlTGVuZ3RoLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmZnRTaXpl
LCBzaXplX3QgcmVuZGVyUGhhc2UsIHNpemVfdCByZW5kZXJTbGljZVNpemUsIFJldmVyYkFjY3Vt
dWxhdGlvbkJ1ZmZlciogYWNjdW11bGF0aW9uQnVmZmVyKQorICAgIDogbV9mZnRLZXJuZWwoZmZ0
U2l6ZSkKKyAgICAsIG1fYWNjdW11bGF0aW9uQnVmZmVyKGFjY3VtdWxhdGlvbkJ1ZmZlcikKKyAg
ICAsIG1fYWNjdW11bGF0aW9uUmVhZEluZGV4KDApCisgICAgLCBtX2lucHV0UmVhZEluZGV4KDAp
CisgICAgLCBtX2ltcHVsc2VSZXNwb25zZUxlbmd0aChyZXNwb25zZUxlbmd0aCkKK3sKKyAgICBB
U1NFUlQoaW1wdWxzZVJlc3BvbnNlKTsKKyAgICBBU1NFUlQoYWNjdW11bGF0aW9uQnVmZmVyKTsK
KyAgICAKKyAgICBtX2ZmdEtlcm5lbC5kb1BhZGRlZEZGVChpbXB1bHNlUmVzcG9uc2UgKyBzdGFn
ZU9mZnNldCwgc3RhZ2VMZW5ndGgpOworICAgIG1fY29udm9sdmVyID0gbmV3IEZGVENvbnZvbHZl
cihmZnRTaXplKTsKKyAgICBtX3RlbXBvcmFyeUJ1ZmZlci5hbGxvY2F0ZShyZW5kZXJTbGljZVNp
emUpOworCisgICAgLy8gVGhlIGNvbnZvbHV0aW9uIHN0YWdlIGF0IG9mZnNldCBzdGFnZU9mZnNl
dCBuZWVkcyB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBkZWxheSB0byBjYW5jZWwgb3V0IHRoZSBv
ZmZzZXQuCisgICAgc2l6ZV90IHRvdGFsRGVsYXkgPSBzdGFnZU9mZnNldCArIHJldmVyYlRvdGFs
TGF0ZW5jeTsKKworICAgIC8vIEJ1dCwgdGhlIEZGVCBjb252b2x1dGlvbiBpdHNlbGYgaW5jdXJz
IGZmdFNpemUgLyAyIGxhdGVuY3ksIHNvIHN1YnRyYWN0IHRoaXMgb3V0Li4uCisgICAgc2l6ZV90
IGhhbGZTaXplID0gZmZ0U2l6ZSAvIDI7CisgICAgQVNTRVJUKHRvdGFsRGVsYXkgPj0gaGFsZlNp
emUpOworICAgIGlmICh0b3RhbERlbGF5ID49IGhhbGZTaXplKQorICAgICAgICB0b3RhbERlbGF5
IC09IGhhbGZTaXplOworCisgICAgLy8gV2UgZGl2aWRlIHVwIHRoZSB0b3RhbCBkZWxheSwgaW50
byBwcmUgYW5kIHBvc3QgZGVsYXkgc2VjdGlvbnMgc28gdGhhdCB3ZSBjYW4gc2NoZWR1bGUgYXQg
ZXhhY3RseSB0aGUgbW9tZW50IHdoZW4gdGhlIEZGVCB3aWxsIGhhcHBlbi4KKyAgICAvLyBUaGlz
IGlzIGNvb3JkaW5hdGVkIHdpdGggdGhlIG90aGVyIHN0YWdlcywgc28gdGhleSBkb24ndCBhbGwg
ZG8gdGhlaXIgRkZUcyBhdCB0aGUgc2FtZSB0aW1lLi4uCisgICAgaW50IG1heFByZURlbGF5TGVu
Z3RoID0gc3RkOjptaW4oaGFsZlNpemUsIHRvdGFsRGVsYXkpOworICAgIG1fcHJlRGVsYXlMZW5n
dGggPSB0b3RhbERlbGF5ID4gMCA/IHJlbmRlclBoYXNlICUgbWF4UHJlRGVsYXlMZW5ndGggOiAw
OworICAgIGlmIChtX3ByZURlbGF5TGVuZ3RoID4gdG90YWxEZWxheSkKKyAgICAgICAgbV9wcmVE
ZWxheUxlbmd0aCA9IDA7CisKKyAgICBtX3Bvc3REZWxheUxlbmd0aCA9IHRvdGFsRGVsYXkgLSBt
X3ByZURlbGF5TGVuZ3RoOworICAgIG1fcHJlUmVhZFdyaXRlSW5kZXggPSAwOworICAgIG1fZnJh
bWVzUHJvY2Vzc2VkID0gMDsgLy8gdG90YWwgZnJhbWVzIHByb2Nlc3NlZCBzbyBmYXIKKworICAg
IG1fcHJlRGVsYXlCdWZmZXIuYWxsb2NhdGUobV9wcmVEZWxheUxlbmd0aCA8IGZmdFNpemUgPyBm
ZnRTaXplIDogbV9wcmVEZWxheUxlbmd0aCk7Cit9CisKK3ZvaWQgUmV2ZXJiQ29udm9sdmVyU3Rh
Z2U6OnByb2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpCit7CisgICAgUmV2ZXJiSW5wdXRCdWZmZXIqIGlucHV0QnVmZmVy
ID0gY29udm9sdmVyLT5pbnB1dEJ1ZmZlcigpOworICAgIGZsb2F0KiBzb3VyY2UgPSBpbnB1dEJ1
ZmZlci0+ZGlyZWN0UmVhZEZyb20oJm1faW5wdXRSZWFkSW5kZXgsIGZyYW1lc1RvUHJvY2Vzcyk7
CisgICAgcHJvY2Vzcyhzb3VyY2UsIGZyYW1lc1RvUHJvY2Vzcyk7Cit9CisKK3ZvaWQgUmV2ZXJi
Q29udm9sdmVyU3RhZ2U6OnByb2Nlc3MoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IGZyYW1lc1RvUHJv
Y2VzcykKK3sKKyAgICBBU1NFUlQoc291cmNlKTsKKyAgICBpZiAoIXNvdXJjZSkKKyAgICAgICAg
cmV0dXJuOworICAgIAorICAgIC8vIERlYWwgd2l0aCBwcmUtZGVsYXkgc3RyZWFtIDogbm90ZSBz
cGVjaWFsIGhhbmRsaW5nIG9mIHplcm8gZGVsYXkuCisKKyAgICBmbG9hdCogcHJlRGVsYXllZFNv
dXJjZTsKKyAgICBmbG9hdCogdGVtcG9yYXJ5QnVmZmVyOworICAgIGJvb2wgaXNUZW1wb3JhcnlC
dWZmZXJTYWZlID0gZmFsc2U7CisgICAgaWYgKG1fcHJlRGVsYXlMZW5ndGggPiAwKSB7CisgICAg
ICAgIC8vIEhhbmRsZXMgYm90aCB0aGUgcmVhZCBjYXNlIChjYWxsIHRvIHByb2Nlc3MoKSApIGFu
ZCB0aGUgd3JpdGUgY2FzZSAobWVtY3B5KCkgKQorICAgICAgICBib29sIGlzUHJlRGVsYXlTYWZl
ID0gbV9wcmVSZWFkV3JpdGVJbmRleCArIGZyYW1lc1RvUHJvY2VzcyA8PSBtX3ByZURlbGF5QnVm
ZmVyLnNpemUoKTsKKyAgICAgICAgQVNTRVJUKGlzUHJlRGVsYXlTYWZlKTsKKyAgICAgICAgaWYg
KCFpc1ByZURlbGF5U2FmZSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpc1RlbXBv
cmFyeUJ1ZmZlclNhZmUgPSBmcmFtZXNUb1Byb2Nlc3MgPD0gbV90ZW1wb3JhcnlCdWZmZXIuc2l6
ZSgpOworCisgICAgICAgIHByZURlbGF5ZWRTb3VyY2UgPSBtX3ByZURlbGF5QnVmZmVyLmRhdGEo
KSArIG1fcHJlUmVhZFdyaXRlSW5kZXg7CisgICAgICAgIHRlbXBvcmFyeUJ1ZmZlciA9IG1fdGVt
cG9yYXJ5QnVmZmVyLmRhdGEoKTsgICAgICAgIAorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFpl
cm8gZGVsYXkKKyAgICAgICAgcHJlRGVsYXllZFNvdXJjZSA9IHNvdXJjZTsKKyAgICAgICAgdGVt
cG9yYXJ5QnVmZmVyID0gbV9wcmVEZWxheUJ1ZmZlci5kYXRhKCk7CisgICAgICAgIAorICAgICAg
ICBpc1RlbXBvcmFyeUJ1ZmZlclNhZmUgPSBmcmFtZXNUb1Byb2Nlc3MgPD0gbV9wcmVEZWxheUJ1
ZmZlci5zaXplKCk7CisgICAgfQorICAgIAorICAgIEFTU0VSVChpc1RlbXBvcmFyeUJ1ZmZlclNh
ZmUpOworICAgIGlmICghaXNUZW1wb3JhcnlCdWZmZXJTYWZlKQorICAgICAgICByZXR1cm47CisK
KyAgICBpbnQgd3JpdGVJbmRleCA9IDA7CisKKyAgICBpZiAobV9mcmFtZXNQcm9jZXNzZWQgPCBt
X3ByZURlbGF5TGVuZ3RoKSB7CisgICAgICAgIC8vIEZvciB0aGUgZmlyc3QgbV9wcmVEZWxheUxl
bmd0aCBmcmFtZXMgZG9uJ3QgcHJvY2VzcyB0aGUgY29udm9sdmVyLCBpbnN0ZWFkIHNpbXBseSBi
dWZmZXIgaW4gdGhlIHByZS1kZWxheS4KKyAgICAgICAgLy8gQnV0IHdoaWxlIGJ1ZmZlcmluZyB0
aGUgcHJlLWRlbGF5LCB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSBvdXIgaW5kZXguCisgICAgICAg
IG1fYWNjdW11bGF0aW9uQnVmZmVyLT51cGRhdGVSZWFkSW5kZXgoJm1fYWNjdW11bGF0aW9uUmVh
ZEluZGV4LCBmcmFtZXNUb1Byb2Nlc3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vdywg
cnVuIHRoZSBjb252b2x1dGlvbiAoaW50byB0aGUgZGVsYXkgYnVmZmVyKS4KKyAgICAgICAgLy8g
QW4gZXhwZW5zaXZlIEZGVCB3aWxsIGhhcHBlbiBldmVyeSBmZnRTaXplIC8gMiBmcmFtZXMuCisg
ICAgICAgIC8vIFdlIHByb2Nlc3MgaW4tcGxhY2UgaGVyZS4uLgorICAgICAgICBtX2NvbnZvbHZl
ci0+cHJvY2VzcygmbV9mZnRLZXJuZWwsIHByZURlbGF5ZWRTb3VyY2UsIHRlbXBvcmFyeUJ1ZmZl
ciwgZnJhbWVzVG9Qcm9jZXNzKTsKKworICAgICAgICAvLyBOb3cgYWNjdW11bGF0ZSBpbnRvIHJl
dmVyYidzIGFjY3VtdWxhdGlvbiBidWZmZXIuCisgICAgICAgIHdyaXRlSW5kZXggPSBtX2FjY3Vt
dWxhdGlvbkJ1ZmZlci0+YWNjdW11bGF0ZSh0ZW1wb3JhcnlCdWZmZXIsIGZyYW1lc1RvUHJvY2Vz
cywgJm1fYWNjdW11bGF0aW9uUmVhZEluZGV4LCBtX3Bvc3REZWxheUxlbmd0aCk7CisgICAgfQor
CisgICAgLy8gRmluYWxseSBjb3B5IGlucHV0IHRvIHByZS1kZWxheS4KKyAgICBpZiAobV9wcmVE
ZWxheUxlbmd0aCA+IDApIHsKKyAgICAgICAgbWVtY3B5KHByZURlbGF5ZWRTb3VyY2UsIHNvdXJj
ZSwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lc1RvUHJvY2Vzcyk7CisgICAgICAgIG1fcHJlUmVhZFdy
aXRlSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworCisgICAgICAgIEFTU0VSVChtX3ByZVJlYWRX
cml0ZUluZGV4IDw9IG1fcHJlRGVsYXlMZW5ndGgpOworICAgICAgICBpZiAobV9wcmVSZWFkV3Jp
dGVJbmRleCA+PSBtX3ByZURlbGF5TGVuZ3RoKQorICAgICAgICAgICAgbV9wcmVSZWFkV3JpdGVJ
bmRleCA9IDA7CisgICAgfQorCisgICAgbV9mcmFtZXNQcm9jZXNzZWQgKz0gZnJhbWVzVG9Qcm9j
ZXNzOworfQorCit2b2lkIFJldmVyYkNvbnZvbHZlclN0YWdlOjpyZXNldCgpCit7CisgICAgbV9j
b252b2x2ZXItPnJlc2V0KCk7CisgICAgbV9wcmVEZWxheUJ1ZmZlci56ZXJvKCk7CisgICAgbV9h
Y2N1bXVsYXRpb25SZWFkSW5kZXggPSAwOworICAgIG1faW5wdXRSZWFkSW5kZXggPSAwOworICAg
IG1fZnJhbWVzUHJvY2Vzc2VkID0gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiQ29udm9sdmVyU3RhZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2F1
ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2F1ZGlvL1JldmVyYkNvbnZvbHZlclN0YWdlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKKyNkZWZpbmUgUmV2ZXJiQ29u
dm9sdmVyU3RhZ2VfaAorCisjaW5jbHVkZSAiQXVkaW9GbG9hdEFycmF5LmgiCisjaW5jbHVkZSAi
RkZURnJhbWUuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworY2xhc3MgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyOworY2xhc3MgUmV2ZXJiQ29udm9s
dmVyOworY2xhc3MgRkZUQ29udm9sdmVyOworICAgIAorLy8gQSBSZXZlcmJDb252b2x2ZXJTdGFn
ZSByZXByZXNlbnRzIHRoZSBjb252b2x1dGlvbiBhc3NvY2lhdGVkIHdpdGggYSBzdWItc2VjdGlv
biBvZiBhIGxhcmdlIGltcHVsc2UgcmVzcG9uc2UuCisvLyBJdCBpbmNvcnBvcmF0ZXMgYSBkZWxh
eSBsaW5lIHRvIGFjY291bnQgZm9yIHRoZSBvZmZzZXQgb2YgdGhlIHN1Yi1zZWN0aW9uIHdpdGhp
biB0aGUgbGFyZ2VyIGltcHVsc2UgcmVzcG9uc2UuCitjbGFzcyBSZXZlcmJDb252b2x2ZXJTdGFn
ZSB7CitwdWJsaWM6CisgICAgLy8gcmVuZGVyUGhhc2UgaXMgdXNlZnVsIHRvIGtub3cgc28gdGhh
dCB3ZSBjYW4gbWFuaXB1bGF0ZSB0aGUgcHJlIHZlcnN1cyBwb3N0IGRlbGF5IHNvIHRoYXQgc3Rh
Z2VzIHdpbGwgcGVyZm9ybQorICAgIC8vIHRoZWlyIGhlYXZ5IHdvcmsgKEZGVCBwcm9jZXNzaW5n
KSBvbiBkaWZmZXJlbnQgc2xpY2VzIHRvIGJhbGFuY2UgdGhlIGxvYWQgaW4gYSByZWFsLXRpbWUg
dGhyZWFkLgorICAgIFJldmVyYkNvbnZvbHZlclN0YWdlKGZsb2F0KiBpbXB1bHNlUmVzcG9uc2Us
IHNpemVfdCByZXNwb25zZUxlbmd0aCwgc2l6ZV90IHJldmVyYlRvdGFsTGF0ZW5jeSwgc2l6ZV90
IHN0YWdlT2Zmc2V0LCBzaXplX3Qgc3RhZ2VMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgc2l6ZV90IGZmdFNpemUsIHNpemVfdCByZW5kZXJQaGFzZSwgc2l6ZV90IHJlbmRlclNsaWNl
U2l6ZSwgUmV2ZXJiQWNjdW11bGF0aW9uQnVmZmVyKiBhY2N1bXVsYXRpb25CdWZmZXIpOworCisg
ICAgLy8gV0FSTklORzogZnJhbWVzVG9Qcm9jZXNzIG11c3QgYmUgc3VjaCB0aGF0IGl0IGV2ZW5s
eSBkaXZpZGVzIHRoZSBkZWxheSBidWZmZXIgc2l6ZSAoc3RhZ2Vfb2Zmc2V0KS4KKyAgICB2b2lk
IHByb2Nlc3MoZmxvYXQqIHNvdXJjZSwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICB2
b2lkIHByb2Nlc3NJbkJhY2tncm91bmQoUmV2ZXJiQ29udm9sdmVyKiBjb252b2x2ZXIsIHNpemVf
dCBmcmFtZXNUb1Byb2Nlc3MpOworCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gVXNlZnVs
IGZvciBiYWNrZ3JvdW5kIHByb2Nlc3NpbmcKKyAgICBpbnQgaW5wdXRSZWFkSW5kZXgoKSBjb25z
dCB7IHJldHVybiBtX2lucHV0UmVhZEluZGV4OyB9CisKK3ByaXZhdGU6CisgICAgRkZURnJhbWUg
bV9mZnRLZXJuZWw7CisgICAgT3duUHRyPEZGVENvbnZvbHZlcj4gbV9jb252b2x2ZXI7CisKKyAg
ICBBdWRpb0Zsb2F0QXJyYXkgbV9wcmVEZWxheUJ1ZmZlcjsKKworICAgIFJldmVyYkFjY3VtdWxh
dGlvbkJ1ZmZlciogbV9hY2N1bXVsYXRpb25CdWZmZXI7CisgICAgaW50IG1fYWNjdW11bGF0aW9u
UmVhZEluZGV4OworICAgIGludCBtX2lucHV0UmVhZEluZGV4OworCisgICAgc2l6ZV90IG1fcHJl
RGVsYXlMZW5ndGg7CisgICAgc2l6ZV90IG1fcG9zdERlbGF5TGVuZ3RoOworICAgIHNpemVfdCBt
X3ByZVJlYWRXcml0ZUluZGV4OworICAgIHNpemVfdCBtX2ZyYW1lc1Byb2Nlc3NlZDsKKworICAg
IEF1ZGlvRmxvYXRBcnJheSBtX3RlbXBvcmFyeUJ1ZmZlcjsKKworICAgIHNpemVfdCBtX2ltcHVs
c2VSZXNwb25zZUxlbmd0aDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIFJldmVyYkNvbnZvbHZlclN0YWdlX2gKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8v
UmV2ZXJiSW5wdXRCdWZmZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVk
aW8vUmV2ZXJiSW5wdXRCdWZmZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxl
IENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQorCisjaW5j
bHVkZSAiUmV2ZXJiSW5wdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZXZl
cmJJbnB1dEJ1ZmZlcjo6UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCkKKyAgICA6IG1f
YnVmZmVyKGxlbmd0aCkKKyAgICAsIG1fd3JpdGVJbmRleCgwKQoreworfQorCit2b2lkIFJldmVy
YklucHV0QnVmZmVyOjp3cml0ZShmbG9hdCogc291cmNlUCwgc2l6ZV90IG51bWJlck9mRnJhbWVz
KQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9v
bCBpc0NvcHlTYWZlID0gbV93cml0ZUluZGV4ICsgbnVtYmVyT2ZGcmFtZXMgPD0gYnVmZmVyTGVu
Z3RoOworICAgIEFTU0VSVChpc0NvcHlTYWZlKTsKKyAgICBpZiAoIWlzQ29weVNhZmUpCisgICAg
ICAgIHJldHVybjsKKyAgICAgICAgCisgICAgbWVtY3B5KG1fYnVmZmVyLmRhdGEoKSArIG1fd3Jp
dGVJbmRleCwgc291cmNlUCwgc2l6ZW9mKGZsb2F0KSAqIG51bWJlck9mRnJhbWVzKTsKKworICAg
IG1fd3JpdGVJbmRleCArPSBudW1iZXJPZkZyYW1lczsKKyAgICBBU1NFUlQobV93cml0ZUluZGV4
IDw9IGJ1ZmZlckxlbmd0aCk7CisKKyAgICBpZiAobV93cml0ZUluZGV4ID49IGJ1ZmZlckxlbmd0
aCkKKyAgICAgICAgbV93cml0ZUluZGV4ID0gMDsKK30KKworZmxvYXQqIFJldmVyYklucHV0QnVm
ZmVyOjpkaXJlY3RSZWFkRnJvbShpbnQqIHJlYWRJbmRleCwgc2l6ZV90IG51bWJlck9mRnJhbWVz
KQoreworICAgIHNpemVfdCBidWZmZXJMZW5ndGggPSBtX2J1ZmZlci5zaXplKCk7CisgICAgYm9v
bCBpc1BvaW50ZXJHb29kID0gcmVhZEluZGV4ICYmICpyZWFkSW5kZXggPj0gMCAmJiAqcmVhZElu
ZGV4ICsgbnVtYmVyT2ZGcmFtZXMgPD0gYnVmZmVyTGVuZ3RoOworICAgIEFTU0VSVChpc1BvaW50
ZXJHb29kKTsKKyAgICBpZiAoIWlzUG9pbnRlckdvb2QpIHsKKyAgICAgICAgLy8gU2hvdWxkIG5l
dmVyIGhhcHBlbiBpbiBwcmFjdGljZSBidXQgcmV0dXJuIHBvaW50ZXIgdG8gc3RhcnQgb2YgYnVm
ZmVyIChhdm9pZCBjcmFzaCkKKyAgICAgICAgaWYgKHJlYWRJbmRleCkKKyAgICAgICAgICAgICpy
ZWFkSW5kZXggPSAwOworICAgICAgICByZXR1cm4gbV9idWZmZXIuZGF0YSgpOworICAgIH0KKyAg
ICAgICAgCisgICAgZmxvYXQqIHNvdXJjZVAgPSBtX2J1ZmZlci5kYXRhKCk7CisgICAgZmxvYXQq
IHAgPSBzb3VyY2VQICsgKnJlYWRJbmRleDsKKworICAgIC8vIFVwZGF0ZSByZWFkSW5kZXgKKyAg
ICAqcmVhZEluZGV4ID0gKCpyZWFkSW5kZXggKyBudW1iZXJPZkZyYW1lcykgJSBidWZmZXJMZW5n
dGg7CisKKyAgICByZXR1cm4gcDsKK30KKwordm9pZCBSZXZlcmJJbnB1dEJ1ZmZlcjo6cmVzZXQo
KQoreworICAgIG1fYnVmZmVyLnplcm8oKTsKKyAgICBtX3dyaXRlSW5kZXggPSAwOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV0VCX0FVRElPKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9hdWRpby9SZXZlcmJJbnB1dEJ1ZmZlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaAkocmV2aXNpb24g
MCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vYXVkaW8vUmV2ZXJiSW5wdXRCdWZmZXIuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gIE5laXRo
ZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFt
ZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICog
TE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
IE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmV2ZXJiSW5wdXRCdWZmZXJfaAorI2Rl
ZmluZSBSZXZlcmJJbnB1dEJ1ZmZlcl9oCisKKyNpbmNsdWRlICJBdWRpb0Zsb2F0QXJyYXkuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBSZXZlcmJJbnB1dEJ1ZmZlciBpcyB1c2VkIHRv
IGJ1ZmZlciBpbnB1dCBzYW1wbGVzIGZvciBkZWZlcnJlZCBwcm9jZXNzaW5nIGJ5IHRoZSBiYWNr
Z3JvdW5kIHRocmVhZHMuCitjbGFzcyBSZXZlcmJJbnB1dEJ1ZmZlciB7CitwdWJsaWM6CisgICAg
UmV2ZXJiSW5wdXRCdWZmZXIoc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvLyBUaGUgcmVhbHRpbWUg
YXVkaW8gdGhyZWFkIGtlZXBzIHdyaXRpbmcgc2FtcGxlcyBoZXJlLgorICAgIC8vIFRoZSBhc3N1
bXB0aW9uIGlzIHRoYXQgdGhlIGJ1ZmZlcidzIGxlbmd0aCBpcyBldmVubHkgZGl2aXNpYmxlIGJ5
IG51bWJlck9mRnJhbWVzIChmb3IgbmVhcmx5IGFsbCBjYXNlcyB0aGlzIHdpbGwgYmUgZmluZSku
CisgICAgLy8gRklYTUU6IHJlbW92ZSBudW1iZXJPZkZyYW1lcyByZXN0cmljdGlvbi4uLgorICAg
IHZvaWQgd3JpdGUoZmxvYXQqIHNvdXJjZVAsIHNpemVfdCBudW1iZXJPZkZyYW1lcyk7CisKKyAg
ICAvLyBCYWNrZ3JvdW5kIHRocmVhZHMgY2FuIGNhbGwgdGhpcyB0byBjaGVjayBpZiB0aGVyZSdz
IGFueXRoaW5nIHRvIHJlYWQuLi4KKyAgICBzaXplX3Qgd3JpdGVJbmRleCgpIGNvbnN0IHsgcmV0
dXJuIG1fd3JpdGVJbmRleDsgfQorCisgICAgLy8gVGhlIGluZGl2aWR1YWwgYmFja2dyb3VuZCB0
aHJlYWRzIHJlYWQgaGVyZSAoYW5kIGhvcGUgdGhhdCB0aGV5IGNhbiBrZWVwIHVwIHdpdGggdGhl
IGJ1ZmZlciB3cml0aW5nKS4KKyAgICAvLyByZWFkSW5kZXggaXMgdXBkYXRlZCB3aXRoIHRoZSBu
ZXh0IHJlYWRJbmRleCB0byByZWFkIGZyb20uLi4KKyAgICAvLyBUaGUgYXNzdW1wdGlvbiBpcyB0
aGF0IHRoZSBidWZmZXIncyBsZW5ndGggaXMgZXZlbmx5IGRpdmlzaWJsZSBieSBudW1iZXJPZkZy
YW1lcy4KKyAgICAvLyBGSVhNRTogcmVtb3ZlIG51bWJlck9mRnJhbWVzIHJlc3RyaWN0aW9uLi4u
CisgICAgZmxvYXQqIGRpcmVjdFJlYWRGcm9tKGludCogcmVhZEluZGV4LCBzaXplX3QgbnVtYmVy
T2ZGcmFtZXMpOworCisgICAgdm9pZCByZXNldCgpOworCitwcml2YXRlOgorICAgIEF1ZGlvRmxv
YXRBcnJheSBtX2J1ZmZlcjsKKyAgICBzaXplX3QgbV93cml0ZUluZGV4OworfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gUmV2ZXJiSW5wdXRCdWZmZXJfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>