<?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>165993</bug_id>
          
          <creation_ts>2016-12-17 00:04:49 -0800</creation_ts>
          <short_desc>WebAssembly: We should compile wasm functions in parallel</short_desc>
          <delta_ts>2016-12-20 16:30:25 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Saam Barati">saam</reporter>
          <assigned_to name="Saam Barati">saam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>gskachkov</cc>
    
    <cc>jfbastien</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>oliver</cc>
    
    <cc>ossy</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1260902</commentid>
    <comment_count>0</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-17 00:04:49 -0800</bug_when>
    <thetext>Right now, compiling the unity benchmark takes 60 seconds on my machine. It&apos;s compiling 34341 functions. We should be way faster.
We can fork off some threads that do compilation, and then allow the main thread to be woken up to do linking.
Or we can allow the main thread to also compile, and then link on the main thread at the very end. It&apos;s probably more
profitable to have the main thread also compile things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1260903</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-17 00:06:22 -0800</bug_when>
    <thetext>It only takes ~99 milliseconds to validate those functions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261047</commentid>
    <comment_count>2</comment_count>
      <attachid>297445</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 13:23:09 -0800</bug_when>
    <thetext>Created attachment 297445
WIP

This is a pretty simple parallel compiler and I think it works. It makes compiling unity more than 4x faster on my MBP. I have some some other patch dependencies in here, so I&apos;ll wait for those to land before putting this one up for review.

Comments welcome now, though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261048</commentid>
    <comment_count>3</comment_count>
      <attachid>297445</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-18 13:24:03 -0800</bug_when>
    <thetext>Comment on attachment 297445
WIP

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

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:144
&gt; +    constexpr uint32_t threadCount = 8;

I need to figure out the API to get the number of core&apos;s on the CPU we&apos;re running on here, instead of the constant 8.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261051</commentid>
    <comment_count>4</comment_count>
      <attachid>297445</attachid>
    <who name="JF Bastien">jfbastien</who>
    <bug_when>2016-12-18 13:44:56 -0800</bug_when>
    <thetext>Comment on attachment 297445
WIP

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

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:97
&gt; +    //dataLogLn(&quot;Took &quot;, std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::steady_clock::now() - start).count(), &quot;ms to validate&quot;);

Debug.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:118
&gt; +    //Vector&lt;Vector&lt;UnlinkedWasmToWasmCall&gt;&gt; unlinkedWasmToWasmCalls;

?

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:140
&gt; +    m_compilationContexts.resize(m_functionLocationInBinary.size());

I&apos;d do this right after tryReserveCapacity.

&gt;&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:144
&gt;&gt; +    constexpr uint32_t threadCount = 8;
&gt; 
&gt; I need to figure out the API to get the number of core&apos;s on the CPU we&apos;re running on here, instead of the constant 8.

std::thread::hardware_concurrency for number of cores. Or does WebKit have its own thing?

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:167
&gt; +            ASSERT(validateFunction(functionStart, functionLength, signature, m_functionIndexSpace, *m_moduleInformation));

Why here as well?

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:189
&gt; +        //dataLogLn(&quot;Took &quot;, std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(std::chrono::steady_clock::now() - start).count(), &quot;us to do ending loop&quot;);

Debug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261205</commentid>
    <comment_count>5</comment_count>
      <attachid>297478</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 14:14:41 -0800</bug_when>
    <thetext>Created attachment 297478
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261207</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-19 14:16:38 -0800</bug_when>
    <thetext>Attachment 297478 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/WasmPlan.cpp:212:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261216</commentid>
    <comment_count>7</comment_count>
      <attachid>297478</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2016-12-19 14:36:15 -0800</bug_when>
    <thetext>Comment on attachment 297478
patch

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

&gt; Source/JavaScriptCore/ChangeLog:12
&gt; +        inside Wasmb3IRGenerator to be thread safe.

drive by comment: /b3/B3/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261223</commentid>
    <comment_count>8</comment_count>
      <attachid>297478</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-12-19 14:49:47 -0800</bug_when>
    <thetext>Comment on attachment 297478
patch

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

&gt; Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp:934
&gt; +        B3::generate(procedure, *compilationContext.wasmEntrypointJIT);

In the FTL we run generate() with heap access and prepareForGeneration without heap access, so the GC can interleave during the more expensive prepare phase.

Not sure that matters at all here.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:64
&gt; +    std::chrono::steady_clock::time_point startTime;

Please use MonotonicTime.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:101
&gt; +        dataLogLn(&quot;Took &quot;, std::chrono::duration_cast&lt;std::chrono::microseconds&gt;(std::chrono::steady_clock::now() - startTime).count(), &quot; us to validate module&quot;);

So much less code if you use MonotonicTime.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:164
&gt; +            m_lock.lock();
&gt; +            if (m_currentIndex &gt;= m_functionLocationInBinary.size()) {
&gt; +                m_lock.unlock();
&gt; +                return;
&gt; +            }
&gt; +            uint32_t functionIndex = m_currentIndex;
&gt; +            ++m_currentIndex;
&gt; +            m_lock.unlock();

Please use a RAII thing, like:

{
    auto locker = holdLock(m_lock);
    if (stuff)
       return;
    things
}

Also, please consider the following:

- ParallelHelperPool for compiling.  This prevents you from starting 64 threads if 8 workers try to wasm compile at the same time.
- ParallelVectorIterator for doing the m_currentIndex stuff.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:185
&gt; +                m_lock.lock();
&gt; +                if (!m_errorMessage) {
&gt; +                    // Multiple compiles could fail simultaneously. We arbitrarily choose the first.
&gt; +                    m_errorMessage = parseAndCompileResult.error(); // FIXME make this an Expected.
&gt; +                }
&gt; +                m_currentIndex = m_functionLocationInBinary.size();
&gt; +                m_lock.unlock();

Ditto.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:195
&gt; +    std::chrono::steady_clock::time_point startTime;

MonotonicTime please.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261225</commentid>
    <comment_count>9</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-12-19 14:52:00 -0800</bug_when>
    <thetext>I think that out of my feedback, the most important is about std::chrono.  Lets not use that anymore.  MonotonicTime is what you want instead.

ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be a good idea.

ParallelHelperPool is a neat optimization but we don&apos;t need it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261247</commentid>
    <comment_count>10</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 15:49:50 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; I think that out of my feedback, the most important is about std::chrono. 
&gt; Lets not use that anymore.  MonotonicTime is what you want instead.
&gt; 
&gt; ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be
&gt; a good idea.
&gt; 
&gt; ParallelHelperPool is a neat optimization but we don&apos;t need it.

ParallelHelperPool::runFunctionInParallel is what I want. However, I probably want a ParallelHelperPool per process for compiling Wasm, instead of separate ones per module. I&apos;ll start with just having one for the Module, but open a bug to have this shared across module compilations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261248</commentid>
    <comment_count>11</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 15:50:20 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; I think that out of my feedback, the most important is about std::chrono. 
&gt; &gt; Lets not use that anymore.  MonotonicTime is what you want instead.
&gt; &gt; 
&gt; &gt; ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be
&gt; &gt; a good idea.
&gt; &gt; 
&gt; &gt; ParallelHelperPool is a neat optimization but we don&apos;t need it.
&gt; 
&gt; ParallelHelperPool::runFunctionInParallel is what I want. However, I
&gt; probably want a ParallelHelperPool per process for compiling Wasm, instead
&gt; of separate ones per module. I&apos;ll start with just having one for the Module,
&gt; but open a bug to have this shared across module compilations.

This will probably be more important once we have concurrent module compilation and may have multiple concurrent compilations happening simultaneously.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261254</commentid>
    <comment_count>12</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 16:03:51 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; I think that out of my feedback, the most important is about std::chrono. 
&gt; &gt; &gt; Lets not use that anymore.  MonotonicTime is what you want instead.
&gt; &gt; &gt; 
&gt; &gt; &gt; ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be
&gt; &gt; &gt; a good idea.
&gt; &gt; &gt; 
&gt; &gt; &gt; ParallelHelperPool is a neat optimization but we don&apos;t need it.
&gt; &gt; 
&gt; &gt; ParallelHelperPool::runFunctionInParallel is what I want. However, I
&gt; &gt; probably want a ParallelHelperPool per process for compiling Wasm, instead
&gt; &gt; of separate ones per module. I&apos;ll start with just having one for the Module,
&gt; &gt; but open a bug to have this shared across module compilations.
&gt; 
&gt; This will probably be more important once we have concurrent module
&gt; compilation and may have multiple concurrent compilations happening
&gt; simultaneously.

Actually, I think that ParallelHelper might be overkill for what I&apos;m doing now. I think we should move to it once we have truly concurrent compilations. I guess I could also create one ParallelHelperPool per process, but I think that&apos;s the only situation where this will make a difference now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261262</commentid>
    <comment_count>13</comment_count>
      <attachid>297492</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 16:22:08 -0800</bug_when>
    <thetext>Created attachment 297492
patch

Address Fil&apos;s feedback w.r.t MonotinicTime and LockHolder.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261264</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-19 16:23:27 -0800</bug_when>
    <thetext>Attachment 297492 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/WasmPlan.cpp:214:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261276</commentid>
    <comment_count>15</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 16:46:44 -0800</bug_when>
    <thetext>Hmm, I&apos;m getting a debug crash while compiling unity where it looks like we&apos;re stack overflowing.

I&apos;m investigating.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261277</commentid>
    <comment_count>16</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-12-19 16:48:43 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; (In reply to comment #10)
&gt; &gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; &gt; I think that out of my feedback, the most important is about std::chrono. 
&gt; &gt; &gt; &gt; Lets not use that anymore.  MonotonicTime is what you want instead.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be
&gt; &gt; &gt; &gt; a good idea.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; ParallelHelperPool is a neat optimization but we don&apos;t need it.
&gt; &gt; &gt; 
&gt; &gt; &gt; ParallelHelperPool::runFunctionInParallel is what I want. However, I
&gt; &gt; &gt; probably want a ParallelHelperPool per process for compiling Wasm, instead
&gt; &gt; &gt; of separate ones per module. I&apos;ll start with just having one for the Module,
&gt; &gt; &gt; but open a bug to have this shared across module compilations.
&gt; &gt; 
&gt; &gt; This will probably be more important once we have concurrent module
&gt; &gt; compilation and may have multiple concurrent compilations happening
&gt; &gt; simultaneously.
&gt; 
&gt; Actually, I think that ParallelHelper might be overkill for what I&apos;m doing
&gt; now. I think we should move to it once we have truly concurrent
&gt; compilations. I guess I could also create one ParallelHelperPool per
&gt; process, but I think that&apos;s the only situation where this will make a
&gt; difference now.

What does it mean to have truly concurrent compilations?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261278</commentid>
    <comment_count>17</comment_count>
      <attachid>297492</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-12-19 16:49:52 -0800</bug_when>
    <thetext>Comment on attachment 297492
patch

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

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:104
&gt; +        dataLogLn(&quot;Took &quot;, Seconds(MonotonicTime::now() - startTime).microseconds(), &quot; us to validate module&quot;);

You don&apos;t need Seconds(...).  You can simply do (MonotonicTime::now() - startTime).microseconds().  The type of subtracting MonotonicTimes is Seconds.

&gt; Source/JavaScriptCore/wasm/WasmPlan.cpp:236
&gt; +        dataLogLn(&quot;Took &quot;, Seconds(MonotonicTime::now() - startTime).microseconds(),

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261279</commentid>
    <comment_count>18</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 16:55:27 -0800</bug_when>
    <thetext>(In reply to comment #15)
&gt; Hmm, I&apos;m getting a debug crash while compiling unity where it looks like
&gt; we&apos;re stack overflowing.
&gt; 
&gt; I&apos;m investigating.

I think it&apos;s because the Wasm Bound checks was a SharedTask instead of an std::function. (This might also be why we&apos;re throwing out of bounds memory exceptions!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261280</commentid>
    <comment_count>19</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 16:56:14 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #12)
&gt; &gt; (In reply to comment #11)
&gt; &gt; &gt; (In reply to comment #10)
&gt; &gt; &gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; &gt; &gt; I think that out of my feedback, the most important is about std::chrono. 
&gt; &gt; &gt; &gt; &gt; Lets not use that anymore.  MonotonicTime is what you want instead.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; ParallelVectorIterator seems like exactly what you&apos;re doing, so it might be
&gt; &gt; &gt; &gt; &gt; a good idea.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; ParallelHelperPool is a neat optimization but we don&apos;t need it.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; ParallelHelperPool::runFunctionInParallel is what I want. However, I
&gt; &gt; &gt; &gt; probably want a ParallelHelperPool per process for compiling Wasm, instead
&gt; &gt; &gt; &gt; of separate ones per module. I&apos;ll start with just having one for the Module,
&gt; &gt; &gt; &gt; but open a bug to have this shared across module compilations.
&gt; &gt; &gt; 
&gt; &gt; &gt; This will probably be more important once we have concurrent module
&gt; &gt; &gt; compilation and may have multiple concurrent compilations happening
&gt; &gt; &gt; simultaneously.
&gt; &gt; 
&gt; &gt; Actually, I think that ParallelHelper might be overkill for what I&apos;m doing
&gt; &gt; now. I think we should move to it once we have truly concurrent
&gt; &gt; compilations. I guess I could also create one ParallelHelperPool per
&gt; &gt; process, but I think that&apos;s the only situation where this will make a
&gt; &gt; difference now.
&gt; 
&gt; What does it mean to have truly concurrent compilations?
While JavaScript code is executing, we can be compiling Wasm. When we&apos;re done compiling, we need to resolve the promise with a WebAssembly.Module object.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261282</commentid>
    <comment_count>20</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2016-12-19 17:01:21 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #15)
&gt; &gt; Hmm, I&apos;m getting a debug crash while compiling unity where it looks like
&gt; &gt; we&apos;re stack overflowing.
&gt; &gt; 
&gt; &gt; I&apos;m investigating.
&gt; 
&gt; I think it&apos;s because the Wasm Bound checks was a SharedTask instead of an
&gt; std::function. (This might also be why we&apos;re throwing out of bounds memory
&gt; exceptions!)

I think that it&apos;s important to avoid using std::function in B3, because std::function involves expected copying and system malloc.

The difference between them is that std::function copies the closure&apos;s state around on assignment.  I think we want to avoid such state copying.  That&apos;s why we use WTF::Function, WTF::ScopedLambda, and WTF::SharedTask to get different kinds of zero-copy closures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261283</commentid>
    <comment_count>21</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 17:06:22 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #15)
&gt; &gt; Hmm, I&apos;m getting a debug crash while compiling unity where it looks like
&gt; &gt; we&apos;re stack overflowing.
&gt; &gt; 
&gt; &gt; I&apos;m investigating.
&gt; 
&gt; I think it&apos;s because the Wasm Bound checks was a SharedTask instead of an
&gt; std::function. (This might also be why we&apos;re throwing out of bounds memory
&gt; exceptions!)

Ignore me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261286</commentid>
    <comment_count>22</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 17:24:28 -0800</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #18)
&gt; &gt; (In reply to comment #15)
&gt; &gt; &gt; Hmm, I&apos;m getting a debug crash while compiling unity where it looks like
&gt; &gt; &gt; we&apos;re stack overflowing.
&gt; &gt; &gt; 
&gt; &gt; &gt; I&apos;m investigating.
&gt; &gt; 
&gt; &gt; I think it&apos;s because the Wasm Bound checks was a SharedTask instead of an
&gt; &gt; std::function. (This might also be why we&apos;re throwing out of bounds memory
&gt; &gt; exceptions!)
&gt; 
&gt; Ignore me.

The bug is this code:
```
    static CCallHelpers::Jump generate(Inst&amp; inst, CCallHelpers&amp; jit, GenerationContext&amp; context)
    {
        WasmBoundsCheckValue* value = inst.origin-&gt;as&lt;WasmBoundsCheckValue&gt;();
        CCallHelpers::Jump outOfBounds = Inst(Air::Branch64, value, Arg::relCond(CCallHelpers::AboveOrEqual), inst.args[0], inst.args[1]).generate(jit, context);

        context.latePaths.append(createSharedTask&lt;GenerationContext::LatePathFunction&gt;(
            [=] (CCallHelpers&amp; jit, Air::GenerationContext&amp;) {
                outOfBounds.link(&amp;jit);
                context.code-&gt;wasmBoundsCheckGenerator()-&gt;run(jit, value-&gt;pinnedGPR(), value-&gt;offset());
            }));

        // We said we were not a terminal.
        return CCallHelpers::Jump();
    }
```

Which is copying the Context! That&apos;s a no-no. I&apos;ll make it so that we don&apos;t allow this to happen elsewhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261287</commentid>
    <comment_count>23</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-19 17:30:25 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (In reply to comment #21)
&gt; &gt; (In reply to comment #18)
&gt; &gt; &gt; (In reply to comment #15)
&gt; &gt; &gt; &gt; Hmm, I&apos;m getting a debug crash while compiling unity where it looks like
&gt; &gt; &gt; &gt; we&apos;re stack overflowing.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; I&apos;m investigating.
&gt; &gt; &gt; 
&gt; &gt; &gt; I think it&apos;s because the Wasm Bound checks was a SharedTask instead of an
&gt; &gt; &gt; std::function. (This might also be why we&apos;re throwing out of bounds memory
&gt; &gt; &gt; exceptions!)
&gt; &gt; 
&gt; &gt; Ignore me.
&gt; 
&gt; The bug is this code:
&gt; ```
&gt;     static CCallHelpers::Jump generate(Inst&amp; inst, CCallHelpers&amp; jit,
&gt; GenerationContext&amp; context)
&gt;     {
&gt;         WasmBoundsCheckValue* value =
&gt; inst.origin-&gt;as&lt;WasmBoundsCheckValue&gt;();
&gt;         CCallHelpers::Jump outOfBounds = Inst(Air::Branch64, value,
&gt; Arg::relCond(CCallHelpers::AboveOrEqual), inst.args[0],
&gt; inst.args[1]).generate(jit, context);
&gt; 
&gt;        
&gt; context.latePaths.append(createSharedTask&lt;GenerationContext::
&gt; LatePathFunction&gt;(
&gt;             [=] (CCallHelpers&amp; jit, Air::GenerationContext&amp;) {
&gt;                 outOfBounds.link(&amp;jit);
&gt;                 context.code-&gt;wasmBoundsCheckGenerator()-&gt;run(jit,
&gt; value-&gt;pinnedGPR(), value-&gt;offset());
&gt;             }));
&gt; 
&gt;         // We said we were not a terminal.
&gt;         return CCallHelpers::Jump();
&gt;     }
&gt; ```
&gt; 
&gt; Which is copying the Context! That&apos;s a no-no. I&apos;ll make it so that we don&apos;t
&gt; allow this to happen elsewhere.

I&apos;m still not entirely sure why that&apos;s the bug. But it appears to be it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261631</commentid>
    <comment_count>24</comment_count>
      <attachid>297544</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-20 11:57:25 -0800</bug_when>
    <thetext>Created attachment 297544
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261656</commentid>
    <comment_count>25</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-20 12:12:58 -0800</bug_when>
    <thetext>&lt;rdar://problem/29758107&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261661</commentid>
    <comment_count>26</comment_count>
      <attachid>297546</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2016-12-20 12:17:07 -0800</bug_when>
    <thetext>Created attachment 297546
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261663</commentid>
    <comment_count>27</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-20 12:19:24 -0800</bug_when>
    <thetext>Attachment 297546 did not pass style-queue:


ERROR: Source/JavaScriptCore/wasm/WasmPlan.cpp:210:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 1 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261827</commentid>
    <comment_count>28</comment_count>
      <attachid>297546</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2016-12-20 15:55:28 -0800</bug_when>
    <thetext>Comment on attachment 297546
patch

r=me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261841</commentid>
    <comment_count>29</comment_count>
      <attachid>297546</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-20 16:30:18 -0800</bug_when>
    <thetext>Comment on attachment 297546
patch

Clearing flags on attachment: 297546

Committed r210047: &lt;http://trac.webkit.org/changeset/210047&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1261842</commentid>
    <comment_count>30</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-12-20 16:30:25 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297445</attachid>
            <date>2016-12-18 13:23:09 -0800</date>
            <delta_ts>2016-12-19 14:14:41 -0800</delta_ts>
            <desc>WIP</desc>
            <filename>patch.diff</filename>
            <type>text/plain</type>
            <size>20782</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRv
ci5jcHAJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21CM0lSR2VuZXJhdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjc3LDcgKzI3Nyw3IEBAIHZv
aWQgQjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKEMKICAgICBhdXRvIGp1bXBUb0V4
Y2VwdGlvblN0dWIgPSBqaXQuanVtcCgpOwogCiAgICAgVk0qIHZtID0gJm1fdm07Ci0gICAgaml0
LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1ZmZlciYgbGlua0J1ZmZlcikgeworICAgIGppdC5hZGRM
aW5rVGFzayhbdm0sIGp1bXBUb0V4Y2VwdGlvblN0dWJdIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVy
KSB7CiAgICAgICAgIGxpbmtCdWZmZXIubGluayhqdW1wVG9FeGNlcHRpb25TdHViLCBDb2RlTG9j
YXRpb25MYWJlbCh2bS0+Z2V0Q1RJU3R1Yih0aHJvd0V4Y2VwdGlvbkZyb21XYXNtVGh1bmtHZW5l
cmF0b3IpLmNvZGUoKSkpOwogICAgIH0pOwogfQpAQCAtNjkxLDEzICs2OTEsMTQgQEAgYXV0byBC
M0lSR2VuZXJhdG9yOjphZGRDYWxsKHVpbnQzMl90IGZ1bgogICAgICAgICAgICAgcGF0Y2hwb2lu
dC0+ZWZmZWN0cy53cml0ZXNQaW5uZWQgPSB0cnVlOwogICAgICAgICAgICAgcGF0Y2hwb2ludC0+
ZWZmZWN0cy5yZWFkc1Bpbm5lZCA9IHRydWU7CiAKLSAgICAgICAgICAgIHBhdGNocG9pbnQtPnNl
dEdlbmVyYXRvcihbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5l
cmF0aW9uUGFyYW1zJikgeworICAgICAgICAgICAgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNh
bGw+KiB1bmxpbmtlZFdhc21Ub1dhc21DYWxscyA9ICZtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxz
OworICAgICAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFt1bmxpbmtlZFdhc21Ub1dh
c21DYWxscywgZnVuY3Rpb25JbmRleF0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3Rh
Y2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewogICAgICAgICAgICAgICAgIEFsbG93TWFjcm9TY3Jh
dGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKIAogICAgICAgICAgICAgICAgIEND
YWxsSGVscGVyczo6Q2FsbCBjYWxsID0gaml0LmNhbGwoKTsKIAotICAgICAgICAgICAgICAgIGpp
dC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKLSAgICAgICAgICAg
ICAgICAgICAgbV91bmxpbmtlZFdhc21Ub1dhc21DYWxscy5hcHBlbmQoeyBsaW5rQnVmZmVyLmxv
Y2F0aW9uT2YoY2FsbCksIGZ1bmN0aW9uSW5kZXggfSk7CisgICAgICAgICAgICAgICAgaml0LmFk
ZExpbmtUYXNrKFt1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgY2FsbCwgZnVuY3Rpb25JbmRleF0g
KExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5saW5rZWRX
YXNtVG9XYXNtQ2FsbHMtPmFwcGVuZCh7IGxpbmtCdWZmZXIubG9jYXRpb25PZihjYWxsKSwgZnVu
Y3Rpb25JbmRleCB9KTsKICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgIH0pOwogICAg
ICAgICB9KTsKQEAgLTgxNyw3ICs4MTgsNyBAQCB2b2lkIEIzSVJHZW5lcmF0b3I6OmR1bXAoY29u
c3QgVmVjdG9yPENvCiAgICAgZGF0YUxvZ0xuKCJcbiIpOwogfQogCi1zdGF0aWMgc3RkOjp1bmlx
dWVfcHRyPEIzOjpDb21waWxhdGlvbj4gY3JlYXRlSlNUb1dhc21XcmFwcGVyKFZNJiB2bSwgV2Fz
bUludGVybmFsRnVuY3Rpb24mIGZ1bmN0aW9uLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwg
TWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1haW5GdW5jdGlvbiwgY29uc3QgTWVtb3J5SW5mb3JtYXRp
b24mIG1lbW9yeSkKK3N0YXRpYyB2b2lkIGNyZWF0ZUpTVG9XYXNtV3JhcHBlcihWTSYgdm0sIENv
bXBpbGF0aW9uQ29udGV4dCYgY29tcGlsYXRpb25Db250ZXh0LCBXYXNtSW50ZXJuYWxGdW5jdGlv
biYgZnVuY3Rpb24sIGNvbnN0IFNpZ25hdHVyZSogc2lnbmF0dXJlLCBjb25zdCBNZW1vcnlJbmZv
cm1hdGlvbiYgbWVtb3J5KQogewogICAgIFByb2NlZHVyZSBwcm9jOwogICAgIEJhc2ljQmxvY2sq
IGJsb2NrID0gcHJvYy5hZGRCbG9jaygpOwpAQCAtODc0LDEzICs4NzUsMTIgQEAgc3RhdGljIHN0
ZDo6dW5pcXVlX3B0cjxCMzo6Q29tcGlsYXRpb24+IAogICAgICAgICAgICAgICAgIHBhdGNocG9p
bnQtPmFwcGVuZChDb25zdHJhaW5lZFZhbHVlKHNpemVzW2ldLCBWYWx1ZVJlcDo6cmVnKG1lbW9y
eS5waW5uZWRSZWdpc3RlcnMoKS5zaXplUmVnaXN0ZXJzW2ldLnNpemVSZWdpc3RlcikpKTsKICAg
ICAgICAgfQogCi0gICAgICAgIHBhdGNocG9pbnQtPnNldEdlbmVyYXRvcihbPV0gKENDYWxsSGVs
cGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAgICAg
ICBDb21waWxhdGlvbkNvbnRleHQqIGNvbnRleHQgPSAmY29tcGlsYXRpb25Db250ZXh0OworICAg
ICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoW2NvbnRleHRdIChDQ2FsbEhlbHBlcnMmIGpp
dCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKICAgICAgICAgICAgIEFs
bG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKIAogICAgICAg
ICAgICAgQ0NhbGxIZWxwZXJzOjpDYWxsIGNhbGwgPSBqaXQuY2FsbCgpOwotICAgICAgICAgICAg
aml0LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1ZmZlciYgbGlua0J1ZmZlcikgewotICAgICAgICAg
ICAgICAgIGxpbmtCdWZmZXIubGluayhjYWxsLCBGdW5jdGlvblB0cihtYWluRnVuY3Rpb24uZXhl
Y3V0YWJsZUFkZHJlc3MoKSkpOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjb250ZXh0
LT5qc0VudHJ5cG9pbnRUb1dhc21FbnRyeXBvaW50Q2FsbCA9IGNhbGw7CiAgICAgICAgIH0pOwog
ICAgIH0pOwogCkBAIC05MDIsMTUgKzkwMiwxOSBAQCBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEIz
OjpDb21waWxhdGlvbj4gCiAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAg
ICAgfQogCi0gICAgYXV0byBqc0VudHJ5cG9pbnQgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbXBpbGF0
aW9uPihCMzo6Y29tcGlsZSh2bSwgcHJvYykpOworICAgIEIzOjpwcmVwYXJlRm9yR2VuZXJhdGlv
bihwcm9jKTsKKyAgICBCMzo6Z2VuZXJhdGUocHJvYywgKmNvbXBpbGF0aW9uQ29udGV4dC5qc0Vu
dHJ5cG9pbnRKSVQpOworICAgIGNvbXBpbGF0aW9uQ29udGV4dC5qc0VudHJ5cG9pbnRCeXByb2R1
Y3RzID0gcHJvYy5yZWxlYXNlQnlwcm9kdWN0cygpOwogICAgIGZ1bmN0aW9uLmpzVG9XYXNtRW50
cnlwb2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvYy5jYWxsZWVTYXZlUmVnaXN0ZXJzKCk7
Ci0gICAgcmV0dXJuIGpzRW50cnlwb2ludDsKIH0KIAotRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRy
PFdhc21JbnRlcm5hbEZ1bmN0aW9uPiwgU3RyaW5nPiBwYXJzZUFuZENvbXBpbGUoVk0mIHZtLCBj
b25zdCB1aW50OF90KiBmdW5jdGlvblN0YXJ0LCBzaXplX3QgZnVuY3Rpb25MZW5ndGgsIGNvbnN0
IFNpZ25hdHVyZSogc2lnbmF0dXJlLCBWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4mIHVu
bGlua2VkV2FzbVRvV2FzbUNhbGxzLCBjb25zdCBJbW11dGFibGVGdW5jdGlvbkluZGV4U3BhY2Um
IGZ1bmN0aW9uSW5kZXhTcGFjZSwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24mIGluZm8sIHVuc2ln
bmVkIG9wdExldmVsKQorRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0
aW9uPiwgU3RyaW5nPiBwYXJzZUFuZENvbXBpbGUoVk0mIHZtLCBDb21waWxhdGlvbkNvbnRleHQm
IGNvbXBpbGF0aW9uQ29udGV4dCwgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCwgc2l6ZV90
IGZ1bmN0aW9uTGVuZ3RoLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgVmVjdG9yPFVubGlu
a2VkV2FzbVRvV2FzbUNhbGw+JiB1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgY29uc3QgSW1tdXRh
YmxlRnVuY3Rpb25JbmRleFNwYWNlJiBmdW5jdGlvbkluZGV4U3BhY2UsIGNvbnN0IE1vZHVsZUlu
Zm9ybWF0aW9uJiBpbmZvLCB1bnNpZ25lZCBvcHRMZXZlbCkKIHsKICAgICBhdXRvIHJlc3VsdCA9
IHN0ZDo6bWFrZV91bmlxdWU8V2FzbUludGVybmFsRnVuY3Rpb24+KCk7CiAKKyAgICBjb21waWxh
dGlvbkNvbnRleHQuanNFbnRyeXBvaW50SklUID0gc3RkOjptYWtlX3VuaXF1ZTxDQ2FsbEhlbHBl
cnM+KCZ2bSk7CisgICAgY29tcGlsYXRpb25Db250ZXh0Lndhc21FbnRyeXBvaW50SklUID0gc3Rk
OjptYWtlX3VuaXF1ZTxDQ2FsbEhlbHBlcnM+KCZ2bSk7CisKICAgICBQcm9jZWR1cmUgcHJvY2Vk
dXJlOwogICAgIEIzSVJHZW5lcmF0b3IgY29udGV4dCh2bSwgaW5mbywgcHJvY2VkdXJlLCByZXN1
bHQuZ2V0KCksIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBmdW5jdGlvbkluZGV4U3BhY2UpOwog
ICAgIEZ1bmN0aW9uUGFyc2VyPEIzSVJHZW5lcmF0b3I+IHBhcnNlcihjb250ZXh0LCBmdW5jdGlv
blN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBmdW5jdGlvbkluZGV4U3BhY2UsIGlu
Zm8pOwpAQCAtOTI1LDEwICs5MjksMTQgQEAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdhc21J
bnRlcm5hbEZ1bgogICAgIGlmICh2ZXJib3NlKQogICAgICAgICBkYXRhTG9nKCJQb3N0IFNTQTog
IiwgcHJvY2VkdXJlKTsKIAotICAgIHJlc3VsdC0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24g
PSBzdGQ6Om1ha2VfdW5pcXVlPEIzOjpDb21waWxhdGlvbj4oQjM6OmNvbXBpbGUodm0sIHByb2Nl
ZHVyZSwgb3B0TGV2ZWwpKTsKLSAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNhbGxlZVNhdmVS
ZWdpc3RlcnMgPSBwcm9jZWR1cmUuY2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIHsKKyAgICAg
ICAgQjM6OnByZXBhcmVGb3JHZW5lcmF0aW9uKHByb2NlZHVyZSwgb3B0TGV2ZWwpOworICAgICAg
ICBCMzo6Z2VuZXJhdGUocHJvY2VkdXJlLCAqY29tcGlsYXRpb25Db250ZXh0Lndhc21FbnRyeXBv
aW50SklUKTsKKyAgICAgICAgY29tcGlsYXRpb25Db250ZXh0Lndhc21FbnRyeXBvaW50Qnlwcm9k
dWN0cyA9IHByb2NlZHVyZS5yZWxlYXNlQnlwcm9kdWN0cygpOworICAgICAgICByZXN1bHQtPndh
c21FbnRyeXBvaW50LmNhbGxlZVNhdmVSZWdpc3RlcnMgPSBwcm9jZWR1cmUuY2FsbGVlU2F2ZVJl
Z2lzdGVycygpOworICAgIH0KIAotICAgIHJlc3VsdC0+anNUb1dhc21FbnRyeXBvaW50LmNvbXBp
bGF0aW9uID0gY3JlYXRlSlNUb1dhc21XcmFwcGVyKHZtLCAqcmVzdWx0LCBzaWduYXR1cmUsIHJl
c3VsdC0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24tPmNvZGUoKSwgaW5mby5tZW1vcnkpOwor
ICAgIGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2bSwgY29tcGlsYXRpb25Db250ZXh0LCAqcmVzdWx0
LCBzaWduYXR1cmUsIGluZm8ubWVtb3J5KTsKICAgICByZXR1cm4gV1RGTW92ZShyZXN1bHQpOwog
fQogCkBAIC05ODgsNyArOTk2LDcgQEAgYXV0byBCM0lSR2VuZXJhdG9yOjphZGRPcDxGNjRDb252
ZXJ0VUk2NAogICAgIFBhdGNocG9pbnRWYWx1ZSogcGF0Y2hwb2ludCA9IG1fY3VycmVudEJsb2Nr
LT5hcHBlbmROZXc8UGF0Y2hwb2ludFZhbHVlPihtX3Byb2MsIERvdWJsZSwgT3JpZ2luKCkpOwog
ICAgIGlmIChpc1g4NigpKQogICAgICAgICBwYXRjaHBvaW50LT5udW1HUFNjcmF0Y2hSZWdpc3Rl
cnMgPSAxOwotICAgIHBhdGNocG9pbnQtPmFwcGVuZChDb25zdHJhaW5lZFZhbHVlKGFyZywgVmFs
dWVSZXA6Oldhcm1BbnkpKTsKKyAgICBwYXRjaHBvaW50LT5hcHBlbmQoQ29uc3RyYWluZWRWYWx1
ZShhcmcsIFZhbHVlUmVwOjpTb21lUmVnaXN0ZXIpKTsKICAgICBwYXRjaHBvaW50LT5zZXRHZW5l
cmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgU3RhY2ttYXBHZW5lcmF0aW9uUGFy
YW1zJiBwYXJhbXMpIHsKICAgICAgICAgQWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGFs
bG93U2NyYXRjaChqaXQpOwogI2lmIENQVShYODZfNjQpCkBAIC0xMDA4LDcgKzEwMTYsNyBAQCBh
dXRvIEIzSVJHZW5lcmF0b3I6OmFkZE9wPE9wVHlwZTo6RjMyQ29uCiAgICAgUGF0Y2hwb2ludFZh
bHVlKiBwYXRjaHBvaW50ID0gbV9jdXJyZW50QmxvY2stPmFwcGVuZE5ldzxQYXRjaHBvaW50VmFs
dWU+KG1fcHJvYywgRmxvYXQsIE9yaWdpbigpKTsKICAgICBpZiAoaXNYODYoKSkKICAgICAgICAg
cGF0Y2hwb2ludC0+bnVtR1BTY3JhdGNoUmVnaXN0ZXJzID0gMTsKLSAgICBwYXRjaHBvaW50LT5h
cHBlbmQoQ29uc3RyYWluZWRWYWx1ZShhcmcsIFZhbHVlUmVwOjpXYXJtQW55KSk7CisgICAgcGF0
Y2hwb2ludC0+YXBwZW5kKENvbnN0cmFpbmVkVmFsdWUoYXJnLCBWYWx1ZVJlcDo6U29tZVJlZ2lz
dGVyKSk7CiAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFs9XSAoQ0NhbGxIZWxwZXJzJiBq
aXQsIGNvbnN0IFN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYgcGFyYW1zKSB7CiAgICAgICAgIEFs
bG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKICNpZiBDUFUo
WDg2XzY0KQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0
b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdl
bmVyYXRvci5oCShyZXZpc2lvbiAyMDk5NTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2Fz
bS9XYXNtQjNJUkdlbmVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3IEBACiAj
aWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCiAjaW5jbHVkZSAiQjNDb21waWxhdGlvbi5oIgorI2lu
Y2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlZNLmgiCiAjaW5jbHVkZSAiV2FzbUZv
cm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9FeHBlY3RlZC5oPgpAQCAtMzgsNyArMzksMTUgQEAgbmFt
ZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgTWVtb3J5SW5mb3JtYXRpb247
CiAKLUV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4sIFN0cmlu
Zz4gcGFyc2VBbmRDb21waWxlKFZNJiwgY29uc3QgdWludDhfdCosIHNpemVfdCwgY29uc3QgU2ln
bmF0dXJlKiwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiwgY29uc3QgSW1tdXRhYmxl
RnVuY3Rpb25JbmRleFNwYWNlJiwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24mLCB1bnNpZ25lZCBv
cHRMZXZlbCA9IDEpOworc3RydWN0IENvbXBpbGF0aW9uQ29udGV4dCB7CisgICAgc3RkOjp1bmlx
dWVfcHRyPENDYWxsSGVscGVycz4ganNFbnRyeXBvaW50SklUOworICAgIHN0ZDo6dW5pcXVlX3B0
cjxCMzo6T3BhcXVlQnlwcm9kdWN0cz4ganNFbnRyeXBvaW50Qnlwcm9kdWN0czsKKyAgICBzdGQ6
OnVuaXF1ZV9wdHI8Q0NhbGxIZWxwZXJzPiB3YXNtRW50cnlwb2ludEpJVDsKKyAgICBzdGQ6OnVu
aXF1ZV9wdHI8QjM6Ok9wYXF1ZUJ5cHJvZHVjdHM+IHdhc21FbnRyeXBvaW50Qnlwcm9kdWN0czsK
KyAgICBDQ2FsbEhlbHBlcnM6OkNhbGwganNFbnRyeXBvaW50VG9XYXNtRW50cnlwb2ludENhbGw7
Cit9OworCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rpb24+LCBT
dHJpbmc+IHBhcnNlQW5kQ29tcGlsZShWTSYsIENvbXBpbGF0aW9uQ29udGV4dCYsIGNvbnN0IHVp
bnQ4X3QqLCBzaXplX3QsIGNvbnN0IFNpZ25hdHVyZSosIFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dh
c21DYWxsPiYsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYsIGNvbnN0IE1vZHVs
ZUluZm9ybWF0aW9uJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAogfSB9IC8vIG5hbWVzcGFj
ZSBKU0M6Oldhc20KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUNhbGxp
bmdDb252ZW50aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
V2FzbUNhbGxpbmdDb252ZW50aW9uLmgJKHJldmlzaW9uIDIwOTk1NSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21DYWxsaW5nQ29udmVudGlvbi5oCSh3b3JraW5nIGNvcHkpCkBA
IC05NSw3ICs5NSw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxwZXJzJiBq
aXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFtcykgewogICAgICAg
ICAgICAgICAgIEdQUlJlZyByZXN1bHQgPSBwYXJhbXNbMF0uZ3ByKCk7CiAgICAgICAgICAgICAg
ICAgTWFjcm9Bc3NlbWJsZXI6OkRhdGFMYWJlbFB0ciBtb3ZlTG9jYXRpb24gPSBqaXQubW92ZVdp
dGhQYXRjaChNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihudWxscHRyKSwgcmVzdWx0KTsK
LSAgICAgICAgICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVm
ZmVyKSB7CisgICAgICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFtjYWxsZWVNb3ZlTG9jYXRp
b24sIG1vdmVMb2NhdGlvbl0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKICAgICAgICAgICAg
ICAgICAgICAgKmNhbGxlZU1vdmVMb2NhdGlvbiA9IGxpbmtCdWZmZXIubG9jYXRpb25PZihtb3Zl
TG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfSk7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lvbiAyMDk5NTUpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTU4LDE0ICs1OCwxNSBAQCBQbGFuOjpQbGFuKFZNKiB2bSwgY29uc3QgdWludDhfdCogc291
cmNlCiB7CiB9CiAKLXZvaWQgUGxhbjo6cnVuKCkKK2Jvb2wgUGxhbjo6aXNWYWxpZE1vZHVsZSgp
CiB7CisgICAgLy9hdXRvIHN0YXJ0ID0gc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7
CiAgICAgewogICAgICAgICBNb2R1bGVQYXJzZXIgbW9kdWxlUGFyc2VyKG1fdm0sIG1fc291cmNl
LCBtX3NvdXJjZUxlbmd0aCk7CiAgICAgICAgIGF1dG8gcGFyc2VSZXN1bHQgPSBtb2R1bGVQYXJz
ZXIucGFyc2UoKTsKICAgICAgICAgaWYgKCFwYXJzZVJlc3VsdCkgewogICAgICAgICAgICAgbV9l
cnJvck1lc3NhZ2UgPSBwYXJzZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAgICAgcmV0dXJuOyAv
LyBGSVhNRSByZXR1cm4gYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgICAgIH0KICAgICAgICAgbV9tb2R1bGVJbmZvcm1hdGlvbiA9IFdURk1vdmUocGFyc2VSZXN1
bHQtPm1vZHVsZSk7CiAgICAgICAgIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5ID0gV1RGTW92
ZShwYXJzZVJlc3VsdC0+ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5KTsKQEAgLTczLDYgKzc0LDM1
IEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAgbV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVy
ID0gcGFyc2VSZXN1bHQtPmZ1bmN0aW9uSW5kZXhTcGFjZS5yZWxlYXNlQnVmZmVyKCk7CiAgICAg
fQogCisgICAgZm9yICh1bnNpZ25lZCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rpb25JbmRleCA8
IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgKytmdW5jdGlvbkluZGV4KSB7Cisg
ICAgICAgIGlmICh2ZXJib3NlKQorICAgICAgICAgICAgZGF0YUxvZ0xuKCJQcm9jZXNzaW5nIGZ1
bmN0aW9uIHN0YXJ0aW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlv
bkluZGV4XS5zdGFydCwgIiBhbmQgZW5kaW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJp
bmFyeVtmdW5jdGlvbkluZGV4XS5lbmQpOworICAgICAgICBjb25zdCB1aW50OF90KiBmdW5jdGlv
blN0YXJ0ID0gbV9zb3VyY2UgKyBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbklu
ZGV4XS5zdGFydDsKKyAgICAgICAgc2l6ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9mdW5jdGlvbkxv
Y2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uZW5kIC0gbV9mdW5jdGlvbkxvY2F0aW9uSW5C
aW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0
aCA8PSBtX3NvdXJjZUxlbmd0aCk7CisgICAgICAgIFNpZ25hdHVyZSogc2lnbmF0dXJlID0gbV9t
b2R1bGVJbmZvcm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZXNbZnVuY3Rpb25JbmRl
eF07CisKKyAgICAgICAgYXV0byB2YWxpZGF0ZVJlc3VsdCA9IHZhbGlkYXRlRnVuY3Rpb24oZnVu
Y3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlvbkluZGV4U3Bh
Y2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKKyAgICAgICAgaWYgKCF2YWxpZGF0ZVJlc3VsdCkg
eworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwOyBpIDwgZnVuY3Rpb25MZW5ndGg7ICsraSkKKyAgICAgICAgICAgICAgICAgICAg
ZGF0YUxvZyhSYXdQb2ludGVyKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGZ1bmN0aW9uU3RhcnRb
aV0pKSwgIiwgIik7CisgICAgICAgICAgICAgICAgZGF0YUxvZ0xuKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVycm9yKCk7IC8v
IEZJWE1FIG1ha2UgdGhpcyBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0KKworICAgIC8vZGF0YUxvZ0xuKCJUb29rICIsIHN0ZDo6Y2hyb25v
OjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHM+KHN0ZDo6Y2hyb25vOjpz
dGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnQpLmNvdW50KCksICJtcyB0byB2YWxpZGF0ZSIpOwor
ICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIFBsYW46OnJ1bigpCit7CisgICAgaWYgKCFpc1Zh
bGlkTW9kdWxlKCkpIC8vIFRoaXMgYWxzbyBjb2xsZWN0cyBhIGJ1bmNoIG9mIGluZm9ybWF0aW9u
IG5lZWRlZCB0byBkbyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uLgorICAgICAgICByZXR1cm47CisK
ICAgICBhdXRvIHRyeVJlc2VydmVDYXBhY2l0eSA9IFt0aGlzXSAoYXV0byYgdmVjdG9yLCBzaXpl
X3Qgc2l6ZSwgY29uc3QgY2hhciogd2hhdCkgewogICAgICAgICBpZiAoVU5MSUtFTFkoIXZlY3Rv
ci50cnlSZXNlcnZlQ2FwYWNpdHkoc2l6ZSkpKSB7CiAgICAgICAgICAgICBTdHJpbmdCdWlsZGVy
IGJ1aWxkZXI7CkBAIC04NCwxMCArMTE0LDEyIEBAIHZvaWQgUGxhbjo6cnVuKCkKICAgICAgICAg
fQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9OwotICAgIFZlY3RvcjxWZWN0b3I8VW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbD4+IHVubGlua2VkV2FzbVRvV2FzbUNhbGxzOworCisgICAgLy9WZWN0
b3I8VmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+PiB1bmxpbmtlZFdhc21Ub1dhc21DYWxs
czsKICAgICBpZiAoIXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21Ub0pTU3R1YnMsIG1fbW9kdWxl
SW5mb3JtYXRpb24tPmltcG9ydEZ1bmN0aW9ucy5zaXplKCksICIgV2ViQXNzZW1ibHkgdG8gSmF2
YVNjcmlwdCBzdHVicyIpCi0gICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkodW5saW5rZWRX
YXNtVG9XYXNtQ2FsbHMsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSwgIiB1bmxp
bmtlZCBXZWJBc3NlbWJseSB0byBXZWJBc3NlbWJseSBjYWxscyIpCi0gICAgICAgIHx8ICF0cnlS
ZXNlcnZlQ2FwYWNpdHkobV93YXNtSW50ZXJuYWxGdW5jdGlvbnMsIG1fZnVuY3Rpb25Mb2NhdGlv
bkluQmluYXJ5LnNpemUoKSwgIiBXZWJBc3NlbWJseSBmdW5jdGlvbnMiKSkKKyAgICAgICAgfHwg
IXRyeVJlc2VydmVDYXBhY2l0eShtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBtX2Z1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1ibHkgdG8gV2ViQXNz
ZW1ibHkgY2FsbHMiKQorICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbUludGVy
bmFsRnVuY3Rpb25zLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgV2ViQXNz
ZW1ibHkgZnVuY3Rpb25zIikKKyAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0eShtX2NvbXBp
bGF0aW9uQ29udGV4dHMsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSwgIiBjb21w
aWxhdGlvbiBjb250ZXh0cyIpKQogICAgICAgICByZXR1cm47CiAKICAgICBmb3IgKHVuc2lnbmVk
IGltcG9ydEluZGV4ID0gMDsgaW1wb3J0SW5kZXggPCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBv
cnRzLnNpemUoKTsgKytpbXBvcnRJbmRleCkgewpAQCAtMTAyLDM5ICsxMzQsODYgQEAgdm9pZCBQ
bGFuOjpydW4oKQogICAgICAgICBtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbaW1w
b3J0RnVuY3Rpb25JbmRleF0uY29kZSA9IG1fd2FzbVRvSlNTdHVic1tpbXBvcnRGdW5jdGlvbklu
ZGV4XS5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2ln
bmVkIGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5jdGlvbkluZGV4IDwgbV9mdW5jdGlvbkxvY2F0aW9u
SW5CaW5hcnkuc2l6ZSgpOyArK2Z1bmN0aW9uSW5kZXgpIHsKLSAgICAgICAgaWYgKHZlcmJvc2Up
Ci0gICAgICAgICAgICBkYXRhTG9nTG4oIlByb2Nlc3NpbmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6
ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFu
ZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhd
LmVuZCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSAr
IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0OwotICAgICAg
ICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5j
dGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4
XS5zdGFydDsKLSAgICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNlTGVuZ3Ro
KTsKLSAgICAgICAgU2lnbmF0dXJlKiBzaWduYXR1cmUgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5p
bnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tmdW5jdGlvbkluZGV4XTsKLSAgICAgICAgdW5zaWdu
ZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUoKSArIGZ1bmN0aW9u
SW5kZXg7Ci0gICAgICAgIEFTU0VSVChtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClb
ZnVuY3Rpb25JbmRleFNwYWNlXS5zaWduYXR1cmUgPT0gc2lnbmF0dXJlKTsKLQotICAgICAgICBh
dXRvIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5j
dGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5m
b3JtYXRpb24pOwotICAgICAgICBpZiAoIXZhbGlkYXRlUmVzdWx0KSB7Ci0gICAgICAgICAgICBp
ZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBm
dW5jdGlvbkxlbmd0aDsgKytpKQotICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKFJhd1BvaW50
ZXIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVuY3Rpb25TdGFydFtpXSkpLCAiLCAiKTsKLSAg
ICAgICAgICAgICAgICBkYXRhTG9nTG4oKTsKKyAgICBtX2N1cnJlbnRJbmRleCA9IDA7CisgICAg
bV91bmxpbmtlZFdhc21Ub1dhc21DYWxscy5yZXNpemUobV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5h
cnkuc2l6ZSgpKTsKKyAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5yZXNpemUobV9mdW5jdGlv
bkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKTsKKyAgICBtX2NvbXBpbGF0aW9uQ29udGV4dHMucmVz
aXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSk7CisgICAgbV90aHJlYWREb25l
Q291bnQgPSAwOworICAgIG1fYWxsVGhyZWFkc0RvbmVMb2NrLmxvY2soKTsKKworICAgIGNvbnN0
ZXhwciB1aW50MzJfdCB0aHJlYWRDb3VudCA9IDg7CisKKyAgICBhdXRvIGRvV29yayA9IFt0aGlz
XSB7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBtX2xvY2subG9jaygpOwor
ICAgICAgICAgICAgaWYgKG1fY3VycmVudEluZGV4ID49IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmlu
YXJ5LnNpemUoKSkgeworICAgICAgICAgICAgICAgICsrbV90aHJlYWREb25lQ291bnQ7CisgICAg
ICAgICAgICAgICAgaWYgKG1fdGhyZWFkRG9uZUNvdW50ID09IHRocmVhZENvdW50KQorICAgICAg
ICAgICAgICAgICAgICBtX2FsbFRocmVhZHNEb25lTG9jay51bmxvY2soKTsKKyAgICAgICAgICAg
ICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAg
ICAgfQotICAgICAgICAgICAgbV9lcnJvck1lc3NhZ2UgPSB2YWxpZGF0ZVJlc3VsdC5lcnJvcigp
OyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCi0gICAgICAgICAgICByZXR1cm47Cisg
ICAgICAgICAgICB1aW50MzJfdCBmdW5jdGlvbkluZGV4ID0gbV9jdXJyZW50SW5kZXg7CisgICAg
ICAgICAgICArK21fY3VycmVudEluZGV4OworICAgICAgICAgICAgbV9sb2NrLnVubG9jaygpOwor
CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBmdW5jdGlvblN0YXJ0ID0gbV9zb3VyY2UgKyBt
X2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKKyAgICAgICAg
ICAgIHNpemVfdCBmdW5jdGlvbkxlbmd0aCA9IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1
bmN0aW9uSW5kZXhdLmVuZCAtIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5k
ZXhdLnN0YXJ0OworICAgICAgICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNl
TGVuZ3RoKTsKKyAgICAgICAgICAgIFNpZ25hdHVyZSogc2lnbmF0dXJlID0gbV9tb2R1bGVJbmZv
cm1hdGlvbi0+aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZXNbZnVuY3Rpb25JbmRleF07CisgICAg
ICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub0pTU3R1YnMuc2l6
ZSgpICsgZnVuY3Rpb25JbmRleDsKKyAgICAgICAgICAgIEFTU0VSVF9VTlVTRUQoZnVuY3Rpb25J
bmRleFNwYWNlLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbZnVuY3Rpb25JbmRl
eFNwYWNlXS5zaWduYXR1cmUgPT0gc2lnbmF0dXJlKTsKKworICAgICAgICAgICAgQVNTRVJUKHZh
bGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwg
bV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKSk7CisKKyAgICAgICAg
ICAgIG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHNbZnVuY3Rpb25JbmRleF0gPSBWZWN0b3I8VW5s
aW5rZWRXYXNtVG9XYXNtQ2FsbD4oKTsKKyAgICAgICAgICAgIGF1dG8gcGFyc2VBbmRDb21waWxl
UmVzdWx0ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBtX2NvbXBpbGF0aW9uQ29udGV4dHNbZnVu
Y3Rpb25JbmRleF0sIGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1f
dW5saW5rZWRXYXNtVG9XYXNtQ2FsbHNbZnVuY3Rpb25JbmRleF0sIG1fZnVuY3Rpb25JbmRleFNw
YWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbik7CisgICAgICAgICAgICBpZiAoVU5MSUtFTFkoIXBh
cnNlQW5kQ29tcGlsZVJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9
IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsg
Ly8gRklYTUUgbWFrZSB0aGlzIGFuIEV4cGVjdGVkLgorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgbV93YXNtSW50ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0gPSBXVEZNb3ZlKCpwYXJz
ZUFuZENvbXBpbGVSZXN1bHQpOwogICAgICAgICB9CisgICAgfTsKKworICAgIGF1dG8gc3RhcnQg
PSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBmb3IgKHVpbnQzMl90IGkg
PSAwOyBpIDwgdGhyZWFkQ291bnQgLSAxOyBpKyspIHsKKyAgICAgICAgY3JlYXRlVGhyZWFkKCJq
c2Mud2FzbS1iMy1jb21waWxhdGlvbi50aHJlYWQiLCBkb1dvcmspOworICAgIH0KKyAgICBkb1dv
cmsoKTsgLy8gTGV0IHRoZSBtYWluIHRocmVhZCBkbyBzb21lIHdvcmsgdG9vLgorCisgICAgewor
ICAgICAgICAvL2F1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsK
KyAgICAgICAgbV9hbGxUaHJlYWRzRG9uZUxvY2subG9jaygpOworICAgICAgICBtX2FsbFRocmVh
ZHNEb25lTG9jay51bmxvY2soKTsKKyAgICAgICAgLy9kYXRhTG9nTG4oIlRvb2sgIiwgc3RkOjpj
aHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcz4oc3RkOjpjaHJv
bm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydCkuY291bnQoKSwgInVzIHRvIGRvIGVuZGlu
ZyBsb29wIik7CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBmdW5jdGlvbkluZGV4ID0gMDsg
ZnVuY3Rpb25JbmRleCA8IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgZnVuY3Rp
b25JbmRleCsrKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCYg
Y29udGV4dCA9IG1fY29tcGlsYXRpb25Db250ZXh0c1tmdW5jdGlvbkluZGV4XTsKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICBMaW5rQnVmZmVyIGxpbmtCdWZmZXIoKm1fdm0sICpjb250
ZXh0Lndhc21FbnRyeXBvaW50SklULCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBtX3dhc21J
bnRlcm5hbEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRp
b24gPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEIzOjpDb21waWxhdGlv
bj4oRklOQUxJWkVfQ09ERShsaW5rQnVmZmVyLCAoIldhc20gZnVuY3Rpb24iKSksIFdURk1vdmUo
Y29udGV4dC53YXNtRW50cnlwb2ludEJ5cHJvZHVjdHMpKTsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcigqbV92bSwg
KmNvbnRleHQuanNFbnRyeXBvaW50SklULCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBsaW5r
QnVmZmVyLmxpbmsoY29udGV4dC5qc0VudHJ5cG9pbnRUb1dhc21FbnRyeXBvaW50Q2FsbCwgRnVu
Y3Rpb25QdHIobV93YXNtSW50ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0tPndhc21FbnRy
eXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKSkpOwogCi0gICAg
ICAgIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLnVuY2hlY2tlZEFwcGVuZChWZWN0b3I8VW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbD4oKSk7Ci0gICAgICAgIGF1dG8gcGFyc2VBbmRDb21waWxlUmVzdWx0
ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwg
c2lnbmF0dXJlLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy5hdChmdW5jdGlvbkluZGV4KSwgbV9m
dW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKLSAgICAgICAgaWYgKFVO
TElLRUxZKCFwYXJzZUFuZENvbXBpbGVSZXN1bHQpKSB7Ci0gICAgICAgICAgICBtX2Vycm9yTWVz
c2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAgICAgcmV0dXJu
OyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAgICAgbV93YXNt
SW50ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0tPmpzVG9XYXNtRW50cnlwb2ludC5jb21w
aWxhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QjM6OkNvbXBp
bGF0aW9uPihGSU5BTElaRV9DT0RFKGxpbmtCdWZmZXIsICgiV2FzbSBKUyBlbnRyeXBvaW50Iikp
LCBXVEZNb3ZlKGNvbnRleHQuanNFbnRyeXBvaW50Qnlwcm9kdWN0cykpOworICAgICAgICAgICAg
fQogICAgICAgICB9Ci0gICAgICAgIG1fd2FzbUludGVybmFsRnVuY3Rpb25zLnVuY2hlY2tlZEFw
cGVuZChXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVSZXN1bHQpKTsKKworICAgICAgICB1bnNpZ25l
ZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21Ub0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25J
bmRleDsKICAgICAgICAgbV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9u
SW5kZXhTcGFjZV0uY29kZSA9IG1fd2FzbUludGVybmFsRnVuY3Rpb25zW2Z1bmN0aW9uSW5kZXhd
LT53YXNtRW50cnlwb2ludC5jb21waWxhdGlvbi0+Y29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7
CiAgICAgfQorICAgIGRhdGFMb2dMbigiVG9vayAiLCBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2Fz
dDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpu
b3coKSAtIHN0YXJ0KS5jb3VudCgpLCAiIG1zIHRvIGNvbXBpbGUgYW5kIGxpbmsiKTsKIAogICAg
IC8vIFBhdGNoIHRoZSBjYWxsIHNpdGVzIGZvciBlYWNoIFdlYkFzc2VtYmx5IGZ1bmN0aW9uLgot
ICAgIGZvciAoYXV0byYgdW5saW5rZWQgOiB1bmxpbmtlZFdhc21Ub1dhc21DYWxscykgeworICAg
IGZvciAoYXV0byYgdW5saW5rZWQgOiBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzKSB7CiAgICAg
ICAgIGZvciAoYXV0byYgY2FsbCA6IHVubGlua2VkKQogICAgICAgICAgICAgTWFjcm9Bc3NlbWJs
ZXI6OnJlcGF0Y2hDYWxsKGNhbGwuY2FsbExvY2F0aW9uLCBDb2RlTG9jYXRpb25MYWJlbChtX2Z1
bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbY2FsbC5mdW5jdGlvbkluZGV4XS5jb2RlKSk7
CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCShyZXZpc2lv
biAyMDk5NTUpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNsdWRlICJDb21waWxhdGlvblJlc3Vs
dC5oIgogI2luY2x1ZGUgIlZNLmgiCisjaW5jbHVkZSAiV2FzbUIzSVJHZW5lcmF0b3IuaCIKICNp
bmNsdWRlICJXYXNtRm9ybWF0LmgiCiAjaW5jbHVkZSA8d3RmL0JhZy5oPgogI2luY2x1ZGUgPHd0
Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgpAQCAtNDgsNiArNDksOCBAQCBwdWJsaWM6CiAgICAg
SlNfRVhQT1JUX1BSSVZBVEUgUGxhbihWTSosIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QpOwogICAg
IEpTX0VYUE9SVF9QUklWQVRFIH5QbGFuKCk7CiAKKyAgICBib29sIGlzVmFsaWRNb2R1bGUoKTsK
KwogICAgIEpTX0VYUE9SVF9QUklWQVRFIHZvaWQgcnVuKCk7CiAKICAgICBKU19FWFBPUlRfUFJJ
VkFURSB2b2lkIGluaXRpYWxpemVDYWxsZWVzKEpTR2xvYmFsT2JqZWN0Kiwgc3RkOjpmdW5jdGlv
bjx2b2lkKHVuc2lnbmVkLCBKU1dlYkFzc2VtYmx5Q2FsbGVlKiwgSlNXZWJBc3NlbWJseUNhbGxl
ZSopPik7CkBAIC0xMDEsNiArMTA0LDcgQEAgcHJpdmF0ZToKICAgICBCYWc8Q2FsbExpbmtJbmZv
PiBtX2NhbGxMaW5rSW5mb3M7CiAgICAgVmVjdG9yPFdhc21Ub0pTU3R1Yj4gbV93YXNtVG9KU1N0
dWJzOwogICAgIFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rpb24+PiBt
X3dhc21JbnRlcm5hbEZ1bmN0aW9uczsKKyAgICBWZWN0b3I8Q29tcGlsYXRpb25Db250ZXh0PiBt
X2NvbXBpbGF0aW9uQ29udGV4dHM7CiAgICAgSW1tdXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlIG1f
ZnVuY3Rpb25JbmRleFNwYWNlOwogCiAgICAgVk0qIG1fdm07CkBAIC0xMDgsNiArMTEyLDExIEBA
IHByaXZhdGU6CiAgICAgY29uc3Qgc2l6ZV90IG1fc291cmNlTGVuZ3RoOwogICAgIGJvb2wgbV9m
YWlsZWQgeyB0cnVlIH07CiAgICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOworICAgIHVpbnQzMl90
IG1fY3VycmVudEluZGV4OworICAgIExvY2sgbV9sb2NrOworICAgIExvY2sgbV9hbGxUaHJlYWRz
RG9uZUxvY2s7CisgICAgdWludDMyX3QgbV90aHJlYWREb25lQ291bnQ7CisgICAgVmVjdG9yPFZl
Y3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gbV91bmxpbmtlZFdhc21Ub1dhc21DYWxsczsK
IH07CiAKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpXYXNtCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297478</attachid>
            <date>2016-12-19 14:14:41 -0800</date>
            <delta_ts>2016-12-19 16:22:08 -0800</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>21267</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA5OTk2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBA
CisyMDE2LTEyLTE5ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFdlYkFzc2VtYmx5OiBXZSBzaG91bGQgY29tcGlsZSB3YXNtIGZ1bmN0aW9ucyBpbiBwYXJhbGxl
bAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTkz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBw
YXRjaCBhZGRzIGEgdmVyeSBzaW1wbGUgcGFyYWxsZWwgY29tcGlsZXIgZm9yIFdhc20gY29kZS4K
KyAgICAgICAgVGhpcyBwYXRjaCBzcGVlZHMgdXAgY29tcGlsaW5nIHRoZSBVbml0eSBoZWFkbGVz
cyBiZW5jaG1hcmsgYnkKKyAgICAgICAgc2xpZ2h0bHkgbW9yZSB0aGFuIDR4IG9uIG15IE1CUC4g
VG8gbWFrZSB0aGlzIHNhZmUsIEkgcGVyZm9ybQorICAgICAgICBhbGwgbGlua2luZyBvbiB0aGUg
bWFpbiB0aHJlYWQuIEkgYWxzbyBoYWQgdG8gY2hhbmdlIHNvbWUgY29kZQorICAgICAgICBpbnNp
ZGUgV2FzbWIzSVJHZW5lcmF0b3IgdG8gYmUgdGhyZWFkIHNhZmUuCisKKyAgICAgICAgKiB3YXNt
L1dhc21CM0lSR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6QjNJUkdlbmVyYXRv
cjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKToKKyAgICAgICAgKEpTQzo6V2FzbTo6Y3JlYXRlSlNUb1dh
c21XcmFwcGVyKToKKyAgICAgICAgKEpTQzo6V2FzbTo6cGFyc2VBbmRDb21waWxlKToKKyAgICAg
ICAgKiB3YXNtL1dhc21CM0lSR2VuZXJhdG9yLmg6CisgICAgICAgICogd2FzbS9XYXNtQ2FsbGlu
Z0NvbnZlbnRpb24uaDoKKyAgICAgICAgKEpTQzo6V2FzbTo6Q2FsbGluZ0NvbnZlbnRpb246OnNl
dHVwRnJhbWVJblByb2xvZ3VlKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmNwcDoKKyAgICAg
ICAgKEpTQzo6V2FzbTo6UGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSk6CisgICAgICAgIChK
U0M6Oldhc206OlBsYW46OnJ1bik6CisgICAgICAgICogd2FzbS9XYXNtUGxhbi5oOgorCiAyMDE2
LTEyLTE4ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIFdlYkFz
c2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNvbXBpbGUgYW5kIFdlYkFzc2VtYmx5
LnZhbGlkYXRlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVy
YXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIz
SVJHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAyMDk5OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3Nyw3ICsy
NzcsNyBAQCB2b2lkIEIzSVJHZW5lcmF0b3I6OmVtaXRFeGNlcHRpb25DaGVjayhDCiAgICAgYXV0
byBqdW1wVG9FeGNlcHRpb25TdHViID0gaml0Lmp1bXAoKTsKIAogICAgIFZNKiB2bSA9ICZtX3Zt
OwotICAgIGppdC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKKyAg
ICBqaXQuYWRkTGlua1Rhc2soW3ZtLCBqdW1wVG9FeGNlcHRpb25TdHViXSAoTGlua0J1ZmZlciYg
bGlua0J1ZmZlcikgewogICAgICAgICBsaW5rQnVmZmVyLmxpbmsoanVtcFRvRXhjZXB0aW9uU3R1
YiwgQ29kZUxvY2F0aW9uTGFiZWwodm0tPmdldENUSVN0dWIodGhyb3dFeGNlcHRpb25Gcm9tV2Fz
bVRodW5rR2VuZXJhdG9yKS5jb2RlKCkpKTsKICAgICB9KTsKIH0KQEAgLTY5MSwxMyArNjkxLDE0
IEBAIGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkQ2FsbCh1aW50MzJfdCBmdW4KICAgICAgICAgICAg
IHBhdGNocG9pbnQtPmVmZmVjdHMud3JpdGVzUGlubmVkID0gdHJ1ZTsKICAgICAgICAgICAgIHBh
dGNocG9pbnQtPmVmZmVjdHMucmVhZHNQaW5uZWQgPSB0cnVlOwogCi0gICAgICAgICAgICBwYXRj
aHBvaW50LT5zZXRHZW5lcmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0
YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKKyAgICAgICAgICAgIFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPiogdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMgPSAmbV91bmxpbmtlZFdhc21U
b1dhc21DYWxsczsKKyAgICAgICAgICAgIHBhdGNocG9pbnQtPnNldEdlbmVyYXRvcihbdW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uSW5kZXhdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29u
c3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKICAgICAgICAgICAgICAgICBBbGxv
d01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UgYWxsb3dTY3JhdGNoKGppdCk7CiAKICAgICAgICAg
ICAgICAgICBDQ2FsbEhlbHBlcnM6OkNhbGwgY2FsbCA9IGppdC5jYWxsKCk7CiAKLSAgICAgICAg
ICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMuYXBwZW5kKHsgbGlu
a0J1ZmZlci5sb2NhdGlvbk9mKGNhbGwpLCBmdW5jdGlvbkluZGV4IH0pOworICAgICAgICAgICAg
ICAgIGppdC5hZGRMaW5rVGFzayhbdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNhbGwsIGZ1bmN0
aW9uSW5kZXhdIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAg
IHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLT5hcHBlbmQoeyBsaW5rQnVmZmVyLmxvY2F0aW9uT2Yo
Y2FsbCksIGZ1bmN0aW9uSW5kZXggfSk7CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg
ICB9KTsKICAgICAgICAgfSk7CkBAIC04MTcsNyArODE4LDcgQEAgdm9pZCBCM0lSR2VuZXJhdG9y
OjpkdW1wKGNvbnN0IFZlY3RvcjxDbwogICAgIGRhdGFMb2dMbigiXG4iKTsKIH0KIAotc3RhdGlj
IHN0ZDo6dW5pcXVlX3B0cjxCMzo6Q29tcGlsYXRpb24+IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcihW
TSYgdm0sIFdhc21JbnRlcm5hbEZ1bmN0aW9uJiBmdW5jdGlvbiwgY29uc3QgU2lnbmF0dXJlKiBz
aWduYXR1cmUsIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtYWluRnVuY3Rpb24sIGNvbnN0IE1lbW9y
eUluZm9ybWF0aW9uJiBtZW1vcnkpCitzdGF0aWMgdm9pZCBjcmVhdGVKU1RvV2FzbVdyYXBwZXIo
Vk0mIHZtLCBDb21waWxhdGlvbkNvbnRleHQmIGNvbXBpbGF0aW9uQ29udGV4dCwgV2FzbUludGVy
bmFsRnVuY3Rpb24mIGZ1bmN0aW9uLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgY29uc3Qg
TWVtb3J5SW5mb3JtYXRpb24mIG1lbW9yeSkKIHsKICAgICBQcm9jZWR1cmUgcHJvYzsKICAgICBC
YXNpY0Jsb2NrKiBibG9jayA9IHByb2MuYWRkQmxvY2soKTsKQEAgLTg3NCwxMyArODc1LDEyIEBA
IHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QjM6OkNvbXBpbGF0aW9uPiAKICAgICAgICAgICAgICAg
ICBwYXRjaHBvaW50LT5hcHBlbmQoQ29uc3RyYWluZWRWYWx1ZShzaXplc1tpXSwgVmFsdWVSZXA6
OnJlZyhtZW1vcnkucGlubmVkUmVnaXN0ZXJzKCkuc2l6ZVJlZ2lzdGVyc1tpXS5zaXplUmVnaXN0
ZXIpKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoWz1d
IChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYp
IHsKKyAgICAgICAgQ29tcGlsYXRpb25Db250ZXh0KiBjb250ZXh0ID0gJmNvbXBpbGF0aW9uQ29u
dGV4dDsKKyAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFtjb250ZXh0XSAoQ0NhbGxI
ZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CiAgICAg
ICAgICAgICBBbGxvd01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UgYWxsb3dTY3JhdGNoKGppdCk7
CiAKICAgICAgICAgICAgIENDYWxsSGVscGVyczo6Q2FsbCBjYWxsID0gaml0LmNhbGwoKTsKLSAg
ICAgICAgICAgIGppdC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsK
LSAgICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxpbmsoY2FsbCwgRnVuY3Rpb25QdHIobWFpbkZ1
bmN0aW9uLmV4ZWN1dGFibGVBZGRyZXNzKCkpKTsKLSAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgY29udGV4dC0+anNFbnRyeXBvaW50VG9XYXNtRW50cnlwb2ludENhbGwgPSBjYWxsOwogICAg
ICAgICB9KTsKICAgICB9KTsKIApAQCAtOTAyLDE1ICs5MDIsMTkgQEAgc3RhdGljIHN0ZDo6dW5p
cXVlX3B0cjxCMzo6Q29tcGlsYXRpb24+IAogICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogICAgIH0KIAotICAgIGF1dG8ganNFbnRyeXBvaW50ID0gc3RkOjptYWtlX3VuaXF1
ZTxDb21waWxhdGlvbj4oQjM6OmNvbXBpbGUodm0sIHByb2MpKTsKKyAgICBCMzo6cHJlcGFyZUZv
ckdlbmVyYXRpb24ocHJvYyk7CisgICAgQjM6OmdlbmVyYXRlKHByb2MsICpjb21waWxhdGlvbkNv
bnRleHQuanNFbnRyeXBvaW50SklUKTsKKyAgICBjb21waWxhdGlvbkNvbnRleHQuanNFbnRyeXBv
aW50Qnlwcm9kdWN0cyA9IHByb2MucmVsZWFzZUJ5cHJvZHVjdHMoKTsKICAgICBmdW5jdGlvbi5q
c1RvV2FzbUVudHJ5cG9pbnQuY2FsbGVlU2F2ZVJlZ2lzdGVycyA9IHByb2MuY2FsbGVlU2F2ZVJl
Z2lzdGVycygpOwotICAgIHJldHVybiBqc0VudHJ5cG9pbnQ7CiB9CiAKLUV4cGVjdGVkPHN0ZDo6
dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxl
KFZNJiB2bSwgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCwgc2l6ZV90IGZ1bmN0aW9uTGVu
Z3RoLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2Fz
bUNhbGw+JiB1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgY29uc3QgSW1tdXRhYmxlRnVuY3Rpb25J
bmRleFNwYWNlJiBmdW5jdGlvbkluZGV4U3BhY2UsIGNvbnN0IE1vZHVsZUluZm9ybWF0aW9uJiBp
bmZvLCB1bnNpZ25lZCBvcHRMZXZlbCkKK0V4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50
ZXJuYWxGdW5jdGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiB2bSwgQ29tcGlsYXRp
b25Db250ZXh0JiBjb21waWxhdGlvbkNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3Rh
cnQsIHNpemVfdCBmdW5jdGlvbkxlbmd0aCwgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUsIFZl
Y3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPiYgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNv
bnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYgZnVuY3Rpb25JbmRleFNwYWNlLCBjb25z
dCBNb2R1bGVJbmZvcm1hdGlvbiYgaW5mbywgdW5zaWduZWQgb3B0TGV2ZWwpCiB7CiAgICAgYXV0
byByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPFdhc21JbnRlcm5hbEZ1bmN0aW9uPigpOwogCisg
ICAgY29tcGlsYXRpb25Db250ZXh0LmpzRW50cnlwb2ludEpJVCA9IHN0ZDo6bWFrZV91bmlxdWU8
Q0NhbGxIZWxwZXJzPigmdm0pOworICAgIGNvbXBpbGF0aW9uQ29udGV4dC53YXNtRW50cnlwb2lu
dEpJVCA9IHN0ZDo6bWFrZV91bmlxdWU8Q0NhbGxIZWxwZXJzPigmdm0pOworCiAgICAgUHJvY2Vk
dXJlIHByb2NlZHVyZTsKICAgICBCM0lSR2VuZXJhdG9yIGNvbnRleHQodm0sIGluZm8sIHByb2Nl
ZHVyZSwgcmVzdWx0LmdldCgpLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRl
eFNwYWNlKTsKICAgICBGdW5jdGlvblBhcnNlcjxCM0lSR2VuZXJhdG9yPiBwYXJzZXIoY29udGV4
dCwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgZnVuY3Rpb25JbmRl
eFNwYWNlLCBpbmZvKTsKQEAgLTkyNSwxMCArOTI5LDE0IEBAIEV4cGVjdGVkPHN0ZDo6dW5pcXVl
X3B0cjxXYXNtSW50ZXJuYWxGdW4KICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgZGF0YUxvZygi
UG9zdCBTU0E6ICIsIHByb2NlZHVyZSk7CiAKLSAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNv
bXBpbGF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxCMzo6Q29tcGlsYXRpb24+KEIzOjpjb21waWxl
KHZtLCBwcm9jZWR1cmUsIG9wdExldmVsKSk7Ci0gICAgcmVzdWx0LT53YXNtRW50cnlwb2ludC5j
YWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2VkdXJlLmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAg
ICB7CisgICAgICAgIEIzOjpwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jZWR1cmUsIG9wdExldmVs
KTsKKyAgICAgICAgQjM6OmdlbmVyYXRlKHByb2NlZHVyZSwgKmNvbXBpbGF0aW9uQ29udGV4dC53
YXNtRW50cnlwb2ludEpJVCk7CisgICAgICAgIGNvbXBpbGF0aW9uQ29udGV4dC53YXNtRW50cnlw
b2ludEJ5cHJvZHVjdHMgPSBwcm9jZWR1cmUucmVsZWFzZUJ5cHJvZHVjdHMoKTsKKyAgICAgICAg
cmVzdWx0LT53YXNtRW50cnlwb2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2VkdXJlLmNh
bGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICB9CiAKLSAgICByZXN1bHQtPmpzVG9XYXNtRW50cnlw
b2ludC5jb21waWxhdGlvbiA9IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2bSwgKnJlc3VsdCwgc2ln
bmF0dXJlLCByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCksIGluZm8u
bWVtb3J5KTsKKyAgICBjcmVhdGVKU1RvV2FzbVdyYXBwZXIodm0sIGNvbXBpbGF0aW9uQ29udGV4
dCwgKnJlc3VsdCwgc2lnbmF0dXJlLCBpbmZvLm1lbW9yeSk7CiAgICAgcmV0dXJuIFdURk1vdmUo
cmVzdWx0KTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJH
ZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
QjNJUkdlbmVyYXRvci5oCShyZXZpc2lvbiAyMDk5OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3
IEBACiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCiAjaW5jbHVkZSAiQjNDb21waWxhdGlvbi5o
IgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlZNLmgiCiAjaW5jbHVkZSAi
V2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9FeHBlY3RlZC5oPgpAQCAtMzgsNyArMzksMTUg
QEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgTWVtb3J5SW5mb3Jt
YXRpb247CiAKLUV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4s
IFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiwgY29uc3QgdWludDhfdCosIHNpemVfdCwgY29u
c3QgU2lnbmF0dXJlKiwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiwgY29uc3QgSW1t
dXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlJiwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24mLCB1bnNp
Z25lZCBvcHRMZXZlbCA9IDEpOworc3RydWN0IENvbXBpbGF0aW9uQ29udGV4dCB7CisgICAgc3Rk
Ojp1bmlxdWVfcHRyPENDYWxsSGVscGVycz4ganNFbnRyeXBvaW50SklUOworICAgIHN0ZDo6dW5p
cXVlX3B0cjxCMzo6T3BhcXVlQnlwcm9kdWN0cz4ganNFbnRyeXBvaW50Qnlwcm9kdWN0czsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8Q0NhbGxIZWxwZXJzPiB3YXNtRW50cnlwb2ludEpJVDsKKyAgICBz
dGQ6OnVuaXF1ZV9wdHI8QjM6Ok9wYXF1ZUJ5cHJvZHVjdHM+IHdhc21FbnRyeXBvaW50Qnlwcm9k
dWN0czsKKyAgICBDQ2FsbEhlbHBlcnM6OkNhbGwganNFbnRyeXBvaW50VG9XYXNtRW50cnlwb2lu
dENhbGw7Cit9OworCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rp
b24+LCBTdHJpbmc+IHBhcnNlQW5kQ29tcGlsZShWTSYsIENvbXBpbGF0aW9uQ29udGV4dCYsIGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QsIGNvbnN0IFNpZ25hdHVyZSosIFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPiYsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYsIGNvbnN0
IE1vZHVsZUluZm9ybWF0aW9uJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAogfSB9IC8vIG5h
bWVzcGFjZSBKU0M6Oldhc20KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUNhbGxpbmdDb252ZW50aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vV2FzbUNhbGxpbmdDb252ZW50aW9uLmgJKHJldmlzaW9uIDIwOTk5MSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21DYWxsaW5nQ29udmVudGlvbi5oCSh3b3JraW5nIGNv
cHkpCkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxw
ZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFtcykgewog
ICAgICAgICAgICAgICAgIEdQUlJlZyByZXN1bHQgPSBwYXJhbXNbMF0uZ3ByKCk7CiAgICAgICAg
ICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkRhdGFMYWJlbFB0ciBtb3ZlTG9jYXRpb24gPSBqaXQu
bW92ZVdpdGhQYXRjaChNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihudWxscHRyKSwgcmVz
dWx0KTsKLSAgICAgICAgICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBs
aW5rQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFtjYWxsZWVNb3Zl
TG9jYXRpb24sIG1vdmVMb2NhdGlvbl0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKICAgICAg
ICAgICAgICAgICAgICAgKmNhbGxlZU1vdmVMb2NhdGlvbiA9IGxpbmtCdWZmZXIubG9jYXRpb25P
Zihtb3ZlTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfSk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lvbiAyMDk5
OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJXYXNtTW9kdWxlUGFyc2VyLmgiCiAj
aW5jbHVkZSAiV2FzbVZhbGlkYXRlLmgiCiAjaW5jbHVkZSA8d3RmL0RhdGFMb2cuaD4KKyNpbmNs
dWRlIDx3dGYvTnVtYmVyT2ZDb3Jlcy5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4K
ICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CiAKQEAgLTYwLDYgKzYxLDkgQEAg
UGxhbjo6UGxhbihWTSogdm0sIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZQogCiBib29sIFBsYW46OnBh
cnNlQW5kVmFsaWRhdGVNb2R1bGUoKQogeworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6
OnRpbWVfcG9pbnQgc3RhcnRUaW1lOworICAgIGlmICh2ZXJib3NlIHx8IE9wdGlvbnM6OnJlcG9y
dENvbXBpbGVUaW1lcygpKQorICAgICAgICBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5
X2Nsb2NrOjpub3coKTsKICAgICB7CiAgICAgICAgIE1vZHVsZVBhcnNlciBtb2R1bGVQYXJzZXIo
bV92bSwgbV9zb3VyY2UsIG1fc291cmNlTGVuZ3RoKTsKICAgICAgICAgYXV0byBwYXJzZVJlc3Vs
dCA9IG1vZHVsZVBhcnNlci5wYXJzZSgpOwpAQCAtNzgsMjcgKzgyLDMzIEBAIGJvb2wgUGxhbjo6
cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpCiAgICAgICAgICAgICBkYXRhTG9nTG4oIlByb2Nlc3Np
bmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1
bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlv
bkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1
bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0
aW9uSW5kZXhdLnN0YXJ0OwogICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0
aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRp
b25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKLSAgICAgICAgQVNTRVJUKENoZWNrZWQ8
dWludHB0cl90PihiaXR3aXNlX2Nhc3Q8dWludHB0cl90PihmdW5jdGlvblN0YXJ0KSkgKyBmdW5j
dGlvbkxlbmd0aCA8PSBDaGVja2VkPHVpbnRwdHJfdD4oYml0d2lzZV9jYXN0PHVpbnRwdHJfdD4o
bV9zb3VyY2UpKSArIG1fc291cmNlTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVu
Z3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKICAgICAgICAgU2lnbmF0dXJlKiBzaWduYXR1cmUgPSBt
X21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tmdW5jdGlvbklu
ZGV4XTsKIAotICAgICAgICBhdXRvIHZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9u
KGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRl
eFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbik7Ci0gICAgICAgIGlmICghdmFsaWRhdGlvblJl
c3VsdCkgeworICAgICAgICBhdXRvIHZhbGlkYXRlUmVzdWx0ID0gdmFsaWRhdGVGdW5jdGlvbihm
dW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0aW9uSW5kZXhT
cGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOworICAgICAgICBpZiAoIXZhbGlkYXRlUmVzdWx0
KSB7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSkgewogICAgICAgICAgICAgICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBmdW5jdGlvbkxlbmd0aDsgKytpKQogICAgICAgICAgICAgICAgICAg
ICBkYXRhTG9nKFJhd1BvaW50ZXIocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oZnVuY3Rpb25TdGFy
dFtpXSkpLCAiLCAiKTsKICAgICAgICAgICAgICAgICBkYXRhTG9nTG4oKTsKICAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcigp
OyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICBtX2Vycm9yTWVz
c2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVycm9yKCk7IC8vIEZJWE1FIG1ha2UgdGhpcyBhbiBFeHBl
Y3RlZC4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KIAorICAg
IGlmICh2ZXJib3NlIHx8IE9wdGlvbnM6OnJlcG9ydENvbXBpbGVUaW1lcygpKQorICAgICAgICBk
YXRhTG9nTG4oIlRvb2sgIiwgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86
Om1pY3Jvc2Vjb25kcz4oc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkgLSBzdGFydFRp
bWUpLmNvdW50KCksICIgdXMgdG8gdmFsaWRhdGUgbW9kdWxlIik7CiAgICAgcmV0dXJuIHRydWU7
CiB9CiAKKy8vIFdlIGFyZSBjcmVhdGluZyBhIGJ1bmNoIG9mIHRocmVhZHMgdGhhdCB0b3VjaCB0
aGUgbWFpbiB0aHJlYWQncyBzdGFjay4gVGhpcyB3aWxsIG1ha2UgQVNBTiB1bmhhcHB5LgorLy8g
VGhlIHJlYXNvbiB0aGlzIGlzIE9LIGlzIHRoYXQgd2UgZ3VhcmFudGVlIHRoYXQgdGhlIG1haW4g
dGhyZWFkIGRvZXNuJ3QgY29udGludWUgdW50aWwgYWxsIHRocmVhZHMKKy8vIHRoYXQgY291bGQg
dG91Y2ggaXRzIHN0YWNrIGFyZSBkb25lIGV4ZWN1dGluZy4KK1NVUFBSRVNTX0FTQU4gCiB2b2lk
IFBsYW46OnJ1bigpCiB7Ci0gICAgaWYgKCFwYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkpCisgICAg
aWYgKCFwYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkpIC8vIFRoaXMgYWxzbyBjb2xsZWN0cyBhIGJ1
bmNoIG9mIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uLgog
ICAgICAgICByZXR1cm47CiAKICAgICBhdXRvIHRyeVJlc2VydmVDYXBhY2l0eSA9IFt0aGlzXSAo
YXV0byYgdmVjdG9yLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogd2hhdCkgewpAQCAtMTEzLDEy
ICsxMjMsMTYgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9
OwogCi0gICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gdW5saW5rZWRX
YXNtVG9XYXNtQ2FsbHM7CiAgICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9KU1N0
dWJzLCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvbnMuc2l6ZSgpLCAiIFdlYkFz
c2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQotICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFj
aXR5KHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5z
aXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1ibHkgdG8gV2ViQXNzZW1ibHkgY2FsbHMiKQotICAg
ICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbUludGVybmFsRnVuY3Rpb25zLCBtX2Z1
bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgV2ViQXNzZW1ibHkgZnVuY3Rpb25zIikp
CisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV91bmxpbmtlZFdhc21Ub1dhc21DYWxs
cywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpLCAiIHVubGlua2VkIFdlYkFzc2Vt
Ymx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKKyAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0
eShtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6
ZSgpLCAiIFdlYkFzc2VtYmx5IGZ1bmN0aW9ucyIpCisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2Fw
YWNpdHkobV9jb21waWxhdGlvbkNvbnRleHRzLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5z
aXplKCksICIgY29tcGlsYXRpb24gY29udGV4dHMiKSkKICAgICAgICAgcmV0dXJuOwogCisgICAg
bV91bmxpbmtlZFdhc21Ub1dhc21DYWxscy5yZXNpemUobV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5h
cnkuc2l6ZSgpKTsKKyAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5yZXNpemUobV9mdW5jdGlv
bkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKTsKKyAgICBtX2NvbXBpbGF0aW9uQ29udGV4dHMucmVz
aXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSk7CisKICAgICBmb3IgKHVuc2ln
bmVkIGltcG9ydEluZGV4ID0gMDsgaW1wb3J0SW5kZXggPCBtX21vZHVsZUluZm9ybWF0aW9uLT5p
bXBvcnRzLnNpemUoKTsgKytpbXBvcnRJbmRleCkgewogICAgICAgICBJbXBvcnQqIGltcG9ydCA9
ICZtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRzW2ltcG9ydEluZGV4XTsKICAgICAgICAgaWYg
KGltcG9ydC0+a2luZCAhPSBFeHRlcm5hbEtpbmQ6OkZ1bmN0aW9uKQpAQCAtMTMxLDMwICsxNDUs
OTggQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICBtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZm
ZXIuZ2V0KClbaW1wb3J0RnVuY3Rpb25JbmRleF0uY29kZSA9IG1fd2FzbVRvSlNTdHVic1tpbXBv
cnRGdW5jdGlvbkluZGV4XS5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKICAgICB9CiAKLSAg
ICBmb3IgKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5jdGlvbkluZGV4IDwgbV9mdW5j
dGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyArK2Z1bmN0aW9uSW5kZXgpIHsKLSAgICAgICAg
aWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nTG4oIlByb2Nlc3NpbmcgZnVuY3Rpb24g
c3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhd
LnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1
bmN0aW9uSW5kZXhdLmVuZCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQg
PSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0
YXJ0OwotICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25J
bkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtm
dW5jdGlvbkluZGV4XS5zdGFydDsKLSAgICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVuZ3RoIDw9IG1f
c291cmNlTGVuZ3RoKTsKLSAgICAgICAgU2lnbmF0dXJlKiBzaWduYXR1cmUgPSBtX21vZHVsZUlu
Zm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tmdW5jdGlvbkluZGV4XTsKLSAg
ICAgICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUo
KSArIGZ1bmN0aW9uSW5kZXg7Ci0gICAgICAgIEFTU0VSVChtX2Z1bmN0aW9uSW5kZXhTcGFjZS5i
dWZmZXIuZ2V0KClbZnVuY3Rpb25JbmRleFNwYWNlXS5zaWduYXR1cmUgPT0gc2lnbmF0dXJlKTsK
IAotICAgICAgICBBU1NFUlQodmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlv
bkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3Jt
YXRpb24pKTsKKyAgICB1aW50MzJfdCB0aHJlYWRDb3VudCA9IFdURjo6bnVtYmVyT2ZQcm9jZXNz
b3JDb3JlcygpOworICAgIGlmICh2ZXJib3NlKQorICAgICAgICBkYXRhTG9nTG4oIlRocmVhZCBj
b3VudDogIiwgdGhyZWFkQ291bnQpOworCisgICAgbV9jdXJyZW50SW5kZXggPSAwOworCisgICAg
YXV0byBkb1dvcmsgPSBbdGhpcywgdGhyZWFkQ291bnRdIHsKKyAgICAgICAgd2hpbGUgKHRydWUp
IHsKKyAgICAgICAgICAgIG1fbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAobV9jdXJyZW50
SW5kZXggPj0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKSB7CisgICAgICAgICAg
ICAgICAgbV9sb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHVpbnQzMl90IGZ1bmN0aW9uSW5kZXggPSBtX2N1cnJlbnRJbmRl
eDsKKyAgICAgICAgICAgICsrbV9jdXJyZW50SW5kZXg7CisgICAgICAgICAgICBtX2xvY2sudW5s
b2NrKCk7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3Nv
dXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0Owor
ICAgICAgICAgICAgc2l6ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9mdW5jdGlvbkxvY2F0aW9uSW5C
aW5hcnlbZnVuY3Rpb25JbmRleF0uZW5kIC0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVu
Y3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgICAgICBBU1NFUlQoZnVuY3Rpb25MZW5ndGggPD0g
bV9zb3VyY2VMZW5ndGgpOworICAgICAgICAgICAgU2lnbmF0dXJlKiBzaWduYXR1cmUgPSBtX21v
ZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlc1tmdW5jdGlvbkluZGV4
XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbVRvSlNT
dHVicy5zaXplKCkgKyBmdW5jdGlvbkluZGV4OworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChm
dW5jdGlvbkluZGV4U3BhY2UsIG1fZnVuY3Rpb25JbmRleFNwYWNlLmJ1ZmZlci5nZXQoKVtmdW5j
dGlvbkluZGV4U3BhY2VdLnNpZ25hdHVyZSA9PSBzaWduYXR1cmUpOworCisgICAgICAgICAgICBB
U1NFUlQodmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2ln
bmF0dXJlLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pKTsKKwor
ICAgICAgICAgICAgbV91bmxpbmtlZFdhc21Ub1dhc21DYWxsc1tmdW5jdGlvbkluZGV4XSA9IFZl
Y3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPigpOworICAgICAgICAgICAgYXV0byBwYXJzZUFu
ZENvbXBpbGVSZXN1bHQgPSBwYXJzZUFuZENvbXBpbGUoKm1fdm0sIG1fY29tcGlsYXRpb25Db250
ZXh0c1tmdW5jdGlvbkluZGV4XSwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25h
dHVyZSwgbV91bmxpbmtlZFdhc21Ub1dhc21DYWxsc1tmdW5jdGlvbkluZGV4XSwgbV9mdW5jdGlv
bkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKKworICAgICAgICAgICAgaWYgKFVO
TElLRUxZKCFwYXJzZUFuZENvbXBpbGVSZXN1bHQpKSB7CisgICAgICAgICAgICAgICAgbV9sb2Nr
LmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1fZXJyb3JNZXNzYWdlKSB7CisgICAgICAg
ICAgICAgICAgICAgIC8vIE11bHRpcGxlIGNvbXBpbGVzIGNvdWxkIGZhaWwgc2ltdWx0YW5lb3Vz
bHkuIFdlIGFyYml0cmFyaWx5IGNob29zZSB0aGUgZmlyc3QuCisgICAgICAgICAgICAgICAgICAg
IG1fZXJyb3JNZXNzYWdlID0gcGFyc2VBbmRDb21waWxlUmVzdWx0LmVycm9yKCk7IC8vIEZJWE1F
IG1ha2UgdGhpcyBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgbV9jdXJyZW50SW5kZXggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCk7Cisg
ICAgICAgICAgICAgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgICAgICAgICAgICAgLy8gV2Ug
d2lsbCB0ZXJtaW5hdGUgb24gdGhlIG5leHQgZXhlY3V0aW9uLgorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV93YXNtSW50ZXJuYWxGdW5j
dGlvbnNbZnVuY3Rpb25JbmRleF0gPSBXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVSZXN1bHQpOwor
ICAgICAgICB9CisgICAgfTsKKworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVf
cG9pbnQgc3RhcnRUaW1lOworICAgIGlmICh2ZXJib3NlIHx8IE9wdGlvbnM6OnJlcG9ydENvbXBp
bGVUaW1lcygpKQorICAgICAgICBzdGFydFRpbWUgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2Nr
Ojpub3coKTsKKworICAgIHVpbnQzMl90IG51bVdvcmtlclRocmVhZHMgPSB0aHJlYWRDb3VudCAt
IDE7CisgICAgVmVjdG9yPFRocmVhZElkZW50aWZpZXI+IHRocmVhZHM7CisgICAgdGhyZWFkcy5y
ZXNlcnZlQ2FwYWNpdHkobnVtV29ya2VyVGhyZWFkcyk7CisgICAgZm9yICh1aW50MzJfdCBpID0g
MDsgaSA8IG51bVdvcmtlclRocmVhZHM7IGkrKykKKyAgICAgICAgdGhyZWFkcy51bmNoZWNrZWRB
cHBlbmQoY3JlYXRlVGhyZWFkKCJqc2Mud2FzbS1iMy1jb21waWxhdGlvbi50aHJlYWQiLCBkb1dv
cmspKTsKKworICAgIGRvV29yaygpOyAvLyBMZXQgdGhlIG1haW4gdGhyZWFkIGRvIHNvbWUgd29y
ayB0b28uCisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnVtV29ya2VyVGhyZWFkczsg
aSsrKQorICAgICAgICB3YWl0Rm9yVGhyZWFkQ29tcGxldGlvbih0aHJlYWRzW2ldKTsKKworCisg
ICAgZm9yICh1aW50MzJfdCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rpb25JbmRleCA8IG1fZnVu
Y3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgZnVuY3Rpb25JbmRleCsrKSB7CisgICAgICAg
IHsKKyAgICAgICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCYgY29udGV4dCA9IG1fY29tcGlsYXRp
b25Db250ZXh0c1tmdW5jdGlvbkluZGV4XTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAg
ICBMaW5rQnVmZmVyIGxpbmtCdWZmZXIoKm1fdm0sICpjb250ZXh0Lndhc21FbnRyeXBvaW50SklU
LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9uc1tmdW5j
dGlvbkluZGV4XS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24gPQorICAgICAgICAgICAgICAg
ICAgICBzdGQ6Om1ha2VfdW5pcXVlPEIzOjpDb21waWxhdGlvbj4oRklOQUxJWkVfQ09ERShsaW5r
QnVmZmVyLCAoIldhc20gZnVuY3Rpb24iKSksIFdURk1vdmUoY29udGV4dC53YXNtRW50cnlwb2lu
dEJ5cHJvZHVjdHMpKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICB1bmxpbmtlZFdhc21Ub1dh
c21DYWxscy51bmNoZWNrZWRBcHBlbmQoVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+KCkp
OwotICAgICAgICBhdXRvIHBhcnNlQW5kQ29tcGlsZVJlc3VsdCA9IHBhcnNlQW5kQ29tcGlsZSgq
bV92bSwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgdW5saW5rZWRX
YXNtVG9XYXNtQ2FsbHMuYXQoZnVuY3Rpb25JbmRleCksIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAq
bV9tb2R1bGVJbmZvcm1hdGlvbik7Ci0gICAgICAgIGlmIChVTkxJS0VMWSghcGFyc2VBbmRDb21w
aWxlUmVzdWx0KSkgewotICAgICAgICAgICAgbV9lcnJvck1lc3NhZ2UgPSBwYXJzZUFuZENvbXBp
bGVSZXN1bHQuZXJyb3IoKTsKLSAgICAgICAgICAgIHJldHVybjsgLy8gRklYTUUgbWFrZSB0aGlz
IGFuIEV4cGVjdGVkLgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExpbmtCdWZmZXIg
bGlua0J1ZmZlcigqbV92bSwgKmNvbnRleHQuanNFbnRyeXBvaW50SklULCBudWxscHRyKTsKKyAg
ICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxpbmsoY29udGV4dC5qc0VudHJ5cG9pbnRUb1dhc21F
bnRyeXBvaW50Q2FsbCwgRnVuY3Rpb25QdHIobV93YXNtSW50ZXJuYWxGdW5jdGlvbnNbZnVuY3Rp
b25JbmRleF0tPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCkuZXhlY3V0YWJsZUFk
ZHJlc3MoKSkpOworCisgICAgICAgICAgICAgICAgbV93YXNtSW50ZXJuYWxGdW5jdGlvbnNbZnVu
Y3Rpb25JbmRleF0tPmpzVG9XYXNtRW50cnlwb2ludC5jb21waWxhdGlvbiA9CisgICAgICAgICAg
ICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QjM6OkNvbXBpbGF0aW9uPihGSU5BTElaRV9DT0RF
KGxpbmtCdWZmZXIsICgiV2FzbSBKUyBlbnRyeXBvaW50IikpLCBXVEZNb3ZlKGNvbnRleHQuanNF
bnRyeXBvaW50Qnlwcm9kdWN0cykpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAg
IG1fd2FzbUludGVybmFsRnVuY3Rpb25zLnVuY2hlY2tlZEFwcGVuZChXVEZNb3ZlKCpwYXJzZUFu
ZENvbXBpbGVSZXN1bHQpKTsKKworICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2Ug
PSBtX3dhc21Ub0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKICAgICAgICAgbV9mdW5j
dGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9uSW5kZXhTcGFjZV0uY29kZSA9IG1f
d2FzbUludGVybmFsRnVuY3Rpb25zW2Z1bmN0aW9uSW5kZXhdLT53YXNtRW50cnlwb2ludC5jb21w
aWxhdGlvbi0+Y29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgfQogCisgICAgaWYgKHZl
cmJvc2UgfHwgT3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpIHsKKyAgICAgICAgZGF0YUxv
Z0xuKCJUb29rICIsIHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNy
b3NlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnRUaW1lKS5j
b3VudCgpLAorICAgICAgICAgICAgIiB1cyB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBtb2R1bGUi
KTsKKyAgICB9CisKICAgICAvLyBQYXRjaCB0aGUgY2FsbCBzaXRlcyBmb3IgZWFjaCBXZWJBc3Nl
bWJseSBmdW5jdGlvbi4KLSAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogdW5saW5rZWRXYXNtVG9X
YXNtQ2FsbHMpIHsKKyAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogbV91bmxpbmtlZFdhc21Ub1dh
c21DYWxscykgewogICAgICAgICBmb3IgKGF1dG8mIGNhbGwgOiB1bmxpbmtlZCkKICAgICAgICAg
ICAgIE1hY3JvQXNzZW1ibGVyOjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwgQ29kZUxv
Y2F0aW9uTGFiZWwobV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2NhbGwuZnVuY3Rp
b25JbmRleF0uY29kZSkpOwogICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNt
L1dhc21QbGFuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bVBsYW4uaAkocmV2aXNpb24gMjA5OTkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20v
V2FzbVBsYW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAi
Q29tcGlsYXRpb25SZXN1bHQuaCIKICNpbmNsdWRlICJWTS5oIgorI2luY2x1ZGUgIldhc21CM0lS
R2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAiV2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9CYWcu
aD4KICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KQEAgLTEwMywxMyArMTA0
LDE3IEBAIHByaXZhdGU6CiAgICAgQmFnPENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0luZm9zOwog
ICAgIFZlY3RvcjxXYXNtVG9KU1N0dWI+IG1fd2FzbVRvSlNTdHViczsKICAgICBWZWN0b3I8c3Rk
Ojp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0aW9uPj4gbV93YXNtSW50ZXJuYWxGdW5jdGlv
bnM7CisgICAgVmVjdG9yPENvbXBpbGF0aW9uQ29udGV4dD4gbV9jb21waWxhdGlvbkNvbnRleHRz
OwogICAgIEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSBtX2Z1bmN0aW9uSW5kZXhTcGFjZTsK
IAogICAgIFZNKiBtX3ZtOworICAgIFZlY3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2Fs
bD4+IG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgY29uc3QgdWludDhfdCogbV9zb3Vy
Y2U7CiAgICAgY29uc3Qgc2l6ZV90IG1fc291cmNlTGVuZ3RoOwogICAgIGJvb2wgbV9mYWlsZWQg
eyB0cnVlIH07CiAgICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOworICAgIHVpbnQzMl90IG1fY3Vy
cmVudEluZGV4OworICAgIExvY2sgbV9sb2NrOwogfTsKIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6
Oldhc20K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297492</attachid>
            <date>2016-12-19 16:22:08 -0800</date>
            <delta_ts>2016-12-20 11:57:25 -0800</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>21150</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA5OTk2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBA
CisyMDE2LTEyLTE5ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFdlYkFzc2VtYmx5OiBXZSBzaG91bGQgY29tcGlsZSB3YXNtIGZ1bmN0aW9ucyBpbiBwYXJhbGxl
bAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTkz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBw
YXRjaCBhZGRzIGEgdmVyeSBzaW1wbGUgcGFyYWxsZWwgY29tcGlsZXIgZm9yIFdhc20gY29kZS4K
KyAgICAgICAgVGhpcyBwYXRjaCBzcGVlZHMgdXAgY29tcGlsaW5nIHRoZSBVbml0eSBoZWFkbGVz
cyBiZW5jaG1hcmsgYnkKKyAgICAgICAgc2xpZ2h0bHkgbW9yZSB0aGFuIDR4IG9uIG15IE1CUC4g
VG8gbWFrZSB0aGlzIHNhZmUsIEkgcGVyZm9ybQorICAgICAgICBhbGwgbGlua2luZyBvbiB0aGUg
bWFpbiB0aHJlYWQuIEkgYWxzbyBoYWQgdG8gY2hhbmdlIHNvbWUgY29kZQorICAgICAgICBpbnNp
ZGUgV2FzbWIzSVJHZW5lcmF0b3IgdG8gYmUgdGhyZWFkIHNhZmUuCisKKyAgICAgICAgKiB3YXNt
L1dhc21CM0lSR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6QjNJUkdlbmVyYXRv
cjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKToKKyAgICAgICAgKEpTQzo6V2FzbTo6Y3JlYXRlSlNUb1dh
c21XcmFwcGVyKToKKyAgICAgICAgKEpTQzo6V2FzbTo6cGFyc2VBbmRDb21waWxlKToKKyAgICAg
ICAgKiB3YXNtL1dhc21CM0lSR2VuZXJhdG9yLmg6CisgICAgICAgICogd2FzbS9XYXNtQ2FsbGlu
Z0NvbnZlbnRpb24uaDoKKyAgICAgICAgKEpTQzo6V2FzbTo6Q2FsbGluZ0NvbnZlbnRpb246OnNl
dHVwRnJhbWVJblByb2xvZ3VlKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmNwcDoKKyAgICAg
ICAgKEpTQzo6V2FzbTo6UGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSk6CisgICAgICAgIChK
U0M6Oldhc206OlBsYW46OnJ1bik6CisgICAgICAgICogd2FzbS9XYXNtUGxhbi5oOgorCiAyMDE2
LTEyLTE4ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIFdlYkFz
c2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNvbXBpbGUgYW5kIFdlYkFzc2VtYmx5
LnZhbGlkYXRlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVy
YXRvci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIz
SVJHZW5lcmF0b3IuY3BwCShyZXZpc2lvbiAyMDk5OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3Nyw3ICsy
NzcsNyBAQCB2b2lkIEIzSVJHZW5lcmF0b3I6OmVtaXRFeGNlcHRpb25DaGVjayhDCiAgICAgYXV0
byBqdW1wVG9FeGNlcHRpb25TdHViID0gaml0Lmp1bXAoKTsKIAogICAgIFZNKiB2bSA9ICZtX3Zt
OwotICAgIGppdC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKKyAg
ICBqaXQuYWRkTGlua1Rhc2soW3ZtLCBqdW1wVG9FeGNlcHRpb25TdHViXSAoTGlua0J1ZmZlciYg
bGlua0J1ZmZlcikgewogICAgICAgICBsaW5rQnVmZmVyLmxpbmsoanVtcFRvRXhjZXB0aW9uU3R1
YiwgQ29kZUxvY2F0aW9uTGFiZWwodm0tPmdldENUSVN0dWIodGhyb3dFeGNlcHRpb25Gcm9tV2Fz
bVRodW5rR2VuZXJhdG9yKS5jb2RlKCkpKTsKICAgICB9KTsKIH0KQEAgLTY5MSwxMyArNjkxLDE0
IEBAIGF1dG8gQjNJUkdlbmVyYXRvcjo6YWRkQ2FsbCh1aW50MzJfdCBmdW4KICAgICAgICAgICAg
IHBhdGNocG9pbnQtPmVmZmVjdHMud3JpdGVzUGlubmVkID0gdHJ1ZTsKICAgICAgICAgICAgIHBh
dGNocG9pbnQtPmVmZmVjdHMucmVhZHNQaW5uZWQgPSB0cnVlOwogCi0gICAgICAgICAgICBwYXRj
aHBvaW50LT5zZXRHZW5lcmF0b3IoWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0
YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKKyAgICAgICAgICAgIFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPiogdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMgPSAmbV91bmxpbmtlZFdhc21U
b1dhc21DYWxsczsKKyAgICAgICAgICAgIHBhdGNocG9pbnQtPnNldEdlbmVyYXRvcihbdW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uSW5kZXhdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29u
c3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYpIHsKICAgICAgICAgICAgICAgICBBbGxv
d01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UgYWxsb3dTY3JhdGNoKGppdCk7CiAKICAgICAgICAg
ICAgICAgICBDQ2FsbEhlbHBlcnM6OkNhbGwgY2FsbCA9IGppdC5jYWxsKCk7CiAKLSAgICAgICAg
ICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7Ci0g
ICAgICAgICAgICAgICAgICAgIG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMuYXBwZW5kKHsgbGlu
a0J1ZmZlci5sb2NhdGlvbk9mKGNhbGwpLCBmdW5jdGlvbkluZGV4IH0pOworICAgICAgICAgICAg
ICAgIGppdC5hZGRMaW5rVGFzayhbdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNhbGwsIGZ1bmN0
aW9uSW5kZXhdIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAg
IHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLT5hcHBlbmQoeyBsaW5rQnVmZmVyLmxvY2F0aW9uT2Yo
Y2FsbCksIGZ1bmN0aW9uSW5kZXggfSk7CiAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAg
ICB9KTsKICAgICAgICAgfSk7CkBAIC04MTcsNyArODE4LDcgQEAgdm9pZCBCM0lSR2VuZXJhdG9y
OjpkdW1wKGNvbnN0IFZlY3RvcjxDbwogICAgIGRhdGFMb2dMbigiXG4iKTsKIH0KIAotc3RhdGlj
IHN0ZDo6dW5pcXVlX3B0cjxCMzo6Q29tcGlsYXRpb24+IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcihW
TSYgdm0sIFdhc21JbnRlcm5hbEZ1bmN0aW9uJiBmdW5jdGlvbiwgY29uc3QgU2lnbmF0dXJlKiBz
aWduYXR1cmUsIE1hY3JvQXNzZW1ibGVyQ29kZVB0ciBtYWluRnVuY3Rpb24sIGNvbnN0IE1lbW9y
eUluZm9ybWF0aW9uJiBtZW1vcnkpCitzdGF0aWMgdm9pZCBjcmVhdGVKU1RvV2FzbVdyYXBwZXIo
Vk0mIHZtLCBDb21waWxhdGlvbkNvbnRleHQmIGNvbXBpbGF0aW9uQ29udGV4dCwgV2FzbUludGVy
bmFsRnVuY3Rpb24mIGZ1bmN0aW9uLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgY29uc3Qg
TWVtb3J5SW5mb3JtYXRpb24mIG1lbW9yeSkKIHsKICAgICBQcm9jZWR1cmUgcHJvYzsKICAgICBC
YXNpY0Jsb2NrKiBibG9jayA9IHByb2MuYWRkQmxvY2soKTsKQEAgLTg3NCwxMyArODc1LDEyIEBA
IHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QjM6OkNvbXBpbGF0aW9uPiAKICAgICAgICAgICAgICAg
ICBwYXRjaHBvaW50LT5hcHBlbmQoQ29uc3RyYWluZWRWYWx1ZShzaXplc1tpXSwgVmFsdWVSZXA6
OnJlZyhtZW1vcnkucGlubmVkUmVnaXN0ZXJzKCkuc2l6ZVJlZ2lzdGVyc1tpXS5zaXplUmVnaXN0
ZXIpKSk7CiAgICAgICAgIH0KIAotICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoWz1d
IChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlvblBhcmFtcyYp
IHsKKyAgICAgICAgQ29tcGlsYXRpb25Db250ZXh0KiBjb250ZXh0ID0gJmNvbXBpbGF0aW9uQ29u
dGV4dDsKKyAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFtjb250ZXh0XSAoQ0NhbGxI
ZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CiAgICAg
ICAgICAgICBBbGxvd01hY3JvU2NyYXRjaFJlZ2lzdGVyVXNhZ2UgYWxsb3dTY3JhdGNoKGppdCk7
CiAKICAgICAgICAgICAgIENDYWxsSGVscGVyczo6Q2FsbCBjYWxsID0gaml0LmNhbGwoKTsKLSAg
ICAgICAgICAgIGppdC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsK
LSAgICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxpbmsoY2FsbCwgRnVuY3Rpb25QdHIobWFpbkZ1
bmN0aW9uLmV4ZWN1dGFibGVBZGRyZXNzKCkpKTsKLSAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgY29udGV4dC0+anNFbnRyeXBvaW50VG9XYXNtRW50cnlwb2ludENhbGwgPSBjYWxsOwogICAg
ICAgICB9KTsKICAgICB9KTsKIApAQCAtOTAyLDE1ICs5MDIsMTkgQEAgc3RhdGljIHN0ZDo6dW5p
cXVlX3B0cjxCMzo6Q29tcGlsYXRpb24+IAogICAgICAgICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVB
Q0hFRCgpOwogICAgIH0KIAotICAgIGF1dG8ganNFbnRyeXBvaW50ID0gc3RkOjptYWtlX3VuaXF1
ZTxDb21waWxhdGlvbj4oQjM6OmNvbXBpbGUodm0sIHByb2MpKTsKKyAgICBCMzo6cHJlcGFyZUZv
ckdlbmVyYXRpb24ocHJvYyk7CisgICAgQjM6OmdlbmVyYXRlKHByb2MsICpjb21waWxhdGlvbkNv
bnRleHQuanNFbnRyeXBvaW50SklUKTsKKyAgICBjb21waWxhdGlvbkNvbnRleHQuanNFbnRyeXBv
aW50Qnlwcm9kdWN0cyA9IHByb2MucmVsZWFzZUJ5cHJvZHVjdHMoKTsKICAgICBmdW5jdGlvbi5q
c1RvV2FzbUVudHJ5cG9pbnQuY2FsbGVlU2F2ZVJlZ2lzdGVycyA9IHByb2MuY2FsbGVlU2F2ZVJl
Z2lzdGVycygpOwotICAgIHJldHVybiBqc0VudHJ5cG9pbnQ7CiB9CiAKLUV4cGVjdGVkPHN0ZDo6
dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxl
KFZNJiB2bSwgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCwgc2l6ZV90IGZ1bmN0aW9uTGVu
Z3RoLCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2Fz
bUNhbGw+JiB1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgY29uc3QgSW1tdXRhYmxlRnVuY3Rpb25J
bmRleFNwYWNlJiBmdW5jdGlvbkluZGV4U3BhY2UsIGNvbnN0IE1vZHVsZUluZm9ybWF0aW9uJiBp
bmZvLCB1bnNpZ25lZCBvcHRMZXZlbCkKK0V4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50
ZXJuYWxGdW5jdGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiB2bSwgQ29tcGlsYXRp
b25Db250ZXh0JiBjb21waWxhdGlvbkNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3Rh
cnQsIHNpemVfdCBmdW5jdGlvbkxlbmd0aCwgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUsIFZl
Y3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPiYgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNv
bnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYgZnVuY3Rpb25JbmRleFNwYWNlLCBjb25z
dCBNb2R1bGVJbmZvcm1hdGlvbiYgaW5mbywgdW5zaWduZWQgb3B0TGV2ZWwpCiB7CiAgICAgYXV0
byByZXN1bHQgPSBzdGQ6Om1ha2VfdW5pcXVlPFdhc21JbnRlcm5hbEZ1bmN0aW9uPigpOwogCisg
ICAgY29tcGlsYXRpb25Db250ZXh0LmpzRW50cnlwb2ludEpJVCA9IHN0ZDo6bWFrZV91bmlxdWU8
Q0NhbGxIZWxwZXJzPigmdm0pOworICAgIGNvbXBpbGF0aW9uQ29udGV4dC53YXNtRW50cnlwb2lu
dEpJVCA9IHN0ZDo6bWFrZV91bmlxdWU8Q0NhbGxIZWxwZXJzPigmdm0pOworCiAgICAgUHJvY2Vk
dXJlIHByb2NlZHVyZTsKICAgICBCM0lSR2VuZXJhdG9yIGNvbnRleHQodm0sIGluZm8sIHByb2Nl
ZHVyZSwgcmVzdWx0LmdldCgpLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRl
eFNwYWNlKTsKICAgICBGdW5jdGlvblBhcnNlcjxCM0lSR2VuZXJhdG9yPiBwYXJzZXIoY29udGV4
dCwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgZnVuY3Rpb25JbmRl
eFNwYWNlLCBpbmZvKTsKQEAgLTkyNSwxMCArOTI5LDE0IEBAIEV4cGVjdGVkPHN0ZDo6dW5pcXVl
X3B0cjxXYXNtSW50ZXJuYWxGdW4KICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgZGF0YUxvZygi
UG9zdCBTU0E6ICIsIHByb2NlZHVyZSk7CiAKLSAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNv
bXBpbGF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxCMzo6Q29tcGlsYXRpb24+KEIzOjpjb21waWxl
KHZtLCBwcm9jZWR1cmUsIG9wdExldmVsKSk7Ci0gICAgcmVzdWx0LT53YXNtRW50cnlwb2ludC5j
YWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2VkdXJlLmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAg
ICB7CisgICAgICAgIEIzOjpwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jZWR1cmUsIG9wdExldmVs
KTsKKyAgICAgICAgQjM6OmdlbmVyYXRlKHByb2NlZHVyZSwgKmNvbXBpbGF0aW9uQ29udGV4dC53
YXNtRW50cnlwb2ludEpJVCk7CisgICAgICAgIGNvbXBpbGF0aW9uQ29udGV4dC53YXNtRW50cnlw
b2ludEJ5cHJvZHVjdHMgPSBwcm9jZWR1cmUucmVsZWFzZUJ5cHJvZHVjdHMoKTsKKyAgICAgICAg
cmVzdWx0LT53YXNtRW50cnlwb2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2VkdXJlLmNh
bGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICB9CiAKLSAgICByZXN1bHQtPmpzVG9XYXNtRW50cnlw
b2ludC5jb21waWxhdGlvbiA9IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2bSwgKnJlc3VsdCwgc2ln
bmF0dXJlLCByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCksIGluZm8u
bWVtb3J5KTsKKyAgICBjcmVhdGVKU1RvV2FzbVdyYXBwZXIodm0sIGNvbXBpbGF0aW9uQ29udGV4
dCwgKnJlc3VsdCwgc2lnbmF0dXJlLCBpbmZvLm1lbW9yeSk7CiAgICAgcmV0dXJuIFdURk1vdmUo
cmVzdWx0KTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJH
ZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNt
QjNJUkdlbmVyYXRvci5oCShyZXZpc2lvbiAyMDk5OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3
IEBACiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCiAjaW5jbHVkZSAiQjNDb21waWxhdGlvbi5o
IgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlZNLmgiCiAjaW5jbHVkZSAi
V2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9FeHBlY3RlZC5oPgpAQCAtMzgsNyArMzksMTUg
QEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgTWVtb3J5SW5mb3Jt
YXRpb247CiAKLUV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4s
IFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiwgY29uc3QgdWludDhfdCosIHNpemVfdCwgY29u
c3QgU2lnbmF0dXJlKiwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiwgY29uc3QgSW1t
dXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlJiwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24mLCB1bnNp
Z25lZCBvcHRMZXZlbCA9IDEpOworc3RydWN0IENvbXBpbGF0aW9uQ29udGV4dCB7CisgICAgc3Rk
Ojp1bmlxdWVfcHRyPENDYWxsSGVscGVycz4ganNFbnRyeXBvaW50SklUOworICAgIHN0ZDo6dW5p
cXVlX3B0cjxCMzo6T3BhcXVlQnlwcm9kdWN0cz4ganNFbnRyeXBvaW50Qnlwcm9kdWN0czsKKyAg
ICBzdGQ6OnVuaXF1ZV9wdHI8Q0NhbGxIZWxwZXJzPiB3YXNtRW50cnlwb2ludEpJVDsKKyAgICBz
dGQ6OnVuaXF1ZV9wdHI8QjM6Ok9wYXF1ZUJ5cHJvZHVjdHM+IHdhc21FbnRyeXBvaW50Qnlwcm9k
dWN0czsKKyAgICBDQ2FsbEhlbHBlcnM6OkNhbGwganNFbnRyeXBvaW50VG9XYXNtRW50cnlwb2lu
dENhbGw7Cit9OworCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rp
b24+LCBTdHJpbmc+IHBhcnNlQW5kQ29tcGlsZShWTSYsIENvbXBpbGF0aW9uQ29udGV4dCYsIGNv
bnN0IHVpbnQ4X3QqLCBzaXplX3QsIGNvbnN0IFNpZ25hdHVyZSosIFZlY3RvcjxVbmxpbmtlZFdh
c21Ub1dhc21DYWxsPiYsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYsIGNvbnN0
IE1vZHVsZUluZm9ybWF0aW9uJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAogfSB9IC8vIG5h
bWVzcGFjZSBKU0M6Oldhc20KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUNhbGxpbmdDb252ZW50aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vV2FzbUNhbGxpbmdDb252ZW50aW9uLmgJKHJldmlzaW9uIDIwOTk5MSkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21DYWxsaW5nQ29udmVudGlvbi5oCSh3b3JraW5nIGNv
cHkpCkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIFs9XSAoQ0NhbGxIZWxw
ZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFtcykgewog
ICAgICAgICAgICAgICAgIEdQUlJlZyByZXN1bHQgPSBwYXJhbXNbMF0uZ3ByKCk7CiAgICAgICAg
ICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkRhdGFMYWJlbFB0ciBtb3ZlTG9jYXRpb24gPSBqaXQu
bW92ZVdpdGhQYXRjaChNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihudWxscHRyKSwgcmVz
dWx0KTsKLSAgICAgICAgICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBs
aW5rQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFtjYWxsZWVNb3Zl
TG9jYXRpb24sIG1vdmVMb2NhdGlvbl0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKICAgICAg
ICAgICAgICAgICAgICAgKmNhbGxlZU1vdmVMb2NhdGlvbiA9IGxpbmtCdWZmZXIubG9jYXRpb25P
Zihtb3ZlTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgfSk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lvbiAyMDk5
OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM5LDYgKzM5LDkgQEAKICNpbmNsdWRlICJXYXNtTW9kdWxlUGFyc2VyLmgiCiAj
aW5jbHVkZSAiV2FzbVZhbGlkYXRlLmgiCiAjaW5jbHVkZSA8d3RmL0RhdGFMb2cuaD4KKyNpbmNs
dWRlIDx3dGYvTG9ja2VyLmg+CisjaW5jbHVkZSA8d3RmL01vbm90b25pY1RpbWUuaD4KKyNpbmNs
dWRlIDx3dGYvTnVtYmVyT2ZDb3Jlcy5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4K
ICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CiAKQEAgLTYwLDYgKzYzLDEwIEBA
IFBsYW46OlBsYW4oVk0qIHZtLCBjb25zdCB1aW50OF90KiBzb3VyY2UKIAogYm9vbCBQbGFuOjpw
YXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkKIHsKKyAgICBNb25vdG9uaWNUaW1lIHN0YXJ0VGltZTsK
KyAgICBpZiAodmVyYm9zZSB8fCBPcHRpb25zOjpyZXBvcnRDb21waWxlVGltZXMoKSkKKyAgICAg
ICAgc3RhcnRUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisKICAgICB7CiAgICAgICAgIE1v
ZHVsZVBhcnNlciBtb2R1bGVQYXJzZXIobV92bSwgbV9zb3VyY2UsIG1fc291cmNlTGVuZ3RoKTsK
ICAgICAgICAgYXV0byBwYXJzZVJlc3VsdCA9IG1vZHVsZVBhcnNlci5wYXJzZSgpOwpAQCAtNzgs
MjcgKzg1LDMzIEBAIGJvb2wgUGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpCiAgICAgICAg
ICAgICBkYXRhTG9nTG4oIlByb2Nlc3NpbmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVu
Y3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcg
YXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7CiAg
ICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rp
b25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0OwogICAgICAgICBzaXplX3Qg
ZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4
XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsK
LSAgICAgICAgQVNTRVJUKENoZWNrZWQ8dWludHB0cl90PihiaXR3aXNlX2Nhc3Q8dWludHB0cl90
PihmdW5jdGlvblN0YXJ0KSkgKyBmdW5jdGlvbkxlbmd0aCA8PSBDaGVja2VkPHVpbnRwdHJfdD4o
Yml0d2lzZV9jYXN0PHVpbnRwdHJfdD4obV9zb3VyY2UpKSArIG1fc291cmNlTGVuZ3RoKTsKKyAg
ICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKICAgICAgICAg
U2lnbmF0dXJlKiBzaWduYXR1cmUgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0
aW9uU2lnbmF0dXJlc1tmdW5jdGlvbkluZGV4XTsKIAotICAgICAgICBhdXRvIHZhbGlkYXRpb25S
ZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBz
aWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbik7Ci0g
ICAgICAgIGlmICghdmFsaWRhdGlvblJlc3VsdCkgeworICAgICAgICBhdXRvIHZhbGlkYXRlUmVz
dWx0ID0gdmFsaWRhdGVGdW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2ln
bmF0dXJlLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOworICAg
ICAgICBpZiAoIXZhbGlkYXRlUmVzdWx0KSB7CiAgICAgICAgICAgICBpZiAodmVyYm9zZSkgewog
ICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmdW5jdGlvbkxlbmd0aDsg
KytpKQogICAgICAgICAgICAgICAgICAgICBkYXRhTG9nKFJhd1BvaW50ZXIocmVpbnRlcnByZXRf
Y2FzdDx2b2lkKj4oZnVuY3Rpb25TdGFydFtpXSkpLCAiLCAiKTsKICAgICAgICAgICAgICAgICBk
YXRhTG9nTG4oKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0g
dmFsaWRhdGlvblJlc3VsdC5lcnJvcigpOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQu
CisgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHZhbGlkYXRlUmVzdWx0LmVycm9yKCk7IC8v
IEZJWE1FIG1ha2UgdGhpcyBhbiBFeHBlY3RlZC4KICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
ICAgICAgICAgfQogICAgIH0KIAorICAgIGlmICh2ZXJib3NlIHx8IE9wdGlvbnM6OnJlcG9ydENv
bXBpbGVUaW1lcygpKQorICAgICAgICBkYXRhTG9nTG4oIlRvb2sgIiwgU2Vjb25kcyhNb25vdG9u
aWNUaW1lOjpub3coKSAtIHN0YXJ0VGltZSkubWljcm9zZWNvbmRzKCksICIgdXMgdG8gdmFsaWRh
dGUgbW9kdWxlIik7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIFdlIGFyZSBjcmVhdGluZyBh
IGJ1bmNoIG9mIHRocmVhZHMgdGhhdCB0b3VjaCB0aGUgbWFpbiB0aHJlYWQncyBzdGFjay4gVGhp
cyB3aWxsIG1ha2UgQVNBTiB1bmhhcHB5LgorLy8gVGhlIHJlYXNvbiB0aGlzIGlzIE9LIGlzIHRo
YXQgd2UgZ3VhcmFudGVlIHRoYXQgdGhlIG1haW4gdGhyZWFkIGRvZXNuJ3QgY29udGludWUgdW50
aWwgYWxsIHRocmVhZHMKKy8vIHRoYXQgY291bGQgdG91Y2ggaXRzIHN0YWNrIGFyZSBkb25lIGV4
ZWN1dGluZy4KK1NVUFBSRVNTX0FTQU4gCiB2b2lkIFBsYW46OnJ1bigpCiB7Ci0gICAgaWYgKCFw
YXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkpCisgICAgaWYgKCFwYXJzZUFuZFZhbGlkYXRlTW9kdWxl
KCkpIC8vIFRoaXMgYWxzbyBjb2xsZWN0cyBhIGJ1bmNoIG9mIGluZm9ybWF0aW9uIG5lZWRlZCB0
byBkbyB0aGUgYWN0dWFsIGNvbXBpbGF0aW9uLgogICAgICAgICByZXR1cm47CiAKICAgICBhdXRv
IHRyeVJlc2VydmVDYXBhY2l0eSA9IFt0aGlzXSAoYXV0byYgdmVjdG9yLCBzaXplX3Qgc2l6ZSwg
Y29uc3QgY2hhciogd2hhdCkgewpAQCAtMTEzLDEyICsxMjYsMTYgQEAgdm9pZCBQbGFuOjpydW4o
KQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9OwogCi0gICAgVmVjdG9yPFZlY3RvcjxVbmxp
bmtlZFdhc21Ub1dhc21DYWxsPj4gdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgaWYgKCF0
cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9KU1N0dWJzLCBtX21vZHVsZUluZm9ybWF0aW9uLT5p
bXBvcnRGdW5jdGlvbnMuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMi
KQotICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KHVubGlua2VkV2FzbVRvV2FzbUNhbGxz
LCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1i
bHkgdG8gV2ViQXNzZW1ibHkgY2FsbHMiKQotICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5
KG1fd2FzbUludGVybmFsRnVuY3Rpb25zLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXpl
KCksICIgV2ViQXNzZW1ibHkgZnVuY3Rpb25zIikpCisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2Fw
YWNpdHkobV91bmxpbmtlZFdhc21Ub1dhc21DYWxscywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5h
cnkuc2l6ZSgpLCAiIHVubGlua2VkIFdlYkFzc2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikK
KyAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0eShtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucywg
bV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5IGZ1bmN0aW9u
cyIpCisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV9jb21waWxhdGlvbkNvbnRleHRz
LCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgY29tcGlsYXRpb24gY29udGV4
dHMiKSkKICAgICAgICAgcmV0dXJuOwogCisgICAgbV91bmxpbmtlZFdhc21Ub1dhc21DYWxscy5y
ZXNpemUobV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKTsKKyAgICBtX3dhc21JbnRl
cm5hbEZ1bmN0aW9ucy5yZXNpemUobV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKTsK
KyAgICBtX2NvbXBpbGF0aW9uQ29udGV4dHMucmVzaXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmlu
YXJ5LnNpemUoKSk7CisKICAgICBmb3IgKHVuc2lnbmVkIGltcG9ydEluZGV4ID0gMDsgaW1wb3J0
SW5kZXggPCBtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRzLnNpemUoKTsgKytpbXBvcnRJbmRl
eCkgewogICAgICAgICBJbXBvcnQqIGltcG9ydCA9ICZtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBv
cnRzW2ltcG9ydEluZGV4XTsKICAgICAgICAgaWYgKGltcG9ydC0+a2luZCAhPSBFeHRlcm5hbEtp
bmQ6OkZ1bmN0aW9uKQpAQCAtMTMxLDMwICsxNDgsOTcgQEAgdm9pZCBQbGFuOjpydW4oKQogICAg
ICAgICBtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbaW1wb3J0RnVuY3Rpb25JbmRl
eF0uY29kZSA9IG1fd2FzbVRvSlNTdHVic1tpbXBvcnRGdW5jdGlvbkluZGV4XS5jb2RlKCkuZXhl
Y3V0YWJsZUFkZHJlc3MoKTsKICAgICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGZ1bmN0aW9uSW5k
ZXggPSAwOyBmdW5jdGlvbkluZGV4IDwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgp
OyArK2Z1bmN0aW9uSW5kZXgpIHsKLSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBk
YXRhTG9nTG4oIlByb2Nlc3NpbmcgZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25M
b2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIs
IG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7Ci0gICAgICAg
IGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2Nh
dGlvbkluQmluYXJ5W2Z1bmN0aW9uSW5kZXhdLnN0YXJ0OwotICAgICAgICBzaXplX3QgZnVuY3Rp
b25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQg
LSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKLSAgICAg
ICAgQVNTRVJUKGZ1bmN0aW9uTGVuZ3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKLSAgICAgICAgU2ln
bmF0dXJlKiBzaWduYXR1cmUgPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9u
U2lnbmF0dXJlc1tmdW5jdGlvbkluZGV4XTsKLSAgICAgICAgdW5zaWduZWQgZnVuY3Rpb25JbmRl
eFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUoKSArIGZ1bmN0aW9uSW5kZXg7Ci0gICAgICAg
IEFTU0VSVChtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbZnVuY3Rpb25JbmRleFNw
YWNlXS5zaWduYXR1cmUgPT0gc2lnbmF0dXJlKTsKIAotICAgICAgICBBU1NFUlQodmFsaWRhdGVG
dW5jdGlvbihmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pKTsKKyAgICB1aW50MzJfdCB0aHJl
YWRDb3VudCA9IFdURjo6bnVtYmVyT2ZQcm9jZXNzb3JDb3JlcygpOworICAgIGlmICh2ZXJib3Nl
KQorICAgICAgICBkYXRhTG9nTG4oIlRocmVhZCBjb3VudDogIiwgdGhyZWFkQ291bnQpOworCisg
ICAgbV9jdXJyZW50SW5kZXggPSAwOworCisgICAgYXV0byBkb1dvcmsgPSBbdGhpcywgdGhyZWFk
Q291bnRdIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZ1
bmN0aW9uSW5kZXg7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXV0byBsb2NrZXIg
PSBob2xkTG9jayhtX2xvY2spOworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbmRleCA+
PSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCkpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbkluZGV4ID0gbV9jdXJyZW50SW5kZXg7
CisgICAgICAgICAgICAgICAgKyttX2N1cnJlbnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCA9IG1fc291cmNlICsgbV9mdW5j
dGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgICAgICBz
aXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlv
bkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5z
dGFydDsKKyAgICAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0
aCk7CisgICAgICAgICAgICBTaWduYXR1cmUqIHNpZ25hdHVyZSA9IG1fbW9kdWxlSW5mb3JtYXRp
b24tPmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVzW2Z1bmN0aW9uSW5kZXhdOworICAgICAgICAg
ICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUoKSAr
IGZ1bmN0aW9uSW5kZXg7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZ1bmN0aW9uSW5kZXhT
cGFjZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9uSW5kZXhTcGFj
ZV0uc2lnbmF0dXJlID09IHNpZ25hdHVyZSk7CisKKyAgICAgICAgICAgIEFTU0VSVCh2YWxpZGF0
ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVu
Y3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbikpOworCisgICAgICAgICAgICBt
X3VubGlua2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdID0gVmVjdG9yPFVubGlua2Vk
V2FzbVRvV2FzbUNhbGw+KCk7CisgICAgICAgICAgICBhdXRvIHBhcnNlQW5kQ29tcGlsZVJlc3Vs
dCA9IHBhcnNlQW5kQ29tcGlsZSgqbV92bSwgbV9jb21waWxhdGlvbkNvbnRleHRzW2Z1bmN0aW9u
SW5kZXhdLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX3VubGlu
a2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwg
Km1fbW9kdWxlSW5mb3JtYXRpb24pOworCisgICAgICAgICAgICBpZiAoVU5MSUtFTFkoIXBhcnNl
QW5kQ29tcGlsZVJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRM
b2NrKG1fbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKCFtX2Vycm9yTWVzc2FnZSkgeworICAg
ICAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBjb21waWxlcyBjb3VsZCBmYWlsIHNpbXVsdGFu
ZW91c2x5LiBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIGZpcnN0LgorICAgICAgICAgICAgICAg
ICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOyAvLyBG
SVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIG1fY3VycmVudEluZGV4ID0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgp
OwogCi0gICAgICAgIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLnVuY2hlY2tlZEFwcGVuZChWZWN0
b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4oKSk7Ci0gICAgICAgIGF1dG8gcGFyc2VBbmRDb21w
aWxlUmVzdWx0ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlv
bkxlbmd0aCwgc2lnbmF0dXJlLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy5hdChmdW5jdGlvbklu
ZGV4KSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKLSAgICAg
ICAgaWYgKFVOTElLRUxZKCFwYXJzZUFuZENvbXBpbGVSZXN1bHQpKSB7Ci0gICAgICAgICAgICBt
X2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAg
ICAgcmV0dXJuOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAg
ICAgLy8gV2Ugd2lsbCB0ZXJtaW5hdGUgb24gdGhlIG5leHQgZXhlY3V0aW9uLgorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV93YXNtSW50
ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0gPSBXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVS
ZXN1bHQpOwogICAgICAgICB9Ci0gICAgICAgIG1fd2FzbUludGVybmFsRnVuY3Rpb25zLnVuY2hl
Y2tlZEFwcGVuZChXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVSZXN1bHQpKTsKKyAgICB9OworCisg
ICAgTW9ub3RvbmljVGltZSBzdGFydFRpbWU7CisgICAgaWYgKHZlcmJvc2UgfHwgT3B0aW9uczo6
cmVwb3J0Q29tcGlsZVRpbWVzKCkpCisgICAgICAgIHN0YXJ0VGltZSA9IE1vbm90b25pY1RpbWU6
Om5vdygpOworCisgICAgdWludDMyX3QgbnVtV29ya2VyVGhyZWFkcyA9IHRocmVhZENvdW50IC0g
MTsKKyAgICBWZWN0b3I8VGhyZWFkSWRlbnRpZmllcj4gdGhyZWFkczsKKyAgICB0aHJlYWRzLnJl
c2VydmVDYXBhY2l0eShudW1Xb3JrZXJUaHJlYWRzKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAw
OyBpIDwgbnVtV29ya2VyVGhyZWFkczsgaSsrKQorICAgICAgICB0aHJlYWRzLnVuY2hlY2tlZEFw
cGVuZChjcmVhdGVUaHJlYWQoImpzYy53YXNtLWIzLWNvbXBpbGF0aW9uLnRocmVhZCIsIGRvV29y
aykpOworCisgICAgZG9Xb3JrKCk7IC8vIExldCB0aGUgbWFpbiB0aHJlYWQgZG8gc29tZSB3b3Jr
IHRvby4KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1Xb3JrZXJUaHJlYWRzOyBp
KyspCisgICAgICAgIHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKHRocmVhZHNbaV0pOworCisKKyAg
ICBmb3IgKHVpbnQzMl90IGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5jdGlvbkluZGV4IDwgbV9mdW5j
dGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyBmdW5jdGlvbkluZGV4KyspIHsKKyAgICAgICAg
eworICAgICAgICAgICAgQ29tcGlsYXRpb25Db250ZXh0JiBjb250ZXh0ID0gbV9jb21waWxhdGlv
bkNvbnRleHRzW2Z1bmN0aW9uSW5kZXhdOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IExpbmtCdWZmZXIgbGlua0J1ZmZlcigqbV92bSwgKmNvbnRleHQud2FzbUVudHJ5cG9pbnRKSVQs
IG51bGxwdHIpOworICAgICAgICAgICAgICAgIG1fd2FzbUludGVybmFsRnVuY3Rpb25zW2Z1bmN0
aW9uSW5kZXhdLT53YXNtRW50cnlwb2ludC5jb21waWxhdGlvbiA9CisgICAgICAgICAgICAgICAg
ICAgIHN0ZDo6bWFrZV91bmlxdWU8QjM6OkNvbXBpbGF0aW9uPihGSU5BTElaRV9DT0RFKGxpbmtC
dWZmZXIsICgiV2FzbSBmdW5jdGlvbiIpKSwgV1RGTW92ZShjb250ZXh0Lndhc21FbnRyeXBvaW50
Qnlwcm9kdWN0cykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCptX3ZtLCAqY29udGV4dC5qc0VudHJ5cG9pbnRK
SVQsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIGxpbmtCdWZmZXIubGluayhjb250ZXh0Lmpz
RW50cnlwb2ludFRvV2FzbUVudHJ5cG9pbnRDYWxsLCBGdW5jdGlvblB0cihtX3dhc21JbnRlcm5h
bEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24tPmNv
ZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpKSk7CisKKyAgICAgICAgICAgICAgICBtX3dhc21JbnRl
cm5hbEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+anNUb1dhc21FbnRyeXBvaW50LmNvbXBpbGF0
aW9uID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCMzo6Q29tcGlsYXRp
b24+KEZJTkFMSVpFX0NPREUobGlua0J1ZmZlciwgKCJXYXNtIEpTIGVudHJ5cG9pbnQiKSksIFdU
Rk1vdmUoY29udGV4dC5qc0VudHJ5cG9pbnRCeXByb2R1Y3RzKSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4U3BhY2UgPSBtX3dhc21U
b0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKICAgICAgICAgbV9mdW5jdGlvbkluZGV4
U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9uSW5kZXhTcGFjZV0uY29kZSA9IG1fd2FzbUludGVy
bmFsRnVuY3Rpb25zW2Z1bmN0aW9uSW5kZXhdLT53YXNtRW50cnlwb2ludC5jb21waWxhdGlvbi0+
Y29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgfQogCisgICAgaWYgKHZlcmJvc2UgfHwg
T3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpIHsKKyAgICAgICAgZGF0YUxvZ0xuKCJUb29r
ICIsIFNlY29uZHMoTW9ub3RvbmljVGltZTo6bm93KCkgLSBzdGFydFRpbWUpLm1pY3Jvc2Vjb25k
cygpLAorICAgICAgICAgICAgIiB1cyB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBtb2R1bGUiKTsK
KyAgICB9CisKICAgICAvLyBQYXRjaCB0aGUgY2FsbCBzaXRlcyBmb3IgZWFjaCBXZWJBc3NlbWJs
eSBmdW5jdGlvbi4KLSAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogdW5saW5rZWRXYXNtVG9XYXNt
Q2FsbHMpIHsKKyAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogbV91bmxpbmtlZFdhc21Ub1dhc21D
YWxscykgewogICAgICAgICBmb3IgKGF1dG8mIGNhbGwgOiB1bmxpbmtlZCkKICAgICAgICAgICAg
IE1hY3JvQXNzZW1ibGVyOjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwgQ29kZUxvY2F0
aW9uTGFiZWwobV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2NhbGwuZnVuY3Rpb25J
bmRleF0uY29kZSkpOwogICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21QbGFuLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBs
YW4uaAkocmV2aXNpb24gMjA5OTkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bVBsYW4uaAkod29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAiQ29t
cGlsYXRpb25SZXN1bHQuaCIKICNpbmNsdWRlICJWTS5oIgorI2luY2x1ZGUgIldhc21CM0lSR2Vu
ZXJhdG9yLmgiCiAjaW5jbHVkZSAiV2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9CYWcuaD4K
ICNpbmNsdWRlIDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KQEAgLTEwMywxMyArMTA0LDE3
IEBAIHByaXZhdGU6CiAgICAgQmFnPENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0luZm9zOwogICAg
IFZlY3RvcjxXYXNtVG9KU1N0dWI+IG1fd2FzbVRvSlNTdHViczsKICAgICBWZWN0b3I8c3RkOjp1
bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0aW9uPj4gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnM7
CisgICAgVmVjdG9yPENvbXBpbGF0aW9uQ29udGV4dD4gbV9jb21waWxhdGlvbkNvbnRleHRzOwog
ICAgIEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSBtX2Z1bmN0aW9uSW5kZXhTcGFjZTsKIAog
ICAgIFZNKiBtX3ZtOworICAgIFZlY3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+
IG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgY29uc3QgdWludDhfdCogbV9zb3VyY2U7
CiAgICAgY29uc3Qgc2l6ZV90IG1fc291cmNlTGVuZ3RoOwogICAgIGJvb2wgbV9mYWlsZWQgeyB0
cnVlIH07CiAgICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOworICAgIHVpbnQzMl90IG1fY3VycmVu
dEluZGV4OworICAgIExvY2sgbV9sb2NrOwogfTsKIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6Oldh
c20K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297544</attachid>
            <date>2016-12-20 11:57:25 -0800</date>
            <delta_ts>2016-12-20 12:17:07 -0800</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>23250</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjA5OTk2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI4IEBA
CisyMDE2LTEyLTE5ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFdlYkFzc2VtYmx5OiBXZSBzaG91bGQgY29tcGlsZSB3YXNtIGZ1bmN0aW9ucyBpbiBwYXJhbGxl
bAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTkz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBw
YXRjaCBhZGRzIGEgdmVyeSBzaW1wbGUgcGFyYWxsZWwgY29tcGlsZXIgZm9yIFdhc20gY29kZS4K
KyAgICAgICAgVGhpcyBwYXRjaCBzcGVlZHMgdXAgY29tcGlsaW5nIHRoZSBVbml0eSBoZWFkbGVz
cyBiZW5jaG1hcmsgYnkKKyAgICAgICAgc2xpZ2h0bHkgbW9yZSB0aGFuIDR4IG9uIG15IE1CUC4g
VG8gbWFrZSB0aGlzIHNhZmUsIEkgcGVyZm9ybQorICAgICAgICBhbGwgbGlua2luZyBvbiB0aGUg
bWFpbiB0aHJlYWQuIEkgYWxzbyBoYWQgdG8gY2hhbmdlIHNvbWUgY29kZQorICAgICAgICBpbnNp
ZGUgV2FzbWIzSVJHZW5lcmF0b3IgdG8gYmUgdGhyZWFkIHNhZmUuCisKKyAgICAgICAgKiB3YXNt
L1dhc21CM0lSR2VuZXJhdG9yLmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6QjNJUkdlbmVyYXRv
cjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKToKKyAgICAgICAgKEpTQzo6V2FzbTo6Y3JlYXRlSlNUb1dh
c21XcmFwcGVyKToKKyAgICAgICAgKEpTQzo6V2FzbTo6cGFyc2VBbmRDb21waWxlKToKKyAgICAg
ICAgKiB3YXNtL1dhc21CM0lSR2VuZXJhdG9yLmg6CisgICAgICAgICogd2FzbS9XYXNtQ2FsbGlu
Z0NvbnZlbnRpb24uaDoKKyAgICAgICAgKEpTQzo6V2FzbTo6Q2FsbGluZ0NvbnZlbnRpb246OnNl
dHVwRnJhbWVJblByb2xvZ3VlKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFuLmNwcDoKKyAgICAg
ICAgKEpTQzo6V2FzbTo6UGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSk6CisgICAgICAgIChK
U0M6Oldhc206OlBsYW46OnJ1bik6CisgICAgICAgICogd2FzbS9XYXNtUGxhbi5oOgorCiAyMDE2
LTEyLTE4ICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgogCiAgICAgICAgIFdlYkFz
c2VtYmx5OiBJbXBsZW1lbnQgdGhlIFdlYkFzc2VtYmx5LmNvbXBpbGUgYW5kIFdlYkFzc2VtYmx5
LnZhbGlkYXRlCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYjMvYWlyL0FpckN1c3RvbS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ3VzdG9tLmgJ
KHJldmlzaW9uIDIwOTk5MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ3Vz
dG9tLmgJKHdvcmtpbmcgY29weSkKQEAgLTMxMyw3ICszMTMsNyBAQCBzdHJ1Y3QgV2FzbUJvdW5k
c0NoZWNrQ3VzdG9tIDogcHVibGljIENvCiAgICAgICAgIENDYWxsSGVscGVyczo6SnVtcCBvdXRP
ZkJvdW5kcyA9IEluc3QoQWlyOjpCcmFuY2g2NCwgdmFsdWUsIEFyZzo6cmVsQ29uZChDQ2FsbEhl
bHBlcnM6OkFib3ZlT3JFcXVhbCksIGluc3QuYXJnc1swXSwgaW5zdC5hcmdzWzFdKS5nZW5lcmF0
ZShqaXQsIGNvbnRleHQpOwogCiAgICAgICAgIGNvbnRleHQubGF0ZVBhdGhzLmFwcGVuZChjcmVh
dGVTaGFyZWRUYXNrPEdlbmVyYXRpb25Db250ZXh0OjpMYXRlUGF0aEZ1bmN0aW9uPigKLSAgICAg
ICAgICAgIFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIEFpcjo6R2VuZXJhdGlvbkNvbnRleHQmKSB7
CisgICAgICAgICAgICBbb3V0T2ZCb3VuZHMsIHZhbHVlXSAoQ0NhbGxIZWxwZXJzJiBqaXQsIEFp
cjo6R2VuZXJhdGlvbkNvbnRleHQmIGNvbnRleHQpIHsKICAgICAgICAgICAgICAgICBvdXRPZkJv
dW5kcy5saW5rKCZqaXQpOwogICAgICAgICAgICAgICAgIGNvbnRleHQuY29kZS0+d2FzbUJvdW5k
c0NoZWNrR2VuZXJhdG9yKCktPnJ1bihqaXQsIHZhbHVlLT5waW5uZWRHUFIoKSwgdmFsdWUtPm9m
ZnNldCgpKTsKICAgICAgICAgICAgIH0pKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9i
My9haXIvQWlyR2VuZXJhdGlvbkNvbnRleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvYjMvYWlyL0FpckdlbmVyYXRpb25Db250ZXh0LmgJKHJldmlzaW9uIDIwOTk5MSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyR2VuZXJhdGlvbkNvbnRleHQuaAko
d29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksMTEgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFj
ZSBCMyB7IG5hbWVzcGFjZQogY2xhc3MgQ29kZTsKIAogc3RydWN0IEdlbmVyYXRpb25Db250ZXh0
IHsKKyAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShHZW5lcmF0aW9uQ29udGV4dCk7CitwdWJsaWM6
CisKKyAgICBHZW5lcmF0aW9uQ29udGV4dCgpID0gZGVmYXVsdDsKKwogICAgIHR5cGVkZWYgdm9p
ZCBMYXRlUGF0aEZ1bmN0aW9uKENDYWxsSGVscGVycyYsIEdlbmVyYXRpb25Db250ZXh0Jik7CiAg
ICAgdHlwZWRlZiBTaGFyZWRUYXNrPExhdGVQYXRoRnVuY3Rpb24+IExhdGVQYXRoOwogCkluZGV4
OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3Bw
CShyZXZpc2lvbiAyMDk5OTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJ
UkdlbmVyYXRvci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1NywxMiArMjU3LDYgQEAgQjNJUkdl
bmVyYXRvcjo6QjNJUkdlbmVyYXRvcihWTSYgdm0sIGNvbgogICAgICAgICAgICAgQVNTRVJUX1VO
VVNFRChwaW5uZWRHUFIsIG1fbWVtb3J5U2l6ZUdQUiA9PSBwaW5uZWRHUFIpOwogICAgICAgICAg
ICAgdGhpcy0+ZW1pdEV4Y2VwdGlvbkNoZWNrKGppdCwgRXhjZXB0aW9uVHlwZTo6T3V0T2ZCb3Vu
ZHNNZW1vcnlBY2Nlc3MpOwogICAgICAgICB9KTsKLQotICAgICAgICBCMzo6UGF0Y2hwb2ludFZh
bHVlKiBmb28gPSBtX2N1cnJlbnRCbG9jay0+YXBwZW5kTmV3PEIzOjpQYXRjaHBvaW50VmFsdWU+
KG1fcHJvYywgQjM6OlZvaWQsIE9yaWdpbigpKTsKLSAgICAgICAgZm9vLT5zZXRHZW5lcmF0b3Io
Ci0gICAgICAgICAgICBbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBH
ZW5lcmF0aW9uUGFyYW1zJikgewotICAgICAgICAgICAgICAgIEFsbG93TWFjcm9TY3JhdGNoUmVn
aXN0ZXJVc2FnZSBhbGxvd1NjcmF0Y2goaml0KTsKLSAgICAgICAgICAgIH0pOwogICAgIH0KIAog
ICAgIHdhc21DYWxsaW5nQ29udmVudGlvbigpLnNldHVwRnJhbWVJblByb2xvZ3VlKCZjb21waWxh
dGlvbi0+d2FzbUNhbGxlZU1vdmVMb2NhdGlvbiwgbV9wcm9jLCBPcmlnaW4oKSwgbV9jdXJyZW50
QmxvY2spOwpAQCAtMjc3LDcgKzI3MSw3IEBAIHZvaWQgQjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2Vw
dGlvbkNoZWNrKEMKICAgICBhdXRvIGp1bXBUb0V4Y2VwdGlvblN0dWIgPSBqaXQuanVtcCgpOwog
CiAgICAgVk0qIHZtID0gJm1fdm07Ci0gICAgaml0LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1ZmZl
ciYgbGlua0J1ZmZlcikgeworICAgIGppdC5hZGRMaW5rVGFzayhbdm0sIGp1bXBUb0V4Y2VwdGlv
blN0dWJdIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7CiAgICAgICAgIGxpbmtCdWZmZXIubGlu
ayhqdW1wVG9FeGNlcHRpb25TdHViLCBDb2RlTG9jYXRpb25MYWJlbCh2bS0+Z2V0Q1RJU3R1Yih0
aHJvd0V4Y2VwdGlvbkZyb21XYXNtVGh1bmtHZW5lcmF0b3IpLmNvZGUoKSkpOwogICAgIH0pOwog
fQpAQCAtNjkxLDEzICs2ODUsMTQgQEAgYXV0byBCM0lSR2VuZXJhdG9yOjphZGRDYWxsKHVpbnQz
Ml90IGZ1bgogICAgICAgICAgICAgcGF0Y2hwb2ludC0+ZWZmZWN0cy53cml0ZXNQaW5uZWQgPSB0
cnVlOwogICAgICAgICAgICAgcGF0Y2hwb2ludC0+ZWZmZWN0cy5yZWFkc1Bpbm5lZCA9IHRydWU7
CiAKLSAgICAgICAgICAgIHBhdGNocG9pbnQtPnNldEdlbmVyYXRvcihbPV0gKENDYWxsSGVscGVy
cyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAgICAgICAg
ICAgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+KiB1bmxpbmtlZFdhc21Ub1dhc21DYWxs
cyA9ICZtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzOworICAgICAgICAgICAgcGF0Y2hwb2ludC0+
c2V0R2VuZXJhdG9yKFt1bmxpbmtlZFdhc21Ub1dhc21DYWxscywgZnVuY3Rpb25JbmRleF0gKEND
YWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewog
ICAgICAgICAgICAgICAgIEFsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2FnZSBhbGxvd1NjcmF0
Y2goaml0KTsKIAogICAgICAgICAgICAgICAgIENDYWxsSGVscGVyczo6Q2FsbCBjYWxsID0gaml0
LmNhbGwoKTsKIAotICAgICAgICAgICAgICAgIGppdC5hZGRMaW5rVGFzayhbPV0gKExpbmtCdWZm
ZXImIGxpbmtCdWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgbV91bmxpbmtlZFdhc21Ub1dh
c21DYWxscy5hcHBlbmQoeyBsaW5rQnVmZmVyLmxvY2F0aW9uT2YoY2FsbCksIGZ1bmN0aW9uSW5k
ZXggfSk7CisgICAgICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFt1bmxpbmtlZFdhc21Ub1dh
c21DYWxscywgY2FsbCwgZnVuY3Rpb25JbmRleF0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsK
KyAgICAgICAgICAgICAgICAgICAgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMtPmFwcGVuZCh7IGxp
bmtCdWZmZXIubG9jYXRpb25PZihjYWxsKSwgZnVuY3Rpb25JbmRleCB9KTsKICAgICAgICAgICAg
ICAgICB9KTsKICAgICAgICAgICAgIH0pOwogICAgICAgICB9KTsKQEAgLTgxNyw3ICs4MTIsNyBA
QCB2b2lkIEIzSVJHZW5lcmF0b3I6OmR1bXAoY29uc3QgVmVjdG9yPENvCiAgICAgZGF0YUxvZ0xu
KCJcbiIpOwogfQogCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEIzOjpDb21waWxhdGlvbj4gY3Jl
YXRlSlNUb1dhc21XcmFwcGVyKFZNJiB2bSwgV2FzbUludGVybmFsRnVuY3Rpb24mIGZ1bmN0aW9u
LCBjb25zdCBTaWduYXR1cmUqIHNpZ25hdHVyZSwgTWFjcm9Bc3NlbWJsZXJDb2RlUHRyIG1haW5G
dW5jdGlvbiwgY29uc3QgTWVtb3J5SW5mb3JtYXRpb24mIG1lbW9yeSkKK3N0YXRpYyB2b2lkIGNy
ZWF0ZUpTVG9XYXNtV3JhcHBlcihWTSYgdm0sIENvbXBpbGF0aW9uQ29udGV4dCYgY29tcGlsYXRp
b25Db250ZXh0LCBXYXNtSW50ZXJuYWxGdW5jdGlvbiYgZnVuY3Rpb24sIGNvbnN0IFNpZ25hdHVy
ZSogc2lnbmF0dXJlLCBjb25zdCBNZW1vcnlJbmZvcm1hdGlvbiYgbWVtb3J5KQogewogICAgIFBy
b2NlZHVyZSBwcm9jOwogICAgIEJhc2ljQmxvY2sqIGJsb2NrID0gcHJvYy5hZGRCbG9jaygpOwpA
QCAtODc0LDEzICs4NjksMTIgQEAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxCMzo6Q29tcGlsYXRp
b24+IAogICAgICAgICAgICAgICAgIHBhdGNocG9pbnQtPmFwcGVuZChDb25zdHJhaW5lZFZhbHVl
KHNpemVzW2ldLCBWYWx1ZVJlcDo6cmVnKG1lbW9yeS5waW5uZWRSZWdpc3RlcnMoKS5zaXplUmVn
aXN0ZXJzW2ldLnNpemVSZWdpc3RlcikpKTsKICAgICAgICAgfQogCi0gICAgICAgIHBhdGNocG9p
bnQtPnNldEdlbmVyYXRvcihbPV0gKENDYWxsSGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2tt
YXBHZW5lcmF0aW9uUGFyYW1zJikgeworICAgICAgICBDb21waWxhdGlvbkNvbnRleHQqIGNvbnRl
eHQgPSAmY29tcGlsYXRpb25Db250ZXh0OworICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0
b3IoW2NvbnRleHRdIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJh
dGlvblBhcmFtcyYpIHsKICAgICAgICAgICAgIEFsbG93TWFjcm9TY3JhdGNoUmVnaXN0ZXJVc2Fn
ZSBhbGxvd1NjcmF0Y2goaml0KTsKIAogICAgICAgICAgICAgQ0NhbGxIZWxwZXJzOjpDYWxsIGNh
bGwgPSBqaXQuY2FsbCgpOwotICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1
ZmZlciYgbGlua0J1ZmZlcikgewotICAgICAgICAgICAgICAgIGxpbmtCdWZmZXIubGluayhjYWxs
LCBGdW5jdGlvblB0cihtYWluRnVuY3Rpb24uZXhlY3V0YWJsZUFkZHJlc3MoKSkpOwotICAgICAg
ICAgICAgfSk7CisgICAgICAgICAgICBjb250ZXh0LT5qc0VudHJ5cG9pbnRUb1dhc21FbnRyeXBv
aW50Q2FsbCA9IGNhbGw7CiAgICAgICAgIH0pOwogICAgIH0pOwogCkBAIC05MDIsMTUgKzg5Niwx
OSBAQCBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEIzOjpDb21waWxhdGlvbj4gCiAgICAgICAgIFJF
TEVBU0VfQVNTRVJUX05PVF9SRUFDSEVEKCk7CiAgICAgfQogCi0gICAgYXV0byBqc0VudHJ5cG9p
bnQgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbXBpbGF0aW9uPihCMzo6Y29tcGlsZSh2bSwgcHJvYykp
OworICAgIEIzOjpwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jKTsKKyAgICBCMzo6Z2VuZXJhdGUo
cHJvYywgKmNvbXBpbGF0aW9uQ29udGV4dC5qc0VudHJ5cG9pbnRKSVQpOworICAgIGNvbXBpbGF0
aW9uQ29udGV4dC5qc0VudHJ5cG9pbnRCeXByb2R1Y3RzID0gcHJvYy5yZWxlYXNlQnlwcm9kdWN0
cygpOwogICAgIGZ1bmN0aW9uLmpzVG9XYXNtRW50cnlwb2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJz
ID0gcHJvYy5jYWxsZWVTYXZlUmVnaXN0ZXJzKCk7Ci0gICAgcmV0dXJuIGpzRW50cnlwb2ludDsK
IH0KIAotRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0aW9uPiwgU3Ry
aW5nPiBwYXJzZUFuZENvbXBpbGUoVk0mIHZtLCBjb25zdCB1aW50OF90KiBmdW5jdGlvblN0YXJ0
LCBzaXplX3QgZnVuY3Rpb25MZW5ndGgsIGNvbnN0IFNpZ25hdHVyZSogc2lnbmF0dXJlLCBWZWN0
b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4mIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBjb25z
dCBJbW11dGFibGVGdW5jdGlvbkluZGV4U3BhY2UmIGZ1bmN0aW9uSW5kZXhTcGFjZSwgY29uc3Qg
TW9kdWxlSW5mb3JtYXRpb24mIGluZm8sIHVuc2lnbmVkIG9wdExldmVsKQorRXhwZWN0ZWQ8c3Rk
Ojp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bmN0aW9uPiwgU3RyaW5nPiBwYXJzZUFuZENvbXBp
bGUoVk0mIHZtLCBDb21waWxhdGlvbkNvbnRleHQmIGNvbXBpbGF0aW9uQ29udGV4dCwgY29uc3Qg
dWludDhfdCogZnVuY3Rpb25TdGFydCwgc2l6ZV90IGZ1bmN0aW9uTGVuZ3RoLCBjb25zdCBTaWdu
YXR1cmUqIHNpZ25hdHVyZSwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiB1bmxpbmtl
ZFdhc21Ub1dhc21DYWxscywgY29uc3QgSW1tdXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlJiBmdW5j
dGlvbkluZGV4U3BhY2UsIGNvbnN0IE1vZHVsZUluZm9ybWF0aW9uJiBpbmZvLCB1bnNpZ25lZCBv
cHRMZXZlbCkKIHsKICAgICBhdXRvIHJlc3VsdCA9IHN0ZDo6bWFrZV91bmlxdWU8V2FzbUludGVy
bmFsRnVuY3Rpb24+KCk7CiAKKyAgICBjb21waWxhdGlvbkNvbnRleHQuanNFbnRyeXBvaW50SklU
ID0gc3RkOjptYWtlX3VuaXF1ZTxDQ2FsbEhlbHBlcnM+KCZ2bSk7CisgICAgY29tcGlsYXRpb25D
b250ZXh0Lndhc21FbnRyeXBvaW50SklUID0gc3RkOjptYWtlX3VuaXF1ZTxDQ2FsbEhlbHBlcnM+
KCZ2bSk7CisKICAgICBQcm9jZWR1cmUgcHJvY2VkdXJlOwogICAgIEIzSVJHZW5lcmF0b3IgY29u
dGV4dCh2bSwgaW5mbywgcHJvY2VkdXJlLCByZXN1bHQuZ2V0KCksIHVubGlua2VkV2FzbVRvV2Fz
bUNhbGxzLCBmdW5jdGlvbkluZGV4U3BhY2UpOwogICAgIEZ1bmN0aW9uUGFyc2VyPEIzSVJHZW5l
cmF0b3I+IHBhcnNlcihjb250ZXh0LCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2ln
bmF0dXJlLCBmdW5jdGlvbkluZGV4U3BhY2UsIGluZm8pOwpAQCAtOTI1LDEwICs5MjMsMTQgQEAg
RXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdhc21JbnRlcm5hbEZ1bgogICAgIGlmICh2ZXJib3Nl
KQogICAgICAgICBkYXRhTG9nKCJQb3N0IFNTQTogIiwgcHJvY2VkdXJlKTsKIAotICAgIHJlc3Vs
dC0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24gPSBzdGQ6Om1ha2VfdW5pcXVlPEIzOjpDb21w
aWxhdGlvbj4oQjM6OmNvbXBpbGUodm0sIHByb2NlZHVyZSwgb3B0TGV2ZWwpKTsKLSAgICByZXN1
bHQtPndhc21FbnRyeXBvaW50LmNhbGxlZVNhdmVSZWdpc3RlcnMgPSBwcm9jZWR1cmUuY2FsbGVl
U2F2ZVJlZ2lzdGVycygpOworICAgIHsKKyAgICAgICAgQjM6OnByZXBhcmVGb3JHZW5lcmF0aW9u
KHByb2NlZHVyZSwgb3B0TGV2ZWwpOworICAgICAgICBCMzo6Z2VuZXJhdGUocHJvY2VkdXJlLCAq
Y29tcGlsYXRpb25Db250ZXh0Lndhc21FbnRyeXBvaW50SklUKTsKKyAgICAgICAgY29tcGlsYXRp
b25Db250ZXh0Lndhc21FbnRyeXBvaW50Qnlwcm9kdWN0cyA9IHByb2NlZHVyZS5yZWxlYXNlQnlw
cm9kdWN0cygpOworICAgICAgICByZXN1bHQtPndhc21FbnRyeXBvaW50LmNhbGxlZVNhdmVSZWdp
c3RlcnMgPSBwcm9jZWR1cmUuY2FsbGVlU2F2ZVJlZ2lzdGVycygpOworICAgIH0KIAotICAgIHJl
c3VsdC0+anNUb1dhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uID0gY3JlYXRlSlNUb1dhc21XcmFw
cGVyKHZtLCAqcmVzdWx0LCBzaWduYXR1cmUsIHJlc3VsdC0+d2FzbUVudHJ5cG9pbnQuY29tcGls
YXRpb24tPmNvZGUoKSwgaW5mby5tZW1vcnkpOworICAgIGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2
bSwgY29tcGlsYXRpb25Db250ZXh0LCAqcmVzdWx0LCBzaWduYXR1cmUsIGluZm8ubWVtb3J5KTsK
ICAgICByZXR1cm4gV1RGTW92ZShyZXN1bHQpOwogfQogCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmgJKHJldmlzaW9uIDIwOTk5MSkKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTI4LDYgKzI4LDcgQEAKICNpZiBFTkFCTEUoV0VCQVNTRU1CTFkpCiAKICNpbmNs
dWRlICJCM0NvbXBpbGF0aW9uLmgiCisjaW5jbHVkZSAiQ0NhbGxIZWxwZXJzLmgiCiAjaW5jbHVk
ZSAiVk0uaCIKICNpbmNsdWRlICJXYXNtRm9ybWF0LmgiCiAjaW5jbHVkZSA8d3RmL0V4cGVjdGVk
Lmg+CkBAIC0zOCw3ICszOSwxNSBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIFdhc20gewog
CiBjbGFzcyBNZW1vcnlJbmZvcm1hdGlvbjsKIAotRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdh
c21JbnRlcm5hbEZ1bmN0aW9uPiwgU3RyaW5nPiBwYXJzZUFuZENvbXBpbGUoVk0mLCBjb25zdCB1
aW50OF90Kiwgc2l6ZV90LCBjb25zdCBTaWduYXR1cmUqLCBWZWN0b3I8VW5saW5rZWRXYXNtVG9X
YXNtQ2FsbD4mLCBjb25zdCBJbW11dGFibGVGdW5jdGlvbkluZGV4U3BhY2UmLCBjb25zdCBNb2R1
bGVJbmZvcm1hdGlvbiYsIHVuc2lnbmVkIG9wdExldmVsID0gMSk7CitzdHJ1Y3QgQ29tcGlsYXRp
b25Db250ZXh0IHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NhbGxIZWxwZXJzPiBqc0VudHJ5cG9p
bnRKSVQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEIzOjpPcGFxdWVCeXByb2R1Y3RzPiBqc0VudHJ5
cG9pbnRCeXByb2R1Y3RzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ2FsbEhlbHBlcnM+IHdhc21F
bnRyeXBvaW50SklUOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCMzo6T3BhcXVlQnlwcm9kdWN0cz4g
d2FzbUVudHJ5cG9pbnRCeXByb2R1Y3RzOworICAgIENDYWxsSGVscGVyczo6Q2FsbCBqc0VudHJ5
cG9pbnRUb1dhc21FbnRyeXBvaW50Q2FsbDsKK307CisKK0V4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0
cjxXYXNtSW50ZXJuYWxGdW5jdGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiwgQ29t
cGlsYXRpb25Db250ZXh0JiwgY29uc3QgdWludDhfdCosIHNpemVfdCwgY29uc3QgU2lnbmF0dXJl
KiwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiwgY29uc3QgSW1tdXRhYmxlRnVuY3Rp
b25JbmRleFNwYWNlJiwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24mLCB1bnNpZ25lZCBvcHRMZXZl
bCA9IDEpOwogCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6V2FzbQogCkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtQ2FsbGluZ0NvbnZlbnRpb24uaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtQ2FsbGluZ0NvbnZlbnRpb24uaAkocmV2aXNp
b24gMjA5OTkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbUNhbGxpbmdDb252
ZW50aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTk1LDcgKzk1LDcgQEAgcHVibGljOgogICAgICAg
ICAgICAgWz1dIChDQ2FsbEhlbHBlcnMmIGppdCwgY29uc3QgQjM6OlN0YWNrbWFwR2VuZXJhdGlv
blBhcmFtcyYgcGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgR1BSUmVnIHJlc3VsdCA9IHBhcmFt
c1swXS5ncHIoKTsKICAgICAgICAgICAgICAgICBNYWNyb0Fzc2VtYmxlcjo6RGF0YUxhYmVsUHRy
IG1vdmVMb2NhdGlvbiA9IGppdC5tb3ZlV2l0aFBhdGNoKE1hY3JvQXNzZW1ibGVyOjpUcnVzdGVk
SW1tUHRyKG51bGxwdHIpLCByZXN1bHQpOwotICAgICAgICAgICAgICAgIGppdC5hZGRMaW5rVGFz
ayhbPV0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBqaXQuYWRk
TGlua1Rhc2soW2NhbGxlZU1vdmVMb2NhdGlvbiwgbW92ZUxvY2F0aW9uXSAoTGlua0J1ZmZlciYg
bGlua0J1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICAqY2FsbGVlTW92ZUxvY2F0aW9uID0g
bGlua0J1ZmZlci5sb2NhdGlvbk9mKG1vdmVMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgfSk7
CiAgICAgICAgICAgICB9KTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21Q
bGFuLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxh
bi5jcHAJKHJldmlzaW9uIDIwOTk5MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dh
c21QbGFuLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksOSBAQAogI2luY2x1ZGUgIldh
c21Nb2R1bGVQYXJzZXIuaCIKICNpbmNsdWRlICJXYXNtVmFsaWRhdGUuaCIKICNpbmNsdWRlIDx3
dGYvRGF0YUxvZy5oPgorI2luY2x1ZGUgPHd0Zi9Mb2NrZXIuaD4KKyNpbmNsdWRlIDx3dGYvTW9u
b3RvbmljVGltZS5oPgorI2luY2x1ZGUgPHd0Zi9OdW1iZXJPZkNvcmVzLmg+CiAjaW5jbHVkZSA8
d3RmL1N0ZExpYkV4dHJhcy5oPgogI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaD4K
IApAQCAtNjAsNiArNjMsMTAgQEAgUGxhbjo6UGxhbihWTSogdm0sIGNvbnN0IHVpbnQ4X3QqIHNv
dXJjZQogCiBib29sIFBsYW46OnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKQogeworICAgIE1vbm90
b25pY1RpbWUgc3RhcnRUaW1lOworICAgIGlmICh2ZXJib3NlIHx8IE9wdGlvbnM6OnJlcG9ydENv
bXBpbGVUaW1lcygpKQorICAgICAgICBzdGFydFRpbWUgPSBNb25vdG9uaWNUaW1lOjpub3coKTsK
KwogICAgIHsKICAgICAgICAgTW9kdWxlUGFyc2VyIG1vZHVsZVBhcnNlcihtX3ZtLCBtX3NvdXJj
ZSwgbV9zb3VyY2VMZW5ndGgpOwogICAgICAgICBhdXRvIHBhcnNlUmVzdWx0ID0gbW9kdWxlUGFy
c2VyLnBhcnNlKCk7CkBAIC03OCwyNyArODUsMzMgQEAgYm9vbCBQbGFuOjpwYXJzZUFuZFZhbGlk
YXRlTW9kdWxlKCkKICAgICAgICAgICAgIGRhdGFMb2dMbigiUHJvY2Vzc2luZyBmdW5jdGlvbiBz
dGFydGluZyBhdDogIiwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0u
c3RhcnQsICIgYW5kIGVuZGluZyBhdDogIiwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVu
Y3Rpb25JbmRleF0uZW5kKTsKICAgICAgICAgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCA9
IG1fc291cmNlICsgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3Rh
cnQ7CiAgICAgICAgIHNpemVfdCBmdW5jdGlvbkxlbmd0aCA9IG1fZnVuY3Rpb25Mb2NhdGlvbklu
QmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCAtIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1
bmN0aW9uSW5kZXhdLnN0YXJ0OwotICAgICAgICBBU1NFUlQoQ2hlY2tlZDx1aW50cHRyX3Q+KGJp
dHdpc2VfY2FzdDx1aW50cHRyX3Q+KGZ1bmN0aW9uU3RhcnQpKSArIGZ1bmN0aW9uTGVuZ3RoIDw9
IENoZWNrZWQ8dWludHB0cl90PihiaXR3aXNlX2Nhc3Q8dWludHB0cl90PihtX3NvdXJjZSkpICsg
bV9zb3VyY2VMZW5ndGgpOworICAgICAgICBBU1NFUlQoZnVuY3Rpb25MZW5ndGggPD0gbV9zb3Vy
Y2VMZW5ndGgpOwogICAgICAgICBTaWduYXR1cmUqIHNpZ25hdHVyZSA9IG1fbW9kdWxlSW5mb3Jt
YXRpb24tPmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVzW2Z1bmN0aW9uSW5kZXhdOwogCi0gICAg
ICAgIGF1dG8gdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFy
dCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21v
ZHVsZUluZm9ybWF0aW9uKTsKLSAgICAgICAgaWYgKCF2YWxpZGF0aW9uUmVzdWx0KSB7CisgICAg
ICAgIGF1dG8gdmFsaWRhdGVSZXN1bHQgPSB2YWxpZGF0ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQs
IGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1
bGVJbmZvcm1hdGlvbik7CisgICAgICAgIGlmICghdmFsaWRhdGVSZXN1bHQpIHsKICAgICAgICAg
ICAgIGlmICh2ZXJib3NlKSB7CiAgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IGZ1bmN0aW9uTGVuZ3RoOyArK2kpCiAgICAgICAgICAgICAgICAgICAgIGRhdGFMb2coUmF3
UG9pbnRlcihyZWludGVycHJldF9jYXN0PHZvaWQqPihmdW5jdGlvblN0YXJ0W2ldKSksICIsICIp
OwogICAgICAgICAgICAgICAgIGRhdGFMb2dMbigpOwogICAgICAgICAgICAgfQotICAgICAgICAg
ICAgbV9lcnJvck1lc3NhZ2UgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yKCk7IC8vIEZJWE1FIG1h
a2UgdGhpcyBhbiBFeHBlY3RlZC4KKyAgICAgICAgICAgIG1fZXJyb3JNZXNzYWdlID0gdmFsaWRh
dGVSZXN1bHQuZXJyb3IoKTsgLy8gRklYTUUgbWFrZSB0aGlzIGFuIEV4cGVjdGVkLgogICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHZlcmJvc2Ug
fHwgT3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpCisgICAgICAgIGRhdGFMb2dMbigiVG9v
ayAiLCAoTW9ub3RvbmljVGltZTo6bm93KCkgLSBzdGFydFRpbWUpLm1pY3Jvc2Vjb25kcygpLCAi
IHVzIHRvIHZhbGlkYXRlIG1vZHVsZSIpOwogICAgIHJldHVybiB0cnVlOwogfQogCisvLyBXZSBh
cmUgY3JlYXRpbmcgYSBidW5jaCBvZiB0aHJlYWRzIHRoYXQgdG91Y2ggdGhlIG1haW4gdGhyZWFk
J3Mgc3RhY2suIFRoaXMgd2lsbCBtYWtlIEFTQU4gdW5oYXBweS4KKy8vIFRoZSByZWFzb24gdGhp
cyBpcyBPSyBpcyB0aGF0IHdlIGd1YXJhbnRlZSB0aGF0IHRoZSBtYWluIHRocmVhZCBkb2Vzbid0
IGNvbnRpbnVlIHVudGlsIGFsbCB0aHJlYWRzCisvLyB0aGF0IGNvdWxkIHRvdWNoIGl0cyBzdGFj
ayBhcmUgZG9uZSBleGVjdXRpbmcuCitTVVBQUkVTU19BU0FOIAogdm9pZCBQbGFuOjpydW4oKQog
ewotICAgIGlmICghcGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpKQorICAgIGlmICghcGFyc2VBbmRW
YWxpZGF0ZU1vZHVsZSgpKSAvLyBUaGlzIGFsc28gY29sbGVjdHMgYSBidW5jaCBvZiBpbmZvcm1h
dGlvbiBuZWVkZWQgdG8gZG8gdGhlIGFjdHVhbCBjb21waWxhdGlvbi4KICAgICAgICAgcmV0dXJu
OwogCiAgICAgYXV0byB0cnlSZXNlcnZlQ2FwYWNpdHkgPSBbdGhpc10gKGF1dG8mIHZlY3Rvciwg
c2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIHdoYXQpIHsKQEAgLTExMywxMiArMTI2LDE2IEBAIHZv
aWQgUGxhbjo6cnVuKCkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfTsKIAotICAgIFZlY3Rv
cjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+IHVubGlua2VkV2FzbVRvV2FzbUNhbGxz
OwogICAgIGlmICghdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbVRvSlNTdHVicywgbV9tb2R1bGVJ
bmZvcm1hdGlvbi0+aW1wb3J0RnVuY3Rpb25zLnNpemUoKSwgIiBXZWJBc3NlbWJseSB0byBKYXZh
U2NyaXB0IHN0dWJzIikKLSAgICAgICAgfHwgIXRyeVJlc2VydmVDYXBhY2l0eSh1bmxpbmtlZFdh
c21Ub1dhc21DYWxscywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpLCAiIHVubGlu
a2VkIFdlYkFzc2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKLSAgICAgICAgfHwgIXRyeVJl
c2VydmVDYXBhY2l0eShtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucywgbV9mdW5jdGlvbkxvY2F0aW9u
SW5CaW5hcnkuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5IGZ1bmN0aW9ucyIpKQorICAgICAgICB8fCAh
dHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIG1fZnVuY3Rpb25M
b2NhdGlvbkluQmluYXJ5LnNpemUoKSwgIiB1bmxpbmtlZCBXZWJBc3NlbWJseSB0byBXZWJBc3Nl
bWJseSBjYWxscyIpCisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtSW50ZXJu
YWxGdW5jdGlvbnMsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSwgIiBXZWJBc3Nl
bWJseSBmdW5jdGlvbnMiKQorICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fY29tcGls
YXRpb25Db250ZXh0cywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpLCAiIGNvbXBp
bGF0aW9uIGNvbnRleHRzIikpCiAgICAgICAgIHJldHVybjsKIAorICAgIG1fdW5saW5rZWRXYXNt
VG9XYXNtQ2FsbHMucmVzaXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSk7Cisg
ICAgbV93YXNtSW50ZXJuYWxGdW5jdGlvbnMucmVzaXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmlu
YXJ5LnNpemUoKSk7CisgICAgbV9jb21waWxhdGlvbkNvbnRleHRzLnJlc2l6ZShtX2Z1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeS5zaXplKCkpOworCiAgICAgZm9yICh1bnNpZ25lZCBpbXBvcnRJbmRl
eCA9IDA7IGltcG9ydEluZGV4IDwgbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW1wb3J0cy5zaXplKCk7
ICsraW1wb3J0SW5kZXgpIHsKICAgICAgICAgSW1wb3J0KiBpbXBvcnQgPSAmbV9tb2R1bGVJbmZv
cm1hdGlvbi0+aW1wb3J0c1tpbXBvcnRJbmRleF07CiAgICAgICAgIGlmIChpbXBvcnQtPmtpbmQg
IT0gRXh0ZXJuYWxLaW5kOjpGdW5jdGlvbikKQEAgLTEzMSwzMCArMTQ4LDk2IEBAIHZvaWQgUGxh
bjo6cnVuKCkKICAgICAgICAgbV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2ltcG9y
dEZ1bmN0aW9uSW5kZXhdLmNvZGUgPSBtX3dhc21Ub0pTU3R1YnNbaW1wb3J0RnVuY3Rpb25JbmRl
eF0uY29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgfQogCi0gICAgZm9yICh1bnNpZ25l
ZCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rpb25JbmRleCA8IG1fZnVuY3Rpb25Mb2NhdGlvbklu
QmluYXJ5LnNpemUoKTsgKytmdW5jdGlvbkluZGV4KSB7Ci0gICAgICAgIGlmICh2ZXJib3NlKQot
ICAgICAgICAgICAgZGF0YUxvZ0xuKCJQcm9jZXNzaW5nIGZ1bmN0aW9uIHN0YXJ0aW5nIGF0OiAi
LCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydCwgIiBhbmQg
ZW5kaW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5l
bmQpOwotICAgICAgICBjb25zdCB1aW50OF90KiBmdW5jdGlvblN0YXJ0ID0gbV9zb3VyY2UgKyBt
X2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKLSAgICAgICAg
c2l6ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rp
b25JbmRleF0uZW5kIC0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0u
c3RhcnQ7Ci0gICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7
Ci0gICAgICAgIFNpZ25hdHVyZSogc2lnbmF0dXJlID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+aW50
ZXJuYWxGdW5jdGlvblNpZ25hdHVyZXNbZnVuY3Rpb25JbmRleF07Ci0gICAgICAgIHVuc2lnbmVk
IGZ1bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbVRvSlNTdHVicy5zaXplKCkgKyBmdW5jdGlvbklu
ZGV4OwotICAgICAgICBBU1NFUlQobV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1
bmN0aW9uSW5kZXhTcGFjZV0uc2lnbmF0dXJlID09IHNpZ25hdHVyZSk7CiAKLSAgICAgICAgQVNT
RVJUKHZhbGlkYXRlRnVuY3Rpb24oZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25h
dHVyZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKSk7CisgICAg
dWludDMyX3QgdGhyZWFkQ291bnQgPSBXVEY6Om51bWJlck9mUHJvY2Vzc29yQ29yZXMoKTsKKyAg
ICBpZiAodmVyYm9zZSkKKyAgICAgICAgZGF0YUxvZ0xuKCJUaHJlYWQgY291bnQ6ICIsIHRocmVh
ZENvdW50KTsKKworICAgIG1fY3VycmVudEluZGV4ID0gMDsKKworICAgIGF1dG8gZG9Xb3JrID0g
W3RoaXNdIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGZ1
bmN0aW9uSW5kZXg7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXV0byBsb2NrZXIg
PSBob2xkTG9jayhtX2xvY2spOworICAgICAgICAgICAgICAgIGlmIChtX2N1cnJlbnRJbmRleCA+
PSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCkpCisgICAgICAgICAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgICAgICAgICBmdW5jdGlvbkluZGV4ID0gbV9jdXJyZW50SW5kZXg7
CisgICAgICAgICAgICAgICAgKyttX2N1cnJlbnRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCA9IG1fc291cmNlICsgbV9mdW5j
dGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAgICAgICAgICBz
aXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlv
bkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5z
dGFydDsKKyAgICAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0
aCk7CisgICAgICAgICAgICBTaWduYXR1cmUqIHNpZ25hdHVyZSA9IG1fbW9kdWxlSW5mb3JtYXRp
b24tPmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVzW2Z1bmN0aW9uSW5kZXhdOworICAgICAgICAg
ICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUoKSAr
IGZ1bmN0aW9uSW5kZXg7CisgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKGZ1bmN0aW9uSW5kZXhT
cGFjZSwgbV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9uSW5kZXhTcGFj
ZV0uc2lnbmF0dXJlID09IHNpZ25hdHVyZSk7CisKKyAgICAgICAgICAgIEFTU0VSVCh2YWxpZGF0
ZUZ1bmN0aW9uKGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBzaWduYXR1cmUsIG1fZnVu
Y3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbikpOworCisgICAgICAgICAgICBt
X3VubGlua2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdID0gVmVjdG9yPFVubGlua2Vk
V2FzbVRvV2FzbUNhbGw+KCk7CisgICAgICAgICAgICBhdXRvIHBhcnNlQW5kQ29tcGlsZVJlc3Vs
dCA9IHBhcnNlQW5kQ29tcGlsZSgqbV92bSwgbV9jb21waWxhdGlvbkNvbnRleHRzW2Z1bmN0aW9u
SW5kZXhdLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCBtX3VubGlu
a2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdLCBtX2Z1bmN0aW9uSW5kZXhTcGFjZSwg
Km1fbW9kdWxlSW5mb3JtYXRpb24pOworCisgICAgICAgICAgICBpZiAoVU5MSUtFTFkoIXBhcnNl
QW5kQ29tcGlsZVJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvY2tlciA9IGhvbGRM
b2NrKG1fbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKCFtX2Vycm9yTWVzc2FnZSkgeworICAg
ICAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBjb21waWxlcyBjb3VsZCBmYWlsIHNpbXVsdGFu
ZW91c2x5LiBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIGZpcnN0LgorICAgICAgICAgICAgICAg
ICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOyAvLyBG
SVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIG1fY3VycmVudEluZGV4ID0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgp
OwogCi0gICAgICAgIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLnVuY2hlY2tlZEFwcGVuZChWZWN0
b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4oKSk7Ci0gICAgICAgIGF1dG8gcGFyc2VBbmRDb21w
aWxlUmVzdWx0ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlv
bkxlbmd0aCwgc2lnbmF0dXJlLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy5hdChmdW5jdGlvbklu
ZGV4KSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9ybWF0aW9uKTsKLSAgICAg
ICAgaWYgKFVOTElLRUxZKCFwYXJzZUFuZENvbXBpbGVSZXN1bHQpKSB7Ci0gICAgICAgICAgICBt
X2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJvcigpOwotICAgICAgICAg
ICAgcmV0dXJuOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAg
ICAgLy8gV2Ugd2lsbCB0ZXJtaW5hdGUgb24gdGhlIG5leHQgZXhlY3V0aW9uLgorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV93YXNtSW50
ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0gPSBXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVS
ZXN1bHQpOwogICAgICAgICB9Ci0gICAgICAgIG1fd2FzbUludGVybmFsRnVuY3Rpb25zLnVuY2hl
Y2tlZEFwcGVuZChXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVSZXN1bHQpKTsKKyAgICB9OworCisg
ICAgTW9ub3RvbmljVGltZSBzdGFydFRpbWU7CisgICAgaWYgKHZlcmJvc2UgfHwgT3B0aW9uczo6
cmVwb3J0Q29tcGlsZVRpbWVzKCkpCisgICAgICAgIHN0YXJ0VGltZSA9IE1vbm90b25pY1RpbWU6
Om5vdygpOworCisgICAgdWludDMyX3QgbnVtV29ya2VyVGhyZWFkcyA9IHRocmVhZENvdW50IC0g
MTsKKyAgICBWZWN0b3I8VGhyZWFkSWRlbnRpZmllcj4gdGhyZWFkczsKKyAgICB0aHJlYWRzLnJl
c2VydmVDYXBhY2l0eShudW1Xb3JrZXJUaHJlYWRzKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAw
OyBpIDwgbnVtV29ya2VyVGhyZWFkczsgaSsrKQorICAgICAgICB0aHJlYWRzLnVuY2hlY2tlZEFw
cGVuZChjcmVhdGVUaHJlYWQoImpzYy53YXNtLWIzLWNvbXBpbGF0aW9uLnRocmVhZCIsIGRvV29y
aykpOworCisgICAgZG9Xb3JrKCk7IC8vIExldCB0aGUgbWFpbiB0aHJlYWQgZG8gc29tZSB3b3Jr
IHRvby4KKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1Xb3JrZXJUaHJlYWRzOyBp
KyspCisgICAgICAgIHdhaXRGb3JUaHJlYWRDb21wbGV0aW9uKHRocmVhZHNbaV0pOworCisgICAg
Zm9yICh1aW50MzJfdCBmdW5jdGlvbkluZGV4ID0gMDsgZnVuY3Rpb25JbmRleCA8IG1fZnVuY3Rp
b25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKTsgZnVuY3Rpb25JbmRleCsrKSB7CisgICAgICAgIHsK
KyAgICAgICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCYgY29udGV4dCA9IG1fY29tcGlsYXRpb25D
b250ZXh0c1tmdW5jdGlvbkluZGV4XTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBM
aW5rQnVmZmVyIGxpbmtCdWZmZXIoKm1fdm0sICpjb250ZXh0Lndhc21FbnRyeXBvaW50SklULCBu
dWxscHRyKTsKKyAgICAgICAgICAgICAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9uc1tmdW5jdGlv
bkluZGV4XS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24gPQorICAgICAgICAgICAgICAgICAg
ICBzdGQ6Om1ha2VfdW5pcXVlPEIzOjpDb21waWxhdGlvbj4oRklOQUxJWkVfQ09ERShsaW5rQnVm
ZmVyLCAoIldhc20gZnVuY3Rpb24iKSksIFdURk1vdmUoY29udGV4dC53YXNtRW50cnlwb2ludEJ5
cHJvZHVjdHMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAg
ICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcigqbV92bSwgKmNvbnRleHQuanNFbnRyeXBvaW50SklU
LCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBsaW5rQnVmZmVyLmxpbmsoY29udGV4dC5qc0Vu
dHJ5cG9pbnRUb1dhc21FbnRyeXBvaW50Q2FsbCwgRnVuY3Rpb25QdHIobV93YXNtSW50ZXJuYWxG
dW5jdGlvbnNbZnVuY3Rpb25JbmRleF0tPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2Rl
KCkuZXhlY3V0YWJsZUFkZHJlc3MoKSkpOworCisgICAgICAgICAgICAgICAgbV93YXNtSW50ZXJu
YWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0tPmpzVG9XYXNtRW50cnlwb2ludC5jb21waWxhdGlv
biA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QjM6OkNvbXBpbGF0aW9u
PihGSU5BTElaRV9DT0RFKGxpbmtCdWZmZXIsICgiV2FzbSBKUyBlbnRyeXBvaW50IikpLCBXVEZN
b3ZlKGNvbnRleHQuanNFbnRyeXBvaW50Qnlwcm9kdWN0cykpOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9K
U1N0dWJzLnNpemUoKSArIGZ1bmN0aW9uSW5kZXg7CiAgICAgICAgIG1fZnVuY3Rpb25JbmRleFNw
YWNlLmJ1ZmZlci5nZXQoKVtmdW5jdGlvbkluZGV4U3BhY2VdLmNvZGUgPSBtX3dhc21JbnRlcm5h
bEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+d2FzbUVudHJ5cG9pbnQuY29tcGlsYXRpb24tPmNv
ZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpOwogICAgIH0KIAorICAgIGlmICh2ZXJib3NlIHx8IE9w
dGlvbnM6OnJlcG9ydENvbXBpbGVUaW1lcygpKSB7CisgICAgICAgIGRhdGFMb2dMbigiVG9vayAi
LCAoTW9ub3RvbmljVGltZTo6bm93KCkgLSBzdGFydFRpbWUpLm1pY3Jvc2Vjb25kcygpLAorICAg
ICAgICAgICAgIiB1cyB0byBjb21waWxlIGFuZCBsaW5rIHRoZSBtb2R1bGUiKTsKKyAgICB9CisK
ICAgICAvLyBQYXRjaCB0aGUgY2FsbCBzaXRlcyBmb3IgZWFjaCBXZWJBc3NlbWJseSBmdW5jdGlv
bi4KLSAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMpIHsK
KyAgICBmb3IgKGF1dG8mIHVubGlua2VkIDogbV91bmxpbmtlZFdhc21Ub1dhc21DYWxscykgewog
ICAgICAgICBmb3IgKGF1dG8mIGNhbGwgOiB1bmxpbmtlZCkKICAgICAgICAgICAgIE1hY3JvQXNz
ZW1ibGVyOjpyZXBhdGNoQ2FsbChjYWxsLmNhbGxMb2NhdGlvbiwgQ29kZUxvY2F0aW9uTGFiZWwo
bV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2NhbGwuZnVuY3Rpb25JbmRleF0uY29k
ZSkpOwogICAgIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21QbGFuLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAkocmV2
aXNpb24gMjA5OTkxKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uaAko
d29ya2luZyBjb3B5KQpAQCAtMjksNiArMjksNyBAQAogCiAjaW5jbHVkZSAiQ29tcGlsYXRpb25S
ZXN1bHQuaCIKICNpbmNsdWRlICJWTS5oIgorI2luY2x1ZGUgIldhc21CM0lSR2VuZXJhdG9yLmgi
CiAjaW5jbHVkZSAiV2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9CYWcuaD4KICNpbmNsdWRl
IDx3dGYvVGhyZWFkU2FmZVJlZkNvdW50ZWQuaD4KQEAgLTEwMywxMyArMTA0LDE3IEBAIHByaXZh
dGU6CiAgICAgQmFnPENhbGxMaW5rSW5mbz4gbV9jYWxsTGlua0luZm9zOwogICAgIFZlY3RvcjxX
YXNtVG9KU1N0dWI+IG1fd2FzbVRvSlNTdHViczsKICAgICBWZWN0b3I8c3RkOjp1bmlxdWVfcHRy
PFdhc21JbnRlcm5hbEZ1bmN0aW9uPj4gbV93YXNtSW50ZXJuYWxGdW5jdGlvbnM7CisgICAgVmVj
dG9yPENvbXBpbGF0aW9uQ29udGV4dD4gbV9jb21waWxhdGlvbkNvbnRleHRzOwogICAgIEltbXV0
YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSBtX2Z1bmN0aW9uSW5kZXhTcGFjZTsKIAogICAgIFZNKiBt
X3ZtOworICAgIFZlY3RvcjxWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4+IG1fdW5saW5r
ZWRXYXNtVG9XYXNtQ2FsbHM7CiAgICAgY29uc3QgdWludDhfdCogbV9zb3VyY2U7CiAgICAgY29u
c3Qgc2l6ZV90IG1fc291cmNlTGVuZ3RoOwogICAgIGJvb2wgbV9mYWlsZWQgeyB0cnVlIH07CiAg
ICAgU3RyaW5nIG1fZXJyb3JNZXNzYWdlOworICAgIHVpbnQzMl90IG1fY3VycmVudEluZGV4Owor
ICAgIExvY2sgbV9sb2NrOwogfTsKIAogfSB9IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>297546</attachid>
            <date>2016-12-20 12:17:07 -0800</date>
            <delta_ts>2016-12-20 16:30:18 -0800</delta_ts>
            <desc>patch</desc>
            <filename>a-backup.diff</filename>
            <type>text/plain</type>
            <size>22754</size>
            <attacher name="Saam Barati">saam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjEwMDI3KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDMyIEBA
CisyMDE2LTEyLTIwICBTYWFtIEJhcmF0aSAgPHNiYXJhdGlAYXBwbGUuY29tPgorCisgICAgICAg
IFdlYkFzc2VtYmx5OiBXZSBzaG91bGQgY29tcGlsZSB3YXNtIGZ1bmN0aW9ucyBpbiBwYXJhbGxl
bAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTY1OTkz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhpcyBw
YXRjaCBhZGRzIGEgdmVyeSBzaW1wbGUgcGFyYWxsZWwgY29tcGlsZXIgZm9yIFdhc20gY29kZS4K
KyAgICAgICAgVGhpcyBwYXRjaCBzcGVlZHMgdXAgY29tcGlsaW5nIHRoZSBVbml0eSBoZWFkbGVz
cyBiZW5jaG1hcmsgYnkKKyAgICAgICAgc2xpZ2h0bHkgbW9yZSB0aGFuIDR4IG9uIG15IE1CUC4g
VG8gbWFrZSB0aGlzIHNhZmUsIEkgcGVyZm9ybQorICAgICAgICBhbGwgbGlua2luZyBvbiB0aGUg
bWFpbiB0aHJlYWQuIEkgYWxzbyBoYWQgdG8gY2hhbmdlIHNvbWUgY29kZQorICAgICAgICBpbnNp
ZGUgV2FzbWIzSVJHZW5lcmF0b3IgdG8gYmUgdGhyZWFkIHNhZmUuCisKKyAgICAgICAgKiBiMy9h
aXIvQWlyQ3VzdG9tLmg6CisgICAgICAgIChKU0M6OkIzOjpBaXI6Oldhc21Cb3VuZHNDaGVja0N1
c3RvbTo6Z2VuZXJhdGUpOgorICAgICAgICAqIGIzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5o
OgorICAgICAgICAqIHdhc20vV2FzbUIzSVJHZW5lcmF0b3IuY3BwOgorICAgICAgICAoSlNDOjpX
YXNtOjpCM0lSR2VuZXJhdG9yOjpCM0lSR2VuZXJhdG9yKToKKyAgICAgICAgKEpTQzo6V2FzbTo6
QjNJUkdlbmVyYXRvcjo6ZW1pdEV4Y2VwdGlvbkNoZWNrKToKKyAgICAgICAgKEpTQzo6V2FzbTo6
Y3JlYXRlSlNUb1dhc21XcmFwcGVyKToKKyAgICAgICAgKEpTQzo6V2FzbTo6cGFyc2VBbmRDb21w
aWxlKToKKyAgICAgICAgKiB3YXNtL1dhc21CM0lSR2VuZXJhdG9yLmg6CisgICAgICAgICogd2Fz
bS9XYXNtQ2FsbGluZ0NvbnZlbnRpb24uaDoKKyAgICAgICAgKEpTQzo6V2FzbTo6Q2FsbGluZ0Nv
bnZlbnRpb246OnNldHVwRnJhbWVJblByb2xvZ3VlKToKKyAgICAgICAgKiB3YXNtL1dhc21QbGFu
LmNwcDoKKyAgICAgICAgKEpTQzo6V2FzbTo6UGxhbjo6cGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSk6
CisgICAgICAgIChKU0M6Oldhc206OlBsYW46OnJ1bik6CisgICAgICAgICogd2FzbS9XYXNtUGxh
bi5oOgorCiAyMDE2LTEyLTIwICBKRiBCYXN0aWVuICA8amZiYXN0aWVuQGFwcGxlLmNvbT4KIAog
ICAgICAgICBXZWJBc3NlbWJseTogdW5pcXVlIGZ1bmN0aW9uIHNpZ25hdHVyZXMKSW5kZXg6IFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWlyQ3VzdG9tLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDdXN0b20uaAkocmV2aXNpb24gMjEwMDI3KQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJDdXN0b20uaAkod29ya2luZyBjb3B5
KQpAQCAtMzEzLDcgKzMxMyw3IEBAIHN0cnVjdCBXYXNtQm91bmRzQ2hlY2tDdXN0b20gOiBwdWJs
aWMgQ28KICAgICAgICAgQ0NhbGxIZWxwZXJzOjpKdW1wIG91dE9mQm91bmRzID0gSW5zdChBaXI6
OkJyYW5jaDY0LCB2YWx1ZSwgQXJnOjpyZWxDb25kKENDYWxsSGVscGVyczo6QWJvdmVPckVxdWFs
KSwgaW5zdC5hcmdzWzBdLCBpbnN0LmFyZ3NbMV0pLmdlbmVyYXRlKGppdCwgY29udGV4dCk7CiAK
ICAgICAgICAgY29udGV4dC5sYXRlUGF0aHMuYXBwZW5kKGNyZWF0ZVNoYXJlZFRhc2s8R2VuZXJh
dGlvbkNvbnRleHQ6OkxhdGVQYXRoRnVuY3Rpb24+KAotICAgICAgICAgICAgWz1dIChDQ2FsbEhl
bHBlcnMmIGppdCwgQWlyOjpHZW5lcmF0aW9uQ29udGV4dCYpIHsKKyAgICAgICAgICAgIFtvdXRP
ZkJvdW5kcywgdmFsdWVdIChDQ2FsbEhlbHBlcnMmIGppdCwgQWlyOjpHZW5lcmF0aW9uQ29udGV4
dCYgY29udGV4dCkgewogICAgICAgICAgICAgICAgIG91dE9mQm91bmRzLmxpbmsoJmppdCk7CiAg
ICAgICAgICAgICAgICAgY29udGV4dC5jb2RlLT53YXNtQm91bmRzQ2hlY2tHZW5lcmF0b3IoKS0+
cnVuKGppdCwgdmFsdWUtPnBpbm5lZEdQUigpLCB2YWx1ZS0+b2Zmc2V0KCkpOwogICAgICAgICAg
ICAgfSkpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9u
Q29udGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9iMy9haXIvQWly
R2VuZXJhdGlvbkNvbnRleHQuaAkocmV2aXNpb24gMjEwMDI3KQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2IzL2Fpci9BaXJHZW5lcmF0aW9uQ29udGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
OSw2ICszOSwxMSBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEIzIHsgbmFtZXNwYWNlCiBj
bGFzcyBDb2RlOwogCiBzdHJ1Y3QgR2VuZXJhdGlvbkNvbnRleHQgeworICAgIFdURl9NQUtFX05P
TkNPUFlBQkxFKEdlbmVyYXRpb25Db250ZXh0KTsKK3B1YmxpYzoKKworICAgIEdlbmVyYXRpb25D
b250ZXh0KCkgPSBkZWZhdWx0OworCiAgICAgdHlwZWRlZiB2b2lkIExhdGVQYXRoRnVuY3Rpb24o
Q0NhbGxIZWxwZXJzJiwgR2VuZXJhdGlvbkNvbnRleHQmKTsKICAgICB0eXBlZGVmIFNoYXJlZFRh
c2s8TGF0ZVBhdGhGdW5jdGlvbj4gTGF0ZVBhdGg7CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5jcHAJKHJldmlzaW9uIDIxMDAyNykK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21CM0lSR2VuZXJhdG9yLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjU3LDEyICsyNTcsNiBAQCBCM0lSR2VuZXJhdG9yOjpCM0lSR2VuZXJh
dG9yKFZNJiB2bSwgY29uCiAgICAgICAgICAgICBBU1NFUlRfVU5VU0VEKHBpbm5lZEdQUiwgbV9t
ZW1vcnlTaXplR1BSID09IHBpbm5lZEdQUik7CiAgICAgICAgICAgICB0aGlzLT5lbWl0RXhjZXB0
aW9uQ2hlY2soaml0LCBFeGNlcHRpb25UeXBlOjpPdXRPZkJvdW5kc01lbW9yeUFjY2Vzcyk7CiAg
ICAgICAgIH0pOwotCi0gICAgICAgIEIzOjpQYXRjaHBvaW50VmFsdWUqIGZvbyA9IG1fY3VycmVu
dEJsb2NrLT5hcHBlbmROZXc8QjM6OlBhdGNocG9pbnRWYWx1ZT4obV9wcm9jLCBCMzo6Vm9pZCwg
T3JpZ2luKCkpOwotICAgICAgICBmb28tPnNldEdlbmVyYXRvcigKLSAgICAgICAgICAgIFs9XSAo
Q0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7
Ci0gICAgICAgICAgICAgICAgQWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGFsbG93U2Ny
YXRjaChqaXQpOwotICAgICAgICAgICAgfSk7CiAgICAgfQogCiAgICAgd2FzbUNhbGxpbmdDb252
ZW50aW9uKCkuc2V0dXBGcmFtZUluUHJvbG9ndWUoJmNvbXBpbGF0aW9uLT53YXNtQ2FsbGVlTW92
ZUxvY2F0aW9uLCBtX3Byb2MsIE9yaWdpbigpLCBtX2N1cnJlbnRCbG9jayk7CkBAIC0yNzcsNyAr
MjcxLDcgQEAgdm9pZCBCM0lSR2VuZXJhdG9yOjplbWl0RXhjZXB0aW9uQ2hlY2soQwogICAgIGF1
dG8ganVtcFRvRXhjZXB0aW9uU3R1YiA9IGppdC5qdW1wKCk7CiAKICAgICBWTSogdm0gPSAmbV92
bTsKLSAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7Cisg
ICAgaml0LmFkZExpbmtUYXNrKFt2bSwganVtcFRvRXhjZXB0aW9uU3R1Yl0gKExpbmtCdWZmZXIm
IGxpbmtCdWZmZXIpIHsKICAgICAgICAgbGlua0J1ZmZlci5saW5rKGp1bXBUb0V4Y2VwdGlvblN0
dWIsIENvZGVMb2NhdGlvbkxhYmVsKHZtLT5nZXRDVElTdHViKHRocm93RXhjZXB0aW9uRnJvbVdh
c21UaHVua0dlbmVyYXRvcikuY29kZSgpKSk7CiAgICAgfSk7CiB9CkBAIC02OTEsMTMgKzY4NSwx
NCBAQCBhdXRvIEIzSVJHZW5lcmF0b3I6OmFkZENhbGwodWludDMyX3QgZnVuCiAgICAgICAgICAg
ICBwYXRjaHBvaW50LT5lZmZlY3RzLndyaXRlc1Bpbm5lZCA9IHRydWU7CiAgICAgICAgICAgICBw
YXRjaHBvaW50LT5lZmZlY3RzLnJlYWRzUGlubmVkID0gdHJ1ZTsKIAotICAgICAgICAgICAgcGF0
Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFs9XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpT
dGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CisgICAgICAgICAgICBWZWN0b3I8VW5saW5rZWRX
YXNtVG9XYXNtQ2FsbD4qIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzID0gJm1fdW5saW5rZWRXYXNt
VG9XYXNtQ2FsbHM7CisgICAgICAgICAgICBwYXRjaHBvaW50LT5zZXRHZW5lcmF0b3IoW3VubGlu
a2VkV2FzbVRvV2FzbUNhbGxzLCBmdW5jdGlvbkluZGV4XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNv
bnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmKSB7CiAgICAgICAgICAgICAgICAgQWxs
b3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGFsbG93U2NyYXRjaChqaXQpOwogCiAgICAgICAg
ICAgICAgICAgQ0NhbGxIZWxwZXJzOjpDYWxsIGNhbGwgPSBqaXQuY2FsbCgpOwogCi0gICAgICAg
ICAgICAgICAgaml0LmFkZExpbmtUYXNrKFs9XSAoTGlua0J1ZmZlciYgbGlua0J1ZmZlcikgewot
ICAgICAgICAgICAgICAgICAgICBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzLmFwcGVuZCh7IGxp
bmtCdWZmZXIubG9jYXRpb25PZihjYWxsKSwgZnVuY3Rpb25JbmRleCB9KTsKKyAgICAgICAgICAg
ICAgICBqaXQuYWRkTGlua1Rhc2soW3VubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBjYWxsLCBmdW5j
dGlvbkluZGV4XSAoTGlua0J1ZmZlciYgbGlua0J1ZmZlcikgeworICAgICAgICAgICAgICAgICAg
ICB1bmxpbmtlZFdhc21Ub1dhc21DYWxscy0+YXBwZW5kKHsgbGlua0J1ZmZlci5sb2NhdGlvbk9m
KGNhbGwpLCBmdW5jdGlvbkluZGV4IH0pOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAg
ICAgfSk7CiAgICAgICAgIH0pOwpAQCAtODE5LDcgKzgxNCw3IEBAIHZvaWQgQjNJUkdlbmVyYXRv
cjo6ZHVtcChjb25zdCBWZWN0b3I8Q28KICAgICBkYXRhTG9nTG4oIlxuIik7CiB9CiAKLXN0YXRp
YyBzdGQ6OnVuaXF1ZV9wdHI8QjM6OkNvbXBpbGF0aW9uPiBjcmVhdGVKU1RvV2FzbVdyYXBwZXIo
Vk0mIHZtLCBXYXNtSW50ZXJuYWxGdW5jdGlvbiYgZnVuY3Rpb24sIGNvbnN0IFNpZ25hdHVyZSog
c2lnbmF0dXJlLCBNYWNyb0Fzc2VtYmxlckNvZGVQdHIgbWFpbkZ1bmN0aW9uLCBjb25zdCBNZW1v
cnlJbmZvcm1hdGlvbiYgbWVtb3J5KQorc3RhdGljIHZvaWQgY3JlYXRlSlNUb1dhc21XcmFwcGVy
KFZNJiB2bSwgQ29tcGlsYXRpb25Db250ZXh0JiBjb21waWxhdGlvbkNvbnRleHQsIFdhc21JbnRl
cm5hbEZ1bmN0aW9uJiBmdW5jdGlvbiwgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUsIGNvbnN0
IE1lbW9yeUluZm9ybWF0aW9uJiBtZW1vcnkpCiB7CiAgICAgUHJvY2VkdXJlIHByb2M7CiAgICAg
QmFzaWNCbG9jayogYmxvY2sgPSBwcm9jLmFkZEJsb2NrKCk7CkBAIC04NzYsMTMgKzg3MSwxMiBA
QCBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEIzOjpDb21waWxhdGlvbj4gCiAgICAgICAgICAgICAg
ICAgcGF0Y2hwb2ludC0+YXBwZW5kKENvbnN0cmFpbmVkVmFsdWUoc2l6ZXNbaV0sIFZhbHVlUmVw
OjpyZWcobWVtb3J5LnBpbm5lZFJlZ2lzdGVycygpLnNpemVSZWdpc3RlcnNbaV0uc2l6ZVJlZ2lz
dGVyKSkpOwogICAgICAgICB9CiAKLSAgICAgICAgcGF0Y2hwb2ludC0+c2V0R2VuZXJhdG9yKFs9
XSAoQ0NhbGxIZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMm
KSB7CisgICAgICAgIENvbXBpbGF0aW9uQ29udGV4dCogY29udGV4dCA9ICZjb21waWxhdGlvbkNv
bnRleHQ7CisgICAgICAgIHBhdGNocG9pbnQtPnNldEdlbmVyYXRvcihbY29udGV4dF0gKENDYWxs
SGVscGVycyYgaml0LCBjb25zdCBCMzo6U3RhY2ttYXBHZW5lcmF0aW9uUGFyYW1zJikgewogICAg
ICAgICAgICAgQWxsb3dNYWNyb1NjcmF0Y2hSZWdpc3RlclVzYWdlIGFsbG93U2NyYXRjaChqaXQp
OwogCiAgICAgICAgICAgICBDQ2FsbEhlbHBlcnM6OkNhbGwgY2FsbCA9IGppdC5jYWxsKCk7Ci0g
ICAgICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVmZmVyJiBsaW5rQnVmZmVyKSB7
Ci0gICAgICAgICAgICAgICAgbGlua0J1ZmZlci5saW5rKGNhbGwsIEZ1bmN0aW9uUHRyKG1haW5G
dW5jdGlvbi5leGVjdXRhYmxlQWRkcmVzcygpKSk7Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAg
ICAgIGNvbnRleHQtPmpzRW50cnlwb2ludFRvV2FzbUVudHJ5cG9pbnRDYWxsID0gY2FsbDsKICAg
ICAgICAgfSk7CiAgICAgfSk7CiAKQEAgLTkwNCwxNSArODk4LDE5IEBAIHN0YXRpYyBzdGQ6OnVu
aXF1ZV9wdHI8QjM6OkNvbXBpbGF0aW9uPiAKICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JF
QUNIRUQoKTsKICAgICB9CiAKLSAgICBhdXRvIGpzRW50cnlwb2ludCA9IHN0ZDo6bWFrZV91bmlx
dWU8Q29tcGlsYXRpb24+KEIzOjpjb21waWxlKHZtLCBwcm9jKSk7CisgICAgQjM6OnByZXBhcmVG
b3JHZW5lcmF0aW9uKHByb2MpOworICAgIEIzOjpnZW5lcmF0ZShwcm9jLCAqY29tcGlsYXRpb25D
b250ZXh0LmpzRW50cnlwb2ludEpJVCk7CisgICAgY29tcGlsYXRpb25Db250ZXh0LmpzRW50cnlw
b2ludEJ5cHJvZHVjdHMgPSBwcm9jLnJlbGVhc2VCeXByb2R1Y3RzKCk7CiAgICAgZnVuY3Rpb24u
anNUb1dhc21FbnRyeXBvaW50LmNhbGxlZVNhdmVSZWdpc3RlcnMgPSBwcm9jLmNhbGxlZVNhdmVS
ZWdpc3RlcnMoKTsKLSAgICByZXR1cm4ganNFbnRyeXBvaW50OwogfQogCi1FeHBlY3RlZDxzdGQ6
OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rpb24+LCBTdHJpbmc+IHBhcnNlQW5kQ29tcGls
ZShWTSYgdm0sIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0aW9uU3RhcnQsIHNpemVfdCBmdW5jdGlvbkxl
bmd0aCwgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUsIFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dh
c21DYWxsPiYgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9u
SW5kZXhTcGFjZSYgZnVuY3Rpb25JbmRleFNwYWNlLCBjb25zdCBNb2R1bGVJbmZvcm1hdGlvbiYg
aW5mbywgdW5zaWduZWQgb3B0TGV2ZWwpCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUlu
dGVybmFsRnVuY3Rpb24+LCBTdHJpbmc+IHBhcnNlQW5kQ29tcGlsZShWTSYgdm0sIENvbXBpbGF0
aW9uQ29udGV4dCYgY29tcGlsYXRpb25Db250ZXh0LCBjb25zdCB1aW50OF90KiBmdW5jdGlvblN0
YXJ0LCBzaXplX3QgZnVuY3Rpb25MZW5ndGgsIGNvbnN0IFNpZ25hdHVyZSogc2lnbmF0dXJlLCBW
ZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4mIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBj
b25zdCBJbW11dGFibGVGdW5jdGlvbkluZGV4U3BhY2UmIGZ1bmN0aW9uSW5kZXhTcGFjZSwgY29u
c3QgTW9kdWxlSW5mb3JtYXRpb24mIGluZm8sIHVuc2lnbmVkIG9wdExldmVsKQogewogICAgIGF1
dG8gcmVzdWx0ID0gc3RkOjptYWtlX3VuaXF1ZTxXYXNtSW50ZXJuYWxGdW5jdGlvbj4oKTsKIAor
ICAgIGNvbXBpbGF0aW9uQ29udGV4dC5qc0VudHJ5cG9pbnRKSVQgPSBzdGQ6Om1ha2VfdW5pcXVl
PENDYWxsSGVscGVycz4oJnZtKTsKKyAgICBjb21waWxhdGlvbkNvbnRleHQud2FzbUVudHJ5cG9p
bnRKSVQgPSBzdGQ6Om1ha2VfdW5pcXVlPENDYWxsSGVscGVycz4oJnZtKTsKKwogICAgIFByb2Nl
ZHVyZSBwcm9jZWR1cmU7CiAgICAgQjNJUkdlbmVyYXRvciBjb250ZXh0KHZtLCBpbmZvLCBwcm9j
ZWR1cmUsIHJlc3VsdC5nZXQoKSwgdW5saW5rZWRXYXNtVG9XYXNtQ2FsbHMsIGZ1bmN0aW9uSW5k
ZXhTcGFjZSk7CiAgICAgRnVuY3Rpb25QYXJzZXI8QjNJUkdlbmVyYXRvcj4gcGFyc2VyKCZ2bSwg
Y29udGV4dCwgZnVuY3Rpb25TdGFydCwgZnVuY3Rpb25MZW5ndGgsIHNpZ25hdHVyZSwgZnVuY3Rp
b25JbmRleFNwYWNlLCBpbmZvKTsKQEAgLTkyNywxMCArOTI1LDE0IEBAIEV4cGVjdGVkPHN0ZDo6
dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW4KICAgICBpZiAodmVyYm9zZSkKICAgICAgICAgZGF0
YUxvZygiUG9zdCBTU0E6ICIsIHByb2NlZHVyZSk7CiAKLSAgICByZXN1bHQtPndhc21FbnRyeXBv
aW50LmNvbXBpbGF0aW9uID0gc3RkOjptYWtlX3VuaXF1ZTxCMzo6Q29tcGlsYXRpb24+KEIzOjpj
b21waWxlKHZtLCBwcm9jZWR1cmUsIG9wdExldmVsKSk7Ci0gICAgcmVzdWx0LT53YXNtRW50cnlw
b2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2VkdXJlLmNhbGxlZVNhdmVSZWdpc3RlcnMo
KTsKKyAgICB7CisgICAgICAgIEIzOjpwcmVwYXJlRm9yR2VuZXJhdGlvbihwcm9jZWR1cmUsIG9w
dExldmVsKTsKKyAgICAgICAgQjM6OmdlbmVyYXRlKHByb2NlZHVyZSwgKmNvbXBpbGF0aW9uQ29u
dGV4dC53YXNtRW50cnlwb2ludEpJVCk7CisgICAgICAgIGNvbXBpbGF0aW9uQ29udGV4dC53YXNt
RW50cnlwb2ludEJ5cHJvZHVjdHMgPSBwcm9jZWR1cmUucmVsZWFzZUJ5cHJvZHVjdHMoKTsKKyAg
ICAgICAgcmVzdWx0LT53YXNtRW50cnlwb2ludC5jYWxsZWVTYXZlUmVnaXN0ZXJzID0gcHJvY2Vk
dXJlLmNhbGxlZVNhdmVSZWdpc3RlcnMoKTsKKyAgICB9CiAKLSAgICByZXN1bHQtPmpzVG9XYXNt
RW50cnlwb2ludC5jb21waWxhdGlvbiA9IGNyZWF0ZUpTVG9XYXNtV3JhcHBlcih2bSwgKnJlc3Vs
dCwgc2lnbmF0dXJlLCByZXN1bHQtPndhc21FbnRyeXBvaW50LmNvbXBpbGF0aW9uLT5jb2RlKCks
IGluZm8ubWVtb3J5KTsKKyAgICBjcmVhdGVKU1RvV2FzbVdyYXBwZXIodm0sIGNvbXBpbGF0aW9u
Q29udGV4dCwgKnJlc3VsdCwgc2lnbmF0dXJlLCBpbmZvLm1lbW9yeSk7CiAgICAgcmV0dXJuIFdU
Rk1vdmUocmVzdWx0KTsKIH0KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2Fz
bUIzSVJHZW5lcmF0b3IuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2Fz
bS9XYXNtQjNJUkdlbmVyYXRvci5oCShyZXZpc2lvbiAyMTAwMjcpCisrKyBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvd2FzbS9XYXNtQjNJUkdlbmVyYXRvci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2
ICsyOCw3IEBACiAjaWYgRU5BQkxFKFdFQkFTU0VNQkxZKQogCiAjaW5jbHVkZSAiQjNDb21waWxh
dGlvbi5oIgorI2luY2x1ZGUgIkNDYWxsSGVscGVycy5oIgogI2luY2x1ZGUgIlZNLmgiCiAjaW5j
bHVkZSAiV2FzbUZvcm1hdC5oIgogI2luY2x1ZGUgPHd0Zi9FeHBlY3RlZC5oPgpAQCAtMzgsNyAr
MzksMTUgQEAgbmFtZXNwYWNlIEpTQyB7IG5hbWVzcGFjZSBXYXNtIHsKIAogY2xhc3MgTWVtb3J5
SW5mb3JtYXRpb247CiAKLUV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtSW50ZXJuYWxGdW5j
dGlvbj4sIFN0cmluZz4gcGFyc2VBbmRDb21waWxlKFZNJiwgY29uc3QgdWludDhfdCosIHNpemVf
dCwgY29uc3QgU2lnbmF0dXJlKiwgVmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+JiwgY29u
c3QgSW1tdXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlJiwgY29uc3QgTW9kdWxlSW5mb3JtYXRpb24m
LCB1bnNpZ25lZCBvcHRMZXZlbCA9IDEpOworc3RydWN0IENvbXBpbGF0aW9uQ29udGV4dCB7Cisg
ICAgc3RkOjp1bmlxdWVfcHRyPENDYWxsSGVscGVycz4ganNFbnRyeXBvaW50SklUOworICAgIHN0
ZDo6dW5pcXVlX3B0cjxCMzo6T3BhcXVlQnlwcm9kdWN0cz4ganNFbnRyeXBvaW50Qnlwcm9kdWN0
czsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NhbGxIZWxwZXJzPiB3YXNtRW50cnlwb2ludEpJVDsK
KyAgICBzdGQ6OnVuaXF1ZV9wdHI8QjM6Ok9wYXF1ZUJ5cHJvZHVjdHM+IHdhc21FbnRyeXBvaW50
Qnlwcm9kdWN0czsKKyAgICBDQ2FsbEhlbHBlcnM6OkNhbGwganNFbnRyeXBvaW50VG9XYXNtRW50
cnlwb2ludENhbGw7Cit9OworCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFs
RnVuY3Rpb24+LCBTdHJpbmc+IHBhcnNlQW5kQ29tcGlsZShWTSYsIENvbXBpbGF0aW9uQ29udGV4
dCYsIGNvbnN0IHVpbnQ4X3QqLCBzaXplX3QsIGNvbnN0IFNpZ25hdHVyZSosIFZlY3RvcjxVbmxp
bmtlZFdhc21Ub1dhc21DYWxsPiYsIGNvbnN0IEltbXV0YWJsZUZ1bmN0aW9uSW5kZXhTcGFjZSYs
IGNvbnN0IE1vZHVsZUluZm9ybWF0aW9uJiwgdW5zaWduZWQgb3B0TGV2ZWwgPSAxKTsKIAogfSB9
IC8vIG5hbWVzcGFjZSBKU0M6Oldhc20KIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3dh
c20vV2FzbUNhbGxpbmdDb252ZW50aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL3dhc20vV2FzbUNhbGxpbmdDb252ZW50aW9uLmgJKHJldmlzaW9uIDIxMDAyNykKKysr
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93YXNtL1dhc21DYWxsaW5nQ29udmVudGlvbi5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYzoKICAgICAgICAgICAgIFs9XSAoQ0Nh
bGxIZWxwZXJzJiBqaXQsIGNvbnN0IEIzOjpTdGFja21hcEdlbmVyYXRpb25QYXJhbXMmIHBhcmFt
cykgewogICAgICAgICAgICAgICAgIEdQUlJlZyByZXN1bHQgPSBwYXJhbXNbMF0uZ3ByKCk7CiAg
ICAgICAgICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OkRhdGFMYWJlbFB0ciBtb3ZlTG9jYXRpb24g
PSBqaXQubW92ZVdpdGhQYXRjaChNYWNyb0Fzc2VtYmxlcjo6VHJ1c3RlZEltbVB0cihudWxscHRy
KSwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBqaXQuYWRkTGlua1Rhc2soWz1dIChMaW5rQnVm
ZmVyJiBsaW5rQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaml0LmFkZExpbmtUYXNrKFtjYWxs
ZWVNb3ZlTG9jYXRpb24sIG1vdmVMb2NhdGlvbl0gKExpbmtCdWZmZXImIGxpbmtCdWZmZXIpIHsK
ICAgICAgICAgICAgICAgICAgICAgKmNhbGxlZU1vdmVMb2NhdGlvbiA9IGxpbmtCdWZmZXIubG9j
YXRpb25PZihtb3ZlTG9jYXRpb24pOwogICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAg
fSk7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3dhc20vV2FzbVBsYW4uY3BwCShyZXZpc2lv
biAyMTAwMjcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2FzbS9XYXNtUGxhbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTM5LDYgKzM5LDkgQEAKICNpbmNsdWRlICJXYXNtTW9kdWxlUGFyc2Vy
LmgiCiAjaW5jbHVkZSAiV2FzbVZhbGlkYXRlLmgiCiAjaW5jbHVkZSA8d3RmL0RhdGFMb2cuaD4K
KyNpbmNsdWRlIDx3dGYvTG9ja2VyLmg+CisjaW5jbHVkZSA8d3RmL01vbm90b25pY1RpbWUuaD4K
KyNpbmNsdWRlIDx3dGYvTnVtYmVyT2ZDb3Jlcy5oPgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRy
YXMuaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmg+CiAKQEAgLTYwLDYgKzYz
LDEwIEBAIFBsYW46OlBsYW4oVk0qIHZtLCBjb25zdCB1aW50OF90KiBzb3VyY2UKIAogYm9vbCBQ
bGFuOjpwYXJzZUFuZFZhbGlkYXRlTW9kdWxlKCkKIHsKKyAgICBNb25vdG9uaWNUaW1lIHN0YXJ0
VGltZTsKKyAgICBpZiAodmVyYm9zZSB8fCBPcHRpb25zOjpyZXBvcnRDb21waWxlVGltZXMoKSkK
KyAgICAgICAgc3RhcnRUaW1lID0gTW9ub3RvbmljVGltZTo6bm93KCk7CisKICAgICB7CiAgICAg
ICAgIE1vZHVsZVBhcnNlciBtb2R1bGVQYXJzZXIobV92bSwgbV9zb3VyY2UsIG1fc291cmNlTGVu
Z3RoKTsKICAgICAgICAgYXV0byBwYXJzZVJlc3VsdCA9IG1vZHVsZVBhcnNlci5wYXJzZSgpOwpA
QCAtNzgsNyArODUsNyBAQCBib29sIFBsYW46OnBhcnNlQW5kVmFsaWRhdGVNb2R1bGUoKQogICAg
ICAgICAgICAgZGF0YUxvZ0xuKCJQcm9jZXNzaW5nIGZ1bmN0aW9uIHN0YXJ0aW5nIGF0OiAiLCBt
X2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydCwgIiBhbmQgZW5k
aW5nIGF0OiAiLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQp
OwogICAgICAgICBjb25zdCB1aW50OF90KiBmdW5jdGlvblN0YXJ0ID0gbV9zb3VyY2UgKyBtX2Z1
bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKICAgICAgICAgc2l6
ZV90IGZ1bmN0aW9uTGVuZ3RoID0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25J
bmRleF0uZW5kIC0gbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3Rh
cnQ7Ci0gICAgICAgIEFTU0VSVChDaGVja2VkPHVpbnRwdHJfdD4oYml0d2lzZV9jYXN0PHVpbnRw
dHJfdD4oZnVuY3Rpb25TdGFydCkpICsgZnVuY3Rpb25MZW5ndGggPD0gQ2hlY2tlZDx1aW50cHRy
X3Q+KGJpdHdpc2VfY2FzdDx1aW50cHRyX3Q+KG1fc291cmNlKSkgKyBtX3NvdXJjZUxlbmd0aCk7
CisgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3NvdXJjZUxlbmd0aCk7CiAgICAg
ICAgIFNpZ25hdHVyZUluZGV4IHNpZ25hdHVyZUluZGV4ID0gbV9tb2R1bGVJbmZvcm1hdGlvbi0+
aW50ZXJuYWxGdW5jdGlvblNpZ25hdHVyZUluZGljZXNbZnVuY3Rpb25JbmRleF07CiAgICAgICAg
IGNvbnN0IFNpZ25hdHVyZSogc2lnbmF0dXJlID0gU2lnbmF0dXJlSW5mb3JtYXRpb246OmdldCht
X3ZtLCBzaWduYXR1cmVJbmRleCk7CiAKQEAgLTk0LDkgKzEwMSwxNSBAQCBib29sIFBsYW46OnBh
cnNlQW5kVmFsaWRhdGVNb2R1bGUoKQogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHZlcmJv
c2UgfHwgT3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpCisgICAgICAgIGRhdGFMb2dMbigi
VG9vayAiLCAoTW9ub3RvbmljVGltZTo6bm93KCkgLSBzdGFydFRpbWUpLm1pY3Jvc2Vjb25kcygp
LCAiIHVzIHRvIHZhbGlkYXRlIG1vZHVsZSIpOwogICAgIHJldHVybiB0cnVlOwogfQogCisvLyBX
ZSBhcmUgY3JlYXRpbmcgYSBidW5jaCBvZiB0aHJlYWRzIHRoYXQgdG91Y2ggdGhlIG1haW4gdGhy
ZWFkJ3Mgc3RhY2suIFRoaXMgd2lsbCBtYWtlIEFTQU4gdW5oYXBweS4KKy8vIFRoZSByZWFzb24g
dGhpcyBpcyBPSyBpcyB0aGF0IHdlIGd1YXJhbnRlZSB0aGF0IHRoZSBtYWluIHRocmVhZCBkb2Vz
bid0IGNvbnRpbnVlIHVudGlsIGFsbCB0aHJlYWRzCisvLyB0aGF0IGNvdWxkIHRvdWNoIGl0cyBz
dGFjayBhcmUgZG9uZSBleGVjdXRpbmcuCitTVVBQUkVTU19BU0FOIAogdm9pZCBQbGFuOjpydW4o
KQogewogICAgIGlmICghcGFyc2VBbmRWYWxpZGF0ZU1vZHVsZSgpKQpAQCAtMTE0LDEyICsxMjcs
MTYgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9OwogCi0g
ICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dhc21DYWxsPj4gdW5saW5rZWRXYXNtVG9X
YXNtQ2FsbHM7CiAgICAgaWYgKCF0cnlSZXNlcnZlQ2FwYWNpdHkobV93YXNtVG9KU1N0dWJzLCBt
X21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRGdW5jdGlvblNpZ25hdHVyZUluZGljZXMuc2l6ZSgp
LCAiIFdlYkFzc2VtYmx5IHRvIEphdmFTY3JpcHQgc3R1YnMiKQotICAgICAgICB8fCAhdHJ5UmVz
ZXJ2ZUNhcGFjaXR5KHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLCBtX2Z1bmN0aW9uTG9jYXRpb25J
bkJpbmFyeS5zaXplKCksICIgdW5saW5rZWQgV2ViQXNzZW1ibHkgdG8gV2ViQXNzZW1ibHkgY2Fs
bHMiKQotICAgICAgICB8fCAhdHJ5UmVzZXJ2ZUNhcGFjaXR5KG1fd2FzbUludGVybmFsRnVuY3Rp
b25zLCBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeS5zaXplKCksICIgV2ViQXNzZW1ibHkgZnVu
Y3Rpb25zIikpCisgICAgICAgIHx8ICF0cnlSZXNlcnZlQ2FwYWNpdHkobV91bmxpbmtlZFdhc21U
b1dhc21DYWxscywgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpLCAiIHVubGlua2Vk
IFdlYkFzc2VtYmx5IHRvIFdlYkFzc2VtYmx5IGNhbGxzIikKKyAgICAgICAgfHwgIXRyeVJlc2Vy
dmVDYXBhY2l0eShtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucywgbV9mdW5jdGlvbkxvY2F0aW9uSW5C
aW5hcnkuc2l6ZSgpLCAiIFdlYkFzc2VtYmx5IGZ1bmN0aW9ucyIpCisgICAgICAgIHx8ICF0cnlS
ZXNlcnZlQ2FwYWNpdHkobV9jb21waWxhdGlvbkNvbnRleHRzLCBtX2Z1bmN0aW9uTG9jYXRpb25J
bkJpbmFyeS5zaXplKCksICIgY29tcGlsYXRpb24gY29udGV4dHMiKSkKICAgICAgICAgcmV0dXJu
OwogCisgICAgbV91bmxpbmtlZFdhc21Ub1dhc21DYWxscy5yZXNpemUobV9mdW5jdGlvbkxvY2F0
aW9uSW5CaW5hcnkuc2l6ZSgpKTsKKyAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9ucy5yZXNpemUo
bV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpKTsKKyAgICBtX2NvbXBpbGF0aW9uQ29u
dGV4dHMucmVzaXplKG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSk7CisKICAgICBm
b3IgKHVuc2lnbmVkIGltcG9ydEluZGV4ID0gMDsgaW1wb3J0SW5kZXggPCBtX21vZHVsZUluZm9y
bWF0aW9uLT5pbXBvcnRzLnNpemUoKTsgKytpbXBvcnRJbmRleCkgewogICAgICAgICBJbXBvcnQq
IGltcG9ydCA9ICZtX21vZHVsZUluZm9ybWF0aW9uLT5pbXBvcnRzW2ltcG9ydEluZGV4XTsKICAg
ICAgICAgaWYgKGltcG9ydC0+a2luZCAhPSBFeHRlcm5hbEtpbmQ6OkZ1bmN0aW9uKQpAQCAtMTMy
LDMxICsxNDksOTIgQEAgdm9pZCBQbGFuOjpydW4oKQogICAgICAgICBtX2Z1bmN0aW9uSW5kZXhT
cGFjZS5idWZmZXIuZ2V0KClbaW1wb3J0RnVuY3Rpb25JbmRleF0uY29kZSA9IG1fd2FzbVRvSlNT
dHVic1tpbXBvcnRGdW5jdGlvbkluZGV4XS5jb2RlKCkuZXhlY3V0YWJsZUFkZHJlc3MoKTsKICAg
ICB9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5jdGlvbkluZGV4
IDwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyArK2Z1bmN0aW9uSW5kZXgpIHsK
LSAgICAgICAgaWYgKHZlcmJvc2UpCi0gICAgICAgICAgICBkYXRhTG9nTG4oIlByb2Nlc3Npbmcg
ZnVuY3Rpb24gc3RhcnRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0
aW9uSW5kZXhdLnN0YXJ0LCAiIGFuZCBlbmRpbmcgYXQ6ICIsIG1fZnVuY3Rpb25Mb2NhdGlvbklu
QmluYXJ5W2Z1bmN0aW9uSW5kZXhdLmVuZCk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGZ1bmN0
aW9uU3RhcnQgPSBtX3NvdXJjZSArIG1fZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5W2Z1bmN0aW9u
SW5kZXhdLnN0YXJ0OwotICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9u
TG9jYXRpb25JbkJpbmFyeVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25J
bkJpbmFyeVtmdW5jdGlvbkluZGV4XS5zdGFydDsKLSAgICAgICAgQVNTRVJUKGZ1bmN0aW9uTGVu
Z3RoIDw9IG1fc291cmNlTGVuZ3RoKTsKLSAgICAgICAgU2lnbmF0dXJlSW5kZXggc2lnbmF0dXJl
SW5kZXggPSBtX21vZHVsZUluZm9ybWF0aW9uLT5pbnRlcm5hbEZ1bmN0aW9uU2lnbmF0dXJlSW5k
aWNlc1tmdW5jdGlvbkluZGV4XTsKLSAgICAgICAgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUg
PSBTaWduYXR1cmVJbmZvcm1hdGlvbjo6Z2V0KG1fdm0sIHNpZ25hdHVyZUluZGV4KTsKLSAgICAg
ICAgdW5zaWduZWQgZnVuY3Rpb25JbmRleFNwYWNlID0gbV93YXNtVG9KU1N0dWJzLnNpemUoKSAr
IGZ1bmN0aW9uSW5kZXg7Ci0gICAgICAgIEFTU0VSVChtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZm
ZXIuZ2V0KClbZnVuY3Rpb25JbmRleFNwYWNlXS5zaWduYXR1cmVJbmRleCA9PSBzaWduYXR1cmVJ
bmRleCk7CisgICAgbV9jdXJyZW50SW5kZXggPSAwOworCisgICAgYXV0byBkb1dvcmsgPSBbdGhp
c10geworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgdWludDMyX3QgZnVuY3Rp
b25JbmRleDsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhdXRvIGxvY2tlciA9IGhv
bGRMb2NrKG1fbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1fY3VycmVudEluZGV4ID49IG1f
ZnVuY3Rpb25Mb2NhdGlvbkluQmluYXJ5LnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAgICAgICAgIGZ1bmN0aW9uSW5kZXggPSBtX2N1cnJlbnRJbmRleDsKKyAg
ICAgICAgICAgICAgICArK21fY3VycmVudEluZGV4OworICAgICAgICAgICAgfQogCi0gICAgICAg
IEFTU0VSVCh2YWxpZGF0ZUZ1bmN0aW9uKG1fdm0sIGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVu
Z3RoLCBzaWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlv
bikpOworICAgICAgICAgICAgY29uc3QgdWludDhfdCogZnVuY3Rpb25TdGFydCA9IG1fc291cmNl
ICsgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnlbZnVuY3Rpb25JbmRleF0uc3RhcnQ7CisgICAg
ICAgICAgICBzaXplX3QgZnVuY3Rpb25MZW5ndGggPSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFy
eVtmdW5jdGlvbkluZGV4XS5lbmQgLSBtX2Z1bmN0aW9uTG9jYXRpb25JbkJpbmFyeVtmdW5jdGlv
bkluZGV4XS5zdGFydDsKKyAgICAgICAgICAgIEFTU0VSVChmdW5jdGlvbkxlbmd0aCA8PSBtX3Nv
dXJjZUxlbmd0aCk7CisgICAgICAgICAgICBTaWduYXR1cmVJbmRleCBzaWduYXR1cmVJbmRleCA9
IG1fbW9kdWxlSW5mb3JtYXRpb24tPmludGVybmFsRnVuY3Rpb25TaWduYXR1cmVJbmRpY2VzW2Z1
bmN0aW9uSW5kZXhdOworICAgICAgICAgICAgY29uc3QgU2lnbmF0dXJlKiBzaWduYXR1cmUgPSBT
aWduYXR1cmVJbmZvcm1hdGlvbjo6Z2V0KG1fdm0sIHNpZ25hdHVyZUluZGV4KTsKKyAgICAgICAg
ICAgIHVuc2lnbmVkIGZ1bmN0aW9uSW5kZXhTcGFjZSA9IG1fd2FzbVRvSlNTdHVicy5zaXplKCkg
KyBmdW5jdGlvbkluZGV4OworICAgICAgICAgICAgQVNTRVJUX1VOVVNFRChmdW5jdGlvbkluZGV4
U3BhY2UsIG1fZnVuY3Rpb25JbmRleFNwYWNlLmJ1ZmZlci5nZXQoKVtmdW5jdGlvbkluZGV4U3Bh
Y2VdLnNpZ25hdHVyZUluZGV4ID09IHNpZ25hdHVyZUluZGV4KTsKKyAgICAgICAgICAgIEFTU0VS
VCh2YWxpZGF0ZUZ1bmN0aW9uKG1fdm0sIGZ1bmN0aW9uU3RhcnQsIGZ1bmN0aW9uTGVuZ3RoLCBz
aWduYXR1cmUsIG1fZnVuY3Rpb25JbmRleFNwYWNlLCAqbV9tb2R1bGVJbmZvcm1hdGlvbikpOwor
CisgICAgICAgICAgICBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdID0g
VmVjdG9yPFVubGlua2VkV2FzbVRvV2FzbUNhbGw+KCk7CisgICAgICAgICAgICBhdXRvIHBhcnNl
QW5kQ29tcGlsZVJlc3VsdCA9IHBhcnNlQW5kQ29tcGlsZSgqbV92bSwgbV9jb21waWxhdGlvbkNv
bnRleHRzW2Z1bmN0aW9uSW5kZXhdLCBmdW5jdGlvblN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2ln
bmF0dXJlLCBtX3VubGlua2VkV2FzbVRvV2FzbUNhbGxzW2Z1bmN0aW9uSW5kZXhdLCBtX2Z1bmN0
aW9uSW5kZXhTcGFjZSwgKm1fbW9kdWxlSW5mb3JtYXRpb24pOworCisgICAgICAgICAgICBpZiAo
VU5MSUtFTFkoIXBhcnNlQW5kQ29tcGlsZVJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICBhdXRv
IGxvY2tlciA9IGhvbGRMb2NrKG1fbG9jayk7CisgICAgICAgICAgICAgICAgaWYgKCFtX2Vycm9y
TWVzc2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBNdWx0aXBsZSBjb21waWxlcyBjb3Vs
ZCBmYWlsIHNpbXVsdGFuZW91c2x5LiBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIGZpcnN0Lgor
ICAgICAgICAgICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3Vs
dC5lcnJvcigpOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQuCisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIG1fY3VycmVudEluZGV4ID0gbV9mdW5jdGlvbkxvY2F0aW9u
SW5CaW5hcnkuc2l6ZSgpOwogCi0gICAgICAgIHVubGlua2VkV2FzbVRvV2FzbUNhbGxzLnVuY2hl
Y2tlZEFwcGVuZChWZWN0b3I8VW5saW5rZWRXYXNtVG9XYXNtQ2FsbD4oKSk7Ci0gICAgICAgIGF1
dG8gcGFyc2VBbmRDb21waWxlUmVzdWx0ID0gcGFyc2VBbmRDb21waWxlKCptX3ZtLCBmdW5jdGlv
blN0YXJ0LCBmdW5jdGlvbkxlbmd0aCwgc2lnbmF0dXJlLCB1bmxpbmtlZFdhc21Ub1dhc21DYWxs
cy5hdChmdW5jdGlvbkluZGV4KSwgbV9mdW5jdGlvbkluZGV4U3BhY2UsICptX21vZHVsZUluZm9y
bWF0aW9uKTsKLSAgICAgICAgaWYgKFVOTElLRUxZKCFwYXJzZUFuZENvbXBpbGVSZXN1bHQpKSB7
Ci0gICAgICAgICAgICBtX2Vycm9yTWVzc2FnZSA9IHBhcnNlQW5kQ29tcGlsZVJlc3VsdC5lcnJv
cigpOwotICAgICAgICAgICAgcmV0dXJuOyAvLyBGSVhNRSBtYWtlIHRoaXMgYW4gRXhwZWN0ZWQu
CisgICAgICAgICAgICAgICAgLy8gV2Ugd2lsbCB0ZXJtaW5hdGUgb24gdGhlIG5leHQgZXhlY3V0
aW9uLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgbV93YXNtSW50ZXJuYWxGdW5jdGlvbnNbZnVuY3Rpb25JbmRleF0gPSBXVEZNb3ZlKCpw
YXJzZUFuZENvbXBpbGVSZXN1bHQpOwogICAgICAgICB9Ci0gICAgICAgIG1fd2FzbUludGVybmFs
RnVuY3Rpb25zLnVuY2hlY2tlZEFwcGVuZChXVEZNb3ZlKCpwYXJzZUFuZENvbXBpbGVSZXN1bHQp
KTsKKyAgICB9OworCisgICAgTW9ub3RvbmljVGltZSBzdGFydFRpbWU7CisgICAgaWYgKHZlcmJv
c2UgfHwgT3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpCisgICAgICAgIHN0YXJ0VGltZSA9
IE1vbm90b25pY1RpbWU6Om5vdygpOworCisgICAgdWludDMyX3QgdGhyZWFkQ291bnQgPSBXVEY6
Om51bWJlck9mUHJvY2Vzc29yQ29yZXMoKTsKKyAgICB1aW50MzJfdCBudW1Xb3JrZXJUaHJlYWRz
ID0gdGhyZWFkQ291bnQgLSAxOworICAgIFZlY3RvcjxUaHJlYWRJZGVudGlmaWVyPiB0aHJlYWRz
OworICAgIHRocmVhZHMucmVzZXJ2ZUNhcGFjaXR5KG51bVdvcmtlclRocmVhZHMpOworICAgIGZv
ciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1Xb3JrZXJUaHJlYWRzOyBpKyspCisgICAgICAgIHRo
cmVhZHMudW5jaGVja2VkQXBwZW5kKGNyZWF0ZVRocmVhZCgianNjLndhc20tYjMtY29tcGlsYXRp
b24udGhyZWFkIiwgZG9Xb3JrKSk7CisKKyAgICBkb1dvcmsoKTsgLy8gTGV0IHRoZSBtYWluIHRo
cmVhZCBkbyBzb21lIHdvcmsgdG9vLgorCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51
bVdvcmtlclRocmVhZHM7IGkrKykKKyAgICAgICAgd2FpdEZvclRocmVhZENvbXBsZXRpb24odGhy
ZWFkc1tpXSk7CisKKyAgICBmb3IgKHVpbnQzMl90IGZ1bmN0aW9uSW5kZXggPSAwOyBmdW5jdGlv
bkluZGV4IDwgbV9mdW5jdGlvbkxvY2F0aW9uSW5CaW5hcnkuc2l6ZSgpOyBmdW5jdGlvbkluZGV4
KyspIHsKKyAgICAgICAgeworICAgICAgICAgICAgQ29tcGlsYXRpb25Db250ZXh0JiBjb250ZXh0
ID0gbV9jb21waWxhdGlvbkNvbnRleHRzW2Z1bmN0aW9uSW5kZXhdOworICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIExpbmtCdWZmZXIgbGlua0J1ZmZlcigqbV92bSwgKmNvbnRleHQud2Fz
bUVudHJ5cG9pbnRKSVQsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIG1fd2FzbUludGVybmFs
RnVuY3Rpb25zW2Z1bmN0aW9uSW5kZXhdLT53YXNtRW50cnlwb2ludC5jb21waWxhdGlvbiA9Cisg
ICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QjM6OkNvbXBpbGF0aW9uPihGSU5B
TElaRV9DT0RFKGxpbmtCdWZmZXIsICgiV2FzbSBmdW5jdGlvbiIpKSwgV1RGTW92ZShjb250ZXh0
Lndhc21FbnRyeXBvaW50Qnlwcm9kdWN0cykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICB7CisgICAgICAgICAgICAgICAgTGlua0J1ZmZlciBsaW5rQnVmZmVyKCptX3ZtLCAqY29udGV4
dC5qc0VudHJ5cG9pbnRKSVQsIG51bGxwdHIpOworICAgICAgICAgICAgICAgIGxpbmtCdWZmZXIu
bGluayhjb250ZXh0LmpzRW50cnlwb2ludFRvV2FzbUVudHJ5cG9pbnRDYWxsLCBGdW5jdGlvblB0
cihtX3dhc21JbnRlcm5hbEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+d2FzbUVudHJ5cG9pbnQu
Y29tcGlsYXRpb24tPmNvZGUoKS5leGVjdXRhYmxlQWRkcmVzcygpKSk7CisKKyAgICAgICAgICAg
ICAgICBtX3dhc21JbnRlcm5hbEZ1bmN0aW9uc1tmdW5jdGlvbkluZGV4XS0+anNUb1dhc21FbnRy
eXBvaW50LmNvbXBpbGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1
ZTxCMzo6Q29tcGlsYXRpb24+KEZJTkFMSVpFX0NPREUobGlua0J1ZmZlciwgKCJXYXNtIEpTIGVu
dHJ5cG9pbnQiKSksIFdURk1vdmUoY29udGV4dC5qc0VudHJ5cG9pbnRCeXByb2R1Y3RzKSk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB1bnNpZ25lZCBmdW5jdGlvbkluZGV4
U3BhY2UgPSBtX3dhc21Ub0pTU3R1YnMuc2l6ZSgpICsgZnVuY3Rpb25JbmRleDsKICAgICAgICAg
bV9mdW5jdGlvbkluZGV4U3BhY2UuYnVmZmVyLmdldCgpW2Z1bmN0aW9uSW5kZXhTcGFjZV0uY29k
ZSA9IG1fd2FzbUludGVybmFsRnVuY3Rpb25zW2Z1bmN0aW9uSW5kZXhdLT53YXNtRW50cnlwb2lu
dC5jb21waWxhdGlvbi0+Y29kZSgpLmV4ZWN1dGFibGVBZGRyZXNzKCk7CiAgICAgfQogCisgICAg
aWYgKHZlcmJvc2UgfHwgT3B0aW9uczo6cmVwb3J0Q29tcGlsZVRpbWVzKCkpIHsKKyAgICAgICAg
ZGF0YUxvZ0xuKCJUb29rICIsIChNb25vdG9uaWNUaW1lOjpub3coKSAtIHN0YXJ0VGltZSkubWlj
cm9zZWNvbmRzKCksCisgICAgICAgICAgICAiIHVzIHRvIGNvbXBpbGUgYW5kIGxpbmsgdGhlIG1v
ZHVsZSIpOworICAgIH0KKwogICAgIC8vIFBhdGNoIHRoZSBjYWxsIHNpdGVzIGZvciBlYWNoIFdl
YkFzc2VtYmx5IGZ1bmN0aW9uLgotICAgIGZvciAoYXV0byYgdW5saW5rZWQgOiB1bmxpbmtlZFdh
c21Ub1dhc21DYWxscykgeworICAgIGZvciAoYXV0byYgdW5saW5rZWQgOiBtX3VubGlua2VkV2Fz
bVRvV2FzbUNhbGxzKSB7CiAgICAgICAgIGZvciAoYXV0byYgY2FsbCA6IHVubGlua2VkKQogICAg
ICAgICAgICAgTWFjcm9Bc3NlbWJsZXI6OnJlcGF0Y2hDYWxsKGNhbGwuY2FsbExvY2F0aW9uLCBD
b2RlTG9jYXRpb25MYWJlbChtX2Z1bmN0aW9uSW5kZXhTcGFjZS5idWZmZXIuZ2V0KClbY2FsbC5m
dW5jdGlvbkluZGV4XS5jb2RlKSk7CiAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3dhc20vV2FzbVBsYW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd2Fz
bS9XYXNtUGxhbi5oCShyZXZpc2lvbiAyMTAwMjcpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d2FzbS9XYXNtUGxhbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw3IEBACiAKICNpbmNs
dWRlICJDb21waWxhdGlvblJlc3VsdC5oIgogI2luY2x1ZGUgIlZNLmgiCisjaW5jbHVkZSAiV2Fz
bUIzSVJHZW5lcmF0b3IuaCIKICNpbmNsdWRlICJXYXNtRm9ybWF0LmgiCiAjaW5jbHVkZSA8d3Rm
L0JhZy5oPgogI2luY2x1ZGUgPHd0Zi9UaHJlYWRTYWZlUmVmQ291bnRlZC5oPgpAQCAtMTAzLDEz
ICsxMDQsMTcgQEAgcHJpdmF0ZToKICAgICBCYWc8Q2FsbExpbmtJbmZvPiBtX2NhbGxMaW5rSW5m
b3M7CiAgICAgVmVjdG9yPFdhc21Ub0pTU3R1Yj4gbV93YXNtVG9KU1N0dWJzOwogICAgIFZlY3Rv
cjxzdGQ6OnVuaXF1ZV9wdHI8V2FzbUludGVybmFsRnVuY3Rpb24+PiBtX3dhc21JbnRlcm5hbEZ1
bmN0aW9uczsKKyAgICBWZWN0b3I8Q29tcGlsYXRpb25Db250ZXh0PiBtX2NvbXBpbGF0aW9uQ29u
dGV4dHM7CiAgICAgSW1tdXRhYmxlRnVuY3Rpb25JbmRleFNwYWNlIG1fZnVuY3Rpb25JbmRleFNw
YWNlOwogCiAgICAgVk0qIG1fdm07CisgICAgVmVjdG9yPFZlY3RvcjxVbmxpbmtlZFdhc21Ub1dh
c21DYWxsPj4gbV91bmxpbmtlZFdhc21Ub1dhc21DYWxsczsKICAgICBjb25zdCB1aW50OF90KiBt
X3NvdXJjZTsKICAgICBjb25zdCBzaXplX3QgbV9zb3VyY2VMZW5ndGg7CiAgICAgYm9vbCBtX2Zh
aWxlZCB7IHRydWUgfTsKICAgICBTdHJpbmcgbV9lcnJvck1lc3NhZ2U7CisgICAgdWludDMyX3Qg
bV9jdXJyZW50SW5kZXg7CisgICAgTG9jayBtX2xvY2s7CiB9OwogCiB9IH0gLy8gbmFtZXNwYWNl
IEpTQzo6V2FzbQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>