<?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>30625</bug_id>
          
          <creation_ts>2009-10-21 06:34:17 -0700</creation_ts>
          <short_desc>Implement WebGL on Windows</short_desc>
          <delta_ts>2014-06-04 17:15:22 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>133503</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>45220</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Marrin">cmarrin</reporter>
          <assigned_to name="Chris Marrin">cmarrin</assigned_to>
          <cc>abarth</cc>
    
    <cc>achristensen</cc>
    
    <cc>adele</cc>
    
    <cc>bikoz.r</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>jamesr</cc>
    
    <cc>kbr</cc>
    
    <cc>oliver</cc>
    
    <cc>prideout</cc>
    
    <cc>psawaya</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>wjjeon</cc>
    
    <cc>xanthor+bz</cc>
    
    <cc>zmo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>156468</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2009-10-21 06:34:17 -0700</bug_when>
    <thetext>The first implementation of this could possibly be based on Chrome&apos;s glex implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>256103</commentid>
    <comment_count>1</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-07-26 10:49:24 -0700</bug_when>
    <thetext>We will implement this on top of ANGLE, which is being added here:

    https://bugs.webkit.org/show_bug.cgi?id=42789</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270750</commentid>
    <comment_count>2</comment_count>
      <attachid>65767</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-08-27 14:22:49 -0700</bug_when>
    <thetext>Created attachment 65767
Refactored some non Mac specific OpenGL code out of GraphicsContext3DMac.mm to make ANGLE (libGLESv2) integration easier.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>270809</commentid>
    <comment_count>3</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-27 16:44:51 -0700</bug_when>
    <thetext>I think you&apos;ll find that that code is in fact Mac specific. It depends on the OpenGL 2.1 entry points being linkable, which is only true on Mac OS X. On Windows you can only rely on being able to link against the OpenGL 1.1 entry points; everything else needs to be dynamically looked up.

You might consider looking at WebKit/chromium/src/WebGraphicsContext3DDefaultImpl.cpp and its use of the (currently Chromium specific) app/gfx/gl/gl_bindings.{h,cpp}. This is Chromium&apos;s legacy in-process WebGL implementation and is known to work on Mac, Windows and Linux.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271203</commentid>
    <comment_count>4</comment_count>
      <attachid>65767</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-29 13:11:17 -0700</bug_when>
    <thetext>Comment on attachment 65767
Refactored some non Mac specific OpenGL code out of GraphicsContext3DMac.mm to make ANGLE (libGLESv2) integration easier.

Is someone going to review this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271573</commentid>
    <comment_count>5</comment_count>
      <attachid>65767</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-08-30 12:41:20 -0700</bug_when>
    <thetext>Comment on attachment 65767
Refactored some non Mac specific OpenGL code out of GraphicsContext3DMac.mm to make ANGLE (libGLESv2) integration easier.

It looks like you didn&apos;t do an svn copy to create the GraphicsContext3DOpenGL.cpp file. If you do this:

    svn cp WebCore/platform/graphics/mac/GraphicsContext3DMac.mm WebCore/platform/graphics/GraphicsContextOpenGL.cpp

then svn will remember where the file came from, which both helps with history tracking and makes svn diff show the differences between the old and new files. To avoid having to do any extra work:

1) Move your current GraphicsContext3DOpenGL.cpp to a -saved file
2) do the svn cp
3) delete the copied GraphicsContext3DOpenGL.cpp and replace it with your -saved version.

I believe that will make everything work and show us a better diff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271578</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-08-30 12:46:48 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; I think you&apos;ll find that that code is in fact Mac specific. It depends on the OpenGL 2.1 entry points being linkable, which is only true on Mac OS X. On Windows you can only rely on being able to link against the OpenGL 1.1 entry points; everything else needs to be dynamically looked up.

It will ultimately depend on all these symbols being linkable, it&apos;s true. But these symbols will be linkable on Mac OpenGL, iOS OpenGL ES 2.0 and ANGLE. I don&apos;t see linking with Windows OpenGL ever being a concern here. 

Eventually the plan is to add ifdefs to deal with the naming diffs (with EXT vs without). Other diffs can go into the platform specific versions (GraphicsContext3DMac, GraphicsContextIOS, GraphicsContextANGLE).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271593</commentid>
    <comment_count>7</comment_count>
      <attachid>65767</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-08-30 13:02:00 -0700</bug_when>
    <thetext>Comment on attachment 65767
Refactored some non Mac specific OpenGL code out of GraphicsContext3DMac.mm to make ANGLE (libGLESv2) integration easier.

I&apos;ve already given this patch an r-, but I wanted to give more info for the revised patch:

...

&gt; Index: WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp	(revision 0)
&gt; +++ WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp	(revision 0)
&gt; @@ -0,0 +1,1502 @@
&gt; 
&gt; +
&gt; +#include &quot;ArrayBuffer.h&quot;
&gt; +#include &quot;ArrayBufferView.h&quot;
&gt; +#include &quot;WebGLObject.h&quot;
&gt; +#include &quot;CanvasRenderingContext.h&quot;
&gt; +#include &quot;Float32Array.h&quot;
&gt; +#include &quot;GraphicsContext.h&quot;
&gt; +#include &quot;HTMLCanvasElement.h&quot;
&gt; +#include &quot;ImageBuffer.h&quot;
&gt; +#include &quot;Int32Array.h&quot;
&gt; +#include &quot;NotImplemented.h&quot;
&gt; +#include &quot;Uint8Array.h&quot;
&gt; +#include &lt;CoreGraphics/CGBitmapContext.h&gt;
&gt; +#include &lt;OpenGL/CGLRenderers.h&gt;
&gt; +#include &lt;OpenGL/gl.h&gt;

This file should not have any bare CG or OpenGL includes. These are specific to the Mac implementation. The GL includes should be wrapped in a #if PLATFORM(MAC). These should not be any CG specific code in this file (see below).

&gt; +#include &lt;wtf/UnusedParam.h&gt;
&gt; +#include &lt;wtf/text/CString.h&gt;
&gt; +
&gt; +namespace WebCore {
&gt; +    
&gt; +GraphicsContext3D::~GraphicsContext3D()
&gt; +{
&gt; +    if (m_contextObj) {
&gt; +        CGLSetCurrentContext(m_contextObj);
&gt; +        ::glDeleteTextures(1, &amp;m_texture);
&gt; +        if (m_attrs.antialias) {
&gt; +            ::glDeleteRenderbuffersEXT(1, &amp;m_multisampleColorBuffer);
&gt; +            if (m_attrs.stencil || m_attrs.depth)
&gt; +                ::glDeleteRenderbuffersEXT(1, &amp;m_multisampleDepthStencilBuffer);
&gt; +            ::glDeleteFramebuffersEXT(1, &amp;m_multisampleFBO);
&gt; +        } else {
&gt; +            if (m_attrs.stencil || m_attrs.depth)
&gt; +                ::glDeleteRenderbuffersEXT(1, &amp;m_depthStencilBuffer);
&gt; +        }
&gt; +        ::glDeleteFramebuffersEXT(1, &amp;m_fbo);
&gt; +        CGLSetCurrentContext(0);
&gt; +        CGLDestroyContext(m_contextObj);
&gt; +    }
&gt; +}

This function should not be here since it is CG specific. It should be in GraphicsContext3DMac.


&gt; ...
&gt; +
&gt; +void GraphicsContext3D::makeContextCurrent()
&gt; +{
&gt; +    CGLSetCurrentContext(m_contextObj);
&gt; +}

This function should also be in GraphicsContext3DMac.


&gt; ...
&gt; +
&gt; +bool GraphicsContext3D::isGLES2Compliant() const
&gt; +{
&gt; +    return false;
&gt; +}
&gt; +
&gt; +bool GraphicsContext3D::isGLES2NPOTStrict() const
&gt; +{
&gt; +    return false;
&gt; +}
&gt; +
&gt; +bool GraphicsContext3D::isErrorGeneratedOnOutOfBoundsAccesses() const
&gt; +{
&gt; +    return false;
&gt; +}

Some or all of these 3 functions probably need to be in the platform specific code


&gt; +
&gt; +void GraphicsContext3D::reshape(int width, int height)
&gt; +{
&gt; +    if (width == m_currentWidth &amp;&amp; height == m_currentHeight || !m_contextObj)
&gt; +        return;
&gt; +
&gt; +    m_currentWidth = width;
&gt; +    m_currentHeight = height;
&gt; +
&gt; +    CGLSetCurrentContext(m_contextObj);

Need to replace this with makeContextCurrent().


&gt; ...
&gt; +
&gt; +static inline void ensureContext(CGLContextObj context)
&gt; +{
&gt; +    if (!context)
&gt; +        return;
&gt; +
&gt; +    CGLContextObj currentContext = CGLGetCurrentContext();
&gt; +    if (currentContext != context)
&gt; +        CGLSetCurrentContext(context);
&gt; +}

This needs to be replaced by a member function and that function needs to be in platform specific code. The new function would not need a passed object, it can just use m_contextObj (or the equivalent on other platforms). In fact, we should probably get rid of makeContextCurrent and just use ensureContext() everywhere. The only difference is that ensureContext just checks the current context and skips the set if it&apos;s already set, as an optimization.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273151</commentid>
    <comment_count>8</comment_count>
      <attachid>66310</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-01 18:36:47 -0700</bug_when>
    <thetext>Created attachment 66310
Made requested changes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273394</commentid>
    <comment_count>9</comment_count>
      <attachid>66310</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-02 08:17:56 -0700</bug_when>
    <thetext>Comment on attachment 66310
Made requested changes

Patch looks good, but you still need a Changelog. It can be generated using WebKitTools/Scripts/prepareChangelog.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273419</commentid>
    <comment_count>10</comment_count>
      <attachid>66380</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-02 09:42:20 -0700</bug_when>
    <thetext>Created attachment 66380
Added ChangeLog

Oops, sorry about that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273431</commentid>
    <comment_count>11</comment_count>
      <attachid>66380</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-02 10:06:13 -0700</bug_when>
    <thetext>Comment on attachment 66380
Added ChangeLog

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

&gt; WebCore/ChangeLog:5
&gt; +        Refactored out Mac specific code for platform/graphics/mac/GraphicsContext3D.mm file, leaving general OpenGL code in platform/graphics/GraphicsContext3D.cpp.


Try to avoid wrapping here (and don&apos;t use tabs when you wrap it yourself). And the OpenGL code is in GraphicsContext3DOpenGL, right?

r+ with those things fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274027</commentid>
    <comment_count>12</comment_count>
      <attachid>66518</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-03 10:48:59 -0700</bug_when>
    <thetext>Created attachment 66518
Fixed changelog</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274161</commentid>
    <comment_count>13</comment_count>
      <attachid>66518</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-09-03 13:53:16 -0700</bug_when>
    <thetext>Comment on attachment 66518
Fixed changelog

Rejecting patch 66518 from commit-queue.

Failed to run &quot;[u&apos;/Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply&apos;, u&apos;--reviewer&apos;, u&apos;Chris Marrin&apos;, u&apos;--force&apos;]&quot; exit_code: 2
Parsed 7 diffs from patch file(s).
cp: platform/graphics/mac/GraphicsContext3DMac.mm: No such file or directory
Failed to copy platform/graphics/mac/GraphicsContext3DMac.mm platform/graphics/GraphicsContext3DOpenGL.cpp. at /Users/eseidel/Projects/CommitQueue/WebKitTools/Scripts/svn-apply line 416.

Full output: http://queues.webkit.org/results/3943086</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274278</commentid>
    <comment_count>14</comment_count>
      <attachid>66568</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-03 17:17:00 -0700</bug_when>
    <thetext>Created attachment 66568
Fixed paths in patch, hopefully this one will apply</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274279</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-03 17:19:19 -0700</bug_when>
    <thetext>Attachment 66568 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:35:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:330:  Extra space after ( in function call  [whitespace/parens] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:798:  Should have a space between // and comment  [whitespace/comments] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:1192:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:1256:  An else should appear on the same line as the preceding }  [whitespace/newline] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:1241:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:1258:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp:1429:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Total errors found: 8 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>274295</commentid>
    <comment_count>16</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-03 17:50:39 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/66781</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274301</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-03 18:00:56 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/66781 might have broken Chromium Linux Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274309</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-03 18:10:51 -0700</bug_when>
    <thetext>Attachment 66568 did not build on chromium:
Build output: http://queues.webkit.org/results/3976080</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274310</commentid>
    <comment_count>19</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-03 18:12:53 -0700</bug_when>
    <thetext>I like the intent of this patch a lot, but I&apos;m going to have to revert it as it breaks the build in several ways.  First you&apos;ve changed the interface of GraphicsContext3D without updating all implementations (Qt and Chromium also have implementations of GraphicsContext3D).  Second you&apos;ve added a file to platform/graphics that will only compile on a mac without adding #if PLATFORM() guards.  I&apos;m happy to help you fix all of those, as I&apos;d like to use a common implementation of most of the GraphicsContext3D interface, but since it&apos;s very late on a Friday before a long weekend reverting seems more prudent.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274360</commentid>
    <comment_count>20</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-04 06:17:06 -0700</bug_when>
    <thetext>This should have not been closed. This is only a patch to prepare for the WebGL Windows work. Other patches are coming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274622</commentid>
    <comment_count>21</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-06 07:40:31 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; I like the intent of this patch a lot, but I&apos;m going to have to revert it as it breaks the build in several ways.  First you&apos;ve changed the interface of GraphicsContext3D without updating all implementations (Qt and Chromium also have implementations of GraphicsContext3D).  Second you&apos;ve added a file to platform/graphics that will only compile on a mac without adding #if PLATFORM() guards.  I&apos;m happy to help you fix all of those, as I&apos;d like to use a common implementation of most of the GraphicsContext3D interface, but since it&apos;s very late on a Friday before a long weekend reverting seems more prudent.

That is reasonable. But this is not mac specific. It is designed for any system that uses an OpenGL 2.x or OpenGL ES 2.0 API. That includes desktop OpenGL like Mac, true OpenGL ES 2.0 systems and ANGLE systems. Seems like perhaps it would be appropriate to put this into an opengl subdir. 

Sorry about the API change. Let&apos;s work together to get this back in. For now I will redo this patch and add the appropriate API to the other interfaces. It seems like if we put this into a subdir and only include it on the appropriate platforms, we shouldn&apos;t need any ifdefs, right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275286</commentid>
    <comment_count>22</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2010-09-07 14:18:30 -0700</bug_when>
    <thetext>(In reply to comment #21)
&gt; (In reply to comment #19)
&gt; &gt; I like the intent of this patch a lot, but I&apos;m going to have to revert it as it breaks the build in several ways.  First you&apos;ve changed the interface of GraphicsContext3D without updating all implementations (Qt and Chromium also have implementations of GraphicsContext3D).  Second you&apos;ve added a file to platform/graphics that will only compile on a mac without adding #if PLATFORM() guards.  I&apos;m happy to help you fix all of those, as I&apos;d like to use a common implementation of most of the GraphicsContext3D interface, but since it&apos;s very late on a Friday before a long weekend reverting seems more prudent.
&gt; 
&gt; That is reasonable. But this is not mac specific. It is designed for any system that uses an OpenGL 2.x or OpenGL ES 2.0 API. That includes desktop OpenGL like Mac, true OpenGL ES 2.0 systems and ANGLE systems. Seems like perhaps it would be appropriate to put this into an opengl subdir. 
&gt; 
&gt; Sorry about the API change. Let&apos;s work together to get this back in. For now I will redo this patch and add the appropriate API to the other interfaces. It seems like if we put this into a subdir and only include it on the appropriate platforms, we shouldn&apos;t need any ifdefs, right?

I noticed a few CoreGraphics calls that were not guarded by any #if()s - for example http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp?rev=66781#L90.  These are more likely just omissions, however.

The only change in GraphicsContext3D.h was to rename makeContextCurrent() to ensureContext().  I think that without that change this patch can land OK so long as GraphicsContext3DOpenGL.cpp only ever compiles on a mac.  I think it would be a useful step to still create that file, leave it in mac/ and then move it to a common location when all the CoreGraphics stuff is removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275671</commentid>
    <comment_count>23</comment_count>
      <attachid>66856</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-08 01:33:50 -0700</bug_when>
    <thetext>Created attachment 66856
Moved into /mac, build only on Mac

Okay, I&apos;m moving GCD3DOGL out of the gypi so that it will only build with xcode. I&apos;m leaving the prototype for makeContextCurrent in, as I see it&apos;s used in gpu/SharedGraphicsContext3D, and #ifdef-ing ensureContext on only in mac builds.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275672</commentid>
    <comment_count>24</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-08 01:38:45 -0700</bug_when>
    <thetext>Attachment 66856 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:35:  Alphabetical sorting problem.  [build/include_order] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:330:  Extra space after ( in function call  [whitespace/parens] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:437:  Missing space after ,  [whitespace/comma] [3]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:438:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:802:  Should have a space between // and comment  [whitespace/comments] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1196:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1260:  An else should appear on the same line as the preceding }  [whitespace/newline] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1245:  An else statement can be removed when the prior &quot;if&quot; concludes with a return, break, continue or goto statement.  [readability/control_flow] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1262:  One line control clauses should not use braces.  [whitespace/braces] [4]
WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1433:  A case label should not be indented, but line up with its switch statement.  [whitespace/indent] [4]
Total errors found: 10 in 7 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>275832</commentid>
    <comment_count>25</comment_count>
      <attachid>66856</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-08 07:45:33 -0700</bug_when>
    <thetext>Comment on attachment 66856
Moved into /mac, build only on Mac

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

&gt; WebCore/html/canvas/WebGLObject.cpp:63
&gt; +            m_context-&gt;graphicsContext3D()-&gt;ensureContext();
I really want to get rid of ensureContext and make everything use makeContextCurrent(), which should be a member function implemented by each platform.

&gt; WebCore/platform/graphics/GraphicsContext3D.h:432
&gt; +    void ensureContext();
Again, why not just use makeContextCurrent(), and have that function (in the Mac implementation) do the optimization of skipping the set if the context is already set?

&gt; WebCore/platform/graphics/mac/GraphicsContext3DOpenGL.cpp:1
&gt; +/*
This is not Mac specific. Please make a platform/graphics/opengl subdirectory and put it there. For now this file will only be included in Mac builds. But that will change when we do implementations for other platforms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275833</commentid>
    <comment_count>26</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-08 07:47:25 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; ...
&gt; I noticed a few CoreGraphics calls that were not guarded by any #if()s - for example http://trac.webkit.org/browser/trunk/WebCore/platform/graphics/GraphicsContext3DOpenGL.cpp?rev=66781#L90.  These are more likely just omissions, however.

Yes, that call should be replaced by makeContextCurrent().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275924</commentid>
    <comment_count>27</comment_count>
      <attachid>66912</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-08 10:38:12 -0700</bug_when>
    <thetext>Created attachment 66912
makeContextCurrent, not ensureContext.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275940</commentid>
    <comment_count>28</comment_count>
      <attachid>66912</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-08 11:05:02 -0700</bug_when>
    <thetext>Comment on attachment 66912
makeContextCurrent, not ensureContext.

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

&gt; WebCore/platform/graphics/ANGLEWebKitBridge.h:41
&gt; +
Can you remove this extra line to avoid this spurious file in the patch?

&gt; WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:273
&gt; +    CGLSetCurrentContext(m_contextObj);
Need to replace this with makeContextCurrent()

&gt; WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:332
&gt; +    CGLSetCurrentContext(m_contextObj);
Need to replace this with makeContextCurrent()

&gt; WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:45
&gt;  #include &lt;OpenGL/CGLRenderers.h&gt;
You shouldn&apos;t need this here, should you? There should be no CGL specific calls left in this file.

&gt; WebCore/platform/graphics/opengl/GraphicsContext3DOpenGL.cpp:439
&gt; +
Should get rid of debugging statements like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275961</commentid>
    <comment_count>29</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-08 11:38:15 -0700</bug_when>
    <thetext>Also, could you please regenerate the ChangeLog by copying your comments to another file, svn reverting it, and rerunning prepare-ChangeLog? It&apos;s out of date (indicates that GraphicsContext3D.h is being modified when it isn&apos;t any more, etc.).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275971</commentid>
    <comment_count>30</comment_count>
      <attachid>66922</attachid>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-08 11:59:45 -0700</bug_when>
    <thetext>Created attachment 66922
Removed CGL calls</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>275975</commentid>
    <comment_count>31</comment_count>
      <attachid>66922</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-09-08 12:06:47 -0700</bug_when>
    <thetext>Comment on attachment 66922
Removed CGL calls

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

&gt; WebCore/ChangeLog:11
&gt; +        No new tests. (OOPS!)
You need to remove this OOPS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276006</commentid>
    <comment_count>32</comment_count>
    <who name="Paul Sawaya">psawaya</who>
    <bug_when>2010-09-08 12:49:10 -0700</bug_when>
    <thetext>Are you asking that an additional test be designed, or that I just edit the OOPS out of the Changelog?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>276034</commentid>
    <comment_count>33</comment_count>
      <attachid>66922</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-09-08 13:50:33 -0700</bug_when>
    <thetext>Comment on attachment 66922
Removed CGL calls

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

Looks good. r=me. I will land this by hand and remove the OOPS.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324809</commentid>
    <comment_count>34</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-12-20 22:37:53 -0800</bug_when>
    <thetext>Was this landed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>324981</commentid>
    <comment_count>35</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2010-12-21 06:33:30 -0800</bug_when>
    <thetext>Sorry, my bad. This was landed in http://trac.webkit.org/changeset/66781, with minor fixes in http://trac.webkit.org/changeset/67226, http://trac.webkit.org/changeset/67227, and http://trac.webkit.org/changeset/67228</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>420738</commentid>
    <comment_count>36</comment_count>
    <who name="Won Jeon">wjjeon</who>
    <bug_when>2011-06-14 14:45:23 -0700</bug_when>
    <thetext>On Mac, we have &quot;defaults write com.apple.Safari WebKitWebGLEnabled -bool YES&quot; to enable WebGL. How can we enable WebGL on Windows then? Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1013417</commentid>
    <comment_count>37</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2014-06-04 17:15:22 -0700</bug_when>
    <thetext>This was finished in https://bugs.webkit.org/show_bug.cgi?id=133503

*** This bug has been marked as a duplicate of bug 133503 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65767</attachid>
            <date>2010-08-27 14:22:49 -0700</date>
            <delta_ts>2010-09-01 18:36:47 -0700</delta_ts>
            <desc>Refactored some non Mac specific OpenGL code out of GraphicsContext3DMac.mm to make ANGLE (libGLESv2) integration easier.</desc>
            <filename>begin-gcd3d-refactor</filename>
            <type>text/plain</type>
            <size>100234</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29y
ZS5neXBpCShyZXZpc2lvbiA2NjI0MSkKKysrIFdlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5n
IGNvcHkpCkBAIC0yNTQxLDYgKzI1NDMsNyBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzQ29udGV4dC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9H
cmFwaGljc0NvbnRleHQzRC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dDNELmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dDNET3BlbkdMLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NDb250ZXh0UHJpdmF0ZS5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0xheWVyLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvR3Jh
cGhpY3NMYXllci5oJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCShyZXZpc2lvbiA2NjI0MSkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJv
amVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01MzU0LDYgKzUzNTQsNyBAQAogCQlGQUJF
NzJGRTEwNTlDMjExMDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkFCRTcyRkMxMDU5QzIxMTAwRDk5OUREIC8q
IE1hdGhNTE5hbWVzLmNwcCAqLzsgfTsKIAkJRkFDMTJDQzQxMTIwREE2OTAwREFDQzM2IC8qIFJl
bmRlck1hdGhNTFN1YlN1cC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGQUMxMkNDMjExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3Vw
LmNwcCAqLzsgfTsKIAkJRkFDMTJDQzUxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1
YlN1cC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkFD
MTJDQzMxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oICovOyB9OworCQlG
QjU4Q0FFQjEyMjg1ODY1MDA4Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkI1OENBRUExMjI4
NTg2NTAwODc4ODUxIC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCAqLzsgfTsKIAkJRkU2
RkQ0ODgwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVzLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4NTBGNjc2RTU3MDAwOTI4NzMgLyog
Q29vcmRpbmF0ZXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9
OyB9OwogCQlGRTZGRDQ4RDBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRlcy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4QjBGNjc2
RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRlcy5jcHAgKi87IH07CiAJCUZFNkZENDhFMEY2NzZF
OTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4QzBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGlu
YXRlcy5oICovOyB9OwpAQCAtMTEyMjksNiArMTEyMzAsNyBAQAogCQlGQUJFNzJGQzEwNTlDMjEx
MDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gTWF0aE1MTmFtZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlG
QUMxMkNDMjExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNwcCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlck1hdGhNTFN1YlN1cC5jcHA7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZBQzEyQ0MzMTEyMERBNjkwMERBQ0MzNiAvKiBS
ZW5kZXJNYXRoTUxTdWJTdXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVu
ZGVyTWF0aE1MU3ViU3VwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZCNThDQUVB
MTIyODU4NjUwMDg3ODg1MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHA7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFNDlFRjk3MERDNTE0NjIwMDQyNjZFMSAv
KiBEYXNoYm9hcmRTdXBwb3J0Q1NTUHJvcGVydHlOYW1lcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBh
dGggPSBEYXNoYm9hcmRTdXBwb3J0Q1NTUHJvcGVydHlOYW1lcy5pbjsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJRkU2RkQ0ODUwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVzLmgg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvb3JkaW5hdGVzLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFNkZENDg2MEY2NzZFNTcwMDA5Mjg3MyAvKiBDb29yZGlu
YXRlcy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ29vcmRpbmF0ZXMuaWRsOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTU4MzAsNiArMTU4MzIsNyBAQAogCQlCMkEwMTU5MTBB
RjZDRDUzMDA2QkNFMEUgLyogZ3JhcGhpY3MgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJ
CWNoaWxkcmVuID0gKAorCQkJCUZCNThDQUVBMTIyODU4NjUwMDg3ODg1MSAvKiBHcmFwaGljc0Nv
bnRleHQzRE9wZW5HTC5jcHAgKi8sCiAJCQkJQjI3NTM1MjkwQjA1MzgxNDAwMkNFNjRGIC8qIGNn
ICovLAogCQkJCUE3NUU4QjdGMEUxREUyQjAwMDdGMjQ4MSAvKiBmaWx0ZXJzICovLAogCQkJCUIy
NzUzNTQ5MEIwNTM4MTQwMDJDRTY0RiAvKiBtYWMgKi8sCkBAIC0yMjg0MSw2ICsyMjg0NCw3IEBA
CiAJCQkJODk2ODZDOUYxMjIyNDRBMDAwNzZFQUE0IC8qIERPTUZpbGVQYXRoLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCTg5NDdBODI5MTIyMjJDNDcwMEQ5NUYyRCAvKiBKU01ldGFkYXRhLmNwcCBp
biBTb3VyY2VzICovLAogCQkJCTg5NDdBODJCMTIyMjJDNDcwMEQ5NUYyRCAvKiBKU01ldGFkYXRh
Q2FsbGJhY2suY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkI1OENBRUIxMjI4NTg2NTAwODc4ODUx
IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5H
TC5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
Q29udGV4dDNET3BlbkdMLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNTAyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKDNEX0NBTlZBUykKKworI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCisKKyNpbmNsdWRlICJBcnJheUJ1ZmZlci5oIgor
I2luY2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgorI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCisj
aW5jbHVkZSAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgIkZsb2F0MzJBcnJh
eS5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIkhUTUxDYW52YXNF
bGVtZW50LmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKKyNpbmNsdWRlICJJbnQzMkFycmF5
LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJVaW50OEFycmF5Lmgi
CisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2luY2x1ZGUgPE9w
ZW5HTC9DR0xSZW5kZXJlcnMuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDx3
dGYvVW51c2VkUGFyYW0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKyAgICAKK0dyYXBoaWNzQ29udGV4dDNEOjp+R3JhcGhpY3NDb250ZXh0
M0QoKQoreworICAgIGlmIChtX2NvbnRleHRPYmopIHsKKyAgICAgICAgQ0dMU2V0Q3VycmVudENv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAgICAgOjpnbERlbGV0ZVRleHR1cmVzKDEsICZtX3Rl
eHR1cmUpOworICAgICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgICAgIDo6
Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwor
ICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAg
ICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRGVw
dGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgICAgIDo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQo
MSwgJm1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYg
KG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgICAgIDo6Z2xE
ZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAg
IH0KKyAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmbV9mYm8pOworICAgICAg
ICBDR0xTZXRDdXJyZW50Q29udGV4dCgwKTsKKyAgICAgICAgQ0dMRGVzdHJveUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRl
QXR0cmlidXRlcygpCit7CisgICAgY29uc3QgY2hhciogZXh0ZW5zaW9ucyA9IHJlaW50ZXJwcmV0
X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOworICAgIGlm
IChtX2F0dHJzLnN0ZW5jaWwpIHsKKyAgICAgICAgaWYgKHN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMs
ICJHTF9FWFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwiKSkgeworICAgICAgICAgICAgaWYgKCFtX2F0
dHJzLmRlcHRoKQorICAgICAgICAgICAgICAgIG1fYXR0cnMuZGVwdGggPSB0cnVlOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIG1fYXR0cnMuc3RlbmNpbCA9IGZhbHNlOworICAgIH0KKyAg
ICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgYm9vbCBpc1ZhbGlkVmVuZG9yID0g
dHJ1ZTsKKyAgICAgICAgLy8gQ3VycmVudGx5IGluIE1hYyB3ZSBvbmx5IHR1cm4gb24gYW50aWFs
aWFzIGlmIHZlbmRvciBpcyBOVklESUEuCisgICAgICAgIGNvbnN0IGNoYXIqIHZlbmRvciA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfVkVORE9SKSk7Cisg
ICAgICAgIGlmICghc3RkOjpzdHJzdHIodmVuZG9yLCAiTlZJRElBIikpCisgICAgICAgICAgICBp
c1ZhbGlkVmVuZG9yID0gZmFsc2U7CisgICAgICAgIGlmICghaXNWYWxpZFZlbmRvciB8fCAhc3Rk
OjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSIpKQor
ICAgICAgICAgICAgbV9hdHRycy5hbnRpYWxpYXMgPSBmYWxzZTsKKyAgICB9CisgICAgLy8gRklY
TUU6IGluc3RlYWQgb2YgZW5mb3JjaW5nIHByZW11bHRpcGxpZWRBbHBoYSA9IHRydWUsIGltcGxl
bWVudCB0aGUKKyAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gcHJlbXVsdGlwbGllZEFscGhh
ID0gZmFsc2UgaXMgcmVxdWVzdGVkLgorICAgIG1fYXR0cnMucHJlbXVsdGlwbGllZEFscGhhID0g
dHJ1ZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bWFrZUNvbnRleHRDdXJyZW50KCkK
K3sKKyAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jlc3VsdHNUb0NhbnZhcyhDYW52YXNSZW5k
ZXJpbmdDb250ZXh0KiBjb250ZXh0KQoreworICAgIEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXMg
PSBjb250ZXh0LT5jYW52YXMoKTsKKyAgICBJbWFnZUJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYW52
YXMtPmJ1ZmZlcigpOworCisgICAgaW50IHJvd0J5dGVzID0gbV9jdXJyZW50V2lkdGggKiA0Owor
ICAgIGludCB0b3RhbEJ5dGVzID0gcm93Qnl0ZXMgKiBtX2N1cnJlbnRIZWlnaHQ7CisKKyAgICBP
d25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiBwaXhlbHMobmV3IHVuc2lnbmVkIGNoYXJbdG90YWxC
eXRlc10pOworICAgIGlmICghcGl4ZWxzKQorICAgICAgICByZXR1cm47CisKKyAgICBDR0xTZXRD
dXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgYm9vbCBtdXN0UmVzdG9yZUZCTyA9
IGZhbHNlOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgeworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsK
KyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdp
ZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWln
aHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIG11c3RSZXN0
b3JlRkJPID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9ib3VuZEZCTyAhPSBt
X2ZibykgeworICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOworICAgICAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIEdMaW50IHBhY2tBbGlnbm1lbnQgPSA0OworICAgIGJvb2wgbXVz
dFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gZmFsc2U7CisgICAgOjpnbEdldEludGVnZXJ2KEdMX1BB
Q0tfQUxJR05NRU5ULCAmcGFja0FsaWdubWVudCk7CisgICAgaWYgKHBhY2tBbGlnbm1lbnQgPiA0
KSB7CisgICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgNCk7CisgICAg
ICAgIG11c3RSZXN0b3JlUGFja0FsaWdubWVudCA9IHRydWU7CisgICAgfQorCisgICAgOjpnbFJl
YWRQaXhlbHMoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQkdSQSwg
R0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBwaXhlbHMuZ2V0KCkpOworCisgICAgaWYgKG11
c3RSZXN0b3JlUGFja0FsaWdubWVudCkKKyAgICAgICAgOjpnbFBpeGVsU3RvcmVpKEdMX1BBQ0tf
QUxJR05NRU5ULCBwYWNrQWxpZ25tZW50KTsKKworICAgIGlmIChtdXN0UmVzdG9yZUZCTykKKyAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRG
Qk8pOworCisgICAgcGFpbnRUb0NhbnZhcyhwaXhlbHMuZ2V0KCksIG1fY3VycmVudFdpZHRoLCBt
X2N1cnJlbnRIZWlnaHQsCisgICAgICAgICAgICAgICAgICBjYW52YXMtPndpZHRoKCksIGNhbnZh
cy0+aGVpZ2h0KCksIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpKTsK
K30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMy
TlBPVFN0cmljdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEdyYXBo
aWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVkT25PdXRPZkJvdW5kc0FjY2Vzc2VzKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJl
c2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGlmICh3aWR0aCA9PSBtX2N1cnJl
bnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFtX2NvbnRleHRPYmopCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fY3VycmVudFdpZHRoID0gd2lkdGg7CisgICAgbV9jdXJy
ZW50SGVpZ2h0ID0gaGVpZ2h0OworCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0
T2JqKTsKKworICAgIEdMdWludCBpbnRlcm5hbENvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50
ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSAwOworICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Cisg
ICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0JBODsKKyAgICAgICAgY29sb3JGb3Jt
YXQgPSBHTF9SR0JBOworICAgIH0gZWxzZSB7CisgICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQg
PSBHTF9SR0I4OworICAgICAgICBjb2xvckZvcm1hdCA9IEdMX1JHQjsKKyAgICB9CisgICAgaWYg
KG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSB7CisgICAgICAgIC8vIFdlIGRvbid0
IGFsbG93IHRoZSBsb2dpYyB3aGVyZSBzdGVuY2lsIGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBu
b3QuCisgICAgICAgIC8vIFNlZSBHcmFwaGljc0NvbnRleHQzRCBjb25zdHJ1Y3Rvci4KKyAgICAg
ICAgaWYgKG1fYXR0cnMuc3RlbmNpbCAmJiBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgaW50
ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBU
SF9DT01QT05FTlQ7CisgICAgfQorCisgICAgYm9vbCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwor
CisgICAgLy8gcmVzaXplIG11bHRpc2FtcGxlIEZCTworICAgIGlmIChtX2F0dHJzLmFudGlhbGlh
cykgeworICAgICAgICBHTGludCBtYXhTYW1wbGVDb3VudDsKKyAgICAgICAgOjpnbEdldEludGVn
ZXJ2KEdMX01BWF9TQU1QTEVTX0VYVCwgJm1heFNhbXBsZUNvdW50KTsKKyAgICAgICAgR0xpbnQg
c2FtcGxlQ291bnQgPSBzdGQ6Om1pbig4LCBtYXhTYW1wbGVDb3VudCk7CisgICAgICAgIGlmIChz
YW1wbGVDb3VudCA+IG1heFNhbXBsZUNvdW50KQorICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBt
YXhTYW1wbGVDb3VudDsKKyAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZC
TykgeworICAgICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVl
OworICAgICAgICB9CisgICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJV
RkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7CisgICAgICAgIDo6Z2xSZW5kZXJi
dWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291
bnQsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRB
Q0hNRU5UMF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZl
cik7CisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgeworICAg
ICAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgICAgICA6OmdsUmVuZGVyYnVm
ZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50
LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAg
ICBpZiAobV9hdHRycy5zdGVuY2lsKQorICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJl
bmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9F
WFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIp
OworICAgICAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAgICAgICAgOjpnbEZy
YW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRU
QUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdM
X1JFTkRFUkJVRkZFUl9FWFQsIDApOworICAgICAgICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3Rh
dHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhU
KSB7CisgICAgICAgICAgICAvLyBGSVhNRTogY2xlYW51cC4KKyAgICAgICAgICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZXNpemUgcmVndWxhciBGQk8K
KyAgICBpZiAobV9ib3VuZEZCTyAhPSBtX2ZibykgeworICAgICAgICBtdXN0UmVzdG9yZUZCTyA9
IHRydWU7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3Rl
eHR1cmUpOworICAgIDo6Z2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29s
b3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGNvbG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRF
LCAwKTsKKyAgICA6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7
CisgICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOworICAgIGlmICghbV9hdHRy
cy5hbnRpYWxpYXMgJiYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSkgeworICAg
ICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRo
U3RlbmNpbEJ1ZmZlcik7CisgICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JF
TkRFUkJVRkZFUl9FWFQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0
KTsKKyAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKKyAgICAgICAgICAgIDo6Z2xGcmFtZWJ1
ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNI
TUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAg
ICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5k
ZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwg
R0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICA6Omds
QmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAwKTsKKyAgICB9CisgICAg
aWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdM
X0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgeworICAgICAgICAvLyBGSVhNRTogY2xlYW51cAor
ICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIH0KKworICAgIGlmIChtX2F0dHJzLmFudGlh
bGlhcykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlz
YW1wbGVGQk8pCisgICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOworICAgIH0KKwor
ICAgIC8vIEluaXRpYWxpemUgcmVuZGVyYnVmZmVycyB0byAwLgorICAgIEdMYm9vbGVhbiBjb2xv
ck1hc2tbXSA9IHtHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNr
ID0gR0xfVFJVRSwgc3RlbmNpbE1hc2sgPSBHTF9UUlVFOworICAgIEdMYm9vbGVhbiBpc1NjaXNz
b3JFbmFibGVkID0gR0xfRkFMU0U7CisgICAgR0xib29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdM
X0ZBTFNFOworICAgIEdMYml0ZmllbGQgY2xlYXJNYXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsK
KyAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfQ09MT1JfV1JJVEVNQVNLLCBjb2xvck1hc2spOworICAg
IDo6Z2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7CisgICAg
aWYgKG1fYXR0cnMuZGVwdGgpIHsKKyAgICAgICAgOjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dS
SVRFTUFTSywgJmRlcHRoTWFzayk7CisgICAgICAgIDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Cisg
ICAgICAgIGNsZWFyTWFzayB8PSBHTF9ERVBUSF9CVUZGRVJfQklUOworICAgIH0KKyAgICBpZiAo
bV9hdHRycy5zdGVuY2lsKSB7CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dS
SVRFTUFTSywgJnN0ZW5jaWxNYXNrKTsKKyAgICAgICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUp
OworICAgICAgICBjbGVhck1hc2sgfD0gR0xfU1RFTkNJTF9CVUZGRVJfQklUOworICAgIH0KKyAg
ICBpc1NjaXNzb3JFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9TQ0lTU09SX1RFU1QpOworICAg
IDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgaXNEaXRoZXJFbmFibGVkID0gOjpn
bElzRW5hYmxlZChHTF9ESVRIRVIpOworICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAg
ICA6OmdsQ2xlYXIoY2xlYXJNYXNrKTsKKworICAgIDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBd
LCBjb2xvck1hc2tbMV0sIGNvbG9yTWFza1syXSwgY29sb3JNYXNrWzNdKTsKKyAgICBpZiAobV9h
dHRycy5kZXB0aCkKKyAgICAgICAgOjpnbERlcHRoTWFzayhkZXB0aE1hc2spOworICAgIGlmICht
X2F0dHJzLnN0ZW5jaWwpCisgICAgICAgIDo6Z2xTdGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Cisg
ICAgaWYgKGlzU2Npc3NvckVuYWJsZWQpCisgICAgICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9U
RVNUKTsKKyAgICBlbHNlCisgICAgICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Cisg
ICAgaWYgKGlzRGl0aGVyRW5hYmxlZCkKKyAgICAgICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwor
ICAgIGVsc2UKKyAgICAgICAgOjpnbERpc2FibGUoR0xfRElUSEVSKTsKKworICAgIGlmIChtdXN0
UmVzdG9yZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZF
Ul9FWFQsIG1fYm91bmRGQk8pOworCisgICAgOjpnbEZsdXNoKCk7Cit9CisKK3N0YXRpYyBpbmxp
bmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRleHRPYmogY29udGV4dCkKK3sKKyAgICBpZiAo
IWNvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIENHTENvbnRleHRPYmogY3VycmVudENv
bnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50Q29udGV4dCAh
PSBjb250ZXh0KQorICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAg
ICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0
aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFN
RUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAw
LCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwg
bV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7
CisgICAgfQorICAgIDo6Z2xGaW5pc2goKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YWN0aXZlVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRleHR1cmUpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7Cisg
ICAgQVNTRVJUKHNoYWRlcik7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xBdHRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEF0dHJpYkxvY2F0aW9uKFBsYXRmb3JtM0RP
YmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgU3RyaW5nJiBuYW1lKQor
eworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgOjpnbEJpbmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBpbmRleCwgbmFt
ZS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZl
cih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdldCwg
KEdMdWludCkgYnVmZmVyKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJh
bWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTHVpbnQgZmJvOworICAg
IGlmIChidWZmZXIpCisgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOworICAgIGVsc2UKKyAg
ICAgICAgZmJvID0gKG1fYXR0cnMuYW50aWFsaWFzID8gbV9tdWx0aXNhbXBsZUZCTyA6IG1fZmJv
KTsKKyAgICBpZiAoZmJvICE9IG1fYm91bmRGQk8pIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1
ZmZlckVYVCh0YXJnZXQsIGZibyk7CisgICAgICAgIG1fYm91bmRGQk8gPSBmYm87CisgICAgfQor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQodGFyZ2V0
LCAoR0x1aW50KSByZW5kZXJidWZmZXIpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJpbmRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1
cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kVGV4
dHVyZSh0YXJnZXQsIChHTHVpbnQpIHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpibGVuZENvbG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwgZG91YmxlIGJsdWUsIGRv
dWJsZSBhbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bEJsZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0Pihn
cmVlbiksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFscGhh
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2lnbmVk
IGxvbmcgbW9kZSApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xCbGVuZEVxdWF0aW9uKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVu
ZEVxdWF0aW9uU2VwYXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1bnNpZ25lZCBsb25nIG1v
ZGVBbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJs
ZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOworfQorCisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNmYWN0b3IsIHVuc2lnbmVk
IGxvbmcgZGZhY3RvcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
OjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKK30gICAgICAgCisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdCLCB1bnNp
Z25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQgbG9uZyBk
c3RBbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJs
ZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCAwLCB1c2FnZSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0
YXJnZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsb25nIHVzYWdlKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVmZmVyRGF0YSh0
YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBzaXpl
LCBjb25zdCB2b2lkKiBkYXRhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsQnVmZmVyU3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisK
K3Vuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0dXMo
dW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIHJldHVybiA6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVCh0YXJnZXQpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKGRvdWJsZSByLCBkb3VibGUgZywg
ZG91YmxlIGIsIGRvdWJsZSBhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsQ2xlYXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0PGZs
b2F0PihnKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2spCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhcihtYXNrKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhckRlcHRoKGRl
cHRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKGxvbmcgcykK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbENsZWFyU3RlbmNp
bChzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBi
b29sIGdyZWVuLCBib29sIGJsdWUsIGJvb2wgYWxwaGEpCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsYXRmb3JtM0RP
YmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKworICAgIGludCBHTHNoYWRlclR5cGU7CisgICAgQU5HTEVTaGFkZXJU
eXBlIHNoYWRlclR5cGU7CisKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgU0hBREVSX1RZUEUs
ICZHTHNoYWRlclR5cGUpOworCisgICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hBREVS
KQorICAgICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOworICAgIGVsc2UgaWYg
KEdMc2hhZGVyVHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpCisgICAgICAgIHNoYWRlclR5cGUgPSBT
SEFERVJfVFlQRV9GUkFHTUVOVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybjsgLy8gSW52YWxp
ZCBzaGFkZXIgdHlwZS4KKworICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291
cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRl
cik7CisKKyAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBTaGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNlY29u
ZDsKKworICAgIFN0cmluZyB0cmFuc2xhdGVkU2hhZGVyU291cmNlOworICAgIFN0cmluZyBzaGFk
ZXJJbmZvTG9nOworCisgICAgYm9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNoYWRl
clNvdXJjZShlbnRyeS5zb3VyY2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNsYXRl
ZFNoYWRlclNvdXJjZSwgc2hhZGVySW5mb0xvZyk7CisKKyAgICBlbnRyeS5sb2cgPSBzaGFkZXJJ
bmZvTG9nOworICAgIGVudHJ5LmlzVmFsaWQgPSBpc1ZhbGlkOworCisgICAgaWYgKCFpc1ZhbGlk
KQorICAgICAgICByZXR1cm47IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1vdmUg
Zm9yd2FyZCB3aXRoIGNvbXBpbGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKKworICAgIGludCB0
cmFuc2xhdGVkU2hhZGVyTGVuZ3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgoKTsK
KworICAgIGNvbnN0IENTdHJpbmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNsYXRl
ZFNoYWRlclNvdXJjZS51dGY4KCk7CisgICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRlclB0
ciA9IHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nLmRhdGEoKTsKKworICAgIDo6Z2xTaGFkZXJTb3Vy
Y2UoKEdMdWludCkgc2hhZGVyLCAxLCAmdHJhbnNsYXRlZFNoYWRlclB0ciwgJnRyYW5zbGF0ZWRT
aGFkZXJMZW5ndGgpOworCisgICAgOjpnbENvbXBpbGVTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsK
KworICAgIGludCBHTENvbXBpbGVTdWNjZXNzOworCisgICAgOjpnbEdldFNoYWRlcml2KChHTHVp
bnQpIHNoYWRlciwgQ09NUElMRV9TVEFUVVMsICZHTENvbXBpbGVTdWNjZXNzKTsKKworICAgIC8v
IEFTU0VSVCB0aGF0IEFOR0xFIGdlbmVyYXRlZCBHTFNMIHdpbGwgYmUgYWNjZXB0ZWQgYnkgT3Bl
bkdMCisgICAgQVNTRVJUKEdMQ29tcGlsZVN1Y2Nlc3MgPT0gR0xfVFJVRSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBs
b25nIGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwg
dW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xC
aW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVG
Qk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJf
RVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdp
ZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JV
RkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xDb3B5VGV4SW1hZ2UyRCh0
YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVy
KTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2Ft
cGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlU
ZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCBsb25nIHhvZmZz
ZXQsIGxvbmcgeW9mZnNldCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVu
c2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxl
RkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZF
Ul9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVi
dWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkg
KyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xC
aW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorICAg
IDo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4
LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3Vu
ZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEN1bGxGYWNlKG1vZGUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBmdW5jKQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhGdW5jKGZ1bmMpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aE1hc2soYm9vbCBmbGFnKQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91
YmxlIHpGYXIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xE
ZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGV0
YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgUGxhdGZvcm0zRE9iamVjdCBzaGFk
ZXIpCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQp
IHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xEaXNhYmxlKGNhcCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGlzYWJsZVZlcnRleEF0dHJp
YkFycmF5KGluZGV4KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyh1
bnNpZ25lZCBsb25nIG1vZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBj
b3VudCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25l
ZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9u
ZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xE
cmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0
YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEVuYWJsZShjYXApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmli
QXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQorewor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRmluaXNoKCk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNoKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbEZsdXNoKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25l
ZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVydGFyZ2V0LCBQbGF0
Zm9ybTNET2JqZWN0IGJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsKKyAgICBpZiAoYXR0
YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHsKKyAgICAgICAgOjpnbEZyYW1l
YnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVOVCwgcmVuZGVyYnVm
ZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJi
dWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFDSE1FTlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwg
cmVuZGVyYnVmZmVyKTsKKyAgICB9IGVsc2UKKyAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVy
YnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJi
dWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUy
RCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25l
ZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBsb25nIGxldmVsKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRnJhbWVidWZmZXJU
ZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChHTHVpbnQpIHRleHR1
cmUsIGxldmVsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJvbnRGYWNlKHVuc2ln
bmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
OjpnbEZyb250RmFjZShtb2RlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJh
dGVNaXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOworfQorCitib29s
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIoUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQoreworICAgIGlmICgh
cHJvZ3JhbSkgeworICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1p
dihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9M
RU5HVEgsICZtYXhBdHRyaWJ1dGVTaXplKTsKKyAgICBHTGNoYXIgbmFtZVttYXhBdHRyaWJ1dGVT
aXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVy
bWluYXRpb24KKyAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOworICAgIEdMaW50IHNpemUgPSAw
OworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICA6OmdsR2V0QWN0aXZlQXR0cmliKHN0YXRpY19j
YXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4LCBtYXhBdHRyaWJ1dGVTaXplLCAmbmFtZUxlbmd0
aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBpZiAoIW5hbWVMZW5ndGgpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7Cisg
ICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZvLnNpemUgPSBzaXplOworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVVbmlmb3JtKFBsYXRm
b3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5mbyYgaW5m
bykKK3sKKyAgICBpZiAoIXByb2dyYW0pIHsKKyAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5W
QUxJRF9WQUxVRSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsKKyAgICA6
OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9V
TklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7CisgICAgR0xjaGFyIG5hbWVbbWF4
VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51
bGwgdGVybWluYXRpb24KKyAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOworICAgIEdMaW50IHNp
emUgPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICA6OmdsR2V0QWN0aXZlVW5pZm9ybShz
dGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4VW5pZm9ybVNpemUsICZuYW1l
TGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOworICAgIGlmICghbmFtZUxlbmd0aCkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3Ro
KTsKKyAgICBpbmZvLnR5cGUgPSB0eXBlOworICAgIGluZm8uc2l6ZSA9IHNpemU7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGVy
cyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGludCBtYXhDb3VudCwgaW50KiBjb3VudCwgdW5z
aWduZWQgaW50KiBzaGFkZXJzKQoreworICAgIGlmICghcHJvZ3JhbSkgeworICAgICAgICBzeW50
aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldEF0dGFjaGVkU2hhZGVy
cyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQsIHNoYWRlcnMp
OworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9uKFBsYXRmb3Jt
M0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIGlmICghcHJvZ3Jh
bSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIHJldHVybiA6OmdsR2V0QXR0cmliTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgbmFt
ZS51dGY4KCkuZGF0YSgpKTsKK30KKworR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldENvbnRleHRBdHRyaWJ1dGVzKCkKK3sKKyAgICByZXR1cm4gbV9h
dHRyczsKK30KKwordW5zaWduZWQgbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RXJyb3IoKQor
eworICAgIGlmIChtX3N5bnRoZXRpY0Vycm9ycy5zaXplKCkgPiAwKSB7CisgICAgICAgIExpc3RI
YXNoU2V0PHVuc2lnbmVkIGxvbmc+OjppdGVyYXRvciBpdGVyID0gbV9zeW50aGV0aWNFcnJvcnMu
YmVnaW4oKTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBlcnIgPSAqaXRlcjsKKyAgICAgICAgbV9z
eW50aGV0aWNFcnJvcnMucmVtb3ZlKGl0ZXIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0K
KworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpnbEdldEVy
cm9yKCk7Cit9CisKK1N0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U3RyaW5nKHVuc2lnbmVk
IGxvbmcgbmFtZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0
dXJuIFN0cmluZygoY29uc3QgY2hhciopIDo6Z2xHZXRTdHJpbmcobmFtZSkpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpoaW50KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBs
b25nIG1vZGUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xI
aW50KHRhcmdldCwgbW9kZSk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzQnVmZmVy
KFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQoreworICAgIGlmICghYnVmZmVyKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0
dXJuIDo6Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIpOworfQorCitib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6OmdsSXNFbmFibGVkKGNhcCk7Cit9CisKK2Jv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIoUGxhdGZvcm0zRE9iamVjdCBmcmFt
ZWJ1ZmZlcikKK3sKKyAgICBpZiAoIWZyYW1lYnVmZmVyKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc0Zy
YW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKK30KKworYm9vbCBHcmFwaGljc0Nv
bnRleHQzRDo6aXNQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKK3sKKyAgICBpZiAo
IXByb2dyYW0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpnbElzUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsK
K30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNSZW5kZXJidWZmZXIoUGxhdGZvcm0zRE9i
amVjdCByZW5kZXJidWZmZXIpCit7CisgICAgaWYgKCFyZW5kZXJidWZmZXIpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1
cm4gOjpnbElzUmVuZGVyYnVmZmVyRVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Cit9CisKK2Jv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQor
eworICAgIGlmICghc2hhZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBz
aGFkZXIpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0z
RE9iamVjdCB0ZXh0dXJlKQoreworICAgIGlmICghdGV4dHVyZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6Omds
SXNUZXh0dXJlKChHTHVpbnQpIHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpsaW5lV2lkdGgoZG91YmxlIHdpZHRoKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsTGluZVdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpsaW5rUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0pCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxv
bmcgcGFyYW0pCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xQ
aXhlbFN0b3JlaShwbmFtZSwgcGFyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
b2x5Z29uT2Zmc2V0KGRvdWJsZSBmYWN0b3IsIGRvdWJsZSB1bml0cykKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nhc3Q8
ZmxvYXQ+KGZhY3RvciksIHN0YXRpY19jYXN0PGZsb2F0Pih1bml0cykpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25n
IHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2ln
bmVkIGxvbmcgdHlwZSwgdm9pZCogZGF0YSkKK3sKKyAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0
d28gZ2xGbHVzaCBjYWxscyB3aGVuIHRoZSBkcml2ZXIgYnVnIGlzIGZpeGVkLCBpLmUuLAorICAg
IC8vIGFsbCBwcmV2aW91cyByZW5kZXJpbmcgY2FsbHMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJl
YWRpbmcgcGl4ZWxzLgorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
Rmx1c2goKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211
bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9G
UkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xC
bGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Cisg
ICAgICAgIDo6Z2xGbHVzaCgpOworICAgIH0KKyAgICA6OmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0
aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIGRhdGEpOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlh
cyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKK3sKKyAgICAv
LyBGSVhNRTogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5l
ZWQgdG8gaGF2ZSBpZmRlZnMgZm9yIHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgLy86OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVy
KCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5z
aWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVk
IGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CisgICAgY2FzZSBE
RVBUSF9TVEVOQ0lMOgorICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJ
TDhfRVhUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERFUFRIX0NPTVBPTkVOVDE2OgorICAg
ICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBSR0JBNDoKKyAgICBjYXNlIFJHQjVfQTE6CisgICAgICAgIGludGVybmFsZm9y
bWF0ID0gR0xfUkdCQTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSR0I1NjU6CisgICAgICAg
IGludGVybmFsZm9ybWF0ID0gR0xfUkdCOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgOjpn
bFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhl
aWdodCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJs
ZSB2YWx1ZSwgYm9vbCBpbnZlcnQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xTYW1wbGVDb3ZlcmFnZShzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpLCBpbnZl
cnQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKGxvbmcgeCwgbG9uZyB5
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhl
aWdodCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0Zm9y
bTNET2JqZWN0IHNoYWRlciwgY29uc3QgU3RyaW5nJiBzdHJpbmcpCit7CisgICAgQVNTRVJUKHNo
YWRlcik7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBTaGFkZXJT
b3VyY2VFbnRyeSBlbnRyeTsKKworICAgIGVudHJ5LnNvdXJjZSA9IHN0cmluZzsKKworICAgIG1f
c2hhZGVyU291cmNlTWFwLnNldChzaGFkZXIsIGVudHJ5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWdu
ZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsU3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c3RlbmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxv
bmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVu
YywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2so
dW5zaWduZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsU3RlbmNpbE1hc2sobWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnN0ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1h
c2spCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xTdGVuY2ls
TWFza1NlcGFyYXRlKGZhY2UsIG1hc2spOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpz
dGVuY2lsT3AodW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25l
ZCBsb25nIHpwYXNzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsU3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9u
ZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUo
ZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dGV4UGFyYW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1
ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFRleFBhcmFt
ZXRlcmYodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQgdGFyZ2V0LCB1bnNp
Z25lZCBwbmFtZSwgaW50IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9h
dD4odmFsdWUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmKGxvbmcg
bG9jYXRpb24sIGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0xZnYo
bG9jYXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTJmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yZihsb2NhdGlvbiwgdjAsIHYx
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdihsb25nIGxvY2F0aW9u
LCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMg
dG8gYmUgYSBtdWx0aXBsZSBvZiAyCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQg
djEsIGZsb2F0IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsVW5pZm9ybTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXpl
KQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2Z2KGxvY2F0
aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00
Zihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00Zihs
b2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7CisgICAg
Ly8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24sIHNpemUs
IGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxvbmcgbG9j
YXRpb24sIGludCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
OjpnbFVuaWZvcm0xaShsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp1bmlmb3JtMWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlv
biwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmko
bG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJh
eSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRp
cGxlIG9mIDIKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZv
cm0yaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIpCit7Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRp
b24sIHYwLCB2MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2
KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBs
ZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9uLCBpbnQg
djAsIGludCB2MSwgaW50IHYyLCBpbnQgdjMpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihsb25nIGxvY2F0aW9uLCBpbnQq
IGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEg
bXVsdGlwbGUgb2YgNAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
VW5pZm9ybTRpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBm
bG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8g
YmUgYSBtdWx0aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihsb25nIGxvY2F0
aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBG
SVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQorICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgc2l6
ZSwgdHJhbnNwb3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm1NYXRyaXg0ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwg
aW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxl
IG9mIDE2CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3Jt
TWF0cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVc2VQcm9ncmFtKChH
THVpbnQpIHByb2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZVBy
b2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQoreworICAgIEFTU0VSVChwcm9ncmFtKTsK
KworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmFsaWRhdGVQcm9n
cmFtKChHTHVpbnQpIHByb2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0
ZXhBdHRyaWIxZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9u
ZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYw
LCBmbG9hdCB2MSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bFZlcnRleEF0dHJpYjJmKGluZHgsIHYwLCB2MSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnZlcnRleEF0dHJpYjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjJm
dihpbmR4LCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjNmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjNm
KGluZHgsIHYwLCB2MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhB
dHRyaWIzZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCwgYXJy
YXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1bnNpZ25l
ZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQorewor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliNGYo
aW5keCwgdjAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0
ZXhBdHRyaWI0ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwg
YXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVy
KHVuc2lnbmVkIGxvbmcgaW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQs
IHVuc2lnbmVkIGxvbmcgc3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5k
eCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0PHZvaWQq
PihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp2aWV3cG9ydChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5z
aWduZWQgbG9uZyBoZWlnaHQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIDo6Z2xWaWV3cG9ydChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50
Pih5KSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPiho
ZWlnaHQpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWdu
ZWQgbG9uZyBwbmFtZSwgdW5zaWduZWQgY2hhciogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2KHRh
cmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Rmxv
YXR2KHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0
ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNp
Z25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQp
CisgICAgICAgIGF0dGFjaG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVOQ0lMX0FU
VEFDSE1FTlQsIGVpdGhlciB3b3Jrcy4KKyAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50
UGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBuYW1lLCBp
bnQqIHZhbHVlKQoreworICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElPTl9DT0xP
Ul9SRUFEX0ZPUk1BVC9UWVBFIGZvciBHTC4gIEFueSB2YWxpZAorICAgIC8vIGNvbWJpbmF0aW9u
IHNob3VsZCB3b3JrLCBidXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUgdGhlIG1v
c3QKKyAgICAvLyB1c2VmdWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCisgICAgLy8gTmVlZCB0
byBlbXVsYXRlIE1BWF9GUkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBNQVhfVkFS
WUlOR19WRUNUT1JTCisgICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9uZGluZyBx
dWVyaWVzIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAgICAvLyB3aGVyZWFzIEdM
RVMyIHJldHVybiB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0IGNvbXBv
bmVudHMpLgorICAgIC8vIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlc2t0b3Ag
R0wgbmVlZHMgdG8gYmUgZGl2aWRlZCBieSA0LgorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xP
Ul9SRUFEX0ZPUk1BVDoKKyAgICAgICAgKnZhbHVlID0gR0xfUkdCOworICAgICAgICBicmVhazsK
KyAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKKyAgICAgICAgKnZhbHVl
ID0gR0xfVU5TSUdORURfQllURTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfRlJBR01F
TlRfVU5JRk9STV9WRUNUT1JTOgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdN
RU5UX1VOSUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOworICAgICAgICAqdmFsdWUgLz0gNDsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAg
ICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1
ZSk7CisgICAgICAgICp2YWx1ZSAvPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1BWF9W
QVJZSU5HX1ZFQ1RPUlM6CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFSWUlOR19G
TE9BVFMsIHZhbHVlKTsKKyAgICAgICAgKnZhbHVlIC89IDQ7CisgICAgICAgIGJyZWFrOworICAg
IGRlZmF1bHQ6CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOworICAgIH0K
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmpl
Y3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBw
cm9ncmFtLCBwbmFtZSwgdmFsdWUpOworfQorCitTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFByb2dyYW1JbmZvTG9nKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKK3sKKyAgICBBU1NFUlQo
cHJvZ3JhbSk7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0xpbnQg
bGVuZ3RoOworICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xfSU5GT19M
T0dfTEVOR1RILCAmbGVuZ3RoKTsKKworICAgIEdMc2l6ZWkgc2l6ZTsKKyAgICBHTGNoYXIqIGlu
Zm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAgIGlmICghaW5mbykKKyAgICAg
ICAgcmV0dXJuICIiOworCisgICAgOjpnbEdldFByb2dyYW1JbmZvTG9nKChHTHVpbnQpIHByb2dy
YW0sIGxlbmd0aCwgJnNpemUsIGluZm8pOworICAgIFN0cmluZyBzKGluZm8pOworICAgIGZhc3RG
cmVlKGluZm8pOworICAgIHJldHVybiBzOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKHRhcmdldCwgcG5hbWUs
IHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyaXYoUGxhdGZv
cm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7Cisg
ICAgQVNTRVJUKHNoYWRlcik7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisK
KyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0
b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisgICAgc3dpdGNo
IChwbmFtZSkgeworICAgICAgICBjYXNlIERFTEVURV9TVEFUVVM6CisgICAgICAgIGNhc2UgU0hB
REVSX1RZUEU6CisgICAgICAgICAgICAvLyBMZXQgT3BlbkdMIGhhbmRsZSB0aGVzZS4KKworICAg
ICAgICAgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgcG5hbWUsIHZhbHVlKTsK
KyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQ09NUElMRV9TVEFUVVM6CisgICAg
ICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKSB7CisgICAgICAg
ICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KGZhbHNlKTsKKyAgICAgICAgICAg
ICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICgqdmFsdWUpID0gc3Rh
dGljX2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKKyAgICAgICAgICAgIGJyZWFr
OworCisgICAgICAgIGNhc2UgSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgaWYgKHJlc3Vs
dCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICgqdmFsdWUp
ID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgICgqdmFsdWUpID0gZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpLmxlbmd0aCgpOworICAgICAg
ICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKKyAgICAg
ICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7CisgICAg
ICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3ludGhlc2l6
ZUdMRXJyb3IoSU5WQUxJRF9FTlVNKTsKKyAgICB9Cit9CisKK1N0cmluZyBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVySW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBB
U1NFUlQoc2hhZGVyKTsKKworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBH
TGludCBsZW5ndGg7CisgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5G
T19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKKworICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwg
U2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5m
aW5kKHNoYWRlcik7CisKKyAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgp
KQorICAgICAgICAgcmV0dXJuICIiOworCisgICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5ID0g
cmVzdWx0LT5zZWNvbmQ7CisKKyAgICAgaWYgKGVudHJ5LmlzVmFsaWQpIHsKKyAgICAgICAgIEdM
aW50IGxlbmd0aDsKKyAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIEdM
X0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7CisKKyAgICAgICAgIEdMc2l6ZWkgc2l6ZTsKKyAg
ICAgICAgIEdMY2hhciogaW5mbyA9IChHTGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7CisgICAg
ICAgICBpZiAoIWluZm8pCisgICAgICAgICAgICAgcmV0dXJuICIiOworCisgICAgICAgICA6Omds
R2V0U2hhZGVySW5mb0xvZygoR0x1aW50KSBzaGFkZXIsIGxlbmd0aCwgJnNpemUsIGluZm8pOwor
CisgICAgICAgICBTdHJpbmcgcyhpbmZvKTsKKyAgICAgICAgIGZhc3RGcmVlKGluZm8pOworICAg
ICAgICAgcmV0dXJuIHM7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgICByZXR1cm4gZW50
cnkubG9nOworICAgICB9Cit9CisKK1N0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVy
U291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOwor
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgSGFzaE1hcDxQbGF0Zm9y
bTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVy
U291cmNlTWFwLmZpbmQoc2hhZGVyKTsKKworICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3Vy
Y2VNYXAuZW5kKCkpCisgICAgICAgIHJldHVybiAiIjsKKworICAgIHJldHVybiByZXN1bHQtPnNl
Y29uZC5zb3VyY2U7Cit9CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1l
dGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2
YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFRl
eFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVk
IGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1mdihQbGF0Zm9ybTNET2JqZWN0
IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGZsb2F0KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFVuaWZvcm1mdigoR0x1aW50KSBwcm9ncmFt
LCBsb2NhdGlvbiwgdmFsdWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlm
b3JtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBpbnQqIHZhbHVl
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VW5pZm9y
bWl2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7Cit9CisKK2xvbmcgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFVuaWZvcm1Mb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7CisKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRp
b24oKEdMdWludCkgcHJvZ3JhbSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1
ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2ln
bmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihp
bmRleCwgcG5hbWUsIHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVy
dGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgdm9pZCogcG9pbnRl
cjsKKyAgICA6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRl
cik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4ocG9pbnRlcik7Cit9CisKK2lu
dCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVk
IGxldmVsLCB1bnNpZ25lZCBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVk
IGhlaWdodCwgdW5zaWduZWQgYm9yZGVyLCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUs
IHZvaWQqIHBpeGVscykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAg
ICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhl
aWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgcmV0dXJuIDA7Cit9CisK
K2ludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVu
c2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0
aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQq
IHBpeGVscykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICAvLyBG
SVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQaXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRl
YWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlmZmVyIGZyb20gdGhlIHN1YmltYWdlIHNp
emUKKyAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0
aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3Vu
c2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVCdWZmZXIoKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTHVpbnQgbzsKKyAgICBnbEdlbkJ1ZmZlcnMoMSwg
Jm8pOworICAgIHJldHVybiBvOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3Jl
YXRlRnJhbWVidWZmZXIoKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBHTHVpbnQgbzsKKyAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbyk7CisgICAgcmV0dXJu
IG87Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVQcm9ncmFtKCkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIGdsQ3JlYXRlUHJv
Z3JhbSgpOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVm
ZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IG87
CisgICAgZ2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30KKwor
dW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5
cGUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiBnbENy
ZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpID8gR0xfRlJBR01FTlRfU0hBREVS
IDogR0xfVkVSVEVYX1NIQURFUik7Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpj
cmVhdGVUZXh0dXJlKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
R0x1aW50IG87CisgICAgZ2xHZW5UZXh0dXJlcygxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUJ1ZmZlcih1bnNpZ25lZCBidWZmZXIpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlQnVmZmVycygx
LCAmYnVmZmVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlRnJhbWVidWZm
ZXIodW5zaWduZWQgZnJhbWVidWZmZXIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3JhbSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZ2xEZWxldGVQcm9ncmFt
KHByb2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZm
ZXIodW5zaWduZWQgcmVuZGVyYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJnJlbmRlcmJ1ZmZlcik7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlU2hhZGVy
KHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5z
aWduZWQgdGV4dHVyZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
Z2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7Cit9CisKK2ludCBHcmFwaGljc0NvbnRleHQz
RDo6c2l6ZUluQnl0ZXMoaW50IHR5cGUpCit7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAg
IGNhc2UgR0xfQllURToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xieXRlKTsKKyAgICAg
ICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVi
eXRlKTsKKyAgICAgICAgY2FzZSBHTF9TSE9SVDoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2Yo
R0xzaG9ydCk7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6CisgICAgICAgICAgICBy
ZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKKyAgICAgICAgY2FzZSBHTF9JTlQ6CisgICAgICAgICAg
ICByZXR1cm4gc2l6ZW9mKEdMaW50KTsKKyAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6Cisg
ICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWludCk7CisgICAgICAgIGNhc2UgR0xfRkxPQVQ6
CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMZmxvYXQpOworICAgICAgICBkZWZhdWx0Ogor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpzeW50aGVzaXplR0xFcnJvcih1bnNpZ25lZCBsb25nIGVycm9yKQoreworICAgIG1fc3ludGhl
dGljRXJyb3JzLmFkZChlcnJvcik7Cit9CisKK30KKworI2VuZGlmIC8vIEVOQUJMRSgzRF9DQU5W
QVMpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQz
RE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbQkocmV2aXNpb24gNjYyNDEpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAt
MzEsNyArMzEsNyBAQAogCiAjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKIAotI2luY2x1ZGUg
IkFOR0xFL1Jlc291cmNlTGltaXRzLmgiCisjaW5jbHVkZSAiQU5HTEUvU2hhZGVyTGFuZy5oIgog
I2luY2x1ZGUgIkFycmF5QnVmZmVyLmgiCiAjaW5jbHVkZSAiQXJyYXlCdWZmZXJWaWV3LmgiCiAj
aW5jbHVkZSAiV2ViR0xPYmplY3QuaCIKQEAgLTE4NiwyMyArMTg2LDIzIEBAIEdyYXBoaWNzQ29u
dGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmEKIAogICAgIFRCdWlsdEluUmVzb3VyY2UgQU5H
TEVSZXNvdXJjZXM7CiAKLSAgICBBTkdMRVJlc291cmNlcy5tYXhWZXJ0ZXhBdHRyaWJzID0gMDsK
LSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAm
QU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4
dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1heFZlcnRl
eFVuaWZvcm1WZWN0b3JzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyA9
IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RP
UlMsICZBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBo
aWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291
cmNlcy5tYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3ND
b250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJj
ZXMubWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNE
OjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLm1heFRleHR1cmVJbWFn
ZVVuaXRzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0g
MDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZP
Uk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOwor
ICAgIEFOR0xFUmVzb3VyY2VzLk1heFZlcnRleEF0dHJpYnMgPSAwOworICAgIGdldEludGVnZXJ2
KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX0FUVFJJQlMsICZBTkdMRVJlc291cmNlcy5N
YXhWZXJ0ZXhBdHRyaWJzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhVbmlmb3JtVmVj
dG9ycyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhf
VU5JRk9STV9WRUNUT1JTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMp
OworICAgIEFOR0xFUmVzb3VyY2VzLk1heFZhcnlpbmdWZWN0b3JzID0gMDsKKyAgICBnZXRJbnRl
Z2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZBUllJTkdfVkVDVE9SUywgJkFOR0xFUmVzb3Vy
Y2VzLk1heFZhcnlpbmdWZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhUZXh0
dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1B
WF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFRl
eHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhDb21iaW5lZFRleHR1cmVJ
bWFnZVVuaXRzID0gMDsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0NP
TUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5NYXhDb21iaW5lZFRl
eHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhUZXh0dXJlSW1hZ2VVbml0
cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9URVhUVVJFX0lN
QUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMpOworICAgIEFO
R0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdldEludGVn
ZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTLCAmQU5H
TEVSZXNvdXJjZXMuTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyk7CiAKICAgICAvLyBBbHdheXMg
c2V0IHRvIDEgZm9yIE9wZW5HTCBFUy4KLSAgICBBTkdMRVJlc291cmNlcy5tYXhEcmF3QnVmZmVy
cyA9IDE7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSAxOwogICAgIAogICAg
IG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xFUmVzb3VyY2VzKTsKICAgICAKQEAgLTIxMCwx
NDU1ICsyMTAsNiBAQCBHcmFwaGljc0NvbnRleHQzRDo6R3JhcGhpY3NDb250ZXh0M0QoR3JhCiAg
ICAgOjpnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CiB9CiAKLUdyYXBoaWNzQ29udGV4dDNEOjp+
R3JhcGhpY3NDb250ZXh0M0QoKQotewotICAgIGlmIChtX2NvbnRleHRPYmopIHsKLSAgICAgICAg
Q0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAgICAgOjpnbERlbGV0ZVRl
eHR1cmVzKDEsICZtX3RleHR1cmUpOwotICAgICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsK
LSAgICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxl
Q29sb3JCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJz
LmRlcHRoKQotICAgICAgICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZt
X211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgICAgIDo6Z2xEZWxldGVG
cmFtZWJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICB9IGVsc2Ugewot
ICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQotICAgICAg
ICAgICAgICAgIDo6Z2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZtX2RlcHRoU3RlbmNpbEJ1
ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAm
bV9mYm8pOwotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dCgwKTsKLSAgICAgICAgQ0dMRGVz
dHJveUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnZhbGlkYXRlQXR0cmlidXRlcygpCi17Ci0gICAgY29uc3QgY2hhciogZXh0ZW5zaW9u
cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfRVhURU5T
SU9OUykpOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpIHsKLSAgICAgICAgaWYgKHN0ZDo6c3Ry
c3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwiKSkgewotICAgICAg
ICAgICAgaWYgKCFtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgICAgIG1fYXR0cnMuZGVwdGgg
PSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1fYXR0cnMuc3RlbmNpbCA9IGZh
bHNlOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAgICAgYm9vbCBp
c1ZhbGlkVmVuZG9yID0gdHJ1ZTsKLSAgICAgICAgLy8gQ3VycmVudGx5IGluIE1hYyB3ZSBvbmx5
IHR1cm4gb24gYW50aWFsaWFzIGlmIHZlbmRvciBpcyBOVklESUEuCi0gICAgICAgIGNvbnN0IGNo
YXIqIHZlbmRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmco
R0xfVkVORE9SKSk7Ci0gICAgICAgIGlmICghc3RkOjpzdHJzdHIodmVuZG9yLCAiTlZJRElBIikp
Ci0gICAgICAgICAgICBpc1ZhbGlkVmVuZG9yID0gZmFsc2U7Ci0gICAgICAgIGlmICghaXNWYWxp
ZFZlbmRvciB8fCAhc3RkOjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9mcmFtZWJ1ZmZlcl9t
dWx0aXNhbXBsZSIpKQotICAgICAgICAgICAgbV9hdHRycy5hbnRpYWxpYXMgPSBmYWxzZTsKLSAg
ICB9Ci0gICAgLy8gRklYTUU6IGluc3RlYWQgb2YgZW5mb3JjaW5nIHByZW11bHRpcGxpZWRBbHBo
YSA9IHRydWUsIGltcGxlbWVudCB0aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gcHJl
bXVsdGlwbGllZEFscGhhID0gZmFsc2UgaXMgcmVxdWVzdGVkLgotICAgIG1fYXR0cnMucHJlbXVs
dGlwbGllZEFscGhhID0gdHJ1ZTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bWFrZUNv
bnRleHRDdXJyZW50KCkKLXsKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmop
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jlc3VsdHNUb0Nh
bnZhcyhDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0KQotewotICAgIEhUTUxDYW52YXNF
bGVtZW50KiBjYW52YXMgPSBjb250ZXh0LT5jYW52YXMoKTsKLSAgICBJbWFnZUJ1ZmZlciogaW1h
Z2VCdWZmZXIgPSBjYW52YXMtPmJ1ZmZlcigpOwotCi0gICAgaW50IHJvd0J5dGVzID0gbV9jdXJy
ZW50V2lkdGggKiA0OwotICAgIGludCB0b3RhbEJ5dGVzID0gcm93Qnl0ZXMgKiBtX2N1cnJlbnRI
ZWlnaHQ7Ci0KLSAgICBPd25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiBwaXhlbHMobmV3IHVuc2ln
bmVkIGNoYXJbdG90YWxCeXRlc10pOwotICAgIGlmICghcGl4ZWxzKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAgYm9vbCBt
dXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211
bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZS
QU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAs
IDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRo
LCBtX2N1cnJlbnRIZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0g
ICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAo
bV9ib3VuZEZCTyAhPSBtX2ZibykgewotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVl
OwotICAgICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQs
IG1fZmJvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEdMaW50IHBhY2tBbGlnbm1lbnQgPSA0
OwotICAgIGJvb2wgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gZmFsc2U7Ci0gICAgOjpnbEdl
dEludGVnZXJ2KEdMX1BBQ0tfQUxJR05NRU5ULCAmcGFja0FsaWdubWVudCk7Ci0gICAgaWYgKHBh
Y2tBbGlnbm1lbnQgPiA0KSB7Ci0gICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdO
TUVOVCwgNCk7Ci0gICAgICAgIG11c3RSZXN0b3JlUGFja0FsaWdubWVudCA9IHRydWU7Ci0gICAg
fQotCi0gICAgOjpnbFJlYWRQaXhlbHMoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhl
aWdodCwgR0xfQkdSQSwgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBwaXhlbHMuZ2V0KCkp
OwotCi0gICAgaWYgKG11c3RSZXN0b3JlUGFja0FsaWdubWVudCkKLSAgICAgICAgOjpnbFBpeGVs
U3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCBwYWNrQWxpZ25tZW50KTsKLQotICAgIGlmIChtdXN0
UmVzdG9yZUZCTykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZF
Ul9FWFQsIG1fYm91bmRGQk8pOwotCi0gICAgcGFpbnRUb0NhbnZhcyhwaXhlbHMuZ2V0KCksIG1f
Y3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBjYW52YXMt
PndpZHRoKCksIGNhbnZhcy0+aGVpZ2h0KCksIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRm
b3JtQ29udGV4dCgpKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBs
aWFudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc0dMRVMyTlBPVFN0cmljdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVkT25PdXRPZkJvdW5k
c0FjY2Vzc2VzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGlmICh3
aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFt
X2NvbnRleHRPYmopCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX2N1cnJlbnRXaWR0aCA9
IHdpZHRoOwotICAgIG1fY3VycmVudEhlaWdodCA9IGhlaWdodDsKLSAgICAKLSAgICBDR0xTZXRD
dXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIEdMdWludCBpbnRlcm5hbENv
bG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSAwOwot
ICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBH
TF9SR0JBODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0JBOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0I4OwotICAgICAgICBjb2xvckZvcm1h
dCA9IEdMX1JHQjsKLSAgICB9Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRl
cHRoKSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHRoZSBsb2dpYyB3aGVyZSBzdGVuY2ls
IGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBub3QuCi0gICAgICAgIC8vIFNlZSBHcmFwaGljc0Nv
bnRleHQzRCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCAmJiBtX2F0
dHJzLmRlcHRoKQotICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9E
RVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50ZXJuYWxE
ZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgfQotCi0gICAgYm9v
bCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotCi0gICAgLy8gcmVzaXplIG11bHRpc2FtcGxlIEZC
TwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBHTGludCBtYXhTYW1wbGVD
b3VudDsKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9TQU1QTEVTX0VYVCwgJm1heFNh
bXBsZUNvdW50KTsKLSAgICAgICAgR0xpbnQgc2FtcGxlQ291bnQgPSBzdGQ6Om1pbig4LCBtYXhT
YW1wbGVDb3VudCk7Ci0gICAgICAgIGlmIChzYW1wbGVDb3VudCA+IG1heFNhbXBsZUNvdW50KQot
ICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBtYXhTYW1wbGVDb3VudDsKLSAgICAgICAgaWYgKG1f
Ym91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAg
ICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIDo6Z2xCaW5k
UmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1
ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xf
UkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRo
LCBoZWlnaHQpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJF
WFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7
Ci0gICAgICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JF
TkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwg
d2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsKQotICAgICAg
ICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1fYXR0cnMuZGVw
dGgpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAg
IDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDApOwotICAgICAg
ICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0g
R0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogY2xl
YW51cC4KLSAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyByZXNpemUgcmVndWxhciBGQk8KLSAgICBpZiAobV9ib3VuZEZCTyAhPSBtX2Zibykg
ewotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgfQotICAgIDo6Z2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmUpOwotICAgIDo6Z2xUZXhJbWFnZTJEKEdM
X1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGNv
bG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKLSAgICA6OmdsRnJhbWVidWZmZXJUZXh0
dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdM
X1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRV
UkVfMkQsIDApOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxpYXMgJiYgKG1fYXR0cnMuc3RlbmNp
bCB8fCBtX2F0dHJzLmRlcHRoKSkgewotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xS
ZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIGludGVybmFsRGVwdGhT
dGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCi0gICAg
ICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0
ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJC
VUZGRVJfRVhULCAwKTsKLSAgICB9Ci0gICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgewot
ICAgICAgICAvLyBGSVhNRTogY2xlYW51cAotICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IH0KLQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgICAgICBtdXN0UmVz
dG9yZUZCTyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgcmVuZGVyYnVmZmVy
cyB0byAwLgotICAgIEdMYm9vbGVhbiBjb2xvck1hc2tbXSA9IHtHTF9UUlVFLCBHTF9UUlVFLCBH
TF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNrID0gR0xfVFJVRSwgc3RlbmNpbE1hc2sgPSBHTF9U
UlVFOwotICAgIEdMYm9vbGVhbiBpc1NjaXNzb3JFbmFibGVkID0gR0xfRkFMU0U7Ci0gICAgR0xi
b29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYml0ZmllbGQgY2xlYXJN
YXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLSAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfQ09MT1Jf
V1JJVEVNQVNLLCBjb2xvck1hc2spOwotICAgIDo6Z2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJV
RSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKG1fYXR0cnMuZGVwdGgpIHsKLSAgICAgICAg
OjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dSSVRFTUFTSywgJmRlcHRoTWFzayk7Ci0gICAgICAg
IDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNsZWFyTWFzayB8PSBHTF9ERVBUSF9C
VUZGRVJfQklUOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7Ci0gICAgICAgIDo6
Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dSSVRFTUFTSywgJnN0ZW5jaWxNYXNrKTsKLSAgICAg
ICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUpOwotICAgICAgICBjbGVhck1hc2sgfD0gR0xfU1RF
TkNJTF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpc1NjaXNzb3JFbmFibGVkID0gOjpnbElzRW5h
YmxlZChHTF9TQ0lTU09SX1RFU1QpOwotICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7
Ci0gICAgaXNEaXRoZXJFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9ESVRIRVIpOwotICAgIDo6
Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICA6OmdsQ2xlYXIoY2xlYXJNYXNrKTsKLQotICAg
IDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBdLCBjb2xvck1hc2tbMV0sIGNvbG9yTWFza1syXSwg
Y29sb3JNYXNrWzNdKTsKLSAgICBpZiAobV9hdHRycy5kZXB0aCkKLSAgICAgICAgOjpnbERlcHRo
TWFzayhkZXB0aE1hc2spOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAgICAgIDo6Z2xT
dGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Ci0gICAgaWYgKGlzU2Npc3NvckVuYWJsZWQpCi0gICAg
ICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBlbHNlCi0gICAgICAgIDo6Z2xE
aXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaWYgKGlzRGl0aGVyRW5hYmxlZCkKLSAgICAg
ICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIGVsc2UKLSAgICAgICAgOjpnbERpc2FibGUo
R0xfRElUSEVSKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZUZCTykKLSAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwotCi0gICAgOjpn
bEZsdXNoKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRl
eHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRD
b250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCi0gICAgICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpwcmVwYXJlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwot
ICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1
cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0NP
TE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLSAgICB9Ci0gICAgOjpnbEZpbmlz
aCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJlKHVuc2lnbmVk
IGxvbmcgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmF0dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEF0dGFjaFNoYWRlcigoR0x1
aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25l
ZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0p
OwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZEF0dHJpYkxv
Y2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZmZXIpOwotfQot
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNpZ25lZCBsb25n
IHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAgaWYgKGJ1ZmZlcikKLSAgICAgICAg
ZmJvID0gKEdMdWludClidWZmZXI7Ci0gICAgZWxzZQotICAgICAgICBmYm8gPSAobV9hdHRycy5h
bnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8pOwotICAgIGlmIChmYm8gIT0gbV9i
b3VuZEZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwgZmJvKTsK
LSAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RP
YmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIChHTHVpbnQpIHJlbmRlcmJ1ZmZl
cik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQg
bG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkg
dGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91Ymxl
IHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2Fz
dDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBtb2RlICkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRXF1YXRpb24obW9kZSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSh1bnNp
Z25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1v
ZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRG
dW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3Is
IGRmYWN0b3IpOwotfSAgICAgICAKLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5j
U2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNp
Z25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdC
LCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1bnNpZ25lZCBs
b25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNvbnN0
IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNh
Z2UpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRhKHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJTdWJEYXRh
KHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLX0KLQotdW5zaWduZWQgbG9uZyBHcmFwaGlj
c0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25nIHRhcmdldCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xDaGVj
a0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVhckNvbG9yKHN0
YXRpY19jYXN0PGZsb2F0PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxm
bG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0PihhKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyKG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJvb2wgYmx1ZSwg
Ym9vbCBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bENvbG9yTWFzayhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAg
QVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAg
aW50IEdMc2hhZGVyVHlwZTsKLSAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKLQotICAg
IGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFERVJfVFlQRSwgJkdMc2hhZGVyVHlwZSk7Ci0gICAg
Ci0gICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hBREVSKQotICAgICAgICBzaGFkZXJU
eXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwotICAgIGVsc2UgaWYgKEdMc2hhZGVyVHlwZSA9PSBG
UkFHTUVOVF9TSEFERVIpCi0gICAgICAgIHNoYWRlclR5cGUgPSBTSEFERVJfVFlQRV9GUkFHTUVO
VDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybjsgLy8gSW52YWxpZCBzaGFkZXIgdHlwZS4KLQot
ICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRv
ciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVz
dWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
aGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKLQotICAgIFN0cmluZyB0
cmFuc2xhdGVkU2hhZGVyU291cmNlOwotICAgIFN0cmluZyBzaGFkZXJJbmZvTG9nOwotCi0gICAg
Ym9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNoYWRlclNvdXJjZShlbnRyeS5zb3Vy
Y2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNsYXRlZFNoYWRlclNvdXJjZSwgc2hh
ZGVySW5mb0xvZyk7Ci0KLSAgICBlbnRyeS5sb2cgPSBzaGFkZXJJbmZvTG9nOwotICAgIGVudHJ5
LmlzVmFsaWQgPSBpc1ZhbGlkOwotCi0gICAgaWYgKCFpc1ZhbGlkKQotICAgICAgICByZXR1cm47
IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1vdmUgZm9yd2FyZCB3aXRoIGNvbXBp
bGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKLQotICAgIGludCB0cmFuc2xhdGVkU2hhZGVyTGVu
Z3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgoKTsKLQotICAgIGNvbnN0IENTdHJp
bmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS51dGY4
KCk7Ci0gICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRlclB0ciA9IHRyYW5zbGF0ZWRTaGFk
ZXJDU3RyaW5nLmRhdGEoKTsKLSAgICAKLSAgICA6OmdsU2hhZGVyU291cmNlKChHTHVpbnQpIHNo
YWRlciwgMSwgJnRyYW5zbGF0ZWRTaGFkZXJQdHIsICZ0cmFuc2xhdGVkU2hhZGVyTGVuZ3RoKTsK
LSAgICAKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotICAgIAotICAg
IGludCBHTENvbXBpbGVTdWNjZXNzOwotICAgIAotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIENPTVBJTEVfU1RBVFVTLCAmR0xDb21waWxlU3VjY2Vzcyk7Ci0gICAgCi0gICAg
Ly8gQVNTRVJUIHRoYXQgQU5HTEUgZ2VuZXJhdGVkIEdMU0wgd2lsbCBiZSBhY2NlcHRlZCBieSBP
cGVuR0wKLSAgICBBU1NFUlQoR0xDb21waWxlU3VjY2VzcyA9PSBHTF9UUlVFKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFu
dGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBs
ZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZF
Ul9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1Jf
QlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlUZXhJbWFnZTJE
KHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3Jk
ZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlz
YW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29w
eVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcgeG9m
ZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1w
bGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFt
ZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwg
eSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0g
ICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQs
IHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ3VsbEZhY2UobW9kZSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZsYWcpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aE1hc2soZmxhZyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoUmFuZ2UoZG91YmxlIHpOZWFyLCBk
b3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
ZXRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNo
YWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXRhY2hTaGFkZXIoKEdMdWlu
dCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGUoY2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0
cmliQXJyYXkoaW5kZXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJyYXlz
KHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmlyc3Qs
IGNvdW50KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVuc2ln
bmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBs
b25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4o
c3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGVWZXJ0ZXhBdHRy
aWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlzaCgpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGaW5pc2goKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2ln
bmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBs
YXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWludCkgYnVmZmVyOwotICAgIGlmIChh
dHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkgewotICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBUSF9BVFRBQ0hNRU5ULCByZW5kZXJi
dWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRl
cmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0
LCByZW5kZXJidWZmZXIpOwotICAgIH0gZWxzZQotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5k
ZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRl
cmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVy
ZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2ln
bmVkIGxvbmcgdGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxvbmcgbGV2ZWwp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGcmFtZWJ1ZmZl
clRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgKEdMdWludCkgdGV4
dHVyZSwgbGV2ZWwpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UodW5z
aWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsRnJvbnRGYWNlKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5l
cmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCi17Ci0gICAgaWYg
KCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICBHTGludCBtYXhBdHRyaWJ1dGVTaXplID0gMDsKLSAgICA6OmdsR2V0UHJvZ3Jh
bWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFY
X0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdMY2hhciBuYW1lW21heEF0dHJpYnV0
ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0
ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAgR0xpbnQgc2l6ZSA9
IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVBdHRyaWIoc3RhdGlj
X2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heEF0dHJpYnV0ZVNpemUsICZuYW1lTGVu
Z3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3RoKTsK
LSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0gICAgCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVVbmlmb3Jt
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5m
byYgaW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJy
b3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsK
LSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FD
VElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7Ci0gICAgR0xjaGFyIG5h
bWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1
ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOwotICAgIEdM
aW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsKLSAgICA6OmdsR2V0QWN0aXZlVW5p
Zm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4VW5pZm9ybVNpemUs
ICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1l
TGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFjaGVk
U2hhZGVycyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGludCBtYXhDb3VudCwgaW50KiBjb3Vu
dCwgdW5zaWduZWQgaW50KiBzaGFkZXJzKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEF0dGFjaGVk
U2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQsIHNo
YWRlcnMpOwotfQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9uKFBs
YXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIGlmICgh
cHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHBy
b2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDNEOjpBdHRy
aWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygpCi17Ci0gICAg
cmV0dXJuIG1fYXR0cnM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEVycm9yKCkKLXsKLSAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4gMCkgewotICAg
ICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9IG1fc3ludGhl
dGljRXJyb3JzLmJlZ2luKCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gKml0ZXI7Ci0g
ICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKLSAgICAgICAgcmV0dXJuIGVy
cjsKLSAgICB9Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJu
IDo6Z2xHZXRFcnJvcigpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0cmlu
Zyh1bnNpZ25lZCBsb25nIG5hbWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5nKG5hbWUpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25nIHRhcmdldCwg
dW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBpZiAoIWJ1ZmZlcikK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICByZXR1cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc0VuYWJsZWQo
Y2FwKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcihQbGF0Zm9y
bTNET2JqZWN0IGZyYW1lYnVmZmVyKQotewotICAgIGlmICghZnJhbWVidWZmZXIpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKLX0K
LQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1Byb2dy
YW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVu
ZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGlmICghcmVu
ZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNSZW5kZXJidWZmZXJFWFQoKEdMdWlu
dCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIo
UGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgaWYgKCFzaGFkZXIpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
cmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotfQotCi1ib29sIEdyYXBoaWNz
Q29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQotewotICAgIGlm
ICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0
dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0
aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmVXaWR0
aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIEFTU0VSVChw
cm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmtQ
cm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
aXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFt
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFj
dG9yLCBkb3VibGUgdW5pdHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNf
Y2FzdDxmbG9hdD4odW5pdHMpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBp
eGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBo
ZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIGRh
dGEpCi17Ci0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0
aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVy
aW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZsdXNoKCk7Ci0gICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRp
c2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHks
IHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9D
T0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsRmx1c2goKTsKLSAg
ICB9Ci0gICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBkYXRhKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211
bHRpc2FtcGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgbm90IGlt
cGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZkZWZzIGZvciB0
aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNp
Z25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dp
dGNoIChpbnRlcm5hbGZvcm1hdCkgewotICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKLSAgICAgICAg
aW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBERVBUSF9DT01QT05FTlQxNjoKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBH
TF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCQTQ6Ci0gICAg
Y2FzZSBSR0I1X0ExOgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUkdCNTY1OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JH
QjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhU
KHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2FtcGxlQ292ZXJh
Z2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIGNvbnN0
IFN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5Owot
Ci0gICAgZW50cnkuc291cmNlID0gc3RyaW5nOwotCi0gICAgbV9zaGFkZXJTb3VyY2VNYXAuc2V0
KHNoYWRlciwgZW50cnkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVu
Yyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsRnVuYyhmdW5j
LCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1Nl
cGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwg
dW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2sp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsTWFz
ayhtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0
ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxNYXNrU2VwYXJhdGUoZmFjZSwg
bWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcCh1bnNpZ25lZCBs
b25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwg
emZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxv
bmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWlsLCB6ZmFpbCwg
enBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJmKHVuc2ln
bmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1l
LCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dGV4UGFyYW1ldGVyaSh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBpbnQgdmFs
dWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJh
bWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWYo
bG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmdihs
b25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFmdihsb2NhdGlvbiwgc2l6ZSwgYXJy
YXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmYobG9uZyBsb2NhdGlv
biwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50
IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9m
IDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0yZnYo
bG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtM2YobG9jYXRp
b24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRpb24sIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB2MCwgdjEsIHYy
LCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYobG9uZyBsb2Nh
dGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5l
ZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBsb2NhdGlvbiwgaW50IHYwKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFpKGxvY2F0
aW9uLCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBs
b2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0aW9uLCBpbnQg
djAsIGludCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6
ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBs
b2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaShsb2NhdGlvbiwgdjAsIHYxLCB2Mik7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0zaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIs
IGludCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVu
aWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQot
ewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGl2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRy
aXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNp
emUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXgy
ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3Nl
LCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMg
dG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxv
Y2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAv
LyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24s
IHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShQbGF0Zm9ybTNET2Jq
ZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmFsaWRhdGVQcm9ncmFtKChHTHVpbnQpIHBy
b2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCog
YXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJm
KGluZHgsIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmKGluZHgsIHYwLCB2MSwg
djIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZnYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1bnNpZ25lZCBsb25nIGluZHgsIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwgdjAsIHYxLCB2
MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0ZnYodW5z
aWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgYXJyYXkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2lnbmVkIGxvbmcg
aW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQsIHVuc2lnbmVkIGxvbmcg
c3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwg
bm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxp
bnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2aWV3cG9y
dChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWln
aHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWaWV3cG9y
dChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwgc3RhdGljX2Nh
c3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9uZyBwbmFtZSwg
dW5zaWduZWQgY2hhciogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZh
bHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RmxvYXR2KHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBp
ZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpCi0gICAgICAgIGF0dGFj
aG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVOQ0lMX0FUVEFDSE1FTlQsIGVpdGhl
ciB3b3Jrcy4KLSAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQo
dGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewot
ICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVC9U
WVBFIGZvciBHTC4gIEFueSB2YWxpZAotICAgIC8vIGNvbWJpbmF0aW9uIHNob3VsZCB3b3JrLCBi
dXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUgdGhlIG1vc3QKLSAgICAvLyB1c2Vm
dWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCi0gICAgLy8gTmVlZCB0byBlbXVsYXRlIE1BWF9G
UkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBNQVhfVkFSWUlOR19WRUNUT1JTCi0g
ICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9uZGluZyBxdWVyaWVzIHJldHVybiB0
aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAgICAvLyB3aGVyZWFzIEdMRVMyIHJldHVybiB0aGUg
bnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0IGNvbXBvbmVudHMpLgotICAgIC8v
IFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlc2t0b3AgR0wgbmVlZHMgdG8gYmUg
ZGl2aWRlZCBieSA0LgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBzd2l0
Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoK
LSAgICAgICAgKnZhbHVlID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElNUExF
TUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKLSAgICAgICAgKnZhbHVlID0gR0xfVU5TSUdORURf
QllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNU
T1JTOgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09N
UE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKLSAgICAgICAgOjpnbEdldEludGVn
ZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1ZSk7Ci0gICAgICAgICp2
YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9WQVJZSU5HX1ZFQ1RPUlM6
Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFSWUlOR19GTE9BVFMsIHZhbHVlKTsK
LSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAg
ICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBwbmFtZSwg
dmFsdWUpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1JbmZvTG9n
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAg
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IGxlbmd0aDsKLSAg
ICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwg
Jmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXplOwotICAgIEdMY2hhciogaW5mbyA9IChH
TGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1
cm4gIiI7Ci0KLSAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2coKEdMdWludCkgcHJvZ3JhbSwgbGVu
Z3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFzdEZyZWUoaW5m
byk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFJlbmRl
cmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBu
YW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFtZSwgdmFsdWUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBBU1NF
UlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
Ci0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJh
dG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLSAgICAKLSAgICBz
d2l0Y2ggKHBuYW1lKSB7Ci0gICAgICAgIGNhc2UgREVMRVRFX1NUQVRVUzoKLSAgICAgICAgY2Fz
ZSBTSEFERVJfVFlQRToKLSAgICAgICAgICAgIC8vIExldCBPcGVuR0wgaGFuZGxlIHRoZXNlLgot
ICAgICAgICAKLSAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIHBu
YW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTVBJTEVf
U1RBVFVTOgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQo
KSkgewotICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3VsdC0+c2Vjb25k
LmlzVmFsaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2Fz
ZSBJTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291
cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOwotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAg
KCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIFNIQURFUl9TT1VSQ0VfTEVOR1RI
OgotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJTb3VyY2Uoc2hhZGVyKS5sZW5ndGgo
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfRU5VTSk7Ci0gICAgfQotfQotCi1TdHJp
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBz
aGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0KLSAgICBIYXNoTWFwPFBs
YXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9z
aGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRl
clNvdXJjZU1hcC5lbmQoKSkKLSAgICAgICAgIHJldHVybiAiIjsKLQotICAgICBTaGFkZXJTb3Vy
Y2VFbnRyeSBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0gICAgIGlmIChlbnRyeS5pc1ZhbGlk
KSB7Ci0gICAgICAgICBHTGludCBsZW5ndGg7Ci0gICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdM
dWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwotCi0gICAgICAgICBH
THNpemVpIHNpemU7Ci0gICAgICAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxv
YyhsZW5ndGgpOwotICAgICAgICAgaWYgKCFpbmZvKQotICAgICAgICAgICAgIHJldHVybiAiIjsK
LQotICAgICAgICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdMdWludCkgc2hhZGVyLCBsZW5ndGgs
ICZzaXplLCBpbmZvKTsKLQotICAgICAgICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgICAgICBmYXN0
RnJlZShpbmZvKTsKLSAgICAgICAgIHJldHVybiBzOwotICAgICB9Ci0gICAgIGVsc2UgewotICAg
ICAgICAgcmV0dXJuIGVudHJ5LmxvZzsKLSAgICAgfQotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBB
U1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAg
IEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciBy
ZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVzdWx0
ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBy
ZXR1cm4gcmVzdWx0LT5zZWNvbmQuc291cmNlOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFRleFBhcmFtZXRlcmZ2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25n
IHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBw
bmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtZnYo
UGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBmbG9hdCogdmFsdWUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRVbmlmb3JtZnYo
KEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VW5pZm9ybWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2Nh
dGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwot
fQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24oUGxhdGZvcm0z
RE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dy
YW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4g
OjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNp
Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJm
dihpbmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
aW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi1sb25nIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQodW5zaWduZWQgbG9uZyBpbmRleCwg
dW5zaWduZWQgbG9uZyBwbmFtZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgCi0gICAgdm9pZCogcG9pbnRlcjsKLSAgICA6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRl
cnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRlcik7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
bG9uZz4ocG9pbnRlcik7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1
bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBpbnRlcm5hbGZvcm1hdCwg
dW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYm9yZGVyLCB1bnNpZ25l
ZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBp
bnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVs
cyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1h
Z2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNp
Z25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3Jt
YXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0KLSAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQ
aXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlm
ZmVyIGZyb20gdGhlIHN1YmltYWdlIHNpemUKLSAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQs
IGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVC
dWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQg
bzsKLSAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwotICAgIHJldHVybiBvOwotfQotCi11bnNpZ25l
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIoKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlbkZyYW1lYnVmZmVy
c0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVQcm9ncmFtKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0Nv
bnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZv
KTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFHTUVOVF9TSEFE
RVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7Ci19Ci0KLXVuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAm
byk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUJ1
ZmZlcih1bnNpZ25lZCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQgZnJhbWVidWZmZXIpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhU
KDEsICZmcmFtZWJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVBy
b2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQgcmVuZGVyYnVmZmVyKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNF
WFQoMSwgJnJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0
ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7Ci19
Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6c2l6ZUluQnl0ZXMoaW50IHR5cGUpCi17Ci0gICAg
c3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfQllURToKLSAgICAgICAgICAgIHJldHVy
biBzaXplb2YoR0xieXRlKTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAg
ICAgICAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKLSAgICAgICAgY2FzZSBHTF9TSE9SVDoKLSAg
ICAgICAgICAgIHJldHVybiBzaXplb2YoR0xzaG9ydCk7Ci0gICAgICAgIGNhc2UgR0xfVU5TSUdO
RURfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKLSAgICAgICAg
Y2FzZSBHTF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMaW50KTsKLSAgICAgICAg
Y2FzZSBHTF9VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWludCk7
Ci0gICAgICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMZmxv
YXQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzeW50aGVzaXplR0xFcnJvcih1bnNpZ25lZCBsb25n
IGVycm9yKQotewotICAgIG1fc3ludGhldGljRXJyb3JzLmFkZChlcnJvcik7Ci19Ci0KIH0KIAog
I2VuZGlmIC8vIEVOQUJMRSgzRF9DQU5WQVMpCg==
</data>
<flag name="review"
          id="54629"
          type_id="1"
          status="-"
          setter="cmarrin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66310</attachid>
            <date>2010-09-01 18:36:47 -0700</date>
            <delta_ts>2010-09-02 09:42:20 -0700</delta_ts>
            <desc>Made requested changes</desc>
            <filename>begin-gcd3d-refactor4</filename>
            <type>text/plain</type>
            <size>94807</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biA2NjYyNykKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC01MzY5LDYgKzUzNjksNyBAQAogCQlGQUJFNzJGRTEwNTlDMjExMDBE
OTk5REQgLyogTWF0aE1MTmFtZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gRkFCRTcyRkMxMDU5QzIxMTAwRDk5OUREIC8qIE1hdGhNTE5hbWVzLmNw
cCAqLzsgfTsKIAkJRkFDMTJDQzQxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1
cC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQUMx
MkNDMjExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNwcCAqLzsgfTsKIAkJ
RkFDMTJDQzUxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkFDMTJDQzMxMTIwREE2OTAw
REFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oICovOyB9OworCQlGQjU4Q0I3OTEyMkYxNTM4
MDA4Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkI1OENBRUExMjI4NTg2NTAwODc4ODUxIC8q
IEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCAqLzsgfTsKIAkJRkU2RkQ0ODgwRjY3NkU1NzAw
MDkyODczIC8qIENvb3JkaW5hdGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBGRTZGRDQ4NTBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQlGRTZGRDQ4
RDBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4QjBGNjc2RTkzMDAwOTI4NzMgLyog
SlNDb29yZGluYXRlcy5jcHAgKi87IH07CiAJCUZFNkZENDhFMEY2NzZFOTMwMDA5Mjg3MyAvKiBK
U0Nvb3JkaW5hdGVzLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBGRTZGRDQ4QzBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRlcy5oICovOyB9OwpA
QCAtMTEyNDAsNiArMTEyNDEsNyBAQAogCQlGQUJFNzJGQzEwNTlDMjExMDBEOTk5REQgLyogTWF0
aE1MTmFtZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gTWF0aE1M
TmFtZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGQUMxMkNDMjExMjBEQTY5
MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IFJlbmRlck1hdGhNTFN1YlN1cC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUZBQzEyQ0MzMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJT
dXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gUmVuZGVyTWF0aE1MU3ViU3Vw
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUZCNThDQUVBMTIyODU4NjUwMDg3ODg1
MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHA7IHNvdXJjZVRyZWUgPSAi
PGdyb3VwPiI7IH07CiAJCUZFNDlFRjk3MERDNTE0NjIwMDQyNjZFMSAvKiBEYXNoYm9hcmRTdXBw
b3J0Q1NTUHJvcGVydHlOYW1lcy5pbiAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBEYXNoYm9hcmRT
dXBwb3J0Q1NTUHJvcGVydHlOYW1lcy5pbjsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
RkU2RkQ0ODUwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVzLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IENvb3JkaW5hdGVzLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUZFNkZENDg2MEY2NzZFNTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5pZGwgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSB0ZXh0OyBwYXRoID0gQ29vcmRpbmF0ZXMuaWRsOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwpAQCAtMTU4NTcsNiArMTU4NTksNyBAQAogCQlCMkEwMTU5MTBBRjZDRDUzMDA2QkNFMEUg
LyogZ3JhcGhpY3MgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAor
CQkJCUZCNThDQUVBMTIyODU4NjUwMDg3ODg1MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5j
cHAgKi8sCiAJCQkJQjI3NTM1MjkwQjA1MzgxNDAwMkNFNjRGIC8qIGNnICovLAogCQkJCUI1MzIw
RDY4MTIyQTI0RTkwMDJEMTQ0MCAvKiBjb2NvYSAqLywKIAkJCQlBNzVFOEI3RjBFMURFMkIwMDA3
RjI0ODEgLyogZmlsdGVycyAqLywKQEAgLTIyODk1LDYgKzIyODk4LDcgQEAKIAkJCQk4OTg3ODVC
ODEyMkNBMkE3MDAzQUFCREEgLyogSlNNZXRhZGF0YUNhbGxiYWNrLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCTg5ODc4NUYwMTIyRTFFODcwMDNBQUJEQSAvKiBKU0ZpbGVFeGNlcHRpb24uY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkJODk4Nzg1RjQxMjJFMUVBQzAwM0FBQkRBIC8qIEpTRmlsZVJlYWRl
clN5bmMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkI1OENCNzkxMjJGMTUzODAwODc4ODUxIC8q
IEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1
bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2ViQ29y
ZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1s
L2NhbnZhcy9XZWJHTE9iamVjdC5jcHAJKHJldmlzaW9uIDY2NjI3KQorKysgV2ViQ29yZS9odG1s
L2NhbnZhcy9XZWJHTE9iamVjdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTYwLDcgKzYwLDcgQEAg
dm9pZCBXZWJHTE9iamVjdDo6ZGVsZXRlT2JqZWN0KCkKIHsKICAgICBpZiAobV9vYmplY3QpIHsK
ICAgICAgICAgaWYgKG1fY29udGV4dCkgewotICAgICAgICAgICAgbV9jb250ZXh0LT5ncmFwaGlj
c0NvbnRleHQzRCgpLT5tYWtlQ29udGV4dEN1cnJlbnQoKTsKKyAgICAgICAgICAgIG1fY29udGV4
dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+ZW5zdXJlQ29udGV4dCgpOwogICAgICAgICAgICAgZGVs
ZXRlT2JqZWN0SW1wbChtX29iamVjdCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFtX2F0dGFj
aG1lbnRDb3VudCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0M0QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
Q29udGV4dDNELmgJKHJldmlzaW9uIDY2NjI3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQzRC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NTEsNyArNDUxLDcgQEAg
cHVibGljOgogICAgIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCB7IHJldHVy
biAwOyB9CiAjZW5kaWYKICNlbmRpZgotICAgIHZvaWQgbWFrZUNvbnRleHRDdXJyZW50KCk7Cisg
ICAgdm9pZCBlbnN1cmVDb250ZXh0KCk7CiAKICNpZiBQTEFURk9STShNQUMpIHx8IFBMQVRGT1JN
KENIUk9NSVVNKQogICAgIC8vIFdpdGggbXVsdGlzYW1wbGluZyBvbiwgYmxpdCBmcm9tIG11bHRp
c2FtcGxlRkJPIHRvIHJlZ3VsYXIgRkJPLgpJbmRleDogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0M0RPcGVuR0wuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkocmV2aXNpb24gNjY0MjEpCShmcm9tIHBsYXRmb3Jt
L2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbTo2NjQyMSkKKysrIHBsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkod29ya2luZyBjb3B5KQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQz
RE9wZW5HTC5jcHAJKHJldmlzaW9uIDY2NDIxKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1
IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDkgKzI5LDYgQEAKIAog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9u
cy5oIgotCi0jaW5jbHVkZSAiQU5HTEUvUmVzb3VyY2VMaW1pdHMuaCIKICNpbmNsdWRlICJBcnJh
eUJ1ZmZlci5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgogI2luY2x1ZGUgIldlYkdM
T2JqZWN0LmgiCkBAIC00MywxOTMgKzQwLDE3IEBACiAjaW5jbHVkZSAiSW50MzJBcnJheS5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiVWludDhBcnJheS5oIgotI2lu
Y2x1ZGUgIldlYkdMTGF5ZXIuaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250
ZXh0Lmg+CisKKyNpZiBQTEFURk9STShNQUMpCiAjaW5jbHVkZSA8T3BlbkdML0NHTFJlbmRlcmVy
cy5oPgogI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2VuZGlmCisKICNpbmNsdWRlIDx3dGYvVW51
c2VkUGFyYW0uaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAotc3RhdGljIHZvaWQgc2V0UGl4ZWxGb3JtYXQoVmVjdG9yPENHTFBpeGVsRm9y
bWF0QXR0cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9yQml0cywgaW50IGRlcHRoQml0cywgYm9v
bCBhY2NlbGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwgYm9vbCBjbG9zZXN0KQotewotICAgIGF0
dHJpYnMuY2xlYXIoKTsKLSAgICAKLSAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ29sb3JTaXpl
KTsKLSAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0
ZT4oY29sb3JCaXRzKSk7Ci0gICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQURlcHRoU2l6ZSk7Ci0g
ICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGRl
cHRoQml0cykpOwotICAgIAotICAgIGlmIChhY2NlbGVyYXRlZCkKLSAgICAgICAgYXR0cmlicy5h
cHBlbmQoa0NHTFBGQUFjY2VsZXJhdGVkKTsKLSAgICBlbHNlIHsKLSAgICAgICAgYXR0cmlicy5h
cHBlbmQoa0NHTFBGQVJlbmRlcmVySUQpOwotICAgICAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNf
Y2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NHTFJlbmRlcmVyR2VuZXJpY0Zsb2F0SUQp
KTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChzdXBlcnNhbXBsZSkKLSAgICAgICAgYXR0cmli
cy5hcHBlbmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKLSAgICAgICAgCi0gICAgaWYgKGNsb3Nlc3Qp
Ci0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFDbG9zZXN0UG9saWN5KTsKLSAgICAgICAg
Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+
KDApKTsKLX0KLQotUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRD4gR3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRycywgSG9zdFdpbmRv
dyogaG9zdFdpbmRvdykKLXsKLSAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNvbnRleHQo
bmV3IEdyYXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0V2luZG93KSk7Ci0gICAgcmV0dXJuIGNv
bnRleHQtPm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVsZWFzZSgpIDogMDsKLX0KLQotR3JhcGhp
Y3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1
dGVzIGF0dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93KQotICAgIDogbV9jdXJyZW50V2lkdGgo
MCkKLSAgICAsIG1fY3VycmVudEhlaWdodCgwKQotICAgICwgbV9hdHRycyhhdHRycykKLSAgICAs
IG1fY29udGV4dE9iaigwKQotICAgICwgbV90ZXh0dXJlKDApCi0gICAgLCBtX2ZibygwKQotICAg
ICwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIoMCkKLSAgICAsIG1fYm91bmRGQk8oMCkKLSAgICAsIG1f
bXVsdGlzYW1wbGVGQk8oMCkKLSAgICAsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIo
MCkKLSAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcigwKQotewotICAgIFVOVVNFRF9QQVJB
TShob3N0V2luZG93KTsKLQotICAgIFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4gYXR0
cmliczsKLSAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhlbEZvcm1hdE9iaiA9IDA7Ci0gICAgR0xp
bnQgbnVtUGl4ZWxGb3JtYXRzID0gMDsKLSAgICAKLSAgICAvLyBXZSB3aWxsIHRyeToKLSAgICAv
LwotICAgIC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQvc3VwZXJz
YW1wbGVkCi0gICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMyIGJpdCBkZXB0aC9hY2NlbGVyYXRlZAot
ICAgIC8vICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQKLSAgICAvLyAg
NCkgY2xvc2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvc29mdHdhcmUgcmVuZGVyZXIK
LSAgICAvLwotICAgIC8vICBJZiBub25lIG9mIHRoYXQgd29ya3MsIHdlIHNpbXBseSBmYWlsIGFu
ZCBzZXQgbV9jb250ZXh0T2JqIHRvIDAuCi0gICAgCi0gICAgc2V0UGl4ZWxGb3JtYXQoYXR0cmli
cywgMzIsIDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0gICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQo
YXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7Ci0gICAg
aWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJp
YnMsIDMyLCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxG
b3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7
Ci0gICAgICAgIAotICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsKLSAgICAgICAg
ICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsK
LSAgICAgICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxG
b3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAgICAgICAKLSAgICAgICAgICAgIGlmIChu
dW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0
dHJpYnMsIDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgICAgICAgICBDR0xD
aG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4
ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0
cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIGFuIGFjY2Vw
dGFibGUgcmVuZGVyZXIgLSBmYWlsCi0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAg
Q0dMRXJyb3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1hdE9iaiwgMCwgJm1fY29u
dGV4dE9iaik7Ci0gICAgQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0T2JqKTsKLSAg
ICAKLSAgICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8ICFtX2NvbnRleHRPYmopIHsKLSAgICAg
ICAgLy8gQ291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4dCAtIGZhaWwKLSAgICAgICAgbV9jb250
ZXh0T2JqID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgY3Vy
cmVudCBjb250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8gdXMuCi0gICAgQ0dMU2V0Q3VycmVudENv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKLSAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKLQot
ICAgIC8vIENyZWF0ZSB0aGUgV2ViR0xMYXllcgotICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUwotICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGlu
aXRXaXRoR3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOwotI2lmbmRlZiBOREVCVUcKLSAgICAgICAg
W21fd2ViR0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2ViR0wgTGF5ZXIiXTsKLSNlbmRpZiAgICAK
LSAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCi0gICAgCi0gICAgLy8gY3JlYXRlIGEgdGV4
dHVyZSB0byByZW5kZXIgaW50bwotICAgIDo6Z2xHZW5UZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsK
LSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKLSAgICA6Omds
VGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJ
TkVBUik7Ci0gICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9N
SU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVf
MkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7Ci0gICAgOjpnbFRleFBhcmFtZXRlcmko
R0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QKTsKLSAgICA6OmdsQmlu
ZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgCi0gICAgLy8gY3JlYXRlIGFuIEZCTwot
ICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKLSAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgIAotICAgIG1fYm91bmRG
Qk8gPSBtX2ZibzsKLSAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5j
aWwgfHwgbV9hdHRycy5kZXB0aCkpCi0gICAgICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEs
ICZtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0KLSAgICAvLyBjcmVhdGUgYW4gbXVsdGlzYW1wbGUg
RkJPCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xHZW5GcmFtZWJ1
ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVm
ZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIG1f
Ym91bmRGQk8gPSBtX211bHRpc2FtcGxlRkJPOwotICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMu
c3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZl
cnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgIH0KLSAgICAK
LSAgICAvLyBBTkdMRSBpbml0aWFsaXphdGlvbi4KLQotICAgIFRCdWlsdEluUmVzb3VyY2UgQU5H
TEVSZXNvdXJjZXM7Ci0KLSAgICBBTkdMRVJlc291cmNlcy5tYXhWZXJ0ZXhBdHRyaWJzID0gMDsK
LSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAm
QU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4
dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1heFZlcnRl
eFVuaWZvcm1WZWN0b3JzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyA9
IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RP
UlMsICZBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBo
aWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291
cmNlcy5tYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3ND
b250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJj
ZXMubWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4
VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNE
OjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLm1heFRleHR1cmVJbWFn
ZVVuaXRzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0g
MDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZP
Uk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOwot
Ci0gICAgLy8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCi0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4RHJhd0J1ZmZlcnMgPSAxOwotICAgIAotICAgIG1fY29tcGlsZXIuc2V0UmVzb3VyY2Vz
KEFOR0xFUmVzb3VyY2VzKTsKLSAgICAKLSAgICA6OmdsRW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFN
X1BPSU5UX1NJWkUpOwotICAgIDo6Z2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwotfQotCi1HcmFw
aGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKLXsKLSAgICBpZiAobV9jb250ZXh0
T2JqKSB7Ci0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
ICAgIDo6Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKLSAgICAgICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgx
LCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0
ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVy
YnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAg
ICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRkJPKTsKLSAg
ICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRy
cy5kZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAm
bV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIDo6Z2xEZWxldGVGcmFt
ZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKLSAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoMCk7
Ci0gICAgICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgfQotfQotCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0ZXMoKQogewogICAgIGNvbnN0
IGNoYXIqIGV4dGVuc2lvbnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0
U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKQEAgLTI1NCwxMSArNzUsNiBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0CiAgICAgbV9hdHRycy5wcmVtdWx0aXBsaWVkQWxw
aGEgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29udGV4dEN1cnJl
bnQoKQotewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci19Ci0KIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVyaW5nUmVzdWx0c1RvQ2FudmFzKENhbnZh
c1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCiB7CiAgICAgSFRNTENhbnZhc0VsZW1lbnQqIGNh
bnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwpAQCAtMzA3LDIxICsxMjMsNiBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1JlCiAgICAgICAgICAgICAgICAgICBjYW52YXMt
PndpZHRoKCksIGNhbnZhcy0+aGVpZ2h0KCksIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRm
b3JtQ29udGV4dCgpKTsKIH0KIAotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBs
aWFudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc0dMRVMyTlBPVFN0cmljdCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVkT25PdXRPZkJvdW5k
c0FjY2Vzc2VzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIGlmICh3
aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFt
X2NvbnRleHRPYmopCkBAIC00NTMsMTkgKzI1NCw5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnJlc2hhcGUoaW50IHdpZHQKICAgICA6OmdsRmx1c2goKTsKIH0KIAotc3RhdGljIGlubGluZSB2
b2lkIGVuc3VyZUNvbnRleHQoQ0dMQ29udGV4dE9iaiBjb250ZXh0KQotewotICAgIGlmICghY29u
dGV4dCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBDR0xDb250ZXh0T2JqIGN1cnJl
bnRDb250ZXh0ID0gQ0dMR2V0Q3VycmVudENvbnRleHQoKTsKLSAgICBpZiAoY3VycmVudENvbnRl
eHQgIT0gY29udGV4dCkKLSAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoY29udGV4dCk7Ci19
Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnByZXBhcmVUZXh0dXJlKCkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcykgewogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JF
QURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwpAQCAtNDc3LDcg
KzI2OCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnByZXBhcmVUZXh0dXJlKCkKIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRleHR1cmUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKIH0KIApAQCAtNDg1LDI3ICsyNzYs
MjcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKFBsYQogewogICAgIEFT
U0VSVChwcm9ncmFtKTsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xBdHRhY2hTaGFkZXIo
KEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YmluZEF0dHJpYkxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5z
aWduZWQgbG9uZyBpbmRleCwgY29uc3QgU3RyaW5nJiBuYW1lKQogewogICAgIEFTU0VSVChwcm9n
cmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xCaW5kQXR0cmliTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgaW5kZXgs
IG5hbWUudXRmOCgpLmRhdGEoKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRC
dWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAg
ICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZmZXIpOwogfQogCiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwg
UGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgZmJvOwogICAgIGlmIChidWZm
ZXIpCiAgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOwpAQCAtNTE5LDEwNiArMzEwLDEwNiBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIoCiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRm
b3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQo
dGFyZ2V0LCAoR0x1aW50KSByZW5kZXJidWZmZXIpOwogfQogCiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0
IHRleHR1cmUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQmluZFRleHR1cmUodGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRDb2xvcihkb3VibGUgcmVkLCBk
b3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQmxlbmRD
b2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwg
c3RhdGljX2Nhc3Q8ZmxvYXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBt
b2RlICkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xCbGVuZEVxdWF0aW9uKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpibGVuZEVxdWF0aW9uU2VwYXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1
bnNpZ25lZCBsb25nIG1vZGVBbHBoYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUo
bW9kZVJHQiwgbW9kZUFscGhhKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVu
ZEZ1bmModW5zaWduZWQgbG9uZyBzZmFjdG9yLCB1bnNpZ25lZCBsb25nIGRmYWN0b3IpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3IpOwogfSAgICAgICAKIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YmxlbmRGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVu
c2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNpZ25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25n
IGRzdEFscGhhKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgOjpnbEJsZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBz
cmNBbHBoYSwgZHN0QWxwaGEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJE
YXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgMCwgdXNhZ2UpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBpbnQg
c2l6ZSwgY29uc3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xC
dWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpidWZmZXJTdWJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNl
dCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQnVmZmVyU3ViRGF0YSh0
YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7CiB9CiAKIHVuc2lnbmVkIGxvbmcgR3JhcGhpY3ND
b250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0dXModW5zaWduZWQgbG9uZyB0YXJnZXQpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICByZXR1cm4gOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQodGFyZ2V0KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJDb2xvcihkb3VibGUgciwgZG91YmxlIGcsIGRv
dWJsZSBiLCBkb3VibGUgYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xDbGVhckNvbG9yKHN0YXRpY19jYXN0PGZsb2F0
PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRp
Y19jYXN0PGZsb2F0PihhKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyKHVu
c2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xDbGVhcihtYXNrKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXJE
ZXB0aChkZXB0aCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbChs
b25nIHMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJvb2wgYmx1ZSwgYm9vbCBh
bHBoYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQogewogICAgIEFTU0VSVChzaGFkZXIpOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICBpbnQgR0xzaGFkZXJUeXBlOwog
ICAgIEFOR0xFU2hhZGVyVHlwZSBzaGFkZXJUeXBlOwpAQCAtNjY5LDcgKzQ2MCw3IEBAIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGwKIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y29weVRleEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIHVu
c2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25n
IHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBpZiAobV9h
dHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVGQk8pOwogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJB
TUVCVUZGRVJfRVhULCBtX2Zibyk7CkBAIC02ODMsNyArNDc0LDcgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Y29weVRleEltYWdlMkQodQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5
VGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4b2Zm
c2V0LCBsb25nIHlvZmZzZXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1
bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
QEAgLTY5NywyNSArNDg4LDI1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhTdWJJ
bWFnZTIKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9uZyBt
b2RlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbEN1bGxGYWNlKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBmdW5jKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbERlcHRoRnVuYyhm
dW5jKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNrKGJvb2wgZmxhZykK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xEZXB0aE1hc2soZmxhZyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlcHRoUmFuZ2UoZG91YmxlIHpOZWFyLCBkb3VibGUgekZhcikKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEZXB0aFJh
bmdlKHpOZWFyLCB6RmFyKTsKIH0KIApAQCAtNzIzLDYxICs1MTQsNjEgQEAgdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYQogewogICAgIEFTU0VSVChwcm9ncmFtKTsKICAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
ZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEZXRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwg
KEdMdWludCkgc2hhZGVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGlzYWJsZSh1
bnNpZ25lZCBsb25nIGNhcCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEaXNhYmxlKGNhcCk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGlu
ZGV4KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdBcnJheXModW5zaWduZWQgbG9uZyBtb2RlLCBsb25n
IGZpcnN0LCBsb25nIGNvdW50KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmlyc3QsIGNv
dW50KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVuc2lnbmVk
IGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBsb25n
IG9mZnNldCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIHJlaW50
ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IDo6Z2xFbmFibGUoY2FwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlVmVy
dGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xFbmFibGVWZXJ0
ZXhBdHRyaWJBcnJheShpbmRleCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlz
aCgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsRmluaXNoKCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZs
dXNoKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xGbHVzaCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpm
cmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9u
ZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHJlbmRlcmJ1ZmZlcnRhcmdldCwgUGxhdGZvcm0z
RE9iamVjdCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWludCkgYnVm
ZmVyOwogICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkgewog
ICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBUSF9BVFRB
Q0hNRU5ULCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7CkBAIC03ODgsMTkgKzU3
OSwxOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlCiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgdGV4dGFyZ2V0LCBQ
bGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxvbmcgbGV2ZWwpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRnJhbWVidWZm
ZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChHTHVpbnQpIHRl
eHR1cmUsIGxldmVsKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJvbnRGYWNlKHVu
c2lnbmVkIGxvbmcgbW9kZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xGcm9udEZhY2UobW9kZSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFwKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7CiB9CiAKQEAgLTgxMCw3ICs2MDEs
NyBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIoCiAgICAgICAgIHN5
bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6ZSA9IDA7CiAgICAgOjpnbEdldFByb2dyYW1p
dihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9M
RU5HVEgsICZtYXhBdHRyaWJ1dGVTaXplKTsKICAgICBHTGNoYXIgbmFtZVttYXhBdHRyaWJ1dGVT
aXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVy
bWluYXRpb24KQEAgLTgzMiw3ICs2MjMsNyBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRB
Y3RpdmVVbmlmb3JtCiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwog
ICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbWF4VW5pZm9ybVNpemUgPSAw
OwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xf
QUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCwgJm1heFVuaWZvcm1TaXplKTsKICAgICBHTGNoYXIg
bmFtZVttYXhVbmlmb3JtU2l6ZV07IC8vIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggaW5j
bHVkZXMgbnVsbCB0ZXJtaW5hdGlvbgpAQCAtODU0LDcgKzY0NSw3IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGUKICAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5W
QUxJRF9WQUxVRSk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0QXR0YWNoZWRT
aGFkZXJzKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIG1heENvdW50LCBjb3VudCwgc2hh
ZGVycyk7CiB9CiAKQEAgLTg2Miw4ICs2NTMsOCBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEF0dHJpYkxvY2F0aW9uCiB7CiAgICAgaWYgKCFwcm9ncmFtKQogICAgICAgICByZXR1cm4gLTE7
Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIHJldHVybiA6OmdsR2V0QXR0cmliTG9jYXRpb24oKEdMdWludCkgcHJvZ3Jh
bSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKIH0KIApAQCAtODgxLDE5ICs2NzIsMTkgQEAgdW5zaWdu
ZWQgbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RXJybwogICAgICAgICByZXR1cm4gZXJyOwog
ICAgIH0KIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xHZXRFcnJvcigpOwogfQogCiBTdHJpbmcgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gU3Ry
aW5nKChjb25zdCBjaGFyKikgOjpnbEdldFN0cmluZyhuYW1lKSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9k
ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xIaW50KHRhcmdldCwgbW9kZSk7CiB9CiAKQEAgLTkwMSwxNCArNjkyLDE0
IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzQnVmZmVyKFBsYXRmb3IKIHsKICAgICBpZiAo
IWJ1ZmZlcikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElz
QnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7CiB9CiAKIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6Omlz
RW5hYmxlZCh1bnNpZ25lZCBsb25nIGNhcCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHJldHVybiA6OmdsSXNFbmFibGVkKGNh
cCk7CiB9CiAKQEAgLTkxNiw4ICs3MDcsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Zy
YW1lYnVmZmVyKFBsCiB7CiAgICAgaWYgKCFmcmFtZWJ1ZmZlcikKICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzRnJhbWVidWZmZXJFWFQoKEdMdWludCkgZnJh
bWVidWZmZXIpOwogfQogCkBAIC05MjUsOCArNzE2LDggQEAgYm9vbCBHcmFwaGljc0NvbnRleHQz
RDo6aXNQcm9ncmFtKFBsYXRmbwogewogICAgIGlmICghcHJvZ3JhbSkKICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFt
KTsKIH0KIApAQCAtOTM0LDggKzcyNSw4IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVu
ZGVyYnVmZmVyKFAKIHsKICAgICBpZiAoIXJlbmRlcmJ1ZmZlcikKICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzUmVuZGVyYnVmZmVyRVhUKChHTHVpbnQpIHJl
bmRlcmJ1ZmZlcik7CiB9CiAKQEAgLTk0Myw4ICs3MzQsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4
dDNEOjppc1NoYWRlcihQbGF0Zm9yCiB7CiAgICAgaWYgKCFzaGFkZXIpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIp
OwogfQogCkBAIC05NTIsMzMgKzc0MywzMyBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1Rl
eHR1cmUoUGxhdGZvCiB7CiAgICAgaWYgKCF0ZXh0dXJlKQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIHJldHVybiA6OmdsSXNUZXh0dXJlKChHTHVpbnQpIHRleHR1cmUpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpsaW5lV2lkdGgoZG91YmxlIHdpZHRoKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbExpbmVXaWR0aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQogewog
ICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xMaW5rUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFt
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGl4ZWxTdG9yZWkodW5zaWduZWQgbG9u
ZyBwbmFtZSwgbG9uZyBwYXJhbSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xQaXhlbFN0b3JlaShwbmFtZSwgcGFyYW0p
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0KGRvdWJsZSBmYWN0
b3IsIGRvdWJsZSB1bml0cykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZs
b2F0PihmYWN0b3IpLCBzdGF0aWNfY2FzdDxmbG9hdD4odW5pdHMpKTsKIH0KIApAQCAtOTg2LDcg
Kzc3Nyw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyAKIHsKICAg
ICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0d28gZ2xGbHVzaCBjYWxscyB3aGVuIHRoZSBkcml2ZXIg
YnVnIGlzIGZpeGVkLCBpLmUuLAogICAgIC8vIGFsbCBwcmV2aW91cyByZW5kZXJpbmcgY2FsbHMg
c2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJlYWRpbmcgcGl4ZWxzLgotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEZsdXNoKCk7CiAg
ICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZC
TykgewogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRkJPKTsKQEAgLTEwMDMsMTMgKzc5NCwxMyBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpy
ZWxlYXNlU2hhZGVyQ29tcGlsZXIoKQogewogICAgIC8vIEZJWE1FOiBUaGlzIGlzIG5vdCBpbXBs
ZW1lbnRlZCBvbiBkZXNrdG9wIE9wZW5HTC4gV2UgbmVlZCB0byBoYXZlIGlmZGVmcyBmb3IgdGhl
IGRpZmZlcmVudCBHTCB2YXJpYW50cwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgLy86OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWdu
ZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgc3dpdGNoIChpbnRlcm5hbGZv
cm1hdCkgewogICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKICAgICAgICAgaW50ZXJuYWxmb3JtYXQg
PSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKQEAgLTEwMzAsMjEgKzgyMSwyMSBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJsZSB2YWx1ZSwgYm9vbCBpbnZlcnQpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
U2FtcGxlQ292ZXJhZ2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQg
bG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU2Npc3Nvcih4LCB5
LCB3aWR0aCwgaGVpZ2h0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291
cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCBjb25zdCBTdHJpbmcmIHN0cmluZykKIHsKICAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICBTaGFkZXJTb3VyY2VFbnRyeSBlbnRyeTsK
IApAQCAtMTA1NSwyNzAgKzg0NiwyNzAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVy
U291cmNlKFBsYQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuYyh1bnNpZ25l
ZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3Rl
bmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
c3RlbmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZnVu
YywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2lsRnVuY1Nl
cGFyYXRlKGZhY2UsIGZ1bmMsIHJlZiwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxNYXNrKHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2lsTWFz
ayhtYXNrKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0
ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVu
Y2lsTWFza1NlcGFyYXRlKGZhY2UsIG1hc2spOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpzdGVuY2lsT3AodW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNp
Z25lZCBsb25nIHpwYXNzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFN0ZW5jaWxPcChmYWlsLCB6ZmFpbCwgenBhc3Mp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSh1bnNpZ25l
ZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5z
aWduZWQgbG9uZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWls
LCB6ZmFpbCwgenBhc3MpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0
ZXJmKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbFRleFBhcmFtZXRlcmYodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVl
KSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQg
dGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgaW50IHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFRleFBhcmFtZXRl
cmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xVbmlmb3JtMWYobG9jYXRpb24sIHYwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybTFmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbFVuaWZvcm0xZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9h
dCB2MSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtMmYobG9jYXRpb24sIHYwLCB2MSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5
LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlw
bGUgb2YgMgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0yZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYw
LCBmbG9hdCB2MSwgZmxvYXQgdjIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTNmKGxvY2F0aW9uLCB2MCwg
djEsIHYyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdihsb25nIGxv
Y2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGgg
bmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlvbiwg
c2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYobG9u
ZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBp
bnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUg
b2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxvbmcgbG9jYXRpb24sIGludCB2MCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xVbmlmb3JtMWkobG9jYXRpb24sIHYwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybTFpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNp
emUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSwg
aW50IHYyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0zaShsb2NhdGlvbiwgdjAsIHYxLCB2Mik7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYobG9uZyBsb2NhdGlvbiwgaW50KiBh
cnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9uLCBpbnQg
djAsIGludCB2MSwgaW50IHYyLCBpbnQgdjMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTRpKGxvY2F0aW9u
LCB2MCwgdjEsIHYyLCB2Myk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00
aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtNGl2KGxv
Y2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm1NYXRyaXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwg
aW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxl
IG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2Us
IGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihs
b25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsK
ICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpn
bFVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4NGZ2KGxvbmcgbG9jYXRpb24s
IGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1F
OiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm1NYXRy
aXg0ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IDo6Z2xVc2VQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp2YWxpZGF0ZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQogewogICAg
IEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZhbGlkYXRlUHJvZ3JhbSgoR0x1aW50
KSBwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYo
dW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIxZihp
bmR4LCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdih1
bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIx
ZnYoaW5keCwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xW
ZXJ0ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp2ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsVmVydGV4QXR0cmliMmZ2KGluZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliM2YodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxv
YXQgdjEsIGZsb2F0IHYyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjNmKGluZHgsIHYwLCB2MSwg
djIpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZnYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliM2Z2KGlu
ZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYo
dW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2
MykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZihpbmR4LCB2MCwgdjEsIHYyLCB2Myk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmdih1bnNpZ25lZCBsb25nIGlu
ZHgsIGZsb2F0KiBhcnJheSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgYXJyYXkp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2ln
bmVkIGxvbmcgaW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQsIHVuc2ln
bmVkIGxvbmcgc3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhB
dHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRl
cnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVk
IGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZpZXdwb3J0KHN0
YXRpY19jYXN0PEdMaW50Pih4KSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KHkpLCBzdGF0aWNfY2FzdDxH
THNpemVpPih3aWR0aCksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KGhlaWdodCkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCb29sZWFudih1bnNpZ25lZCBsb25nIHBuYW1lLCB1bnNp
Z25lZCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25l
ZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6
Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCog
dmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsR2V0RmxvYXR2KHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcg
cG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lM
X0FUVEFDSE1FTlQpCiAgICAgICAgIGF0dGFjaG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBP
ciBTVEVOQ0lMX0FUVEFDSE1FTlQsIGVpdGhlciB3b3Jrcy4KICAgICA6OmdsR2V0RnJhbWVidWZm
ZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFs
dWUpOwpAQCAtMTMzMyw3ICsxMTI0LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0SW50
ZWdlcnYodW5zaQogICAgIC8vIGJlY2F1c2UgZGVza3RvcCBHTCdzIGNvcnJlc3BvbmRpbmcgcXVl
cmllcyByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCiAgICAgLy8gd2hlcmVhcyBHTEVT
MiByZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzIChlYWNoIHZlY3RvciBoYXMgNCBjb21wb25l
bnRzKS4KICAgICAvLyBUaGVyZWZvcmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZXNrdG9wIEdM
IG5lZWRzIHRvIGJlIGRpdmlkZWQgYnkgNC4KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHN3aXRjaCAocG5hbWUpIHsKICAgICBjYXNl
IElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFUOgogICAgICAgICAqdmFsdWUgPSBHTF9S
R0I7CkBAIC0xMzYwLDE1ICsxMTUxLDE1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldElu
dGVnZXJ2KHVuc2kKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRm
b3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKIH0K
IAogU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyhQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCiB7CiAgICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTGlu
dCBsZW5ndGg7CiAgICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBHTF9JTkZP
X0xPR19MRU5HVEgsICZsZW5ndGgpOwogICAgIApAQCAtMTM4NSwxNiArMTE3NiwxNiBAQCBTdHJp
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1JbmZvCiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1
bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFJlbmRlcmJ1ZmZl
clBhcmFtZXRlcml2RVhUKHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0U2hhZGVyaXYoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVk
IGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAorCisgICAgZW5zdXJlQ29udGV4
dCgpOworCiAgICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46
Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKICAgICAK
ICAgICBzd2l0Y2ggKHBuYW1lKSB7CkBAIC0xNDA0LDI1ICsxMTk1LDI1IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KFBsYXQKICAgICAgICAgCiAgICAgICAgICAgICA6Omds
R2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBwbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAg
YnJlYWs7Ci0KKyAgICAgICAgCiAgICAgICAgIGNhc2UgQ09NUElMRV9TVEFUVVM6CiAgICAgICAg
ICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKSB7CiAgICAgICAgICAg
ICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KGZhbHNlKTsKICAgICAgICAgICAgICAg
ICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisgICAgICAgIAogICAg
ICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3VsdC0+c2Vjb25kLmlzVmFs
aWQpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKyAgICAgICAgCiAgICAgICAg
IGNhc2UgSU5GT19MT0dfTEVOR1RIOgogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRl
clNvdXJjZU1hcC5lbmQoKSkgewogICAgICAgICAgICAgICAgICgqdmFsdWUpID0gMDsKICAgICAg
ICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKyAgICAgICAg
CiAgICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlckluZm9Mb2coc2hhZGVyKS5sZW5ndGgo
KTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgICBj
YXNlIFNIQURFUl9TT1VSQ0VfTEVOR1RIOgogICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFk
ZXJTb3VyY2Uoc2hhZGVyKS5sZW5ndGgoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQzNiw3
ICsxMjI3LDcgQEAgU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTAogewog
ICAgIEFTU0VSVChzaGFkZXIpOwogCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTGludCBsZW5ndGg7CiAgICAgOjpnbEdldFNoYWRl
cml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKIApAQCAt
MTQ3MSw3ICsxMjYyLDcgQEAgU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3Vy
YwogewogICAgIEFTU0VSVChzaGFkZXIpOwogCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKIAogICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVj
dCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1h
cC5maW5kKHNoYWRlcik7CiAKQEAgLTE0ODQsNTIgKzEyNzUsNTIgQEAgU3RyaW5nIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJTb3VyYwogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRU
ZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
ZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5hbWUs
IHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsR2V0VGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtZnYoUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtLCBsb25nIGxvY2F0aW9uLCBmbG9hdCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0VW5pZm9ybWZ2
KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGxvbmcgbG9j
YXRpb24sIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0VW5pZm9ybWl2KChHTHVpbnQpIHByb2dy
YW0sIGxvY2F0aW9uLCB2YWx1ZSk7CiB9CiAKIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVu
aWZvcm1Mb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFt
ZSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHJldHVybiA6OmdsR2V0VW5p
Zm9ybUxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYmZ2KHVuc2lnbmVkIGxvbmcg
aW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRW
ZXJ0ZXhBdHRyaWJmdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRl
eCwgcG5hbWUsIHZhbHVlKTsKIH0KIAogbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4
QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAorICAgIGVuc3VyZUNvbnRl
eHQoKTsKKwogICAgIHZvaWQqIHBvaW50ZXI7CiAgICAgOjpnbEdldFZlcnRleEF0dHJpYlBvaW50
ZXJ2KGluZGV4LCBwbmFtZSwgJnBvaW50ZXIpOwogICAgIHJldHVybiByZWludGVycHJldF9jYXN0
PGxvbmc+KHBvaW50ZXIpOwpAQCAtMTUzNyw3ICsxMzI4LDcgQEAgbG9uZyBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VmVydGV4QXR0cmliTwogCiBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdl
MkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgaW50ZXJuYWxmb3Jt
YXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJvcmRlciwgdW5z
aWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKIAogICAgIDo6Z2xU
ZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBi
b3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKICAgICByZXR1cm4gMDsKQEAgLTE1NDUsNyAr
MTMzNiw3IEBAIGludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1bnNpZ24KIAogaW50
IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhTdWJJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWdu
ZWQgbGV2ZWwsIHVuc2lnbmVkIHhvZmYsIHVuc2lnbmVkIHlvZmYsIHVuc2lnbmVkIHdpZHRoLCB1
bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4
ZWxzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAKICAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQaXhlbFN0
b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlmZmVyIGZy
b20gdGhlIHN1YmltYWdlIHNpemUKICAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVs
LCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CkBAIC0x
NTU0LDcgKzEzNDUsNyBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdlMkQodW5z
CiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVCdWZmZXIoKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1
aW50IG87CiAgICAgZ2xHZW5CdWZmZXJzKDEsICZvKTsKICAgICByZXR1cm4gbzsKQEAgLTE1NjIs
NyArMTM1Myw3IEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVCdWZmZXIKIAog
dW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUZyYW1lYnVmZmVyKCkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdM
dWludCBvOwogICAgIGdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZvKTsKICAgICByZXR1cm4gbzsK
QEAgLTE1NzAsMTMgKzEzNjEsMTMgQEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZUZyYW1lYgogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICByZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7CiB9CiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjcmVhdGVSZW5kZXJidWZmZXIoKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1aW50IG87CiAgICAgZ2xHZW5S
ZW5kZXJidWZmZXJzRVhUKDEsICZvKTsKICAgICByZXR1cm4gbzsKQEAgLTE1ODQsMTMgKzEzNzUs
MTMgQEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcgogCiB1bnNpZ25l
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlU2hhZGVyKHVuc2lnbmVkIGxvbmcgdHlwZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpID8gR0xf
RlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7CiB9CiAKIHVuc2lnbmVkIEdyYXBo
aWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMdWludCBvOwogICAgIGdsR2Vu
VGV4dHVyZXMoMSwgJm8pOwogICAgIHJldHVybiBvOwpAQCAtMTU5OCwzNyArMTM4OSwzNyBAQCB1
bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyCiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmRlbGV0ZUJ1ZmZlcih1bnNpZ25lZCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBnbERlbGV0ZUJ1
ZmZlcnMoMSwgJmJ1ZmZlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZy
YW1lYnVmZmVyKHVuc2lnbmVkIGZyYW1lYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZl
cnNFWFQoMSwgJmZyYW1lYnVmZmVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVs
ZXRlUHJvZ3JhbSh1bnNpZ25lZCBwcm9ncmFtKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dy
YW0pOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5z
aWduZWQgcmVuZGVyYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZy
ZW5kZXJidWZmZXIpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVTaGFkZXIo
dW5zaWduZWQgc2hhZGVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSh1bnNpZ25lZCB0ZXh0dXJlKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAg
ICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7CiB9CiAKSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tCShy
ZXZpc2lvbiA2NjYyNykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNz
Q29udGV4dDNETWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMSwyMiArMzEsMjIgQEAKIAogI2lt
cG9ydCAiQmxvY2tFeGNlcHRpb25zLmgiCiAKLSNpbmNsdWRlICJBTkdMRS9SZXNvdXJjZUxpbWl0
cy5oIgorI2luY2x1ZGUgIkFOR0xFL1NoYWRlckxhbmcuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZl
ci5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgotI2luY2x1ZGUgIldlYkdMT2JqZWN0
LmgiCiAjaW5jbHVkZSAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPENvcmVH
cmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KICNpbmNsdWRlICJGbG9hdDMyQXJyYXkuaCIKICNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2FudmFzRWxlbWVudC5o
IgogI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiSW50MzJBcnJheS5oIgogI2lu
Y2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1
ZGUgIldlYkdMTGF5ZXIuaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0
Lmg+CiAjaW5jbHVkZSA8T3BlbkdML0NHTFJlbmRlcmVycy5oPgogI2luY2x1ZGUgPE9wZW5HTC9n
bC5oPgorI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVyLmgiCisj
aW5jbHVkZSAiV2ViR0xPYmplY3QuaCIKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KICNp
bmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTE4NiwyMyArMTg2LDIzIEBAIEdyYXBo
aWNzQ29udGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmEKIAogICAgIFRCdWlsdEluUmVzb3Vy
Y2UgQU5HTEVSZXNvdXJjZXM7CiAKLSAgICBBTkdMRVJlc291cmNlcy5tYXhWZXJ0ZXhBdHRyaWJz
ID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRS
SUJTLCAmQU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNz
Q29udGV4dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1h
eFZlcnRleFVuaWZvcm1WZWN0b3JzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVj
dG9ycyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5H
X1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhWYXJ5aW5nVmVjdG9ycyk7Ci0gICAgQU5HTEVS
ZXNvdXJjZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2
KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdM
RVJlc291cmNlcy5tYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3Jh
cGhpY3NDb250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVS
ZXNvdXJjZXMubWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMubWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29u
dGV4dDNEOjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLm1heFRleHR1
cmVJbWFnZVVuaXRzKTsKLSAgICBBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0
b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5U
X1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLm1heEZyYWdtZW50VW5pZm9ybVZlY3Rv
cnMpOworICAgIEFOR0xFUmVzb3VyY2VzLk1heFZlcnRleEF0dHJpYnMgPSAwOworICAgIGdldElu
dGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX0FUVFJJQlMsICZBTkdMRVJlc291
cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhVbmlm
b3JtVmVjdG9ycyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9W
RVJURVhfVU5JRk9STV9WRUNUT1JTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZl
Y3RvcnMpOworICAgIEFOR0xFUmVzb3VyY2VzLk1heFZhcnlpbmdWZWN0b3JzID0gMDsKKyAgICBn
ZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZBUllJTkdfVkVDVE9SUywgJkFOR0xF
UmVzb3VyY2VzLk1heFZhcnlpbmdWZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0
ZXhUZXh0dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0
M0Q6Ok1BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFZl
cnRleFRleHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhDb21iaW5lZFRl
eHR1cmVJbWFnZVVuaXRzID0gMDsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6
TUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5NYXhDb21i
aW5lZFRleHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhUZXh0dXJlSW1h
Z2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9URVhU
VVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMpOwor
ICAgIEFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdl
dEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JT
LCAmQU5HTEVSZXNvdXJjZXMuTWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyk7CiAKICAgICAvLyBB
bHdheXMgc2V0IHRvIDEgZm9yIE9wZW5HTCBFUy4KLSAgICBBTkdMRVJlc291cmNlcy5tYXhEcmF3
QnVmZmVycyA9IDE7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSAxOwogICAg
IAogICAgIG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xFUmVzb3VyY2VzKTsKICAgICAKQEAg
LTIzMCw4MSArMjMwLDE0IEBAIEdyYXBoaWNzQ29udGV4dDNEOjp+R3JhcGhpY3NDb250ZXh0M0Qo
KQogICAgIH0KIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVz
KCkKLXsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25z
dCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7Ci0gICAgaWYgKG1fYXR0cnMu
c3RlbmNpbCkgewotICAgICAgICBpZiAoc3RkOjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9w
YWNrZWRfZGVwdGhfc3RlbmNpbCIpKSB7Ci0gICAgICAgICAgICBpZiAoIW1fYXR0cnMuZGVwdGgp
Ci0gICAgICAgICAgICAgICAgbV9hdHRycy5kZXB0aCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZQot
ICAgICAgICAgICAgbV9hdHRycy5zdGVuY2lsID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtX2F0
dHJzLmFudGlhbGlhcykgewotICAgICAgICBib29sIGlzVmFsaWRWZW5kb3IgPSB0cnVlOwotICAg
ICAgICAvLyBDdXJyZW50bHkgaW4gTWFjIHdlIG9ubHkgdHVybiBvbiBhbnRpYWxpYXMgaWYgdmVu
ZG9yIGlzIE5WSURJQS4KLSAgICAgICAgY29uc3QgY2hhciogdmVuZG9yID0gcmVpbnRlcnByZXRf
Y2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKLSAgICAgICAgaWYg
KCFzdGQ6OnN0cnN0cih2ZW5kb3IsICJOVklESUEiKSkKLSAgICAgICAgICAgIGlzVmFsaWRWZW5k
b3IgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFpc1ZhbGlkVmVuZG9yIHx8ICFzdGQ6OnN0cnN0cihl
eHRlbnNpb25zLCAiR0xfRVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIikpCi0gICAgICAgICAg
ICBtX2F0dHJzLmFudGlhbGlhcyA9IGZhbHNlOwotICAgIH0KLSAgICAvLyBGSVhNRTogaW5zdGVh
ZCBvZiBlbmZvcmNpbmcgcHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZSwgaW1wbGVtZW50IHRoZQot
ICAgIC8vIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBwcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZSBp
cyByZXF1ZXN0ZWQuCi0gICAgbV9hdHRycy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQoKQotewotICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnBhaW50UmVuZGVyaW5nUmVzdWx0c1RvQ2FudmFzKENhbnZhc1JlbmRlcmluZ0NvbnRl
eHQqIGNvbnRleHQpCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbnN1cmVDb250ZXh0KCkKIHsK
LSAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzID0gY29udGV4dC0+Y2FudmFzKCk7Ci0gICAg
SW1hZ2VCdWZmZXIqIGltYWdlQnVmZmVyID0gY2FudmFzLT5idWZmZXIoKTsKLQotICAgIGludCBy
b3dCeXRlcyA9IG1fY3VycmVudFdpZHRoICogNDsKLSAgICBpbnQgdG90YWxCeXRlcyA9IHJvd0J5
dGVzICogbV9jdXJyZW50SGVpZ2h0OwotCi0gICAgT3duQXJyYXlQdHI8dW5zaWduZWQgY2hhcj4g
cGl4ZWxzKG5ldyB1bnNpZ25lZCBjaGFyW3RvdGFsQnl0ZXNdKTsKLSAgICBpZiAoIXBpeGVscykK
KyAgICBpZiAoIW1fY29udGV4dE9iaikKICAgICAgICAgcmV0dXJuOwogCi0gICAgQ0dMU2V0Q3Vy
cmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBm
YWxzZTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0g
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1f
ZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0
aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0
LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICBtdXN0UmVzdG9y
ZUZCTyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9m
Ym8pIHsKLSAgICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICAgICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICBHTGludCBwYWNrQWxpZ25tZW50ID0gNDsKLSAgICBib29sIG11c3RS
ZXN0b3JlUGFja0FsaWdubWVudCA9IGZhbHNlOwotICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9QQUNL
X0FMSUdOTUVOVCwgJnBhY2tBbGlnbm1lbnQpOwotICAgIGlmIChwYWNrQWxpZ25tZW50ID4gNCkg
ewotICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOwotICAgICAg
ICBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSB0cnVlOwotICAgIH0KLQotICAgIDo6Z2xSZWFk
UGl4ZWxzKDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0JHUkEsIEdM
X1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgcGl4ZWxzLmdldCgpKTsKLQotICAgIGlmIChtdXN0
UmVzdG9yZVBhY2tBbGlnbm1lbnQpCi0gICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FM
SUdOTUVOVCwgcGFja0FsaWdubWVudCk7Ci0KLSAgICBpZiAobXVzdFJlc3RvcmVGQk8pCi0gICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJP
KTsKLQotICAgIHBhaW50VG9DYW52YXMocGl4ZWxzLmdldCgpLCBtX2N1cnJlbnRXaWR0aCwgbV9j
dXJyZW50SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMt
PmhlaWdodCgpLCBpbWFnZUJ1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7Cisg
ICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7
CisgICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IG1fY29udGV4dE9iaikKKyAgICAgICAgQ0dMU2V0
Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKIH0KIAogYm9vbCBHcmFwaGljc0NvbnRleHQz
RDo6aXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0CkBAIC0zMjEsMTM0MyArMjU0LDcgQEAgYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNFcnJvckdlbmVyYXRlZAogewogICAgIHJldHVybiBmYWxzZTsK
IH0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWln
aHQpCi17Ci0gICAgaWYgKHdpZHRoID09IG1fY3VycmVudFdpZHRoICYmIGhlaWdodCA9PSBtX2N1
cnJlbnRIZWlnaHQgfHwgIW1fY29udGV4dE9iaikKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IG1fY3VycmVudFdpZHRoID0gd2lkdGg7Ci0gICAgbV9jdXJyZW50SGVpZ2h0ID0gaGVpZ2h0Owot
ICAgIAotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAg
R0x1aW50IGludGVybmFsQ29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0LCBpbnRlcm5hbERlcHRoU3Rl
bmNpbEZvcm1hdCA9IDA7Ci0gICAgaWYgKG1fYXR0cnMuYWxwaGEpIHsKLSAgICAgICAgaW50ZXJu
YWxDb2xvckZvcm1hdCA9IEdMX1JHQkE4OwotICAgICAgICBjb2xvckZvcm1hdCA9IEdMX1JHQkE7
Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50ZXJuYWxDb2xvckZvcm1hdCA9IEdMX1JHQjg7Ci0g
ICAgICAgIGNvbG9yRm9ybWF0ID0gR0xfUkdCOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVu
Y2lsIHx8IG1fYXR0cnMuZGVwdGgpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgdGhlIGxv
Z2ljIHdoZXJlIHN0ZW5jaWwgaXMgcmVxdWlyZWQgYW5kIGRlcHRoIGlzIG5vdC4KLSAgICAgICAg
Ly8gU2VlIEdyYXBoaWNzQ29udGV4dDNEIGNvbnN0cnVjdG9yLgotICAgICAgICBpZiAobV9hdHRy
cy5zdGVuY2lsICYmIG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICBpbnRlcm5hbERlcHRoU3Rl
bmNpbEZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOwotICAgICAgICBlbHNlCi0gICAg
ICAgICAgICBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDsK
LSAgICB9Ci0KLSAgICBib29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0KLSAgICAvLyByZXNp
emUgbXVsdGlzYW1wbGUgRkJPCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAg
IEdMaW50IG1heFNhbXBsZUNvdW50OwotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1NB
TVBMRVNfRVhULCAmbWF4U2FtcGxlQ291bnQpOwotICAgICAgICBHTGludCBzYW1wbGVDb3VudCA9
IHN0ZDo6bWluKDgsIG1heFNhbXBsZUNvdW50KTsKLSAgICAgICAgaWYgKHNhbXBsZUNvdW50ID4g
bWF4U2FtcGxlQ291bnQpCi0gICAgICAgICAgICBzYW1wbGVDb3VudCA9IG1heFNhbXBsZUNvdW50
OwotICAgICAgICBpZiAobV9ib3VuZEZCTyAhPSBtX211bHRpc2FtcGxlRkJPKSB7Ci0gICAgICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNh
bXBsZUZCTyk7Ci0gICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIH0K
LSAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VN
dWx0aXNhbXBsZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50ZXJuYWxD
b2xvckZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRl
cmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCwg
R0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAgICAgICAg
aWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgICAgICA6Omds
QmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVw
dGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVs
dGlzYW1wbGVFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsRGVw
dGhTdGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGlmIChtX2F0dHJz
LnN0ZW5jaWwpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVS
QlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgICAg
ICBpZiAobV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5k
ZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwg
R0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0g
ICAgICAgIH0KLSAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVS
X0VYVCwgMCk7Ci0gICAgICAgIGlmIChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJB
TUVCVUZGRVJfRVhUKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKLSAgICAgICAg
ICAgIC8vIEZJWE1FOiBjbGVhbnVwLgotICAgICAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAg
ICAgICAgfQotICAgIH0KLQotICAgIC8vIHJlc2l6ZSByZWd1bGFyIEZCTwotICAgIGlmIChtX2Jv
dW5kRkJPICE9IG1fZmJvKSB7Ci0gICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICAg
ICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAg
ICB9Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7Ci0gICAg
OjpnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxDb2xvckZvcm1hdCwgd2lk
dGgsIGhlaWdodCwgMCwgY29sb3JGb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIDApOwotICAgIDo6
Z2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0NPTE9SX0FU
VEFDSE1FTlQwX0VYVCwgR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlLCAwKTsKLSAgICA6OmdsQmlu
ZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAgaWYgKCFtX2F0dHJzLmFudGlhbGlhcyAm
JiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpKSB7Ci0gICAgICAgIDo6Z2xCaW5k
UmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVy
KTsKLSAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQoR0xfUkVOREVSQlVGRkVSX0VY
VCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBp
ZiAobV9hdHRycy5zdGVuY2lsKQotICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVm
ZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCwgR0xf
UkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICBpZiAobV9h
dHRycy5kZXB0aCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZG
RVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVm
ZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDApOwotICAgIH0KLSAgICBpZiAoZ2xDaGVja0Zy
YW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJf
Q09NUExFVEVfRVhUKSB7Ci0gICAgICAgIC8vIEZJWE1FOiBjbGVhbnVwCi0gICAgICAgIG5vdElt
cGxlbWVudGVkKCk7Ci0gICAgfQotCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlRkJPKTsKLSAgICAgICAgaWYgKG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAg
ICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlh
bGl6ZSByZW5kZXJidWZmZXJzIHRvIDAuCi0gICAgR0xib29sZWFuIGNvbG9yTWFza1tdID0ge0dM
X1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUV9LCBkZXB0aE1hc2sgPSBHTF9UUlVFLCBz
dGVuY2lsTWFzayA9IEdMX1RSVUU7Ci0gICAgR0xib29sZWFuIGlzU2Npc3NvckVuYWJsZWQgPSBH
TF9GQUxTRTsKLSAgICBHTGJvb2xlYW4gaXNEaXRoZXJFbmFibGVkID0gR0xfRkFMU0U7Ci0gICAg
R0xiaXRmaWVsZCBjbGVhck1hc2sgPSBHTF9DT0xPUl9CVUZGRVJfQklUOwotICAgIDo6Z2xHZXRC
b29sZWFudihHTF9DT0xPUl9XUklURU1BU0ssIGNvbG9yTWFzayk7Ci0gICAgOjpnbENvbG9yTWFz
ayhHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLSAgICBpZiAobV9hdHRycy5k
ZXB0aCkgewotICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfREVQVEhfV1JJVEVNQVNLLCAmZGVw
dGhNYXNrKTsKLSAgICAgICAgOjpnbERlcHRoTWFzayhHTF9UUlVFKTsKLSAgICAgICAgY2xlYXJN
YXNrIHw9IEdMX0RFUFRIX0JVRkZFUl9CSVQ7Ci0gICAgfQotICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwpIHsKLSAgICAgICAgOjpnbEdldEJvb2xlYW52KEdMX1NURU5DSUxfV1JJVEVNQVNLLCAmc3Rl
bmNpbE1hc2spOwotICAgICAgICA6OmdsU3RlbmNpbE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNs
ZWFyTWFzayB8PSBHTF9TVEVOQ0lMX0JVRkZFUl9CSVQ7Ci0gICAgfQotICAgIGlzU2Npc3NvckVu
YWJsZWQgPSA6OmdsSXNFbmFibGVkKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgOjpnbERpc2FibGUo
R0xfU0NJU1NPUl9URVNUKTsKLSAgICBpc0RpdGhlckVuYWJsZWQgPSA6OmdsSXNFbmFibGVkKEdM
X0RJVEhFUik7Ci0gICAgOjpnbERpc2FibGUoR0xfRElUSEVSKTsKLQotICAgIDo6Z2xDbGVhcihj
bGVhck1hc2spOwotCi0gICAgOjpnbENvbG9yTWFzayhjb2xvck1hc2tbMF0sIGNvbG9yTWFza1sx
XSwgY29sb3JNYXNrWzJdLCBjb2xvck1hc2tbM10pOwotICAgIGlmIChtX2F0dHJzLmRlcHRoKQot
ICAgICAgICA6OmdsRGVwdGhNYXNrKGRlcHRoTWFzayk7Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKLSAgICAgICAgOjpnbFN0ZW5jaWxNYXNrKHN0ZW5jaWxNYXNrKTsKLSAgICBpZiAoaXNTY2lz
c29yRW5hYmxlZCkKLSAgICAgICAgOjpnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGVs
c2UKLSAgICAgICAgOjpnbERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBpZiAoaXNEaXRo
ZXJFbmFibGVkKQotICAgICAgICA6OmdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgZWxzZQotICAg
ICAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3Vu
ZEZCTyk7Ci0KLSAgICA6OmdsRmx1c2goKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVuc3Vy
ZUNvbnRleHQoQ0dMQ29udGV4dE9iaiBjb250ZXh0KQotewotICAgIGlmICghY29udGV4dCkKLSAg
ICAgICAgcmV0dXJuOwotICAgICAgICAKLSAgICBDR0xDb250ZXh0T2JqIGN1cnJlbnRDb250ZXh0
ID0gQ0dMR2V0Q3VycmVudENvbnRleHQoKTsKLSAgICBpZiAoY3VycmVudENvbnRleHQgIT0gY29u
dGV4dCkKLSAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoY29udGV4dCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnByZXBhcmVUZXh0dXJlKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZG
RVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9j
dXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3Vy
cmVudEhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwotICAg
IH0KLSAgICA6OmdsRmluaXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmFjdGl2
ZVRleHR1cmUodW5zaWduZWQgbG9uZyB0ZXh0dXJlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwg
UGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIEFT
U0VSVChzaGFkZXIpOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QXR0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0
IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAg
ICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xCaW5kQXR0cmliTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgaW5kZXgsIG5hbWUudXRm
OCgpLmRhdGEoKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRCdWZmZXIodW5z
aWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZEJ1ZmZlcih0YXJnZXQsIChHTHVp
bnQpIGJ1ZmZlcik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVm
ZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IGZibzsKLSAgICBpZiAo
YnVmZmVyKQotICAgICAgICBmYm8gPSAoR0x1aW50KWJ1ZmZlcjsKLSAgICBlbHNlCi0gICAgICAg
IGZibyA9IChtX2F0dHJzLmFudGlhbGlhcyA/IG1fbXVsdGlzYW1wbGVGQk8gOiBtX2Zibyk7Ci0g
ICAgaWYgKGZibyAhPSBtX2JvdW5kRkJPKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQodGFyZ2V0LCBmYm8pOwotICAgICAgICBtX2JvdW5kRkJPID0gZmJvOwotICAgIH0KLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRh
cmdldCwgUGxhdGZvcm0zRE9iamVjdCByZW5kZXJidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgKEdM
dWludCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5k
VGV4dHVyZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZFRleHR1cmUo
dGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YmxlbmRDb2xvcihkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUg
YWxwaGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVu
ZENvbG9yKHN0YXRpY19jYXN0PGZsb2F0PihyZWQpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZ3JlZW4p
LCBzdGF0aWNfY2FzdDxmbG9hdD4oYmx1ZSksIHN0YXRpY19jYXN0PGZsb2F0PihhbHBoYSkpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEVxdWF0aW9uKCB1bnNpZ25lZCBsb25n
IG1vZGUgKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxl
bmRFcXVhdGlvbihtb2RlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVh
dGlvblNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgbW9kZVJHQiwgdW5zaWduZWQgbG9uZyBtb2RlQWxw
aGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZEVx
dWF0aW9uU2VwYXJhdGUobW9kZVJHQiwgbW9kZUFscGhhKTsKLX0KLQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpibGVuZEZ1bmModW5zaWduZWQgbG9uZyBzZmFjdG9yLCB1bnNpZ25lZCBsb25n
IGRmYWN0b3IpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xC
bGVuZEZ1bmMoc2ZhY3RvciwgZGZhY3Rvcik7Ci19ICAgICAgIAotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpibGVuZEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIHNyY1JHQiwgdW5zaWduZWQg
bG9uZyBkc3RSR0IsIHVuc2lnbmVkIGxvbmcgc3JjQWxwaGEsIHVuc2lnbmVkIGxvbmcgZHN0QWxw
aGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZEZ1
bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50
IHNpemUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgMCwgdXNhZ2UpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCBpbnQgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0
LCBzaXplLCBkYXRhLCB1c2FnZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZl
clN1YkRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgb2Zmc2V0LCBpbnQgc2l6ZSwgY29u
c3Qgdm9pZCogZGF0YSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEJ1ZmZlclN1YkRhdGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwotfQotCi11bnNp
Z25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICByZXR1cm4gOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQodGFyZ2V0KTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJDb2xvcihkb3VibGUgciwgZG91YmxlIGcsIGRvdWJs
ZSBiLCBkb3VibGUgYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbENsZWFyQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHIpLCBzdGF0aWNfY2FzdDxmbG9hdD4o
ZyksIHN0YXRpY19jYXN0PGZsb2F0PihiKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXIodW5zaWduZWQgbG9uZyBtYXNrKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXIobWFzayk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgoZG91YmxlIGRlcHRoKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJEZXB0aChkZXB0aCk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbChsb25nIHMpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVhclN0ZW5jaWwocyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbG9yTWFzayhib29sIHJlZCwgYm9vbCBn
cmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNoYWRlcihQbGF0Zm9ybTNET2JqZWN0
IHNoYWRlcikKLXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0KLSAgICBpbnQgR0xzaGFkZXJUeXBlOwotICAgIEFOR0xFU2hhZGVyVHlwZSBz
aGFkZXJUeXBlOwotCi0gICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIFNIQURFUl9UWVBFLCAmR0xz
aGFkZXJUeXBlKTsKLSAgICAKLSAgICBpZiAoR0xzaGFkZXJUeXBlID09IFZFUlRFWF9TSEFERVIp
Ci0gICAgICAgIHNoYWRlclR5cGUgPSBTSEFERVJfVFlQRV9WRVJURVg7Ci0gICAgZWxzZSBpZiAo
R0xzaGFkZXJUeXBlID09IEZSQUdNRU5UX1NIQURFUikKLSAgICAgICAgc2hhZGVyVHlwZSA9IFNI
QURFUl9UWVBFX0ZSQUdNRU5UOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOyAvLyBJbnZhbGlk
IHNoYWRlciB0eXBlLgotCi0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3Vy
Y2VFbnRyeT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVy
KTsKLQotICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIFNoYWRlclNvdXJjZUVudHJ5JiBlbnRyeSA9IHJlc3VsdC0+c2Vjb25k
OwotCi0gICAgU3RyaW5nIHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2U7Ci0gICAgU3RyaW5nIHNoYWRl
ckluZm9Mb2c7Ci0KLSAgICBib29sIGlzVmFsaWQgPSBtX2NvbXBpbGVyLnZhbGlkYXRlU2hhZGVy
U291cmNlKGVudHJ5LnNvdXJjZS51dGY4KCkuZGF0YSgpLCBzaGFkZXJUeXBlLCB0cmFuc2xhdGVk
U2hhZGVyU291cmNlLCBzaGFkZXJJbmZvTG9nKTsKLQotICAgIGVudHJ5LmxvZyA9IHNoYWRlcklu
Zm9Mb2c7Ci0gICAgZW50cnkuaXNWYWxpZCA9IGlzVmFsaWQ7Ci0KLSAgICBpZiAoIWlzVmFsaWQp
Ci0gICAgICAgIHJldHVybjsgLy8gU2hhZGVyIGRpZG4ndCB2YWxpZGF0ZSwgZG9uJ3QgbW92ZSBm
b3J3YXJkIHdpdGggY29tcGlsaW5nIHRyYW5zbGF0ZWQgc291cmNlICAgIAotCi0gICAgaW50IHRy
YW5zbGF0ZWRTaGFkZXJMZW5ndGggPSB0cmFuc2xhdGVkU2hhZGVyU291cmNlLmxlbmd0aCgpOwot
Ci0gICAgY29uc3QgQ1N0cmluZyYgdHJhbnNsYXRlZFNoYWRlckNTdHJpbmcgPSB0cmFuc2xhdGVk
U2hhZGVyU291cmNlLnV0ZjgoKTsKLSAgICBjb25zdCBjaGFyKiB0cmFuc2xhdGVkU2hhZGVyUHRy
ID0gdHJhbnNsYXRlZFNoYWRlckNTdHJpbmcuZGF0YSgpOwotICAgIAotICAgIDo6Z2xTaGFkZXJT
b3VyY2UoKEdMdWludCkgc2hhZGVyLCAxLCAmdHJhbnNsYXRlZFNoYWRlclB0ciwgJnRyYW5zbGF0
ZWRTaGFkZXJMZW5ndGgpOwotICAgIAotICAgIDo6Z2xDb21waWxlU2hhZGVyKChHTHVpbnQpIHNo
YWRlcik7Ci0gICAgCi0gICAgaW50IEdMQ29tcGlsZVN1Y2Nlc3M7Ci0gICAgCi0gICAgOjpnbEdl
dFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgQ09NUElMRV9TVEFUVVMsICZHTENvbXBpbGVTdWNj
ZXNzKTsKLSAgICAKLSAgICAvLyBBU1NFUlQgdGhhdCBBTkdMRSBnZW5lcmF0ZWQgR0xTTCB3aWxs
IGJlIGFjY2VwdGVkIGJ5IE9wZW5HTAotICAgIEFTU0VSVChHTENvbXBpbGVTdWNjZXNzID09IEdM
X1RSVUUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCh1bnNp
Z25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1h
dCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVp
Z2h0LCBsb25nIGJvcmRlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZC
TykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVm
ZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsg
aGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmlu
ZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgIH0KLSAgICA6
OmdsQ29weVRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdp
ZHRoLCBoZWlnaHQsIGJvcmRlcik7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91
bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVY
VChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9u
ZyBsZXZlbCwgbG9uZyB4b2Zmc2V0LCBsb25nIHlvZmZzZXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNp
Z25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRG
Qk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAg
ICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwg
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5F
QVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOwotICAgIH0KLSAgICA6OmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwg
eG9mZnNldCwgeW9mZnNldCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKG1fYXR0cnMu
YW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8p
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjdWxsRmFjZSh1bnNpZ25lZCBsb25nIG1v
ZGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDdWxsRmFj
ZShtb2RlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVk
IGxvbmcgZnVuYykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERlcHRoRnVuYyhmdW5jKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNr
KGJvb2wgZmxhZykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERlcHRoTWFzayhmbGFnKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhSYW5n
ZShkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsRGVwdGhSYW5nZSh6TmVhciwgekZhcik7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRldGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBs
YXRmb3JtM0RPYmplY3Qgc2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NF
UlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERl
dGFjaFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRGlzYWJsZShjYXApOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQg
bG9uZyBpbmRleCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRyYXdBcnJheXModW5zaWduZWQgbG9uZyBtb2RlLCBsb25nIGZpcnN0LCBsb25nIGNv
dW50KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRHJhd0Fy
cmF5cyhtb2RlLCBmaXJzdCwgY291bnQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
cmF3RWxlbWVudHModW5zaWduZWQgbG9uZyBtb2RlLCB1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNp
Z25lZCBsb25nIHR5cGUsIGxvbmcgb2Zmc2V0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCByZWludGVy
cHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGUodW5zaWduZWQgbG9uZyBjYXApCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGUoY2FwKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQg
bG9uZyBpbmRleCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZmluaXNoKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEZpbmlzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGbHVzaCgpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHJlbmRl
cmJ1ZmZlcnRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCByZW5kZXJidWZmZXIgPSAoR0x1aW50KSBi
dWZmZXI7Ci0gICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKSB7
Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIERFUFRIX0FU
VEFDSE1FTlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICAgICAgOjpn
bEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgU1RFTkNJTF9BVFRBQ0hNRU5ULCBy
ZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIDo6
Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1
ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
ZnJhbWVidWZmZXJUZXh0dXJlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcg
YXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyB0ZXh0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4
dHVyZSwgbG9uZyBsZXZlbCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFy
Z2V0LCAoR0x1aW50KSB0ZXh0dXJlLCBsZXZlbCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmZyb250RmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xGcm9udEZhY2UobW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFwKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2VuZXJhdGVNaXBtYXBFWFQo
dGFyZ2V0KTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlQXR0cmliKFBs
YXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5mbyYg
aW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3Io
SU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IG1heEF0dHJpYnV0ZVNpemUgPSAwOwot
ICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xfQUNU
SVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6ZSk7Ci0gICAgR0xjaGFy
IG5hbWVbbWF4QXR0cmlidXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdU
SCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCi0gICAgR0xzaXplaSBuYW1lTGVuZ3RoID0gMDsK
LSAgICBHTGludCBzaXplID0gMDsKLSAgICBHTGVudW0gdHlwZSA9IDA7Ci0gICAgOjpnbEdldEFj
dGl2ZUF0dHJpYihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4QXR0cmli
dXRlU2l6ZSwgJm5hbWVMZW5ndGgsICZzaXplLCAmdHlwZSwgbmFtZSk7Ci0gICAgaWYgKCFuYW1l
TGVuZ3RoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaW5mby5uYW1lID0gU3RyaW5nKG5h
bWUsIG5hbWVMZW5ndGgpOwotICAgIGluZm8udHlwZSA9IHR5cGU7Ci0gICAgaW5mby5zaXplID0g
c2l6ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLSAgICAKLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldEFjdGl2ZVVuaWZvcm0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25n
IGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbWF4
VW5pZm9ybVNpemUgPSAwOwotICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50
Pihwcm9ncmFtKSwgR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCwgJm1heFVuaWZvcm1TaXpl
KTsKLSAgICBHTGNoYXIgbmFtZVttYXhVbmlmb3JtU2l6ZV07IC8vIEdMX0FDVElWRV9VTklGT1JN
X01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxl
bmd0aCA9IDA7Ci0gICAgR0xpbnQgc2l6ZSA9IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAg
IDo6Z2xHZXRBY3RpdmVVbmlmb3JtKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4
LCBtYXhVbmlmb3JtU2l6ZSwgJm5hbWVMZW5ndGgsICZzaXplLCAmdHlwZSwgbmFtZSk7Ci0gICAg
aWYgKCFuYW1lTGVuZ3RoKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaW5mby5uYW1lID0g
U3RyaW5nKG5hbWUsIG5hbWVMZW5ndGgpOwotICAgIGluZm8udHlwZSA9IHR5cGU7Ci0gICAgaW5m
by5zaXplID0gc2l6ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0QXR0YWNoZWRTaGFkZXJzKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgaW50IG1h
eENvdW50LCBpbnQqIGNvdW50LCB1bnNpZ25lZCBpbnQqIHNoYWRlcnMpCi17Ci0gICAgaWYgKCFw
cm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwotICAg
ICAgICByZXR1cm47Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsR2V0QXR0YWNoZWRTaGFkZXJzKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIG1h
eENvdW50LCBjb3VudCwgc2hhZGVycyk7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
QXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5h
bWUpCi17Ci0gICAgaWYgKCFwcm9ncmFtKQotICAgICAgICByZXR1cm4gLTE7CiAgICAgCi0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsR2V0QXR0cmliTG9j
YXRpb24oKEdMdWludCkgcHJvZ3JhbSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKLX0KLQotR3JhcGhp
Y3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgR3JhcGhpY3NDb250ZXh0M0Q6OmdldENvbnRleHRBdHRy
aWJ1dGVzKCkKLXsKLSAgICByZXR1cm4gbV9hdHRyczsKLX0KLQotdW5zaWduZWQgbG9uZyBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0RXJyb3IoKQotewotICAgIGlmIChtX3N5bnRoZXRpY0Vycm9ycy5z
aXplKCkgPiAwKSB7Ci0gICAgICAgIExpc3RIYXNoU2V0PHVuc2lnbmVkIGxvbmc+OjppdGVyYXRv
ciBpdGVyID0gbV9zeW50aGV0aWNFcnJvcnMuYmVnaW4oKTsKLSAgICAgICAgdW5zaWduZWQgbG9u
ZyBlcnIgPSAqaXRlcjsKLSAgICAgICAgbV9zeW50aGV0aWNFcnJvcnMucmVtb3ZlKGl0ZXIpOwot
ICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEVycm9yKCk7Ci19Ci0KLVN0cmluZyBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0U3RyaW5nKHVuc2lnbmVkIGxvbmcgbmFtZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIFN0cmluZygoY29uc3QgY2hhciopIDo6Z2xH
ZXRTdHJpbmcobmFtZSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpoaW50KHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIG1vZGUpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xIaW50KHRhcmdldCwgbW9kZSk7Ci19Ci0KLWJvb2wg
R3JhcGhpY3NDb250ZXh0M0Q6OmlzQnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewot
ICAgIGlmICghYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNCdWZmZXIoKEdMdWludCkg
YnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFbmFibGVkKHVuc2lnbmVk
IGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1
cm4gOjpnbElzRW5hYmxlZChjYXApOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Zy
YW1lYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgZnJhbWVidWZmZXIpCi17Ci0gICAgaWYgKCFmcmFt
ZWJ1ZmZlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzRnJhbWVidWZmZXJFWFQoKEdMdWludCkg
ZnJhbWVidWZmZXIpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1Byb2dyYW0oUGxh
dGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIGlmICghcHJvZ3JhbSkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBy
ZXR1cm4gOjpnbElzUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKLX0KLQotYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNSZW5kZXJidWZmZXIoUGxhdGZvcm0zRE9iamVjdCByZW5kZXJidWZmZXIp
Ci17Ci0gICAgaWYgKCFyZW5kZXJidWZmZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1JlbmRl
cmJ1ZmZlckVYVCgoR0x1aW50KSByZW5kZXJidWZmZXIpOwotfQotCi1ib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc1NoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBpZiAoIXNo
YWRlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzU2hhZGVyKChHTHVpbnQpIHNoYWRlcik7Ci19
Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzVGV4dHVyZShQbGF0Zm9ybTNET2JqZWN0IHRl
eHR1cmUpCi17Ci0gICAgaWYgKCF0ZXh0dXJlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNUZXh0
dXJlKChHTHVpbnQpIHRleHR1cmUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpsaW5l
V2lkdGgoZG91YmxlIHdpZHRoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsTGluZVdpZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpsaW5rUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0p
Ci17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcgcGFy
YW0pCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xQaXhlbFN0
b3JlaShwbmFtZSwgcGFyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29u
T2Zmc2V0KGRvdWJsZSBmYWN0b3IsIGRvdWJsZSB1bml0cykKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+
KGZhY3RvciksIHN0YXRpY19jYXN0PGZsb2F0Pih1bml0cykpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRo
LCB1bnNpZ25lZCBsb25nIGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxv
bmcgdHlwZSwgdm9pZCogZGF0YSkKLXsKLSAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0d28gZ2xG
bHVzaCBjYWxscyB3aGVuIHRoZSBkcml2ZXIgYnVnIGlzIGZpeGVkLCBpLmUuLAotICAgIC8vIGFs
bCBwcmV2aW91cyByZW5kZXJpbmcgY2FsbHMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJlYWRpbmcg
cGl4ZWxzLgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2go
KTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2Ft
cGxlRkJPKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJV
RkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJh
bWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgs
IHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAg
IDo6Z2xGbHVzaCgpOwotICAgIH0KLSAgICA6OmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVp
Z2h0LCBmb3JtYXQsIHR5cGUsIGRhdGEpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBt
X2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKLXsKLSAgICAvLyBGSVhN
RTogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8g
aGF2ZSBpZmRlZnMgZm9yIHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgLy86OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWduZWQg
bG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxvbmcg
d2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7Ci0gICAgY2FzZSBERVBUSF9T
VEVOQ0lMOgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhU
OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERFUFRIX0NPTVBPTkVOVDE2OgotICAgICAgICBp
bnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDsKLSAgICAgICAgYnJlYWs7Ci0gICAg
Y2FzZSBSR0JBNDoKLSAgICBjYXNlIFJHQjVfQTE6Ci0gICAgICAgIGludGVybmFsZm9ybWF0ID0g
R0xfUkdCQTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSR0I1NjU6Ci0gICAgICAgIGludGVy
bmFsZm9ybWF0ID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgOjpnbFJlbmRl
cmJ1ZmZlclN0b3JhZ2VFWFQodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJsZSB2YWx1
ZSwgYm9vbCBpbnZlcnQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xTYW1wbGVDb3ZlcmFnZShzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpLCBpbnZlcnQpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKGxvbmcgeCwgbG9uZyB5LCB1bnNp
Z25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlciwgY29uc3QgU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7
Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAgU2hhZGVyU291
cmNlRW50cnkgZW50cnk7Ci0KLSAgICBlbnRyeS5zb3VyY2UgPSBzdHJpbmc7Ci0KLSAgICBtX3No
YWRlclNvdXJjZU1hcC5zZXQoc2hhZGVyLCBlbnRyeSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnN0ZW5jaWxGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVk
IGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFN0ZW5jaWxGdW5jKGZ1bmMsIHJlZiwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25n
IGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsRnVuY1NlcGFyYXRlKGZhY2UsIGZ1bmMs
IHJlZiwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKHVu
c2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFN0ZW5jaWxNYXNrKG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpz
dGVuY2lsTWFza1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBtYXNr
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbE1h
c2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQg
bG9uZyB6cGFzcykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFN0ZW5jaWxPcChmYWlsLCB6ZmFpbCwgenBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcg
ZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKGZh
Y2UsIGZhaWwsIHpmYWlsLCB6cGFzcyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eFBhcmFtZXRlcmYodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgZmxvYXQgdmFsdWUp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJhbWV0
ZXJmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKHVuc2lnbmVkIHRhcmdldCwgdW5zaWdu
ZWQgcG5hbWUsIGludCB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHZhbHVlKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZihsb25nIGxv
Y2F0aW9uLCBmbG9hdCB2MCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm0xZihsb2NhdGlvbiwgdjApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtMWZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWZ2KGxv
Y2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm0yZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMmYobG9jYXRpb24sIHYwLCB2MSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZnYobG9uZyBsb2NhdGlvbiwg
ZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRv
IGJlIGEgbXVsdGlwbGUgb2YgMgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsVW5pZm9ybTJmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtM2YobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYx
LCBmbG9hdCB2MikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0zZihsb2NhdGlvbiwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm0zZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkK
LXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlv
biwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYo
bG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGYobG9j
YXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTRmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8v
IEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0
aW9uLCBpbnQgdjApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xVbmlmb3JtMWkobG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTFpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0xaXYobG9jYXRpb24s
IHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpKGxv
bmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXks
IGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBs
ZSBvZiAyCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3Jt
Mml2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnVuaWZvcm0zaShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNpKGxvY2F0aW9u
LCB2MCwgdjEsIHYyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNpdihs
b25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVu
Z3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwgaW50IHYw
LCBpbnQgdjEsIGludCB2MiwgaW50IHYzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRpKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYobG9uZyBsb2NhdGlvbiwgaW50KiBh
cnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVu
aWZvcm00aXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybU1hdHJpeDJmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxv
YXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJl
IGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsVW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlv
biwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklY
TUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIHNpemUs
IHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
TWF0cml4NGZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGlu
dCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBv
ZiAxNgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1h
dHJpeDRmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVzZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1
aW50KSBwcm9ncmFtKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9n
cmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0g
ICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWYWxpZGF0ZVBy
b2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZl
cnRleEF0dHJpYjFmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjApCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIxZihpbmR4LCB2MCk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdih1bnNpZ25lZCBs
b25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjFmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQg
djAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsVmVydGV4QXR0cmliMmYoaW5keCwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmli
MmZ2KGluZHgsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliM2YodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmli
M2YoaW5keCwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRl
eEF0dHJpYjNmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmdihpbmR4LCBh
cnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2ln
bmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0
ZihpbmR4LCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZl
cnRleEF0dHJpYjRmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjRmdihpbmR4
LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYlBvaW50
ZXIodW5zaWduZWQgbG9uZyBpbmR4LCBpbnQgc2l6ZSwgaW50IHR5cGUsIGJvb2wgbm9ybWFsaXpl
ZCwgdW5zaWduZWQgbG9uZyBzdHJpZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliUG9pbnRlcihp
bmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9p
ZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnZpZXdwb3J0KGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1
bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFZpZXdwb3J0KHN0YXRpY19jYXN0PEdMaW50Pih4KSwgc3RhdGljX2Nhc3Q8R0xp
bnQ+KHkpLCBzdGF0aWNfY2FzdDxHTHNpemVpPih3aWR0aCksIHN0YXRpY19jYXN0PEdMc2l6ZWk+
KGhlaWdodCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCb29sZWFudih1bnNp
Z25lZCBsb25nIHBuYW1lLCB1bnNpZ25lZCBjaGFyKiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEJvb2xlYW52KHBuYW1lLCB2YWx1ZSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYo
dGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRG
bG9hdHYodW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0RmxvYXR2KHBuYW1lLCB2YWx1ZSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFt
ZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVu
c2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVO
VCkKLSAgICAgICAgYXR0YWNobWVudCA9IERFUFRIX0FUVEFDSE1FTlQ7IC8vIE9yIFNURU5DSUxf
QVRUQUNITUVOVCwgZWl0aGVyIHdvcmtzLgotICAgIDo6Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1l
bnRQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEludGVnZXJ2KHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGludCogdmFsdWUpCi17Ci0gICAgLy8gTmVlZCB0byBlbXVsYXRlIElNUExFTUVOVEFUSU9OX0NP
TE9SX1JFQURfRk9STUFUL1RZUEUgZm9yIEdMLiAgQW55IHZhbGlkCi0gICAgLy8gY29tYmluYXRp
b24gc2hvdWxkIHdvcmssIGJ1dCBHTF9SR0IvR0xfVU5TSUdORURfQllURSBtaWdodCBiZSB0aGUg
bW9zdAotICAgIC8vIHVzZWZ1bCBmb3IgZGVza3RvcCBXZWJHTCB1c2Vycy4KLSAgICAvLyBOZWVk
IHRvIGVtdWxhdGUgTUFYX0ZSQUdNRU5UL1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgYW5kIE1BWF9W
QVJZSU5HX1ZFQ1RPUlMKLSAgICAvLyBiZWNhdXNlIGRlc2t0b3AgR0wncyBjb3JyZXNwb25kaW5n
IHF1ZXJpZXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwotICAgIC8vIHdoZXJlYXMg
R0xFUzIgcmV0dXJuIHRoZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFjaCB2ZWN0b3IgaGFzIDQgY29t
cG9uZW50cykuCi0gICAgLy8gVGhlcmVmb3JlLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVza3Rv
cCBHTCBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NP
TE9SX1JFQURfRk9STUFUOgotICAgICAgICAqdmFsdWUgPSBHTF9SR0I7Ci0gICAgICAgIGJyZWFr
OwotICAgIGNhc2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOgotICAgICAgICAqdmFs
dWUgPSBHTF9VTlNJR05FRF9CWVRFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9GUkFH
TUVOVF9VTklGT1JNX1ZFQ1RPUlM6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfRlJB
R01FTlRfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1ZSk7Ci0gICAgICAgICp2YWx1ZSAvPSA0Owot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgotICAg
ICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMsIHZh
bHVlKTsKLSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUFY
X1ZBUllJTkdfVkVDVE9SUzoKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9WQVJZSU5H
X0ZMT0FUUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgZGVmYXVsdDoKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KHBuYW1lLCB2YWx1ZSk7Ci0gICAg
fQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtaXYoUGxhdGZvcm0zRE9i
amVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQp
IHByb2dyYW0sIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0UHJvZ3JhbUluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIEFTU0VS
VChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
R0xpbnQgbGVuZ3RoOwotICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xf
SU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKLSAgICAKLSAgICBHTHNpemVpIHNpemU7Ci0gICAg
R0xjaGFyKiBpbmZvID0gKEdMY2hhciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKLSAgICBpZiAoIWlu
Zm8pCi0gICAgICAgIHJldHVybiAiIjsKLQotICAgIDo6Z2xHZXRQcm9ncmFtSW5mb0xvZygoR0x1
aW50KSBwcm9ncmFtLCBsZW5ndGgsICZzaXplLCBpbmZvKTsKLSAgICBTdHJpbmcgcyhpbmZvKTsK
LSAgICBmYXN0RnJlZShpbmZvKTsKLSAgICByZXR1cm4gczsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQs
IHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCh0YXJn
ZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRl
cml2KFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZh
bHVlKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICAKLSAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNv
dXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFk
ZXIpOwotICAgIAotICAgIHN3aXRjaCAocG5hbWUpIHsKLSAgICAgICAgY2FzZSBERUxFVEVfU1RB
VFVTOgotICAgICAgICBjYXNlIFNIQURFUl9UWVBFOgotICAgICAgICAgICAgLy8gTGV0IE9wZW5H
TCBoYW5kbGUgdGhlc2UuCi0gICAgICAgIAotICAgICAgICAgICAgOjpnbEdldFNoYWRlcml2KChH
THVpbnQpIHNoYWRlciwgcG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAg
ICAgIGNhc2UgQ09NUElMRV9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hh
ZGVyU291cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNf
Y2FzdDxpbnQ+KGZhbHNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAoKnZhbHVlKSA9IHN0YXRpY19jYXN0PGlu
dD4ocmVzdWx0LT5zZWNvbmQuaXNWYWxpZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
ICAgIAotICAgICAgICBjYXNlIElORk9fTE9HX0xFTkdUSDoKLSAgICAgICAgICAgIGlmIChyZXN1
bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAoKnZhbHVl
KSA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgCi0gICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlckluZm9Mb2coc2hhZGVyKS5sZW5n
dGgoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgU0hB
REVSX1NPVVJDRV9MRU5HVEg6Ci0gICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlclNvdXJj
ZShzaGFkZXIpLmxlbmd0aCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAg
ICBkZWZhdWx0OgotICAgICAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9FTlVNKTsK
LSAgICB9Ci19Ci0KLVN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVySW5mb0xvZyhQ
bGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLQotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTGludCBsZW5ndGg7Ci0gICAgOjpnbEdl
dFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsK
LQotICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVy
YXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAo
cmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICAgcmV0dXJuICIiOwot
Ci0gICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5ID0gcmVzdWx0LT5zZWNvbmQ7Ci0KLSAgICAg
aWYgKGVudHJ5LmlzVmFsaWQpIHsKLSAgICAgICAgIEdMaW50IGxlbmd0aDsKLSAgICAgICAgIDo6
Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0
aCk7Ci0KLSAgICAgICAgIEdMc2l6ZWkgc2l6ZTsKLSAgICAgICAgIEdMY2hhciogaW5mbyA9IChH
TGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgICAgICBpZiAoIWluZm8pCi0gICAgICAg
ICAgICAgcmV0dXJuICIiOwotCi0gICAgICAgICA6OmdsR2V0U2hhZGVySW5mb0xvZygoR0x1aW50
KSBzaGFkZXIsIGxlbmd0aCwgJnNpemUsIGluZm8pOwotCi0gICAgICAgICBTdHJpbmcgcyhpbmZv
KTsKLSAgICAgICAgIGZhc3RGcmVlKGluZm8pOwotICAgICAgICAgcmV0dXJuIHM7Ci0gICAgIH0K
LSAgICAgZWxzZSB7Ci0gICAgICAgICByZXR1cm4gZW50cnkubG9nOwotICAgICB9Ci19Ci0KLVN0
cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmNlKFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotCi0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotCi0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VF
bnRyeT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsK
LQotICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCi0gICAgICAgIHJl
dHVybiAiIjsKLQotICAgIHJldHVybiByZXN1bHQtPnNlY29uZC5zb3VyY2U7Ci19Ci0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyZnYodW5zaWduZWQgbG9uZyB0YXJn
ZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5h
bWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVy
aXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRUZXhQYXJh
bWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFVuaWZvcm1mdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24s
IGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEdldFVuaWZvcm1mdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9iamVjdCBw
cm9ncmFtLCBsb25nIGxvY2F0aW9uLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VW5pZm9ybWl2KChHTHVpbnQpIHByb2dyYW0sIGxv
Y2F0aW9uLCB2YWx1ZSk7Ci19Ci0KLWxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1M
b2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsK
LSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIHJldHVybiA6OmdsR2V0VW5pZm9ybUxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0s
IG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZl
cnRleEF0dHJpYmZ2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZs
b2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEdldFZlcnRleEF0dHJpYmZ2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJpdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNp
Z25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7
Ci19Ci0KLWxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk9mZnNldCh1bnNp
Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICAKLSAgICB2b2lkKiBwb2ludGVyOwotICAgIDo6Z2xHZXRW
ZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRleCwgcG5hbWUsICZwb2ludGVyKTsKLSAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDxsb25nPihwb2ludGVyKTsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4
dDNEOjp0ZXhJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVk
IGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25l
ZCBib3JkZXIsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIDo6Z2xUZXhJbWFnZTJE
KHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZv
cm1hdCwgdHlwZSwgcGl4ZWxzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEdyYXBoaWNzQ29u
dGV4dDNEOjp0ZXhTdWJJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVu
c2lnbmVkIHhvZmYsIHVuc2lnbmVkIHlvZmYsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWln
aHQsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIC8vIEZJWE1FOiB3ZSB3aWxsIG5l
ZWQgdG8gZGVhbCB3aXRoIFBpeGVsU3RvcmUgcGFyYW1zIHdoZW4gZGVhbGluZyB3aXRoIGltYWdl
IGJ1ZmZlcnMgdGhhdCBkaWZmZXIgZnJvbSB0aGUgc3ViaW1hZ2Ugc2l6ZQotICAgIDo6Z2xUZXhT
dWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmYsIHlvZmYsIHdpZHRoLCBoZWlnaHQsIGZvcm1h
dCwgdHlwZSwgcGl4ZWxzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcigpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIEdMdWludCBvOwotICAgIGdsR2VuQnVmZmVycygxLCAmbyk7Ci0gICAgcmV0dXJu
IG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBvOwotICAg
IGdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWdu
ZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0oKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7Ci19Ci0KLXVu
c2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVSZW5kZXJidWZmZXIoKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlblJlbmRl
cmJ1ZmZlcnNFWFQoMSwgJm8pOwotICAgIHJldHVybiBvOwotfQotCi11bnNpZ25lZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y3JlYXRlU2hhZGVyKHVuc2lnbmVkIGxvbmcgdHlwZSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIGdsQ3JlYXRlU2hhZGVyKCh0eXBl
ID09IEZSQUdNRU5UX1NIQURFUikgPyBHTF9GUkFHTUVOVF9TSEFERVIgOiBHTF9WRVJURVhfU0hB
REVSKTsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cmUoKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBn
bEdlblRleHR1cmVzKDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlQnVmZmVyKHVuc2lnbmVkIGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFt
ZWJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxl
dGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJmZyYW1lYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlUHJvZ3JhbSh1bnNpZ25lZCBwcm9ncmFtKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVJlbmRlcmJ1ZmZlcih1bnNpZ25lZCByZW5k
ZXJidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVs
ZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmcmVuZGVyYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZGVsZXRlU2hhZGVyKHVuc2lnbmVkIHNoYWRlcikKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSh1bnNpZ25lZCB0ZXh0dXJlKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVRleHR1cmVz
KDEsICZ0ZXh0dXJlKTsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjpzaXplSW5CeXRlcyhp
bnQgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBHTF9CWVRFOgot
ICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGJ5dGUpOwotICAgICAgICBjYXNlIEdMX1VOU0lH
TkVEX0JZVEU6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWJ5dGUpOwotICAgICAgICBj
YXNlIEdMX1NIT1JUOgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHNob3J0KTsKLSAgICAg
ICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1
c2hvcnQpOwotICAgICAgICBjYXNlIEdMX0lOVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2Yo
R0xpbnQpOwotICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgIHJldHVy
biBzaXplb2YoR0x1aW50KTsKLSAgICAgICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgICAgIHJl
dHVybiBzaXplb2YoR0xmbG9hdCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1
cm4gMDsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN5bnRoZXNpemVHTEVy
cm9yKHVuc2lnbmVkIGxvbmcgZXJyb3IpCi17Ci0gICAgbV9zeW50aGV0aWNFcnJvcnMuYWRkKGVy
cm9yKTsKLX0KIAogfQogCg==
</data>
<flag name="review"
          id="55295"
          type_id="1"
          status="-"
          setter="cmarrin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66380</attachid>
            <date>2010-09-02 09:42:20 -0700</date>
            <delta_ts>2010-09-03 17:16:46 -0700</delta_ts>
            <desc>Added ChangeLog</desc>
            <filename>begin-gcd3d-refactor5</filename>
            <type>text/plain</type>
            <size>103292</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjY3MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTU2IEBACisyMDEwLTA5LTAyICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgb3V0IE1hYyBzcGVjaWZpYyBjb2RlIGZvciBwbGF0Zm9ybS9ncmFwaGljcy9tYWMv
R3JhcGhpY3NDb250ZXh0M0QubW0gZmlsZSwgbGVhdmluZyBnZW5lcmFsIE9wZW5HTCBjb2RlIGlu
IHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmNwcC4KKworICAgICAgICAqIFdl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBodG1sL2NhbnZhcy9X
ZWJHTE9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTE9iamVjdDo6ZGVsZXRlT2Jq
ZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oOgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcDog
Q29waWVkIGZyb20gcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1t
LgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnByZXBhcmVUZXh0dXJlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFkZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpibGVuZEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpidWZmZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpidWZmZXJTdWJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpjbGVhckNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0
aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1hc2spOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6ZGVwdGhNYXNrKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpkZXB0aFJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpk
ZXRhY2hTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRpc2Fi
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhB
dHRyaWJBcnJheSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0Fy
cmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRz
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFibGUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2gpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNoKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJUZXh0dXJlMkQpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmZyb250RmFjZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJhdGVNaXBtYXApOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0YWNoZWRTaGFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJMb2NhdGlvbik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0RXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6aGludCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZm
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcik6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmlzVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6bGluZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpsaW5rUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6cGl4
ZWxTdG9yZWkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnBvbHlnb25P
ZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21w
aWxlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVy
U3RvcmFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292
ZXJhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmMpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJhdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRlKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3ApOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJmKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0yZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNm
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dW5pZm9ybTFpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTJpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Ojp1bmlmb3JtMml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtM2kpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDJmdik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjp2aWV3cG9ydCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0Qm9vbGVhbnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEJ1ZmZlclBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRGbG9hdHYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEZy
YW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0UHJvZ3JhbWl2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTG9nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRVbmlmb3JtaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmdldFVuaWZvcm1Mb2NhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VmVydGV4QXR0cmliZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnRleEltYWdlMkQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnRleFN1YkltYWdlMkQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Y3JlYXRlRnJhbWVidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmNyZWF0ZVByb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNy
ZWF0ZVJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Y3JlYXRlU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVh
dGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVC
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1l
YnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVQcm9n
cmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJi
dWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVNoYWRl
cik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1t
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNE
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbnN1cmVDb250ZXh0KToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVkT25P
dXRPZkJvdW5kc0FjY2Vzc2VzKToKKwogMjAxMC0wOS0wMiAgTmF0ZSBDaGFwaW4gIDxqYXBoZXRA
Y2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4OiBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNjY2Mjcp
CisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBj
b3B5KQpAQCAtNTM2OSw2ICs1MzY5LDcgQEAKIAkJRkFCRTcyRkUxMDU5QzIxMTAwRDk5OUREIC8q
IE1hdGhNTE5hbWVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEZBQkU3MkZDMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgKi87IH07
CiAJCUZBQzEyQ0M0MTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkFDMTJDQzIxMTIw
REE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5jcHAgKi87IH07CiAJCUZBQzEyQ0M1
MTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuaCBpbiBIZWFkZXJzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZBQzEyQ0MzMTEyMERBNjkwMERBQ0MzNiAv
KiBSZW5kZXJNYXRoTUxTdWJTdXAuaCAqLzsgfTsKKwkJRkI1OENCNzkxMjJGMTUzODAwODc4ODUx
IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCNThDQUVBMTIyODU4NjUwMDg3ODg1MSAvKiBHcmFwaGlj
c0NvbnRleHQzRE9wZW5HTC5jcHAgKi87IH07CiAJCUZFNkZENDg4MEY2NzZFNTcwMDA5Mjg3MyAv
KiBDb29yZGluYXRlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRkU2RkQ0ODUwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVzLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRkU2RkQ0OEQwRjY3NkU5
MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRkU2RkQ0OEIwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRp
bmF0ZXMuY3BwICovOyB9OwogCQlGRTZGRDQ4RTBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGlu
YXRlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkU2
RkQ0OEMwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuaCAqLzsgfTsKQEAgLTExMjQw
LDYgKzExMjQxLDcgQEAKIAkJRkFCRTcyRkMxMDU5QzIxMTAwRDk5OUREIC8qIE1hdGhNTE5hbWVz
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1hdGhNTE5hbWVzLmNw
cDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkFDMTJDQzIxMTIwREE2OTAwREFDQzM2
IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBSZW5kZXJNYXRoTUxTdWJTdXAuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlGQUMxMkNDMzExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlck1hdGhNTFN1YlN1cC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQjU4Q0FFQTEyMjg1ODY1MDA4Nzg4NTEgLyogR3Jh
cGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlGRTQ5RUY5NzBEQzUxNDYyMDA0MjY2RTEgLyogRGFzaGJvYXJkU3VwcG9ydENTU1By
b3BlcnR5TmFtZXMuaW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gRGFzaGJvYXJkU3VwcG9ydENT
U1Byb3BlcnR5TmFtZXMuaW47IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFNkZENDg1
MEY2NzZFNTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBDb29yZGluYXRlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlG
RTZGRDQ4NjBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaWRsICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4
dDsgcGF0aCA9IENvb3JkaW5hdGVzLmlkbDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTE1ODU3LDYgKzE1ODU5LDcgQEAKIAkJQjJBMDE1OTEwQUY2Q0Q1MzAwNkJDRTBFIC8qIGdyYXBo
aWNzICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJCQlGQjU4
Q0FFQTEyMjg1ODY1MDA4Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwICovLAog
CQkJCUIyNzUzNTI5MEIwNTM4MTQwMDJDRTY0RiAvKiBjZyAqLywKIAkJCQlCNTMyMEQ2ODEyMkEy
NEU5MDAyRDE0NDAgLyogY29jb2EgKi8sCiAJCQkJQTc1RThCN0YwRTFERTJCMDAwN0YyNDgxIC8q
IGZpbHRlcnMgKi8sCkBAIC0yMjg5NSw2ICsyMjg5OCw3IEBACiAJCQkJODk4Nzg1QjgxMjJDQTJB
NzAwM0FBQkRBIC8qIEpTTWV0YWRhdGFDYWxsYmFjay5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk4
OTg3ODVGMDEyMkUxRTg3MDAzQUFCREEgLyogSlNGaWxlRXhjZXB0aW9uLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCTg5ODc4NUY0MTIyRTFFQUMwMDNBQUJEQSAvKiBKU0ZpbGVSZWFkZXJTeW5jLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCUZCNThDQjc5MTIyRjE1MzgwMDg3ODg1MSAvKiBHcmFwaGlj
c0NvbnRleHQzRE9wZW5HTC5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9y
RGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUvaHRtbC9j
YW52YXMvV2ViR0xPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMv
V2ViR0xPYmplY3QuY3BwCShyZXZpc2lvbiA2NjYyNykKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMv
V2ViR0xPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCw3ICs2MCw3IEBAIHZvaWQgV2Vi
R0xPYmplY3Q6OmRlbGV0ZU9iamVjdCgpCiB7CiAgICAgaWYgKG1fb2JqZWN0KSB7CiAgICAgICAg
IGlmIChtX2NvbnRleHQpIHsKLSAgICAgICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0
M0QoKS0+bWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgICAgICBtX2NvbnRleHQtPmdyYXBo
aWNzQ29udGV4dDNEKCktPmVuc3VyZUNvbnRleHQoKTsKICAgICAgICAgICAgIGRlbGV0ZU9iamVj
dEltcGwobV9vYmplY3QpOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9hdHRhY2htZW50Q291
bnQpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQz
RC5oCShyZXZpc2lvbiA2NjYyNykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0M0QuaAkod29ya2luZyBjb3B5KQpAQCAtNDUxLDcgKzQ1MSw3IEBAIHB1YmxpYzoK
ICAgICBQbGF0Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKCkgY29uc3QgeyByZXR1cm4gMDsgfQog
I2VuZGlmCiAjZW5kaWYKLSAgICB2b2lkIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgIHZvaWQg
ZW5zdXJlQ29udGV4dCgpOwogCiAjaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFURk9STShDSFJPTUlV
TSkKICAgICAvLyBXaXRoIG11bHRpc2FtcGxpbmcgb24sIGJsaXQgZnJvbSBtdWx0aXNhbXBsZUZC
TyB0byByZWd1bGFyIEZCTy4KSW5kZXg6IHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4
dDNET3BlbkdMLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHQzRE9wZW5HTC5jcHAJKHJldmlzaW9uIDY2NDIxKQkoZnJvbSBwbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW06NjY0MjEpCisrKyBwbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHdvcmtpbmcgY29weSkKSW5kZXg6IFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wu
Y3BwCShyZXZpc2lvbiA2NjQyMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0M0RPcGVuR0wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoK
LSAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoK
ICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw5ICsyOSw2IEBACiAKICNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQzRC5oIgogCi0jaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKLQot
I2luY2x1ZGUgIkFOR0xFL1Jlc291cmNlTGltaXRzLmgiCiAjaW5jbHVkZSAiQXJyYXlCdWZmZXIu
aCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlclZpZXcuaCIKICNpbmNsdWRlICJXZWJHTE9iamVjdC5o
IgpAQCAtNDMsMTkzICs0MCwxNyBAQAogI2luY2x1ZGUgIkludDMyQXJyYXkuaCIKICNpbmNsdWRl
ICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKLSNpbmNsdWRlICJX
ZWJHTExheWVyLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgor
CisjaWYgUExBVEZPUk0oTUFDKQogI2luY2x1ZGUgPE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KICNp
bmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFt
Lmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKLXN0YXRpYyB2b2lkIHNldFBpeGVsRm9ybWF0KFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJp
YnV0ZT4mIGF0dHJpYnMsIGludCBjb2xvckJpdHMsIGludCBkZXB0aEJpdHMsIGJvb2wgYWNjZWxl
cmF0ZWQsIGJvb2wgc3VwZXJzYW1wbGUsIGJvb2wgY2xvc2VzdCkKLXsKLSAgICBhdHRyaWJzLmNs
ZWFyKCk7Ci0gICAgCi0gICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUNvbG9yU2l6ZSk7Ci0gICAg
YXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGNvbG9y
Qml0cykpOwotICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFEZXB0aFNpemUpOwotICAgIGF0dHJp
YnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPihkZXB0aEJpdHMp
KTsKLSAgICAKLSAgICBpZiAoYWNjZWxlcmF0ZWQpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtD
R0xQRkFBY2NlbGVyYXRlZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtD
R0xQRkFSZW5kZXJlcklEKTsKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dM
UGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGtDR0xSZW5kZXJlckdlbmVyaWNGbG9hdElEKSk7Ci0gICAg
fQotICAgICAgICAKLSAgICBpZiAoc3VwZXJzYW1wbGUpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5k
KGtDR0xQRkFTdXBlcnNhbXBsZSk7Ci0gICAgICAgIAotICAgIGlmIChjbG9zZXN0KQotICAgICAg
ICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ2xvc2VzdFBvbGljeSk7Ci0gICAgICAgIAotICAgIGF0
dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPigwKSk7Ci19
Ci0KLVBhc3NPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IEdyYXBoaWNzQ29udGV4dDNEOjpjcmVh
dGUoR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgYXR0cnMsIEhvc3RXaW5kb3cqIGhvc3RX
aW5kb3cpCi17Ci0gICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBjb250ZXh0KG5ldyBHcmFw
aGljc0NvbnRleHQzRChhdHRycywgaG9zdFdpbmRvdykpOwotICAgIHJldHVybiBjb250ZXh0LT5t
X2NvbnRleHRPYmogPyBjb250ZXh0LnJlbGVhc2UoKSA6IDA7Ci19Ci0KLUdyYXBoaWNzQ29udGV4
dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRy
cywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKLSAgICA6IG1fY3VycmVudFdpZHRoKDApCi0gICAg
LCBtX2N1cnJlbnRIZWlnaHQoMCkKLSAgICAsIG1fYXR0cnMoYXR0cnMpCi0gICAgLCBtX2NvbnRl
eHRPYmooMCkKLSAgICAsIG1fdGV4dHVyZSgwKQotICAgICwgbV9mYm8oMCkKLSAgICAsIG1fZGVw
dGhTdGVuY2lsQnVmZmVyKDApCi0gICAgLCBtX2JvdW5kRkJPKDApCi0gICAgLCBtX211bHRpc2Ft
cGxlRkJPKDApCi0gICAgLCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKDApCi0gICAg
LCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIoMCkKLXsKLSAgICBVTlVTRURfUEFSQU0oaG9zdFdp
bmRvdyk7Ci0KLSAgICBWZWN0b3I8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+IGF0dHJpYnM7Ci0g
ICAgQ0dMUGl4ZWxGb3JtYXRPYmogcGl4ZWxGb3JtYXRPYmogPSAwOwotICAgIEdMaW50IG51bVBp
eGVsRm9ybWF0cyA9IDA7Ci0gICAgCi0gICAgLy8gV2Ugd2lsbCB0cnk6Ci0gICAgLy8KLSAgICAv
LyAgMSkgMzIgYml0IFJHQkEvMzIgYml0IGRlcHRoL2FjY2VsZXJhdGVkL3N1cGVyc2FtcGxlZAot
ICAgIC8vICAyKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQKLSAgICAvLyAg
MykgMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL2FjY2VsZXJhdGVkCi0gICAgLy8gIDQpIGNsb3Nl
c3QgdG8gMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL3NvZnR3YXJlIHJlbmRlcmVyCi0gICAgLy8K
LSAgICAvLyAgSWYgbm9uZSBvZiB0aGF0IHdvcmtzLCB3ZSBzaW1wbHkgZmFpbCBhbmQgc2V0IG1f
Y29udGV4dE9iaiB0byAwLgotICAgIAotICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAz
MiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMu
ZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAgIGlmIChudW1Q
aXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwg
MzIsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0
dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAgICAg
ICAKLSAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRQ
aXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMTYsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAg
ICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2Jq
LCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAgICBpZiAobnVtUGl4ZWxG
b3JtYXRzID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAz
MiwgMTYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgQ0dMQ2hvb3NlUGl4
ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0
cyk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkg
ewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCBhbiBhY2NlcHRhYmxlIHJl
bmRlcmVyIC0gZmFpbAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIENHTEVycm9y
IGVyciA9IENHTENyZWF0ZUNvbnRleHQocGl4ZWxGb3JtYXRPYmosIDAsICZtX2NvbnRleHRPYmop
OwotICAgIENHTERlc3Ryb3lQaXhlbEZvcm1hdChwaXhlbEZvcm1hdE9iaik7Ci0gICAgCi0gICAg
aWYgKGVyciAhPSBrQ0dMTm9FcnJvciB8fCAhbV9jb250ZXh0T2JqKSB7Ci0gICAgICAgIC8vIENv
dWxkIG5vdCBjcmVhdGUgdGhlIGNvbnRleHQgLSBmYWlsCi0gICAgICAgIG1fY29udGV4dE9iaiA9
IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhlIGN1cnJlbnQgY29u
dGV4dCB0byB0aGUgb25lIGdpdmVuIHRvIHVzLgotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgCi0gICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvLyBD
cmVhdGUgdGhlIFdlYkdMTGF5ZXIKLSAgICBCRUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKLSAg
ICAgICAgbV93ZWJHTExheWVyLmFkb3B0TlMoW1tXZWJHTExheWVyIGFsbG9jXSBpbml0V2l0aEdy
YXBoaWNzQ29udGV4dDNEOnRoaXNdKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAgICAgIFttX3dlYkdM
TGF5ZXIuZ2V0KCkgc2V0TmFtZTpAIldlYkdMIExheWVyIl07Ci0jZW5kaWYgICAgCi0gICAgRU5E
X0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAgIAotICAgIC8vIGNyZWF0ZSBhIHRleHR1cmUgdG8g
cmVuZGVyIGludG8KLSAgICA6OmdsR2VuVGV4dHVyZXMoMSwgJm1fdGV4dHVyZSk7Ci0gICAgOjpn
bEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7Ci0gICAgOjpnbFRleFBhcmFt
ZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwot
ICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRF
UiwgR0xfTElORUFSKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9U
RVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRV
UkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJl
KEdMX1RFWFRVUkVfMkQsIDApOwotICAgIAotICAgIC8vIGNyZWF0ZSBhbiBGQk8KLSAgICA6Omds
R2VuRnJhbWVidWZmZXJzRVhUKDEsICZtX2Zibyk7Ci0gICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVY
VChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAKLSAgICBtX2JvdW5kRkJPID0gbV9m
Ym87Ci0gICAgaWYgKCFtX2F0dHJzLmFudGlhbGlhcyAmJiAobV9hdHRycy5zdGVuY2lsIHx8IG1f
YXR0cnMuZGVwdGgpKQotICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0
aFN0ZW5jaWxCdWZmZXIpOwotCi0gICAgLy8gY3JlYXRlIGFuIG11bHRpc2FtcGxlIEZCTwotICAg
IGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsR2VuRnJhbWVidWZmZXJzRVhU
KDEsICZtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICBtX2JvdW5kRkJP
ID0gbV9tdWx0aXNhbXBsZUZCTzsKLSAgICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwg
Jm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwg
fHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEs
ICZtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8g
QU5HTEUgaW5pdGlhbGl6YXRpb24uCi0KLSAgICBUQnVpbHRJblJlc291cmNlIEFOR0xFUmVzb3Vy
Y2VzOwotCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyA9IDA7Ci0gICAgZ2V0
SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhfQVRUUklCUywgJkFOR0xFUmVz
b3VyY2VzLm1heFZlcnRleEF0dHJpYnMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heFZlcnRleFVu
aWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFY
X1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhWZXJ0ZXhVbmlmb3Jt
VmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMgPSAwOwotICAg
IGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkFSWUlOR19WRUNUT1JTLCAmQU5H
TEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heFZl
cnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRl
eHQzRDo6TUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMubWF4
VmVydGV4VGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heENvbWJpbmVk
VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNE
OjpNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLm1heENv
bWJpbmVkVGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heFRleHR1cmVJ
bWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1RF
WFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5tYXhUZXh0dXJlSW1hZ2VVbml0cyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IDA7Ci0gICAg
Z2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RP
UlMsICZBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzKTsKLQotICAgIC8v
IEFsd2F5cyBzZXQgdG8gMSBmb3IgT3BlbkdMIEVTLgotICAgIEFOR0xFUmVzb3VyY2VzLm1heERy
YXdCdWZmZXJzID0gMTsKLSAgICAKLSAgICBtX2NvbXBpbGVyLnNldFJlc291cmNlcyhBTkdMRVJl
c291cmNlcyk7Ci0gICAgCi0gICAgOjpnbEVuYWJsZShHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9T
SVpFKTsKLSAgICA6OmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLX0KLQotR3JhcGhpY3NDb250
ZXh0M0Q6On5HcmFwaGljc0NvbnRleHQzRCgpCi17Ci0gICAgaWYgKG1fY29udGV4dE9iaikgewot
ICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgICAgICA6Omds
RGVsZXRlVGV4dHVyZXMoMSwgJm1fdGV4dHVyZSk7Ci0gICAgICAgIGlmIChtX2F0dHJzLmFudGlh
bGlhcykgewotICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVs
dGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8
IG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNF
WFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgOjpn
bERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgp
Ci0gICAgICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fZGVwdGhT
dGVuY2lsQnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJz
RVhUKDEsICZtX2Zibyk7Ci0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KDApOwotICAgICAg
ICBDR0xEZXN0cm95Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIH0KLX0KLQogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKIHsKICAgICBjb25zdCBjaGFyKiBl
eHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhH
TF9FWFRFTlNJT05TKSk7CkBAIC0yNTQsMTEgKzc1LDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmFsaWRhdGVBdHRyaWJ1dAogICAgIG1fYXR0cnMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1
ZTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bWFrZUNvbnRleHRDdXJyZW50KCkKLXsK
LSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotfQotCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jlc3VsdHNUb0NhbnZhcyhDYW52YXNSZW5kZXJp
bmdDb250ZXh0KiBjb250ZXh0KQogewogICAgIEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXMgPSBj
b250ZXh0LT5jYW52YXMoKTsKQEAgLTMwNywyMSArMTIzLDYgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6cGFpbnRSZW5kZXJpbmdSZQogICAgICAgICAgICAgICAgICAgY2FudmFzLT53aWR0aCgp
LCBjYW52YXMtPmhlaWdodCgpLCBpbWFnZUJ1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRl
eHQoKSk7CiB9CiAKLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQoKSBj
b25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9v
bCBHcmFwaGljc0NvbnRleHQzRDo6aXNFcnJvckdlbmVyYXRlZE9uT3V0T2ZCb3VuZHNBY2Nlc3Nl
cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpyZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBpZiAod2lkdGggPT0g
bV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0
T2JqKQpAQCAtNDUzLDE5ICsyNTQsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBl
KGludCB3aWR0CiAgICAgOjpnbEZsdXNoKCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1
cmVDb250ZXh0KENHTENvbnRleHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0g
ICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4
dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNv
bnRleHQpCi0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBpZiAobV9hdHRycy5h
bnRpYWxpYXMpIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1F
QlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKQEAgLTQ3Nyw3ICsyNjgsNyBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmFjdGl2ZVRleHR1cmUodW5zaWduZWQgbG9uZyB0ZXh0dXJlKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CiB9CiAKQEAgLTQ4NSwyNyArMjc2LDI3IEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmF0dGFjaFNoYWRlcihQbGEKIHsKICAgICBBU1NFUlQocHJv
Z3JhbSk7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQXR0YWNoU2hhZGVyKChHTHVpbnQp
IHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJpbmRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxv
bmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFtZSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0
ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xC
aW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVmZmVyKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3Jt
M0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1aW50IGZibzsKICAgICBpZiAoYnVmZmVyKQogICAg
ICAgICBmYm8gPSAoR0x1aW50KWJ1ZmZlcjsKQEAgLTUxOSwxMDYgKzMxMCwxMDYgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKAogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2Jq
ZWN0IHJlbmRlcmJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwg
KEdMdWludCkgcmVuZGVyYnVmZmVyKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
aW5kVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJl
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkgdGV4dHVyZSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91YmxlIHJlZCwgZG91YmxlIGdy
ZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJsZW5kQ29sb3Ioc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRpY19j
YXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFscGhhKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSApCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsQmxlbmRFcXVhdGlvbihtb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgbW9kZVJHQiwgdW5zaWduZWQg
bG9uZyBtb2RlQWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0Is
IG1vZGVBbHBoYSk7CiB9CiAKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jKHVu
c2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJs
ZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKIH0gICAgICAgCiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdCLCB1bnNpZ25lZCBs
b25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQgbG9uZyBkc3RBbHBo
YSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEs
IGRzdEFscGhhKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNp
Z25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6
OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNv
bnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQnVmZmVyRGF0
YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBz
aXplLCBjb25zdCB2b2lkKiBkYXRhKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJ1ZmZlclN1YkRhdGEodGFyZ2V0LCBv
ZmZzZXQsIHNpemUsIGRhdGEpOwogfQogCiB1bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNE
OjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0
dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwg
ZG91YmxlIGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0
YXRpY19jYXN0PGZsb2F0PihnKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxm
bG9hdD4oYSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBs
b25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXIobWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNsZWFyRGVwdGgoZG91YmxlIGRlcHRoKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbENsZWFyRGVwdGgoZGVw
dGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbENsZWFyU3RlbmNpbChzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBib29sIGJsdWUsIGJvb2wgYWxwaGEpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikK
IHsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAgICAgaW50IEdMc2hhZGVyVHlwZTsKICAgICBBTkdM
RVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKQEAgLTY2OSw3ICs0NjAsNyBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNv
cHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBs
b25nIGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgaWYgKG1fYXR0cnMuYW50
aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewogICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
RkJPKTsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVS
X0VYVCwgbV9mYm8pOwpAQCAtNjgzLDcgKzQ3NCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmNvcHlUZXhJbWFnZTJEKHUKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1Yklt
YWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcgeG9mZnNldCwgbG9u
ZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQg
bG9uZyBoZWlnaHQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9
PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
UkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwogICAgICAgICA6OmdsQmlu
ZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CkBAIC02OTcs
MjUgKzQ4OCwyNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyCiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVw
dGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZsYWcpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6
OmdsRGVwdGhNYXNrKGZsYWcpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJh
bmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGVwdGhSYW5nZSh6TmVh
ciwgekZhcik7CiB9CiAKQEAgLTcyMyw2MSArNTE0LDYxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmRldGFjaFNoYWRlcihQbGEKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7CiAgICAgQVNTRVJU
KHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQp
IHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQg
bG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsRGlzYWJsZShjYXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpkcmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwg
bG9uZyBjb3VudCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1v
ZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCByZWludGVycHJldF9j
YXN0PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjplbmFibGUodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRW5h
YmxlKGNhcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJp
YkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmli
QXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAg
ICAgOjpnbEZpbmlzaCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCgpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsRmx1c2goKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZm
ZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNo
bWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3Qg
YnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsKICAg
ICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHsKICAgICAgICAg
OjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVOVCwg
cmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwpAQCAtNzg4LDE5ICs1NzksMTkgQEAg
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0z
RE9iamVjdCB0ZXh0dXJlLCBsb25nIGxldmVsKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVy
ZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJlLCBs
ZXZlbCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyb250RmFjZSh1bnNpZ25lZCBs
b25nIG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsRnJvbnRGYWNlKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZW5lcmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6
Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOwogfQogCkBAIC04MTAsNyArNjAxLDcgQEAgYm9v
bCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlQXR0cmliKAogICAgICAgICBzeW50aGVzaXpl
R0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IEdMaW50IG1heEF0dHJpYnV0ZVNpemUgPSAwOwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGlj
X2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAm
bWF4QXR0cmlidXRlU2l6ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4QXR0cmlidXRlU2l6ZV07IC8v
IEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9u
CkBAIC04MzIsNyArNjIzLDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5p
Zm9ybQogICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKICAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsKICAgICA6
OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9V
TklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4
VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51
bGwgdGVybWluYXRpb24KQEAgLTg1NCw3ICs2NDUsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRBdHRhY2hlZFNoYWRlCiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFM
VUUpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldEF0dGFjaGVkU2hhZGVycyhz
dGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQsIHNoYWRlcnMpOwog
fQogCkBAIC04NjIsOCArNjUzLDggQEAgaW50IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJM
b2NhdGlvbgogewogICAgIGlmICghcHJvZ3JhbSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUu
dXRmOCgpLmRhdGEoKSk7CiB9CiAKQEAgLTg4MSwxOSArNjcyLDE5IEBAIHVuc2lnbmVkIGxvbmcg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm8KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKIH0KIAogU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIFN0cmluZygoY29u
c3QgY2hhciopIDo6Z2xHZXRTdHJpbmcobmFtZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpoaW50KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIG1vZGUpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwogfQogCkBAIC05MDEsMTQgKzY5MiwxNCBAQCBib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9yCiB7CiAgICAgaWYgKCFidWZmZXIp
CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0J1ZmZlcigo
R0x1aW50KSBidWZmZXIpOwogfQogCiBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQo
dW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzRW5hYmxlZChjYXApOwogfQog
CkBAIC05MTYsOCArNzA3LDggQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZl
cihQbAogewogICAgIGlmICghZnJhbWVidWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVy
KTsKIH0KIApAQCAtOTI1LDggKzcxNiw4IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJv
Z3JhbShQbGF0Zm8KIHsKICAgICBpZiAoIXByb2dyYW0pCiAgICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAK
QEAgLTkzNCw4ICs3MjUsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZl
cihQCiB7CiAgICAgaWYgKCFyZW5kZXJidWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1JlbmRlcmJ1ZmZlckVYVCgoR0x1aW50KSByZW5kZXJidWZm
ZXIpOwogfQogCkBAIC05NDMsOCArNzM0LDggQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNT
aGFkZXIoUGxhdGZvcgogewogICAgIGlmICghc2hhZGVyKQogICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKIH0KIApA
QCAtOTUyLDMzICs3NDMsMzMgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBs
YXRmbwogewogICAgIGlmICghdGV4dHVyZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0dXJlKTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0aCkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xMaW5l
V2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsKICAgICBBU1NF
UlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGxvbmcgcGFyYW0pCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3Vi
bGUgdW5pdHMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0aWNfY2FzdDxmbG9hdD4oZmFj
dG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7CiB9CiAKQEAgLTk4Niw3ICs3NzcsNyBA
QCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgCiB7CiAgICAgLy8gRklY
TUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBm
aXhlZCwgaS5lLiwKICAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBi
ZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xGbHVzaCgpOwogICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKICAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZUZCTyk7CkBAIC0xMDAzLDEzICs3OTQsMTMgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6cmVhZFBpeGVscyhsb25nIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNo
YWRlckNvbXBpbGVyKCkKIHsKICAgICAvLyBGSVhNRTogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQg
b24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8gaGF2ZSBpZmRlZnMgZm9yIHRoZSBkaWZmZXJl
bnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRo
LCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsK
ICAgICBjYXNlIERFUFRIX1NURU5DSUw6CiAgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQ
VEgyNF9TVEVOQ0lMOF9FWFQ7CkBAIC0xMDMwLDIxICs4MjEsMjEgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzYW1w
bGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFNhbXBsZUNv
dmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSksIGludmVydCk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lk
dGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgs
IGhlaWdodCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0
Zm9ybTNET2JqZWN0IHNoYWRlciwgY29uc3QgU3RyaW5nJiBzdHJpbmcpCiB7CiAgICAgQVNTRVJU
KHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAg
ZW5zdXJlQ29udGV4dCgpOwogCiAgICAgU2hhZGVyU291cmNlRW50cnkgZW50cnk7CiAKQEAgLTEw
NTUsMjcwICs4NDYsMjcwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQ
bGEKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBm
dW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBtYXNrKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFN0ZW5jaWxGdW5j
KGZ1bmMsIHJlZiwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxG
dW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcg
cmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShm
YWNlLCBmdW5jLCByZWYsIG1hc2spOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVu
Y2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbE1hc2sobWFzayk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWdu
ZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbE1hc2tT
ZXBhcmF0ZShmYWNlLCBtYXNrKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNp
bE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9u
ZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2VwYXJhdGUodW5zaWduZWQgbG9uZyBm
YWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxv
bmcgenBhc3MpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFpbCwgemZhaWws
IHpwYXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZih1bnNp
Z25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1ZSkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xUZXhQ
YXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKHVuc2lnbmVkIHRhcmdldCwg
dW5zaWduZWQgcG5hbWUsIGludCB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKHRhcmdl
dCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjApCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
VW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6
Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNp
emUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQg
djEsIGZsb2F0IHYyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0zZihsb2NhdGlvbiwgdjAsIHYxLCB2Mik7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZnYobG9uZyBsb2NhdGlvbiwg
ZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRv
IGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFy
cmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRp
b24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVu
aWZvcm00Zihsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUp
CiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjApCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
VW5pZm9ybTFpKGxvY2F0aW9uLCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm0xaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
VW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6
OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQogewog
ICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
VW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtM2kobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRpb24sIHYwLCB2MSwgdjIpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGlu
dCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBv
ZiAzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQg
djEsIGludCB2MiwgaW50IHYzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm00aShsb2NhdGlvbiwgdjAsIHYx
LCB2MiwgdjMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcg
bG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGgg
bmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTRpdihsb2NhdGlvbiwg
c2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4
MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXpl
KQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsVW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2Nh
dGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8g
RklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3Jt
TWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxvY2F0aW9uLCBib29sIHRy
YW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3Ro
IG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtTWF0cml4NGZ2KGxv
Y2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVXNl
UHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dmFsaWRhdGVQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsKICAgICBBU1NFUlQo
cHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAg
ZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWYWxpZGF0ZVByb2dyYW0oKEdMdWludCkgcHJvZ3Jh
bSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmKHVuc2lnbmVk
IGxvbmcgaW5keCwgZmxvYXQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjAp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQg
bG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgs
IGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5z
aWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0
cmliMmYoaW5keCwgdjAsIHYxKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4
QXR0cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZl
cnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBm
bG9hdCB2MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxvbmcg
aW5keCwgZmxvYXQqIGFycmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjNmdihpbmR4LCBhcnJh
eSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2lnbmVk
IGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwgdjAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9h
dCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNpZ25lZCBsb25n
IGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNpZ25lZCBsb25n
IHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliUG9p
bnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHJlaW50ZXJwcmV0X2Nh
c3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnZpZXdwb3J0KGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdp
ZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWaWV3cG9ydChzdGF0aWNfY2Fz
dDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4o
d2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQpKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9uZyBwbmFtZSwgdW5zaWduZWQgY2hh
ciogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZhbHVlKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0
YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0QnVm
ZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25n
IHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBp
bnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hN
RU5UKQogICAgICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJ
TF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3MuCiAgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNo
bWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKQEAg
LTEzMzMsNyArMTEyNCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEludGVnZXJ2KHVu
c2kKICAgICAvLyBiZWNhdXNlIGRlc2t0b3AgR0wncyBjb3JyZXNwb25kaW5nIHF1ZXJpZXMgcmV0
dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwogICAgIC8vIHdoZXJlYXMgR0xFUzIgcmV0dXJu
IHRoZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFjaCB2ZWN0b3IgaGFzIDQgY29tcG9uZW50cykuCiAg
ICAgLy8gVGhlcmVmb3JlLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVza3RvcCBHTCBuZWVkcyB0
byBiZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICBzd2l0Y2ggKHBuYW1lKSB7CiAgICAgY2FzZSBJTVBMRU1F
TlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoKICAgICAgICAgKnZhbHVlID0gR0xfUkdCOwpAQCAt
MTM2MCwxNSArMTE1MSwxNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1
bnNpCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2Jq
ZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
R2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIFN0cmlu
ZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbUluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBw
cm9ncmFtKQogewogICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbGVuZ3Ro
OwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVO
R1RILCAmbGVuZ3RoKTsKICAgICAKQEAgLTEzODUsMTYgKzExNzYsMTYgQEAgU3RyaW5nIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mbwogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0
ZXJpdkVYVCh0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFNoYWRlcml2KFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBu
YW1lLCBpbnQqIHZhbHVlKQogewogICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKKworICAgIGVuc3VyZUNvbnRleHQoKTsKKwog
ICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRv
ciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7CiAgICAgCiAgICAgc3dp
dGNoIChwbmFtZSkgewpAQCAtMTQwNCwyNSArMTE5NSwyNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRTaGFkZXJpdihQbGF0CiAgICAgICAgIAogICAgICAgICAgICAgOjpnbEdldFNoYWRl
cml2KChHTHVpbnQpIHNoYWRlciwgcG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwot
CisgICAgICAgIAogICAgICAgICBjYXNlIENPTVBJTEVfU1RBVFVTOgogICAgICAgICAgICAgaWYg
KHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgewogICAgICAgICAgICAgICAgICgq
dmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJu
OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorICAgICAgICAKICAgICAgICAgICAg
ICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKICAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgICBjYXNlIElO
Rk9fTE9HX0xFTkdUSDoKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VN
YXAuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAoKnZhbHVlKSA9IDA7CiAgICAgICAgICAgICAg
ICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisgICAgICAgIAogICAgICAg
ICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7CiAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAorICAgICAgICAKICAgICAgICAgY2FzZSBTSEFE
RVJfU09VUkNFX0xFTkdUSDoKICAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVyU291cmNl
KHNoYWRlcikubGVuZ3RoKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0MzYsNyArMTIyNyw3
IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVySW5mb0wKIHsKICAgICBBU1NF
UlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1
aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7CiAKQEAgLTE0NzEsNyAr
MTI2Miw3IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIHsKICAg
ICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRl
clNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChz
aGFkZXIpOwogCkBAIC0xNDg0LDUyICsxMjc1LDUyIEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQz
RDo6Z2V0U2hhZGVyU291cmMKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1l
dGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2
YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpn
bEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9u
ZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFVuaWZvcm1mdigoR0x1aW50
KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBp
bnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2Nh
dGlvbiwgdmFsdWUpOwogfQogCiBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9j
YXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCiB7CiAg
ICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbEdldFVuaWZvcm1Mb2Nh
dGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNpZ25lZCBsb25nIGluZGV4LCB1
bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0VmVydGV4QXR0
cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5h
bWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1l
LCB2YWx1ZSk7CiB9CiAKIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk9m
ZnNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKKyAgICBlbnN1cmVDb250ZXh0KCk7CisK
ICAgICB2b2lkKiBwb2ludGVyOwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRl
eCwgcG5hbWUsICZwb2ludGVyKTsKICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxsb25nPihw
b2ludGVyKTsKQEAgLTE1MzcsNyArMTMyOCw3IEBAIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFZlcnRleEF0dHJpYk8KIAogaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJEKHVuc2ln
bmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGludGVybmFsZm9ybWF0LCB1bnNp
Z25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBib3JkZXIsIHVuc2lnbmVkIGZv
cm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICA6OmdsVGV4SW1hZ2Uy
RCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBm
b3JtYXQsIHR5cGUsIHBpeGVscyk7CiAgICAgcmV0dXJuIDA7CkBAIC0xNTQ1LDcgKzEzMzYsNyBA
QCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdlMkQodW5zaWduCiAKIGludCBHcmFwaGlj
c0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVs
LCB1bnNpZ25lZCB4b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQg
aGVpZ2h0LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
CiAgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJh
bXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVycyB0aGF0IGRpZmZlciBmcm9tIHRoZSBz
dWJpbWFnZSBzaXplCiAgICAgOjpnbFRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwg
eW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwpAQCAtMTU1NCw3ICsx
MzQ1LDcgQEAgaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhTdWJJbWFnZTJEKHVucwogCiB1bnNp
Z25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyKCkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMdWludCBvOwog
ICAgIGdsR2VuQnVmZmVycygxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTYyLDcgKzEzNTMs
NyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyCiAKIHVuc2lnbmVk
IEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgbzsK
ICAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTcw
LDEzICsxMzYxLDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWIK
IAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0oKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0
dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwogfQogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6
Y3JlYXRlUmVuZGVyYnVmZmVyKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMdWludCBvOwogICAgIGdsR2VuUmVuZGVyYnVm
ZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTg0LDEzICsxMzc1LDEzIEBAIHVu
c2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVSZW5kZXIKIAogdW5zaWduZWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1
cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJBR01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5U
X1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwogfQogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y3JlYXRlVGV4dHVyZSgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgbzsKICAgICBnbEdlblRleHR1cmVz
KDEsICZvKTsKICAgICByZXR1cm4gbzsKQEAgLTE1OTgsMzcgKzEzODksMzcgQEAgdW5zaWduZWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxldGVCdWZmZXJzKDEs
ICZidWZmZXIpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZl
cih1bnNpZ25lZCBmcmFtZWJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEs
ICZmcmFtZWJ1ZmZlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVByb2dy
YW0odW5zaWduZWQgcHJvZ3JhbSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2lnbmVkIHJl
bmRlcmJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmcmVuZGVyYnVm
ZmVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlU2hhZGVyKHVuc2lnbmVk
IHNoYWRlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVs
ZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUpOwogfQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkocmV2aXNpb24g
NjY2MjcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQz
RE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsMjIgKzMxLDIyIEBACiAKICNpbXBvcnQgIkJs
b2NrRXhjZXB0aW9ucy5oIgogCi0jaW5jbHVkZSAiQU5HTEUvUmVzb3VyY2VMaW1pdHMuaCIKKyNp
bmNsdWRlICJBTkdMRS9TaGFkZXJMYW5nLmgiCiAjaW5jbHVkZSAiQXJyYXlCdWZmZXIuaCIKICNp
bmNsdWRlICJBcnJheUJ1ZmZlclZpZXcuaCIKLSNpbmNsdWRlICJXZWJHTE9iamVjdC5oIgogI2lu
Y2x1ZGUgIkNhbnZhc1JlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxDb3JlR3JhcGhpY3Mv
Q0dCaXRtYXBDb250ZXh0Lmg+CiAjaW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCiAjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKICNpbmNs
dWRlICJJbWFnZUJ1ZmZlci5oIgogI2luY2x1ZGUgIkludDMyQXJyYXkuaCIKICNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKLSNpbmNsdWRlICJXZWJH
TExheWVyLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgogI2lu
Y2x1ZGUgPE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KICNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNp
bmNsdWRlICJVaW50OEFycmF5LmgiCisjaW5jbHVkZSAiV2ViR0xMYXllci5oIgorI2luY2x1ZGUg
IldlYkdMT2JqZWN0LmgiCiAjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+CiAjaW5jbHVkZSA8
d3RmL3RleHQvQ1N0cmluZy5oPgogCkBAIC0xODYsMjMgKzE4NiwyMyBAQCBHcmFwaGljc0NvbnRl
eHQzRDo6R3JhcGhpY3NDb250ZXh0M0QoR3JhCiAKICAgICBUQnVpbHRJblJlc291cmNlIEFOR0xF
UmVzb3VyY2VzOwogCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyA9IDA7Ci0g
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhfQVRUUklCUywgJkFO
R0xFUmVzb3VyY2VzLm1heFZlcnRleEF0dHJpYnMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heFZl
cnRleFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQz
RDo6TUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhWZXJ0ZXhV
bmlmb3JtVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMgPSAw
OwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkFSWUlOR19WRUNUT1JT
LCAmQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMpOwotICAgIEFOR0xFUmVzb3VyY2Vz
Lm1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGlj
c0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJj
ZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heENv
bWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29u
dGV4dDNEOjpNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2Vz
Lm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2VzLm1heFRl
eHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6
TUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5tYXhUZXh0dXJlSW1hZ2VV
bml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9ycyA9IDA7
Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9GUkFHTUVOVF9VTklGT1JN
X1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzKTsKKyAg
ICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKKyAgICBnZXRJbnRlZ2VydihH
cmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVSZXNvdXJjZXMuTWF4
VmVydGV4QXR0cmlicyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3Rv
cnMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1VO
SUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZvcm1WZWN0b3JzKTsK
KyAgICBBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7CisgICAgZ2V0SW50ZWdl
cnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNl
cy5NYXhWYXJ5aW5nVmVjdG9ycyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVy
ZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhf
VkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhUZXh0
dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1h
Z2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9DT01C
SU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0
dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMg
PSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVYVFVSRV9JTUFH
RV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdM
RVJlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKKyAgICBnZXRJbnRlZ2Vy
dihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xF
UmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOwogCiAgICAgLy8gQWx3YXlzIHNl
dCB0byAxIGZvciBPcGVuR0wgRVMuCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4RHJhd0J1ZmZlcnMg
PSAxOworICAgIEFOR0xFUmVzb3VyY2VzLk1heERyYXdCdWZmZXJzID0gMTsKICAgICAKICAgICBt
X2NvbXBpbGVyLnNldFJlc291cmNlcyhBTkdMRVJlc291cmNlcyk7CiAgICAgCkBAIC0yMzAsODEg
KzIzMCwxNCBAQCBHcmFwaGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKICAgICB9
CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlQXR0cmlidXRlcygpCi17Ci0g
ICAgY29uc3QgY2hhciogZXh0ZW5zaW9ucyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+
KDo6Z2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwp
IHsKLSAgICAgICAgaWYgKHN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfcGFja2VkX2Rl
cHRoX3N0ZW5jaWwiKSkgewotICAgICAgICAgICAgaWYgKCFtX2F0dHJzLmRlcHRoKQotICAgICAg
ICAgICAgICAgIG1fYXR0cnMuZGVwdGggPSB0cnVlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAg
ICAgIG1fYXR0cnMuc3RlbmNpbCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMpIHsKLSAgICAgICAgYm9vbCBpc1ZhbGlkVmVuZG9yID0gdHJ1ZTsKLSAgICAgICAgLy8g
Q3VycmVudGx5IGluIE1hYyB3ZSBvbmx5IHR1cm4gb24gYW50aWFsaWFzIGlmIHZlbmRvciBpcyBO
VklESUEuCi0gICAgICAgIGNvbnN0IGNoYXIqIHZlbmRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29u
c3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfVkVORE9SKSk7Ci0gICAgICAgIGlmICghc3RkOjpz
dHJzdHIodmVuZG9yLCAiTlZJRElBIikpCi0gICAgICAgICAgICBpc1ZhbGlkVmVuZG9yID0gZmFs
c2U7Ci0gICAgICAgIGlmICghaXNWYWxpZFZlbmRvciB8fCAhc3RkOjpzdHJzdHIoZXh0ZW5zaW9u
cywgIkdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSIpKQotICAgICAgICAgICAgbV9hdHRy
cy5hbnRpYWxpYXMgPSBmYWxzZTsKLSAgICB9Ci0gICAgLy8gRklYTUU6IGluc3RlYWQgb2YgZW5m
b3JjaW5nIHByZW11bHRpcGxpZWRBbHBoYSA9IHRydWUsIGltcGxlbWVudCB0aGUKLSAgICAvLyBj
b3JyZWN0IGJlaGF2aW9yIHdoZW4gcHJlbXVsdGlwbGllZEFscGhhID0gZmFsc2UgaXMgcmVxdWVz
dGVkLgotICAgIG1fYXR0cnMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6bWFrZUNvbnRleHRDdXJyZW50KCkKLXsKLSAgICBDR0xTZXRDdXJy
ZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
YWludFJlbmRlcmluZ1Jlc3VsdHNUb0NhbnZhcyhDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBjb250
ZXh0KQordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5zdXJlQ29udGV4dCgpCiB7Ci0gICAgSFRN
TENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwotICAgIEltYWdlQnVm
ZmVyKiBpbWFnZUJ1ZmZlciA9IGNhbnZhcy0+YnVmZmVyKCk7Ci0KLSAgICBpbnQgcm93Qnl0ZXMg
PSBtX2N1cnJlbnRXaWR0aCAqIDQ7Ci0gICAgaW50IHRvdGFsQnl0ZXMgPSByb3dCeXRlcyAqIG1f
Y3VycmVudEhlaWdodDsKLQotICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IHBpeGVscyhu
ZXcgdW5zaWduZWQgY2hhclt0b3RhbEJ5dGVzXSk7Ci0gICAgaWYgKCFwaXhlbHMpCisgICAgaWYg
KCFtX2NvbnRleHRPYmopCiAgICAgICAgIHJldHVybjsKIAotICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICBib29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0g
ICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0g
ICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3Vy
cmVudEhlaWdodCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQ09M
T1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVY
VChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0
cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fZmJvKSB7Ci0g
ICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICB9Ci0gICAg
fQotCi0gICAgR0xpbnQgcGFja0FsaWdubWVudCA9IDQ7Ci0gICAgYm9vbCBtdXN0UmVzdG9yZVBh
Y2tBbGlnbm1lbnQgPSBmYWxzZTsKLSAgICA6OmdsR2V0SW50ZWdlcnYoR0xfUEFDS19BTElHTk1F
TlQsICZwYWNrQWxpZ25tZW50KTsKLSAgICBpZiAocGFja0FsaWdubWVudCA+IDQpIHsKLSAgICAg
ICAgOjpnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICAgICAgbXVzdFJl
c3RvcmVQYWNrQWxpZ25tZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICA6OmdsUmVhZFBpeGVscygw
LCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9CR1JBLCBHTF9VTlNJR05F
RF9JTlRfOF84XzhfOF9SRVYsIHBpeGVscy5nZXQoKSk7Ci0KLSAgICBpZiAobXVzdFJlc3RvcmVQ
YWNrQWxpZ25tZW50KQotICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQs
IHBhY2tBbGlnbm1lbnQpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQotICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7Ci0KLSAg
ICBwYWludFRvQ2FudmFzKHBpeGVscy5nZXQoKSwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhl
aWdodCwKLSAgICAgICAgICAgICAgICAgIGNhbnZhcy0+d2lkdGgoKSwgY2FudmFzLT5oZWlnaHQo
KSwgaW1hZ2VCdWZmZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgIENHTENv
bnRleHRPYmogY3VycmVudENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlm
IChjdXJyZW50Q29udGV4dCAhPSBtX2NvbnRleHRPYmopCisgICAgICAgIENHTFNldEN1cnJlbnRD
b250ZXh0KG1fY29udGV4dE9iaik7CiB9CiAKIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xF
UzJDb21wbGlhbnQoKSBjb25zdApAQCAtMzIxLDEzNDMgKzI1NCw3IEBAIGJvb2wgR3JhcGhpY3ND
b250ZXh0M0Q6OmlzRXJyb3JHZW5lcmF0ZWQKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewot
ICAgIGlmICh3aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVp
Z2h0IHx8ICFtX2NvbnRleHRPYmopCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX2N1cnJl
bnRXaWR0aCA9IHdpZHRoOwotICAgIG1fY3VycmVudEhlaWdodCA9IGhlaWdodDsKLSAgICAKLSAg
ICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIEdMdWludCBp
bnRlcm5hbENvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3Jt
YXQgPSAwOwotICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JG
b3JtYXQgPSBHTF9SR0JBODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0JBOwotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0I4OwotICAgICAgICBj
b2xvckZvcm1hdCA9IEdMX1JHQjsKLSAgICB9Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBt
X2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHRoZSBsb2dpYyB3aGVy
ZSBzdGVuY2lsIGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBub3QuCi0gICAgICAgIC8vIFNlZSBH
cmFwaGljc0NvbnRleHQzRCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCAmJiBtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3Jt
YXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAg
aW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgfQot
Ci0gICAgYm9vbCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotCi0gICAgLy8gcmVzaXplIG11bHRp
c2FtcGxlIEZCTwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBHTGludCBt
YXhTYW1wbGVDb3VudDsKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9TQU1QTEVTX0VY
VCwgJm1heFNhbXBsZUNvdW50KTsKLSAgICAgICAgR0xpbnQgc2FtcGxlQ291bnQgPSBzdGQ6Om1p
big4LCBtYXhTYW1wbGVDb3VudCk7Ci0gICAgICAgIGlmIChzYW1wbGVDb3VudCA+IG1heFNhbXBs
ZUNvdW50KQotICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBtYXhTYW1wbGVDb3VudDsKLSAgICAg
ICAgaWYgKG1fYm91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8p
OwotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAg
IDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1w
bGVFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsQ29sb3JGb3Jt
YXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1JFTkRF
UkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAgICAgOjpnbEJpbmRSZW5k
ZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNp
bEJ1ZmZlcik7Ci0gICAgICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxl
RVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbERlcHRoU3RlbmNp
bEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2ls
KQotICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1f
YXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRF
UkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9
Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDAp
OwotICAgICAgICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVS
X0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7Ci0gICAgICAgICAgICAvLyBG
SVhNRTogY2xlYW51cC4KLSAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIH0K
LSAgICB9Ci0KLSAgICAvLyByZXNpemUgcmVndWxhciBGQk8KLSAgICBpZiAobV9ib3VuZEZCTyAh
PSBtX2ZibykgewotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIDo6Z2xC
aW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgfQotICAg
IDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmUpOwotICAgIDo6Z2xUZXhJ
bWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWln
aHQsIDAsIGNvbG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKLSAgICA6OmdsRnJhbWVi
dWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5U
MF9FWFQsIEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJl
KEdMX1RFWFRVUkVfMkQsIDApOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxpYXMgJiYgKG1fYXR0
cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSkgewotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1
ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAg
ICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIGludGVy
bmFsRGVwdGhTdGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKG1fYXR0
cnMuc3RlbmNpbCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJV
RkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuZGVw
dGgpCi0gICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVC
VUZGRVJfRVhULCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwg
bV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCAwKTsKLSAgICB9Ci0gICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZl
clN0YXR1c0VYVChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRF
X0VYVCkgewotICAgICAgICAvLyBGSVhNRTogY2xlYW51cAotICAgICAgICBub3RJbXBsZW1lbnRl
ZCgpOwotICAgIH0KLQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7
Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgICAg
ICBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgcmVu
ZGVyYnVmZmVycyB0byAwLgotICAgIEdMYm9vbGVhbiBjb2xvck1hc2tbXSA9IHtHTF9UUlVFLCBH
TF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNrID0gR0xfVFJVRSwgc3RlbmNpbE1h
c2sgPSBHTF9UUlVFOwotICAgIEdMYm9vbGVhbiBpc1NjaXNzb3JFbmFibGVkID0gR0xfRkFMU0U7
Ci0gICAgR0xib29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYml0Zmll
bGQgY2xlYXJNYXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLSAgICA6OmdsR2V0Qm9vbGVhbnYo
R0xfQ09MT1JfV1JJVEVNQVNLLCBjb2xvck1hc2spOwotICAgIDo6Z2xDb2xvck1hc2soR0xfVFJV
RSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKG1fYXR0cnMuZGVwdGgpIHsK
LSAgICAgICAgOjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dSSVRFTUFTSywgJmRlcHRoTWFzayk7
Ci0gICAgICAgIDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNsZWFyTWFzayB8PSBH
TF9ERVBUSF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7Ci0g
ICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dSSVRFTUFTSywgJnN0ZW5jaWxNYXNr
KTsKLSAgICAgICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUpOwotICAgICAgICBjbGVhck1hc2sg
fD0gR0xfU1RFTkNJTF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpc1NjaXNzb3JFbmFibGVkID0g
OjpnbElzRW5hYmxlZChHTF9TQ0lTU09SX1RFU1QpOwotICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNT
T1JfVEVTVCk7Ci0gICAgaXNEaXRoZXJFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9ESVRIRVIp
OwotICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICA6OmdsQ2xlYXIoY2xlYXJNYXNr
KTsKLQotICAgIDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBdLCBjb2xvck1hc2tbMV0sIGNvbG9y
TWFza1syXSwgY29sb3JNYXNrWzNdKTsKLSAgICBpZiAobV9hdHRycy5kZXB0aCkKLSAgICAgICAg
OjpnbERlcHRoTWFzayhkZXB0aE1hc2spOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAg
ICAgIDo6Z2xTdGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Ci0gICAgaWYgKGlzU2Npc3NvckVuYWJs
ZWQpCi0gICAgICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBlbHNlCi0gICAg
ICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaWYgKGlzRGl0aGVyRW5hYmxl
ZCkKLSAgICAgICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIGVsc2UKLSAgICAgICAgOjpn
bERpc2FibGUoR0xfRElUSEVSKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZUZCTykKLSAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwot
Ci0gICAgOjpnbEZsdXNoKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0
KENHTENvbnRleHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIHJl
dHVybjsKLSAgICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdl
dEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCi0g
ICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsK
LSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdp
ZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWln
aHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLSAgICB9Ci0gICAg
OjpnbEZpbmlzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJl
KHVuc2lnbmVkIGxvbmcgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmF0dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3Jt
M0RPYmplY3Qgc2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NFUlQoc2hh
ZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEF0dGFjaFNo
YWRlcigoR0x1aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFt
LCB1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJU
KHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmlu
ZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZm
ZXIpOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNp
Z25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAgaWYgKGJ1ZmZlcikK
LSAgICAgICAgZmJvID0gKEdMdWludClidWZmZXI7Ci0gICAgZWxzZQotICAgICAgICBmYm8gPSAo
bV9hdHRycy5hbnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8pOwotICAgIGlmIChm
Ym8gIT0gbV9ib3VuZEZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdl
dCwgZmJvKTsKLSAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKLSAgICB9Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBs
YXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIChHTHVpbnQpIHJl
bmRlcmJ1ZmZlcik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwg
KEdMdWludCkgdGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29s
b3IoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRDb2xvcihz
dGF0aWNfY2FzdDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwgc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBtb2RlICkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRXF1YXRp
b24obW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBh
cmF0ZSh1bnNpZ25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRFcXVhdGlvblNl
cGFyYXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YmxlbmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9y
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5j
KHNmYWN0b3IsIGRmYWN0b3IpOwotfSAgICAgICAKLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YmxlbmRGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0
UkdCLCB1bnNpZ25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jU2VwYXJh
dGUoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1
bnNpZ25lZCBsb25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNp
emUsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwg
ZGF0YSwgdXNhZ2UpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRh
KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQq
IGRhdGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZm
ZXJTdWJEYXRhKHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLX0KLQotdW5zaWduZWQgbG9u
ZyBHcmFwaGljc0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25n
IHRhcmdldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJu
IDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91
YmxlIGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVh
ckNvbG9yKHN0YXRpY19jYXN0PGZsb2F0PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0
aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0PihhKSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyKG1hc2spOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJv
b2wgYmx1ZSwgYm9vbCBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbENvbG9yTWFzayhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIp
Ci17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotCi0gICAgaW50IEdMc2hhZGVyVHlwZTsKLSAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlw
ZTsKLQotICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFERVJfVFlQRSwgJkdMc2hhZGVyVHlw
ZSk7Ci0gICAgCi0gICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hBREVSKQotICAgICAg
ICBzaGFkZXJUeXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwotICAgIGVsc2UgaWYgKEdMc2hhZGVy
VHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpCi0gICAgICAgIHNoYWRlclR5cGUgPSBTSEFERVJfVFlQ
RV9GUkFHTUVOVDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybjsgLy8gSW52YWxpZCBzaGFkZXIg
dHlwZS4KLQotICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+
OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAg
ICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBTaGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKLQotICAg
IFN0cmluZyB0cmFuc2xhdGVkU2hhZGVyU291cmNlOwotICAgIFN0cmluZyBzaGFkZXJJbmZvTG9n
OwotCi0gICAgYm9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNoYWRlclNvdXJjZShl
bnRyeS5zb3VyY2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNsYXRlZFNoYWRlclNv
dXJjZSwgc2hhZGVySW5mb0xvZyk7Ci0KLSAgICBlbnRyeS5sb2cgPSBzaGFkZXJJbmZvTG9nOwot
ICAgIGVudHJ5LmlzVmFsaWQgPSBpc1ZhbGlkOwotCi0gICAgaWYgKCFpc1ZhbGlkKQotICAgICAg
ICByZXR1cm47IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1vdmUgZm9yd2FyZCB3
aXRoIGNvbXBpbGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKLQotICAgIGludCB0cmFuc2xhdGVk
U2hhZGVyTGVuZ3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgoKTsKLQotICAgIGNv
bnN0IENTdHJpbmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNsYXRlZFNoYWRlclNv
dXJjZS51dGY4KCk7Ci0gICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRlclB0ciA9IHRyYW5z
bGF0ZWRTaGFkZXJDU3RyaW5nLmRhdGEoKTsKLSAgICAKLSAgICA6OmdsU2hhZGVyU291cmNlKChH
THVpbnQpIHNoYWRlciwgMSwgJnRyYW5zbGF0ZWRTaGFkZXJQdHIsICZ0cmFuc2xhdGVkU2hhZGVy
TGVuZ3RoKTsKLSAgICAKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50KSBzaGFkZXIpOwot
ICAgIAotICAgIGludCBHTENvbXBpbGVTdWNjZXNzOwotICAgIAotICAgIDo6Z2xHZXRTaGFkZXJp
digoR0x1aW50KSBzaGFkZXIsIENPTVBJTEVfU1RBVFVTLCAmR0xDb21waWxlU3VjY2Vzcyk7Ci0g
ICAgCi0gICAgLy8gQVNTRVJUIHRoYXQgQU5HTEUgZ2VuZXJhdGVkIEdMU0wgd2lsbCBiZSBhY2Nl
cHRlZCBieSBPcGVuR0wKLSAgICBBU1NFUlQoR0xDb21waWxlU3VjY2VzcyA9PSBHTF9UUlVFKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleEltYWdlMkQodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcg
eCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgbG9u
ZyBib3JkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19G
UkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4
LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwg
R0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1
ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlU
ZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVp
Z2h0LCBib3JkZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09
IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y29weVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWws
IGxvbmcgeG9mZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9u
ZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1f
bXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFE
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpn
bEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
LSAgICB9Ci0gICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQs
IHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlh
cyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ3VsbEZhY2UobW9kZSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyh1bnNpZ25lZCBsb25nIGZ1
bmMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aEZ1
bmMoZnVuYyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZs
YWcpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aE1h
c2soZmxhZyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoUmFuZ2UoZG91Ymxl
IHpOZWFyLCBkb3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkZXRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9ybTNE
T2JqZWN0IHNoYWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgQVNTRVJUKHNoYWRl
cik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXRhY2hTaGFk
ZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGUoY2FwKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5k
ZXgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEaXNhYmxl
VmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
cmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERyYXdBcnJheXMobW9k
ZSwgZmlyc3QsIGNvdW50KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1l
bnRzKHVuc2lnbmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9u
ZyB0eXBlLCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2Fz
dDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5k
ZXgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGVW
ZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZp
bmlzaCgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGaW5p
c2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJn
ZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0
YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWludCkgYnVmZmVyOwot
ICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkgewotICAgICAg
ICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBUSF9BVFRBQ0hNRU5U
LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1
ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxfQVRUQUNITUVOVCwgcmVuZGVyYnVm
ZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIH0gZWxzZQotICAgICAgICA6OmdsRnJhbWVi
dWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJn
ZXQsIHJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVm
ZmVyVGV4dHVyZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1l
bnQsIHVuc2lnbmVkIGxvbmcgdGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxv
bmcgbGV2ZWwpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xG
cmFtZWJ1ZmZlclRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgKEdM
dWludCkgdGV4dHVyZSwgbGV2ZWwpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcm9u
dEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsRnJvbnRGYWNlKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpnZW5lcmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7
Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYihQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCi17
Ci0gICAgaWYgKCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURf
VkFMVUUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICBHTGludCBtYXhBdHRyaWJ1dGVTaXplID0gMDsKLSAgICA6Omds
R2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9BVFRS
SUJVVEVfTUFYX0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdMY2hhciBuYW1lW21h
eEF0dHJpYnV0ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggaW5jbHVk
ZXMgbnVsbCB0ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAgR0xp
bnQgc2l6ZSA9IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVBdHRy
aWIoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heEF0dHJpYnV0ZVNpemUs
ICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1l
TGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0gICAgCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3Rp
dmVVbmlmb3JtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwg
QWN0aXZlSW5mbyYgaW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhl
c2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IG1heFVuaWZvcm1T
aXplID0gMDsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3Jh
bSksIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7Ci0gICAg
R0xjaGFyIG5hbWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVO
R1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAw
OwotICAgIEdMaW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsKLSAgICA6OmdsR2V0
QWN0aXZlVW5pZm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4VW5p
Zm9ybVNpemUsICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFt
ZUxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhu
YW1lLCBuYW1lTGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9
IHNpemU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEF0dGFjaGVkU2hhZGVycyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGludCBtYXhDb3VudCwg
aW50KiBjb3VudCwgdW5zaWduZWQgaW50KiBzaGFkZXJzKQotewotICAgIGlmICghcHJvZ3JhbSkg
ewotICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0
dXJuOwotICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdl
dEF0dGFjaGVkU2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwg
Y291bnQsIHNoYWRlcnMpOwotfQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxv
Y2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQotewot
ICAgIGlmICghcHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIC0xOwogICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChH
THVpbnQpIHByb2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUdyYXBoaWNzQ29udGV4
dDNEOjpBdHRyaWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygp
Ci17Ci0gICAgcmV0dXJuIG1fYXR0cnM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldEVycm9yKCkKLXsKLSAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4g
MCkgewotICAgICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9
IG1fc3ludGhldGljRXJyb3JzLmJlZ2luKCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0g
Kml0ZXI7Ci0gICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKLSAgICAgICAg
cmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xHZXRFcnJvcigpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5n
KG5hbWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25n
IHRhcmdldCwgdW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwotfQotCi1ib29sIEdyYXBoaWNz
Q29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBpZiAo
IWJ1ZmZlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7
Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25nIGNh
cCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJ
c0VuYWJsZWQoY2FwKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZl
cihQbGF0Zm9ybTNET2JqZWN0IGZyYW1lYnVmZmVyKQotewotICAgIGlmICghZnJhbWVidWZmZXIp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVm
ZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKFBsYXRmb3JtM0RP
YmplY3QgcHJvZ3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6
Z2xJc1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0
M0Q6OmlzUmVuZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAg
IGlmICghcmVuZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNSZW5kZXJidWZmZXJF
WFQoKEdMdWludCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
aXNTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgaWYgKCFzaGFkZXIpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgcmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotfQotCi1ib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQot
ewotICAgIGlmICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1
aW50KSB0ZXh0dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRv
dWJsZSB3aWR0aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bExpbmVXaWR0aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAg
IEFTU0VSVChwcm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbExpbmtQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpwaXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUGl4ZWxTdG9yZWkocG5h
bWUsIHBhcmFtKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChk
b3VibGUgZmFjdG9yLCBkb3VibGUgdW5pdHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZsb2F0PihmYWN0b3Ip
LCBzdGF0aWNfY2FzdDxmbG9hdD4odW5pdHMpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWdu
ZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUs
IHZvaWQqIGRhdGEpCi17Ci0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2Fs
bHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAvLyBhbGwgcHJldmlv
dXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4K
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZsdXNoKCk7Ci0gICAg
aWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykg
ewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhU
LCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9E
UkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVy
RVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVp
Z2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsRmx1
c2goKTsKLSAgICB9Ci0gICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9y
bWF0LCB0eXBlLCBkYXRhKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZC
TyA9PSBtX211bHRpc2FtcGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdM
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMg
aXMgbm90IGltcGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZk
ZWZzIGZvciB0aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1
bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgewotICAgIGNhc2UgREVQVEhfU1RFTkNJTDoK
LSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBERVBUSF9DT01QT05FTlQxNjoKLSAgICAgICAgaW50ZXJuYWxm
b3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdC
QTQ6Ci0gICAgY2FzZSBSR0I1X0ExOgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7
Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCNTY1OgotICAgICAgICBpbnRlcm5hbGZvcm1h
dCA9IEdMX1JHQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIDo6Z2xSZW5kZXJidWZmZXJT
dG9yYWdlRVhUKHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wg
aW52ZXJ0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2Ft
cGxlQ292ZXJhZ2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9u
ZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFk
ZXIsIGNvbnN0IFN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIFNoYWRlclNvdXJjZUVudHJ5
IGVudHJ5OwotCi0gICAgZW50cnkuc291cmNlID0gc3RyaW5nOwotCi0gICAgbV9zaGFkZXJTb3Vy
Y2VNYXAuc2V0KHNoYWRlciwgZW50cnkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpz
dGVuY2lsRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1h
c2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2ls
RnVuYyhmdW5jLCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVu
Y2lsRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmdW5jLCBs
b25nIHJlZiwgdW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1h
c2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBs
b25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xT
dGVuY2lsTWFzayhtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1h
c2tTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxNYXNrU2VwYXJh
dGUoZmFjZSwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcCh1
bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBh
c3MpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2ls
T3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbE9wU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVu
c2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWls
LCB6ZmFpbCwgenBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0
ZXJmKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZih0YXJn
ZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyaSh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1l
LCBpbnQgdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwg
ZmxvYXQgdjApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xV
bmlmb3JtMWYobG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTFmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFmdihsb2NhdGlvbiwg
c2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmYobG9u
ZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBh
cnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVu
aWZvcm0yZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQg
djIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3Jt
M2YobG9jYXRpb24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtM2Z2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAg
Ly8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUs
IGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9j
YXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB2
MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYo
bG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTog
bGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBsb2NhdGlvbiwgaW50
IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9y
bTFpKGxvY2F0aW9uLCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0x
aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0
aW9uLCBpbnQgdjAsIGludCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6
ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJpdihsb2Nh
dGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
M2kobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaShsb2NhdGlvbiwgdjAsIHYx
LCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYobG9uZyBsb2Nh
dGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVk
cyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFVuaWZvcm0zaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYx
LCBpbnQgdjIsIGludCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGlu
dCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBv
ZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGl2
KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm1NYXRyaXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJh
eSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRp
cGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZv
cm1NYXRyaXgyZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9jYXRpb24sIGJvb2wg
dHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5n
dGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bv
c2UsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRm
dihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkK
LXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXg0ZnYo
bG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dyYW0oKEdMdWludCkgcHJv
Z3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShQbGF0
Zm9ybTNET2JqZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmFsaWRhdGVQcm9ncmFtKChH
THVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWIxZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9uZyBpbmR4
LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xWZXJ0ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9h
dCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRl
eEF0dHJpYjJmKGluZHgsIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZl
cnRleEF0dHJpYjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4
LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmKGluZHgs
IHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIz
ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCwgYXJyYXkpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1bnNpZ25lZCBsb25n
IGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwg
djAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWI0ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgYXJyYXkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2ln
bmVkIGxvbmcgaW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQsIHVuc2ln
bmVkIGxvbmcgc3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6
ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0
aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp2aWV3cG9ydChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQg
bG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xWaWV3cG9ydChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwg
c3RhdGljX2Nhc3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQp
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9u
ZyBwbmFtZSwgdW5zaWduZWQgY2hhciogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRh
cmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2KHRhcmdldCwg
cG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RmxvYXR2KHVu
c2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBs
b25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpCi0gICAg
ICAgIGF0dGFjaG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVOQ0lMX0FUVEFDSE1F
TlQsIGVpdGhlciB3b3Jrcy4KLSAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1l
dGVyaXZFWFQodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZh
bHVlKQotewotICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFE
X0ZPUk1BVC9UWVBFIGZvciBHTC4gIEFueSB2YWxpZAotICAgIC8vIGNvbWJpbmF0aW9uIHNob3Vs
ZCB3b3JrLCBidXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUgdGhlIG1vc3QKLSAg
ICAvLyB1c2VmdWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCi0gICAgLy8gTmVlZCB0byBlbXVs
YXRlIE1BWF9GUkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBNQVhfVkFSWUlOR19W
RUNUT1JTCi0gICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9uZGluZyBxdWVyaWVz
IHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAgICAvLyB3aGVyZWFzIEdMRVMyIHJl
dHVybiB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0IGNvbXBvbmVudHMp
LgotICAgIC8vIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlc2t0b3AgR0wgbmVl
ZHMgdG8gYmUgZGl2aWRlZCBieSA0LgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFE
X0ZPUk1BVDoKLSAgICAgICAgKnZhbHVlID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICBj
YXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKLSAgICAgICAgKnZhbHVlID0gR0xf
VU5TSUdORURfQllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhfRlJBR01FTlRfVU5J
Rk9STV9WRUNUT1JTOgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VO
SUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKLSAgICAgICAgOjpn
bEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1ZSk7Ci0g
ICAgICAgICp2YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9WQVJZSU5H
X1ZFQ1RPUlM6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFSWUlOR19GTE9BVFMs
IHZhbHVlKTsKLSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1
bHQ6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFt
LCBwbmFtZSwgdmFsdWUpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dy
YW1JbmZvTG9nKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3Jh
bSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IGxl
bmd0aDsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdMX0lORk9fTE9H
X0xFTkdUSCwgJmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXplOwotICAgIEdMY2hhciog
aW5mbyA9IChHTGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgaWYgKCFpbmZvKQotICAg
ICAgICByZXR1cm4gIiI7Ci0KLSAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2coKEdMdWludCkgcHJv
Z3JhbSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFz
dEZyZWUoaW5mbyk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25l
ZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFt
ZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0
Zm9ybTNET2JqZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsK
LSAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgCi0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRy
eT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLSAg
ICAKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgICAgIGNhc2UgREVMRVRFX1NUQVRVUzoKLSAg
ICAgICAgY2FzZSBTSEFERVJfVFlQRToKLSAgICAgICAgICAgIC8vIExldCBPcGVuR0wgaGFuZGxl
IHRoZXNlLgotICAgICAgICAKLSAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBz
aGFkZXIsIHBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNl
IENPTVBJTEVfU1RBVFVTOgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJj
ZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50
PihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgICAgIAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3Vs
dC0+c2Vjb25kLmlzVmFsaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAg
ICAgICAgY2FzZSBJTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1f
c2hhZGVyU291cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOwot
ICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAg
ICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIFNIQURFUl9TT1VS
Q0VfTEVOR1RIOgotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJTb3VyY2Uoc2hhZGVy
KS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfRU5VTSk7Ci0gICAgfQot
fQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9Mb2coUGxhdGZvcm0z
RE9iamVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwotICAgIDo6Z2xHZXRTaGFkZXJp
digoR0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0KLSAgICBI
YXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVz
dWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9
PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKLSAgICAgICAgIHJldHVybiAiIjsKLQotICAgICBT
aGFkZXJTb3VyY2VFbnRyeSBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0gICAgIGlmIChlbnRy
eS5pc1ZhbGlkKSB7Ci0gICAgICAgICBHTGludCBsZW5ndGg7Ci0gICAgICAgICA6OmdsR2V0U2hh
ZGVyaXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwotCi0g
ICAgICAgICBHTHNpemVpIHNpemU7Ci0gICAgICAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikg
ZmFzdE1hbGxvYyhsZW5ndGgpOwotICAgICAgICAgaWYgKCFpbmZvKQotICAgICAgICAgICAgIHJl
dHVybiAiIjsKLQotICAgICAgICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdMdWludCkgc2hhZGVy
LCBsZW5ndGgsICZzaXplLCBpbmZvKTsKLQotICAgICAgICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAg
ICAgICBmYXN0RnJlZShpbmZvKTsKLSAgICAgICAgIHJldHVybiBzOwotICAgICB9Ci0gICAgIGVs
c2UgewotICAgICAgICAgcmV0dXJuIGVudHJ5LmxvZzsKLSAgICAgfQotfQotCi1TdHJpbmcgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikK
LXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLQotICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+Ojpp
dGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBp
ZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gIiI7
Ci0KLSAgICByZXR1cm4gcmVzdWx0LT5zZWNvbmQuc291cmNlOwotfQotCi0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcmZ2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNp
Z25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1
ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4UGFyYW1ldGVyaXYo
dGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRV
bmlmb3JtZnYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBmbG9hdCog
dmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRV
bmlmb3JtZnYoKEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwg
bG9uZyBsb2NhdGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwg
dmFsdWUpOwotfQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24o
UGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNT
RVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICByZXR1cm4gOjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0
ZjgoKS5kYXRhKCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRy
aWJmdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFs
dWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRWZXJ0
ZXhBdHRyaWJmdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9u
ZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi1s
b25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQodW5zaWduZWQgbG9u
ZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgCi0gICAgdm9pZCogcG9pbnRlcjsKLSAgICA6OmdsR2V0VmVydGV4QXR0
cmliUG9pbnRlcnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRlcik7Ci0gICAgcmV0dXJuIHJlaW50ZXJw
cmV0X2Nhc3Q8bG9uZz4ocG9pbnRlcik7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4
SW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBpbnRlcm5h
bGZvcm1hdCwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYm9yZGVy
LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQs
IGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5
cGUsIHBpeGVscyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6
dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4
b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNp
Z25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRl
YWwgd2l0aCBQaXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJz
IHRoYXQgZGlmZmVyIGZyb20gdGhlIHN1YmltYWdlIHNpemUKLSAgICA6OmdsVGV4U3ViSW1hZ2Uy
RCh0YXJnZXQsIGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUs
IHBpeGVscyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNE
OjpjcmVhdGVCdWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICBHTHVpbnQgbzsKLSAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwotICAgIHJldHVybiBvOwotfQot
Ci11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIoKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlbkZy
YW1lYnVmZmVyc0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBo
aWNzQ29udGV4dDNEOjpjcmVhdGVQcm9ncmFtKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwotfQotCi11bnNpZ25lZCBH
cmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5SZW5kZXJidWZmZXJz
RVhUKDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFH
TUVOVF9TSEFERVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7Ci19
Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5UZXh0
dXJlcygxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZUJ1ZmZlcih1bnNpZ25lZCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQgZnJhbWVidWZmZXIp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlRnJhbWVi
dWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQgcmVuZGVyYnVmZmVy
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVJlbmRl
cmJ1ZmZlcnNFWFQoMSwgJnJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmRlbGV0ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4
dHVyZSk7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6c2l6ZUluQnl0ZXMoaW50IHR5cGUp
Ci17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfQllURToKLSAgICAgICAg
ICAgIHJldHVybiBzaXplb2YoR0xieXRlKTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRF
OgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKLSAgICAgICAgY2FzZSBHTF9T
SE9SVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xzaG9ydCk7Ci0gICAgICAgIGNhc2Ug
R0xfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsK
LSAgICAgICAgY2FzZSBHTF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMaW50KTsK
LSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9m
KEdMdWludCk7Ci0gICAgICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6
ZW9mKEdMZmxvYXQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzeW50aGVzaXplR0xFcnJvcih1bnNp
Z25lZCBsb25nIGVycm9yKQotewotICAgIG1fc3ludGhldGljRXJyb3JzLmFkZChlcnJvcik7Ci19
CiAKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66518</attachid>
            <date>2010-09-03 10:48:59 -0700</date>
            <delta_ts>2010-09-03 17:17:24 -0700</delta_ts>
            <desc>Fixed changelog</desc>
            <filename>begin-gcd3d-refactor5</filename>
            <type>text/plain</type>
            <size>103304</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjY3MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTU3IEBACisyMDEwLTA5LTAyICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgb3V0IE1hYyBzcGVjaWZpYyBjb2RlIGZvciBwbGF0Zm9ybS9ncmFwaGljcy9tYWMv
R3JhcGhpY3NDb250ZXh0M0QubW0gZmlsZS4KKyAgICAgICAgTGVmdCBnZW5lcmFsIE9wZW5HTCBj
b2RlIGluIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcC4KKwor
ICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBo
dG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTE9iamVj
dDo6ZGVsZXRlT2JqZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0Nv
bnRleHQzRC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNE
T3BlbkdMLmNwcDogQ29waWVkIGZyb20gcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29u
dGV4dDNETWFjLm1tLgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnByZXBh
cmVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVU
ZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFk
ZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2Nh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kVGV4dHVyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRDb2xvcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEZ1bmMpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Y2xlYXJEZXB0aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xl
YXJTdGVuY2lsKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1h
c2spOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNrKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpkZXRhY2hTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmRpc2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRp
c2FibGVWZXJ0ZXhBdHRyaWJBcnJheSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6ZHJhd0FycmF5cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
ZHJhd0VsZW1lbnRzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFi
bGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0
dHJpYkFycmF5KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2gp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNoKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJUZXh0dXJlMkQp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmZyb250RmFjZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJhdGVNaXBtYXApOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0YWNoZWRTaGFkZXJzKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJMb2NhdGlvbik6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0RXJyb3IpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6aGludCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6aXNCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omlz
RW5hYmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1
ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpsaW5rUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6cGl4ZWxTdG9yZWkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnBvbHlnb25PZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnJlYWRQaXhlbHMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbGVh
c2VTaGFkZXJDb21waWxlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
cmVuZGVyYnVmZmVyU3RvcmFnZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6c2FtcGxlQ292ZXJhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnNjaXNzb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNv
dXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmMp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3ApOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJmKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTNmKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtM2Z2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpdik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtM2kpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnVuaWZvcm0zaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm00aSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDJmdik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmZ2KToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2aWV3cG9ydCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmdldEJ1ZmZlclBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpnZXRGbG9hdHYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6Z2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXYpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTG9nKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcmZ2KToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1Mb2NhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliZnYpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdlMkQpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdlMkQpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Y3JlYXRlU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpjcmVhdGVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpkZWxldGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZUZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpk
ZWxldGVSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZVNoYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVs
ZXRlVGV4dHVyZSk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29u
dGV4dDNETWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBo
aWNzQ29udGV4dDNEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbnN1
cmVDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9y
R2VuZXJhdGVkT25PdXRPZkJvdW5kc0FjY2Vzc2VzKToKKwogMjAxMC0wOS0wMiAgTmF0ZSBDaGFw
aW4gIDxqYXBoZXRAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFy
dGguCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2
aXNpb24gNjY2MjcpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtNTM2OSw2ICs1MzY5LDcgQEAKIAkJRkFCRTcyRkUxMDU5QzIx
MTAwRDk5OUREIC8qIE1hdGhNTE5hbWVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEZBQkU3MkZDMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1l
cy5jcHAgKi87IH07CiAJCUZBQzEyQ0M0MTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxT
dWJTdXAuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RkFDMTJDQzIxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5jcHAgKi87IH07
CiAJCUZBQzEyQ0M1MTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZBQzEyQ0MzMTEyMERB
NjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuaCAqLzsgfTsKKwkJRkI1OENCNzkxMjJG
MTUzODAwODc4ODUxIC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZCNThDQUVBMTIyODU4NjUwMDg3ODg1
MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgKi87IH07CiAJCUZFNkZENDg4MEY2NzZF
NTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRkU2RkQ0ODUwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVz
LmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRkU2
RkQ0OEQwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkU2RkQ0OEIwRjY3NkU5MzAwMDkyODcz
IC8qIEpTQ29vcmRpbmF0ZXMuY3BwICovOyB9OwogCQlGRTZGRDQ4RTBGNjc2RTkzMDAwOTI4NzMg
LyogSlNDb29yZGluYXRlcy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gRkU2RkQ0OEMwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuaCAqLzsg
fTsKQEAgLTExMjQwLDYgKzExMjQxLDcgQEAKIAkJRkFCRTcyRkMxMDU5QzIxMTAwRDk5OUREIC8q
IE1hdGhNTE5hbWVzLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IE1h
dGhNTE5hbWVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkFDMTJDQzIxMTIw
REE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBSZW5kZXJNYXRoTUxTdWJTdXAuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlGQUMxMkNDMzExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1M
U3ViU3VwLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlck1hdGhNTFN1
YlN1cC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlGQjU4Q0FFQTEyMjg1ODY1MDA4
Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQlGRTQ5RUY5NzBEQzUxNDYyMDA0MjY2RTEgLyogRGFzaGJvYXJk
U3VwcG9ydENTU1Byb3BlcnR5TmFtZXMuaW4gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gRGFzaGJv
YXJkU3VwcG9ydENTU1Byb3BlcnR5TmFtZXMuaW47IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUZFNkZENDg1MEY2NzZFNTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5oICovID0ge2lzYSA9
IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBDb29yZGluYXRlcy5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlGRTZGRDQ4NjBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaWRsICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZp
bGVUeXBlID0gdGV4dDsgcGF0aCA9IENvb3JkaW5hdGVzLmlkbDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKQEAgLTE1ODU3LDYgKzE1ODU5LDcgQEAKIAkJQjJBMDE1OTEwQUY2Q0Q1MzAwNkJD
RTBFIC8qIGdyYXBoaWNzICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9
ICgKKwkJCQlGQjU4Q0FFQTEyMjg1ODY1MDA4Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuY3BwICovLAogCQkJCUIyNzUzNTI5MEIwNTM4MTQwMDJDRTY0RiAvKiBjZyAqLywKIAkJCQlC
NTMyMEQ2ODEyMkEyNEU5MDAyRDE0NDAgLyogY29jb2EgKi8sCiAJCQkJQTc1RThCN0YwRTFERTJC
MDAwN0YyNDgxIC8qIGZpbHRlcnMgKi8sCkBAIC0yMjg5NSw2ICsyMjg5OCw3IEBACiAJCQkJODk4
Nzg1QjgxMjJDQTJBNzAwM0FBQkRBIC8qIEpTTWV0YWRhdGFDYWxsYmFjay5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQk4OTg3ODVGMDEyMkUxRTg3MDAzQUFCREEgLyogSlNGaWxlRXhjZXB0aW9uLmNw
cCBpbiBTb3VyY2VzICovLAogCQkJCTg5ODc4NUY0MTIyRTFFQUMwMDNBQUJEQSAvKiBKU0ZpbGVS
ZWFkZXJTeW5jLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUZCNThDQjc5MTIyRjE1MzgwMDg3ODg1
MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgaW4gU291cmNlcyAqLywKIAkJCSk7CiAJ
CQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdl
YkNvcmUvaHRtbC9jYW52YXMvV2ViR0xPYmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xPYmplY3QuY3BwCShyZXZpc2lvbiA2NjYyNykKKysrIFdlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCw3ICs2MCw3
IEBAIHZvaWQgV2ViR0xPYmplY3Q6OmRlbGV0ZU9iamVjdCgpCiB7CiAgICAgaWYgKG1fb2JqZWN0
KSB7CiAgICAgICAgIGlmIChtX2NvbnRleHQpIHsKLSAgICAgICAgICAgIG1fY29udGV4dC0+Z3Jh
cGhpY3NDb250ZXh0M0QoKS0+bWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgICAgICAgICBtX2Nv
bnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCktPmVuc3VyZUNvbnRleHQoKTsKICAgICAgICAgICAg
IGRlbGV0ZU9iamVjdEltcGwobV9vYmplY3QpOwogICAgICAgICB9CiAgICAgICAgIGlmICghbV9h
dHRhY2htZW50Q291bnQpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNz
Q29udGV4dDNELmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFw
aGljc0NvbnRleHQzRC5oCShyZXZpc2lvbiA2NjYyNykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAkod29ya2luZyBjb3B5KQpAQCAtNDUxLDcgKzQ1MSw3
IEBAIHB1YmxpYzoKICAgICBQbGF0Zm9ybUxheWVyKiBwbGF0Zm9ybUxheWVyKCkgY29uc3QgeyBy
ZXR1cm4gMDsgfQogI2VuZGlmCiAjZW5kaWYKLSAgICB2b2lkIG1ha2VDb250ZXh0Q3VycmVudCgp
OworICAgIHZvaWQgZW5zdXJlQ29udGV4dCgpOwogCiAjaWYgUExBVEZPUk0oTUFDKSB8fCBQTEFU
Rk9STShDSFJPTUlVTSkKICAgICAvLyBXaXRoIG11bHRpc2FtcGxpbmcgb24sIGJsaXQgZnJvbSBt
dWx0aXNhbXBsZUZCTyB0byByZWd1bGFyIEZCTy4KSW5kZXg6IHBsYXRmb3JtL2dyYXBoaWNzL0dy
YXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBwbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHJldmlzaW9uIDY2NDIxKQkoZnJvbSBwbGF0
Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW06NjY0MjEpCisrKyBwbGF0
Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHdvcmtpbmcgY29weSkK
SW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250
ZXh0M0RPcGVuR0wuY3BwCShyZXZpc2lvbiA2NjQyMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUg
KzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yOSw5ICsyOSw2IEBA
CiAKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgogCi0jaW1wb3J0ICJCbG9ja0V4Y2Vw
dGlvbnMuaCIKLQotI2luY2x1ZGUgIkFOR0xFL1Jlc291cmNlTGltaXRzLmgiCiAjaW5jbHVkZSAi
QXJyYXlCdWZmZXIuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlclZpZXcuaCIKICNpbmNsdWRlICJX
ZWJHTE9iamVjdC5oIgpAQCAtNDMsMTkzICs0MCwxNyBAQAogI2luY2x1ZGUgIkludDMyQXJyYXku
aCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIK
LSNpbmNsdWRlICJXZWJHTExheWVyLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFw
Q29udGV4dC5oPgorCisjaWYgUExBVEZPUk0oTUFDKQogI2luY2x1ZGUgPE9wZW5HTC9DR0xSZW5k
ZXJlcnMuaD4KICNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8d3Rm
L1VudXNlZFBhcmFtLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKLXN0YXRpYyB2b2lkIHNldFBpeGVsRm9ybWF0KFZlY3RvcjxDR0xQaXhl
bEZvcm1hdEF0dHJpYnV0ZT4mIGF0dHJpYnMsIGludCBjb2xvckJpdHMsIGludCBkZXB0aEJpdHMs
IGJvb2wgYWNjZWxlcmF0ZWQsIGJvb2wgc3VwZXJzYW1wbGUsIGJvb2wgY2xvc2VzdCkKLXsKLSAg
ICBhdHRyaWJzLmNsZWFyKCk7Ci0gICAgCi0gICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUNvbG9y
U2l6ZSk7Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRy
aWJ1dGU+KGNvbG9yQml0cykpOwotICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFEZXB0aFNpemUp
OwotICAgIGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmlidXRl
PihkZXB0aEJpdHMpKTsKLSAgICAKLSAgICBpZiAoYWNjZWxlcmF0ZWQpCi0gICAgICAgIGF0dHJp
YnMuYXBwZW5kKGtDR0xQRkFBY2NlbGVyYXRlZCk7Ci0gICAgZWxzZSB7Ci0gICAgICAgIGF0dHJp
YnMuYXBwZW5kKGtDR0xQRkFSZW5kZXJlcklEKTsKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoc3Rh
dGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGtDR0xSZW5kZXJlckdlbmVyaWNGbG9h
dElEKSk7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoc3VwZXJzYW1wbGUpCi0gICAgICAgIGF0
dHJpYnMuYXBwZW5kKGtDR0xQRkFTdXBlcnNhbXBsZSk7Ci0gICAgICAgIAotICAgIGlmIChjbG9z
ZXN0KQotICAgICAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ2xvc2VzdFBvbGljeSk7Ci0gICAg
ICAgIAotICAgIGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBpeGVsRm9ybWF0QXR0cmli
dXRlPigwKSk7Ci19Ci0KLVBhc3NPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IEdyYXBoaWNzQ29u
dGV4dDNEOjpjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgYXR0cnMsIEhvc3RX
aW5kb3cqIGhvc3RXaW5kb3cpCi17Ci0gICAgT3duUHRyPEdyYXBoaWNzQ29udGV4dDNEPiBjb250
ZXh0KG5ldyBHcmFwaGljc0NvbnRleHQzRChhdHRycywgaG9zdFdpbmRvdykpOwotICAgIHJldHVy
biBjb250ZXh0LT5tX2NvbnRleHRPYmogPyBjb250ZXh0LnJlbGVhc2UoKSA6IDA7Ci19Ci0KLUdy
YXBoaWNzQ29udGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmFwaGljc0NvbnRleHQzRDo6QXR0
cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKLSAgICA6IG1fY3VycmVudFdp
ZHRoKDApCi0gICAgLCBtX2N1cnJlbnRIZWlnaHQoMCkKLSAgICAsIG1fYXR0cnMoYXR0cnMpCi0g
ICAgLCBtX2NvbnRleHRPYmooMCkKLSAgICAsIG1fdGV4dHVyZSgwKQotICAgICwgbV9mYm8oMCkK
LSAgICAsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKDApCi0gICAgLCBtX2JvdW5kRkJPKDApCi0gICAg
LCBtX211bHRpc2FtcGxlRkJPKDApCi0gICAgLCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVm
ZmVyKDApCi0gICAgLCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIoMCkKLXsKLSAgICBVTlVTRURf
UEFSQU0oaG9zdFdpbmRvdyk7Ci0KLSAgICBWZWN0b3I8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+
IGF0dHJpYnM7Ci0gICAgQ0dMUGl4ZWxGb3JtYXRPYmogcGl4ZWxGb3JtYXRPYmogPSAwOwotICAg
IEdMaW50IG51bVBpeGVsRm9ybWF0cyA9IDA7Ci0gICAgCi0gICAgLy8gV2Ugd2lsbCB0cnk6Ci0g
ICAgLy8KLSAgICAvLyAgMSkgMzIgYml0IFJHQkEvMzIgYml0IGRlcHRoL2FjY2VsZXJhdGVkL3N1
cGVyc2FtcGxlZAotICAgIC8vICAyKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0
ZWQKLSAgICAvLyAgMykgMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL2FjY2VsZXJhdGVkCi0gICAg
Ly8gIDQpIGNsb3Nlc3QgdG8gMzIgYml0IFJHQkEvMTYgYml0IGRlcHRoL3NvZnR3YXJlIHJlbmRl
cmVyCi0gICAgLy8KLSAgICAvLyAgSWYgbm9uZSBvZiB0aGF0IHdvcmtzLCB3ZSBzaW1wbHkgZmFp
bCBhbmQgc2V0IG1fY29udGV4dE9iaiB0byAwLgotICAgIAotICAgIHNldFBpeGVsRm9ybWF0KGF0
dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAgIENHTENob29zZVBpeGVsRm9y
bWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwot
ICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICBzZXRQaXhlbEZvcm1hdChh
dHRyaWJzLCAzMiwgMzIsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIENHTENob29zZVBp
eGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1h
dHMpOwotICAgICAgICAKLSAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAg
ICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMTYsIHRydWUsIGZhbHNlLCBmYWxz
ZSk7Ci0gICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBp
eGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAgICBp
ZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsKLSAgICAgICAgICAgICAgICBzZXRQaXhlbEZvcm1h
dChhdHRyaWJzLCAzMiwgMTYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAg
Q0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51
bVBpeGVsRm9ybWF0cyk7Ci0gICAgICAgIAotICAgICAgICAgICAgICAgIGlmIChudW1QaXhlbEZv
cm1hdHMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCBhbiBh
Y2NlcHRhYmxlIHJlbmRlcmVyIC0gZmFpbAotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0g
ICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAot
ICAgIENHTEVycm9yIGVyciA9IENHTENyZWF0ZUNvbnRleHQocGl4ZWxGb3JtYXRPYmosIDAsICZt
X2NvbnRleHRPYmopOwotICAgIENHTERlc3Ryb3lQaXhlbEZvcm1hdChwaXhlbEZvcm1hdE9iaik7
Ci0gICAgCi0gICAgaWYgKGVyciAhPSBrQ0dMTm9FcnJvciB8fCAhbV9jb250ZXh0T2JqKSB7Ci0g
ICAgICAgIC8vIENvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbnRleHQgLSBmYWlsCi0gICAgICAgIG1f
Y29udGV4dE9iaiA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgdGhl
IGN1cnJlbnQgY29udGV4dCB0byB0aGUgb25lIGdpdmVuIHRvIHVzLgotICAgIENHTFNldEN1cnJl
bnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgdmFsaWRhdGVBdHRyaWJ1dGVzKCk7
Ci0KLSAgICAvLyBDcmVhdGUgdGhlIFdlYkdMTGF5ZXIKLSAgICBCRUdJTl9CTE9DS19PQkpDX0VY
Q0VQVElPTlMKLSAgICAgICAgbV93ZWJHTExheWVyLmFkb3B0TlMoW1tXZWJHTExheWVyIGFsbG9j
XSBpbml0V2l0aEdyYXBoaWNzQ29udGV4dDNEOnRoaXNdKTsKLSNpZm5kZWYgTkRFQlVHCi0gICAg
ICAgIFttX3dlYkdMTGF5ZXIuZ2V0KCkgc2V0TmFtZTpAIldlYkdMIExheWVyIl07Ci0jZW5kaWYg
ICAgCi0gICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAgIAotICAgIC8vIGNyZWF0ZSBh
IHRleHR1cmUgdG8gcmVuZGVyIGludG8KLSAgICA6OmdsR2VuVGV4dHVyZXMoMSwgJm1fdGV4dHVy
ZSk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7Ci0gICAg
OjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBH
TF9MSU5FQVIpOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRV
UkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyaShHTF9URVhU
VVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwotICAgIDo6Z2xUZXhQYXJhbWV0
ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUCk7Ci0gICAgOjpn
bEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgIAotICAgIC8vIGNyZWF0ZSBhbiBG
Qk8KLSAgICA6OmdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZtX2Zibyk7Ci0gICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAKLSAgICBtX2Jv
dW5kRkJPID0gbV9mYm87Ci0gICAgaWYgKCFtX2F0dHJzLmFudGlhbGlhcyAmJiAobV9hdHRycy5z
dGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpKQotICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VY
VCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotCi0gICAgLy8gY3JlYXRlIGFuIG11bHRpc2Ft
cGxlIEZCTwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsR2VuRnJh
bWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAg
ICBtX2JvdW5kRkJPID0gbV9tdWx0aXNhbXBsZUZCTzsKLSAgICAgICAgOjpnbEdlblJlbmRlcmJ1
ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgIDo6Z2xHZW5SZW5kZXJi
dWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICB9Ci0g
ICAgCi0gICAgLy8gQU5HTEUgaW5pdGlhbGl6YXRpb24uCi0KLSAgICBUQnVpbHRJblJlc291cmNl
IEFOR0xFUmVzb3VyY2VzOwotCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0cmlicyA9
IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhfQVRUUklC
UywgJkFOR0xFUmVzb3VyY2VzLm1heFZlcnRleEF0dHJpYnMpOwotICAgIEFOR0xFUmVzb3VyY2Vz
Lm1heFZlcnRleFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0Nv
bnRleHQzRDo6TUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhW
ZXJ0ZXhVbmlmb3JtVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3Rv
cnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkFSWUlOR19W
RUNUT1JTLCAmQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMpOwotICAgIEFOR0xFUmVz
b3VyY2VzLm1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihH
cmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVS
ZXNvdXJjZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2Vz
Lm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBo
aWNzQ29udGV4dDNEOjpNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVz
b3VyY2VzLm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVzb3VyY2Vz
Lm1heFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRl
eHQzRDo6TUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5tYXhUZXh0dXJl
SW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3JtVmVjdG9y
cyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9GUkFHTUVOVF9V
TklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1WZWN0b3Jz
KTsKLQotICAgIC8vIEFsd2F5cyBzZXQgdG8gMSBmb3IgT3BlbkdMIEVTLgotICAgIEFOR0xFUmVz
b3VyY2VzLm1heERyYXdCdWZmZXJzID0gMTsKLSAgICAKLSAgICBtX2NvbXBpbGVyLnNldFJlc291
cmNlcyhBTkdMRVJlc291cmNlcyk7Ci0gICAgCi0gICAgOjpnbEVuYWJsZShHTF9WRVJURVhfUFJP
R1JBTV9QT0lOVF9TSVpFKTsKLSAgICA6OmdsQ2xlYXJDb2xvcigwLCAwLCAwLCAwKTsKLX0KLQot
R3JhcGhpY3NDb250ZXh0M0Q6On5HcmFwaGljc0NvbnRleHQzRCgpCi17Ci0gICAgaWYgKG1fY29u
dGV4dE9iaikgewotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgICAgICA6OmdsRGVsZXRlVGV4dHVyZXMoMSwgJm1fdGV4dHVyZSk7Ci0gICAgICAgIGlmICht
X2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNF
WFQoMSwgJm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobV9hdHRy
cy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbERlbGV0ZVJl
bmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAg
ICAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUZCTyk7
Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1f
YXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQo
MSwgJm1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICA6OmdsRGVsZXRl
RnJhbWVidWZmZXJzRVhUKDEsICZtX2Zibyk7Ci0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0
KDApOwotICAgICAgICBDR0xEZXN0cm95Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIH0KLX0K
LQogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKIHsKICAgICBj
b25zdCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpn
bEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CkBAIC0yNTQsMTEgKzc1LDYgQEAgdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dAogICAgIG1fYXR0cnMucHJlbXVsdGlwbGll
ZEFscGhhID0gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bWFrZUNvbnRleHRD
dXJyZW50KCkKLXsKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotfQot
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jlc3VsdHNUb0NhbnZhcyhD
YW52YXNSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0KQogewogICAgIEhUTUxDYW52YXNFbGVtZW50
KiBjYW52YXMgPSBjb250ZXh0LT5jYW52YXMoKTsKQEAgLTMwNywyMSArMTIzLDYgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdSZQogICAgICAgICAgICAgICAgICAgY2Fu
dmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFnZUJ1ZmZlci0+Y29udGV4dCgpLT5w
bGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJD
b21wbGlhbnQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25zdAotewotICAgIHJldHVybiBmYWxz
ZTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFcnJvckdlbmVyYXRlZE9uT3V0T2ZC
b3VuZHNBY2Nlc3NlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICBp
ZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhlaWdodCB8
fCAhbV9jb250ZXh0T2JqKQpAQCAtNDUzLDE5ICsyNTQsOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpyZXNoYXBlKGludCB3aWR0CiAgICAgOjpnbEZsdXNoKCk7CiB9CiAKLXN0YXRpYyBpbmxp
bmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRleHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAo
IWNvbnRleHQpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBj
dXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRD
b250ZXh0ICE9IGNvbnRleHQpCi0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQp
OwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBp
ZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAgIDo6Z2xC
aW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKQEAgLTQ3
Nyw3ICsyNjgsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmFjdGl2ZVRleHR1cmUodW5zaWduZWQgbG9uZyB0ZXh0
dXJlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7CiB9CiAKQEAgLTQ4NSwyNyAr
Mjc2LDI3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmF0dGFjaFNoYWRlcihQbGEKIHsKICAg
ICBBU1NFUlQocHJvZ3JhbSk7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQXR0YWNoU2hh
ZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFtZSkKIHsKICAgICBBU1NFUlQo
cHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGlu
ZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
aW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVmZmVyKTsKIH0KIAogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJn
ZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1aW50IGZibzsKICAgICBpZiAo
YnVmZmVyKQogICAgICAgICBmYm8gPSAoR0x1aW50KWJ1ZmZlcjsKQEAgLTUxOSwxMDYgKzMxMCwx
MDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKAogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQ
bGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVy
RVhUKHRhcmdldCwgKEdMdWludCkgcmVuZGVyYnVmZmVyKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpiaW5kVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9i
amVjdCB0ZXh0dXJlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkgdGV4
dHVyZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91YmxlIHJl
ZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJs
ZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0PihncmVl
biksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFscGhhKSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2lnbmVkIGxv
bmcgbW9kZSApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQmxlbmRFcXVhdGlvbihtb2RlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgbW9kZVJH
QiwgdW5zaWduZWQgbG9uZyBtb2RlQWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFy
YXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7CiB9CiAKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YmxlbmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKIH0gICAgICAgCiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdC
LCB1bnNpZ25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQg
bG9uZyBkc3RBbHBoYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
ZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJH
Qiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVm
ZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgdXNh
Z2UpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwg
aW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6
OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBv
ZmZzZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJ1ZmZlclN1YkRh
dGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwogfQogCiB1bnNpZ25lZCBsb25nIEdyYXBo
aWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgcmV0dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBn
LCBkb3VibGUgYiwgZG91YmxlIGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXJDb2xvcihzdGF0aWNfY2FzdDxm
bG9hdD4ociksIHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpLCBz
dGF0aWNfY2FzdDxmbG9hdD4oYSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVh
cih1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXIobWFzayk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgoZG91YmxlIGRlcHRoKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbENs
ZWFyRGVwdGgoZGVwdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhclN0ZW5j
aWwobG9uZyBzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgOjpnbENsZWFyU3RlbmNpbChzKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBib29sIGJsdWUsIGJv
b2wgYWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNoYWRlcihQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlcikKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAgICAgaW50IEdMc2hhZGVyVHlw
ZTsKICAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKQEAgLTY2OSw3ICs0NjAsNyBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsCiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVs
LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQg
bG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgaWYg
KG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewog
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFX
X0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwpAQCAtNjgzLDcgKzQ3NCw3IEBAIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHUKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Y29weVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcg
eG9mZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0
aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYg
bV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwogICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zi
byk7CkBAIC02OTcsMjUgKzQ4OCwyNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4
U3ViSW1hZ2UyCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxv
bmcgbW9kZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEZXB0aEZ1
bmMoZnVuYyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZs
YWcpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGVw
dGhSYW5nZSh6TmVhciwgekZhcik7CiB9CiAKQEAgLTcyMyw2MSArNTE0LDYxIEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRldGFjaFNoYWRlcihQbGEKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7
CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dy
YW0sIChHTHVpbnQpIHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2Fi
bGUodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGlzYWJsZShjYXApOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9u
ZyBpbmRleCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwg
bG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0
LCBjb3VudCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNp
Z25lZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwg
bG9uZyBvZmZzZXQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICA6OmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCBy
ZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGUodW5zaWduZWQgbG9uZyBjYXApCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsRW5hYmxlKGNhcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJs
ZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRW5hYmxl
VmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpm
aW5pc2goKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAgICAgOjpnbEZpbmlzaCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpmbHVzaCgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsRmx1c2goKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVk
IGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBsYXRm
b3JtM0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVpbnQp
IGJ1ZmZlcjsKICAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQp
IHsKICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhf
QVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwpAQCAtNzg4LDE5
ICs1NzksMTkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25n
IHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdl
dCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBsb25nIGxldmVsKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEZyYW1l
YnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCAoR0x1aW50
KSB0ZXh0dXJlLCBsZXZlbCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyb250RmFj
ZSh1bnNpZ25lZCBsb25nIG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRnJvbnRGYWNlKG1vZGUpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5lcmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdl
dCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOwogfQogCkBAIC04MTAsNyAr
NjAxLDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlQXR0cmliKAogICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIGZhbHNl
OwogICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIEdMaW50IG1heEF0dHJpYnV0ZVNpemUgPSAwOwogICAgIDo6Z2xHZXRQcm9n
cmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xfQUNUSVZFX0FUVFJJQlVURV9N
QVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4QXR0cmli
dXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxs
IHRlcm1pbmF0aW9uCkBAIC04MzIsNyArNjIzLDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0QWN0aXZlVW5pZm9ybQogICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVF
KTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMaW50IG1heFVuaWZvcm1TaXpl
ID0gMDsKICAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSks
IEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7CiAgICAgR0xj
aGFyIG5hbWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RI
IGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KQEAgLTg1NCw3ICs2NDUsNyBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRBdHRhY2hlZFNoYWRlCiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9y
KElOVkFMSURfVkFMVUUpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldEF0dGFj
aGVkU2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQs
IHNoYWRlcnMpOwogfQogCkBAIC04NjIsOCArNjUzLDggQEAgaW50IEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRBdHRyaWJMb2NhdGlvbgogewogICAgIGlmICghcHJvZ3JhbSkKICAgICAgICAgcmV0dXJu
IC0xOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHBy
b2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7CiB9CiAKQEAgLTg4MSwxOSArNjcyLDE5IEBAIHVu
c2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm8KICAgICAgICAgcmV0dXJuIGVy
cjsKICAgICB9CiAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKIH0KIAogU3RyaW5nIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJu
IFN0cmluZygoY29uc3QgY2hhciopIDo6Z2xHZXRTdHJpbmcobmFtZSkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpoaW50KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25n
IG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwogfQogCkBAIC05MDEsMTQgKzY5
MiwxNCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9yCiB7CiAgICAg
aWYgKCFidWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6
Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIpOwogfQogCiBib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzRW5hYmxl
ZChjYXApOwogfQogCkBAIC05MTYsOCArNzA3LDggQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
aXNGcmFtZWJ1ZmZlcihQbAogewogICAgIGlmICghZnJhbWVidWZmZXIpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQp
IGZyYW1lYnVmZmVyKTsKIH0KIApAQCAtOTI1LDggKzcxNiw4IEBAIGJvb2wgR3JhcGhpY3NDb250
ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm8KIHsKICAgICBpZiAoIXByb2dyYW0pCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1Byb2dyYW0oKEdMdWludCkgcHJv
Z3JhbSk7CiB9CiAKQEAgLTkzNCw4ICs3MjUsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjpp
c1JlbmRlcmJ1ZmZlcihQCiB7CiAgICAgaWYgKCFyZW5kZXJidWZmZXIpCiAgICAgICAgIHJldHVy
biBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBl
bnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1JlbmRlcmJ1ZmZlckVYVCgoR0x1aW50
KSByZW5kZXJidWZmZXIpOwogfQogCkBAIC05NDMsOCArNzM0LDggQEAgYm9vbCBHcmFwaGljc0Nv
bnRleHQzRDo6aXNTaGFkZXIoUGxhdGZvcgogewogICAgIGlmICghc2hhZGVyKQogICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hh
ZGVyKTsKIH0KIApAQCAtOTUyLDMzICs3NDMsMzMgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
aXNUZXh0dXJlKFBsYXRmbwogewogICAgIGlmICghdGV4dHVyZSkKICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0dXJlKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0aCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkK
IHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJv
Z3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVk
IGxvbmcgcG5hbWUsIGxvbmcgcGFyYW0pCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBh
cmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUg
ZmFjdG9yLCBkb3VibGUgdW5pdHMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0aWNfY2Fz
dDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7CiB9CiAKQEAgLTk4
Niw3ICs3NzcsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKGxvbmcgCiB7
CiAgICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJp
dmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKICAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVyaW5nIGNh
bGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xGbHVzaCgp
OwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1w
bGVGQk8pIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CkBAIC0xMDAzLDEzICs3OTQsMTMgQEAgdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKIHsKICAgICAvLyBGSVhNRTogVGhpcyBpcyBub3Qg
aW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8gaGF2ZSBpZmRlZnMgZm9y
IHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxl
cigpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25l
ZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHN3aXRjaCAoaW50ZXJu
YWxmb3JtYXQpIHsKICAgICBjYXNlIERFUFRIX1NURU5DSUw6CiAgICAgICAgIGludGVybmFsZm9y
bWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CkBAIC0xMDMwLDIxICs4MjEsMjEgQEAgdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcgogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbFNhbXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSksIGludmVydCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9uZyB4LCBsb25nIHksIHVuc2ln
bmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFNjaXNzb3Io
eCwgeSwgd2lkdGgsIGhlaWdodCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRl
clNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlciwgY29uc3QgU3RyaW5nJiBzdHJpbmcpCiB7
CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAgICAgU2hhZGVyU291cmNlRW50cnkgZW50
cnk7CiAKQEAgLTEwNTUsMjcwICs4NDYsMjcwIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNo
YWRlclNvdXJjZShQbGEKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmModW5z
aWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBtYXNrKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpn
bFN0ZW5jaWxGdW5jKGZ1bmMsIHJlZiwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25n
IGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbEZ1
bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNp
bE1hc2sobWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
U3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c3RlbmNpbE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwg
dW5zaWduZWQgbG9uZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpw
YXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2VwYXJhdGUodW5z
aWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWws
IHVuc2lnbmVkIGxvbmcgenBhc3MpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwg
ZmFpbCwgemZhaWwsIHpwYXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFy
YW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1ZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2
YWx1ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKHVuc2ln
bmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xUZXhQYXJh
bWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6
ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4
dCgpOwogICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwg
ZmxvYXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBh
cnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9h
dCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0zZihsb2NhdGlvbiwg
djAsIHYxLCB2Mik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZnYobG9u
ZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVu
Z3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm0zZnYobG9jYXRp
b24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRm
KGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbFVuaWZvcm00Zihsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJh
eSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRp
cGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29u
dGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjAp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsVW5pZm9ybTFpKGxvY2F0aW9uLCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQg
djEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGlu
dCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBv
ZiAyCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQg
djEsIGludCB2MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRpb24sIHYwLCB2MSwgdjIpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KGxvbmcgbG9jYXRpb24sIGlu
dCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUg
YSBtdWx0aXBsZSBvZiAzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwg
aW50IHYwLCBpbnQgdjEsIGludCB2MiwgaW50IHYzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm00aShsb2Nh
dGlvbiwgdjAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJ
WE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTRp
dihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJy
YXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0
aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsVW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNw
b3NlLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgz
ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUp
CiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDkKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxvY2F0
aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBG
SVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3Jt
TWF0cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsK
ICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWYWxpZGF0ZVByb2dyYW0oKEdM
dWludCkgcHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjFmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmli
MWYoaW5keCwgdjApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIx
ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0
cmliMWZ2KGluZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4
QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6
OmdsVmVydGV4QXR0cmliMmYoaW5keCwgdjAsIHYxKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAs
IGZsb2F0IHYxLCBmbG9hdCB2MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwg
djEsIHYyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjNm
dihpbmR4LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjRmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxv
YXQgdjMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwgdjAsIHYxLCB2MiwgdjMpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0ZnYodW5zaWduZWQgbG9u
ZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFy
cmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1
bnNpZ25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1
bnNpZ25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVy
dGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHJl
aW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZpZXdwb3J0KGxvbmcgeCwgbG9uZyB5LCB1bnNp
Z25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWaWV3cG9y
dChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwgc3RhdGljX2Nh
c3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQpKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9uZyBwbmFtZSwg
dW5zaWduZWQgY2hhciogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZhbHVl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYodW5z
aWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWduZWQgbG9uZyBwbmFtZSwgZmxv
YXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBs
b25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RF
TkNJTF9BVFRBQ0hNRU5UKQogICAgICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsg
Ly8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3MuCiAgICAgOjpnbEdldEZyYW1l
YnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUs
IHZhbHVlKTsKQEAgLTEzMzMsNyArMTEyNCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEludGVnZXJ2KHVuc2kKICAgICAvLyBiZWNhdXNlIGRlc2t0b3AgR0wncyBjb3JyZXNwb25kaW5n
IHF1ZXJpZXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwogICAgIC8vIHdoZXJlYXMg
R0xFUzIgcmV0dXJuIHRoZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFjaCB2ZWN0b3IgaGFzIDQgY29t
cG9uZW50cykuCiAgICAgLy8gVGhlcmVmb3JlLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVza3Rv
cCBHTCBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBzd2l0Y2ggKHBuYW1lKSB7CiAgICAg
Y2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoKICAgICAgICAgKnZhbHVlID0g
R0xfUkdCOwpAQCAtMTM2MCwxNSArMTE1MSwxNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRJbnRlZ2Vydih1bnNpCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdihQ
bGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbUluZm9Mb2coUGxhdGZv
cm0zRE9iamVjdCBwcm9ncmFtKQogewogICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
R0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xf
SU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKICAgICAKQEAgLTEzODUsMTYgKzExNzYsMTYgQEAg
U3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mbwogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdl
dCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRSZW5kZXJi
dWZmZXJQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCB1bnNp
Z25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewogICAgIEFTU0VSVChzaGFkZXIpOwotICAg
IAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKKworICAgIGVuc3VyZUNv
bnRleHQoKTsKKwogICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50
cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7CiAg
ICAgCiAgICAgc3dpdGNoIChwbmFtZSkgewpAQCAtMTQwNCwyNSArMTE5NSwyNSBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0CiAgICAgICAgIAogICAgICAgICAgICAg
OjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgcG5hbWUsIHZhbHVlKTsKICAgICAgICAg
ICAgIGJyZWFrOwotCisgICAgICAgIAogICAgICAgICBjYXNlIENPTVBJTEVfU1RBVFVTOgogICAg
ICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgewogICAgICAg
ICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7CiAgICAgICAgICAg
ICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAorICAgICAgICAK
ICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5p
c1ZhbGlkKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgCisgICAgICAgIAogICAg
ICAgICBjYXNlIElORk9fTE9HX0xFTkdUSDoKICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbV9z
aGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAoKnZhbHVlKSA9IDA7CiAg
ICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgCisgICAg
ICAgIAogICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVu
Z3RoKCk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAorICAgICAgICAKICAgICAg
ICAgY2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKICAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0
U2hhZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE0
MzYsNyArMTIyNyw3IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVySW5mb0wK
IHsKICAgICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xHZXRT
aGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7CiAK
QEAgLTE0NzEsNyArMTI2Miw3IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVy
U291cmMKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICBIYXNoTWFwPFBsYXRmb3JtM0RP
YmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3Vy
Y2VNYXAuZmluZChzaGFkZXIpOwogCkBAIC0xNDg0LDUyICsxMjc1LDUyIEBAIFN0cmluZyBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0VGV4UGFyYW1ldGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5h
bWUsIGZsb2F0KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBu
YW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRl
cml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVl
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3Qg
cHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFVuaWZv
cm1mdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25n
IGxvY2F0aW9uLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBw
cm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwogfQogCiBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRVbmlmb3JtTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcm
IG5hbWUpCiB7CiAgICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbEdl
dFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNpZ25lZCBs
b25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
R2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2ln
bmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0VmVydGV4QXR0cmliaXYo
aW5kZXgsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZl
cnRleEF0dHJpYk9mZnNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1l
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKKyAgICBlbnN1cmVD
b250ZXh0KCk7CisKICAgICB2b2lkKiBwb2ludGVyOwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJQ
b2ludGVydihpbmRleCwgcG5hbWUsICZwb2ludGVyKTsKICAgICByZXR1cm4gcmVpbnRlcnByZXRf
Y2FzdDxsb25nPihwb2ludGVyKTsKQEAgLTE1MzcsNyArMTMyOCw3IEBAIGxvbmcgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk8KIAogaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhJ
bWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGludGVybmFs
Zm9ybWF0LCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBib3JkZXIs
IHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICA6
OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdo
dCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CiAgICAgcmV0dXJuIDA7CkBAIC0xNTQ1
LDcgKzEzMzYsNyBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdlMkQodW5zaWduCiAK
IGludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVu
c2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0
aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQq
IHBpeGVscykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJl
Q29udGV4dCgpOwogCiAgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggUGl4
ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVycyB0aGF0IGRpZmZl
ciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCiAgICAgOjpnbFRleFN1YkltYWdlMkQodGFyZ2V0LCBs
ZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwpA
QCAtMTU1NCw3ICsxMzQ1LDcgQEAgaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhTdWJJbWFnZTJE
KHVucwogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyKCkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IEdMdWludCBvOwogICAgIGdsR2VuQnVmZmVycygxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0x
NTYyLDcgKzEzNTMsNyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVy
CiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICBHTHVpbnQgbzsKICAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJu
IG87CkBAIC0xNTcwLDEzICsxMzYxLDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpj
cmVhdGVGcmFtZWIKIAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0o
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwogfQogCiB1bnNpZ25lZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMdWludCBvOwogICAgIGds
R2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTg0LDEzICsx
Mzc1LDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVSZW5kZXIKIAogdW5z
aWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJBR01FTlRfU0hBREVSKSA/
IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwogfQogCiB1bnNpZ25lZCBH
cmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgbzsKICAgICBn
bEdlblRleHR1cmVzKDEsICZvKTsKICAgICByZXR1cm4gbzsKQEAgLTE1OTgsMzcgKzEzODksMzcg
QEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cgogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgZ2xEZWxl
dGVCdWZmZXJzKDEsICZidWZmZXIpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxl
dGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFtZWJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlRnJhbWVi
dWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlUHJvZ3JhbShw
cm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVy
KHVuc2lnbmVkIHJlbmRlcmJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgx
LCAmcmVuZGVyYnVmZmVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlU2hh
ZGVyKHVuc2lnbmVkIHNoYWRlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUpOwogfQogCkluZGV4OiBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5t
bQkocmV2aXNpb24gNjY2MjcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsMjIgKzMxLDIyIEBACiAK
ICNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgogCi0jaW5jbHVkZSAiQU5HTEUvUmVzb3VyY2VM
aW1pdHMuaCIKKyNpbmNsdWRlICJBTkdMRS9TaGFkZXJMYW5nLmgiCiAjaW5jbHVkZSAiQXJyYXlC
dWZmZXIuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlclZpZXcuaCIKLSNpbmNsdWRlICJXZWJHTE9i
amVjdC5oIgogI2luY2x1ZGUgIkNhbnZhc1JlbmRlcmluZ0NvbnRleHQuaCIKKyNpbmNsdWRlIDxD
b3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CiAjaW5jbHVkZSAiRmxvYXQzMkFycmF5Lmgi
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1l
bnQuaCIKICNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgogI2luY2x1ZGUgIkludDMyQXJyYXkuaCIK
ICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgotI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKLSNp
bmNsdWRlICJXZWJHTExheWVyLmgiCi0jaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29u
dGV4dC5oPgogI2luY2x1ZGUgPE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KICNpbmNsdWRlIDxPcGVu
R0wvZ2wuaD4KKyNpbmNsdWRlICJVaW50OEFycmF5LmgiCisjaW5jbHVkZSAiV2ViR0xMYXllci5o
IgorI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCiAjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+
CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCkBAIC0xODYsMjMgKzE4NiwyMyBAQCBH
cmFwaGljc0NvbnRleHQzRDo6R3JhcGhpY3NDb250ZXh0M0QoR3JhCiAKICAgICBUQnVpbHRJblJl
c291cmNlIEFOR0xFUmVzb3VyY2VzOwogCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmVydGV4QXR0
cmlicyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhf
QVRUUklCUywgJkFOR0xFUmVzb3VyY2VzLm1heFZlcnRleEF0dHJpYnMpOwotICAgIEFOR0xFUmVz
b3VyY2VzLm1heFZlcnRleFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFw
aGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNl
cy5tYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4VmFyeWlu
Z1ZlY3RvcnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkFS
WUlOR19WRUNUT1JTLCAmQU5HTEVSZXNvdXJjZXMubWF4VmFyeWluZ1ZlY3RvcnMpOwotICAgIEFO
R0xFUmVzb3VyY2VzLm1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRl
Z2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTLCAm
QU5HTEVSZXNvdXJjZXMubWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVz
b3VyY2VzLm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldEludGVnZXJ2
KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfQ09NQklORURfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFO
R0xFUmVzb3VyY2VzLm1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMpOwotICAgIEFOR0xFUmVz
b3VyY2VzLm1heFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGlj
c0NvbnRleHQzRDo6TUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5tYXhU
ZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMubWF4RnJhZ21lbnRVbmlmb3Jt
VmVjdG9ycyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9GUkFH
TUVOVF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5tYXhGcmFnbWVudFVuaWZvcm1W
ZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKKyAgICBn
ZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVS
ZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4
VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpN
QVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZv
cm1WZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7Cisg
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZB
TkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4
VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29u
dGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5N
YXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmlu
ZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0
M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4
Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVy
ZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhf
VEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRz
KTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKKyAg
ICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVD
VE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOwogCiAgICAg
Ly8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCi0gICAgQU5HTEVSZXNvdXJjZXMubWF4
RHJhd0J1ZmZlcnMgPSAxOworICAgIEFOR0xFUmVzb3VyY2VzLk1heERyYXdCdWZmZXJzID0gMTsK
ICAgICAKICAgICBtX2NvbXBpbGVyLnNldFJlc291cmNlcyhBTkdMRVJlc291cmNlcyk7CiAgICAg
CkBAIC0yMzAsODEgKzIzMCwxNCBAQCBHcmFwaGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4
dDNEKCkKICAgICB9CiB9CiAKLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlQXR0cmli
dXRlcygpCi17Ci0gICAgY29uc3QgY2hhciogZXh0ZW5zaW9ucyA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfRVhURU5TSU9OUykpOwotICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwpIHsKLSAgICAgICAgaWYgKHN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9F
WFRfcGFja2VkX2RlcHRoX3N0ZW5jaWwiKSkgewotICAgICAgICAgICAgaWYgKCFtX2F0dHJzLmRl
cHRoKQotICAgICAgICAgICAgICAgIG1fYXR0cnMuZGVwdGggPSB0cnVlOwotICAgICAgICB9IGVs
c2UKLSAgICAgICAgICAgIG1fYXR0cnMuc3RlbmNpbCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAgICAgYm9vbCBpc1ZhbGlkVmVuZG9yID0gdHJ1ZTsK
LSAgICAgICAgLy8gQ3VycmVudGx5IGluIE1hYyB3ZSBvbmx5IHR1cm4gb24gYW50aWFsaWFzIGlm
IHZlbmRvciBpcyBOVklESUEuCi0gICAgICAgIGNvbnN0IGNoYXIqIHZlbmRvciA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDo6Z2xHZXRTdHJpbmcoR0xfVkVORE9SKSk7Ci0gICAgICAg
IGlmICghc3RkOjpzdHJzdHIodmVuZG9yLCAiTlZJRElBIikpCi0gICAgICAgICAgICBpc1ZhbGlk
VmVuZG9yID0gZmFsc2U7Ci0gICAgICAgIGlmICghaXNWYWxpZFZlbmRvciB8fCAhc3RkOjpzdHJz
dHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9mcmFtZWJ1ZmZlcl9tdWx0aXNhbXBsZSIpKQotICAgICAg
ICAgICAgbV9hdHRycy5hbnRpYWxpYXMgPSBmYWxzZTsKLSAgICB9Ci0gICAgLy8gRklYTUU6IGlu
c3RlYWQgb2YgZW5mb3JjaW5nIHByZW11bHRpcGxpZWRBbHBoYSA9IHRydWUsIGltcGxlbWVudCB0
aGUKLSAgICAvLyBjb3JyZWN0IGJlaGF2aW9yIHdoZW4gcHJlbXVsdGlwbGllZEFscGhhID0gZmFs
c2UgaXMgcmVxdWVzdGVkLgotICAgIG1fYXR0cnMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bWFrZUNvbnRleHRDdXJyZW50KCkKLXsKLSAg
ICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jlc3VsdHNUb0NhbnZhcyhDYW52YXNSZW5kZXJpbmdD
b250ZXh0KiBjb250ZXh0KQordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5zdXJlQ29udGV4dCgp
CiB7Ci0gICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwot
ICAgIEltYWdlQnVmZmVyKiBpbWFnZUJ1ZmZlciA9IGNhbnZhcy0+YnVmZmVyKCk7Ci0KLSAgICBp
bnQgcm93Qnl0ZXMgPSBtX2N1cnJlbnRXaWR0aCAqIDQ7Ci0gICAgaW50IHRvdGFsQnl0ZXMgPSBy
b3dCeXRlcyAqIG1fY3VycmVudEhlaWdodDsKLQotICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNo
YXI+IHBpeGVscyhuZXcgdW5zaWduZWQgY2hhclt0b3RhbEJ5dGVzXSk7Ci0gICAgaWYgKCFwaXhl
bHMpCisgICAgaWYgKCFtX2NvbnRleHRPYmopCiAgICAgICAgIHJldHVybjsKIAotICAgIENHTFNl
dEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICBib29sIG11c3RSZXN0b3JlRkJP
ID0gZmFsc2U7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5k
RnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8p
OwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhU
LCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9jdXJyZW50
V2lkdGgsIG1fY3VycmVudEhlaWdodCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhl
aWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgbXVzdFJl
c3RvcmVGQk8gPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9
IG1fZmJvKSB7Ci0gICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgR0xpbnQgcGFja0FsaWdubWVudCA9IDQ7Ci0gICAgYm9vbCBt
dXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSBmYWxzZTsKLSAgICA6OmdsR2V0SW50ZWdlcnYoR0xf
UEFDS19BTElHTk1FTlQsICZwYWNrQWxpZ25tZW50KTsKLSAgICBpZiAocGFja0FsaWdubWVudCA+
IDQpIHsKLSAgICAgICAgOjpnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKLSAg
ICAgICAgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICA6Omds
UmVhZFBpeGVscygwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9CR1JB
LCBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsIHBpeGVscy5nZXQoKSk7Ci0KLSAgICBpZiAo
bXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50KQotICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xfUEFD
S19BTElHTk1FTlQsIHBhY2tBbGlnbm1lbnQpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3Vu
ZEZCTyk7Ci0KLSAgICBwYWludFRvQ2FudmFzKHBpeGVscy5nZXQoKSwgbV9jdXJyZW50V2lkdGgs
IG1fY3VycmVudEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGNhbnZhcy0+d2lkdGgoKSwgY2Fu
dmFzLT5oZWlnaHQoKSwgaW1hZ2VCdWZmZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCkp
OworICAgIENHTENvbnRleHRPYmogY3VycmVudENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4
dCgpOworICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBtX2NvbnRleHRPYmopCisgICAgICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CiB9CiAKIGJvb2wgR3JhcGhpY3NDb250
ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQoKSBjb25zdApAQCAtMzIxLDEzNDMgKzI1NCw3IEBAIGJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRXJyb3JHZW5lcmF0ZWQKIHsKICAgICByZXR1cm4gZmFs
c2U7CiB9Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQg
aGVpZ2h0KQotewotICAgIGlmICh3aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0g
bV9jdXJyZW50SGVpZ2h0IHx8ICFtX2NvbnRleHRPYmopCi0gICAgICAgIHJldHVybjsKLSAgICAK
LSAgICBtX2N1cnJlbnRXaWR0aCA9IHdpZHRoOwotICAgIG1fY3VycmVudEhlaWdodCA9IGhlaWdo
dDsKLSAgICAKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAot
ICAgIEdMdWludCBpbnRlcm5hbENvbG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50ZXJuYWxEZXB0
aFN0ZW5jaWxGb3JtYXQgPSAwOwotICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Ci0gICAgICAgIGlu
dGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0JBODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9S
R0JBOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0I4
OwotICAgICAgICBjb2xvckZvcm1hdCA9IEdMX1JHQjsKLSAgICB9Ci0gICAgaWYgKG1fYXR0cnMu
c3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHRo
ZSBsb2dpYyB3aGVyZSBzdGVuY2lsIGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBub3QuCi0gICAg
ICAgIC8vIFNlZSBHcmFwaGljc0NvbnRleHQzRCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgaWYgKG1f
YXR0cnMuc3RlbmNpbCAmJiBtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgaW50ZXJuYWxEZXB0
aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgZWxzZQot
ICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05F
TlQ7Ci0gICAgfQotCi0gICAgYm9vbCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotCi0gICAgLy8g
cmVzaXplIG11bHRpc2FtcGxlIEZCTwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAg
ICAgICBHTGludCBtYXhTYW1wbGVDb3VudDsKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01B
WF9TQU1QTEVTX0VYVCwgJm1heFNhbXBsZUNvdW50KTsKLSAgICAgICAgR0xpbnQgc2FtcGxlQ291
bnQgPSBzdGQ6Om1pbig4LCBtYXhTYW1wbGVDb3VudCk7Ci0gICAgICAgIGlmIChzYW1wbGVDb3Vu
dCA+IG1heFNhbXBsZUNvdW50KQotICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBtYXhTYW1wbGVD
b3VudDsKLSAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAg
ICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVGQk8pOwotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAgICAg
ICB9Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9y
YWdlTXVsdGlzYW1wbGVFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVy
bmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJS
ZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9F
WFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAg
ICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAgICAg
OjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBs
ZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFn
ZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5h
bERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAobV9h
dHRycy5zdGVuY2lsKQotICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZl
ckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JF
TkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAg
ICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVy
UmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9F
WFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIp
OwotICAgICAgICB9Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJV
RkZFUl9FWFQsIDApOwotICAgICAgICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdM
X0ZSQU1FQlVGRkVSX0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7Ci0gICAg
ICAgICAgICAvLyBGSVhNRTogY2xlYW51cC4KLSAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7
Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyByZXNpemUgcmVndWxhciBGQk8KLSAgICBpZiAo
bV9ib3VuZEZCTyAhPSBtX2ZibykgewotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0g
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
Ci0gICAgfQotICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmUpOwot
ICAgIDo6Z2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29sb3JGb3JtYXQs
IHdpZHRoLCBoZWlnaHQsIDAsIGNvbG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKLSAg
ICA6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xP
Ul9BVFRBQ0hNRU5UMF9FWFQsIEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7Ci0gICAgOjpn
bEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxp
YXMgJiYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKSkgewotICAgICAgICA6Omds
QmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1
ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JFTkRFUkJVRkZF
Ul9FWFQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAg
ICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRl
cmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQs
IEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgaWYg
KG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVS
QlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsQmluZFJlbmRl
cmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAwKTsKLSAgICB9Ci0gICAgaWYgKGdsQ2hl
Y2tGcmFtZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVG
RkVSX0NPTVBMRVRFX0VYVCkgewotICAgICAgICAvLyBGSVhNRTogY2xlYW51cAotICAgICAgICBu
b3RJbXBsZW1lbnRlZCgpOwotICAgIH0KLQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0
aXNhbXBsZUZCTyk7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8p
Ci0gICAgICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIElu
aXRpYWxpemUgcmVuZGVyYnVmZmVycyB0byAwLgotICAgIEdMYm9vbGVhbiBjb2xvck1hc2tbXSA9
IHtHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNrID0gR0xfVFJV
RSwgc3RlbmNpbE1hc2sgPSBHTF9UUlVFOwotICAgIEdMYm9vbGVhbiBpc1NjaXNzb3JFbmFibGVk
ID0gR0xfRkFMU0U7Ci0gICAgR0xib29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdMX0ZBTFNFOwot
ICAgIEdMYml0ZmllbGQgY2xlYXJNYXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLSAgICA6Omds
R2V0Qm9vbGVhbnYoR0xfQ09MT1JfV1JJVEVNQVNLLCBjb2xvck1hc2spOwotICAgIDo6Z2xDb2xv
ck1hc2soR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKG1fYXR0
cnMuZGVwdGgpIHsKLSAgICAgICAgOjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dSSVRFTUFTSywg
JmRlcHRoTWFzayk7Ci0gICAgICAgIDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNs
ZWFyTWFzayB8PSBHTF9ERVBUSF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5z
dGVuY2lsKSB7Ci0gICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dSSVRFTUFTSywg
JnN0ZW5jaWxNYXNrKTsKLSAgICAgICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUpOwotICAgICAg
ICBjbGVhck1hc2sgfD0gR0xfU1RFTkNJTF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpc1NjaXNz
b3JFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9TQ0lTU09SX1RFU1QpOwotICAgIDo6Z2xEaXNh
YmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaXNEaXRoZXJFbmFibGVkID0gOjpnbElzRW5hYmxl
ZChHTF9ESVRIRVIpOwotICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICA6OmdsQ2xl
YXIoY2xlYXJNYXNrKTsKLQotICAgIDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBdLCBjb2xvck1h
c2tbMV0sIGNvbG9yTWFza1syXSwgY29sb3JNYXNrWzNdKTsKLSAgICBpZiAobV9hdHRycy5kZXB0
aCkKLSAgICAgICAgOjpnbERlcHRoTWFzayhkZXB0aE1hc2spOwotICAgIGlmIChtX2F0dHJzLnN0
ZW5jaWwpCi0gICAgICAgIDo6Z2xTdGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Ci0gICAgaWYgKGlz
U2Npc3NvckVuYWJsZWQpCi0gICAgICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAg
ICBlbHNlCi0gICAgICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaWYgKGlz
RGl0aGVyRW5hYmxlZCkKLSAgICAgICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIGVsc2UK
LSAgICAgICAgOjpnbERpc2FibGUoR0xfRElUSEVSKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZUZC
TykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1f
Ym91bmRGQk8pOwotCi0gICAgOjpnbEZsdXNoKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBl
bnN1cmVDb250ZXh0KENHTENvbnRleHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQp
Ci0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29u
dGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9
IGNvbnRleHQpCi0gICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRp
c2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAs
IG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBt
X2N1cnJlbnRIZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsK
LSAgICB9Ci0gICAgOjpnbEZpbmlzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjph
Y3RpdmVUZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmF0dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dy
YW0sIFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEF0dGFjaFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9i
amVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCi17
Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1l
LnV0ZjgoKS5kYXRhKCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVy
KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAo
R0x1aW50KSBidWZmZXIpOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFt
ZWJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAg
aWYgKGJ1ZmZlcikKLSAgICAgICAgZmJvID0gKEdMdWludClidWZmZXI7Ci0gICAgZWxzZQotICAg
ICAgICBmYm8gPSAobV9hdHRycy5hbnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8p
OwotICAgIGlmIChmYm8gIT0gbV9ib3VuZEZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVm
ZmVyRVhUKHRhcmdldCwgZmJvKTsKLSAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKLSAgICB9Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQs
IChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YmluZFRleHR1cmUodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVy
ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRUZXh0
dXJlKHRhcmdldCwgKEdMdWludCkgdGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJsZW5kQ29sb3IoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91
YmxlIGFscGhhKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QmxlbmRDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdy
ZWVuKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEp
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQg
bG9uZyBtb2RlICkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEJsZW5kRXF1YXRpb24obW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5k
RXF1YXRpb25TZXBhcmF0ZSh1bnNpZ25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9k
ZUFscGhhKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxl
bmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YmxlbmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQg
bG9uZyBkZmFjdG9yKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3IpOwotfSAgICAgICAKLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2ln
bmVkIGxvbmcgZHN0UkdCLCB1bnNpZ25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRz
dEFscGhhKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxl
bmRGdW5jU2VwYXJhdGUoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGludCBzaXplLCB1bnNpZ25lZCBsb25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRh
cmdldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRh
cmdldCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
dWZmZXJTdWJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUs
IGNvbnN0IHZvaWQqIGRhdGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xCdWZmZXJTdWJEYXRhKHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLX0KLQot
dW5zaWduZWQgbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1
bnNpZ25lZCBsb25nIHRhcmdldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgcmV0dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBk
b3VibGUgYiwgZG91YmxlIGEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xDbGVhckNvbG9yKHN0YXRpY19jYXN0PGZsb2F0PihyKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0PihhKSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyKG1hc2spOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyRGVwdGgoZGVw
dGgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJTdGVuY2ls
KHMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJv
b2wgZ3JlZW4sIGJvb2wgYmx1ZSwgYm9vbCBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENvbG9yTWFzayhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGxhdGZvcm0zRE9i
amVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotCi0gICAgaW50IEdMc2hhZGVyVHlwZTsKLSAgICBBTkdMRVNoYWRlclR5
cGUgc2hhZGVyVHlwZTsKLQotICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFERVJfVFlQRSwg
JkdMc2hhZGVyVHlwZSk7Ci0gICAgCi0gICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hB
REVSKQotICAgICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwotICAgIGVsc2Ug
aWYgKEdMc2hhZGVyVHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpCi0gICAgICAgIHNoYWRlclR5cGUg
PSBTSEFERVJfVFlQRV9GUkFHTUVOVDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybjsgLy8gSW52
YWxpZCBzaGFkZXIgdHlwZS4KLQotICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVy
U291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNo
YWRlcik7Ci0KLSAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAg
ICAgICByZXR1cm47Ci0KLSAgICBTaGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNl
Y29uZDsKLQotICAgIFN0cmluZyB0cmFuc2xhdGVkU2hhZGVyU291cmNlOwotICAgIFN0cmluZyBz
aGFkZXJJbmZvTG9nOwotCi0gICAgYm9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNo
YWRlclNvdXJjZShlbnRyeS5zb3VyY2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNs
YXRlZFNoYWRlclNvdXJjZSwgc2hhZGVySW5mb0xvZyk7Ci0KLSAgICBlbnRyeS5sb2cgPSBzaGFk
ZXJJbmZvTG9nOwotICAgIGVudHJ5LmlzVmFsaWQgPSBpc1ZhbGlkOwotCi0gICAgaWYgKCFpc1Zh
bGlkKQotICAgICAgICByZXR1cm47IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1v
dmUgZm9yd2FyZCB3aXRoIGNvbXBpbGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKLQotICAgIGlu
dCB0cmFuc2xhdGVkU2hhZGVyTGVuZ3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgo
KTsKLQotICAgIGNvbnN0IENTdHJpbmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNs
YXRlZFNoYWRlclNvdXJjZS51dGY4KCk7Ci0gICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRl
clB0ciA9IHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nLmRhdGEoKTsKLSAgICAKLSAgICA6OmdsU2hh
ZGVyU291cmNlKChHTHVpbnQpIHNoYWRlciwgMSwgJnRyYW5zbGF0ZWRTaGFkZXJQdHIsICZ0cmFu
c2xhdGVkU2hhZGVyTGVuZ3RoKTsKLSAgICAKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50
KSBzaGFkZXIpOwotICAgIAotICAgIGludCBHTENvbXBpbGVTdWNjZXNzOwotICAgIAotICAgIDo6
Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIENPTVBJTEVfU1RBVFVTLCAmR0xDb21waWxl
U3VjY2Vzcyk7Ci0gICAgCi0gICAgLy8gQVNTRVJUIHRoYXQgQU5HTEUgZ2VuZXJhdGVkIEdMU0wg
d2lsbCBiZSBhY2NlcHRlZCBieSBPcGVuR0wKLSAgICBBU1NFUlQoR0xDb21waWxlU3VjY2VzcyA9
PSBHTF9UUlVFKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleEltYWdlMkQo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxm
b3JtYXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25n
IGhlaWdodCwgbG9uZyBib3JkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1w
bGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFt
ZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwg
eSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0g
ICAgOjpnbENvcHlUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5
LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBt
X2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGxvbmcgbGV2ZWwsIGxvbmcgeG9mZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwg
dW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
LSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWln
aHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xf
TElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2
ZWwsIHhvZmZzZXQsIHlvZmZzZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChtX2F0
dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
RkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9u
ZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ3Vs
bEZhY2UobW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyh1bnNp
Z25lZCBsb25nIGZ1bmMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xEZXB0aEZ1bmMoZnVuYyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRo
TWFzayhib29sIGZsYWcpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xEZXB0aE1hc2soZmxhZyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRo
UmFuZ2UoZG91YmxlIHpOZWFyLCBkb3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkZXRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFt
LCBQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAg
QVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xEZXRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGUoY2FwKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2ln
bmVkIGxvbmcgaW5kZXgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpkcmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9u
ZyBjb3VudCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERy
YXdBcnJheXMobW9kZSwgZmlyc3QsIGNvdW50KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZHJhd0VsZW1lbnRzKHVuc2lnbmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwg
dW5zaWduZWQgbG9uZyB0eXBlLCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVp
bnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlKGNhcCk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2ln
bmVkIGxvbmcgaW5kZXgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xFbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmZpbmlzaCgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xGaW5pc2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWdu
ZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyBy
ZW5kZXJidWZmZXJ0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWlu
dCkgYnVmZmVyOwotICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVO
VCkgewotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBU
SF9BVFRBQ0hNRU5ULCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgICAg
IDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxfQVRUQUNITUVO
VCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotICAgIH0gZWxzZQotICAgICAg
ICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2htZW50LCByZW5k
ZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBs
b25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgdGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0
IHRleHR1cmUsIGxvbmcgbGV2ZWwpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRl
eHRhcmdldCwgKEdMdWludCkgdGV4dHVyZSwgbGV2ZWwpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpmcm9udEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRnJvbnRGYWNlKG1vZGUpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZW5lcmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdlbmVyYXRlTWlwbWFw
RVhUKHRhcmdldCk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJp
YihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUlu
Zm8mIGluZm8pCi17Ci0gICAgaWYgKCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVy
cm9yKElOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTGludCBtYXhBdHRyaWJ1dGVTaXplID0g
MDsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdM
X0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdM
Y2hhciBuYW1lW21heEF0dHJpYnV0ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9M
RU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9
IDA7Ci0gICAgR0xpbnQgc2l6ZSA9IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xH
ZXRBY3RpdmVBdHRyaWIoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heEF0
dHJpYnV0ZVNpemUsICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICgh
bmFtZUxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmlu
ZyhuYW1lLCBuYW1lTGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6
ZSA9IHNpemU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0gICAgCi1ib29sIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRBY3RpdmVVbmlmb3JtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQg
bG9uZyBpbmRleCwgQWN0aXZlSW5mbyYgaW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAg
ICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBm
YWxzZTsKLSAgICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50
IG1heFVuaWZvcm1TaXplID0gMDsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdM
dWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3Jt
U2l6ZSk7Ci0gICAgR0xjaGFyIG5hbWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5J
Rk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5h
bWVMZW5ndGggPSAwOwotICAgIEdMaW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsK
LSAgICA6OmdsR2V0QWN0aXZlVW5pZm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBp
bmRleCwgbWF4VW5pZm9ybVNpemUsICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwot
ICAgIGlmICghbmFtZUxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFt
ZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAg
IGluZm8uc2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGVycyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGlu
dCBtYXhDb3VudCwgaW50KiBjb3VudCwgdW5zaWduZWQgaW50KiBzaGFkZXJzKQotewotICAgIGlm
ICghcHJvZ3JhbSkgewotICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbEdldEF0dGFjaGVkU2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0p
LCBtYXhDb3VudCwgY291bnQsIHNoYWRlcnMpOwotfQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldEF0dHJpYkxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5n
JiBuYW1lKQotewotICAgIGlmICghcHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIC0xOwogICAgIAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEF0dHJp
YkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUdy
YXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0
QXR0cmlidXRlcygpCi17Ci0gICAgcmV0dXJuIG1fYXR0cnM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm9yKCkKLXsKLSAgICBpZiAobV9zeW50aGV0aWNFcnJv
cnMuc2l6ZSgpID4gMCkgewotICAgICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRl
cmF0b3IgaXRlciA9IG1fc3ludGhldGljRXJyb3JzLmJlZ2luKCk7Ci0gICAgICAgIHVuc2lnbmVk
IGxvbmcgZXJyID0gKml0ZXI7Ci0gICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVy
KTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xHZXRFcnJvcigpOwotfQotCi1TdHJpbmcgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6
OmdsR2V0U3RyaW5nKG5hbWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwotfQotCi1i
b29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikK
LXsKLSAgICBpZiAoIWJ1ZmZlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzQnVmZmVyKChHTHVp
bnQpIGJ1ZmZlcik7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNp
Z25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
cmV0dXJuIDo6Z2xJc0VuYWJsZWQoY2FwKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6
aXNGcmFtZWJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGZyYW1lYnVmZmVyKQotewotICAgIGlmICgh
ZnJhbWVidWZmZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVp
bnQpIGZyYW1lYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFt
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xJc1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLWJvb2wgR3Jh
cGhpY3NDb250ZXh0M0Q6OmlzUmVuZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVm
ZmVyKQotewotICAgIGlmICghcmVuZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNS
ZW5kZXJidWZmZXJFWFQoKEdMdWludCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgaWYg
KCFzaGFkZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIp
OwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0zRE9iamVj
dCB0ZXh0dXJlKQotewotICAgIGlmICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElz
VGV4dHVyZSgoR0x1aW50KSB0ZXh0dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
bGluZVdpZHRoKGRvdWJsZSB3aWR0aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbExpbmVXaWR0aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbExpbmtQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpwaXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25n
IHBhcmFtKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUGl4
ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9s
eWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3VibGUgdW5pdHMpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZs
b2F0PihmYWN0b3IpLCBzdGF0aWNfY2FzdDxmbG9hdD4odW5pdHMpKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3
aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25l
ZCBsb25nIHR5cGUsIHZvaWQqIGRhdGEpCi17Ci0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdv
IGdsRmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAv
LyBhbGwgcHJldmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFk
aW5nIHBpeGVscy4KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZs
dXNoKCk7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0
aXNhbXBsZUZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJB
TUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1
ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxp
dEZyYW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdp
ZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAg
ICAgICA6OmdsRmx1c2goKTsKLSAgICB9Ci0gICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgs
IGhlaWdodCwgZm9ybWF0LCB0eXBlLCBkYXRhKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMg
JiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCi17Ci0gICAgLy8g
RklYTUU6IFRoaXMgaXMgbm90IGltcGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVk
IHRvIGhhdmUgaWZkZWZzIGZvciB0aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBs
b25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgc3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgewotICAgIGNhc2UgREVQ
VEhfU1RFTkNJTDoKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4
X0VYVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBERVBUSF9DT01QT05FTlQxNjoKLSAgICAg
ICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgICAgIGJyZWFrOwot
ICAgIGNhc2UgUkdCQTQ6Ci0gICAgY2FzZSBSR0I1X0ExOgotICAgICAgICBpbnRlcm5hbGZvcm1h
dCA9IEdMX1JHQkE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCNTY1OgotICAgICAgICBp
bnRlcm5hbGZvcm1hdCA9IEdMX1JHQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIDo6Z2xS
ZW5kZXJidWZmZXJTdG9yYWdlRVhUKHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWln
aHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUg
dmFsdWUsIGJvb2wgaW52ZXJ0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsU2FtcGxlQ292ZXJhZ2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwg
dW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWln
aHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZvcm0z
RE9iamVjdCBzaGFkZXIsIGNvbnN0IFN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChzaGFk
ZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIFNoYWRl
clNvdXJjZUVudHJ5IGVudHJ5OwotCi0gICAgZW50cnkuc291cmNlID0gc3RyaW5nOwotCi0gICAg
bV9zaGFkZXJTb3VyY2VNYXAuc2V0KHNoYWRlciwgZW50cnkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpzdGVuY2lsRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNp
Z25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xTdGVuY2lsRnVuYyhmdW5jLCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpzdGVuY2lsRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQg
bG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBm
dW5jLCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFz
ayh1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTdGVuY2lsTWFzayhtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6c3RlbmNpbE1hc2tTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcg
bWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5j
aWxNYXNrU2VwYXJhdGUoZmFjZSwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnN0ZW5jaWxPcCh1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2ln
bmVkIGxvbmcgenBhc3MpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6c3RlbmNpbE9wU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBs
b25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0
ZShmYWNlLCBmYWlsLCB6ZmFpbCwgenBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp0ZXhQYXJhbWV0ZXJmKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZh
bHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFy
YW1ldGVyZih0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyaSh1bnNpZ25lZCB0YXJnZXQsIHVu
c2lnbmVkIHBuYW1lLCBpbnQgdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZs
b2F0Pih2YWx1ZSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9u
ZyBsb2NhdGlvbiwgZmxvYXQgdjApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xVbmlmb3JtMWYobG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTFmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXpl
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFm
dihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtMmYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwg
djEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRp
b24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVk
cyB0byBiZSBhIG11bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFVuaWZvcm0yZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9h
dCB2MSwgZmxvYXQgdjIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xVbmlmb3JtM2YobG9jYXRpb24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtM2Z2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNp
emUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZnYobG9j
YXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTRmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYz
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRm
KGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnVuaWZvcm00ZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6
ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBs
b2NhdGlvbiwgaW50IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsVW5pZm9ybTFpKGxvY2F0aW9uLCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0xaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0
aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0y
aShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFy
cmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVs
dGlwbGUgb2YgMgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5p
Zm9ybTJpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtM2kobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaShsb2Nh
dGlvbiwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0z
aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGlu
dCB2MCwgaW50IHYxLCBpbnQgdjIsIGludCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGlu
dCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUg
YSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xVbmlmb3JtNGl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2Us
IGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0
byBiZSBhIG11bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm1NYXRyaXgyZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9j
YXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8v
IEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBz
aXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybU1hdHJpeDRmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5
LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlw
bGUgb2YgMTYKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZv
cm1NYXRyaXg0ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dyYW0o
KEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRl
UHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0p
OwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmFsaWRh
dGVQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp2ZXJ0ZXhBdHRyaWIxZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwg
djApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZs
b2F0IHYwLCBmbG9hdCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFZlcnRleEF0dHJpYjJmKGluZHgsIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJh
eSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0
dHJpYjJmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRl
eEF0dHJpYjNmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2
MikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0
dHJpYjNmKGluZHgsIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIzZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5k
eCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1
bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYz
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0
cmliNGYoaW5keCwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp2ZXJ0ZXhBdHRyaWI0ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYo
aW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQ
b2ludGVyKHVuc2lnbmVkIGxvbmcgaW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1h
bGl6ZWQsIHVuc2lnbmVkIGxvbmcgc3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYlBvaW50
ZXIoaW5keCwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0
PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2aWV3cG9ydChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0
aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xWaWV3cG9ydChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0
PEdMaW50Pih5KSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNp
emVpPihoZWlnaHQpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYo
dW5zaWduZWQgbG9uZyBwbmFtZSwgdW5zaWduZWQgY2hhciogdmFsdWUpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNp
Z25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRl
cml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0RmxvYXR2KHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQ
YXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50
LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFD
SE1FTlQpCi0gICAgICAgIGF0dGFjaG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVO
Q0lMX0FUVEFDSE1FTlQsIGVpdGhlciB3b3Jrcy4KLSAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRh
Y2htZW50UGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBu
YW1lLCBpbnQqIHZhbHVlKQotewotICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElP
Tl9DT0xPUl9SRUFEX0ZPUk1BVC9UWVBFIGZvciBHTC4gIEFueSB2YWxpZAotICAgIC8vIGNvbWJp
bmF0aW9uIHNob3VsZCB3b3JrLCBidXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUg
dGhlIG1vc3QKLSAgICAvLyB1c2VmdWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCi0gICAgLy8g
TmVlZCB0byBlbXVsYXRlIE1BWF9GUkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBN
QVhfVkFSWUlOR19WRUNUT1JTCi0gICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9u
ZGluZyBxdWVyaWVzIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAgICAvLyB3aGVy
ZWFzIEdMRVMyIHJldHVybiB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0
IGNvbXBvbmVudHMpLgotICAgIC8vIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRl
c2t0b3AgR0wgbmVlZHMgdG8gYmUgZGl2aWRlZCBieSA0LgotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElP
Tl9DT0xPUl9SRUFEX0ZPUk1BVDoKLSAgICAgICAgKnZhbHVlID0gR0xfUkdCOwotICAgICAgICBi
cmVhazsKLSAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKLSAgICAgICAg
KnZhbHVlID0gR0xfVU5TSUdORURfQllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhf
RlJBR01FTlRfVU5JRk9STV9WRUNUT1JTOgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFY
X0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0g
NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoK
LSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRT
LCB2YWx1ZSk7Ci0gICAgICAgICp2YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNl
IE1BWF9WQVJZSU5HX1ZFQ1RPUlM6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFS
WUlOR19GTE9BVFMsIHZhbHVlKTsKLSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFr
OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOwot
ICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3Jt
M0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFByb2dyYW1pdigoR0x1
aW50KSBwcm9ncmFtLCBwbmFtZSwgdmFsdWUpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1JbmZvTG9nKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBB
U1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIEdMaW50IGxlbmd0aDsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0s
IEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXplOwot
ICAgIEdMY2hhciogaW5mbyA9IChHTGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgaWYg
KCFpbmZvKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2co
KEdMdWludCkgcHJvZ3JhbSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5m
byk7Ci0gICAgZmFzdEZyZWUoaW5mbyk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQo
dGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRT
aGFkZXJpdihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50
KiB2YWx1ZSkKLXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFk
ZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQo
c2hhZGVyKTsKLSAgICAKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgICAgIGNhc2UgREVMRVRF
X1NUQVRVUzoKLSAgICAgICAgY2FzZSBTSEFERVJfVFlQRToKLSAgICAgICAgICAgIC8vIExldCBP
cGVuR0wgaGFuZGxlIHRoZXNlLgotICAgICAgICAKLSAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJp
digoR0x1aW50KSBzaGFkZXIsIHBuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQot
ICAgICAgICBjYXNlIENPTVBJTEVfU1RBVFVTOgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBt
X3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3Rh
dGljX2Nhc3Q8aW50PihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2Fz
dDxpbnQ+KHJlc3VsdC0+c2Vjb25kLmlzVmFsaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgY2FzZSBJTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICBpZiAo
cmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2
YWx1ZSkgPSAwOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlciku
bGVuZ3RoKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNl
IFNIQURFUl9TT1VSQ0VfTEVOR1RIOgotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJT
b3VyY2Uoc2hhZGVyKS5sZW5ndGgoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfRU5V
TSk7Ci0gICAgfQotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9M
b2coUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwotICAgIDo6
Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0
aCk7Ci0KLSAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6
aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAg
aWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKLSAgICAgICAgIHJldHVybiAi
IjsKLQotICAgICBTaGFkZXJTb3VyY2VFbnRyeSBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0g
ICAgIGlmIChlbnRyeS5pc1ZhbGlkKSB7Ci0gICAgICAgICBHTGludCBsZW5ndGg7Ci0gICAgICAg
ICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZs
ZW5ndGgpOwotCi0gICAgICAgICBHTHNpemVpIHNpemU7Ci0gICAgICAgICBHTGNoYXIqIGluZm8g
PSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOwotICAgICAgICAgaWYgKCFpbmZvKQotICAg
ICAgICAgICAgIHJldHVybiAiIjsKLQotICAgICAgICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdM
dWludCkgc2hhZGVyLCBsZW5ndGgsICZzaXplLCBpbmZvKTsKLQotICAgICAgICAgU3RyaW5nIHMo
aW5mbyk7Ci0gICAgICAgICBmYXN0RnJlZShpbmZvKTsKLSAgICAgICAgIHJldHVybiBzOwotICAg
ICB9Ci0gICAgIGVsc2UgewotICAgICAgICAgcmV0dXJuIGVudHJ5LmxvZzsKLSAgICAgfQotfQot
Ci1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlcikKLXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLQotICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291
cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRl
cik7Ci0KLSAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAg
ICByZXR1cm4gIiI7Ci0KLSAgICByZXR1cm4gcmVzdWx0LT5zZWNvbmQuc291cmNlOwotfQotCi0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcmZ2KHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQs
IHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFt
ZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZh
bHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4
UGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRVbmlmb3JtZnYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0
aW9uLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xHZXRVbmlmb3JtZnYoKEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWl2KFBsYXRmb3JtM0RPYmpl
Y3QgcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFt
LCBsb2NhdGlvbiwgdmFsdWUpOwotfQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlm
b3JtTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUp
Ci17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9n
cmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRWZXJ0ZXhBdHRyaWJmdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xHZXRWZXJ0ZXhBdHRyaWJmdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwg
dW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFs
dWUpOwotfQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQo
dW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSkKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgdm9pZCogcG9pbnRlcjsKLSAgICA6Omds
R2V0VmVydGV4QXR0cmliUG9pbnRlcnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRlcik7Ci0gICAgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4ocG9pbnRlcik7Ci19Ci0KLWludCBHcmFwaGljc0Nv
bnRleHQzRDo6dGV4SW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNp
Z25lZCBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5z
aWduZWQgYm9yZGVyLCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVs
cykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICA6OmdsVGV4SW1h
Z2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVy
LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBHcmFwaGlj
c0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVs
LCB1bnNpZ25lZCB4b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQg
aGVpZ2h0LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICAvLyBGSVhNRTogd2Ugd2ls
bCBuZWVkIHRvIGRlYWwgd2l0aCBQaXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBp
bWFnZSBidWZmZXJzIHRoYXQgZGlmZmVyIGZyb20gdGhlIHN1YmltYWdlIHNpemUKLSAgICA6Omds
VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBm
b3JtYXQsIHR5cGUsIHBpeGVscyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIEdyYXBo
aWNzQ29udGV4dDNEOjpjcmVhdGVCdWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwotICAgIHJl
dHVybiBvOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZm
ZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsK
LSAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVu
c2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVQcm9ncmFtKCkKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwotfQot
Ci11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5S
ZW5kZXJidWZmZXJzRVhUKDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigo
dHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVY
X1NIQURFUik7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJl
KCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0g
ICAgZ2xHZW5UZXh0dXJlcygxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRlbGV0ZUJ1ZmZlcih1bnNpZ25lZCBidWZmZXIpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQg
ZnJhbWVidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGds
RGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQg
cmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBn
bERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJnJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVy
ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVUZXh0
dXJlcygxLCAmdGV4dHVyZSk7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6c2l6ZUluQnl0
ZXMoaW50IHR5cGUpCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfQllU
RToKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xieXRlKTsKLSAgICAgICAgY2FzZSBHTF9V
TlNJR05FRF9CWVRFOgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKLSAgICAg
ICAgY2FzZSBHTF9TSE9SVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xzaG9ydCk7Ci0g
ICAgICAgIGNhc2UgR0xfVU5TSUdORURfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9m
KEdMdXNob3J0KTsKLSAgICAgICAgY2FzZSBHTF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6
ZW9mKEdMaW50KTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICBy
ZXR1cm4gc2l6ZW9mKEdMdWludCk7Ci0gICAgICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgICAg
ICByZXR1cm4gc2l6ZW9mKEdMZmxvYXQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzeW50aGVzaXpl
R0xFcnJvcih1bnNpZ25lZCBsb25nIGVycm9yKQotewotICAgIG1fc3ludGhldGljRXJyb3JzLmFk
ZChlcnJvcik7Ci19CiAKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66568</attachid>
            <date>2010-09-03 17:17:00 -0700</date>
            <delta_ts>2010-09-04 06:17:43 -0700</delta_ts>
            <desc>Fixed paths in patch, hopefully this one will apply</desc>
            <filename>begin-gcd3d-refactor7</filename>
            <type>text/plain</type>
            <size>155703</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Njc3OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYxIEBACisyMDEwLTA5LTAzICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgb3V0IE1hYyBzcGVjaWZpYyBjb2RlIGZvciBwbGF0Zm9ybS9ncmFwaGljcy9tYWMv
R3JhcGhpY3NDb250ZXh0M0QubW0gZmlsZS4KKyAgICAgICAgTGVmdCBnZW5lcmFsIE9wZW5HTCBj
b2RlIGluIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcC4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTMwNjI1CisKKyAg
ICAgICAgTm8gbmV3IHRlc3RzLiAoT09QUyEpCisKKyAgICAgICAgKiBXZWJDb3JlLmd5cGk6Cisg
ICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIGh0
bWwvY2FudmFzL1dlYkdMT2JqZWN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMT2JqZWN0
OjpkZWxldGVPYmplY3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0FOR0xFV2ViS2l0
QnJpZGdlLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0Qu
aDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5j
cHA6IENvcGllZCBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1h
Yy5tbS4KKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVy
ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRCdWZmZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpibGVuZEZ1bmNTZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6YnVmZmVyU3ViRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Y2xlYXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Y2xlYXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFy
RGVwdGgpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNp
bCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6ZGVwdGhSYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6ZGV0YWNoU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpk
aXNhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVy
dGV4QXR0cmliQXJyYXkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRy
YXdBcnJheXMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVt
ZW50cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJh
eSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZmluaXNoKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFwKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZVVuaWZvcm0pOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGVycyk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmhpbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omlz
QnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNSZW5kZXJidWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjppc1RleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmxpbmVXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6bGlua1Byb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnBpeGVsU3RvcmVpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwb2x5
Z29uT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4
ZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVy
Q29tcGlsZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1
ZmZlclN0b3JhZ2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBs
ZUNvdmVyYWdlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29y
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1NlcGFyYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyaSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtMWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtMmYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OnVuaWZvcm0yZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm0zZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0yaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6dW5pZm9ybTJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTNpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
M2l2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgyZnYpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0ZnYpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVzZVByb2dyYW0pOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmdik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2YpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dmlld3BvcnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmdldEJvb2xlYW52KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRCdWZmZXJQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0RmxvYXR2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6Z2V0SW50ZWdlcnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0UHJvZ3JhbUluZm9Mb2cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0U2hhZGVySW5mb0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1mdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0VW5pZm9ybWl2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjp0ZXhTdWJJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpjcmVhdGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZUZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpjcmVhdGVSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZVNoYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Y3JlYXRlVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVs
ZXRlQnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVG
cmFtZWJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRl
UHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVu
ZGVyYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVT
aGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1
cmUpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1h
Yy5tbToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbnN1cmVDb250ZXh0
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVk
T25PdXRPZkJvdW5kc0FjY2Vzc2VzKToKKwogMjAxMC0wOS0wMiAgVmFuZ2VsaXMgS29ra2V2aXMg
IDx2YW5nZWxpc0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gRmlz
aGVyLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9X
ZWJDb3JlLmd5cGkJKHJldmlzaW9uIDY2Nzc3KQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdv
cmtpbmcgY29weSkKQEAgLTI1OTcsNiArMjU5Nyw3IEBACiAgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3Jh
cGhpY3MvR3JhcGhpY3NDb250ZXh0LmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzQ29udGV4dDNELmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFw
aGljcy9HcmFwaGljc0NvbnRleHQzRC5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHRQcml2YXRlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL0dyYXBoaWNzTGF5ZXIuY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiA2Njc3NykKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC01MzY5LDYgKzUzNjksNyBA
QAogCQlGQUJFNzJGRTEwNTlDMjExMDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwIGluIFNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkFCRTcyRkMxMDU5QzIxMTAw
RDk5OUREIC8qIE1hdGhNTE5hbWVzLmNwcCAqLzsgfTsKIAkJRkFDMTJDQzQxMTIwREE2OTAwREFD
QzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGQUMxMkNDMjExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0
aE1MU3ViU3VwLmNwcCAqLzsgfTsKIAkJRkFDMTJDQzUxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRl
ck1hdGhNTFN1YlN1cC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRkFDMTJDQzMxMTIwREE2OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oICov
OyB9OworCQlGQjU4Q0I3OTEyMkYxNTM4MDA4Nzg4NTEgLyogR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRkI1
OENBRUExMjI4NTg2NTAwODc4ODUxIC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCAqLzsg
fTsKIAkJRkU2RkQ0ODgwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5hdGVzLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4NTBGNjc2RTU3MDAw
OTI4NzMgLyogQ29vcmRpbmF0ZXMuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQlGRTZGRDQ4RDBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRl
cy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZG
RDQ4QjBGNjc2RTkzMDAwOTI4NzMgLyogSlNDb29yZGluYXRlcy5jcHAgKi87IH07CiAJCUZFNkZE
NDhFMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmggaW4gSGVhZGVycyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGRTZGRDQ4QzBGNjc2RTkzMDAwOTI4NzMgLyog
SlNDb29yZGluYXRlcy5oICovOyB9OwpAQCAtMTEyNDAsNiArMTEyNDEsNyBAQAogCQlGQUJFNzJG
QzEwNTlDMjExMDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29k
ZS5jcHAuY3BwOyBwYXRoID0gTWF0aE1MTmFtZXMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlGQUMxMkNDMjExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlck1hdGhNTFN1YlN1
cC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZBQzEyQ0MzMTEyMERBNjkwMERB
Q0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gUmVuZGVyTWF0aE1MU3ViU3VwLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CUZCNThDQUVBMTIyODU4NjUwMDg3ODg1MSAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAg
Ki8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3du
RmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBHcmFwaGljc0NvbnRleHQzRE9w
ZW5HTC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFNDlFRjk3MERDNTE0NjIw
MDQyNjZFMSAvKiBEYXNoYm9hcmRTdXBwb3J0Q1NTUHJvcGVydHlOYW1lcy5pbiAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHRleHQ7IHBhdGggPSBEYXNoYm9hcmRTdXBwb3J0Q1NTUHJvcGVydHlOYW1lcy5pbjsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU2RkQ0ODUwRjY3NkU1NzAwMDkyODczIC8qIENvb3Jk
aW5hdGVzLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENvb3JkaW5hdGVzLmg7
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZFNkZENDg2MEY2NzZFNTcwMDA5Mjg3MyAv
KiBDb29yZGluYXRlcy5pZGwgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gQ29vcmRpbmF0ZXMuaWRs
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTU4NTcsNiArMTU4NTksNyBAQAogCQlC
MkEwMTU5MTBBRjZDRDUzMDA2QkNFMEUgLyogZ3JhcGhpY3MgKi8gPSB7CiAJCQlpc2EgPSBQQlhH
cm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUZCNThDQUVBMTIyODU4NjUwMDg3ODg1MSAvKiBH
cmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgKi8sCiAJCQkJQjI3NTM1MjkwQjA1MzgxNDAwMkNF
NjRGIC8qIGNnICovLAogCQkJCUI1MzIwRDY4MTIyQTI0RTkwMDJEMTQ0MCAvKiBjb2NvYSAqLywK
IAkJCQlBNzVFOEI3RjBFMURFMkIwMDA3RjI0ODEgLyogZmlsdGVycyAqLywKQEAgLTIyODk1LDYg
KzIyODk4LDcgQEAKIAkJCQk4OTg3ODVCODEyMkNBMkE3MDAzQUFCREEgLyogSlNNZXRhZGF0YUNh
bGxiYWNrLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg5ODc4NUYwMTIyRTFFODcwMDNBQUJEQSAv
KiBKU0ZpbGVFeGNlcHRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODk4Nzg1RjQxMjJFMUVB
QzAwM0FBQkRBIC8qIEpTRmlsZVJlYWRlclN5bmMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkI1
OENCNzkxMjJGMTUzODAwODc4ODUxIC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBT
b3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Npbmcg
PSAwOwogCQl9OwpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHAJKHJldmlzaW9u
IDY2Nzc3KQorKysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTYwLDcgKzYwLDcgQEAgdm9pZCBXZWJHTE9iamVjdDo6ZGVsZXRlT2JqZWN0KCkK
IHsKICAgICBpZiAobV9vYmplY3QpIHsKICAgICAgICAgaWYgKG1fY29udGV4dCkgewotICAgICAg
ICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0NvbnRleHQzRCgpLT5tYWtlQ29udGV4dEN1cnJlbnQo
KTsKKyAgICAgICAgICAgIG1fY29udGV4dC0+Z3JhcGhpY3NDb250ZXh0M0QoKS0+ZW5zdXJlQ29u
dGV4dCgpOwogICAgICAgICAgICAgZGVsZXRlT2JqZWN0SW1wbChtX29iamVjdCk7CiAgICAgICAg
IH0KICAgICAgICAgaWYgKCFtX2F0dGFjaG1lbnRDb3VudCkKSW5kZXg6IFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvQU5HTEVXZWJLaXRCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0FOR0xFV2ViS2l0QnJpZGdlLmgJKHJldmlzaW9uIDY2Nzc3KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktpdEJyaWRnZS5oCSh3b3JraW5nIGNv
cHkpCkBAIC0zOCw2ICszOCw3IEBAIGVudW0gQU5HTEVTaGFkZXJUeXBlIHsKICAgICBTSEFERVJf
VFlQRV9GUkFHTUVOVCA9IEVTaExhbmdGcmFnbWVudAogfTsKIAorCiBjbGFzcyBBTkdMRVdlYktp
dEJyaWRnZSB7CiBwdWJsaWM6CiAKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3Jh
cGhpY3NDb250ZXh0M0QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L0dyYXBoaWNzQ29udGV4dDNELmgJKHJldmlzaW9uIDY2Nzc3KQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NTEsNyAr
NDUxLDcgQEAgcHVibGljOgogICAgIFBsYXRmb3JtTGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25z
dCB7IHJldHVybiAwOyB9CiAjZW5kaWYKICNlbmRpZgotICAgIHZvaWQgbWFrZUNvbnRleHRDdXJy
ZW50KCk7CisgICAgdm9pZCBlbnN1cmVDb250ZXh0KCk7CiAKICNpZiBQTEFURk9STShNQUMpIHx8
IFBMQVRGT1JNKENIUk9NSVVNKQogICAgIC8vIFdpdGggbXVsdGlzYW1wbGluZyBvbiwgYmxpdCBm
cm9tIG11bHRpc2FtcGxlRkJPIHRvIHJlZ3VsYXIgRkJPLgpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHJldmlz
aW9uIDY2Nzc3KQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0Nv
bnRleHQzRE1hYy5tbTo2Njc3NykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhp
Y3NDb250ZXh0M0RPcGVuR0wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTY2MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRSgzRF9DQU5WQVMpCisK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgorCisjaW1wb3J0ICJCbG9ja0V4Y2VwdGlv
bnMuaCIKKworI2luY2x1ZGUgIkFycmF5QnVmZmVyLmgiCisjaW5jbHVkZSAiQXJyYXlCdWZmZXJW
aWV3LmgiCisjaW5jbHVkZSAiV2ViR0xPYmplY3QuaCIKKyNpbmNsdWRlICJDYW52YXNSZW5kZXJp
bmdDb250ZXh0LmgiCisjaW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKKyNpbmNsdWRlICJJ
bWFnZUJ1ZmZlci5oIgorI2luY2x1ZGUgIkludDMyQXJyYXkuaCIKKyNpbmNsdWRlICJOb3RJbXBs
ZW1lbnRlZC5oIgorI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVy
LmgiCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2luY2x1ZGUg
PE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRl
IDx3dGYvVW51c2VkUGFyYW0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIHZvaWQgc2V0UGl4ZWxGb3JtYXQoVmVjdG9yPENH
TFBpeGVsRm9ybWF0QXR0cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9yQml0cywgaW50IGRlcHRo
Qml0cywgYm9vbCBhY2NlbGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwgYm9vbCBjbG9zZXN0KQor
eworICAgIGF0dHJpYnMuY2xlYXIoKTsKKyAgICAKKyAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZB
Q29sb3JTaXplKTsKKyAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1h
dEF0dHJpYnV0ZT4oY29sb3JCaXRzKSk7CisgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQURlcHRo
U2l6ZSk7CisgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRy
aWJ1dGU+KGRlcHRoQml0cykpOworICAgIAorICAgIGlmIChhY2NlbGVyYXRlZCkKKyAgICAgICAg
YXR0cmlicy5hcHBlbmQoa0NHTFBGQUFjY2VsZXJhdGVkKTsKKyAgICBlbHNlIHsKKyAgICAgICAg
YXR0cmlicy5hcHBlbmQoa0NHTFBGQVJlbmRlcmVySUQpOworICAgICAgICBhdHRyaWJzLmFwcGVu
ZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NHTFJlbmRlcmVyR2VuZXJp
Y0Zsb2F0SUQpKTsKKyAgICB9CisgICAgICAgIAorICAgIGlmIChzdXBlcnNhbXBsZSkKKyAgICAg
ICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKKyAgICAgICAgCisgICAgaWYg
KGNsb3Nlc3QpCisgICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFDbG9zZXN0UG9saWN5KTsK
KyAgICAgICAgCisgICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRB
dHRyaWJ1dGU+KDApKTsKK30KKworUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRD4gR3JhcGhp
Y3NDb250ZXh0M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRycywg
SG9zdFdpbmRvdyogaG9zdFdpbmRvdykKK3sKKyAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+
IGNvbnRleHQobmV3IEdyYXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0V2luZG93KSk7CisgICAg
cmV0dXJuIGNvbnRleHQtPm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVsZWFzZSgpIDogMDsKK30K
KworR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29udGV4dDNE
OjpBdHRyaWJ1dGVzIGF0dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93KQorICAgIDogbV9jdXJy
ZW50V2lkdGgoMCkKKyAgICAsIG1fY3VycmVudEhlaWdodCgwKQorICAgICwgbV9hdHRycyhhdHRy
cykKKyAgICAsIG1fY29udGV4dE9iaigwKQorICAgICwgbV90ZXh0dXJlKDApCisgICAgLCBtX2Zi
bygwKQorICAgICwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAgICAsIG1fYm91bmRGQk8oMCkK
KyAgICAsIG1fbXVsdGlzYW1wbGVGQk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIoMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcigwKQoreworICAgIFVO
VVNFRF9QQVJBTShob3N0V2luZG93KTsKKworICAgIFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJp
YnV0ZT4gYXR0cmliczsKKyAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhlbEZvcm1hdE9iaiA9IDA7
CisgICAgR0xpbnQgbnVtUGl4ZWxGb3JtYXRzID0gMDsKKyAgICAKKyAgICAvLyBXZSB3aWxsIHRy
eToKKyAgICAvLworICAgIC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0
ZWQvc3VwZXJzYW1wbGVkCisgICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMyIGJpdCBkZXB0aC9hY2Nl
bGVyYXRlZAorICAgIC8vICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQK
KyAgICAvLyAgNCkgY2xvc2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvc29mdHdhcmUg
cmVuZGVyZXIKKyAgICAvLworICAgIC8vICBJZiBub25lIG9mIHRoYXQgd29ya3MsIHdlIHNpbXBs
eSBmYWlsIGFuZCBzZXQgbV9jb250ZXh0T2JqIHRvIDAuCisgICAgCisgICAgc2V0UGl4ZWxGb3Jt
YXQoYXR0cmlicywgMzIsIDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgICAgQ0dMQ2hvb3NlUGl4
ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0
cyk7CisgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgIHNldFBpeGVsRm9y
bWF0KGF0dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgQ0dMQ2hv
b3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVs
Rm9ybWF0cyk7CisgICAgICAgIAorICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsK
KyAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgdHJ1ZSwgZmFsc2Us
IGZhbHNlKTsKKyAgICAgICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgp
LCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOworICAgICAgICAKKyAgICAgICAg
ICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldFBpeGVs
Rm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAg
ICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2Jq
LCAmbnVtUGl4ZWxGb3JtYXRzKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG51bVBp
eGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5k
IGFuIGFjY2VwdGFibGUgcmVuZGVyZXIgLSBmYWlsCisgICAgICAgICAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgQ0dMRXJyb3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1hdE9iaiwg
MCwgJm1fY29udGV4dE9iaik7CisgICAgQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0
T2JqKTsKKyAgICAKKyAgICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8ICFtX2NvbnRleHRPYmop
IHsKKyAgICAgICAgLy8gQ291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4dCAtIGZhaWwKKyAgICAg
ICAgbV9jb250ZXh0T2JqID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNl
dCB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8gdXMuCisgICAgQ0dMU2V0
Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICB2YWxpZGF0ZUF0dHJpYnV0
ZXMoKTsKKworICAgIC8vIENyZWF0ZSB0aGUgV2ViR0xMYXllcgorICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUworICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIg
YWxsb2NdIGluaXRXaXRoR3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOworI2lmbmRlZiBOREVCVUcK
KyAgICAgICAgW21fd2ViR0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2ViR0wgTGF5ZXIiXTsKKyNl
bmRpZiAgICAKKyAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgLy8gY3Jl
YXRlIGEgdGV4dHVyZSB0byByZW5kZXIgaW50bworICAgIDo6Z2xHZW5UZXh0dXJlcygxLCAmbV90
ZXh0dXJlKTsKKyAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsK
KyAgICA6OmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxU
RVIsIEdMX0xJTkVBUik7CisgICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xf
VEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOworICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdM
X1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7CisgICAgOjpnbFRleFBh
cmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QKTsKKyAg
ICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgCisgICAgLy8gY3JlYXRl
IGFuIEZCTworICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKKyAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIAorICAg
IG1fYm91bmRGQk8gPSBtX2ZibzsKKyAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpCisgICAgICAgIDo6Z2xHZW5SZW5kZXJidWZm
ZXJzRVhUKDEsICZtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisKKyAgICAvLyBjcmVhdGUgYW4gbXVs
dGlzYW1wbGUgRkJPCisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgIDo6Z2xH
ZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmlu
ZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cisg
ICAgICAgIG1fYm91bmRGQk8gPSBtX211bHRpc2FtcGxlRkJPOworICAgICAgICA6OmdsR2VuUmVu
ZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgaWYg
KG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpnbEdlblJl
bmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAg
IH0KKyAgICAKKyAgICAvLyBBTkdMRSBpbml0aWFsaXphdGlvbi4KKworICAgIFRCdWlsdEluUmVz
b3VyY2UgQU5HTEVSZXNvdXJjZXM7CisKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhBdHRy
aWJzID0gMDsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9B
VFRSSUJTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7CisgICAgQU5HTEVSZXNv
dXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBo
aWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2Vz
Lk1heFZlcnRleFVuaWZvcm1WZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5n
VmVjdG9ycyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZ
SU5HX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyk7CisgICAgQU5H
TEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVn
ZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZB
TkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNv
dXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYo
R3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5H
TEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNv
dXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNz
Q29udGV4dDNEOjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRl
eHR1cmVJbWFnZVVuaXRzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1W
ZWN0b3JzID0gMDsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdN
RU5UX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZl
Y3RvcnMpOworCisgICAgLy8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCisgICAgQU5H
TEVSZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSAxOworICAgIAorICAgIG1fY29tcGlsZXIuc2V0
UmVzb3VyY2VzKEFOR0xFUmVzb3VyY2VzKTsKKyAgICAKKyAgICA6OmdsRW5hYmxlKEdMX1ZFUlRF
WF9QUk9HUkFNX1BPSU5UX1NJWkUpOworICAgIDo6Z2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOwor
fQorCitHcmFwaGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKK3sKKyAgICBpZiAo
bV9jb250ZXh0T2JqKSB7CisgICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgICAgIDo6Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKKyAgICAgICAg
aWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVm
ZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgICAgIGlmICht
X2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVs
ZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7
CisgICAgICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxl
RkJPKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwg
fHwgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIDo6Z2xE
ZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKKyAgICAgICAgQ0dMU2V0Q3VycmVudENv
bnRleHQoMCk7CisgICAgICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
fQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0ZXMoKQorewor
ICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIq
Pig6OmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKyAgICBpZiAobV9hdHRycy5zdGVuY2ls
KSB7CisgICAgICAgIGlmIChzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xfRVhUX3BhY2tlZF9k
ZXB0aF9zdGVuY2lsIikpIHsKKyAgICAgICAgICAgIGlmICghbV9hdHRycy5kZXB0aCkKKyAgICAg
ICAgICAgICAgICBtX2F0dHJzLmRlcHRoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAg
ICAgICBtX2F0dHJzLnN0ZW5jaWwgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1fYXR0cnMuYW50
aWFsaWFzKSB7CisgICAgICAgIGJvb2wgaXNWYWxpZFZlbmRvciA9IHRydWU7CisgICAgICAgIC8v
IEN1cnJlbnRseSBpbiBNYWMgd2Ugb25seSB0dXJuIG9uIGFudGlhbGlhcyBpZiB2ZW5kb3IgaXMg
TlZJRElBLgorICAgICAgICBjb25zdCBjaGFyKiB2ZW5kb3IgPSByZWludGVycHJldF9jYXN0PGNv
bnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX1ZFTkRPUikpOworICAgICAgICBpZiAoIXN0ZDo6
c3Ryc3RyKHZlbmRvciwgIk5WSURJQSIpKQorICAgICAgICAgICAgaXNWYWxpZFZlbmRvciA9IGZh
bHNlOworICAgICAgICBpZiAoIWlzVmFsaWRWZW5kb3IgfHwgIXN0ZDo6c3Ryc3RyKGV4dGVuc2lv
bnMsICJHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUiKSkKKyAgICAgICAgICAgIG1fYXR0
cnMuYW50aWFsaWFzID0gZmFsc2U7CisgICAgfQorICAgIC8vIEZJWE1FOiBpbnN0ZWFkIG9mIGVu
Zm9yY2luZyBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlLCBpbXBsZW1lbnQgdGhlCisgICAgLy8g
Y29ycmVjdCBiZWhhdmlvciB3aGVuIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlIGlzIHJlcXVl
c3RlZC4KKyAgICBtX2F0dHJzLnByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6Om1ha2VDb250ZXh0Q3VycmVudCgpCit7CisgICAgQ0dMU2V0Q3Vy
cmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
cGFpbnRSZW5kZXJpbmdSZXN1bHRzVG9DYW52YXMoQ2FudmFzUmVuZGVyaW5nQ29udGV4dCogY29u
dGV4dCkKK3sKKyAgICBIVE1MQ2FudmFzRWxlbWVudCogY2FudmFzID0gY29udGV4dC0+Y2FudmFz
KCk7CisgICAgSW1hZ2VCdWZmZXIqIGltYWdlQnVmZmVyID0gY2FudmFzLT5idWZmZXIoKTsKKwor
ICAgIGludCByb3dCeXRlcyA9IG1fY3VycmVudFdpZHRoICogNDsKKyAgICBpbnQgdG90YWxCeXRl
cyA9IHJvd0J5dGVzICogbV9jdXJyZW50SGVpZ2h0OworCisgICAgT3duQXJyYXlQdHI8dW5zaWdu
ZWQgY2hhcj4gcGl4ZWxzKG5ldyB1bnNpZ25lZCBjaGFyW3RvdGFsQnl0ZXNdKTsKKyAgICBpZiAo
IXBpeGVscykKKyAgICAgICAgcmV0dXJuOworCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9j
b250ZXh0T2JqKTsKKworICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9S
RUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5k
RnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAg
OjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVp
Z2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZG
RVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKKyAgICAgICAg
ICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKKyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICBHTGludCBwYWNrQWxpZ25tZW50ID0gNDsKKyAgICBib29sIG11c3RSZXN0b3JlUGFja0FsaWdu
bWVudCA9IGZhbHNlOworICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9QQUNLX0FMSUdOTUVOVCwgJnBh
Y2tBbGlnbm1lbnQpOworICAgIGlmIChwYWNrQWxpZ25tZW50ID4gNCkgeworICAgICAgICA6Omds
UGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOworICAgICAgICBtdXN0UmVzdG9yZVBh
Y2tBbGlnbm1lbnQgPSB0cnVlOworICAgIH0KKworICAgIDo6Z2xSZWFkUGl4ZWxzKDAsIDAsIG1f
Y3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84
XzhfOF84X1JFViwgcGl4ZWxzLmdldCgpKTsKKworICAgIGlmIChtdXN0UmVzdG9yZVBhY2tBbGln
bm1lbnQpCisgICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgcGFja0Fs
aWdubWVudCk7CisKKyAgICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKKworICAgIHBhaW50
VG9DYW52YXMocGl4ZWxzLmdldCgpLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LAor
ICAgICAgICAgICAgICAgICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFn
ZUJ1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7Cit9CisKK2Jvb2wgR3JhcGhp
Y3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxz
ZTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25z
dAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNF
cnJvckdlbmVyYXRlZE9uT3V0T2ZCb3VuZHNBY2Nlc3NlcygpIGNvbnN0Cit7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwg
aW50IGhlaWdodCkKK3sKKyAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0
ID09IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0T2JqKQorICAgICAgICByZXR1cm47Cisg
ICAgCisgICAgbV9jdXJyZW50V2lkdGggPSB3aWR0aDsKKyAgICBtX2N1cnJlbnRIZWlnaHQgPSBo
ZWlnaHQ7CisgICAgCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICAKKyAgICBHTHVpbnQgaW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQsIGludGVybmFs
RGVwdGhTdGVuY2lsRm9ybWF0ID0gMDsKKyAgICBpZiAobV9hdHRycy5hbHBoYSkgeworICAgICAg
ICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCQTg7CisgICAgICAgIGNvbG9yRm9ybWF0ID0g
R0xfUkdCQTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xf
UkdCODsKKyAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0I7CisgICAgfQorICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgeworICAgICAgICAvLyBXZSBkb24ndCBhbGxv
dyB0aGUgbG9naWMgd2hlcmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQgZGVwdGggaXMgbm90Lgor
ICAgICAgICAvLyBTZWUgR3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0b3IuCisgICAgICAgIGlm
IChtX2F0dHJzLnN0ZW5jaWwgJiYgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgIGludGVybmFs
RGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEhfQ09N
UE9ORU5UOworICAgIH0KKworICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKworICAg
IC8vIHJlc2l6ZSBtdWx0aXNhbXBsZSBGQk8KKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsK
KyAgICAgICAgR0xpbnQgbWF4U2FtcGxlQ291bnQ7CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihH
TF9NQVhfU0FNUExFU19FWFQsICZtYXhTYW1wbGVDb3VudCk7CisgICAgICAgIEdMaW50IHNhbXBs
ZUNvdW50ID0gc3RkOjptaW4oOCwgbWF4U2FtcGxlQ291bnQpOworICAgICAgICBpZiAoc2FtcGxl
Q291bnQgPiBtYXhTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gbWF4U2Ft
cGxlQ291bnQ7CisgICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVsdGlzYW1wbGVGQk8pIHsK
KyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKKyAg
ICAgICAgfQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOworICAgICAgICA6OmdsUmVuZGVyYnVmZmVy
U3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBp
bnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgOjpnbEZyYW1lYnVm
ZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVO
VDBfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwor
ICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpIHsKKyAgICAgICAg
ICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0
b3JhZ2VNdWx0aXNhbXBsZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50
ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgaWYg
KG1fYXR0cnMuc3RlbmNpbCkKKyAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAg
ICAgICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1
ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RFUFRIX0FUVEFDSE1F
TlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVm
ZmVyKTsKKyAgICAgICAgfQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5E
RVJCVUZGRVJfRVhULCAwKTsKKyAgICAgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgewor
ICAgICAgICAgICAgLy8gRklYTUU6IGNsZWFudXAuCisgICAgICAgICAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVzaXplIHJlZ3VsYXIgRkJPCisgICAg
aWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKKyAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVl
OworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9m
Ym8pOworICAgIH0KKyAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJl
KTsKKyAgICA6OmdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbENvbG9yRm9y
bWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5TSUdORURfQllURSwgMCk7
CisgICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xf
Q09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3RleHR1cmUsIDApOworICAg
IDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICBpZiAoIW1fYXR0cnMuYW50
aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpIHsKKyAgICAgICAg
OjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5j
aWxCdWZmZXIpOworICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVChHTF9SRU5ERVJC
VUZGRVJfRVhULCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Cisg
ICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCisgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJS
ZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRf
RVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAg
IGlmIChtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVm
ZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JF
TkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgOjpnbEJpbmRS
ZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7CisgICAgfQorICAgIGlmIChn
bENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSAhPSBHTF9GUkFN
RUJVRkZFUl9DT01QTEVURV9FWFQpIHsKKyAgICAgICAgLy8gRklYTUU6IGNsZWFudXAKKyAgICAg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMp
IHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1f
bXVsdGlzYW1wbGVGQk8pOworICAgICAgICBpZiAobV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxl
RkJPKQorICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAv
LyBJbml0aWFsaXplIHJlbmRlcmJ1ZmZlcnMgdG8gMC4KKyAgICBHTGJvb2xlYW4gY29sb3JNYXNr
W10gPSB7R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0sIGRlcHRoTWFzayA9IEdM
X1RSVUUsIHN0ZW5jaWxNYXNrID0gR0xfVFJVRTsKKyAgICBHTGJvb2xlYW4gaXNTY2lzc29yRW5h
YmxlZCA9IEdMX0ZBTFNFOworICAgIEdMYm9vbGVhbiBpc0RpdGhlckVuYWJsZWQgPSBHTF9GQUxT
RTsKKyAgICBHTGJpdGZpZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JVRkZFUl9CSVQ7CisgICAg
OjpnbEdldEJvb2xlYW52KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JNYXNrKTsKKyAgICA6Omds
Q29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOworICAgIGlmICht
X2F0dHJzLmRlcHRoKSB7CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9ERVBUSF9XUklURU1B
U0ssICZkZXB0aE1hc2spOworICAgICAgICA6OmdsRGVwdGhNYXNrKEdMX1RSVUUpOworICAgICAg
ICBjbGVhck1hc2sgfD0gR0xfREVQVEhfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaWYgKG1fYXR0
cnMuc3RlbmNpbCkgeworICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfU1RFTkNJTF9XUklURU1B
U0ssICZzdGVuY2lsTWFzayk7CisgICAgICAgIDo6Z2xTdGVuY2lsTWFzayhHTF9UUlVFKTsKKyAg
ICAgICAgY2xlYXJNYXNrIHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaXNT
Y2lzc29yRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9URVNUKTsKKyAgICA6Omds
RGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGlzRGl0aGVyRW5hYmxlZCA9IDo6Z2xJc0Vu
YWJsZWQoR0xfRElUSEVSKTsKKyAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIpOworCisgICAgOjpn
bENsZWFyKGNsZWFyTWFzayk7CisKKyAgICA6OmdsQ29sb3JNYXNrKGNvbG9yTWFza1swXSwgY29s
b3JNYXNrWzFdLCBjb2xvck1hc2tbMl0sIGNvbG9yTWFza1szXSk7CisgICAgaWYgKG1fYXR0cnMu
ZGVwdGgpCisgICAgICAgIDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsKKyAgICBpZiAobV9hdHRy
cy5zdGVuY2lsKQorICAgICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNpbE1hc2spOworICAgIGlm
IChpc1NjaXNzb3JFbmFibGVkKQorICAgICAgICA6OmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7
CisgICAgZWxzZQorICAgICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGlm
IChpc0RpdGhlckVuYWJsZWQpCisgICAgICAgIDo6Z2xFbmFibGUoR0xfRElUSEVSKTsKKyAgICBl
bHNlCisgICAgICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAgICBpZiAobXVzdFJlc3Rv
cmVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBtX2JvdW5kRkJPKTsKKworICAgIDo6Z2xGbHVzaCgpOworfQorCitzdGF0aWMgaW5saW5lIHZv
aWQgZW5zdXJlQ29udGV4dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCit7CisgICAgaWYgKCFjb250
ZXh0KQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIENHTENvbnRleHRPYmogY3VycmVu
dENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50Q29udGV4
dCAhPSBjb250ZXh0KQorICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19G
UkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgw
LCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0
aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZC
Tyk7CisgICAgfQorICAgIDo6Z2xGaW5pc2goKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YWN0aXZlVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRleHR1cmUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBw
cm9ncmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7
CisgICAgQVNTRVJUKHNoYWRlcik7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIDo6Z2xBdHRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEF0dHJpYkxvY2F0aW9uKFBsYXRmb3Jt
M0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgU3RyaW5nJiBuYW1l
KQoreworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgOjpnbEJpbmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBpbmRleCwg
bmFtZS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1
ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdl
dCwgKEdMdWludCkgYnVmZmVyKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5k
RnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVy
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTHVpbnQgZmJvOwor
ICAgIGlmIChidWZmZXIpCisgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOworICAgIGVsc2UK
KyAgICAgICAgZmJvID0gKG1fYXR0cnMuYW50aWFsaWFzID8gbV9tdWx0aXNhbXBsZUZCTyA6IG1f
ZmJvKTsKKyAgICBpZiAoZmJvICE9IG1fYm91bmRGQk8pIHsKKyAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVCh0YXJnZXQsIGZibyk7CisgICAgICAgIG1fYm91bmRGQk8gPSBmYm87CisgICAg
fQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQodGFy
Z2V0LCAoR0x1aW50KSByZW5kZXJidWZmZXIpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJpbmRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRl
eHR1cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5k
VGV4dHVyZSh0YXJnZXQsIChHTHVpbnQpIHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpibGVuZENvbG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwgZG91YmxlIGJsdWUs
IGRvdWJsZSBhbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
OjpnbEJsZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0
PihncmVlbiksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFs
cGhhKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2ln
bmVkIGxvbmcgbW9kZSApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xCbGVuZEVxdWF0aW9uKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
bGVuZEVxdWF0aW9uU2VwYXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1bnNpZ25lZCBsb25n
IG1vZGVBbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bEJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOworfQorCisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNmYWN0b3IsIHVuc2ln
bmVkIGxvbmcgZGZhY3RvcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgOjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKK30gICAgICAgCisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdCLCB1
bnNpZ25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQgbG9u
ZyBkc3RBbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bEJsZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCAwLCB1c2Fn
ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsb25nIHVzYWdl
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVmZmVyRGF0
YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBz
aXplLCBjb25zdCB2b2lkKiBkYXRhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsQnVmZmVyU3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9
CisKK3Vuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0
dXModW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIHJldHVybiA6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVCh0YXJnZXQpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKGRvdWJsZSByLCBkb3VibGUg
ZywgZG91YmxlIGIsIGRvdWJsZSBhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsQ2xlYXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0
PGZsb2F0PihnKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2sp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhcihtYXNr
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhckRlcHRo
KGRlcHRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKGxvbmcg
cykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbENsZWFyU3Rl
bmNpbChzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVk
LCBib29sIGdyZWVuLCBib29sIGJsdWUsIGJvb2wgYWxwaGEpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxw
aGEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsYXRmb3Jt
M0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKworICAgIGludCBHTHNoYWRlclR5cGU7CisgICAgQU5HTEVTaGFk
ZXJUeXBlIHNoYWRlclR5cGU7CisKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgU0hBREVSX1RZ
UEUsICZHTHNoYWRlclR5cGUpOworICAgIAorICAgIGlmIChHTHNoYWRlclR5cGUgPT0gVkVSVEVY
X1NIQURFUikKKyAgICAgICAgc2hhZGVyVHlwZSA9IFNIQURFUl9UWVBFX1ZFUlRFWDsKKyAgICBl
bHNlIGlmIChHTHNoYWRlclR5cGUgPT0gRlJBR01FTlRfU0hBREVSKQorICAgICAgICBzaGFkZXJU
eXBlID0gU0hBREVSX1RZUEVfRlJBR01FTlQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm47IC8v
IEludmFsaWQgc2hhZGVyIHR5cGUuCisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNo
YWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmlu
ZChzaGFkZXIpOworCisgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgU2hhZGVyU291cmNlRW50cnkmIGVudHJ5ID0gcmVzdWx0
LT5zZWNvbmQ7CisKKyAgICBTdHJpbmcgdHJhbnNsYXRlZFNoYWRlclNvdXJjZTsKKyAgICBTdHJp
bmcgc2hhZGVySW5mb0xvZzsKKworICAgIGJvb2wgaXNWYWxpZCA9IG1fY29tcGlsZXIudmFsaWRh
dGVTaGFkZXJTb3VyY2UoZW50cnkuc291cmNlLnV0ZjgoKS5kYXRhKCksIHNoYWRlclR5cGUsIHRy
YW5zbGF0ZWRTaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpOworCisgICAgZW50cnkubG9nID0g
c2hhZGVySW5mb0xvZzsKKyAgICBlbnRyeS5pc1ZhbGlkID0gaXNWYWxpZDsKKworICAgIGlmICgh
aXNWYWxpZCkKKyAgICAgICAgcmV0dXJuOyAvLyBTaGFkZXIgZGlkbid0IHZhbGlkYXRlLCBkb24n
dCBtb3ZlIGZvcndhcmQgd2l0aCBjb21waWxpbmcgdHJhbnNsYXRlZCBzb3VyY2UgICAgCisKKyAg
ICBpbnQgdHJhbnNsYXRlZFNoYWRlckxlbmd0aCA9IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UubGVu
Z3RoKCk7CisKKyAgICBjb25zdCBDU3RyaW5nJiB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZyA9IHRy
YW5zbGF0ZWRTaGFkZXJTb3VyY2UudXRmOCgpOworICAgIGNvbnN0IGNoYXIqIHRyYW5zbGF0ZWRT
aGFkZXJQdHIgPSB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZy5kYXRhKCk7CisgICAgCisgICAgOjpn
bFNoYWRlclNvdXJjZSgoR0x1aW50KSBzaGFkZXIsIDEsICZ0cmFuc2xhdGVkU2hhZGVyUHRyLCAm
dHJhbnNsYXRlZFNoYWRlckxlbmd0aCk7CisgICAgCisgICAgOjpnbENvbXBpbGVTaGFkZXIoKEdM
dWludCkgc2hhZGVyKTsKKyAgICAKKyAgICBpbnQgR0xDb21waWxlU3VjY2VzczsKKyAgICAKKyAg
ICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBDT01QSUxFX1NUQVRVUywgJkdMQ29t
cGlsZVN1Y2Nlc3MpOworICAgIAorICAgIC8vIEFTU0VSVCB0aGF0IEFOR0xFIGdlbmVyYXRlZCBH
TFNMIHdpbGwgYmUgYWNjZXB0ZWQgYnkgT3BlbkdMCisgICAgQVNTRVJUKEdMQ29tcGlsZVN1Y2Nl
c3MgPT0gR0xfVFJVRSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFn
ZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVy
bmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQg
bG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRp
c2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFN
RUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVm
ZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0
RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lk
dGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAg
fQorICAgIDo6Z2xDb3B5VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwg
eCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMg
JiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCBsb25nIGxldmVsLCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwgbG9uZyB4LCBsb25n
IHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYg
bV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zi
byk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsg
aGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQs
IEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZG
RVJfRVhULCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQs
IGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAg
ICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNh
bXBsZUZCTyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVk
IGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bEN1bGxGYWNlKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmMo
dW5zaWduZWQgbG9uZyBmdW5jKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsRGVwdGhGdW5jKGZ1bmMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
ZXB0aE1hc2soYm9vbCBmbGFnKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
ZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSwgUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHByb2dyYW0pOwor
ICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEaXNhYmxlKGNhcCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1
bnNpZ25lZCBsb25nIGluZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25nIG1vZGUsIGxvbmcgZmlyc3Qs
IGxvbmcgY291bnQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291
bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUs
IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEVuYWJsZShjYXAp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1
bnNpZ25lZCBsb25nIGluZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpmaW5pc2goKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsRmluaXNoKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNo
KCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEZsdXNoKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxv
bmcgcmVuZGVyYnVmZmVydGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChH
THVpbnQpIGJ1ZmZlcjsKKyAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFD
SE1FTlQpIHsKKyAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwg
REVQVEhfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAg
ICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFD
SE1FTlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKyAgICB9IGVsc2UKKyAg
ICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwg
cmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWdu
ZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9i
amVjdCB0ZXh0dXJlLCBsb25nIGxldmVsKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50
LCB0ZXh0YXJnZXQsIChHTHVpbnQpIHRleHR1cmUsIGxldmVsKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZnJvbnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEZyb250RmFjZShtb2RlKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJhdGVNaXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZW5lcmF0ZU1p
cG1hcEVYVCh0YXJnZXQpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVB
dHRyaWIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBBY3Rp
dmVJbmZvJiBpbmZvKQoreworICAgIGlmICghcHJvZ3JhbSkgeworICAgICAgICBzeW50aGVzaXpl
R0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6
ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0p
LCBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgsICZtYXhBdHRyaWJ1dGVTaXplKTsKKyAg
ICBHTGNoYXIgbmFtZVttYXhBdHRyaWJ1dGVTaXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJQlVURV9N
QVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KKyAgICBHTHNpemVpIG5hbWVMZW5n
dGggPSAwOworICAgIEdMaW50IHNpemUgPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICA6
OmdsR2V0QWN0aXZlQXR0cmliKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4LCBt
YXhBdHRyaWJ1dGVTaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBp
ZiAoIW5hbWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBT
dHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZv
LnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorICAgIAorYm9vbCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2ln
bmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCit7CisgICAgaWYgKCFwcm9ncmFtKSB7
CisgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBH
TGludCBtYXhVbmlmb3JtU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2Fz
dDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RILCAmbWF4VW5p
Zm9ybVNpemUpOworICAgIEdMY2hhciBuYW1lW21heFVuaWZvcm1TaXplXTsgLy8gR0xfQUNUSVZF
X1VOSUZPUk1fTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCisgICAgR0xzaXpl
aSBuYW1lTGVuZ3RoID0gMDsKKyAgICBHTGludCBzaXplID0gMDsKKyAgICBHTGVudW0gdHlwZSA9
IDA7CisgICAgOjpnbEdldEFjdGl2ZVVuaWZvcm0oc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFt
KSwgaW5kZXgsIG1heFVuaWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1l
KTsKKyAgICBpZiAoIW5hbWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZv
Lm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsK
KyAgICBpbmZvLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRBdHRhY2hlZFNoYWRlcnMoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFt
LCBpbnQgbWF4Q291bnQsIGludCogY291bnQsIHVuc2lnbmVkIGludCogc2hhZGVycykKK3sKKyAg
ICBpZiAoIXByb2dyYW0pIHsKKyAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxV
RSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xHZXRBdHRhY2hlZFNoYWRlcnMoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9n
cmFtKSwgbWF4Q291bnQsIGNvdW50LCBzaGFkZXJzKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0
cmluZyYgbmFtZSkKK3sKKyAgICBpZiAoIXByb2dyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAg
ICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xHZXRB
dHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworfQor
CitHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Q29u
dGV4dEF0dHJpYnV0ZXMoKQoreworICAgIHJldHVybiBtX2F0dHJzOworfQorCit1bnNpZ25lZCBs
b25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRFcnJvcigpCit7CisgICAgaWYgKG1fc3ludGhldGlj
RXJyb3JzLnNpemUoKSA+IDApIHsKKyAgICAgICAgTGlzdEhhc2hTZXQ8dW5zaWduZWQgbG9uZz46
Oml0ZXJhdG9yIGl0ZXIgPSBtX3N5bnRoZXRpY0Vycm9ycy5iZWdpbigpOworICAgICAgICB1bnNp
Z25lZCBsb25nIGVyciA9ICppdGVyOworICAgICAgICBtX3N5bnRoZXRpY0Vycm9ycy5yZW1vdmUo
aXRlcik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKK30KKworU3RyaW5nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gU3RyaW5nKChjb25zdCBjaGFy
KikgOjpnbEdldFN0cmluZyhuYW1lKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omhp
bnQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEhpbnQodGFyZ2V0LCBtb2RlKTsKK30K
KworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZmZXIoUGxhdGZvcm0zRE9iamVjdCBidWZm
ZXIpCit7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc0J1ZmZlcigo
R0x1aW50KSBidWZmZXIpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQo
dW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIHJldHVybiA6OmdsSXNFbmFibGVkKGNhcCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0
M0Q6OmlzRnJhbWVidWZmZXIoUGxhdGZvcm0zRE9iamVjdCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBp
ZiAoIWZyYW1lYnVmZmVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1ZmZlckVYVCgo
R0x1aW50KSBmcmFtZWJ1ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJv
Z3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgaWYgKCFwcm9ncmFtKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIHJldHVybiA6OmdsSXNQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOworfQorCitib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IHJlbmRl
cmJ1ZmZlcikKK3sKKyAgICBpZiAoIXJlbmRlcmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpn
bElzUmVuZGVyYnVmZmVyRVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Cit9CisKK2Jvb2wgR3Jh
cGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAg
IGlmICghc2hhZGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hh
ZGVyKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBsYXRmb3JtM0RP
YmplY3QgdGV4dHVyZSkKK3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6
Z2xJc1RleHR1cmUoKEdMdWludCkgdGV4dHVyZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmxpbmVXaWR0aChkb3VibGUgd2lkdGgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3Qg
cHJvZ3JhbSkKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIDo6Z2xMaW5rUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGl4ZWxTdG9yZWkodW5zaWduZWQgbG9uZyBwbmFtZSwg
bG9uZyBwYXJhbSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bFBpeGVsU3RvcmVpKHBuYW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnBvbHlnb25PZmZzZXQoZG91YmxlIGZhY3RvciwgZG91YmxlIHVuaXRzKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0aWNfY2Fz
dDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5z
aWduZWQgbG9uZyB0eXBlLCB2b2lkKiBkYXRhKQoreworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhl
IHR3byBnbEZsdXNoIGNhbGxzIHdoZW4gdGhlIGRyaXZlciBidWcgaXMgZml4ZWQsIGkuZS4sCisg
ICAgLy8gYWxsIHByZXZpb3VzIHJlbmRlcmluZyBjYWxscyBzaG91bGQgYmUgZG9uZSBiZWZvcmUg
cmVhZGluZyBwaXhlbHMuCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xGbHVzaCgpOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1f
bXVsdGlzYW1wbGVGQk8pIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFE
X0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpn
bEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKKyAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
KyAgICAgICAgOjpnbEZsdXNoKCk7CisgICAgfQorICAgIDo6Z2xSZWFkUGl4ZWxzKHgsIHksIHdp
ZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgZGF0YSk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFs
aWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIoKQoreworICAg
IC8vIEZJWE1FOiBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBkZXNrdG9wIE9wZW5HTC4gV2Ug
bmVlZCB0byBoYXZlIGlmZGVmcyBmb3IgdGhlIGRpZmZlcmVudCBHTCB2YXJpYW50cworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAvLzo6Z2xSZWxlYXNlU2hhZGVyQ29tcGls
ZXIoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcmFnZSh1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWdu
ZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICBjYXNl
IERFUFRIX1NURU5DSUw6CisgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEgyNF9TVEVO
Q0lMOF9FWFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgREVQVEhfQ09NUE9ORU5UMTY6Cisg
ICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFJHQkE0OgorICAgIGNhc2UgUkdCNV9BMToKKyAgICAgICAgaW50ZXJuYWxm
b3JtYXQgPSBHTF9SR0JBOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJHQjU2NToKKyAgICAg
ICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICA6
OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVCh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwg
aGVpZ2h0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292ZXJhZ2UoZG91
YmxlIHZhbHVlLCBib29sIGludmVydCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgOjpnbFNhbXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSksIGlu
dmVydCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9uZyB4LCBsb25n
IHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwg
aGVpZ2h0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291cmNlKFBsYXRm
b3JtM0RPYmplY3Qgc2hhZGVyLCBjb25zdCBTdHJpbmcmIHN0cmluZykKK3sKKyAgICBBU1NFUlQo
c2hhZGVyKTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBT
aGFkZXJTb3VyY2VFbnRyeSBlbnRyeTsKKworICAgIGVudHJ5LnNvdXJjZSA9IHN0cmluZzsKKwor
ICAgIG1fc2hhZGVyU291cmNlTWFwLnNldChzaGFkZXIsIGVudHJ5KTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwg
dW5zaWduZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsU3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6c3RlbmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2ln
bmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFj
ZSwgZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNp
bE1hc2sodW5zaWduZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsU3RlbmNpbE1hc2sobWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnN0ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBs
b25nIG1hc2spCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xT
dGVuY2lsTWFza1NlcGFyYXRlKGZhY2UsIG1hc2spOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpzdGVuY2lsT3AodW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1
bnNpZ25lZCBsb25nIHpwYXNzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsU3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWdu
ZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNpbE9wU2Vw
YXJhdGUoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dGV4UGFyYW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9h
dCB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFRl
eFBhcmFtZXRlcmYodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQgdGFyZ2V0
LCB1bnNpZ25lZCBwbmFtZSwgaW50IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2Fz
dDxmbG9hdD4odmFsdWUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFm
KGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZv
cm0xZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTJmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSkKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yZihsb2NhdGlvbiwg
djAsIHYxKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdihsb25nIGxv
Y2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGgg
bmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwg
ZmxvYXQgdjEsIGZsb2F0IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsVW5pZm9ybTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGlu
dCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBv
ZiAzCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2Z2
KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm00Zihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9h
dCB2MykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZv
cm00Zihsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7
CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24s
IHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxv
bmcgbG9jYXRpb24sIGludCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgOjpnbFVuaWZvcm0xaShsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtMWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFpdihs
b2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtMmkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDIKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpn
bFVuaWZvcm0yaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2ko
bG9jYXRpb24sIHYwLCB2MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlm
b3JtM2l2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJ
WE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJh
eSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9u
LCBpbnQgdjAsIGludCB2MSwgaW50IHYyLCBpbnQgdjMpCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYz
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihsb25nIGxvY2F0aW9u
LCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRv
IGJlIGEgbXVsdGlwbGUgb2YgNAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsVW5pZm9ybTRpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNw
b3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFy
cmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihsb25n
IGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQorICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlv
biwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnVuaWZvcm1NYXRyaXg0ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBh
cnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDE2CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xV
bmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dy
YW0pCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVc2VQcm9n
cmFtKChHTHVpbnQpIHByb2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxp
ZGF0ZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQoreworICAgIEFTU0VSVChwcm9n
cmFtKTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZh
bGlkYXRlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliMWYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjFmKGlu
ZHgsIHYwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4
LCBmbG9hdCB2MCwgZmxvYXQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCog
YXJyYXkpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIyZnYoaW5keCwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIzZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxv
YXQgdjIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQorewor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliM2Z2
KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmli
NGYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9h
dCB2MykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRl
eEF0dHJpYjRmKGluZHgsIHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQor
eworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmli
NGZ2KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliUG9pbnRlcih1bnNpZ25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBu
b3JtYWxpemVkLCB1bnNpZ25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWJQ
b2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnByZXRf
Y2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcg
d2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsVmlld3BvcnQoc3RhdGljX2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNf
Y2FzdDxHTGludD4oeSksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8
R0xzaXplaT4oaGVpZ2h0KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJvb2xl
YW52KHVuc2lnbmVkIGxvbmcgcG5hbWUsIHVuc2lnbmVkIGNoYXIqIHZhbHVlKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZh
bHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRCdWZmZXJQYXJh
bWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZh
bHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2ht
ZW50UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNo
bWVudCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9B
VFRBQ0hNRU5UKQorICAgICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3Ig
U1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3MuCisgICAgOjpnbEdldEZyYW1lYnVmZmVy
QXR0YWNobWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVl
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0SW50ZWdlcnYodW5zaWduZWQgbG9u
ZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICAvLyBOZWVkIHRvIGVtdWxhdGUgSU1QTEVNRU5U
QVRJT05fQ09MT1JfUkVBRF9GT1JNQVQvVFlQRSBmb3IgR0wuICBBbnkgdmFsaWQKKyAgICAvLyBj
b21iaW5hdGlvbiBzaG91bGQgd29yaywgYnV0IEdMX1JHQi9HTF9VTlNJR05FRF9CWVRFIG1pZ2h0
IGJlIHRoZSBtb3N0CisgICAgLy8gdXNlZnVsIGZvciBkZXNrdG9wIFdlYkdMIHVzZXJzLgorICAg
IC8vIE5lZWQgdG8gZW11bGF0ZSBNQVhfRlJBR01FTlQvVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyBh
bmQgTUFYX1ZBUllJTkdfVkVDVE9SUworICAgIC8vIGJlY2F1c2UgZGVza3RvcCBHTCdzIGNvcnJl
c3BvbmRpbmcgcXVlcmllcyByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgLy8g
d2hlcmVhcyBHTEVTMiByZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzIChlYWNoIHZlY3RvciBo
YXMgNCBjb21wb25lbnRzKS4KKyAgICAvLyBUaGVyZWZvcmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBi
eSBkZXNrdG9wIEdMIG5lZWRzIHRvIGJlIGRpdmlkZWQgYnkgNC4KKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgSU1QTEVNRU5U
QVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6CisgICAgICAgICp2YWx1ZSA9IEdMX1JHQjsKKyAgICAg
ICAgYnJlYWs7CisgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6CisgICAg
ICAgICp2YWx1ZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAgICAgOjpnbEdldEludGVnZXJ2KEdM
X01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMsIHZhbHVlKTsKKyAgICAgICAgKnZhbHVl
IC89IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RP
UlM6CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9O
RU5UUywgdmFsdWUpOworICAgICAgICAqdmFsdWUgLz0gNDsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBNQVhfVkFSWUlOR19WRUNUT1JTOgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFY
X1ZBUllJTkdfRkxPQVRTLCB2YWx1ZSk7CisgICAgICAgICp2YWx1ZSAvPSA0OworICAgICAgICBi
cmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYocG5hbWUsIHZhbHVl
KTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdihQbGF0
Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRQcm9ncmFtaXYo
KEdMdWludCkgcHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKK30KKworU3RyaW5nIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7Cisg
ICAgQVNTRVJUKHByb2dyYW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBHTGludCBsZW5ndGg7CisgICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9n
cmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOworICAgIAorICAgIEdMc2l6ZWkgc2l6
ZTsKKyAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAg
IGlmICghaW5mbykKKyAgICAgICAgcmV0dXJuICIiOworCisgICAgOjpnbEdldFByb2dyYW1JbmZv
TG9nKChHTHVpbnQpIHByb2dyYW0sIGxlbmd0aCwgJnNpemUsIGluZm8pOworICAgIFN0cmluZyBz
KGluZm8pOworICAgIGZhc3RGcmVlKGluZm8pOworICAgIHJldHVybiBzOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25n
IHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2
RVhUKHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0U2hhZGVyaXYoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGludCogdmFsdWUpCit7CisgICAgQVNTRVJUKHNoYWRlcik7CisgICAgCisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIAorICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwg
U2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5m
aW5kKHNoYWRlcik7CisgICAgCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIERF
TEVURV9TVEFUVVM6CisgICAgICAgIGNhc2UgU0hBREVSX1RZUEU6CisgICAgICAgICAgICAvLyBM
ZXQgT3BlbkdMIGhhbmRsZSB0aGVzZS4KKyAgICAgICAgCisgICAgICAgICAgICA6OmdsR2V0U2hh
ZGVyaXYoKEdMdWludCkgc2hhZGVyLCBwbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgY2FzZSBDT01QSUxFX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChyZXN1bHQg
PT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAoKnZhbHVlKSA9
IHN0YXRpY19jYXN0PGludD4oZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGlj
X2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgCisgICAgICAgIGNhc2UgSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAg
aWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAg
ICgqdmFsdWUpID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVySW5mb0xvZyhzaGFk
ZXIpLmxlbmd0aCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAg
Y2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKKyAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hh
ZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElE
X0VOVU0pOworICAgIH0KK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJ
bmZvTG9nKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOwor
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMaW50IGxlbmd0aDsKKyAg
ICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZs
ZW5ndGgpOworCisgICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRy
eT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKKwor
ICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCisgICAgICAgICByZXR1
cm4gIiI7CisKKyAgICAgU2hhZGVyU291cmNlRW50cnkgZW50cnkgPSByZXN1bHQtPnNlY29uZDsK
KworICAgICBpZiAoZW50cnkuaXNWYWxpZCkgeworICAgICAgICAgR0xpbnQgbGVuZ3RoOworICAg
ICAgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RI
LCAmbGVuZ3RoKTsKKworICAgICAgICAgR0xzaXplaSBzaXplOworICAgICAgICAgR0xjaGFyKiBp
bmZvID0gKEdMY2hhciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgIGlmICghaW5mbykK
KyAgICAgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgIDo6Z2xHZXRTaGFkZXJJbmZvTG9n
KChHTHVpbnQpIHNoYWRlciwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7CisKKyAgICAgICAgIFN0cmlu
ZyBzKGluZm8pOworICAgICAgICAgZmFzdEZyZWUoaW5mbyk7CisgICAgICAgICByZXR1cm4gczsK
KyAgICAgfQorICAgICBlbHNlIHsKKyAgICAgICAgIHJldHVybiBlbnRyeS5sb2c7CisgICAgIH0K
K30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UoUGxhdGZvcm0z
RE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHNoYWRlcik7CisKKyAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRl
clNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChz
aGFkZXIpOworCisgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAg
ICAgICAgcmV0dXJuICIiOworCisgICAgcmV0dXJuIHJlc3VsdC0+c2Vjb25kLnNvdXJjZTsKK30K
KworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VGV4UGFyYW1ldGVyZnYodGFy
Z2V0LCBwbmFtZSwgdmFsdWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQ
YXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50
KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdl
dFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBs
b2NhdGlvbiwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICA6OmdsR2V0VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1
ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRVbmlmb3JtaXYoKEdMdWludCkgcHJv
Z3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VW5pZm9ybUxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBu
YW1lKQoreworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRpb24oKEdMdWludCkg
cHJvZ3JhbSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6Z2V0VmVydGV4QXR0cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBw
bmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICA6OmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5k
ZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUs
IHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zm
c2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCit7CisgICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIAorICAgIHZvaWQqIHBvaW50ZXI7CisgICAg
OjpnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgJnBvaW50ZXIpOworICAg
IHJldHVybiByZWludGVycHJldF9jYXN0PGxvbmc+KHBvaW50ZXIpOworfQorCitpbnQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnRleEltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwg
dW5zaWduZWQgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQs
IHVuc2lnbmVkIGJvcmRlciwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBw
aXhlbHMpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgOjpnbFRl
eEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJv
cmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCitpbnQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBs
ZXZlbCwgdW5zaWduZWQgeG9mZiwgdW5zaWduZWQgeW9mZiwgdW5zaWduZWQgd2lkdGgsIHVuc2ln
bmVkIGhlaWdodCwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgLy8gRklYTUU6IHdl
IHdpbGwgbmVlZCB0byBkZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdp
dGggaW1hZ2UgYnVmZmVycyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCisgICAg
OjpnbFRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdo
dCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBH
cmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgR0x1aW50IG87CisgICAgZ2xHZW5CdWZmZXJzKDEsICZvKTsKKyAg
ICByZXR1cm4gbzsKK30KKwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUZyYW1l
YnVmZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50
IG87CisgICAgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm8pOworICAgIHJldHVybiBvOworfQor
Cit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgpCit7CisgICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiBnbENyZWF0ZVByb2dyYW0oKTsK
K30KKwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcigpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGds
R2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisKK3Vuc2lnbmVk
IEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9uZyB0eXBlKQorewor
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gZ2xDcmVhdGVTaGFk
ZXIoKHR5cGUgPT0gRlJBR01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZF
UlRFWF9TSEFERVIpOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4
dHVyZSgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBv
OworICAgIGdsR2VuVGV4dHVyZXMoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQoreworICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJmJ1ZmZl
cik7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1lYnVmZmVyKHVuc2ln
bmVkIGZyYW1lYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmZnJhbWVidWZmZXIpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW0pCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFt
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2ln
bmVkIHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZyZW5kZXJidWZmZXIpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVTaGFkZXIodW5zaWduZWQgc2hhZGVyKQoreworICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVUZXh0dXJlKHVuc2lnbmVkIHRl
eHR1cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRl
VGV4dHVyZXMoMSwgJnRleHR1cmUpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnNpemVJ
bkJ5dGVzKGludCB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdM
X0JZVEU6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMYnl0ZSk7CisgICAgICAgIGNhc2Ug
R0xfVU5TSUdORURfQllURToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1Ynl0ZSk7Cisg
ICAgICAgIGNhc2UgR0xfU0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMc2hvcnQp
OworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIHNp
emVvZihHTHVzaG9ydCk7CisgICAgICAgIGNhc2UgR0xfSU5UOgorICAgICAgICAgICAgcmV0dXJu
IHNpemVvZihHTGludCk7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UOgorICAgICAgICAg
ICAgcmV0dXJuIHNpemVvZihHTHVpbnQpOworICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAg
ICAgICAgcmV0dXJuIHNpemVvZihHTGZsb2F0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgIHJldHVybiAwOworICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3ludGhl
c2l6ZUdMRXJyb3IodW5zaWduZWQgbG9uZyBlcnJvcikKK3sKKyAgICBtX3N5bnRoZXRpY0Vycm9y
cy5hZGQoZXJyb3IpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoM0RfQ0FOVkFTKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQz
RE9wZW5HTC5jcHAJKHJldmlzaW9uIDY2Nzc3KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNSArMSw1
IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTI5LDggKzI5LDYgQEAKIAog
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9u
cy5oIgotCiAjaW5jbHVkZSAiQXJyYXlCdWZmZXIuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlclZp
ZXcuaCIKICNpbmNsdWRlICJXZWJHTE9iamVjdC5oIgpAQCAtNDIsMTkzICs0MCwxNyBAQAogI2lu
Y2x1ZGUgIkludDMyQXJyYXkuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1
ZGUgIlVpbnQ4QXJyYXkuaCIKLSNpbmNsdWRlICJXZWJHTExheWVyLmgiCi0jaW5jbHVkZSA8Q29y
ZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorCisjaWYgUExBVEZPUk0oTUFDKQogI2luY2x1
ZGUgPE9wZW5HTC9DR0xSZW5kZXJlcnMuaD4KICNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNlbmRp
ZgorCiAjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0
cmluZy5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyB2b2lkIHNldFBpeGVsRm9y
bWF0KFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4mIGF0dHJpYnMsIGludCBjb2xvckJp
dHMsIGludCBkZXB0aEJpdHMsIGJvb2wgYWNjZWxlcmF0ZWQsIGJvb2wgc3VwZXJzYW1wbGUsIGJv
b2wgY2xvc2VzdCkKLXsKLSAgICBhdHRyaWJzLmNsZWFyKCk7Ci0gICAgCi0gICAgYXR0cmlicy5h
cHBlbmQoa0NHTFBGQUNvbG9yU2l6ZSk7Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8
Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGNvbG9yQml0cykpOwotICAgIGF0dHJpYnMuYXBwZW5k
KGtDR0xQRkFEZXB0aFNpemUpOwotICAgIGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENHTFBp
eGVsRm9ybWF0QXR0cmlidXRlPihkZXB0aEJpdHMpKTsKLSAgICAKLSAgICBpZiAoYWNjZWxlcmF0
ZWQpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFBY2NlbGVyYXRlZCk7Ci0gICAgZWxz
ZSB7Ci0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFSZW5kZXJlcklEKTsKLSAgICAgICAg
YXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGtDR0xS
ZW5kZXJlckdlbmVyaWNGbG9hdElEKSk7Ci0gICAgfQotICAgICAgICAKLSAgICBpZiAoc3VwZXJz
YW1wbGUpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFTdXBlcnNhbXBsZSk7Ci0gICAg
ICAgIAotICAgIGlmIChjbG9zZXN0KQotICAgICAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ2xv
c2VzdFBvbGljeSk7Ci0gICAgICAgIAotICAgIGF0dHJpYnMuYXBwZW5kKHN0YXRpY19jYXN0PENH
TFBpeGVsRm9ybWF0QXR0cmlidXRlPigwKSk7Ci19Ci0KLVBhc3NPd25QdHI8R3JhcGhpY3NDb250
ZXh0M0Q+IEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJp
YnV0ZXMgYXR0cnMsIEhvc3RXaW5kb3cqIGhvc3RXaW5kb3cpCi17Ci0gICAgT3duUHRyPEdyYXBo
aWNzQ29udGV4dDNEPiBjb250ZXh0KG5ldyBHcmFwaGljc0NvbnRleHQzRChhdHRycywgaG9zdFdp
bmRvdykpOwotICAgIHJldHVybiBjb250ZXh0LT5tX2NvbnRleHRPYmogPyBjb250ZXh0LnJlbGVh
c2UoKSA6IDA7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDNEOjpHcmFwaGljc0NvbnRleHQzRChHcmFw
aGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykK
LSAgICA6IG1fY3VycmVudFdpZHRoKDApCi0gICAgLCBtX2N1cnJlbnRIZWlnaHQoMCkKLSAgICAs
IG1fYXR0cnMoYXR0cnMpCi0gICAgLCBtX2NvbnRleHRPYmooMCkKLSAgICAsIG1fdGV4dHVyZSgw
KQotICAgICwgbV9mYm8oMCkKLSAgICAsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKDApCi0gICAgLCBt
X2JvdW5kRkJPKDApCi0gICAgLCBtX211bHRpc2FtcGxlRkJPKDApCi0gICAgLCBtX211bHRpc2Ft
cGxlRGVwdGhTdGVuY2lsQnVmZmVyKDApCi0gICAgLCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIo
MCkKLXsKLSAgICBVTlVTRURfUEFSQU0oaG9zdFdpbmRvdyk7Ci0KLSAgICBWZWN0b3I8Q0dMUGl4
ZWxGb3JtYXRBdHRyaWJ1dGU+IGF0dHJpYnM7Ci0gICAgQ0dMUGl4ZWxGb3JtYXRPYmogcGl4ZWxG
b3JtYXRPYmogPSAwOwotICAgIEdMaW50IG51bVBpeGVsRm9ybWF0cyA9IDA7Ci0gICAgCi0gICAg
Ly8gV2Ugd2lsbCB0cnk6Ci0gICAgLy8KLSAgICAvLyAgMSkgMzIgYml0IFJHQkEvMzIgYml0IGRl
cHRoL2FjY2VsZXJhdGVkL3N1cGVyc2FtcGxlZAotICAgIC8vICAyKSAzMiBiaXQgUkdCQS8zMiBi
aXQgZGVwdGgvYWNjZWxlcmF0ZWQKLSAgICAvLyAgMykgMzIgYml0IFJHQkEvMTYgYml0IGRlcHRo
L2FjY2VsZXJhdGVkCi0gICAgLy8gIDQpIGNsb3Nlc3QgdG8gMzIgYml0IFJHQkEvMTYgYml0IGRl
cHRoL3NvZnR3YXJlIHJlbmRlcmVyCi0gICAgLy8KLSAgICAvLyAgSWYgbm9uZSBvZiB0aGF0IHdv
cmtzLCB3ZSBzaW1wbHkgZmFpbCBhbmQgc2V0IG1fY29udGV4dE9iaiB0byAwLgotICAgIAotICAg
IHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOwotICAg
IENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZu
dW1QaXhlbEZvcm1hdHMpOwotICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAg
ICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMzIsIHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0g
ICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRP
YmosICZudW1QaXhlbEZvcm1hdHMpOwotICAgICAgICAKLSAgICAgICAgaWYgKG51bVBpeGVsRm9y
bWF0cyA9PSAwKSB7Ci0gICAgICAgICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMTYs
IHRydWUsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChh
dHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAg
ICAgCi0gICAgICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsKLSAgICAgICAgICAg
ICAgICBzZXRQaXhlbEZvcm1hdChhdHRyaWJzLCAzMiwgMTYsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7
Ci0gICAgICAgICAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZw
aXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7Ci0gICAgICAgIAotICAgICAgICAgICAg
ICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBD
b3VsZCBub3QgZmluZCBhbiBhY2NlcHRhYmxlIHJlbmRlcmVyIC0gZmFpbAotICAgICAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIENHTEVycm9yIGVyciA9IENHTENyZWF0ZUNvbnRleHQocGl4
ZWxGb3JtYXRPYmosIDAsICZtX2NvbnRleHRPYmopOwotICAgIENHTERlc3Ryb3lQaXhlbEZvcm1h
dChwaXhlbEZvcm1hdE9iaik7Ci0gICAgCi0gICAgaWYgKGVyciAhPSBrQ0dMTm9FcnJvciB8fCAh
bV9jb250ZXh0T2JqKSB7Ci0gICAgICAgIC8vIENvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbnRleHQg
LSBmYWlsCi0gICAgICAgIG1fY29udGV4dE9iaiA9IDA7Ci0gICAgICAgIHJldHVybjsKLSAgICB9
Ci0KLSAgICAvLyBTZXQgdGhlIGN1cnJlbnQgY29udGV4dCB0byB0aGUgb25lIGdpdmVuIHRvIHVz
LgotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgdmFs
aWRhdGVBdHRyaWJ1dGVzKCk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIFdlYkdMTGF5ZXIKLSAgICBC
RUdJTl9CTE9DS19PQkpDX0VYQ0VQVElPTlMKLSAgICAgICAgbV93ZWJHTExheWVyLmFkb3B0TlMo
W1tXZWJHTExheWVyIGFsbG9jXSBpbml0V2l0aEdyYXBoaWNzQ29udGV4dDNEOnRoaXNdKTsKLSNp
Zm5kZWYgTkRFQlVHCi0gICAgICAgIFttX3dlYkdMTGF5ZXIuZ2V0KCkgc2V0TmFtZTpAIldlYkdM
IExheWVyIl07Ci0jZW5kaWYgICAgCi0gICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAg
IAotICAgIC8vIGNyZWF0ZSBhIHRleHR1cmUgdG8gcmVuZGVyIGludG8KLSAgICA6OmdsR2VuVGV4
dHVyZXMoMSwgJm1fdGV4dHVyZSk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQs
IG1fdGV4dHVyZSk7Ci0gICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVY
VFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKEdMX1RF
WFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKTsKLSAgICA6OmdsVGV4
UGFyYW1ldGVyaShHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX1dSQVBfUywgR0xfQ0xBTVApOwot
ICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBH
TF9DTEFNUCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApOwotICAgIAot
ICAgIC8vIGNyZWF0ZSBhbiBGQk8KLSAgICA6OmdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZtX2Zi
byk7Ci0gICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJv
KTsKLSAgICAKLSAgICBtX2JvdW5kRkJPID0gbV9mYm87Ci0gICAgaWYgKCFtX2F0dHJzLmFudGlh
bGlhcyAmJiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpKQotICAgICAgICA6Omds
R2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotCi0gICAgLy8g
Y3JlYXRlIGFuIG11bHRpc2FtcGxlIEZCTwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewot
ICAgICAgICA6OmdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRkJPKTsKLSAg
ICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVGQk8pOwotICAgICAgICBtX2JvdW5kRkJPID0gbV9tdWx0aXNhbXBsZUZCTzsKLSAgICAg
ICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7
Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAg
ICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRGVwdGhTdGVuY2ls
QnVmZmVyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQU5HTEUgaW5pdGlhbGl6YXRpb24uCi0KLSAg
ICBUQnVpbHRJblJlc291cmNlIEFOR0xFUmVzb3VyY2VzOwotCi0gICAgQU5HTEVSZXNvdXJjZXMu
TWF4VmVydGV4QXR0cmlicyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6
Ok1BWF9WRVJURVhfQVRUUklCUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleEF0dHJpYnMpOwot
ICAgIEFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJ
bnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMsICZB
TkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhVbmlmb3JtVmVjdG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJj
ZXMuTWF4VmFyeWluZ1ZlY3RvcnMgPSAwOwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4
dDNEOjpNQVhfVkFSWUlOR19WRUNUT1JTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmFyeWluZ1ZlY3Rv
cnMpOwotICAgIEFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFRleHR1cmVJbWFnZVVuaXRzID0gMDsK
LSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9URVhUVVJFX0lN
QUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMpOwot
ICAgIEFOR0xFUmVzb3VyY2VzLk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAg
IGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfQ09NQklORURfVEVYVFVSRV9JTUFH
RV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heENvbWJpbmVkVGV4dHVyZUltYWdlVW5pdHMpOwot
ICAgIEFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzID0gMDsKLSAgICBnZXRJbnRl
Z2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJl
c291cmNlcy5NYXhUZXh0dXJlSW1hZ2VVbml0cyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4RnJh
Z21lbnRVbmlmb3JtVmVjdG9ycyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0
M0Q6Ok1BWF9GUkFHTUVOVF9VTklGT1JNX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5NYXhGcmFn
bWVudFVuaWZvcm1WZWN0b3JzKTsKLQotICAgIC8vIEFsd2F5cyBzZXQgdG8gMSBmb3IgT3BlbkdM
IEVTLgotICAgIEFOR0xFUmVzb3VyY2VzLk1heERyYXdCdWZmZXJzID0gMTsKLSAgICAKLSAgICBt
X2NvbXBpbGVyLnNldFJlc291cmNlcyhBTkdMRVJlc291cmNlcyk7Ci0gICAgCi0gICAgOjpnbEVu
YWJsZShHTF9WRVJURVhfUFJPR1JBTV9QT0lOVF9TSVpFKTsKLSAgICA6OmdsQ2xlYXJDb2xvcigw
LCAwLCAwLCAwKTsKLX0KLQotR3JhcGhpY3NDb250ZXh0M0Q6On5HcmFwaGljc0NvbnRleHQzRCgp
Ci17Ci0gICAgaWYgKG1fY29udGV4dE9iaikgewotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4
dChtX2NvbnRleHRPYmopOwotICAgICAgICA6OmdsRGVsZXRlVGV4dHVyZXMoMSwgJm1fdGV4dHVy
ZSk7Ci0gICAgICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICAgICAgOjpnbERl
bGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAg
ICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAg
ICAgICAgOjpnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0
ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgOjpnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAm
bV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9h
dHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgOjpnbERlbGV0
ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgfQot
ICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX2Zibyk7Ci0gICAgICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KDApOwotICAgICAgICBDR0xEZXN0cm95Q29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIH0KLX0KLQogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRy
aWJ1dGVzKCkKIHsKICAgICBjb25zdCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2Fz
dDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9FWFRFTlNJT05TKSk7CkBAIC0yNTMsMTEg
Kzc1LDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dAogICAgIG1f
YXR0cnMucHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZTsKIH0KIAotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6bWFrZUNvbnRleHRDdXJyZW50KCkKLXsKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dCht
X2NvbnRleHRPYmopOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmlu
Z1Jlc3VsdHNUb0NhbnZhcyhDYW52YXNSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0KQogewogICAg
IEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXMgPSBjb250ZXh0LT5jYW52YXMoKTsKQEAgLTMwNiwy
MSArMTIzLDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdSZQogICAg
ICAgICAgICAgICAgICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFnZUJ1
ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7CiB9CiAKLWJvb2wgR3JhcGhpY3ND
b250ZXh0M0Q6OmlzR0xFUzJDb21wbGlhbnQoKSBjb25zdAotewotICAgIHJldHVybiBmYWxzZTsK
LX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25zdAot
ewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFcnJv
ckdlbmVyYXRlZE9uT3V0T2ZCb3VuZHNBY2Nlc3NlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwgaW50
IGhlaWdodCkKIHsKICAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09
IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0T2JqKQpAQCAtNDUyLDE5ICsyNTQsOSBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0CiAgICAgOjpnbEZsdXNoKCk7
CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRleHRPYmogY29u
dGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0g
ICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7
Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCi0gICAgICAgIENHTFNldEN1cnJl
bnRDb250ZXh0KGNvbnRleHQpOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJl
VGV4dHVyZSgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKICAgICAgICAgOjpnbEJp
bmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZC
Tyk7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9F
WFQsIG1fZmJvKTsKQEAgLTQ3Niw3ICsyNjgsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
cmVwYXJlVGV4dHVyZSgpCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmFjdGl2ZVRleHR1cmUo
dW5zaWduZWQgbG9uZyB0ZXh0dXJlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7
CiB9CiAKQEAgLTQ4NCwyNyArMjc2LDI3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmF0dGFj
aFNoYWRlcihQbGEKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7CiAgICAgQVNTRVJUKHNoYWRlcik7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsQXR0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbihQbGF0Zm9y
bTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFt
ZSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChH
THVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9y
bTNET2JqZWN0IGJ1ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkg
YnVmZmVyKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1
aW50IGZibzsKICAgICBpZiAoYnVmZmVyKQogICAgICAgICBmYm8gPSAoR0x1aW50KWJ1ZmZlcjsK
QEAgLTUxOCwxMDYgKzMxMCwxMDYgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1l
YnVmZmVyKAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6
Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgKEdMdWludCkgcmVuZGVyYnVmZmVyKTsKIH0K
IAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRh
cmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJpbmRUZXh0dXJlKHRh
cmdldCwgKEdMdWludCkgdGV4dHVyZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJs
ZW5kQ29sb3IoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFs
cGhhKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbEJsZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRp
Y19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGFscGhhKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1
YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQmxlbmRFcXVhdGlvbihtb2Rl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKHVu
c2lnbmVkIGxvbmcgbW9kZVJHQiwgdW5zaWduZWQgbG9uZyBtb2RlQWxwaGEpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
QmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7CiB9CiAKIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWdu
ZWQgbG9uZyBkZmFjdG9yKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsK
IH0gICAgICAgCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVu
c2lnbmVkIGxvbmcgc3JjUkdCLCB1bnNpZ25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBz
cmNBbHBoYSwgdW5zaWduZWQgbG9uZyBkc3RBbHBoYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xCbGVuZEZ1bmNTZXBh
cmF0ZShzcmNSR0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUs
IHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUs
IDAsIHVzYWdlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNp
Z25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxv
bmcgdXNhZ2UpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBs
b25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAg
ICAgOjpnbEJ1ZmZlclN1YkRhdGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwogfQogCiB1
bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVu
c2lnbmVkIGxvbmcgdGFyZ2V0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3Rh
dHVzRVhUKHRhcmdldCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29sb3Io
ZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXJD
b2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ2xlYXIo
bWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgoZG91YmxlIGRl
cHRoKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbENsZWFyU3RlbmNpbChzKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdy
ZWVuLCBib29sIGJsdWUsIGJvb2wgYWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsQ29sb3JNYXNrKHJlZCwgZ3Jl
ZW4sIGJsdWUsIGFscGhhKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNo
YWRlcihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAg
ICAgaW50IEdMc2hhZGVyVHlwZTsKICAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKQEAg
LTY2OCw3ICs0NjAsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBs
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25nIHgs
IGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcg
Ym9yZGVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9t
dWx0aXNhbXBsZUZCTykgewogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURf
RlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKICAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwpAQCAtNjgyLDcgKzQ3
NCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHUKIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGxvbmcgbGV2ZWwsIGxvbmcgeG9mZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwg
dW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBpZiAobV9h
dHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVGQk8pOwogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJB
TUVCVUZGRVJfRVhULCBtX2Zibyk7CkBAIC02OTYsMjUgKzQ4OCwyNSBAQCB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1
bGxGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRlcHRoTWFzayhib29sIGZsYWcpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpG
YXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsRGVwdGhSYW5nZSh6TmVhciwgekZhcik7CiB9CiAKQEAgLTcyMiw2MSAr
NTE0LDYxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRldGFjaFNoYWRlcihQbGEKIHsKICAg
ICBBU1NFUlQocHJvZ3JhbSk7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGV0YWNoU2hh
ZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRGlzYWJs
ZShjYXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmli
QXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0cmli
QXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJyYXlzKHVu
c2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xEcmF3
QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVu
c2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRHJhd0VsZW1lbnRzKG1v
ZGUsIGNvdW50LCB0eXBlLCByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRw
dHJfdD4ob2Zmc2V0KSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGUodW5z
aWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRW5hYmxlKGNhcCk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEZpbmlzaCgpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRmx1c2goKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJi
dWZmZXJ0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0x1aW50IHJlbmRl
cmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsKICAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9T
VEVOQ0lMX0FUVEFDSE1FTlQpIHsKICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVy
RVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJi
dWZmZXIpOwpAQCAtNzg3LDE5ICs1NzksMTkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJh
bWVidWZmZXJSZW5kZQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1
cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNp
Z25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBsb25nIGxldmVs
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwg
dGV4dGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJlLCBsZXZlbCk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmZyb250RmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsRnJvbnRG
YWNlKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5lcmF0ZU1pcG1hcCh1
bnNpZ25lZCBsb25nIHRhcmdldCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQp
OwogfQogCkBAIC04MDksNyArNjAxLDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0
aXZlQXR0cmliKAogICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdMaW50IG1heEF0dHJpYnV0ZVNpemUgPSAw
OwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xf
QUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6ZSk7CiAgICAgR0xj
aGFyIG5hbWVbbWF4QXR0cmlidXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xF
TkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCkBAIC04MzEsNyArNjIzLDcgQEAgYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybQogICAgICAgICBzeW50aGVzaXplR0xF
cnJvcihJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIEdM
aW50IG1heFVuaWZvcm1TaXplID0gMDsKICAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0
PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlm
b3JtU2l6ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVf
VU5JRk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KQEAgLTg1Myw3ICs2
NDUsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRhY2hlZFNoYWRlCiAgICAgICAg
IHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwogICAgICAgICByZXR1cm47CiAgICAg
fQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbEdldEF0dGFjaGVkU2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0p
LCBtYXhDb3VudCwgY291bnQsIHNoYWRlcnMpOwogfQogCkBAIC04NjEsOCArNjUzLDggQEAgaW50
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJMb2NhdGlvbgogewogICAgIGlmICghcHJvZ3Jh
bSkKICAgICAgICAgcmV0dXJuIC0xOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxv
Y2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7CiB9CiAKQEAgLTg4
MCwxOSArNjcyLDE5IEBAIHVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm8K
ICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsK
IH0KIAogU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBu
YW1lKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgcmV0dXJuIFN0cmluZygoY29uc3QgY2hhciopIDo6Z2xHZXRTdHJpbmcobmFt
ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpoaW50KHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwog
fQogCkBAIC05MDAsMTQgKzY5MiwxNCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0J1ZmZl
cihQbGF0Zm9yCiB7CiAgICAgaWYgKCFidWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0
KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIpOwogfQogCiBib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBy
ZXR1cm4gOjpnbElzRW5hYmxlZChjYXApOwogfQogCkBAIC05MTUsOCArNzA3LDggQEAgYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcihQbAogewogICAgIGlmICghZnJhbWVidWZm
ZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0ZyYW1l
YnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKIH0KIApAQCAtOTI0LDggKzcxNiw4IEBA
IGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm8KIHsKICAgICBpZiAoIXBy
b2dyYW0pCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1By
b2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKQEAgLTkzMyw4ICs3MjUsOCBAQCBib29sIEdy
YXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcihQCiB7CiAgICAgaWYgKCFyZW5kZXJidWZm
ZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIDo6Z2xJc1JlbmRl
cmJ1ZmZlckVYVCgoR0x1aW50KSByZW5kZXJidWZmZXIpOwogfQogCkBAIC05NDIsOCArNzM0LDgg
QEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIoUGxhdGZvcgogewogICAgIGlmICgh
c2hhZGVyKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIHJldHVybiA6OmdsSXNT
aGFkZXIoKEdMdWludCkgc2hhZGVyKTsKIH0KIApAQCAtOTUxLDMzICs3NDMsMzMgQEAgYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBsYXRmbwogewogICAgIGlmICghdGV4dHVyZSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgo
R0x1aW50KSB0ZXh0dXJlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRo
KGRvdWJsZSB3aWR0aCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
ZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdp
ZHRoKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3Jt
M0RPYmplY3QgcHJvZ3JhbSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsTGlua1By
b2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBp
eGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcgcGFyYW0pCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsUGl4
ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9s
eWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3VibGUgdW5pdHMpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsUG9seWdv
bk9mZnNldChzdGF0aWNfY2FzdDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVu
aXRzKSk7CiB9CiAKQEAgLTk4NSw3ICs3NzcsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpy
ZWFkUGl4ZWxzKGxvbmcgCiB7CiAgICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2gg
Y2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKICAgICAvLyBhbGwgcHJl
dmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVs
cy4KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xGbHVzaCgpOwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5k
RkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVY
VChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CkBAIC0xMDAyLDEz
ICs3OTQsMTMgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKIHsKICAgICAvLyBG
SVhNRTogVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQg
dG8gaGF2ZSBpZmRlZnMgZm9yIHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIC8vOjpnbFJl
bGVhc2VTaGFkZXJDb21waWxlcigpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5k
ZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVy
bmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKICAgICBjYXNlIERFUFRIX1NURU5DSUw6CiAg
ICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CkBAIC0xMDI5
LDIxICs4MjEsMjEgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3Rvcgog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJv
b2wgaW52ZXJ0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgOjpnbFNhbXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2
YWx1ZSksIGludmVydCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9u
ZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlciwgY29uc3Qg
U3RyaW5nJiBzdHJpbmcpCiB7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAgICAgU2hh
ZGVyU291cmNlRW50cnkgZW50cnk7CiAKQEAgLTEwNTQsMjcwICs4NDYsMjcwIEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGEKIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9u
ZyBtYXNrKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAgICAgOjpnbFN0ZW5jaWxGdW5jKGZ1bmMsIHJlZiwgbWFzayk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJhdGUodW5zaWduZWQgbG9uZyBm
YWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2sp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQo
KTsKICAgICA6OmdsU3RlbmNpbE1hc2sobWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25n
IG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsU3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5z
aWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xTdGVuY2ls
T3AoZmFpbCwgemZhaWwsIHpwYXNzKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbE9wU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVu
c2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsU3RlbmNp
bE9wU2VwYXJhdGUoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1l
LCBmbG9hdCB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
ZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHN0
YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0
ZXhQYXJhbWV0ZXJpKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2YWx1ZSkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0
Pih2YWx1ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBs
b2NhdGlvbiwgZmxvYXQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxv
YXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXpl
LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxv
Y2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9u
LCB2MCwgdjEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcg
bG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0
aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihs
b25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVu
aWZvcm0zZihsb2NhdGlvbiwgdjAsIHYxLCB2Mik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0zZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsK
ICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpn
bFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxv
YXQgdjIsIGZsb2F0IHYzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFVuaWZvcm00Zihsb2NhdGlvbiwgdjAsIHYxLCB2
MiwgdjMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KGxvbmcgbG9j
YXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBu
ZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBz
aXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25n
IGxvY2F0aW9uLCBpbnQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTFpKGxvY2F0aW9uLCB2MCk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwg
YXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2Nh
dGlvbiwgaW50IHYwLCBpbnQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwg
djEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRp
b24sIGludCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMg
dG8gYmUgYSBtdWx0aXBsZSBvZiAyCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6ZSwg
YXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBsb2Nh
dGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRp
b24sIHYwLCB2MSwgdjIpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2
KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBs
ZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCi0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybTNpdihsb2Nh
dGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
NGkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MiwgaW50IHYzKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbFVuaWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBz
aXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsVW5pZm9ybTRpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJh
bnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGgg
bmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVW5pZm9ybU1hdHJpeDJmdihsb2Nh
dGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0
KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0
cmFuc3Bvc2UsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1h
dHJpeDRmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2Yg
MTYKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xVbmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFy
cmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKFBsYXRmb3JtM0RP
YmplY3QgcHJvZ3JhbSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xW
YWxpZGF0ZVByb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYjFmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjApCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwg
ZmxvYXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliMmYoaW5keCwgdjAsIHYxKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5k
eCwgZmxvYXQqIGFycmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xWZXJ0ZXhB
dHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAg
OjpnbFZlcnRleEF0dHJpYjNmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0
IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwg
djAsIHYxLCB2MiwgdjMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWI0ZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsVmVydGV4
QXR0cmliNGZ2KGluZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVy
dGV4QXR0cmliUG9pbnRlcih1bnNpZ25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwg
Ym9vbCBub3JtYWxpemVkLCB1bnNpZ25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZz
ZXQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRl
eHQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3Jt
YWxpemVkLCBzdHJpZGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0
cl90PihvZmZzZXQpKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZpZXdwb3J0KGxv
bmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgp
OwogICAgIDo6Z2xWaWV3cG9ydChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdM
aW50Pih5KSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVp
PihoZWlnaHQpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5z
aWduZWQgbG9uZyBwbmFtZSwgdW5zaWduZWQgY2hhciogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0Qm9v
bGVhbnYocG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVm
ZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUs
IGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFt
ZSwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWdu
ZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldEZsb2F0dihwbmFtZSwg
dmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFj
aG1lbnRQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRh
Y2htZW50LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgaWYgKGF0dGFj
aG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQogICAgICAgICBhdHRhY2htZW50ID0g
REVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3Mu
CiAgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwg
YXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKQEAgLTEzMzIsNyArMTEyNCw3IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEludGVnZXJ2KHVuc2kKICAgICAvLyBiZWNhdXNlIGRlc2t0b3Ag
R0wncyBjb3JyZXNwb25kaW5nIHF1ZXJpZXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50
cwogICAgIC8vIHdoZXJlYXMgR0xFUzIgcmV0dXJuIHRoZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFj
aCB2ZWN0b3IgaGFzIDQgY29tcG9uZW50cykuCiAgICAgLy8gVGhlcmVmb3JlLCB0aGUgdmFsdWUg
cmV0dXJuZWQgYnkgZGVza3RvcCBHTCBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICBzd2l0
Y2ggKHBuYW1lKSB7CiAgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoK
ICAgICAgICAgKnZhbHVlID0gR0xfUkdCOwpAQCAtMTM1OSwxNSArMTE1MSwxNSBAQCB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcg
cG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dy
YW0sIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJv
Z3JhbUluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQogewogICAgIEFTU0VSVChwcm9n
cmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBlbnN1
cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdM
dWludCkgcHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKICAgICAKQEAgLTEz
ODQsMTYgKzExNzYsMTYgQEAgU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5m
bwogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIHBuYW1lLCB2YWx1
ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KFBsYXRmb3JtM0RP
YmplY3Qgc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewogICAgIEFT
U0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICAKKworICAgIGVuc3VyZUNvbnRleHQoKTsKKwogICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVj
dCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1h
cC5maW5kKHNoYWRlcik7CiAgICAgCiAgICAgc3dpdGNoIChwbmFtZSkgewpAQCAtMTQwMywyNSAr
MTE5NSwyNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0CiAgICAg
ICAgIAogICAgICAgICAgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgcG5hbWUs
IHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwotCisgICAgICAgIAogICAgICAgICBjYXNlIENP
TVBJTEVfU1RBVFVTOgogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1h
cC5lbmQoKSkgewogICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50Pihm
YWxzZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQotICAgICAgICAg
ICAgICAgIAorICAgICAgICAKICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50
PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgCisgICAgICAgIAogICAgICAgICBjYXNlIElORk9fTE9HX0xFTkdUSDoKICAgICAgICAgICAg
IGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKICAgICAgICAgICAgICAg
ICAoKnZhbHVlKSA9IDA7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQot
ICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJJ
bmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAg
IAorICAgICAgICAKICAgICAgICAgY2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKICAgICAgICAg
ICAgICgqdmFsdWUpID0gZ2V0U2hhZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7CiAgICAgICAg
ICAgICBicmVhazsKQEAgLTE0MzUsNyArMTIyNyw3IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQz
RDo6Z2V0U2hhZGVySW5mb0wKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgR0xpbnQgbGVu
Z3RoOwogICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xF
TkdUSCwgJmxlbmd0aCk7CiAKQEAgLTE0NzAsNyArMTI2Miw3IEBAIFN0cmluZyBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAKICAgICBI
YXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVz
dWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwogCkBAIC0xNDgzLDUyICsxMjc1
LDUyIEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQs
IHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIDo6Z2xHZXRUZXhQYXJh
bWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25n
IHBuYW1lLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwg
cG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7
CiAgICAgOjpnbEdldFVuaWZvcm1mdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9i
amVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgOjpnbEdldFVu
aWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwogfQogCiBsb25nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCiB7CiAgICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsK
ICAgICByZXR1cm4gOjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1l
LnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhB
dHRyaWJmdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCog
dmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNv
bnRleHQoKTsKICAgICA6OmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVk
IGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICA6Omds
R2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIGxvbmcgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk9mZnNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1
bnNpZ25lZCBsb25nIHBuYW1lKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICAKKyAgICBlbnN1cmVDb250ZXh0KCk7CisKICAgICB2b2lkKiBwb2ludGVyOwogICAgIDo6
Z2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRleCwgcG5hbWUsICZwb2ludGVyKTsKICAgICBy
ZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxsb25nPihwb2ludGVyKTsKQEAgLTE1MzYsNyArMTMyOCw3
IEBAIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk8KIAogaW50IEdyYXBo
aWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWws
IHVuc2lnbmVkIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0
LCB1bnNpZ25lZCBib3JkZXIsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCog
cGl4ZWxzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVD
b250ZXh0KCk7CiAKICAgICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZv
cm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CiAgICAg
cmV0dXJuIDA7CkBAIC0xNTQ0LDcgKzEzMzYsNyBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eEltYWdlMkQodW5zaWduCiAKIGludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1
bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNpZ25lZCB5
b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3JtYXQsIHVu
c2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogCiAgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVl
ZCB0byBkZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2Ug
YnVmZmVycyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCiAgICAgOjpnbFRleFN1
YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0
LCB0eXBlLCBwaXhlbHMpOwpAQCAtMTU1Myw3ICsxMzQ1LDcgQEAgaW50IEdyYXBoaWNzQ29udGV4
dDNEOjp0ZXhTdWJJbWFnZTJEKHVucwogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3Jl
YXRlQnVmZmVyKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5z
dXJlQ29udGV4dCgpOwogICAgIEdMdWludCBvOwogICAgIGdsR2VuQnVmZmVycygxLCAmbyk7CiAg
ICAgcmV0dXJuIG87CkBAIC0xNTYxLDcgKzEzNTMsNyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y3JlYXRlQnVmZmVyCiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVG
cmFtZWJ1ZmZlcigpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVu
c3VyZUNvbnRleHQoKTsKICAgICBHTHVpbnQgbzsKICAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgx
LCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTY5LDEzICsxMzYxLDEzIEBAIHVuc2lnbmVkIEdy
YXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWIKIAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmNyZWF0ZVByb2dyYW0oKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBlbnN1cmVDb250ZXh0KCk7CiAgICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwogfQog
CiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IEdMdWludCBvOwogICAgIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJu
IG87CkBAIC0xNTgzLDEzICsxMzc1LDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpj
cmVhdGVSZW5kZXIKIAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1
bnNpZ25lZCBsb25nIHR5cGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKICAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0g
RlJBR01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIp
OwogfQogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGVuc3VyZUNvbnRleHQoKTsKICAg
ICBHTHVpbnQgbzsKICAgICBnbEdlblRleHR1cmVzKDEsICZvKTsKICAgICByZXR1cm4gbzsKQEAg
LTE1OTcsMzcgKzEzODksMzcgQEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRl
eHR1cgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVm
ZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBlbnN1cmVDb250
ZXh0KCk7CiAgICAgZ2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFtZWJ1ZmZlcikKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwog
ICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAg
IGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2lnbmVkIHJlbmRlcmJ1ZmZlcikKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRl
UmVuZGVyYnVmZmVyc0VYVCgxLCAmcmVuZGVyYnVmZmVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlU2hhZGVyKHVuc2lnbmVkIHNoYWRlcikKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlU2hh
ZGVyKHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUo
dW5zaWduZWQgdGV4dHVyZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOwogICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUpOwog
fQogCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQz
RE1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbQkocmV2aXNpb24gNjY3NzcpCisrKyBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbQkod29ya2luZyBjb3B5KQpAQCAt
MzEsMjEgKzMxLDIyIEBACiAKICNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgogCisjaW5jbHVk
ZSAiQU5HTEUvU2hhZGVyTGFuZy5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVyLmgiCiAjaW5jbHVk
ZSAiQXJyYXlCdWZmZXJWaWV3LmgiCi0jaW5jbHVkZSAiV2ViR0xPYmplY3QuaCIKICNpbmNsdWRl
ICJDYW52YXNSZW5kZXJpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8Q29yZUdyYXBoaWNzL0NHQml0
bWFwQ29udGV4dC5oPgogI2luY2x1ZGUgIkZsb2F0MzJBcnJheS5oIgogI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgogI2luY2x1ZGUgIkhUTUxDYW52YXNFbGVtZW50LmgiCiAjaW5jbHVkZSAi
SW1hZ2VCdWZmZXIuaCIKICNpbmNsdWRlICJJbnQzMkFycmF5LmgiCiAjaW5jbHVkZSAiTm90SW1w
bGVtZW50ZWQuaCIKLSNpbmNsdWRlICJVaW50OEFycmF5LmgiCi0jaW5jbHVkZSAiV2ViR0xMYXll
ci5oIgotI2luY2x1ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KICNpbmNsdWRl
IDxPcGVuR0wvQ0dMUmVuZGVyZXJzLmg+CiAjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjaW5jbHVk
ZSAiVWludDhBcnJheS5oIgorI2luY2x1ZGUgIldlYkdMTGF5ZXIuaCIKKyNpbmNsdWRlICJXZWJH
TE9iamVjdC5oIgogI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L0NTdHJpbmcuaD4KIApAQCAtMjI5LDgxICsyMzAsMTQgQEAgR3JhcGhpY3NDb250ZXh0M0Q6
On5HcmFwaGljc0NvbnRleHQzRCgpCiAgICAgfQogfQogCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp2YWxpZGF0ZUF0dHJpYnV0ZXMoKQotewotICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSBy
ZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMp
KTsKLSAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7Ci0gICAgICAgIGlmIChzdGQ6OnN0cnN0cihl
eHRlbnNpb25zLCAiR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIikpIHsKLSAgICAgICAgICAg
IGlmICghbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgICAgICBtX2F0dHJzLmRlcHRoID0gdHJ1
ZTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBtX2F0dHJzLnN0ZW5jaWwgPSBmYWxzZTsK
LSAgICB9Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIGJvb2wgaXNWYWxp
ZFZlbmRvciA9IHRydWU7Ci0gICAgICAgIC8vIEN1cnJlbnRseSBpbiBNYWMgd2Ugb25seSB0dXJu
IG9uIGFudGlhbGlhcyBpZiB2ZW5kb3IgaXMgTlZJRElBLgotICAgICAgICBjb25zdCBjaGFyKiB2
ZW5kb3IgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX1ZF
TkRPUikpOwotICAgICAgICBpZiAoIXN0ZDo6c3Ryc3RyKHZlbmRvciwgIk5WSURJQSIpKQotICAg
ICAgICAgICAgaXNWYWxpZFZlbmRvciA9IGZhbHNlOwotICAgICAgICBpZiAoIWlzVmFsaWRWZW5k
b3IgfHwgIXN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlz
YW1wbGUiKSkKLSAgICAgICAgICAgIG1fYXR0cnMuYW50aWFsaWFzID0gZmFsc2U7Ci0gICAgfQot
ICAgIC8vIEZJWE1FOiBpbnN0ZWFkIG9mIGVuZm9yY2luZyBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0
cnVlLCBpbXBsZW1lbnQgdGhlCi0gICAgLy8gY29ycmVjdCBiZWhhdmlvciB3aGVuIHByZW11bHRp
cGxpZWRBbHBoYSA9IGZhbHNlIGlzIHJlcXVlc3RlZC4KLSAgICBtX2F0dHJzLnByZW11bHRpcGxp
ZWRBbHBoYSA9IHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Om1ha2VDb250ZXh0
Q3VycmVudCgpCi17Ci0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdSZXN1bHRzVG9DYW52YXMo
Q2FudmFzUmVuZGVyaW5nQ29udGV4dCogY29udGV4dCkKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmVuc3VyZUNvbnRleHQoKQogewotICAgIEhUTUxDYW52YXNFbGVtZW50KiBjYW52YXMgPSBjb250
ZXh0LT5jYW52YXMoKTsKLSAgICBJbWFnZUJ1ZmZlciogaW1hZ2VCdWZmZXIgPSBjYW52YXMtPmJ1
ZmZlcigpOwotCi0gICAgaW50IHJvd0J5dGVzID0gbV9jdXJyZW50V2lkdGggKiA0OwotICAgIGlu
dCB0b3RhbEJ5dGVzID0gcm93Qnl0ZXMgKiBtX2N1cnJlbnRIZWlnaHQ7Ci0KLSAgICBPd25BcnJh
eVB0cjx1bnNpZ25lZCBjaGFyPiBwaXhlbHMobmV3IHVuc2lnbmVkIGNoYXJbdG90YWxCeXRlc10p
OwotICAgIGlmICghcGl4ZWxzKQorICAgIGlmICghbV9jb250ZXh0T2JqKQogICAgICAgICByZXR1
cm47CiAKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAgYm9v
bCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBt
X211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFX
X0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhU
KDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdp
ZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0g
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
Ci0gICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBp
ZiAobV9ib3VuZEZCTyAhPSBtX2ZibykgewotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0
cnVlOwotICAgICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fZmJvKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEdMaW50IHBhY2tBbGlnbm1lbnQg
PSA0OwotICAgIGJvb2wgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gZmFsc2U7Ci0gICAgOjpn
bEdldEludGVnZXJ2KEdMX1BBQ0tfQUxJR05NRU5ULCAmcGFja0FsaWdubWVudCk7Ci0gICAgaWYg
KHBhY2tBbGlnbm1lbnQgPiA0KSB7Ci0gICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FM
SUdOTUVOVCwgNCk7Ci0gICAgICAgIG11c3RSZXN0b3JlUGFja0FsaWdubWVudCA9IHRydWU7Ci0g
ICAgfQotCi0gICAgOjpnbFJlYWRQaXhlbHMoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVu
dEhlaWdodCwgR0xfQkdSQSwgR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLCBwaXhlbHMuZ2V0
KCkpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlUGFja0FsaWdubWVudCkKLSAgICAgICAgOjpnbFBp
eGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCBwYWNrQWxpZ25tZW50KTsKLQotICAgIGlmICht
dXN0UmVzdG9yZUZCTykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIG1fYm91bmRGQk8pOwotCi0gICAgcGFpbnRUb0NhbnZhcyhwaXhlbHMuZ2V0KCks
IG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBjYW52
YXMtPndpZHRoKCksIGNhbnZhcy0+aGVpZ2h0KCksIGltYWdlQnVmZmVyLT5jb250ZXh0KCktPnBs
YXRmb3JtQ29udGV4dCgpKTsKKyAgICBDR0xDb250ZXh0T2JqIGN1cnJlbnRDb250ZXh0ID0gQ0dM
R2V0Q3VycmVudENvbnRleHQoKTsKKyAgICBpZiAoY3VycmVudENvbnRleHQgIT0gbV9jb250ZXh0
T2JqKQorICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwogfQogCiBi
b29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMyQ29tcGxpYW50KCkgY29uc3QKQEAgLTMyMCwx
MzQzICsyNTQsNyBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Vycm9yR2VuZXJhdGVkCiB7
CiAgICAgcmV0dXJuIGZhbHNlOwogfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBl
KGludCB3aWR0aCwgaW50IGhlaWdodCkKLXsKLSAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lk
dGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0T2JqKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgbV9jdXJyZW50V2lkdGggPSB3aWR0aDsKLSAgICBtX2N1cnJl
bnRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgCi0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICAKLSAgICBHTHVpbnQgaW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JGb3Jt
YXQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gMDsKLSAgICBpZiAobV9hdHRycy5hbHBo
YSkgewotICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCQTg7Ci0gICAgICAgIGNv
bG9yRm9ybWF0ID0gR0xfUkdCQTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnRlcm5hbENvbG9y
Rm9ybWF0ID0gR0xfUkdCODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0I7Ci0gICAgfQot
ICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAvLyBX
ZSBkb24ndCBhbGxvdyB0aGUgbG9naWMgd2hlcmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQgZGVw
dGggaXMgbm90LgotICAgICAgICAvLyBTZWUgR3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0b3Iu
Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgJiYgbV9hdHRycy5kZXB0aCkKLSAgICAgICAg
ICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7
Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0g
R0xfREVQVEhfQ09NUE9ORU5UOwotICAgIH0KLQotICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBm
YWxzZTsKLQotICAgIC8vIHJlc2l6ZSBtdWx0aXNhbXBsZSBGQk8KLSAgICBpZiAobV9hdHRycy5h
bnRpYWxpYXMpIHsKLSAgICAgICAgR0xpbnQgbWF4U2FtcGxlQ291bnQ7Ci0gICAgICAgIDo6Z2xH
ZXRJbnRlZ2VydihHTF9NQVhfU0FNUExFU19FWFQsICZtYXhTYW1wbGVDb3VudCk7Ci0gICAgICAg
IEdMaW50IHNhbXBsZUNvdW50ID0gc3RkOjptaW4oOCwgbWF4U2FtcGxlQ291bnQpOwotICAgICAg
ICBpZiAoc2FtcGxlQ291bnQgPiBtYXhTYW1wbGVDb3VudCkKLSAgICAgICAgICAgIHNhbXBsZUNv
dW50ID0gbWF4U2FtcGxlQ291bnQ7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVsdGlz
YW1wbGVGQk8pIHsKLSAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVC
VUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgICAgIG11c3RSZXN0b3JlRkJP
ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9S
RU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOwotICAgICAgICA6Omds
UmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNh
bXBsZUNvdW50LCBpbnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAg
OjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09M
T1JfQVRUQUNITUVOVDBfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29s
b3JCdWZmZXIpOwotICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgp
IHsKLSAgICAgICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgOjpnbFJl
bmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1w
bGVDb3VudCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAg
ICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKLSAgICAgICAgICAgICAgICA6OmdsRnJhbWVi
dWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFD
SE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2ls
QnVmZmVyKTsKLSAgICAgICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgICAg
IDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RF
UFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVw
dGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZl
ckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAwKTsKLSAgICAgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1
ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBM
RVRFX0VYVCkgewotICAgICAgICAgICAgLy8gRklYTUU6IGNsZWFudXAuCi0gICAgICAgICAgICBu
b3RJbXBsZW1lbnRlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gcmVzaXplIHJlZ3Vs
YXIgRkJPCi0gICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKLSAgICAgICAgbXVzdFJlc3Rv
cmVGQk8gPSB0cnVlOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOwotICAgIH0KLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8y
RCwgbV90ZXh0dXJlKTsKLSAgICA6OmdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRl
cm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5TSUdO
RURfQllURSwgMCk7Ci0gICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3RleHR1
cmUsIDApOwotICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKLSAgICBpZiAo
IW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkp
IHsKLSAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwg
bV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVY
VChHTF9SRU5ERVJCVUZGRVJfRVhULCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgs
IGhlaWdodCk7Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAgICAgICAgICA6Omds
RnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lM
X0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZl
cik7Ci0gICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQotICAgICAgICAgICAgOjpnbEZyYW1lYnVm
ZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVO
VF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAg
ICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7Ci0gICAg
fQotICAgIGlmIChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
KSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKLSAgICAgICAgLy8gRklYTUU6IGNs
ZWFudXAKLSAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICB9Ci0KLSAgICBpZiAobV9hdHRy
cy5hbnRpYWxpYXMpIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICBpZiAobV9ib3VuZEZCTyA9PSBt
X211bHRpc2FtcGxlRkJPKQotICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKLSAg
ICB9Ci0KLSAgICAvLyBJbml0aWFsaXplIHJlbmRlcmJ1ZmZlcnMgdG8gMC4KLSAgICBHTGJvb2xl
YW4gY29sb3JNYXNrW10gPSB7R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0sIGRl
cHRoTWFzayA9IEdMX1RSVUUsIHN0ZW5jaWxNYXNrID0gR0xfVFJVRTsKLSAgICBHTGJvb2xlYW4g
aXNTY2lzc29yRW5hYmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYm9vbGVhbiBpc0RpdGhlckVuYWJs
ZWQgPSBHTF9GQUxTRTsKLSAgICBHTGJpdGZpZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JVRkZF
Ul9CSVQ7Ci0gICAgOjpnbEdldEJvb2xlYW52KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JNYXNr
KTsKLSAgICA6OmdsQ29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUp
OwotICAgIGlmIChtX2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9E
RVBUSF9XUklURU1BU0ssICZkZXB0aE1hc2spOwotICAgICAgICA6OmdsRGVwdGhNYXNrKEdMX1RS
VUUpOwotICAgICAgICBjbGVhck1hc2sgfD0gR0xfREVQVEhfQlVGRkVSX0JJVDsKLSAgICB9Ci0g
ICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewotICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfU1RF
TkNJTF9XUklURU1BU0ssICZzdGVuY2lsTWFzayk7Ci0gICAgICAgIDo6Z2xTdGVuY2lsTWFzayhH
TF9UUlVFKTsKLSAgICAgICAgY2xlYXJNYXNrIHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsKLSAg
ICB9Ci0gICAgaXNTY2lzc29yRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9URVNU
KTsKLSAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGlzRGl0aGVyRW5hYmxl
ZCA9IDo6Z2xJc0VuYWJsZWQoR0xfRElUSEVSKTsKLSAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIp
OwotCi0gICAgOjpnbENsZWFyKGNsZWFyTWFzayk7Ci0KLSAgICA6OmdsQ29sb3JNYXNrKGNvbG9y
TWFza1swXSwgY29sb3JNYXNrWzFdLCBjb2xvck1hc2tbMl0sIGNvbG9yTWFza1szXSk7Ci0gICAg
aWYgKG1fYXR0cnMuZGVwdGgpCi0gICAgICAgIDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsKLSAg
ICBpZiAobV9hdHRycy5zdGVuY2lsKQotICAgICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNpbE1h
c2spOwotICAgIGlmIChpc1NjaXNzb3JFbmFibGVkKQotICAgICAgICA6OmdsRW5hYmxlKEdMX1ND
SVNTT1JfVEVTVCk7Ci0gICAgZWxzZQotICAgICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RF
U1QpOwotICAgIGlmIChpc0RpdGhlckVuYWJsZWQpCi0gICAgICAgIDo6Z2xFbmFibGUoR0xfRElU
SEVSKTsKLSAgICBlbHNlCi0gICAgICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICBp
ZiAobXVzdFJlc3RvcmVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLQotICAgIDo6Z2xGbHVzaCgpOwotfQotCi1zdGF0
aWMgaW5saW5lIHZvaWQgZW5zdXJlQ29udGV4dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCi17Ci0g
ICAgaWYgKCFjb250ZXh0KQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIENHTENvbnRl
eHRPYmogY3VycmVudENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOwotICAgIGlmIChj
dXJyZW50Q29udGV4dCAhPSBjb250ZXh0KQotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChj
b250ZXh0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMpIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFt
ZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBt
X2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9M
SU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VY
VCwgbV9ib3VuZEZCTyk7Ci0gICAgfQotICAgIDo6Z2xGaW5pc2goKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSh1bnNpZ25lZCBsb25nIHRleHR1cmUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xBY3RpdmVUZXh0dXJlKHRl
eHR1cmUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFkZXIoUGxhdGZv
cm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBBU1NF
UlQocHJvZ3JhbSk7Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xBdHRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWlu
dCkgc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEF0dHJpYkxvY2F0
aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3Qg
U3RyaW5nJiBuYW1lKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9n
cmFtLCBpbmRleCwgbmFtZS51dGY4KCkuZGF0YSgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6YmluZEJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBi
dWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCaW5k
QnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVmZmVyKTsKLX0KLQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RP
YmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBH
THVpbnQgZmJvOwotICAgIGlmIChidWZmZXIpCi0gICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVy
OwotICAgIGVsc2UKLSAgICAgICAgZmJvID0gKG1fYXR0cnMuYW50aWFsaWFzID8gbV9tdWx0aXNh
bXBsZUZCTyA6IG1fZmJvKTsKLSAgICBpZiAoZmJvICE9IG1fYm91bmRGQk8pIHsKLSAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVCh0YXJnZXQsIGZibyk7Ci0gICAgICAgIG1fYm91bmRGQk8g
PSBmYm87Ci0gICAgfQotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVm
ZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRSZW5kZXJi
dWZmZXJFWFQodGFyZ2V0LCAoR0x1aW50KSByZW5kZXJidWZmZXIpOwotfQotCi0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmJpbmRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9y
bTNET2JqZWN0IHRleHR1cmUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xCaW5kVGV4dHVyZSh0YXJnZXQsIChHTHVpbnQpIHRleHR1cmUpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZENvbG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwg
ZG91YmxlIGJsdWUsIGRvdWJsZSBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEJsZW5kQ29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRp
Y19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRpY19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGFscGhhKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1
YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xCbGVuZEVxdWF0aW9uKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpibGVuZEVxdWF0aW9uU2VwYXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1
bnNpZ25lZCBsb25nIG1vZGVBbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEJsZW5kRXF1YXRpb25TZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOwot
fQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNm
YWN0b3IsIHVuc2lnbmVkIGxvbmcgZGZhY3RvcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRnVuYyhzZmFjdG9yLCBkZmFjdG9yKTsKLX0gICAgICAg
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxv
bmcgc3JjUkdCLCB1bnNpZ25lZCBsb25nIGRzdFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwg
dW5zaWduZWQgbG9uZyBkc3RBbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEJsZW5kRnVuY1NlcGFyYXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwg
ZHN0QWxwaGEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBz
aXplLCAwLCB1c2FnZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25l
ZCBsb25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIGRhdGEsIHVzYWdlKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YnVmZmVyU3ViRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBv
ZmZzZXQsIGludCBzaXplLCBjb25zdCB2b2lkKiBkYXRhKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQnVmZmVyU3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgc2l6
ZSwgZGF0YSk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmNoZWNrRnJh
bWVidWZmZXJTdGF0dXModW5zaWduZWQgbG9uZyB0YXJnZXQpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VCh0YXJnZXQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKGRvdWJs
ZSByLCBkb3VibGUgZywgZG91YmxlIGIsIGRvdWJsZSBhKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociks
IHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2Fz
dDxmbG9hdD4oYSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25l
ZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xDbGVhcihtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChk
b3VibGUgZGVwdGgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xDbGVhckRlcHRoKGRlcHRoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJT
dGVuY2lsKGxvbmcgcykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbENsZWFyU3RlbmNpbChzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JN
YXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBib29sIGJsdWUsIGJvb2wgYWxwaGEpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVl
biwgYmx1ZSwgYWxwaGEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hh
ZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIGludCBHTHNoYWRlclR5cGU7Ci0g
ICAgQU5HTEVTaGFkZXJUeXBlIHNoYWRlclR5cGU7Ci0KLSAgICBnbEdldFNoYWRlcml2KHNoYWRl
ciwgU0hBREVSX1RZUEUsICZHTHNoYWRlclR5cGUpOwotICAgIAotICAgIGlmIChHTHNoYWRlclR5
cGUgPT0gVkVSVEVYX1NIQURFUikKLSAgICAgICAgc2hhZGVyVHlwZSA9IFNIQURFUl9UWVBFX1ZF
UlRFWDsKLSAgICBlbHNlIGlmIChHTHNoYWRlclR5cGUgPT0gRlJBR01FTlRfU0hBREVSKQotICAg
ICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZUEVfRlJBR01FTlQ7Ci0gICAgZWxzZQotICAgICAg
ICByZXR1cm47IC8vIEludmFsaWQgc2hhZGVyIHR5cGUuCi0KLSAgICBIYXNoTWFwPFBsYXRmb3Jt
M0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJT
b3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJj
ZU1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgU2hhZGVyU291cmNlRW50cnkmIGVu
dHJ5ID0gcmVzdWx0LT5zZWNvbmQ7Ci0KLSAgICBTdHJpbmcgdHJhbnNsYXRlZFNoYWRlclNvdXJj
ZTsKLSAgICBTdHJpbmcgc2hhZGVySW5mb0xvZzsKLQotICAgIGJvb2wgaXNWYWxpZCA9IG1fY29t
cGlsZXIudmFsaWRhdGVTaGFkZXJTb3VyY2UoZW50cnkuc291cmNlLnV0ZjgoKS5kYXRhKCksIHNo
YWRlclR5cGUsIHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpOwotCi0gICAg
ZW50cnkubG9nID0gc2hhZGVySW5mb0xvZzsKLSAgICBlbnRyeS5pc1ZhbGlkID0gaXNWYWxpZDsK
LQotICAgIGlmICghaXNWYWxpZCkKLSAgICAgICAgcmV0dXJuOyAvLyBTaGFkZXIgZGlkbid0IHZh
bGlkYXRlLCBkb24ndCBtb3ZlIGZvcndhcmQgd2l0aCBjb21waWxpbmcgdHJhbnNsYXRlZCBzb3Vy
Y2UgICAgCi0KLSAgICBpbnQgdHJhbnNsYXRlZFNoYWRlckxlbmd0aCA9IHRyYW5zbGF0ZWRTaGFk
ZXJTb3VyY2UubGVuZ3RoKCk7Ci0KLSAgICBjb25zdCBDU3RyaW5nJiB0cmFuc2xhdGVkU2hhZGVy
Q1N0cmluZyA9IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UudXRmOCgpOwotICAgIGNvbnN0IGNoYXIq
IHRyYW5zbGF0ZWRTaGFkZXJQdHIgPSB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZy5kYXRhKCk7Ci0g
ICAgCi0gICAgOjpnbFNoYWRlclNvdXJjZSgoR0x1aW50KSBzaGFkZXIsIDEsICZ0cmFuc2xhdGVk
U2hhZGVyUHRyLCAmdHJhbnNsYXRlZFNoYWRlckxlbmd0aCk7Ci0gICAgCi0gICAgOjpnbENvbXBp
bGVTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKLSAgICAKLSAgICBpbnQgR0xDb21waWxlU3VjY2Vz
czsKLSAgICAKLSAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBDT01QSUxFX1NU
QVRVUywgJkdMQ29tcGlsZVN1Y2Nlc3MpOwotICAgIAotICAgIC8vIEFTU0VSVCB0aGF0IEFOR0xF
IGdlbmVyYXRlZCBHTFNMIHdpbGwgYmUgYWNjZXB0ZWQgYnkgT3BlbkdMCi0gICAgQVNTRVJUKEdM
Q29tcGlsZVN1Y2Nlc3MgPT0gR0xfVFJVRSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25l
ZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0
aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZC
TyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQo
R0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAg
ICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4
LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVB
Uik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBt
X2Zibyk7Ci0gICAgfQotICAgIDo6Z2xDb3B5VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRl
cm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKLSAgICBpZiAobV9hdHRy
cy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQotICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZC
Tyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwg
bG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBpZiAobV9hdHRycy5h
bnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Ci0gICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZG
RVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCAr
IHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9S
X0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQo
R0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgfQotICAgIDo6Z2xDb3B5VGV4U3ViSW1h
Z2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0
KTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2Ft
cGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxG
YWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEN1bGxGYWNlKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBmdW5jKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRGVwdGhGdW5jKGZ1bmMpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpkZXB0aE1hc2soYm9vbCBmbGFnKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6
RmFyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYXRmb3Jt
M0RPYmplY3QgcHJvZ3JhbSwgUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJU
KHByb2dyYW0pOwotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsRGV0YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQp
IHNoYWRlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQg
bG9uZyBjYXApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xE
aXNhYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhB
dHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25nIG1vZGUs
IGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2ln
bmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwg
Y291bnQsIHR5cGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90
PihvZmZzZXQpKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25l
ZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEVuYWJsZShjYXApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhB
dHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmluaXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmZsdXNoKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEZsdXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyUmVu
ZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQs
IHVuc2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVydGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZl
cikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IHJlbmRl
cmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsKLSAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9T
VEVOQ0lMX0FUVEFDSE1FTlQpIHsKLSAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVy
RVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJi
dWZmZXIpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBT
VEVOQ0lMX0FUVEFDSE1FTlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAg
ICB9IGVsc2UKLSAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwg
YXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRh
cmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwg
UGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBsb25nIGxldmVsKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0
LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChHTHVpbnQpIHRleHR1cmUsIGxldmVsKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJvbnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZyb250RmFjZShtb2Rl
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJhdGVNaXBtYXAodW5zaWduZWQg
bG9uZyB0YXJnZXQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRBY3RpdmVBdHRyaWIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25n
IGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIGZhbHNl
OwotICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbWF4
QXR0cmlidXRlU2l6ZSA9IDA7Ci0gICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVp
bnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgsICZtYXhBdHRyaWJ1
dGVTaXplKTsKLSAgICBHTGNoYXIgbmFtZVttYXhBdHRyaWJ1dGVTaXplXTsgLy8gR0xfQUNUSVZF
X0FUVFJJQlVURV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNp
emVpIG5hbWVMZW5ndGggPSAwOwotICAgIEdMaW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBl
ID0gMDsKLSAgICA6OmdsR2V0QWN0aXZlQXR0cmliKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3Jh
bSksIGluZGV4LCBtYXhBdHRyaWJ1dGVTaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBu
YW1lKTsKLSAgICBpZiAoIW5hbWVMZW5ndGgpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBp
bmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7Ci0gICAgaW5mby50eXBlID0gdHlw
ZTsKLSAgICBpbmZvLnNpemUgPSBzaXplOwotICAgIHJldHVybiB0cnVlOwotfQotICAgIAotYm9v
bCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybShQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCi17Ci0gICAgaWYg
KCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICBHTGludCBtYXhVbmlmb3JtU2l6ZSA9IDA7Ci0gICAgOjpnbEdldFByb2dyYW1p
dihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVO
R1RILCAmbWF4VW5pZm9ybVNpemUpOwotICAgIEdMY2hhciBuYW1lW21heFVuaWZvcm1TaXplXTsg
Ly8gR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9u
Ci0gICAgR0xzaXplaSBuYW1lTGVuZ3RoID0gMDsKLSAgICBHTGludCBzaXplID0gMDsKLSAgICBH
TGVudW0gdHlwZSA9IDA7Ci0gICAgOjpnbEdldEFjdGl2ZVVuaWZvcm0oc3RhdGljX2Nhc3Q8R0x1
aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heFVuaWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUs
ICZ0eXBlLCBuYW1lKTsKLSAgICBpZiAoIW5hbWVMZW5ndGgpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7Ci0gICAgaW5mby50
eXBlID0gdHlwZTsKLSAgICBpbmZvLnNpemUgPSBzaXplOwotICAgIHJldHVybiB0cnVlOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRhY2hlZFNoYWRlcnMoUGxhdGZvcm0zRE9i
amVjdCBwcm9ncmFtLCBpbnQgbWF4Q291bnQsIGludCogY291bnQsIHVuc2lnbmVkIGludCogc2hh
ZGVycykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3Io
SU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRBdHRhY2hlZFNoYWRlcnMoc3RhdGljX2Nhc3Q8
R0x1aW50Pihwcm9ncmFtKSwgbWF4Q291bnQsIGNvdW50LCBzaGFkZXJzKTsKLX0KLQotaW50IEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dy
YW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJl
dHVybiAtMTsKICAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0
dXJuIDo6Z2xHZXRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5k
YXRhKCkpOwotfQotCi1HcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKQotewotICAgIHJldHVybiBtX2F0dHJzOwotfQot
Ci11bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRFcnJvcigpCi17Ci0gICAgaWYg
KG1fc3ludGhldGljRXJyb3JzLnNpemUoKSA+IDApIHsKLSAgICAgICAgTGlzdEhhc2hTZXQ8dW5z
aWduZWQgbG9uZz46Oml0ZXJhdG9yIGl0ZXIgPSBtX3N5bnRoZXRpY0Vycm9ycy5iZWdpbigpOwot
ICAgICAgICB1bnNpZ25lZCBsb25nIGVyciA9ICppdGVyOwotICAgICAgICBtX3N5bnRoZXRpY0Vy
cm9ycy5yZW1vdmUoaXRlcik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKLX0K
LQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1l
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gU3RyaW5n
KChjb25zdCBjaGFyKikgOjpnbEdldFN0cmluZyhuYW1lKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9kZSkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEhpbnQodGFyZ2V0
LCBtb2RlKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZmZXIoUGxhdGZvcm0z
RE9iamVjdCBidWZmZXIpCi17Ci0gICAgaWYgKCFidWZmZXIpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6
Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNFbmFibGVkKGNhcCk7Ci19Ci0KLWJvb2wgR3Jh
cGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIoUGxhdGZvcm0zRE9iamVjdCBmcmFtZWJ1ZmZl
cikKLXsKLSAgICBpZiAoIWZyYW1lYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNGcmFt
ZWJ1ZmZlckVYVCgoR0x1aW50KSBmcmFtZWJ1ZmZlcik7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250
ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCi17Ci0gICAgaWYgKCFw
cm9ncmFtKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0p
OwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNE
T2JqZWN0IHJlbmRlcmJ1ZmZlcikKLXsKLSAgICBpZiAoIXJlbmRlcmJ1ZmZlcikKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICByZXR1cm4gOjpnbElzUmVuZGVyYnVmZmVyRVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Ci19
Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hh
ZGVyKQotewotICAgIGlmICghc2hhZGVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNTaGFkZXIo
KEdMdWludCkgc2hhZGVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJl
KFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKLXsKLSAgICBpZiAoIXRleHR1cmUpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xJc1RleHR1cmUoKEdMdWludCkgdGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmxpbmVXaWR0aChkb3VibGUgd2lkdGgpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHdpZHRoKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRm
b3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xMaW5rUHJvZ3JhbSgoR0x1aW50KSBwcm9n
cmFtKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGl4ZWxTdG9yZWkodW5zaWduZWQg
bG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbFBpeGVsU3RvcmVpKHBuYW1lLCBwYXJhbSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQoZG91YmxlIGZhY3RvciwgZG91YmxlIHVuaXRzKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUG9seWdvbk9mZnNl
dChzdGF0aWNfY2FzdDxmbG9hdD4oZmFjdG9yKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHks
IHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25n
IGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBlLCB2b2lkKiBkYXRhKQotewotICAgIC8vIEZJWE1F
OiByZW1vdmUgdGhlIHR3byBnbEZsdXNoIGNhbGxzIHdoZW4gdGhlIGRyaXZlciBidWcgaXMgZml4
ZWQsIGkuZS4sCi0gICAgLy8gYWxsIHByZXZpb3VzIHJlbmRlcmluZyBjYWxscyBzaG91bGQgYmUg
ZG9uZSBiZWZvcmUgcmVhZGluZyBwaXhlbHMuCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xGbHVzaCgpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsK
LSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWln
aHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xf
TElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEZsdXNoKCk7Ci0gICAgfQotICAgIDo6Z2xSZWFkUGl4
ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgZGF0YSk7Ci0gICAgaWYgKG1f
YXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAgICAg
ICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVGQk8pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGls
ZXIoKQotewotICAgIC8vIEZJWE1FOiBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBkZXNrdG9w
IE9wZW5HTC4gV2UgbmVlZCB0byBoYXZlIGlmZGVmcyBmb3IgdGhlIGRpZmZlcmVudCBHTCB2YXJp
YW50cwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAvLzo6Z2xSZWxlYXNl
U2hhZGVyQ29tcGlsZXIoKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVm
ZmVyU3RvcmFnZSh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZv
cm1hdCwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQp
IHsKLSAgICBjYXNlIERFUFRIX1NURU5DSUw6Ci0gICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xf
REVQVEgyNF9TVEVOQ0lMOF9FWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgREVQVEhfQ09N
UE9ORU5UMTY6Ci0gICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOwot
ICAgICAgICBicmVhazsKLSAgICBjYXNlIFJHQkE0OgotICAgIGNhc2UgUkdCNV9BMToKLSAgICAg
ICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0JBOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJH
QjU2NToKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0I7Ci0gICAgICAgIGJyZWFrOwot
ICAgIH0KLSAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVCh0YXJnZXQsIGludGVybmFsZm9y
bWF0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxl
Q292ZXJhZ2UoZG91YmxlIHZhbHVlLCBib29sIGludmVydCkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFNhbXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0
Pih2YWx1ZSksIGludmVydCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3Io
bG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2Npc3Nvcih4
LCB5LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVy
U291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCBjb25zdCBTdHJpbmcmIHN0cmluZykKLXsK
LSAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0KLSAgICBTaGFkZXJTb3VyY2VFbnRyeSBlbnRyeTsKLQotICAgIGVudHJ5LnNvdXJjZSA9
IHN0cmluZzsKLQotICAgIG1fc2hhZGVyU291cmNlTWFwLnNldChzaGFkZXIsIGVudHJ5KTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5j
LCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25n
IGZhY2UsIHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxGdW5j
U2VwYXJhdGUoZmFjZSwgZnVuYywgcmVmLCBtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c3RlbmNpbE1hc2sodW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbE1hc2sobWFzayk7Ci19Ci0KLXZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNl
LCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTdGVuY2lsTWFza1NlcGFyYXRlKGZhY2UsIG1hc2spOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3AodW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBs
b25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcg
ZmFjZSwgdW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBs
b25nIHpwYXNzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
U3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFpbCwgemZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVk
IHBuYW1lLCBmbG9hdCB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFRleFBhcmFtZXRlcmYodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHZhbHVlKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5z
aWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgaW50IHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1l
LCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTFmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQq
IGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm0xZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dW5pZm9ybTJmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2
MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0y
Zihsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTJmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJ
WE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCi0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJh
eSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9u
LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9h
dCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUg
YSBtdWx0aXBsZSBvZiAzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xVbmlmb3JtM2Z2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm00Zihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZs
b2F0IHYyLCBmbG9hdCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFVuaWZvcm00Zihsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwg
aW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxl
IG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm00
ZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTFpKGxvbmcgbG9jYXRpb24sIGludCB2MCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0xaShsb2NhdGlvbiwgdjApOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXks
IGludCBzaXplKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
VW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24s
IHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBs
b2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBu
ZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbFVuaWZvcm0yaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50
IHYxLCBpbnQgdjIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xVbmlmb3JtM2kobG9jYXRpb24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtM2l2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQot
ewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCi0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShs
b25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyLCBpbnQgdjMpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYw
LCB2MSwgdjIsIHYzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihs
b25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVu
Z3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24s
IGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1F
OiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0
cmFuc3Bvc2UsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1h
dHJpeDNmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2Yg
OQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1hdHJp
eDNmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bv
c2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVk
cyB0byBiZSBhIG11bHRpcGxlIG9mIDE2Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xVbmlmb3JtTWF0cml4NGZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFy
cmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IDo6Z2xVc2VQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp2YWxpZGF0ZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAg
IEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFZhbGlkYXRlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9h
dCB2MCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRl
eEF0dHJpYjFmKGluZHgsIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4
QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFy
cmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBp
bmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBm
bG9hdCB2MSwgZmxvYXQgdjIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQq
IGFycmF5KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVy
dGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZs
b2F0IHYyLCBmbG9hdCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbFZlcnRleEF0dHJpYjRmKGluZHgsIHYwLCB2MSwgdjIsIHYzKTsKLX0KLQotdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxv
YXQqIGFycmF5KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
VmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNpZ25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQg
dHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNpZ25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9u
ZyBvZmZzZXQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xW
ZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwg
cmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVu
c2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmlld3BvcnQoc3RhdGljX2Nhc3Q8R0xpbnQ+
KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KHdpZHRoKSwg
c3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0KSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxvbmcgcG5hbWUsIHVuc2lnbmVkIGNoYXIqIHZhbHVl
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0Qm9vbGVh
bnYocG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVy
UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGlu
dCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xH
ZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFs
dWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRGbG9h
dHYocG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVi
dWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVk
IGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQ
VEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQotICAgICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNI
TUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3MuCi0gICAgOjpnbEdl
dEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwg
cG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0SW50ZWdlcnYo
dW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICAvLyBOZWVkIHRvIGVtdWxh
dGUgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQvVFlQRSBmb3IgR0wuICBBbnkgdmFs
aWQKLSAgICAvLyBjb21iaW5hdGlvbiBzaG91bGQgd29yaywgYnV0IEdMX1JHQi9HTF9VTlNJR05F
RF9CWVRFIG1pZ2h0IGJlIHRoZSBtb3N0Ci0gICAgLy8gdXNlZnVsIGZvciBkZXNrdG9wIFdlYkdM
IHVzZXJzLgotICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBNQVhfRlJBR01FTlQvVkVSVEVYX1VOSUZP
Uk1fVkVDVE9SUyBhbmQgTUFYX1ZBUllJTkdfVkVDVE9SUwotICAgIC8vIGJlY2F1c2UgZGVza3Rv
cCBHTCdzIGNvcnJlc3BvbmRpbmcgcXVlcmllcyByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25l
bnRzCi0gICAgLy8gd2hlcmVhcyBHTEVTMiByZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzIChl
YWNoIHZlY3RvciBoYXMgNCBjb21wb25lbnRzKS4KLSAgICAvLyBUaGVyZWZvcmUsIHRoZSB2YWx1
ZSByZXR1cm5lZCBieSBkZXNrdG9wIEdMIG5lZWRzIHRvIGJlIGRpdmlkZWQgYnkgNC4KLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dpdGNoIChwbmFtZSkgewotICAgIGNh
c2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6Ci0gICAgICAgICp2YWx1ZSA9IEdM
X1JHQjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFE
X1RZUEU6Ci0gICAgICAgICp2YWx1ZSA9IEdMX1VOU0lHTkVEX0JZVEU7Ci0gICAgICAgIGJyZWFr
OwotICAgIGNhc2UgTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKLSAgICAgICAgOjpnbEdl
dEludGVnZXJ2KEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMsIHZhbHVlKTsKLSAg
ICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUFYX1ZFUlRFWF9V
TklGT1JNX1ZFQ1RPUlM6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VO
SUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAg
YnJlYWs7Ci0gICAgY2FzZSBNQVhfVkFSWUlOR19WRUNUT1JTOgotICAgICAgICA6OmdsR2V0SW50
ZWdlcnYoR0xfTUFYX1ZBUllJTkdfRkxPQVRTLCB2YWx1ZSk7Ci0gICAgICAgICp2YWx1ZSAvPSA0
OwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYo
cG5hbWUsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFBy
b2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGlu
dCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xH
ZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKLX0KLQotU3RyaW5n
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICBHTGludCBsZW5ndGg7Ci0gICAgOjpnbEdldFByb2dyYW1pdigo
R0x1aW50KSBwcm9ncmFtLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwotICAgIAotICAg
IEdMc2l6ZWkgc2l6ZTsKLSAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhs
ZW5ndGgpOwotICAgIGlmICghaW5mbykKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgOjpnbEdl
dFByb2dyYW1JbmZvTG9nKChHTHVpbnQpIHByb2dyYW0sIGxlbmd0aCwgJnNpemUsIGluZm8pOwot
ICAgIFN0cmluZyBzKGluZm8pOwotICAgIGZhc3RGcmVlKGluZm8pOwotICAgIHJldHVybiBzOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1
bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFJlbmRlcmJ1ZmZl
clBhcmFtZXRlcml2RVhUKHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Z2V0U2hhZGVyaXYoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVk
IGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIEhhc2hNYXA8UGxhdGZv
cm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRl
clNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0gICAgCi0gICAgc3dpdGNoIChwbmFtZSkgewotICAg
ICAgICBjYXNlIERFTEVURV9TVEFUVVM6Ci0gICAgICAgIGNhc2UgU0hBREVSX1RZUEU6Ci0gICAg
ICAgICAgICAvLyBMZXQgT3BlbkdMIGhhbmRsZSB0aGVzZS4KLSAgICAgICAgCi0gICAgICAgICAg
ICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBwbmFtZSwgdmFsdWUpOwotICAgICAg
ICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBDT01QSUxFX1NUQVRVUzoKLSAgICAgICAgICAg
IGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAg
ICAoKnZhbHVlKSA9IHN0YXRpY19jYXN0PGludD4oZmFsc2UpOwotICAgICAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICgqdmFs
dWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgSU5GT19MT0dfTEVOR1RIOgot
ICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgewotICAg
ICAgICAgICAgICAgICgqdmFsdWUpID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVy
SW5mb0xvZyhzaGFkZXIpLmxlbmd0aCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgY2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKLSAgICAgICAgICAgICgqdmFs
dWUpID0gZ2V0U2hhZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzeW50aGVzaXplR0xF
cnJvcihJTlZBTElEX0VOVU0pOwotICAgIH0KLX0KLQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRTaGFkZXJJbmZvTG9nKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQotewotICAgIEFTU0VS
VChzaGFkZXIpOwotCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50
IGxlbmd0aDsKLSAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xP
R19MRU5HVEgsICZsZW5ndGgpOwotCi0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFk
ZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQo
c2hhZGVyKTsKLQotICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCi0g
ICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgU2hhZGVyU291cmNlRW50cnkgZW50cnkgPSByZXN1
bHQtPnNlY29uZDsKLQotICAgICBpZiAoZW50cnkuaXNWYWxpZCkgewotICAgICAgICAgR0xpbnQg
bGVuZ3RoOwotICAgICAgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5G
T19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKLQotICAgICAgICAgR0xzaXplaSBzaXplOwotICAgICAg
ICAgR0xjaGFyKiBpbmZvID0gKEdMY2hhciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKLSAgICAgICAg
IGlmICghaW5mbykKLSAgICAgICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICAgICAgIDo6Z2xHZXRT
aGFkZXJJbmZvTG9nKChHTHVpbnQpIHNoYWRlciwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7Ci0KLSAg
ICAgICAgIFN0cmluZyBzKGluZm8pOwotICAgICAgICAgZmFzdEZyZWUoaW5mbyk7Ci0gICAgICAg
ICByZXR1cm4gczsKLSAgICAgfQotICAgICBlbHNlIHsKLSAgICAgICAgIHJldHVybiBlbnRyeS5s
b2c7Ci0gICAgIH0KLX0KLQotU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3Vy
Y2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICBIYXNoTWFwPFBsYXRmb3JtM0RP
YmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3Vy
Y2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1h
cC5lbmQoKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgcmV0dXJuIHJlc3VsdC0+c2Vjb25k
LnNvdXJjZTsKLX0KLQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJm
dih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVl
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4UGFy
YW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9u
ZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxv
Y2F0aW9uLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1p
dihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRVbmlmb3JtaXYo
KEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotbG9uZyBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VW5pZm9ybUxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29u
c3QgU3RyaW5nJiBuYW1lKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRp
b24oKEdMdWludCkgcHJvZ3JhbSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1
ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2ln
bmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihp
bmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVy
dGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIHZvaWQqIHBv
aW50ZXI7Ci0gICAgOjpnbEdldFZlcnRleEF0dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgJnBv
aW50ZXIpOwotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGxvbmc+KHBvaW50ZXIpOwotfQot
Ci1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNp
Z25lZCBsZXZlbCwgdW5zaWduZWQgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNp
Z25lZCBoZWlnaHQsIHVuc2lnbmVkIGJvcmRlciwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0
eXBlLCB2b2lkKiBwaXhlbHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
Ci0gICAgOjpnbFRleEltYWdlMkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRo
LCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotICAgIHJldHVybiAwOwot
fQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdlMkQodW5zaWduZWQgdGFyZ2V0
LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgeG9mZiwgdW5zaWduZWQgeW9mZiwgdW5zaWduZWQg
d2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2
b2lkKiBwaXhlbHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAg
Ly8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBkZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hl
biBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVycyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFn
ZSBzaXplCi0gICAgOjpnbFRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwg
d2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBlLCBwaXhlbHMpOwotICAgIHJldHVybiAwOwotfQot
Ci11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyKCkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5CdWZmZXJz
KDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmNyZWF0ZUZyYW1lYnVmZmVyKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm8pOwotICAgIHJl
dHVybiBvOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiBnbENyZWF0
ZVByb2dyYW0oKTsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRl
cmJ1ZmZlcigpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWlu
dCBvOwotICAgIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19
Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9u
ZyB0eXBlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4g
Z2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJBR01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NI
QURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQz
RDo6Y3JlYXRlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIEdMdWludCBvOwotICAgIGdsR2VuVGV4dHVyZXMoMSwgJm8pOwotICAgIHJldHVybiBvOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVy
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZUJ1ZmZl
cnMoMSwgJmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1l
YnVmZmVyKHVuc2lnbmVkIGZyYW1lYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICBnbERlbGV0ZUZyYW1lYnVmZmVyc0VYVCgxLCAmZnJhbWVidWZmZXIpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVQcm9ncmFtKHVuc2lnbmVkIHByb2dy
YW0pCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlUHJv
Z3JhbShwcm9ncmFtKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVy
YnVmZmVyKHVuc2lnbmVkIHJlbmRlcmJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgZ2xEZWxldGVSZW5kZXJidWZmZXJzRVhUKDEsICZyZW5kZXJidWZmZXIp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVTaGFkZXIodW5zaWduZWQgc2hh
ZGVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVNo
YWRlcihzaGFkZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVUZXh0dXJl
KHVuc2lnbmVkIHRleHR1cmUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRleHR1cmUpOwotfQotCi1pbnQgR3JhcGhpY3NDb250
ZXh0M0Q6OnNpemVJbkJ5dGVzKGludCB0eXBlKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAg
ICAgICBjYXNlIEdMX0JZVEU6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMYnl0ZSk7Ci0g
ICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllURToKLSAgICAgICAgICAgIHJldHVybiBzaXplb2Yo
R0x1Ynl0ZSk7Ci0gICAgICAgIGNhc2UgR0xfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6
ZW9mKEdMc2hvcnQpOwotICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX1NIT1JUOgotICAgICAgICAg
ICAgcmV0dXJuIHNpemVvZihHTHVzaG9ydCk7Ci0gICAgICAgIGNhc2UgR0xfSU5UOgotICAgICAg
ICAgICAgcmV0dXJuIHNpemVvZihHTGludCk7Ci0gICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5U
OgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVpbnQpOwotICAgICAgICBjYXNlIEdMX0ZM
T0FUOgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGZsb2F0KTsKLSAgICAgICAgZGVmYXVs
dDoKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c3ludGhlc2l6ZUdMRXJyb3IodW5zaWduZWQgbG9uZyBlcnJvcikKLXsKLSAgICBtX3N5
bnRoZXRpY0Vycm9ycy5hZGQoZXJyb3IpOwotfQogCiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66856</attachid>
            <date>2010-09-08 01:33:50 -0700</date>
            <delta_ts>2010-09-08 10:38:12 -0700</delta_ts>
            <desc>Moved into /mac, build only on Mac</desc>
            <filename>begin-gcd3d-refactor8</filename>
            <type>text/plain</type>
            <size>104472</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Njk1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYwIEBACisyMDEwLTA5LTA4ICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgbm9uLU1hYyBzcGVjaWZpYyBjb2RlIGludG8gR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuCisgICAgICAgIAorICAgICAgICBNb3ZpbmcgdGhpcyBmaWxlIGludG8gcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjIGZvciBub3csIGFuZCBvbmx5IGJ1aWxkaW5nIG9uIE1hYy4KKworICAgICAgICBO
byBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvajoKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTE9iamVjdDo6ZGVsZXRlT2JqZWN0KToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktpdEJyaWRnZS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmVuc3VyZUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmlzRXJyb3JHZW5lcmF0ZWRPbk91dE9mQm91bmRzQWNjZXNzZXMpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHA6IENvcGll
ZCBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbS4KKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRCdWZmZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmJsZW5kRXF1YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRGdW5jKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpibGVuZEZ1bmNTZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6YnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
YnVmZmVyU3ViRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2hl
Y2tGcmFtZWJ1ZmZlclN0YXR1cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Y2xlYXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xl
YXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpkZXB0aEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmRlcHRoTWFzayk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
ZGVwdGhSYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNo
U2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmli
QXJyYXkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdBcnJheXMp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZmluaXNoKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEFjdGl2ZVVuaWZvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmhpbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzQnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6aXNSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjppc1RleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmxpbmVXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6bGlu
a1Byb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3Rv
cmVpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3Jh
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1NlcGFyYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTFmKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtMWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtMmYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0y
ZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0yaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNp
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgyZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0ZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVzZVByb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliM2YpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliNGYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnZlcnRleEF0dHJpYjRmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6dmVydGV4QXR0cmliUG9pbnRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6dmlld3BvcnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEJvb2xlYW52KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZm
ZXJQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0
RmxvYXR2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1
ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0SW50ZWdlcnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1pdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Z2V0UHJvZ3JhbUluZm9Mb2cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVySW5mb0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVyU291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmdldFVuaWZvcm1mdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0VW5pZm9ybWl2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRVbmlmb3JtTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmdldFZlcnRleEF0dHJpYmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRWZXJ0ZXhBdHRyaWJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjp0ZXhJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Ojp0ZXhTdWJJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpj
cmVhdGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZUZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVh
dGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVS
ZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZVNoYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlQnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUHJvZ3JhbSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVTaGFkZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUpOgorCiAy
MDEwLTA5LTA4ICBab2x0YW4gSGVyY3plZyAgPHpoZXJjemVnQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRGlyayBTY2h1bHplLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDY2ODg3KQorKysgV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTUzNjksNiArNTM2
OSw3IEBACiAJCUZBQkU3MkZFMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQUJFNzJGQzEwNTlD
MjExMDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwICovOyB9OwogCQlGQUMxMkNDNDExMjBEQTY5
MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZBQzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5k
ZXJNYXRoTUxTdWJTdXAuY3BwICovOyB9OwogCQlGQUMxMkNDNTExMjBEQTY5MDBEQUNDMzYgLyog
UmVuZGVyTWF0aE1MU3ViU3VwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGQUMxMkNDMzExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3Vw
LmggKi87IH07CisJCUZCQzIyMEIxMTIzNzI5RTEwMEJDRjc4OCAvKiBHcmFwaGljc0NvbnRleHQz
RE9wZW5HTC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGQkMyMjBCMDEyMzcyOUUxMDBCQ0Y3ODggLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3Bw
ICovOyB9OwogCQlGRTZGRDQ4ODBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDg1MEY2NzZF
NTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CiAJCUZFNkZENDhEMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3Jk
aW5hdGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZFNkZENDhCMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmNwcCAqLzsgfTsKIAkJ
RkU2RkQ0OEUwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDhDMEY2NzZFOTMwMDA5Mjg3
MyAvKiBKU0Nvb3JkaW5hdGVzLmggKi87IH07CkBAIC0xMTI0MCw2ICsxMTI0MSw3IEBACiAJCUZB
QkU3MkZDMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBNYXRoTUxOYW1lcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUZBQzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJT
dXAuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWF0aE1M
U3ViU3VwLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkFDMTJDQzMxMTIwREE2
OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJNYXRoTUxTdWJTdXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJRkJDMjIwQjAxMjM3MjlFMTAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdM
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEdyYXBoaWNzQ29udGV4
dDNET3BlbkdMLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU0OUVGOTcwREM1
MTQ2MjAwNDI2NkUxIC8qIERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gdGV4dDsgcGF0aCA9IERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRTZGRDQ4NTBGNjc2RTU3MDAwOTI4NzMgLyog
Q29vcmRpbmF0ZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ29vcmRpbmF0
ZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU2RkQ0ODYwRjY3NkU1NzAwMDky
ODczIC8qIENvb3JkaW5hdGVzLmlkbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBDb29yZGluYXRl
cy5pZGw7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNTgzMCw2ICsxNTgzMiw3IEBA
CiAJCQkJQjJBRkZDNzgwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRNYWMubW0gKi8sCiAJCQkJQjJB
RkZDN0IwRDAwQTVDMTAwMzAwNzREIC8qIEdseXBoUGFnZVRyZWVOb2RlTWFjLmNwcCAqLywKIAkJ
CQk0OUZGQkYxQzExQzg1NTBFMDA2QTcxMTggLyogR3JhcGhpY3NDb250ZXh0M0RNYWMubW0gKi8s
CisJCQkJRkJDMjIwQjAxMjM3MjlFMTAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdM
LmNwcCAqLywKIAkJCQlCMjc3QjQwMzBCMjJGMzdDMDAwNEJFQzYgLyogR3JhcGhpY3NDb250ZXh0
TWFjLm1tICovLAogCQkJCTBGNTgwQjA0MEYxMkEyNTUwMDUxRDY4OSAvKiBHcmFwaGljc0xheWVy
Q0EuaCAqLywKIAkJCQkwRjU4MEIwMzBGMTJBMjU0MDA1MUQ2ODkgLyogR3JhcGhpY3NMYXllckNB
Lm1tICovLApAQCAtMjI4OTUsNiArMjI4OTgsNyBAQAogCQkJCTg5ODc4NUI4MTIyQ0EyQTcwMDNB
QUJEQSAvKiBKU01ldGFkYXRhQ2FsbGJhY2suY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODk4Nzg1
RjAxMjJFMUU4NzAwM0FBQkRBIC8qIEpTRmlsZUV4Y2VwdGlvbi5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQk4OTg3ODVGNDEyMkUxRUFDMDAzQUFCREEgLyogSlNGaWxlUmVhZGVyU3luYy5jcHAgaW4g
U291cmNlcyAqLywKKwkJCQlGQkMyMjBCMTEyMzcyOUUxMDBCQ0Y3ODggLyogR3JhcGhpY3NDb250
ZXh0M0RPcGVuR0wuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxv
eW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFz
L1dlYkdMT2JqZWN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdM
T2JqZWN0LmNwcAkocmV2aXNpb24gNjY4ODcpCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdM
T2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjAsNyArNjAsNyBAQCB2b2lkIFdlYkdMT2Jq
ZWN0OjpkZWxldGVPYmplY3QoKQogewogICAgIGlmIChtX29iamVjdCkgewogICAgICAgICBpZiAo
bV9jb250ZXh0KSB7Ci0gICAgICAgICAgICBtX2NvbnRleHQtPmdyYXBoaWNzQ29udGV4dDNEKCkt
Pm1ha2VDb250ZXh0Q3VycmVudCgpOworICAgICAgICAgICAgbV9jb250ZXh0LT5ncmFwaGljc0Nv
bnRleHQzRCgpLT5lbnN1cmVDb250ZXh0KCk7CiAgICAgICAgICAgICBkZWxldGVPYmplY3RJbXBs
KG1fb2JqZWN0KTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW1fYXR0YWNobWVudENvdW50KQpJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktpdEJyaWRnZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQU5HTEVXZWJLaXRCcmlkZ2UuaAko
cmV2aXNpb24gNjY4ODcpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0FOR0xFV2ViS2l0
QnJpZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYgKzM4LDcgQEAgZW51bSBBTkdMRVNoYWRl
clR5cGUgewogICAgIFNIQURFUl9UWVBFX0ZSQUdNRU5UID0gRVNoTGFuZ0ZyYWdtZW50CiB9Owog
CisKIGNsYXNzIEFOR0xFV2ViS2l0QnJpZGdlIHsKIHB1YmxpYzoKIApJbmRleDogV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0M0QuaAkocmV2aXNpb24gNjY4ODcp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgJKHdvcmtp
bmcgY29weSkKQEAgLTQyOSw2ICs0MjksNyBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB+R3JhcGhp
Y3NDb250ZXh0M0QoKTsKIAogI2lmIFBMQVRGT1JNKE1BQykKKyAgICB2b2lkIGVuc3VyZUNvbnRl
eHQoKTsKICAgICBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEIHBsYXRmb3JtR3JhcGhpY3NDb250
ZXh0M0QoKSBjb25zdCB7IHJldHVybiBtX2NvbnRleHRPYmo7IH0KICAgICBQbGF0Zm9ybTNET2Jq
ZWN0IHBsYXRmb3JtVGV4dHVyZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGV4dHVyZTsgfQogICAgIENB
TGF5ZXIqIHBsYXRmb3JtTGF5ZXIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxDQUxheWVy
Kj4obV93ZWJHTExheWVyLmdldCgpKTsgfQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHJldmlzaW9uIDY2ODg3
KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTMxLDIxICszMSwyMiBAQAogCiAjaW1wb3J0ICJCbG9ja0V4
Y2VwdGlvbnMuaCIKIAorI2luY2x1ZGUgIkFOR0xFL1NoYWRlckxhbmcuaCIKICNpbmNsdWRlICJB
cnJheUJ1ZmZlci5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgotI2luY2x1ZGUgIldl
YkdMT2JqZWN0LmgiCiAjaW5jbHVkZSAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1
ZGUgPENvcmVHcmFwaGljcy9DR0JpdG1hcENvbnRleHQuaD4KICNpbmNsdWRlICJGbG9hdDMyQXJy
YXkuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2FudmFz
RWxlbWVudC5oIgogI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiSW50MzJBcnJh
eS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiVWludDhBcnJheS5o
IgotI2luY2x1ZGUgIldlYkdMTGF5ZXIuaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRt
YXBDb250ZXh0Lmg+CiAjaW5jbHVkZSA8T3BlbkdML0NHTFJlbmRlcmVycy5oPgogI2luY2x1ZGUg
PE9wZW5HTC9nbC5oPgorI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExh
eWVyLmgiCisjaW5jbHVkZSAiV2ViR0xPYmplY3QuaCIKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFy
YW0uaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTIyOSw4MSArMjMwLDE0
IEBAIEdyYXBoaWNzQ29udGV4dDNEOjp+R3JhcGhpY3NDb250ZXh0M0QoKQogICAgIH0KIH0KIAot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKLXsKLSAgICBjb25z
dCBjaGFyKiBleHRlbnNpb25zID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdl
dFN0cmluZyhHTF9FWFRFTlNJT05TKSk7Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewotICAg
ICAgICBpZiAoc3RkOjpzdHJzdHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9wYWNrZWRfZGVwdGhfc3Rl
bmNpbCIpKSB7Ci0gICAgICAgICAgICBpZiAoIW1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAg
ICAgbV9hdHRycy5kZXB0aCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9h
dHRycy5zdGVuY2lsID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykg
ewotICAgICAgICBib29sIGlzVmFsaWRWZW5kb3IgPSB0cnVlOwotICAgICAgICAvLyBDdXJyZW50
bHkgaW4gTWFjIHdlIG9ubHkgdHVybiBvbiBhbnRpYWxpYXMgaWYgdmVuZG9yIGlzIE5WSURJQS4K
LSAgICAgICAgY29uc3QgY2hhciogdmVuZG9yID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFy
Kj4oOjpnbEdldFN0cmluZyhHTF9WRU5ET1IpKTsKLSAgICAgICAgaWYgKCFzdGQ6OnN0cnN0cih2
ZW5kb3IsICJOVklESUEiKSkKLSAgICAgICAgICAgIGlzVmFsaWRWZW5kb3IgPSBmYWxzZTsKLSAg
ICAgICAgaWYgKCFpc1ZhbGlkVmVuZG9yIHx8ICFzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xf
RVhUX2ZyYW1lYnVmZmVyX211bHRpc2FtcGxlIikpCi0gICAgICAgICAgICBtX2F0dHJzLmFudGlh
bGlhcyA9IGZhbHNlOwotICAgIH0KLSAgICAvLyBGSVhNRTogaW5zdGVhZCBvZiBlbmZvcmNpbmcg
cHJlbXVsdGlwbGllZEFscGhhID0gdHJ1ZSwgaW1wbGVtZW50IHRoZQotICAgIC8vIGNvcnJlY3Qg
YmVoYXZpb3Igd2hlbiBwcmVtdWx0aXBsaWVkQWxwaGEgPSBmYWxzZSBpcyByZXF1ZXN0ZWQuCi0g
ICAgbV9hdHRycy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQoKQotewotICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KG1fY29udGV4dE9iaik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVu
ZGVyaW5nUmVzdWx0c1RvQ2FudmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjplbnN1cmVDb250ZXh0KCkKIHsKLSAgICBIVE1MQ2FudmFz
RWxlbWVudCogY2FudmFzID0gY29udGV4dC0+Y2FudmFzKCk7Ci0gICAgSW1hZ2VCdWZmZXIqIGlt
YWdlQnVmZmVyID0gY2FudmFzLT5idWZmZXIoKTsKLQotICAgIGludCByb3dCeXRlcyA9IG1fY3Vy
cmVudFdpZHRoICogNDsKLSAgICBpbnQgdG90YWxCeXRlcyA9IHJvd0J5dGVzICogbV9jdXJyZW50
SGVpZ2h0OwotCi0gICAgT3duQXJyYXlQdHI8dW5zaWduZWQgY2hhcj4gcGl4ZWxzKG5ldyB1bnNp
Z25lZCBjaGFyW3RvdGFsQnl0ZXNdKTsKLSAgICBpZiAoIXBpeGVscykKKyAgICBpZiAoIW1fY29u
dGV4dE9iaikKICAgICAgICAgcmV0dXJuOwogCi0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9j
b250ZXh0T2JqKTsKLQotICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKLSAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMpIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9S
RUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5k
RnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAg
OjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVp
Z2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZG
RVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKLSAgICAgICAg
ICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAg
ICBHTGludCBwYWNrQWxpZ25tZW50ID0gNDsKLSAgICBib29sIG11c3RSZXN0b3JlUGFja0FsaWdu
bWVudCA9IGZhbHNlOwotICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9QQUNLX0FMSUdOTUVOVCwgJnBh
Y2tBbGlnbm1lbnQpOwotICAgIGlmIChwYWNrQWxpZ25tZW50ID4gNCkgewotICAgICAgICA6Omds
UGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIDQpOwotICAgICAgICBtdXN0UmVzdG9yZVBh
Y2tBbGlnbm1lbnQgPSB0cnVlOwotICAgIH0KLQotICAgIDo6Z2xSZWFkUGl4ZWxzKDAsIDAsIG1f
Y3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84
XzhfOF84X1JFViwgcGl4ZWxzLmdldCgpKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZVBhY2tBbGln
bm1lbnQpCi0gICAgICAgIDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgcGFja0Fs
aWdubWVudCk7Ci0KLSAgICBpZiAobXVzdFJlc3RvcmVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLQotICAgIHBhaW50
VG9DYW52YXMocGl4ZWxzLmdldCgpLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LAot
ICAgICAgICAgICAgICAgICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFn
ZUJ1ZmZlci0+Y29udGV4dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7CisgICAgQ0dMQ29udGV4dE9i
aiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRDb250ZXh0KCk7CisgICAgaWYgKGN1cnJl
bnRDb250ZXh0ICE9IG1fY29udGV4dE9iaikKKyAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQo
bV9jb250ZXh0T2JqKTsKIH0KIAogYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBs
aWFudCgpIGNvbnN0CkBAIC0zMjAsMTM0MyArMjU0LDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQz
RDo6aXNFcnJvckdlbmVyYXRlZAogewogICAgIHJldHVybiBmYWxzZTsKIH0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6cmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgaWYg
KHdpZHRoID09IG1fY3VycmVudFdpZHRoICYmIGhlaWdodCA9PSBtX2N1cnJlbnRIZWlnaHQgfHwg
IW1fY29udGV4dE9iaikKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fY3VycmVudFdpZHRo
ID0gd2lkdGg7Ci0gICAgbV9jdXJyZW50SGVpZ2h0ID0gaGVpZ2h0OwotICAgIAotICAgIENHTFNl
dEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgCi0gICAgR0x1aW50IGludGVybmFs
Q29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCA9IDA7
Ci0gICAgaWYgKG1fYXR0cnMuYWxwaGEpIHsKLSAgICAgICAgaW50ZXJuYWxDb2xvckZvcm1hdCA9
IEdMX1JHQkE4OwotICAgICAgICBjb2xvckZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgaW50ZXJuYWxDb2xvckZvcm1hdCA9IEdMX1JHQjg7Ci0gICAgICAgIGNvbG9yRm9y
bWF0ID0gR0xfUkdCOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMu
ZGVwdGgpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgdGhlIGxvZ2ljIHdoZXJlIHN0ZW5j
aWwgaXMgcmVxdWlyZWQgYW5kIGRlcHRoIGlzIG5vdC4KLSAgICAgICAgLy8gU2VlIEdyYXBoaWNz
Q29udGV4dDNEIGNvbnN0cnVjdG9yLgotICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsICYmIG1f
YXR0cnMuZGVwdGgpCi0gICAgICAgICAgICBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCA9IEdM
X0RFUFRIMjRfU1RFTkNJTDhfRVhUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpbnRlcm5h
bERlcHRoU3RlbmNpbEZvcm1hdCA9IEdMX0RFUFRIX0NPTVBPTkVOVDsKLSAgICB9Ci0KLSAgICBi
b29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0KLSAgICAvLyByZXNpemUgbXVsdGlzYW1wbGUg
RkJPCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIEdMaW50IG1heFNhbXBs
ZUNvdW50OwotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1NBTVBMRVNfRVhULCAmbWF4
U2FtcGxlQ291bnQpOwotICAgICAgICBHTGludCBzYW1wbGVDb3VudCA9IHN0ZDo6bWluKDgsIG1h
eFNhbXBsZUNvdW50KTsKLSAgICAgICAgaWYgKHNhbXBsZUNvdW50ID4gbWF4U2FtcGxlQ291bnQp
Ci0gICAgICAgICAgICBzYW1wbGVDb3VudCA9IG1heFNhbXBsZUNvdW50OwotICAgICAgICBpZiAo
bV9ib3VuZEZCTyAhPSBtX211bHRpc2FtcGxlRkJPKSB7Ci0gICAgICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAg
ICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgOjpnbEJp
bmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUNvbG9y
QnVmZmVyKTsKLSAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50ZXJuYWxDb2xvckZvcm1hdCwgd2lk
dGgsIGhlaWdodCk7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9G
UkFNRUJVRkZFUl9FWFQsIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCwgR0xfUkVOREVSQlVGRkVS
X0VYVCwgbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3Rl
bmNpbCB8fCBtX2F0dHJzLmRlcHRoKSB7Ci0gICAgICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZl
ckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVy
KTsKLSAgICAgICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xf
UkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0
LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAg
ICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVS
X0VYVCwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9t
dWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5k
ZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVS
X0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAg
ICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7Ci0gICAg
ICAgIGlmIChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSAh
PSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBj
bGVhbnVwLgotICAgICAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKLSAgICAgICAgfQotICAgIH0K
LQotICAgIC8vIHJlc2l6ZSByZWd1bGFyIEZCTwotICAgIGlmIChtX2JvdW5kRkJPICE9IG1fZmJv
KSB7Ci0gICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKLSAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbEJp
bmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIG1fdGV4dHVyZSk7Ci0gICAgOjpnbFRleEltYWdlMkQo
R0xfVEVYVFVSRV8yRCwgMCwgaW50ZXJuYWxDb2xvckZvcm1hdCwgd2lkdGgsIGhlaWdodCwgMCwg
Y29sb3JGb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIDApOwotICAgIDo6Z2xGcmFtZWJ1ZmZlclRl
eHR1cmUyREVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0NPTE9SX0FUVEFDSE1FTlQwX0VYVCwg
R0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlLCAwKTsKLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVY
VFVSRV8yRCwgMCk7Ci0gICAgaWYgKCFtX2F0dHJzLmFudGlhbGlhcyAmJiAobV9hdHRycy5zdGVu
Y2lsIHx8IG1fYXR0cnMuZGVwdGgpKSB7Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhU
KEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgOjpn
bFJlbmRlcmJ1ZmZlclN0b3JhZ2VFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgaW50ZXJuYWxEZXB0
aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAobV9hdHRycy5zdGVu
Y2lsKQotICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgR0xfU1RFTkNJTF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VY
VCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICBpZiAobV9hdHRycy5kZXB0aCkKLSAg
ICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRo
U3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRF
UkJVRkZFUl9FWFQsIDApOwotICAgIH0KLSAgICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVz
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0gR0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7
Ci0gICAgICAgIC8vIEZJWE1FOiBjbGVhbnVwCi0gICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0g
ICAgfQotCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAg
ICAgaWYgKG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAgICAgICAgICAgIG11c3RS
ZXN0b3JlRkJPID0gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSW5pdGlhbGl6ZSByZW5kZXJidWZm
ZXJzIHRvIDAuCi0gICAgR0xib29sZWFuIGNvbG9yTWFza1tdID0ge0dMX1RSVUUsIEdMX1RSVUUs
IEdMX1RSVUUsIEdMX1RSVUV9LCBkZXB0aE1hc2sgPSBHTF9UUlVFLCBzdGVuY2lsTWFzayA9IEdM
X1RSVUU7Ci0gICAgR0xib29sZWFuIGlzU2Npc3NvckVuYWJsZWQgPSBHTF9GQUxTRTsKLSAgICBH
TGJvb2xlYW4gaXNEaXRoZXJFbmFibGVkID0gR0xfRkFMU0U7Ci0gICAgR0xiaXRmaWVsZCBjbGVh
ck1hc2sgPSBHTF9DT0xPUl9CVUZGRVJfQklUOwotICAgIDo6Z2xHZXRCb29sZWFudihHTF9DT0xP
Ul9XUklURU1BU0ssIGNvbG9yTWFzayk7Ci0gICAgOjpnbENvbG9yTWFzayhHTF9UUlVFLCBHTF9U
UlVFLCBHTF9UUlVFLCBHTF9UUlVFKTsKLSAgICBpZiAobV9hdHRycy5kZXB0aCkgewotICAgICAg
ICA6OmdsR2V0Qm9vbGVhbnYoR0xfREVQVEhfV1JJVEVNQVNLLCAmZGVwdGhNYXNrKTsKLSAgICAg
ICAgOjpnbERlcHRoTWFzayhHTF9UUlVFKTsKLSAgICAgICAgY2xlYXJNYXNrIHw9IEdMX0RFUFRI
X0JVRkZFUl9CSVQ7Ci0gICAgfQotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpIHsKLSAgICAgICAg
OjpnbEdldEJvb2xlYW52KEdMX1NURU5DSUxfV1JJVEVNQVNLLCAmc3RlbmNpbE1hc2spOwotICAg
ICAgICA6OmdsU3RlbmNpbE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNsZWFyTWFzayB8PSBHTF9T
VEVOQ0lMX0JVRkZFUl9CSVQ7Ci0gICAgfQotICAgIGlzU2Npc3NvckVuYWJsZWQgPSA6OmdsSXNF
bmFibGVkKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgOjpnbERpc2FibGUoR0xfU0NJU1NPUl9URVNU
KTsKLSAgICBpc0RpdGhlckVuYWJsZWQgPSA6OmdsSXNFbmFibGVkKEdMX0RJVEhFUik7Ci0gICAg
OjpnbERpc2FibGUoR0xfRElUSEVSKTsKLQotICAgIDo6Z2xDbGVhcihjbGVhck1hc2spOwotCi0g
ICAgOjpnbENvbG9yTWFzayhjb2xvck1hc2tbMF0sIGNvbG9yTWFza1sxXSwgY29sb3JNYXNrWzJd
LCBjb2xvck1hc2tbM10pOwotICAgIGlmIChtX2F0dHJzLmRlcHRoKQotICAgICAgICA6OmdsRGVw
dGhNYXNrKGRlcHRoTWFzayk7Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKLSAgICAgICAgOjpn
bFN0ZW5jaWxNYXNrKHN0ZW5jaWxNYXNrKTsKLSAgICBpZiAoaXNTY2lzc29yRW5hYmxlZCkKLSAg
ICAgICAgOjpnbEVuYWJsZShHTF9TQ0lTU09SX1RFU1QpOwotICAgIGVsc2UKLSAgICAgICAgOjpn
bERpc2FibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBpZiAoaXNEaXRoZXJFbmFibGVkKQotICAg
ICAgICA6OmdsRW5hYmxlKEdMX0RJVEhFUik7Ci0gICAgZWxzZQotICAgICAgICA6OmdsRGlzYWJs
ZShHTF9ESVRIRVIpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQotICAgICAgICA6OmdsQmlu
ZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7Ci0KLSAgICA6
OmdsRmx1c2goKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZUNvbnRleHQoQ0dMQ29u
dGV4dE9iaiBjb250ZXh0KQotewotICAgIGlmICghY29udGV4dCkKLSAgICAgICAgcmV0dXJuOwot
ICAgICAgICAKLSAgICBDR0xDb250ZXh0T2JqIGN1cnJlbnRDb250ZXh0ID0gQ0dMR2V0Q3VycmVu
dENvbnRleHQoKTsKLSAgICBpZiAoY3VycmVudENvbnRleHQgIT0gY29udGV4dCkKLSAgICAgICAg
Q0dMU2V0Q3VycmVudENvbnRleHQoY29udGV4dCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnByZXBhcmVUZXh0dXJlKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1f
Y3VycmVudEhlaWdodCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xf
Q09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwotICAgIH0KLSAgICA6OmdsRmlu
aXNoKCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmFjdGl2ZVRleHR1cmUodW5zaWdu
ZWQgbG9uZyB0ZXh0dXJlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6YXR0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgUGxhdGZvcm0zRE9iamVj
dCBzaGFkZXIpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIEFTU0VSVChzaGFkZXIpOwot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQXR0YWNoU2hhZGVyKChH
THVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2ln
bmVkIGxvbmcgaW5kZXgsIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBBU1NFUlQocHJvZ3Jh
bSk7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCaW5kQXR0cmli
TG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgaW5kZXgsIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRCdWZmZXIodW5zaWduZWQgbG9uZyB0YXJn
ZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKLSAgICA6OmdsQmluZEJ1ZmZlcih0YXJnZXQsIChHTHVpbnQpIGJ1ZmZlcik7Ci19
Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IGZibzsKLSAgICBpZiAoYnVmZmVyKQotICAgICAg
ICBmYm8gPSAoR0x1aW50KWJ1ZmZlcjsKLSAgICBlbHNlCi0gICAgICAgIGZibyA9IChtX2F0dHJz
LmFudGlhbGlhcyA/IG1fbXVsdGlzYW1wbGVGQk8gOiBtX2Zibyk7Ci0gICAgaWYgKGZibyAhPSBt
X2JvdW5kRkJPKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQodGFyZ2V0LCBmYm8p
OwotICAgICAgICBtX2JvdW5kRkJPID0gZmJvOwotICAgIH0KLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0z
RE9iamVjdCByZW5kZXJidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgKEdMdWludCkgcmVuZGVyYnVm
ZmVyKTsKLX0KLQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kVGV4dHVyZSh1bnNpZ25l
ZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZFRleHR1cmUodGFyZ2V0LCAoR0x1aW50
KSB0ZXh0dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRDb2xvcihkb3Vi
bGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBkb3VibGUgYWxwaGEpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZENvbG9yKHN0YXRpY19j
YXN0PGZsb2F0PihyZWQpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZ3JlZW4pLCBzdGF0aWNfY2FzdDxm
bG9hdD4oYmx1ZSksIHN0YXRpY19jYXN0PGZsb2F0PihhbHBoYSkpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpibGVuZEVxdWF0aW9uKCB1bnNpZ25lZCBsb25nIG1vZGUgKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRFcXVhdGlvbihtb2Rl
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvblNlcGFyYXRlKHVu
c2lnbmVkIGxvbmcgbW9kZVJHQiwgdW5zaWduZWQgbG9uZyBtb2RlQWxwaGEpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUo
bW9kZVJHQiwgbW9kZUFscGhhKTsKLX0KLQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVu
ZEZ1bmModW5zaWduZWQgbG9uZyBzZmFjdG9yLCB1bnNpZ25lZCBsb25nIGRmYWN0b3IpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZEZ1bmMoc2ZhY3Rv
ciwgZGZhY3Rvcik7Ci19ICAgICAgIAotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEZ1
bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIHNyY1JHQiwgdW5zaWduZWQgbG9uZyBkc3RSR0IsIHVu
c2lnbmVkIGxvbmcgc3JjQWxwaGEsIHVuc2lnbmVkIGxvbmcgZHN0QWxwaGEpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNS
R0IsIGRzdFJHQiwgc3JjQWxwaGEsIGRzdEFscGhhKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIHVuc2lnbmVk
IGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6
Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgMCwgdXNhZ2UpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwgY29u
c3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCBkYXRhLCB1
c2FnZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlclN1YkRhdGEodW5zaWdu
ZWQgbG9uZyB0YXJnZXQsIGxvbmcgb2Zmc2V0LCBpbnQgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJ1ZmZlclN1YkRh
dGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwotfQotCi11bnNpZ25lZCBsb25nIEdyYXBo
aWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbENo
ZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQodGFyZ2V0KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Y2xlYXJDb2xvcihkb3VibGUgciwgZG91YmxlIGcsIGRvdWJsZSBiLCBkb3VibGUgYSkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyQ29sb3Io
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZyksIHN0YXRpY19jYXN0
PGZsb2F0PihiKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Y2xlYXIodW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXIobWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNsZWFyRGVwdGgoZG91YmxlIGRlcHRoKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJEZXB0aChkZXB0aCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbChsb25nIHMpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVhclN0ZW5jaWwocyk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNvbG9yTWFzayhib29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVl
LCBib29sIGFscGhhKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y29tcGlsZVNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAg
ICBpbnQgR0xzaGFkZXJUeXBlOwotICAgIEFOR0xFU2hhZGVyVHlwZSBzaGFkZXJUeXBlOwotCi0g
ICAgZ2xHZXRTaGFkZXJpdihzaGFkZXIsIFNIQURFUl9UWVBFLCAmR0xzaGFkZXJUeXBlKTsKLSAg
ICAKLSAgICBpZiAoR0xzaGFkZXJUeXBlID09IFZFUlRFWF9TSEFERVIpCi0gICAgICAgIHNoYWRl
clR5cGUgPSBTSEFERVJfVFlQRV9WRVJURVg7Ci0gICAgZWxzZSBpZiAoR0xzaGFkZXJUeXBlID09
IEZSQUdNRU5UX1NIQURFUikKLSAgICAgICAgc2hhZGVyVHlwZSA9IFNIQURFUl9UWVBFX0ZSQUdN
RU5UOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuOyAvLyBJbnZhbGlkIHNoYWRlciB0eXBlLgot
Ci0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJh
dG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLQotICAgIGlmIChy
ZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IFNoYWRlclNvdXJjZUVudHJ5JiBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0gICAgU3RyaW5n
IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2U7Ci0gICAgU3RyaW5nIHNoYWRlckluZm9Mb2c7Ci0KLSAg
ICBib29sIGlzVmFsaWQgPSBtX2NvbXBpbGVyLnZhbGlkYXRlU2hhZGVyU291cmNlKGVudHJ5LnNv
dXJjZS51dGY4KCkuZGF0YSgpLCBzaGFkZXJUeXBlLCB0cmFuc2xhdGVkU2hhZGVyU291cmNlLCBz
aGFkZXJJbmZvTG9nKTsKLQotICAgIGVudHJ5LmxvZyA9IHNoYWRlckluZm9Mb2c7Ci0gICAgZW50
cnkuaXNWYWxpZCA9IGlzVmFsaWQ7Ci0KLSAgICBpZiAoIWlzVmFsaWQpCi0gICAgICAgIHJldHVy
bjsgLy8gU2hhZGVyIGRpZG4ndCB2YWxpZGF0ZSwgZG9uJ3QgbW92ZSBmb3J3YXJkIHdpdGggY29t
cGlsaW5nIHRyYW5zbGF0ZWQgc291cmNlICAgIAotCi0gICAgaW50IHRyYW5zbGF0ZWRTaGFkZXJM
ZW5ndGggPSB0cmFuc2xhdGVkU2hhZGVyU291cmNlLmxlbmd0aCgpOwotCi0gICAgY29uc3QgQ1N0
cmluZyYgdHJhbnNsYXRlZFNoYWRlckNTdHJpbmcgPSB0cmFuc2xhdGVkU2hhZGVyU291cmNlLnV0
ZjgoKTsKLSAgICBjb25zdCBjaGFyKiB0cmFuc2xhdGVkU2hhZGVyUHRyID0gdHJhbnNsYXRlZFNo
YWRlckNTdHJpbmcuZGF0YSgpOwotICAgIAotICAgIDo6Z2xTaGFkZXJTb3VyY2UoKEdMdWludCkg
c2hhZGVyLCAxLCAmdHJhbnNsYXRlZFNoYWRlclB0ciwgJnRyYW5zbGF0ZWRTaGFkZXJMZW5ndGgp
OwotICAgIAotICAgIDo6Z2xDb21waWxlU2hhZGVyKChHTHVpbnQpIHNoYWRlcik7Ci0gICAgCi0g
ICAgaW50IEdMQ29tcGlsZVN1Y2Nlc3M7Ci0gICAgCi0gICAgOjpnbEdldFNoYWRlcml2KChHTHVp
bnQpIHNoYWRlciwgQ09NUElMRV9TVEFUVVMsICZHTENvbXBpbGVTdWNjZXNzKTsKLSAgICAKLSAg
ICAvLyBBU1NFUlQgdGhhdCBBTkdMRSBnZW5lcmF0ZWQgR0xTTCB3aWxsIGJlIGFjY2VwdGVkIGJ5
IE9wZW5HTAotICAgIEFTU0VSVChHTENvbXBpbGVTdWNjZXNzID09IEdMX1RSVUUpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdl
dCwgbG9uZyBsZXZlbCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgbG9uZyB4LCBsb25n
IHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0LCBsb25nIGJvcmRl
cikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgaWYgKG1fYXR0cnMu
YW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHksIHgg
KyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9DT0xP
Ul9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgIH0KLSAgICA6OmdsQ29weVRleEltYWdl
MkQodGFyZ2V0LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJv
cmRlcik7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0
aXNhbXBsZUZCTykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZF
Ul9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpj
b3B5VGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4
b2Zmc2V0LCBsb25nIHlvZmZzZXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRo
LCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNh
bXBsZUZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVC
VUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZy
YW1lYnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRo
LCB5ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgIH0K
LSAgICA6OmdsQ29weVRleFN1YkltYWdlMkQodGFyZ2V0LCBsZXZlbCwgeG9mZnNldCwgeW9mZnNl
dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1f
Ym91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZl
ckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjdWxsRmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERlcHRoRnVuYyhmdW5j
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNrKGJvb2wgZmxhZykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERlcHRoTWFzayhmbGFn
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhSYW5nZShkb3VibGUgek5lYXIs
IGRvdWJsZSB6RmFyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsRGVwdGhSYW5nZSh6TmVhciwgekZhcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRldGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERldGFjaFNoYWRlcigoR0x1
aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkaXNhYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRGlzYWJsZShjYXApOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGVWZXJ0ZXhB
dHRyaWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdBcnJh
eXModW5zaWduZWQgbG9uZyBtb2RlLCBsb25nIGZpcnN0LCBsb25nIGNvdW50KQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRHJhd0FycmF5cyhtb2RlLCBmaXJz
dCwgY291bnQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3RWxlbWVudHModW5z
aWduZWQgbG9uZyBtb2RlLCB1bnNpZ25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUs
IGxvbmcgb2Zmc2V0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCByZWludGVycHJldF9jYXN0PHZvaWQq
PihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjplbmFibGUodW5zaWduZWQgbG9uZyBjYXApCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGUoY2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEVuYWJsZVZlcnRleEF0
dHJpYkFycmF5KGluZGV4KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZmluaXNoKCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZpbmlzaCgpOwot
fQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCgpCi17Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGbHVzaCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHJlbmRlcmJ1ZmZlcnRhcmdldCwg
UGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIEdMdWludCByZW5kZXJidWZmZXIgPSAoR0x1aW50KSBidWZmZXI7Ci0gICAgaWYg
KGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKSB7Ci0gICAgICAgIDo6Z2xG
cmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIERFUFRIX0FUVEFDSE1FTlQsIHJlbmRl
cmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKLSAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVu
ZGVyYnVmZmVyRVhUKHRhcmdldCwgU1RFTkNJTF9BVFRBQ0hNRU5ULCByZW5kZXJidWZmZXJ0YXJn
ZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgfSBlbHNlCi0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJl
bmRlcmJ1ZmZlckVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVu
ZGVyYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJUZXh0
dXJlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5z
aWduZWQgbG9uZyB0ZXh0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSwgbG9uZyBsZXZl
bCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZyYW1lYnVm
ZmVyVGV4dHVyZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4dGFyZ2V0LCAoR0x1aW50KSB0
ZXh0dXJlLCBsZXZlbCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyb250RmFjZSh1
bnNpZ25lZCBsb25nIG1vZGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xGcm9udEZhY2UobW9kZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
bmVyYXRlTWlwbWFwKHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2VuZXJhdGVNaXBtYXBFWFQodGFyZ2V0KTsKLX0KLQot
Ym9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlQXR0cmliKFBsYXRmb3JtM0RPYmplY3Qg
cHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5mbyYgaW5mbykKLXsKLSAgICBp
ZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIEdMaW50IG1heEF0dHJpYnV0ZVNpemUgPSAwOwotICAgIDo6Z2xHZXRQcm9n
cmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xfQUNUSVZFX0FUVFJJQlVURV9N
QVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6ZSk7Ci0gICAgR0xjaGFyIG5hbWVbbWF4QXR0cmli
dXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxs
IHRlcm1pbmF0aW9uCi0gICAgR0xzaXplaSBuYW1lTGVuZ3RoID0gMDsKLSAgICBHTGludCBzaXpl
ID0gMDsKLSAgICBHTGVudW0gdHlwZSA9IDA7Ci0gICAgOjpnbEdldEFjdGl2ZUF0dHJpYihzdGF0
aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4QXR0cmlidXRlU2l6ZSwgJm5hbWVM
ZW5ndGgsICZzaXplLCAmdHlwZSwgbmFtZSk7Ci0gICAgaWYgKCFuYW1lTGVuZ3RoKQotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgaW5mby5uYW1lID0gU3RyaW5nKG5hbWUsIG5hbWVMZW5ndGgp
OwotICAgIGluZm8udHlwZSA9IHR5cGU7Ci0gICAgaW5mby5zaXplID0gc2l6ZTsKLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLSAgICAKLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZVVuaWZv
cm0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBBY3RpdmVJ
bmZvJiBpbmZvKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAgICBzeW50aGVzaXplR0xF
cnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbWF4VW5pZm9ybVNpemUgPSAw
OwotICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xf
QUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCwgJm1heFVuaWZvcm1TaXplKTsKLSAgICBHTGNoYXIg
bmFtZVttYXhVbmlmb3JtU2l6ZV07IC8vIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggaW5j
bHVkZXMgbnVsbCB0ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAg
R0xpbnQgc2l6ZSA9IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVV
bmlmb3JtKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4LCBtYXhVbmlmb3JtU2l6
ZSwgJm5hbWVMZW5ndGgsICZzaXplLCAmdHlwZSwgbmFtZSk7Ci0gICAgaWYgKCFuYW1lTGVuZ3Ro
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaW5mby5uYW1lID0gU3RyaW5nKG5hbWUsIG5h
bWVMZW5ndGgpOwotICAgIGluZm8udHlwZSA9IHR5cGU7Ci0gICAgaW5mby5zaXplID0gc2l6ZTsK
LSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0YWNo
ZWRTaGFkZXJzKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgaW50IG1heENvdW50LCBpbnQqIGNv
dW50LCB1bnNpZ25lZCBpbnQqIHNoYWRlcnMpCi17Ci0gICAgaWYgKCFwcm9ncmFtKSB7Ci0gICAg
ICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0QXR0YWNo
ZWRTaGFkZXJzKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIG1heENvdW50LCBjb3VudCwg
c2hhZGVycyk7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRpb24o
UGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgaWYg
KCFwcm9ncmFtKQotICAgICAgICByZXR1cm4gLTE7CiAgICAgCi0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsR2V0QXR0cmliTG9jYXRpb24oKEdMdWludCkg
cHJvZ3JhbSwgbmFtZS51dGY4KCkuZGF0YSgpKTsKLX0KLQotR3JhcGhpY3NDb250ZXh0M0Q6OkF0
dHJpYnV0ZXMgR3JhcGhpY3NDb250ZXh0M0Q6OmdldENvbnRleHRBdHRyaWJ1dGVzKCkKLXsKLSAg
ICByZXR1cm4gbV9hdHRyczsKLX0KLQotdW5zaWduZWQgbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0RXJyb3IoKQotewotICAgIGlmIChtX3N5bnRoZXRpY0Vycm9ycy5zaXplKCkgPiAwKSB7Ci0g
ICAgICAgIExpc3RIYXNoU2V0PHVuc2lnbmVkIGxvbmc+OjppdGVyYXRvciBpdGVyID0gbV9zeW50
aGV0aWNFcnJvcnMuYmVnaW4oKTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBlcnIgPSAqaXRlcjsK
LSAgICAgICAgbV9zeW50aGV0aWNFcnJvcnMucmVtb3ZlKGl0ZXIpOwotICAgICAgICByZXR1cm4g
ZXJyOwotICAgIH0KLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1
cm4gOjpnbEdldEVycm9yKCk7Ci19Ci0KLVN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U3Ry
aW5nKHVuc2lnbmVkIGxvbmcgbmFtZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgcmV0dXJuIFN0cmluZygoY29uc3QgY2hhciopIDo6Z2xHZXRTdHJpbmcobmFtZSkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpoaW50KHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCB1bnNpZ25lZCBsb25nIG1vZGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xIaW50KHRhcmdldCwgbW9kZSk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0
M0Q6OmlzQnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGlmICghYnVmZmVy
KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIHJldHVybiA6OmdsSXNCdWZmZXIoKEdMdWludCkgYnVmZmVyKTsKLX0KLQot
Ym9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFbmFibGVkKHVuc2lnbmVkIGxvbmcgY2FwKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzRW5hYmxl
ZChjYXApOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0ZyYW1lYnVmZmVyKFBsYXRm
b3JtM0RPYmplY3QgZnJhbWVidWZmZXIpCi17Ci0gICAgaWYgKCFmcmFtZWJ1ZmZlcikKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICByZXR1cm4gOjpnbElzRnJhbWVidWZmZXJFWFQoKEdMdWludCkgZnJhbWVidWZmZXIpOwot
fQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBw
cm9ncmFtKQotewotICAgIGlmICghcHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
IAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzUHJv
Z3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNS
ZW5kZXJidWZmZXIoUGxhdGZvcm0zRE9iamVjdCByZW5kZXJidWZmZXIpCi17Ci0gICAgaWYgKCFy
ZW5kZXJidWZmZXIpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1JlbmRlcmJ1ZmZlckVYVCgoR0x1
aW50KSByZW5kZXJidWZmZXIpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1NoYWRl
cihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBpZiAoIXNoYWRlcikKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICByZXR1cm4gOjpnbElzU2hhZGVyKChHTHVpbnQpIHNoYWRlcik7Ci19Ci0KLWJvb2wgR3JhcGhp
Y3NDb250ZXh0M0Q6OmlzVGV4dHVyZShQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUpCi17Ci0gICAg
aWYgKCF0ZXh0dXJlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNUZXh0dXJlKChHTHVpbnQpIHRl
eHR1cmUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpsaW5lV2lkdGgoZG91YmxlIHdp
ZHRoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsTGluZVdp
ZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpsaW5rUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJU
KHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsTGlu
a1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5hbWUsIGxvbmcgcGFyYW0pCi17Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xQaXhlbFN0b3JlaShwbmFtZSwgcGFy
YW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0KGRvdWJsZSBm
YWN0b3IsIGRvdWJsZSB1bml0cykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZhY3RvciksIHN0YXRp
Y19jYXN0PGZsb2F0Pih1bml0cykpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZWFk
UGl4ZWxzKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25n
IGhlaWdodCwgdW5zaWduZWQgbG9uZyBmb3JtYXQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgdm9pZCog
ZGF0YSkKLXsKLSAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0d28gZ2xGbHVzaCBjYWxscyB3aGVu
IHRoZSBkcml2ZXIgYnVnIGlzIGZpeGVkLCBpLmUuLAotICAgIC8vIGFsbCBwcmV2aW91cyByZW5k
ZXJpbmcgY2FsbHMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJlYWRpbmcgcGl4ZWxzLgotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLSAgICBpZiAobV9h
dHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Ci0gICAg
ICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJB
TUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwg
eSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdM
X0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6Z2xGbHVzaCgpOwot
ICAgIH0KLSAgICA6OmdsUmVhZFBpeGVscyh4LCB5LCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5
cGUsIGRhdGEpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1f
bXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVC
VUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBpcyBub3Qg
aW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8gaGF2ZSBpZmRlZnMgZm9y
IHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgLy86OmdsUmVsZWFzZVNoYWRlckNvbXBpbGVyKCk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3JhZ2UodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVu
c2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVk
IGxvbmcgaGVpZ2h0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBz
d2l0Y2ggKGludGVybmFsZm9ybWF0KSB7Ci0gICAgY2FzZSBERVBUSF9TVEVOQ0lMOgotICAgICAg
ICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOwotICAgICAgICBicmVh
azsKLSAgICBjYXNlIERFUFRIX0NPTVBPTkVOVDE2OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9
IEdMX0RFUFRIX0NPTVBPTkVOVDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSR0JBNDoKLSAg
ICBjYXNlIFJHQjVfQTE6Ci0gICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfUkdCQTsKLSAgICAg
ICAgYnJlYWs7Ci0gICAgY2FzZSBSR0I1NjU6Ci0gICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xf
UkdCOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VF
WFQodGFyZ2V0LCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJsZSB2YWx1ZSwgYm9vbCBpbnZlcnQp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTYW1wbGVDb3Zl
cmFnZShzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpLCBpbnZlcnQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzY2lzc29yKGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRo
LCB1bnNpZ25lZCBsb25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlciwgY29u
c3QgU3RyaW5nJiBzdHJpbmcpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAgU2hhZGVyU291cmNlRW50cnkgZW50cnk7
Ci0KLSAgICBlbnRyeS5zb3VyY2UgPSBzdHJpbmc7Ci0KLSAgICBtX3NoYWRlclNvdXJjZU1hcC5z
ZXQoc2hhZGVyLCBlbnRyeSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxG
dW5jKHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxGdW5jKGZ1
bmMsIHJlZiwgbWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5j
U2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVm
LCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTdGVuY2lsRnVuY1NlcGFyYXRlKGZhY2UsIGZ1bmMsIHJlZiwgbWFzayk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKHVuc2lnbmVkIGxvbmcgbWFz
aykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxN
YXNrKG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFy
YXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU3RlbmNpbE1hc2tTZXBhcmF0ZShmYWNl
LCBtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKHVuc2lnbmVk
IGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxPcChmYWls
LCB6ZmFpbCwgenBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BT
ZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQg
bG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKGZhY2UsIGZhaWwsIHpmYWls
LCB6cGFzcyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmYodW5z
aWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgZmxvYXQgdmFsdWUpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5h
bWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp0ZXhQYXJhbWV0ZXJpKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2
YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFRleFBh
cmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2
MCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0x
Zihsb2NhdGlvbiwgdjApOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWZ2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxvY2F0
aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xVbmlmb3JtMmYobG9jYXRpb24sIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBp
bnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUg
b2YgMgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJm
dihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtM2YobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZihsb2Nh
dGlvbiwgdjAsIHYxLCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0z
ZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhN
RTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYobG9uZyBsb2NhdGlvbiwg
ZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGYobG9jYXRpb24sIHYwLCB2MSwg
djIsIHYzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmdihsb25nIGxv
Y2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGgg
bmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjApCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWkobG9j
YXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpdihsb25n
IGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0xaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpKGxvbmcgbG9jYXRpb24sIGlu
dCB2MCwgaW50IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQotewot
ICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBz
aXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaShsb25n
IGxvY2F0aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTNpKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNpdihsb25nIGxvY2F0aW9uLCBp
bnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJl
IGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2
MiwgaW50IHYzKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
VW5pZm9ybTRpKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm00aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUp
Ci17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm00aXYobG9jYXRp
b24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1h
dHJpeDJmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2Yg
NAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1hdHJp
eDJmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bv
c2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVk
cyB0byBiZSBhIG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJy
YXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4NGZ2KGxvbmcg
bG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAg
IC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybU1hdHJpeDRmdihsb2NhdGlv
biwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnVzZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKFBsYXRmb3JtM0RP
YmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWYWxpZGF0ZVByb2dyYW0oKEdMdWludCkg
cHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmKHVu
c2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjApCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIxZihpbmR4LCB2MCk7Ci19Ci0KLXZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0
KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZl
cnRleEF0dHJpYjFmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnZlcnRleEF0dHJpYjJmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxKQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmli
MmYoaW5keCwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMmZ2KGluZHgsIGFycmF5
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2YodW5zaWduZWQg
bG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliM2YoaW5keCwgdjAsIHYx
LCB2Mik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmdihpbmR4LCBhcnJheSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2lnbmVkIGxvbmcgaW5keCwg
ZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCi17Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZihpbmR4LCB2MCwgdjEs
IHYyLCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmdih1
bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjRmdihpbmR4LCBhcnJheSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYlBvaW50ZXIodW5zaWduZWQgbG9u
ZyBpbmR4LCBpbnQgc2l6ZSwgaW50IHR5cGUsIGJvb2wgbm9ybWFsaXplZCwgdW5zaWduZWQgbG9u
ZyBzdHJpZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliUG9pbnRlcihpbmR4LCBzaXplLCB0eXBl
LCBub3JtYWxpemVkLCBzdHJpZGUsIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0
PGludHB0cl90PihvZmZzZXQpKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZpZXdw
b3J0KGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhl
aWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZpZXdw
b3J0KHN0YXRpY19jYXN0PEdMaW50Pih4KSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KHkpLCBzdGF0aWNf
Y2FzdDxHTHNpemVpPih3aWR0aCksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KGhlaWdodCkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCb29sZWFudih1bnNpZ25lZCBsb25nIHBuYW1l
LCB1bnNpZ25lZCBjaGFyKiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldEJvb2xlYW52KHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1
bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwg
dmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWduZWQg
bG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsR2V0RmxvYXR2KHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgcG5h
bWUsIGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAg
IGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkKLSAgICAgICAgYXR0
YWNobWVudCA9IERFUFRIX0FUVEFDSE1FTlQ7IC8vIE9yIFNURU5DSUxfQVRUQUNITUVOVCwgZWl0
aGVyIHdvcmtzLgotICAgIDo6Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVY
VCh0YXJnZXQsIGF0dGFjaG1lbnQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldEludGVnZXJ2KHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17
Ci0gICAgLy8gTmVlZCB0byBlbXVsYXRlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFU
L1RZUEUgZm9yIEdMLiAgQW55IHZhbGlkCi0gICAgLy8gY29tYmluYXRpb24gc2hvdWxkIHdvcmss
IGJ1dCBHTF9SR0IvR0xfVU5TSUdORURfQllURSBtaWdodCBiZSB0aGUgbW9zdAotICAgIC8vIHVz
ZWZ1bCBmb3IgZGVza3RvcCBXZWJHTCB1c2Vycy4KLSAgICAvLyBOZWVkIHRvIGVtdWxhdGUgTUFY
X0ZSQUdNRU5UL1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlMgYW5kIE1BWF9WQVJZSU5HX1ZFQ1RPUlMK
LSAgICAvLyBiZWNhdXNlIGRlc2t0b3AgR0wncyBjb3JyZXNwb25kaW5nIHF1ZXJpZXMgcmV0dXJu
IHRoZSBudW1iZXIgb2YgY29tcG9uZW50cwotICAgIC8vIHdoZXJlYXMgR0xFUzIgcmV0dXJuIHRo
ZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFjaCB2ZWN0b3IgaGFzIDQgY29tcG9uZW50cykuCi0gICAg
Ly8gVGhlcmVmb3JlLCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVza3RvcCBHTCBuZWVkcyB0byBi
ZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHN3
aXRjaCAocG5hbWUpIHsKLSAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9STUFU
OgotICAgICAgICAqdmFsdWUgPSBHTF9SR0I7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSU1Q
TEVNRU5UQVRJT05fQ09MT1JfUkVBRF9UWVBFOgotICAgICAgICAqdmFsdWUgPSBHTF9VTlNJR05F
RF9CWVRFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9GUkFHTUVOVF9VTklGT1JNX1ZF
Q1RPUlM6Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfRlJBR01FTlRfVU5JRk9STV9D
T01QT05FTlRTLCB2YWx1ZSk7Ci0gICAgICAgICp2YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsK
LSAgICBjYXNlIE1BWF9WRVJURVhfVU5JRk9STV9WRUNUT1JTOgotICAgICAgICA6OmdsR2V0SW50
ZWdlcnYoR0xfTUFYX1ZFUlRFWF9VTklGT1JNX0NPTVBPTkVOVFMsIHZhbHVlKTsKLSAgICAgICAg
KnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUFYX1ZBUllJTkdfVkVDVE9S
UzoKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9WQVJZSU5HX0ZMT0FUUywgdmFsdWUp
OwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAg
ICAgICAgOjpnbEdldEludGVnZXJ2KHBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1
bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIHBuYW1l
LCB2YWx1ZSk7Ci19Ci0KLVN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbUluZm9M
b2coUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAg
ICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwot
ICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RI
LCAmbGVuZ3RoKTsKLSAgICAKLSAgICBHTHNpemVpIHNpemU7Ci0gICAgR0xjaGFyKiBpbmZvID0g
KEdMY2hhciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKLSAgICBpZiAoIWluZm8pCi0gICAgICAgIHJl
dHVybiAiIjsKLQotICAgIDo6Z2xHZXRQcm9ncmFtSW5mb0xvZygoR0x1aW50KSBwcm9ncmFtLCBs
ZW5ndGgsICZzaXplLCBpbmZvKTsKLSAgICBTdHJpbmcgcyhpbmZvKTsKLSAgICBmYXN0RnJlZShp
bmZvKTsKLSAgICByZXR1cm4gczsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UmVu
ZGVyYnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcg
cG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIHBuYW1lLCB2YWx1
ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlcml2KFBsYXRmb3JtM0RP
YmplY3Qgc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIEFT
U0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICAKLSAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRl
cmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotICAgIAotICAg
IHN3aXRjaCAocG5hbWUpIHsKLSAgICAgICAgY2FzZSBERUxFVEVfU1RBVFVTOgotICAgICAgICBj
YXNlIFNIQURFUl9UWVBFOgotICAgICAgICAgICAgLy8gTGV0IE9wZW5HTCBoYW5kbGUgdGhlc2Uu
Ci0gICAgICAgIAotICAgICAgICAgICAgOjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwg
cG5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQ09NUElM
RV9TVEFUVVM6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVu
ZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KGZhbHNl
KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAoKnZhbHVlKSA9IHN0YXRpY19jYXN0PGludD4ocmVzdWx0LT5zZWNv
bmQuaXNWYWxpZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBj
YXNlIElORk9fTE9HX0xFTkdUSDoKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJT
b3VyY2VNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAoKnZhbHVlKSA9IDA7Ci0gICAgICAg
ICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAg
ICAoKnZhbHVlKSA9IGdldFNoYWRlckluZm9Mb2coc2hhZGVyKS5sZW5ndGgoKTsKLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgU0hBREVSX1NPVVJDRV9MRU5H
VEg6Ci0gICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlclNvdXJjZShzaGFkZXIpLmxlbmd0
aCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0OgotICAg
ICAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9FTlVNKTsKLSAgICB9Ci19Ci0KLVN0
cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVySW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0
IHNoYWRlcikKLXsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBHTGludCBsZW5ndGg7Ci0gICAgOjpnbEdldFNoYWRlcml2KChHTHVp
bnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKLQotICAgIEhhc2hNYXA8
UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBt
X3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVzdWx0ID09IG1fc2hh
ZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICAgcmV0dXJuICIiOwotCi0gICAgIFNoYWRlclNv
dXJjZUVudHJ5IGVudHJ5ID0gcmVzdWx0LT5zZWNvbmQ7Ci0KLSAgICAgaWYgKGVudHJ5LmlzVmFs
aWQpIHsKLSAgICAgICAgIEdMaW50IGxlbmd0aDsKLSAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigo
R0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0KLSAgICAgICAg
IEdMc2l6ZWkgc2l6ZTsKLSAgICAgICAgIEdMY2hhciogaW5mbyA9IChHTGNoYXIqKSBmYXN0TWFs
bG9jKGxlbmd0aCk7Ci0gICAgICAgICBpZiAoIWluZm8pCi0gICAgICAgICAgICAgcmV0dXJuICIi
OwotCi0gICAgICAgICA6OmdsR2V0U2hhZGVySW5mb0xvZygoR0x1aW50KSBzaGFkZXIsIGxlbmd0
aCwgJnNpemUsIGluZm8pOwotCi0gICAgICAgICBTdHJpbmcgcyhpbmZvKTsKLSAgICAgICAgIGZh
c3RGcmVlKGluZm8pOwotICAgICAgICAgcmV0dXJuIHM7Ci0gICAgIH0KLSAgICAgZWxzZSB7Ci0g
ICAgICAgICByZXR1cm4gZW50cnkubG9nOwotICAgICB9Ci19Ci0KLVN0cmluZyBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0U2hhZGVyU291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQotewotICAg
IEFTU0VSVChzaGFkZXIpOwotCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0g
ICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9y
IHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLQotICAgIGlmIChyZXN1
bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCi0gICAgICAgIHJldHVybiAiIjsKLQotICAg
IHJldHVybiByZXN1bHQtPnNlY29uZC5zb3VyY2U7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VGV4UGFyYW1ldGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQs
IHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1m
dihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGZsb2F0KiB2YWx1ZSkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFVuaWZvcm1m
digoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxv
Y2F0aW9uLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsR2V0VW5pZm9ybWl2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7
Ci19Ci0KLWxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1Mb2NhdGlvbihQbGF0Zm9y
bTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKLXsKLSAgICBBU1NFUlQocHJv
Z3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIHJldHVy
biA6OmdsR2V0VW5pZm9ybUxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUudXRmOCgpLmRh
dGEoKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYmZ2KHVu
c2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldFZlcnRleEF0dHJp
YmZ2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRWZXJ0ZXhBdHRyaWJpdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6
OmdsR2V0VmVydGV4QXR0cmliaXYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0KLWxvbmcgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYk9mZnNldCh1bnNpZ25lZCBsb25nIGluZGV4
LCB1bnNpZ25lZCBsb25nIHBuYW1lKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICAKLSAgICB2b2lkKiBwb2ludGVyOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJQb2lu
dGVydihpbmRleCwgcG5hbWUsICZwb2ludGVyKTsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2Fz
dDxsb25nPihwb2ludGVyKTsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJE
KHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGludGVybmFsZm9ybWF0
LCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBib3JkZXIsIHVuc2ln
bmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIDo6Z2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2ZWws
IGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwgcGl4
ZWxzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhTdWJJ
bWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIHhvZmYsIHVu
c2lnbmVkIHlvZmYsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGZv
cm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLQotICAgIC8vIEZJWE1FOiB3ZSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRo
IFBpeGVsU3RvcmUgcGFyYW1zIHdoZW4gZGVhbGluZyB3aXRoIGltYWdlIGJ1ZmZlcnMgdGhhdCBk
aWZmZXIgZnJvbSB0aGUgc3ViaW1hZ2Ugc2l6ZQotICAgIDo6Z2xUZXhTdWJJbWFnZTJEKHRhcmdl
dCwgbGV2ZWwsIHhvZmYsIHlvZmYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxz
KTsKLSAgICByZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZUJ1ZmZlcigpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWlu
dCBvOwotICAgIGdsR2VuQnVmZmVycygxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigpCi17Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMdWludCBvOwotICAgIGdsR2VuRnJhbWVidWZm
ZXJzRVhUKDEsICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNyZWF0ZVByb2dyYW0oKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICByZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNz
Q29udGV4dDNEOjpjcmVhdGVSZW5kZXJidWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwg
Jm8pOwotICAgIHJldHVybiBvOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3Jl
YXRlU2hhZGVyKHVuc2lnbmVkIGxvbmcgdHlwZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgcmV0dXJuIGdsQ3JlYXRlU2hhZGVyKCh0eXBlID09IEZSQUdNRU5UX1NI
QURFUikgPyBHTF9GUkFHTUVOVF9TSEFERVIgOiBHTF9WRVJURVhfU0hBREVSKTsKLX0KLQotdW5z
aWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cmUoKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlblRleHR1cmVzKDEs
ICZvKTsKLSAgICByZXR1cm4gbzsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRl
QnVmZmVyKHVuc2lnbmVkIGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgZ2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFtZWJ1ZmZlcikKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNF
WFQoMSwgJmZyYW1lYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRl
UHJvZ3JhbSh1bnNpZ25lZCBwcm9ncmFtKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmRlbGV0ZVJlbmRlcmJ1ZmZlcih1bnNpZ25lZCByZW5kZXJidWZmZXIpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVy
c0VYVCgxLCAmcmVuZGVyYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVs
ZXRlU2hhZGVyKHVuc2lnbmVkIHNoYWRlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlVGV4dHVyZSh1bnNpZ25lZCB0ZXh0dXJlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlKTsK
LX0KLQotaW50IEdyYXBoaWNzQ29udGV4dDNEOjpzaXplSW5CeXRlcyhpbnQgdHlwZSkKLXsKLSAg
ICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBHTF9CWVRFOgotICAgICAgICAgICAgcmV0
dXJuIHNpemVvZihHTGJ5dGUpOwotICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0JZVEU6Ci0gICAg
ICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWJ5dGUpOwotICAgICAgICBjYXNlIEdMX1NIT1JUOgot
ICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHNob3J0KTsKLSAgICAgICAgY2FzZSBHTF9VTlNJ
R05FRF9TSE9SVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1c2hvcnQpOwotICAgICAg
ICBjYXNlIEdMX0lOVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xpbnQpOwotICAgICAg
ICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1aW50
KTsKLSAgICAgICAgY2FzZSBHTF9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0xm
bG9hdCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN5bnRoZXNpemVHTEVycm9yKHVuc2lnbmVkIGxv
bmcgZXJyb3IpCi17Ci0gICAgbV9zeW50aGV0aWNFcnJvcnMuYWRkKGVycm9yKTsKLX0KIAogfQog
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE9w
ZW5HTC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3Jh
cGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDE0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBF
TkFCTEUoM0RfQ0FOVkFTKQorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKworI2lu
Y2x1ZGUgIkFycmF5QnVmZmVyLmgiCisjaW5jbHVkZSAiQXJyYXlCdWZmZXJWaWV3LmgiCisjaW5j
bHVkZSAiV2ViR0xPYmplY3QuaCIKKyNpbmNsdWRlICJDYW52YXNSZW5kZXJpbmdDb250ZXh0Lmgi
CisjaW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5o
IgorI2luY2x1ZGUgIkludDMyQXJyYXkuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgor
I2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKworI2lmIFBMQVRGT1JNKE1BQykKKyNpbmNsdWRlIDxP
cGVuR0wvQ0dMUmVuZGVyZXJzLmg+CisjaW5jbHVkZSA8T3BlbkdML2dsLmg+CisjZW5kaWYKKwor
I2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcu
aD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxp
ZGF0ZUF0dHJpYnV0ZXMoKQoreworICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSByZWludGVy
cHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKKyAg
ICBpZiAobV9hdHRycy5zdGVuY2lsKSB7CisgICAgICAgIGlmIChzdGQ6OnN0cnN0cihleHRlbnNp
b25zLCAiR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIikpIHsKKyAgICAgICAgICAgIGlmICgh
bV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICBtX2F0dHJzLmRlcHRoID0gdHJ1ZTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2F0dHJzLnN0ZW5jaWwgPSBmYWxzZTsKKyAgICB9
CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgIGJvb2wgaXNWYWxpZFZlbmRv
ciA9IHRydWU7CisgICAgICAgIC8vIEN1cnJlbnRseSBpbiBNYWMgd2Ugb25seSB0dXJuIG9uIGFu
dGlhbGlhcyBpZiB2ZW5kb3IgaXMgTlZJRElBLgorICAgICAgICBjb25zdCBjaGFyKiB2ZW5kb3Ig
PSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX1ZFTkRPUikp
OworICAgICAgICBpZiAoIXN0ZDo6c3Ryc3RyKHZlbmRvciwgIk5WSURJQSIpKQorICAgICAgICAg
ICAgaXNWYWxpZFZlbmRvciA9IGZhbHNlOworICAgICAgICBpZiAoIWlzVmFsaWRWZW5kb3IgfHwg
IXN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfZnJhbWVidWZmZXJfbXVsdGlzYW1wbGUi
KSkKKyAgICAgICAgICAgIG1fYXR0cnMuYW50aWFsaWFzID0gZmFsc2U7CisgICAgfQorICAgIC8v
IEZJWE1FOiBpbnN0ZWFkIG9mIGVuZm9yY2luZyBwcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlLCBp
bXBsZW1lbnQgdGhlCisgICAgLy8gY29ycmVjdCBiZWhhdmlvciB3aGVuIHByZW11bHRpcGxpZWRB
bHBoYSA9IGZhbHNlIGlzIHJlcXVlc3RlZC4KKyAgICBtX2F0dHJzLnByZW11bHRpcGxpZWRBbHBo
YSA9IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVyaW5nUmVz
dWx0c1RvQ2FudmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCit7CisgICAgSFRN
TENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOworICAgIEltYWdlQnVm
ZmVyKiBpbWFnZUJ1ZmZlciA9IGNhbnZhcy0+YnVmZmVyKCk7CisKKyAgICBpbnQgcm93Qnl0ZXMg
PSBtX2N1cnJlbnRXaWR0aCAqIDQ7CisgICAgaW50IHRvdGFsQnl0ZXMgPSByb3dCeXRlcyAqIG1f
Y3VycmVudEhlaWdodDsKKworICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IHBpeGVscyhu
ZXcgdW5zaWduZWQgY2hhclt0b3RhbEJ5dGVzXSk7CisgICAgaWYgKCFwaXhlbHMpCisgICAgICAg
IHJldHVybjsKKworICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAg
ICBib29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFz
KSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdM
X0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZm
ZXJFWFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgMCwgMCwgbV9jdXJy
ZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFS
KTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1f
ZmJvKTsKKyAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAg
ICAgIGlmIChtX2JvdW5kRkJPICE9IG1fZmJvKSB7CisgICAgICAgICAgICBtdXN0UmVzdG9yZUZC
TyA9IHRydWU7CisgICAgICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9mYm8pOworICAgICAgICB9CisgICAgfQorCisgICAgR0xpbnQgcGFja0FsaWdu
bWVudCA9IDQ7CisgICAgYm9vbCBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSBmYWxzZTsKKyAg
ICA6OmdsR2V0SW50ZWdlcnYoR0xfUEFDS19BTElHTk1FTlQsICZwYWNrQWxpZ25tZW50KTsKKyAg
ICBpZiAocGFja0FsaWdubWVudCA+IDQpIHsKKyAgICAgICAgOjpnbFBpeGVsU3RvcmVpKEdMX1BB
Q0tfQUxJR05NRU5ULCA0KTsKKyAgICAgICAgbXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50ID0gdHJ1
ZTsKKyAgICB9CisKKyAgICA6OmdsUmVhZFBpeGVscygwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9j
dXJyZW50SGVpZ2h0LCBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsIHBpeGVs
cy5nZXQoKSk7CisKKyAgICBpZiAobXVzdFJlc3RvcmVQYWNrQWxpZ25tZW50KQorICAgICAgICA6
OmdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIHBhY2tBbGlnbm1lbnQpOworCisgICAg
aWYgKG11c3RSZXN0b3JlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7CisKKyAgICBwYWludFRvQ2FudmFzKHBpeGVscy5n
ZXQoKSwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwKKyAgICAgICAgICAgICAgICAg
IGNhbnZhcy0+d2lkdGgoKSwgY2FudmFzLT5oZWlnaHQoKSwgaW1hZ2VCdWZmZXItPmNvbnRleHQo
KS0+cGxhdGZvcm1Db250ZXh0KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNo
YXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50
V2lkdGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhlaWdodCB8fCAhbV9jb250ZXh0T2JqKQorICAg
ICAgICByZXR1cm47CisgICAgCisgICAgbV9jdXJyZW50V2lkdGggPSB3aWR0aDsKKyAgICBtX2N1
cnJlbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICAKKyAgICBHTHVpbnQgaW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JG
b3JtYXQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gMDsKKyAgICBpZiAobV9hdHRycy5h
bHBoYSkgeworICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCQTg7CisgICAgICAg
IGNvbG9yRm9ybWF0ID0gR0xfUkdCQTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnRlcm5hbENv
bG9yRm9ybWF0ID0gR0xfUkdCODsKKyAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0I7CisgICAg
fQorICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkgeworICAgICAgICAv
LyBXZSBkb24ndCBhbGxvdyB0aGUgbG9naWMgd2hlcmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQg
ZGVwdGggaXMgbm90LgorICAgICAgICAvLyBTZWUgR3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0
b3IuCisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgJiYgbV9hdHRycy5kZXB0aCkKKyAgICAg
ICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9F
WFQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0
ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgIH0KKworICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8g
PSBmYWxzZTsKKworICAgIC8vIHJlc2l6ZSBtdWx0aXNhbXBsZSBGQk8KKyAgICBpZiAobV9hdHRy
cy5hbnRpYWxpYXMpIHsKKyAgICAgICAgR0xpbnQgbWF4U2FtcGxlQ291bnQ7CisgICAgICAgIDo6
Z2xHZXRJbnRlZ2VydihHTF9NQVhfU0FNUExFU19FWFQsICZtYXhTYW1wbGVDb3VudCk7CisgICAg
ICAgIEdMaW50IHNhbXBsZUNvdW50ID0gc3RkOjptaW4oOCwgbWF4U2FtcGxlQ291bnQpOworICAg
ICAgICBpZiAoc2FtcGxlQ291bnQgPiBtYXhTYW1wbGVDb3VudCkKKyAgICAgICAgICAgIHNhbXBs
ZUNvdW50ID0gbWF4U2FtcGxlQ291bnQ7CisgICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVs
dGlzYW1wbGVGQk8pIHsKKyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgICAgIG11c3RSZXN0b3Jl
RkJPID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOworICAgICAgICA6
OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQs
IHNhbXBsZUNvdW50LCBpbnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAg
ICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xf
Q09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
Q29sb3JCdWZmZXIpOworICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVw
dGgpIHsKKyAgICAgICAgICAgIDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZF
Ul9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICAgICAgOjpn
bFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBz
YW1wbGVDb3VudCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwor
ICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkKKyAgICAgICAgICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FU
VEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVu
Y2lsQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAg
ICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdM
X0RFUFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxl
RGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgfQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1
ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAwKTsKKyAgICAgICAgaWYgKGdsQ2hlY2tGcmFt
ZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NP
TVBMRVRFX0VYVCkgeworICAgICAgICAgICAgLy8gRklYTUU6IGNsZWFudXAuCisgICAgICAgICAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVzaXplIHJl
Z3VsYXIgRkJPCisgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKKyAgICAgICAgbXVzdFJl
c3RvcmVGQk8gPSB0cnVlOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KKyAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVS
RV8yRCwgbV90ZXh0dXJlKTsKKyAgICA6OmdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBp
bnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5T
SUdORURfQllURSwgMCk7CisgICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3Rl
eHR1cmUsIDApOworICAgIDo6Z2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICBp
ZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0
aCkpIHsKKyAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VY
VCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFn
ZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lk
dGgsIGhlaWdodCk7CisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCisgICAgICAgICAgICA6
OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVO
Q0lMX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1
ZmZlcik7CisgICAgICAgIGlmIChtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpnbEZyYW1l
YnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNI
TUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAg
ICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7Cisg
ICAgfQorICAgIGlmIChnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJf
RVhUKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVURV9FWFQpIHsKKyAgICAgICAgLy8gRklYTUU6
IGNsZWFudXAKKyAgICAgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobV9h
dHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICBpZiAobV9ib3VuZEZCTyA9
PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsK
KyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHJlbmRlcmJ1ZmZlcnMgdG8gMC4KKyAgICBHTGJv
b2xlYW4gY29sb3JNYXNrW10gPSB7R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0s
IGRlcHRoTWFzayA9IEdMX1RSVUUsIHN0ZW5jaWxNYXNrID0gR0xfVFJVRTsKKyAgICBHTGJvb2xl
YW4gaXNTY2lzc29yRW5hYmxlZCA9IEdMX0ZBTFNFOworICAgIEdMYm9vbGVhbiBpc0RpdGhlckVu
YWJsZWQgPSBHTF9GQUxTRTsKKyAgICBHTGJpdGZpZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JV
RkZFUl9CSVQ7CisgICAgOjpnbEdldEJvb2xlYW52KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JN
YXNrKTsKKyAgICA6OmdsQ29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RS
VUUpOworICAgIGlmIChtX2F0dHJzLmRlcHRoKSB7CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihH
TF9ERVBUSF9XUklURU1BU0ssICZkZXB0aE1hc2spOworICAgICAgICA6OmdsRGVwdGhNYXNrKEdM
X1RSVUUpOworICAgICAgICBjbGVhck1hc2sgfD0gR0xfREVQVEhfQlVGRkVSX0JJVDsKKyAgICB9
CisgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgeworICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xf
U1RFTkNJTF9XUklURU1BU0ssICZzdGVuY2lsTWFzayk7CisgICAgICAgIDo6Z2xTdGVuY2lsTWFz
ayhHTF9UUlVFKTsKKyAgICAgICAgY2xlYXJNYXNrIHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsK
KyAgICB9CisgICAgaXNTY2lzc29yRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9U
RVNUKTsKKyAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGlzRGl0aGVyRW5h
YmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfRElUSEVSKTsKKyAgICA6OmdsRGlzYWJsZShHTF9ESVRI
RVIpOworCisgICAgOjpnbENsZWFyKGNsZWFyTWFzayk7CisKKyAgICA6OmdsQ29sb3JNYXNrKGNv
bG9yTWFza1swXSwgY29sb3JNYXNrWzFdLCBjb2xvck1hc2tbMl0sIGNvbG9yTWFza1szXSk7Cisg
ICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAgIDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsK
KyAgICBpZiAobV9hdHRycy5zdGVuY2lsKQorICAgICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNp
bE1hc2spOworICAgIGlmIChpc1NjaXNzb3JFbmFibGVkKQorICAgICAgICA6OmdsRW5hYmxlKEdM
X1NDSVNTT1JfVEVTVCk7CisgICAgZWxzZQorICAgICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09S
X1RFU1QpOworICAgIGlmIChpc0RpdGhlckVuYWJsZWQpCisgICAgICAgIDo6Z2xFbmFibGUoR0xf
RElUSEVSKTsKKyAgICBlbHNlCisgICAgICAgIDo6Z2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAg
ICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKKworICAgIDo6Z2xGbHVzaCgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCit7CisgICAgZW5zdXJlQ29u
dGV4dCgpOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgeworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsK
KyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdp
ZHRoLCBtX2N1cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWln
aHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJh
bWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKKyAgICB9CisgICAg
OjpnbEZpbmlzaCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJl
KHVuc2lnbmVkIGxvbmcgdGV4dHVyZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpn
bEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmF0
dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3JtM0RPYmplY3Qgc2hh
ZGVyKQoreworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICBBU1NFUlQoc2hhZGVyKTsKKyAgICBl
bnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEF0dGFjaFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLCAo
R0x1aW50KSBzaGFkZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmli
TG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBj
b25zdCBTdHJpbmcmIG5hbWUpCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIGVuc3VyZUNv
bnRleHQoKTsKKyAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGlu
ZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpi
aW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1
aW50KSBidWZmZXIpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1
ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOworICAgIEdMdWludCBmYm87CisgICAgaWYgKGJ1ZmZlcikKKyAg
ICAgICAgZmJvID0gKEdMdWludClidWZmZXI7CisgICAgZWxzZQorICAgICAgICBmYm8gPSAobV9h
dHRycy5hbnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8pOworICAgIGlmIChmYm8g
IT0gbV9ib3VuZEZCTykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwg
ZmJvKTsKKyAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRm
b3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6
OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Cit9
CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQgbG9uZyB0
YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7
CisgICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkgdGV4dHVyZSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91YmxlIHJlZCwgZG91YmxlIGdyZWVu
LCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAg
ICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4o
YWxwaGEpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5z
aWduZWQgbG9uZyBtb2RlICkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEJsZW5k
RXF1YXRpb24obW9kZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRp
b25TZXBhcmF0ZSh1bnNpZ25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhh
KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRl
KG1vZGVSR0IsIG1vZGVBbHBoYSk7Cit9CisKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Ymxl
bmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQorewor
ICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0b3Ip
OworfSAgICAgICAKKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jU2VwYXJhdGUo
dW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNpZ25lZCBsb25n
IHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQoreworICAgIGVuc3VyZUNvbnRleHQo
KTsKKyAgICA6OmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBk
c3RBbHBoYSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWdu
ZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1bnNpZ25lZCBsb25nIHVzYWdlKQoreworICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdl
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25n
IHRhcmdldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2Up
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6
ZSwgZGF0YSwgdXNhZ2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJE
YXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZv
aWQqIGRhdGEpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xCdWZmZXJTdWJEYXRh
KHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKK30KKwordW5zaWduZWQgbG9uZyBHcmFwaGlj
c0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25nIHRhcmdldCkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgcmV0dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVy
U3RhdHVzRVhUKHRhcmdldCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29s
b3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCit7CisgICAgZW5zdXJl
Q29udGV4dCgpOworICAgIDo6Z2xDbGVhckNvbG9yKHN0YXRpY19jYXN0PGZsb2F0PihyKSwgc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRpY19jYXN0PGZs
b2F0PihhKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxv
bmcgbWFzaykKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbENsZWFyKG1hc2spOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQoreworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKKyAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJvb2wgYmx1ZSwgYm9v
bCBhbHBoYSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbENvbG9yTWFzayhyZWQs
IGdyZWVuLCBibHVlLCBhbHBoYSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBp
bGVTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHNoYWRlcik7
CisgICAgZW5zdXJlQ29udGV4dCgpOworCisgICAgaW50IEdMc2hhZGVyVHlwZTsKKyAgICBBTkdM
RVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKKworICAgIGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFE
RVJfVFlQRSwgJkdMc2hhZGVyVHlwZSk7CisgICAgCisgICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBW
RVJURVhfU0hBREVSKQorICAgICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwor
ICAgIGVsc2UgaWYgKEdMc2hhZGVyVHlwZSA9PSBGUkFHTUVOVF9TSEFERVIpCisgICAgICAgIHNo
YWRlclR5cGUgPSBTSEFERVJfVFlQRV9GUkFHTUVOVDsKKyAgICBlbHNlCisgICAgICAgIHJldHVy
bjsgLy8gSW52YWxpZCBzaGFkZXIgdHlwZS4KKworICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVj
dCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1h
cC5maW5kKHNoYWRlcik7CisKKyAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVu
ZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBTaGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSBy
ZXN1bHQtPnNlY29uZDsKKworICAgIFN0cmluZyB0cmFuc2xhdGVkU2hhZGVyU291cmNlOworICAg
IFN0cmluZyBzaGFkZXJJbmZvTG9nOworCisgICAgZm9yIChpbnQgc3RyWCA9IDA7IHN0clggPCAx
MDsgc3RyWCsrKSB7CisgICAgICAgIHByaW50Zigic3RyWyVpXSA9ICV1XG4iLHN0clgsZW50cnku
c291cmNlLnV0ZjgoKS5kYXRhKClbc3RyWF0pOworICAgIH0KKworICAgIGJvb2wgaXNWYWxpZCA9
IG1fY29tcGlsZXIudmFsaWRhdGVTaGFkZXJTb3VyY2UoZW50cnkuc291cmNlLnV0ZjgoKS5kYXRh
KCksIHNoYWRlclR5cGUsIHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpOwor
CisgICAgZW50cnkubG9nID0gc2hhZGVySW5mb0xvZzsKKyAgICBlbnRyeS5pc1ZhbGlkID0gaXNW
YWxpZDsKKworICAgIGlmICghaXNWYWxpZCkKKyAgICAgICAgcmV0dXJuOyAvLyBTaGFkZXIgZGlk
bid0IHZhbGlkYXRlLCBkb24ndCBtb3ZlIGZvcndhcmQgd2l0aCBjb21waWxpbmcgdHJhbnNsYXRl
ZCBzb3VyY2UgICAgCisKKyAgICBpbnQgdHJhbnNsYXRlZFNoYWRlckxlbmd0aCA9IHRyYW5zbGF0
ZWRTaGFkZXJTb3VyY2UubGVuZ3RoKCk7CisKKyAgICBjb25zdCBDU3RyaW5nJiB0cmFuc2xhdGVk
U2hhZGVyQ1N0cmluZyA9IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UudXRmOCgpOworICAgIGNvbnN0
IGNoYXIqIHRyYW5zbGF0ZWRTaGFkZXJQdHIgPSB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZy5kYXRh
KCk7CisgICAgCisgICAgOjpnbFNoYWRlclNvdXJjZSgoR0x1aW50KSBzaGFkZXIsIDEsICZ0cmFu
c2xhdGVkU2hhZGVyUHRyLCAmdHJhbnNsYXRlZFNoYWRlckxlbmd0aCk7CisgICAgCisgICAgOjpn
bENvbXBpbGVTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKKyAgICAKKyAgICBpbnQgR0xDb21waWxl
U3VjY2VzczsKKyAgICAKKyAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBDT01Q
SUxFX1NUQVRVUywgJkdMQ29tcGlsZVN1Y2Nlc3MpOworICAgIAorICAgIC8vIEFTU0VSVCB0aGF0
IEFOR0xFIGdlbmVyYXRlZCBHTFNMIHdpbGwgYmUgYWNjZXB0ZWQgYnkgT3BlbkdMCisgICAgQVNT
RVJUKEdMQ29tcGlsZVN1Y2Nlc3MgPT0gR0xfVFJVRSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1
bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9u
ZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQoreworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBt
X211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVB
RF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6
Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4
ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
CisgICAgfQorICAgIDo6Z2xDb3B5VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZv
cm1hdCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYm9yZGVyKTsKKyAgICBpZiAobV9hdHRycy5hbnRp
YWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmlu
ZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBsb25nIGxldmVsLCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwgbG9uZyB4
LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQorewor
ICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3Vu
ZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Cisg
ICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0
LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJ
TkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVs
LCB4b2Zmc2V0LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAobV9hdHRy
cy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6
OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZC
Tyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcg
bW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEN1bGxGYWNlKG1vZGUpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBmdW5j
KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRGVwdGhGdW5jKGZ1bmMpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aE1hc2soYm9vbCBmbGFnKQoreworICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCit7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qg
cHJvZ3JhbSwgUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHByb2dyYW0p
OworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRGV0
YWNoU2hhZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5z
dXJlQ29udGV4dCgpOworICAgIDo6Z2xEaXNhYmxlKGNhcCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGluZGV4KQor
eworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5
KGluZGV4KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyh1bnNpZ25l
ZCBsb25nIG1vZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCit7CisgICAgZW5zdXJlQ29udGV4
dCgpOworICAgIDo6Z2xEcmF3QXJyYXlzKG1vZGUsIGZpcnN0LCBjb3VudCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2ln
bmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgdHlwZSwgbG9uZyBvZmZzZXQpCit7CisgICAg
ZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUs
IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEVuYWJsZShjYXApOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25n
IGluZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRW5hYmxlVmVydGV4QXR0
cmliQXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2goKQor
eworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsRmluaXNoKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmZsdXNoKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpn
bEZsdXNoKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyUmVuZGVy
YnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVu
c2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVydGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVp
bnQpIGJ1ZmZlcjsKKyAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1F
TlQpIHsKKyAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQ
VEhfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAgICAg
ICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFDSE1F
TlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKyAgICB9IGVsc2UKKyAgICAg
ICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwgcmVu
ZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpmcmFtZWJ1ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQg
bG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9iamVj
dCB0ZXh0dXJlLCBsb25nIGxldmVsKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6Omds
RnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChH
THVpbnQpIHRleHR1cmUsIGxldmVsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJv
bnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAg
OjpnbEZyb250RmFjZShtb2RlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2VuZXJh
dGVNaXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOwor
ICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQpOworfQorCitib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25l
ZCBsb25nIGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQoreworICAgIGlmICghcHJvZ3JhbSkgewor
ICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgR0xpbnQgbWF4QXR0cmli
dXRlU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHBy
b2dyYW0pLCBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgsICZtYXhBdHRyaWJ1dGVTaXpl
KTsKKyAgICBHTGNoYXIgbmFtZVttYXhBdHRyaWJ1dGVTaXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJ
QlVURV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRpb24KKyAgICBHTHNpemVpIG5h
bWVMZW5ndGggPSAwOworICAgIEdMaW50IHNpemUgPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsK
KyAgICA6OmdsR2V0QWN0aXZlQXR0cmliKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGlu
ZGV4LCBtYXhBdHRyaWJ1dGVTaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsK
KyAgICBpZiAoIW5hbWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5h
bWUgPSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAg
ICBpbmZvLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorICAgIAorYm9vbCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCit7CisgICAgaWYgKCFwcm9n
cmFtKSB7CisgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOworICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICBHTGludCBt
YXhVbmlmb3JtU2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVp
bnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RILCAmbWF4VW5pZm9ybVNp
emUpOworICAgIEdMY2hhciBuYW1lW21heFVuaWZvcm1TaXplXTsgLy8gR0xfQUNUSVZFX1VOSUZP
Uk1fTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCisgICAgR0xzaXplaSBuYW1l
TGVuZ3RoID0gMDsKKyAgICBHTGludCBzaXplID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IDA7Cisg
ICAgOjpnbEdldEFjdGl2ZVVuaWZvcm0oc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5k
ZXgsIG1heFVuaWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAg
ICBpZiAoIW5hbWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUg
PSBTdHJpbmcobmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBp
bmZvLnNpemUgPSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRBdHRhY2hlZFNoYWRlcnMoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBpbnQg
bWF4Q291bnQsIGludCogY291bnQsIHVuc2lnbmVkIGludCogc2hhZGVycykKK3sKKyAgICBpZiAo
IXByb2dyYW0pIHsKKyAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRB
dHRhY2hlZFNoYWRlcnMoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgbWF4Q291bnQsIGNv
dW50LCBzaGFkZXJzKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJMb2Nh
dGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sKKyAg
ICBpZiAoIXByb2dyYW0pCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGVuc3VyZUNvbnRleHQo
KTsKKyAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5h
bWUudXRmOCgpLmRhdGEoKSk7Cit9CisKK0dyYXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygpCit7CisgICAgcmV0dXJuIG1f
YXR0cnM7Cit9CisKK3Vuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm9yKCkK
K3sKKyAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4gMCkgeworICAgICAgICBMaXN0
SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9IG1fc3ludGhldGljRXJyb3Jz
LmJlZ2luKCk7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gKml0ZXI7CisgICAgICAgIG1f
c3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9
CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgcmV0dXJuIDo6Z2xHZXRFcnJvcigpOworfQor
CitTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUp
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIq
KSA6OmdsR2V0U3RyaW5nKG5hbWUpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGlu
dCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBtb2RlKQoreworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKKyAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOworfQorCitib29sIEdyYXBo
aWNzQ29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKK3sKKyAgICBp
ZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZW5zdXJlQ29udGV4dCgp
OworICAgIHJldHVybiA6OmdsSXNCdWZmZXIoKEdMdWludCkgYnVmZmVyKTsKK30KKworYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNFbmFibGVkKHVuc2lnbmVkIGxvbmcgY2FwKQoreworICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICByZXR1cm4gOjpnbElzRW5hYmxlZChjYXApOworfQorCitib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc0ZyYW1lYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgZnJhbWVi
dWZmZXIpCit7CisgICAgaWYgKCFmcmFtZWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1ZmZlckVYVCgo
R0x1aW50KSBmcmFtZWJ1ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJv
Z3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgaWYgKCFwcm9ncmFtKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgcmV0dXJuIDo6
Z2xJc1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0
M0Q6OmlzUmVuZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQoreworICAg
IGlmICghcmVuZGVyYnVmZmVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBlbnN1cmVD
b250ZXh0KCk7CisgICAgcmV0dXJuIDo6Z2xJc1JlbmRlcmJ1ZmZlckVYVCgoR0x1aW50KSByZW5k
ZXJidWZmZXIpOworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1NoYWRlcihQbGF0Zm9y
bTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBpZiAoIXNoYWRlcikKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdM
dWludCkgc2hhZGVyKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBs
YXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKK3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICByZXR1cm4gOjpnbElzVGV4
dHVyZSgoR0x1aW50KSB0ZXh0dXJlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGlu
ZVdpZHRoKGRvdWJsZSB3aWR0aCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbExp
bmVXaWR0aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQoreworICAgIEFT
U0VSVChwcm9ncmFtKTsKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbExpbmtQcm9ncmFt
KChHTHVpbnQpIHByb2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwaXhlbFN0
b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQoreworICAgIGVuc3VyZUNvbnRl
eHQoKTsKKyAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9yLCBkb3VibGUgdW5pdHMp
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19j
YXN0PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNfY2FzdDxmbG9hdD4odW5pdHMpKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQg
bG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1
bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIGRhdGEpCit7CisgICAgLy8gRklYTUU6IHJlbW92ZSB0
aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwK
KyAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVyaW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9y
ZSByZWFkaW5nIHBpeGVscy4KKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEZsdXNoKCk7
CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBs
ZUZCTykgeworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZG
RVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVY
VChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6OmdsQmxpdEZyYW1l
YnVmZmVyRVhUKHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5
ICsgaGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgICAgICA6
OmdsRmx1c2goKTsKKyAgICB9CisgICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdo
dCwgZm9ybWF0LCB0eXBlLCBkYXRhKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9i
b3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCit7CisgICAgLy8gRklYTUU6
IFRoaXMgaXMgbm90IGltcGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhh
dmUgaWZkZWZzIGZvciB0aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCisgICAgZW5zdXJlQ29udGV4
dCgpOworICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1
bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25l
ZCBsb25nIGhlaWdodCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgc3dpdGNoIChpbnRl
cm5hbGZvcm1hdCkgeworICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKKyAgICAgICAgaW50ZXJuYWxm
b3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBERVBUSF9DT01QT05FTlQxNjoKKyAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSF9D
T01QT05FTlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUkdCQTQ6CisgICAgY2FzZSBSR0I1
X0ExOgorICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgUkdCNTY1OgorICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQjsKKyAgICAg
ICAgYnJlYWs7CisgICAgfQorICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhUKHRhcmdldCwg
aW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQoreworICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICA6OmdsU2FtcGxlQ292ZXJhZ2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+
KHZhbHVlKSwgaW52ZXJ0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2Npc3Nvcihs
b25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQp
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBo
ZWlnaHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZv
cm0zRE9iamVjdCBzaGFkZXIsIGNvbnN0IFN0cmluZyYgc3RyaW5nKQoreworICAgIEFTU0VSVChz
aGFkZXIpOworCisgICAgZW5zdXJlQ29udGV4dCgpOworCisgICAgU2hhZGVyU291cmNlRW50cnkg
ZW50cnk7CisKKyAgICBlbnRyeS5zb3VyY2UgPSBzdHJpbmc7CisKKyAgICBtX3NoYWRlclNvdXJj
ZU1hcC5zZXQoc2hhZGVyLCBlbnRyeSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0
ZW5jaWxGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFz
aykKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFN0ZW5jaWxGdW5jKGZ1bmMsIHJl
ZiwgbWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJh
dGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNp
Z25lZCBsb25nIG1hc2spCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xTdGVuY2ls
RnVuY1NlcGFyYXRlKGZhY2UsIGZ1bmMsIHJlZiwgbWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnN0ZW5jaWxNYXNrKHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1cmVD
b250ZXh0KCk7CisgICAgOjpnbFN0ZW5jaWxNYXNrKG1hc2spOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWdu
ZWQgbG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsU3RlbmNpbE1h
c2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQg
bG9uZyB6cGFzcykKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFN0ZW5jaWxPcChm
YWlsLCB6ZmFpbCwgenBhc3MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2ls
T3BTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWdu
ZWQgbG9uZyB6ZmFpbCwgdW5zaWduZWQgbG9uZyB6cGFzcykKK3sKKyAgICBlbnN1cmVDb250ZXh0
KCk7CisgICAgOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKGZhY2UsIGZhaWwsIHpmYWlsLCB6cGFzcyk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmYodW5zaWduZWQgdGFy
Z2V0LCB1bnNpZ25lZCBwbmFtZSwgZmxvYXQgdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dCgp
OworICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0
Pih2YWx1ZSkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJpKHVu
c2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2YWx1ZSkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KCk7CisgICAgOjpnbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nh
c3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0x
Zihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAg
OjpnbFVuaWZvcm0xZihsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp1bmlmb3JtMWZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihsb25nIGxvY2F0
aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6
Z2xVbmlmb3JtMmYobG9jYXRpb24sIHYwLCB2MSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0yZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sK
KyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgorICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVW5pZm9ybTJmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2YobG9uZyBsb2NhdGlvbiwg
ZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7Cisg
ICAgOjpnbFVuaWZvcm0zZihsb2NhdGlvbiwgdjAsIHYxLCB2Mik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0zZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQg
c2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2Yg
MworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlvbiwgc2l6
ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYobG9uZyBs
b2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCit7CisgICAg
ZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xVbmlmb3JtNGYobG9jYXRpb24sIHYwLCB2MSwgdjIs
IHYzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmdihsb25nIGxvY2F0
aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xV
bmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjApCit7CisgICAgZW5zdXJlQ29u
dGV4dCgpOworICAgIDo6Z2xVbmlmb3JtMWkobG9jYXRpb24sIHYwKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6dW5pZm9ybTFpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQg
c2l6ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFVuaWZvcm0xaXYobG9jYXRp
b24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJp
KGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsK
KyAgICA6OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXpl
KQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAyCisg
ICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaShsb25nIGxvY2F0
aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAg
ICA6OmdsVW5pZm9ybTNpKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTNpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6
ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwor
ICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVW5pZm9ybTNpdihsb2NhdGlvbiwgc2l6ZSwg
YXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkobG9uZyBsb2Nh
dGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MiwgaW50IHYzKQoreworICAgIGVuc3VyZUNvbnRl
eHQoKTsKKyAgICA6OmdsVW5pZm9ybTRpKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYobG9uZyBsb2NhdGlvbiwgaW50KiBh
cnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDQKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFVuaWZvcm00aXYobG9j
YXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bU1hdHJpeDJmdihsb25nIGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBp
bnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUg
b2YgNAorICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDJmdihsb2Nh
dGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0
KiBhcnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDkKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFVuaWZvcm1NYXRy
aXgzZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4NGZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNw
b3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgorICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6Omds
VW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVzZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50
KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFt
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7CisKKyAg
ICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFZhbGlkYXRlUHJvZ3JhbSgoR0x1aW50KSBwcm9n
cmFtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpn
bFZlcnRleEF0dHJpYjFmKGluZHgsIHYwKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dmVydGV4QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAg
IGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9u
ZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAg
IDo6Z2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkp
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5keCwg
YXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCit7CisgICAgZW5z
dXJlQ29udGV4dCgpOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6Omds
VmVydGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEs
IGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbFZl
cnRleEF0dHJpYjRmKGluZHgsIHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5
KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgs
IGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRl
cih1bnNpZ25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVk
LCB1bnNpZ25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgZW5z
dXJlQ29udGV4dCgpOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNpemUsIHR5
cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nh
c3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmll
d3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcg
aGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsVmlld3BvcnQoc3RhdGlj
X2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSksIHN0YXRpY19jYXN0PEdMc2l6
ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0KSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxvbmcgcG5hbWUsIHVuc2lnbmVk
IGNoYXIqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICA6OmdsR2V0Qm9vbGVh
bnYocG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVy
UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGlu
dCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRCdWZmZXJQYXJh
bWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7CisgICAg
ZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZhbHVlKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVy
aXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWdu
ZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAg
aWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQorICAgICAgICBhdHRh
Y2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRo
ZXIgd29ya3MuCisgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhU
KHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0SW50ZWdlcnYodW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sK
KyAgICAvLyBOZWVkIHRvIGVtdWxhdGUgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQv
VFlQRSBmb3IgR0wuICBBbnkgdmFsaWQKKyAgICAvLyBjb21iaW5hdGlvbiBzaG91bGQgd29yaywg
YnV0IEdMX1JHQi9HTF9VTlNJR05FRF9CWVRFIG1pZ2h0IGJlIHRoZSBtb3N0CisgICAgLy8gdXNl
ZnVsIGZvciBkZXNrdG9wIFdlYkdMIHVzZXJzLgorICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBNQVhf
RlJBR01FTlQvVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyBhbmQgTUFYX1ZBUllJTkdfVkVDVE9SUwor
ICAgIC8vIGJlY2F1c2UgZGVza3RvcCBHTCdzIGNvcnJlc3BvbmRpbmcgcXVlcmllcyByZXR1cm4g
dGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgLy8gd2hlcmVhcyBHTEVTMiByZXR1cm4gdGhl
IG51bWJlciBvZiB2ZWN0b3JzIChlYWNoIHZlY3RvciBoYXMgNCBjb21wb25lbnRzKS4KKyAgICAv
LyBUaGVyZWZvcmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZXNrdG9wIEdMIG5lZWRzIHRvIGJl
IGRpdmlkZWQgYnkgNC4KKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgc3dpdGNoIChwbmFtZSkg
eworICAgIGNhc2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVBRF9GT1JNQVQ6CisgICAgICAgICp2
YWx1ZSA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9D
T0xPUl9SRUFEX1RZUEU6CisgICAgICAgICp2YWx1ZSA9IEdMX1VOU0lHTkVEX0JZVEU7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgTUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUzoKKyAgICAg
ICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9GUkFHTUVOVF9VTklGT1JNX0NPTVBPTkVOVFMsIHZh
bHVlKTsKKyAgICAgICAgKnZhbHVlIC89IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFY
X1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhf
VkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOworICAgICAgICAqdmFsdWUgLz0gNDsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfVkFSWUlOR19WRUNUT1JTOgorICAgICAgICA6
OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZBUllJTkdfRkxPQVRTLCB2YWx1ZSk7CisgICAgICAgICp2
YWx1ZSAvPSA0OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICA6OmdsR2V0
SW50ZWdlcnYocG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcg
cG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRQ
cm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKK30KKworU3RyaW5nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHByb2dy
YW0pCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworCisgICAgZW5zdXJlQ29udGV4dCgpOworICAg
IEdMaW50IGxlbmd0aDsKKyAgICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdM
X0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7CisgICAgCisgICAgR0xzaXplaSBzaXplOworICAg
IEdMY2hhciogaW5mbyA9IChHTGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7CisgICAgaWYgKCFp
bmZvKQorICAgICAgICByZXR1cm4gIiI7CisKKyAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2coKEdM
dWludCkgcHJvZ3JhbSwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7CisgICAgU3RyaW5nIHMoaW5mbyk7
CisgICAgZmFzdEZyZWUoaW5mbyk7CisgICAgcmV0dXJuIHM7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQo
KTsKKyAgICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFtZSwg
dmFsdWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0Zm9y
bTNET2JqZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAg
ICBBU1NFUlQoc2hhZGVyKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKKworICAgIEhhc2hNYXA8
UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBt
X3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7CisgICAgCisgICAgc3dpdGNoIChwbmFtZSkg
eworICAgICAgICBjYXNlIERFTEVURV9TVEFUVVM6CisgICAgICAgIGNhc2UgU0hBREVSX1RZUEU6
CisgICAgICAgICAgICAvLyBMZXQgT3BlbkdMIGhhbmRsZSB0aGVzZS4KKyAgICAgICAgCisgICAg
ICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBwbmFtZSwgdmFsdWUpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgICAgICBjYXNlIENPTVBJTEVfU1RBVFVT
OgorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgewor
ICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7CisgICAg
ICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAg
ICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1bHQtPnNlY29uZC5pc1ZhbGlkKTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBJTkZPX0xPR19MRU5HVEg6
CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKSB7Cisg
ICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlcklu
Zm9Mb2coc2hhZGVyKS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAg
ICAgICAgY2FzZSBTSEFERVJfU09VUkNFX0xFTkdUSDoKKyAgICAgICAgICAgICgqdmFsdWUpID0g
Z2V0U2hhZGVyU291cmNlKHNoYWRlcikubGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJ
TlZBTElEX0VOVU0pOworICAgIH0KK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRT
aGFkZXJJbmZvTG9nKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFk
ZXIpOworCisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIEdMaW50IGxlbmd0aDsKKyAgICA6Omds
R2V0U2hhZGVyaXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgp
OworCisgICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0
ZXJhdG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKKworICAgIGlm
IChyZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCisgICAgICAgICByZXR1cm4gIiI7
CisKKyAgICAgU2hhZGVyU291cmNlRW50cnkgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKKworICAg
ICBpZiAoZW50cnkuaXNWYWxpZCkgeworICAgICAgICAgR0xpbnQgbGVuZ3RoOworICAgICAgICAg
OjpnbEdldFNoYWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVu
Z3RoKTsKKworICAgICAgICAgR0xzaXplaSBzaXplOworICAgICAgICAgR0xjaGFyKiBpbmZvID0g
KEdMY2hhciopIGZhc3RNYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgIGlmICghaW5mbykKKyAgICAg
ICAgICAgICByZXR1cm4gIiI7CisKKyAgICAgICAgIDo6Z2xHZXRTaGFkZXJJbmZvTG9nKChHTHVp
bnQpIHNoYWRlciwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7CisKKyAgICAgICAgIFN0cmluZyBzKGlu
Zm8pOworICAgICAgICAgZmFzdEZyZWUoaW5mbyk7CisgICAgICAgICByZXR1cm4gczsKKyAgICAg
fQorICAgICBlbHNlIHsKKyAgICAgICAgIHJldHVybiBlbnRyeS5sb2c7CisgICAgIH0KK30KKwor
U3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVj
dCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHNoYWRlcik7CisKKyAgICBlbnN1cmVDb250ZXh0KCk7
CisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRl
cmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisgICAgaWYg
KHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuICIiOwor
CisgICAgcmV0dXJuIHJlc3VsdC0+c2Vjb25kLnNvdXJjZTsKK30KKworCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWdu
ZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAg
ICA6OmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdl
dCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0
KCk7CisgICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3Qg
cHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRl
eHQoKTsKKyAgICA6OmdsR2V0VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2
YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9y
bTNET2JqZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCit7CisgICAgZW5z
dXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRVbmlmb3JtaXYoKEdMdWludCkgcHJvZ3JhbSwgbG9j
YXRpb24sIHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybUxv
Y2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQorewor
ICAgIEFTU0VSVChwcm9ncmFtKTsKKworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICByZXR1cm4g
OjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNp
Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7Cisg
ICAgZW5zdXJlQ29udGV4dCgpOworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJmdihpbmRleCwgcG5h
bWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmli
aXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgOjpnbEdldFZlcnRleEF0dHJpYml2KGluZGV4
LCBwbmFtZSwgdmFsdWUpOworfQorCitsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhB
dHRyaWJPZmZzZXQodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KCk7CisKKyAgICB2b2lkKiBwb2ludGVyOworICAgIDo6Z2xHZXRW
ZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRleCwgcG5hbWUsICZwb2ludGVyKTsKKyAgICByZXR1cm4g
cmVpbnRlcnByZXRfY2FzdDxsb25nPihwb2ludGVyKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4
dDNEOjp0ZXhJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVk
IGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25l
ZCBib3JkZXIsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQor
eworICAgIGVuc3VyZUNvbnRleHQoKTsKKworICAgIDo6Z2xUZXhJbWFnZTJEKHRhcmdldCwgbGV2
ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1hdCwgdHlwZSwg
cGl4ZWxzKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhT
dWJJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIHhvZmYs
IHVuc2lnbmVkIHlvZmYsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVk
IGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQoreworICAgIGVuc3VyZUNvbnRl
eHQoKTsKKworICAgIC8vIEZJWE1FOiB3ZSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoIFBpeGVsU3Rv
cmUgcGFyYW1zIHdoZW4gZGVhbGluZyB3aXRoIGltYWdlIGJ1ZmZlcnMgdGhhdCBkaWZmZXIgZnJv
bSB0aGUgc3ViaW1hZ2Ugc2l6ZQorICAgIDo6Z2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWws
IHhvZmYsIHlvZmYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKKyAgICBy
ZXR1cm4gMDsKK30KKwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcigp
Cit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIEdMdWludCBvOworICAgIGdsR2VuQnVmZmVy
cygxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNE
OjpjcmVhdGVGcmFtZWJ1ZmZlcigpCit7CisgICAgZW5zdXJlQ29udGV4dCgpOworICAgIEdMdWlu
dCBvOworICAgIGdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30K
KwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0oKQoreworICAgIGVu
c3VyZUNvbnRleHQoKTsKKyAgICByZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7Cit9CisKK3Vuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVSZW5kZXJidWZmZXIoKQoreworICAgIGVuc3Vy
ZUNvbnRleHQoKTsKKyAgICBHTHVpbnQgbzsKKyAgICBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwg
Jm8pOworICAgIHJldHVybiBvOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3Jl
YXRlU2hhZGVyKHVuc2lnbmVkIGxvbmcgdHlwZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7Cisg
ICAgcmV0dXJuIGdsQ3JlYXRlU2hhZGVyKCh0eXBlID09IEZSQUdNRU5UX1NIQURFUikgPyBHTF9G
UkFHTUVOVF9TSEFERVIgOiBHTF9WRVJURVhfU0hBREVSKTsKK30KKwordW5zaWduZWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmNyZWF0ZVRleHR1cmUoKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAg
ICBHTHVpbnQgbzsKKyAgICBnbEdlblRleHR1cmVzKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30K
Kwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlQnVmZmVyKHVuc2lnbmVkIGJ1ZmZlcikK
K3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgZ2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25l
ZCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgZ2xEZWxldGVGcmFt
ZWJ1ZmZlcnNFWFQoMSwgJmZyYW1lYnVmZmVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZGVsZXRlUHJvZ3JhbSh1bnNpZ25lZCBwcm9ncmFtKQoreworICAgIGVuc3VyZUNvbnRleHQo
KTsKKyAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRlbGV0ZVJlbmRlcmJ1ZmZlcih1bnNpZ25lZCByZW5kZXJidWZmZXIpCit7CisgICAg
ZW5zdXJlQ29udGV4dCgpOworICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmcmVuZGVy
YnVmZmVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlU2hhZGVyKHVuc2ln
bmVkIHNoYWRlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KCk7CisgICAgZ2xEZWxldGVTaGFkZXIo
c2hhZGVyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSh1bnNp
Z25lZCB0ZXh0dXJlKQoreworICAgIGVuc3VyZUNvbnRleHQoKTsKKyAgICBnbERlbGV0ZVRleHR1
cmVzKDEsICZ0ZXh0dXJlKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4dDNEOjpzaXplSW5CeXRl
cyhpbnQgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBHTF9CWVRF
OgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGJ5dGUpOworICAgICAgICBjYXNlIEdMX1VO
U0lHTkVEX0JZVEU6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWJ5dGUpOworICAgICAg
ICBjYXNlIEdMX1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHNob3J0KTsKKyAg
ICAgICAgY2FzZSBHTF9VTlNJR05FRF9TSE9SVDoKKyAgICAgICAgICAgIHJldHVybiBzaXplb2Yo
R0x1c2hvcnQpOworICAgICAgICBjYXNlIEdMX0lOVDoKKyAgICAgICAgICAgIHJldHVybiBzaXpl
b2YoR0xpbnQpOworICAgICAgICBjYXNlIEdMX1VOU0lHTkVEX0lOVDoKKyAgICAgICAgICAgIHJl
dHVybiBzaXplb2YoR0x1aW50KTsKKyAgICAgICAgY2FzZSBHTF9GTE9BVDoKKyAgICAgICAgICAg
IHJldHVybiBzaXplb2YoR0xmbG9hdCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN5bnRoZXNpemVH
TEVycm9yKHVuc2lnbmVkIGxvbmcgZXJyb3IpCit7CisgICAgbV9zeW50aGV0aWNFcnJvcnMuYWRk
KGVycm9yKTsKK30KKworfQorCisjZW5kaWYgLy8gRU5BQkxFKDNEX0NBTlZBUykK
</data>
<flag name="review"
          id="55983"
          type_id="1"
          status="-"
          setter="cmarrin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66912</attachid>
            <date>2010-09-08 10:38:12 -0700</date>
            <delta_ts>2010-09-08 11:59:45 -0700</delta_ts>
            <desc>makeContextCurrent, not ensureContext.</desc>
            <filename>begin-gcd3d-refactor9</filename>
            <type>text/plain</type>
            <size>155472</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Njk1NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTYwIEBACisyMDEwLTA5LTA4ICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgbm9uLU1hYyBzcGVjaWZpYyBjb2RlIGludG8gR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuCisgICAgICAgIAorICAgICAgICBNb3ZpbmcgdGhpcyBmaWxlIGludG8gcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjIGZvciBub3csIGFuZCBvbmx5IGJ1aWxkaW5nIG9uIE1hYy4KKworICAgICAgICBO
byBuZXcgdGVzdHMuIChPT1BTISkKKworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvajoKKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTE9iamVjdDo6ZGVsZXRlT2JqZWN0KToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9BTkdMRVdlYktpdEJyaWRnZS5oOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmVuc3VyZUNvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmlzRXJyb3JHZW5lcmF0ZWRPbk91dE9mQm91bmRzQWNjZXNzZXMpOgorICAgICAgICAq
IHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHA6IENvcGll
ZCBmcm9tIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFwaGljc0NvbnRleHQzRE1hYy5tbS4KKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVyZSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRCdWZmZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmJsZW5kRXF1YXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRGdW5jKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpibGVuZEZ1bmNTZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6YnVmZmVyRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
YnVmZmVyU3ViRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2hl
Y2tGcmFtZWJ1ZmZlclN0YXR1cyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Y2xlYXJDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xl
YXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4SW1hZ2UyRCk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1YkltYWdlMkQpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpkZXB0aEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmRlcHRoTWFzayk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
ZGVwdGhSYW5nZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNo
U2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVydGV4QXR0cmli
QXJyYXkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdBcnJheXMp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVtZW50cyk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZmluaXNoKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmbHVzaCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEFjdGl2ZVVuaWZvcm0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmdldEF0dGFjaGVkU2hhZGVycyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEVycm9yKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRTdHJpbmcpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmhpbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzQnVmZmVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6aXNSZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjppc1RleHR1cmUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmxpbmVXaWR0aCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6bGlu
a1Byb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3Rv
cmVpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWFkUGl4ZWxzKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3Jh
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdl
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1NlcGFyYXRlKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayk6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVyaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTFmKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtMWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtMmYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0y
ZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmdik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0yaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNp
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGkpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgyZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0ZnYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVzZVByb2dyYW0pOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjFmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnZlcnRleEF0dHJpYjJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliM2YpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6dmVydGV4QXR0cmliNGYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnZlcnRleEF0dHJpYjRmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6dmVydGV4QXR0cmliUG9pbnRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6dmlld3BvcnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEJvb2xlYW52KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRCdWZm
ZXJQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0
RmxvYXR2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRGcmFtZWJ1
ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0SW50ZWdlcnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1pdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Z2V0UHJvZ3JhbUluZm9Mb2cpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVySW5mb0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0U2hhZGVyU291cmNlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6Z2V0VGV4UGFyYW1ldGVyaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250
ZXh0M0Q6OmdldFVuaWZvcm1mdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0VW5pZm9ybWl2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRVbmlmb3JtTG9jYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmdldFZlcnRleEF0dHJpYmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRWZXJ0ZXhBdHRyaWJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjp0ZXhJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Ojp0ZXhTdWJJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpj
cmVhdGVCdWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZUZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVh
dGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVS
ZW5kZXJidWZmZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZVNoYWRlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4
dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlQnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZl
cik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUHJvZ3JhbSk6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVTaGFkZXIpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUpOgorCiAy
MDEwLTA5LTA4ICBab2x0YW4gSGVyY3plZyAgPHpoZXJjemVnQHdlYmtpdC5vcmc+CiAKICAgICAg
ICAgUmV2aWV3ZWQgYnkgRGlyayBTY2h1bHplLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2Rl
cHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDY2ODg3KQorKysgV2ViQ29yZS9XZWJDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTUzNjksNiArNTM2
OSw3IEBACiAJCUZBQkU3MkZFMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQUJFNzJGQzEwNTlD
MjExMDBEOTk5REQgLyogTWF0aE1MTmFtZXMuY3BwICovOyB9OwogCQlGQUMxMkNDNDExMjBEQTY5
MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZBQzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5k
ZXJNYXRoTUxTdWJTdXAuY3BwICovOyB9OwogCQlGQUMxMkNDNTExMjBEQTY5MDBEQUNDMzYgLyog
UmVuZGVyTWF0aE1MU3ViU3VwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGQUMxMkNDMzExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3Vw
LmggKi87IH07CisJCUZCQzIyMERGMTIzN0ZCRUIwMEJDRjc4OCAvKiBHcmFwaGljc0NvbnRleHQz
RE9wZW5HTC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYg
PSBGQkMyMjBERTEyMzdGQkVCMDBCQ0Y3ODggLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3Bw
ICovOyB9OwogCQlGRTZGRDQ4ODBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDg1MEY2NzZF
NTcwMDA5Mjg3MyAvKiBDb29yZGluYXRlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0g
KFByaXZhdGUsICk7IH07IH07CiAJCUZFNkZENDhEMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3Jk
aW5hdGVzLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IEZFNkZENDhCMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmNwcCAqLzsgfTsKIAkJ
RkU2RkQ0OEUwRjY3NkU5MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDhDMEY2NzZFOTMwMDA5Mjg3
MyAvKiBKU0Nvb3JkaW5hdGVzLmggKi87IH07CkBAIC0xMTI0MCw2ICsxMTI0MSw3IEBACiAJCUZB
QkU3MkZDMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBNYXRoTUxOYW1lcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCUZBQzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJT
dXAuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxh
c3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWF0aE1M
U3ViU3VwLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkFDMTJDQzMxMTIwREE2
OTAwREFDQzM2IC8qIFJlbmRlck1hdGhNTFN1YlN1cC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5j
Lmg7IHBhdGggPSBSZW5kZXJNYXRoTUxTdWJTdXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKKwkJRkJDMjIwREUxMjM3RkJFQjAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdM
LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEdyYXBoaWNzQ29udGV4
dDNET3BlbkdMLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU0OUVGOTcwREM1
MTQ2MjAwNDI2NkUxIC8qIERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gdGV4dDsgcGF0aCA9IERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlGRTZGRDQ4NTBGNjc2RTU3MDAwOTI4NzMgLyog
Q29vcmRpbmF0ZXMuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ29vcmRpbmF0
ZXMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU2RkQ0ODYwRjY3NkU1NzAwMDky
ODczIC8qIENvb3JkaW5hdGVzLmlkbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBDb29yZGluYXRl
cy5pZGw7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNTg2MSw2ICsxNTg2Myw3IEBA
CiAJCQkJQjUzMjBENjgxMjJBMjRFOTAwMkQxNDQwIC8qIGNvY29hICovLAogCQkJCUE3NUU4QjdG
MEUxREUyQjAwMDdGMjQ4MSAvKiBmaWx0ZXJzICovLAogCQkJCUIyNzUzNTQ5MEIwNTM4MTQwMDJD
RTY0RiAvKiBtYWMgKi8sCisJCQkJRkJDMjIwREQxMjM3RkJFQjAwQkNGNzg4IC8qIG9wZW5nbCAq
LywKIAkJCQlGNEVBRjRBQjEwQzc0MjY4MDA5MTAwRDMgLyogb3BlbnR5cGUgKi8sCiAJCQkJNDlF
OTExQjIwRUY4NkQyNzAwOUQwQ0FGIC8qIHRyYW5zZm9ybXMgKi8sCiAJCQkJNDkwNzA3RTQxMjE5
QzA0MzAwRDkwRTUxIC8qIEFOR0xFV2ViS2l0QnJpZGdlLmNwcCAqLywKQEAgLTE3Njg4LDYgKzE3
NjkxLDE0IEBACiAJCQlwYXRoID0gbWF0aG1sOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsK
IAkJfTsKKwkJRkJDMjIwREQxMjM3RkJFQjAwQkNGNzg4IC8qIG9wZW5nbCAqLyA9IHsKKwkJCWlz
YSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJRkJDMjIwREUxMjM3RkJFQjAwQkNG
Nzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCAqLywKKwkJCSk7CisJCQlwYXRoID0g
b3BlbmdsOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIC8qIEVuZCBQQlhHcm91
cCBzZWN0aW9uICovCiAKIC8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8K
QEAgLTIyODk1LDYgKzIyOTA2LDcgQEAKIAkJCQk4OTg3ODVCODEyMkNBMkE3MDAzQUFCREEgLyog
SlNNZXRhZGF0YUNhbGxiYWNrLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg5ODc4NUYwMTIyRTFF
ODcwMDNBQUJEQSAvKiBKU0ZpbGVFeGNlcHRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODk4
Nzg1RjQxMjJFMUVBQzAwM0FBQkRBIC8qIEpTRmlsZVJlYWRlclN5bmMuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJRkJDMjIwREYxMjM3RkJFQjAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3Bl
bkdMLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9z
dHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9B
TkdMRVdlYktpdEJyaWRnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvQU5HTEVXZWJLaXRCcmlkZ2UuaAkocmV2aXNpb24gNjY4ODcpCisrKyBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0FOR0xFV2ViS2l0QnJpZGdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTM4LDYg
KzM4LDcgQEAgZW51bSBBTkdMRVNoYWRlclR5cGUgewogICAgIFNIQURFUl9UWVBFX0ZSQUdNRU5U
ID0gRVNoTGFuZ0ZyYWdtZW50CiB9OwogCisKIGNsYXNzIEFOR0xFV2ViS2l0QnJpZGdlIHsKIHB1
YmxpYzoKIApJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250
ZXh0M0RNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMv
R3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHJldmlzaW9uIDY2ODg3KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHdvcmtpbmcgY29weSkK
QEAgLTMxLDIxICszMSwyMiBAQAogCiAjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKIAorI2lu
Y2x1ZGUgIkFOR0xFL1NoYWRlckxhbmcuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlci5oIgogI2lu
Y2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgotI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCiAjaW5j
bHVkZSAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
R0JpdG1hcENvbnRleHQuaD4KICNpbmNsdWRlICJGbG9hdDMyQXJyYXkuaCIKICNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2FudmFzRWxlbWVudC5oIgogI2luY2x1
ZGUgIkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiSW50MzJBcnJheS5oIgogI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1ZGUgIldlYkdM
TGF5ZXIuaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CiAjaW5j
bHVkZSA8T3BlbkdML0NHTFJlbmRlcmVycy5oPgogI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2lu
Y2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVyLmgiCisjaW5jbHVkZSAi
V2ViR0xPYmplY3QuaCIKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KICNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTIyOSw4MSArMjMwLDE0IEBAIEdyYXBoaWNzQ29udGV4
dDNEOjp+R3JhcGhpY3NDb250ZXh0M0QoKQogICAgIH0KIH0KIAotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKLXsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb25z
ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9FWFRFTlNJ
T05TKSk7Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewotICAgICAgICBpZiAoc3RkOjpzdHJz
dHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbCIpKSB7Ci0gICAgICAg
ICAgICBpZiAoIW1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgbV9hdHRycy5kZXB0aCA9
IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9hdHRycy5zdGVuY2lsID0gZmFs
c2U7Ci0gICAgfQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBib29sIGlz
VmFsaWRWZW5kb3IgPSB0cnVlOwotICAgICAgICAvLyBDdXJyZW50bHkgaW4gTWFjIHdlIG9ubHkg
dHVybiBvbiBhbnRpYWxpYXMgaWYgdmVuZG9yIGlzIE5WSURJQS4KLSAgICAgICAgY29uc3QgY2hh
ciogdmVuZG9yID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhH
TF9WRU5ET1IpKTsKLSAgICAgICAgaWYgKCFzdGQ6OnN0cnN0cih2ZW5kb3IsICJOVklESUEiKSkK
LSAgICAgICAgICAgIGlzVmFsaWRWZW5kb3IgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFpc1ZhbGlk
VmVuZG9yIHx8ICFzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xfRVhUX2ZyYW1lYnVmZmVyX211
bHRpc2FtcGxlIikpCi0gICAgICAgICAgICBtX2F0dHJzLmFudGlhbGlhcyA9IGZhbHNlOwotICAg
IH0KLSAgICAvLyBGSVhNRTogaW5zdGVhZCBvZiBlbmZvcmNpbmcgcHJlbXVsdGlwbGllZEFscGhh
ID0gdHJ1ZSwgaW1wbGVtZW50IHRoZQotICAgIC8vIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBwcmVt
dWx0aXBsaWVkQWxwaGEgPSBmYWxzZSBpcyByZXF1ZXN0ZWQuCi0gICAgbV9hdHRycy5wcmVtdWx0
aXBsaWVkQWxwaGEgPSB0cnVlOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29u
dGV4dEN1cnJlbnQoKQogewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVyaW5nUmVzdWx0c1RvQ2Fu
dmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCi17Ci0gICAgSFRNTENhbnZhc0Vs
ZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwotICAgIEltYWdlQnVmZmVyKiBpbWFn
ZUJ1ZmZlciA9IGNhbnZhcy0+YnVmZmVyKCk7Ci0KLSAgICBpbnQgcm93Qnl0ZXMgPSBtX2N1cnJl
bnRXaWR0aCAqIDQ7Ci0gICAgaW50IHRvdGFsQnl0ZXMgPSByb3dCeXRlcyAqIG1fY3VycmVudEhl
aWdodDsKLQotICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IHBpeGVscyhuZXcgdW5zaWdu
ZWQgY2hhclt0b3RhbEJ5dGVzXSk7Ci0gICAgaWYgKCFwaXhlbHMpCisgICAgaWYgKCFtX2NvbnRl
eHRPYmopCiAgICAgICAgIHJldHVybjsKIAotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0KLSAgICBib29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0gICAgaWYgKG1f
YXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVB
RF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6
Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdo
dCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQ09MT1JfQlVGRkVS
X0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fZmJvKSB7Ci0gICAgICAgICAg
ICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
R0xpbnQgcGFja0FsaWdubWVudCA9IDQ7Ci0gICAgYm9vbCBtdXN0UmVzdG9yZVBhY2tBbGlnbm1l
bnQgPSBmYWxzZTsKLSAgICA6OmdsR2V0SW50ZWdlcnYoR0xfUEFDS19BTElHTk1FTlQsICZwYWNr
QWxpZ25tZW50KTsKLSAgICBpZiAocGFja0FsaWdubWVudCA+IDQpIHsKLSAgICAgICAgOjpnbFBp
eGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICAgICAgbXVzdFJlc3RvcmVQYWNr
QWxpZ25tZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICA6OmdsUmVhZFBpeGVscygwLCAwLCBtX2N1
cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84
XzhfOF9SRVYsIHBpeGVscy5nZXQoKSk7Ci0KLSAgICBpZiAobXVzdFJlc3RvcmVQYWNrQWxpZ25t
ZW50KQotICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIHBhY2tBbGln
bm1lbnQpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7Ci0KLSAgICBwYWludFRv
Q2FudmFzKHBpeGVscy5nZXQoKSwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwKLSAg
ICAgICAgICAgICAgICAgIGNhbnZhcy0+d2lkdGgoKSwgY2FudmFzLT5oZWlnaHQoKSwgaW1hZ2VC
dWZmZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgIENHTENvbnRleHRPYmog
Y3VycmVudENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50
Q29udGV4dCAhPSBtX2NvbnRleHRPYmopCisgICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1f
Y29udGV4dE9iaik7CiB9CiAKIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlh
bnQoKSBjb25zdApAQCAtMzIwLDEzNDMgKzI1NCw3IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmlzRXJyb3JHZW5lcmF0ZWQKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGlmICh3
aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFt
X2NvbnRleHRPYmopCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX2N1cnJlbnRXaWR0aCA9
IHdpZHRoOwotICAgIG1fY3VycmVudEhlaWdodCA9IGhlaWdodDsKLSAgICAKLSAgICBDR0xTZXRD
dXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIEdMdWludCBpbnRlcm5hbENv
bG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSAwOwot
ICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBH
TF9SR0JBODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0JBOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0I4OwotICAgICAgICBjb2xvckZvcm1h
dCA9IEdMX1JHQjsKLSAgICB9Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRl
cHRoKSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHRoZSBsb2dpYyB3aGVyZSBzdGVuY2ls
IGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBub3QuCi0gICAgICAgIC8vIFNlZSBHcmFwaGljc0Nv
bnRleHQzRCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCAmJiBtX2F0
dHJzLmRlcHRoKQotICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9E
RVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50ZXJuYWxE
ZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgfQotCi0gICAgYm9v
bCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotCi0gICAgLy8gcmVzaXplIG11bHRpc2FtcGxlIEZC
TwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBHTGludCBtYXhTYW1wbGVD
b3VudDsKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9TQU1QTEVTX0VYVCwgJm1heFNh
bXBsZUNvdW50KTsKLSAgICAgICAgR0xpbnQgc2FtcGxlQ291bnQgPSBzdGQ6Om1pbig4LCBtYXhT
YW1wbGVDb3VudCk7Ci0gICAgICAgIGlmIChzYW1wbGVDb3VudCA+IG1heFNhbXBsZUNvdW50KQot
ICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBtYXhTYW1wbGVDb3VudDsKLSAgICAgICAgaWYgKG1f
Ym91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAg
ICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIDo6Z2xCaW5k
UmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1
ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xf
UkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRo
LCBoZWlnaHQpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJF
WFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7
Ci0gICAgICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JF
TkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwg
d2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsKQotICAgICAg
ICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1fYXR0cnMuZGVw
dGgpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAg
IDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDApOwotICAgICAg
ICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0g
R0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogY2xl
YW51cC4KLSAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyByZXNpemUgcmVndWxhciBGQk8KLSAgICBpZiAobV9ib3VuZEZCTyAhPSBtX2Zibykg
ewotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgfQotICAgIDo6Z2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmUpOwotICAgIDo6Z2xUZXhJbWFnZTJEKEdM
X1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGNv
bG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKLSAgICA6OmdsRnJhbWVidWZmZXJUZXh0
dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdM
X1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRV
UkVfMkQsIDApOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxpYXMgJiYgKG1fYXR0cnMuc3RlbmNp
bCB8fCBtX2F0dHJzLmRlcHRoKSkgewotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xS
ZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIGludGVybmFsRGVwdGhT
dGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCi0gICAg
ICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0
ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJC
VUZGRVJfRVhULCAwKTsKLSAgICB9Ci0gICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgewot
ICAgICAgICAvLyBGSVhNRTogY2xlYW51cAotICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IH0KLQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgICAgICBtdXN0UmVz
dG9yZUZCTyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgcmVuZGVyYnVmZmVy
cyB0byAwLgotICAgIEdMYm9vbGVhbiBjb2xvck1hc2tbXSA9IHtHTF9UUlVFLCBHTF9UUlVFLCBH
TF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNrID0gR0xfVFJVRSwgc3RlbmNpbE1hc2sgPSBHTF9U
UlVFOwotICAgIEdMYm9vbGVhbiBpc1NjaXNzb3JFbmFibGVkID0gR0xfRkFMU0U7Ci0gICAgR0xi
b29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYml0ZmllbGQgY2xlYXJN
YXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLSAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfQ09MT1Jf
V1JJVEVNQVNLLCBjb2xvck1hc2spOwotICAgIDo6Z2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJV
RSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKG1fYXR0cnMuZGVwdGgpIHsKLSAgICAgICAg
OjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dSSVRFTUFTSywgJmRlcHRoTWFzayk7Ci0gICAgICAg
IDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNsZWFyTWFzayB8PSBHTF9ERVBUSF9C
VUZGRVJfQklUOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7Ci0gICAgICAgIDo6
Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dSSVRFTUFTSywgJnN0ZW5jaWxNYXNrKTsKLSAgICAg
ICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUpOwotICAgICAgICBjbGVhck1hc2sgfD0gR0xfU1RF
TkNJTF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpc1NjaXNzb3JFbmFibGVkID0gOjpnbElzRW5h
YmxlZChHTF9TQ0lTU09SX1RFU1QpOwotICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7
Ci0gICAgaXNEaXRoZXJFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9ESVRIRVIpOwotICAgIDo6
Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICA6OmdsQ2xlYXIoY2xlYXJNYXNrKTsKLQotICAg
IDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBdLCBjb2xvck1hc2tbMV0sIGNvbG9yTWFza1syXSwg
Y29sb3JNYXNrWzNdKTsKLSAgICBpZiAobV9hdHRycy5kZXB0aCkKLSAgICAgICAgOjpnbERlcHRo
TWFzayhkZXB0aE1hc2spOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAgICAgIDo6Z2xT
dGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Ci0gICAgaWYgKGlzU2Npc3NvckVuYWJsZWQpCi0gICAg
ICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBlbHNlCi0gICAgICAgIDo6Z2xE
aXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaWYgKGlzRGl0aGVyRW5hYmxlZCkKLSAgICAg
ICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIGVsc2UKLSAgICAgICAgOjpnbERpc2FibGUo
R0xfRElUSEVSKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZUZCTykKLSAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwotCi0gICAgOjpn
bEZsdXNoKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRl
eHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRD
b250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCi0gICAgICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpwcmVwYXJlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwot
ICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1
cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0NP
TE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLSAgICB9Ci0gICAgOjpnbEZpbmlz
aCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJlKHVuc2lnbmVk
IGxvbmcgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmF0dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEF0dGFjaFNoYWRlcigoR0x1
aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25l
ZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0p
OwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZEF0dHJpYkxv
Y2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZmZXIpOwotfQot
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNpZ25lZCBsb25n
IHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAgaWYgKGJ1ZmZlcikKLSAgICAgICAg
ZmJvID0gKEdMdWludClidWZmZXI7Ci0gICAgZWxzZQotICAgICAgICBmYm8gPSAobV9hdHRycy5h
bnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8pOwotICAgIGlmIChmYm8gIT0gbV9i
b3VuZEZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwgZmJvKTsK
LSAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RP
YmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIChHTHVpbnQpIHJlbmRlcmJ1ZmZl
cik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQg
bG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkg
dGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91Ymxl
IHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2Fz
dDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBtb2RlICkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRXF1YXRpb24obW9kZSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSh1bnNp
Z25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1v
ZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRG
dW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3Is
IGRmYWN0b3IpOwotfSAgICAgICAKLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5j
U2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNp
Z25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdC
LCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1bnNpZ25lZCBs
b25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNvbnN0
IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNh
Z2UpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRhKHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJTdWJEYXRh
KHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLX0KLQotdW5zaWduZWQgbG9uZyBHcmFwaGlj
c0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25nIHRhcmdldCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xDaGVj
a0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVhckNvbG9yKHN0
YXRpY19jYXN0PGZsb2F0PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxm
bG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0PihhKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyKG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJvb2wgYmx1ZSwg
Ym9vbCBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bENvbG9yTWFzayhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAg
QVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAg
aW50IEdMc2hhZGVyVHlwZTsKLSAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKLQotICAg
IGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFERVJfVFlQRSwgJkdMc2hhZGVyVHlwZSk7Ci0gICAg
Ci0gICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hBREVSKQotICAgICAgICBzaGFkZXJU
eXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwotICAgIGVsc2UgaWYgKEdMc2hhZGVyVHlwZSA9PSBG
UkFHTUVOVF9TSEFERVIpCi0gICAgICAgIHNoYWRlclR5cGUgPSBTSEFERVJfVFlQRV9GUkFHTUVO
VDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybjsgLy8gSW52YWxpZCBzaGFkZXIgdHlwZS4KLQot
ICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRv
ciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVz
dWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
aGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKLQotICAgIFN0cmluZyB0
cmFuc2xhdGVkU2hhZGVyU291cmNlOwotICAgIFN0cmluZyBzaGFkZXJJbmZvTG9nOwotCi0gICAg
Ym9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNoYWRlclNvdXJjZShlbnRyeS5zb3Vy
Y2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNsYXRlZFNoYWRlclNvdXJjZSwgc2hh
ZGVySW5mb0xvZyk7Ci0KLSAgICBlbnRyeS5sb2cgPSBzaGFkZXJJbmZvTG9nOwotICAgIGVudHJ5
LmlzVmFsaWQgPSBpc1ZhbGlkOwotCi0gICAgaWYgKCFpc1ZhbGlkKQotICAgICAgICByZXR1cm47
IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1vdmUgZm9yd2FyZCB3aXRoIGNvbXBp
bGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKLQotICAgIGludCB0cmFuc2xhdGVkU2hhZGVyTGVu
Z3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgoKTsKLQotICAgIGNvbnN0IENTdHJp
bmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS51dGY4
KCk7Ci0gICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRlclB0ciA9IHRyYW5zbGF0ZWRTaGFk
ZXJDU3RyaW5nLmRhdGEoKTsKLSAgICAKLSAgICA6OmdsU2hhZGVyU291cmNlKChHTHVpbnQpIHNo
YWRlciwgMSwgJnRyYW5zbGF0ZWRTaGFkZXJQdHIsICZ0cmFuc2xhdGVkU2hhZGVyTGVuZ3RoKTsK
LSAgICAKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotICAgIAotICAg
IGludCBHTENvbXBpbGVTdWNjZXNzOwotICAgIAotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIENPTVBJTEVfU1RBVFVTLCAmR0xDb21waWxlU3VjY2Vzcyk7Ci0gICAgCi0gICAg
Ly8gQVNTRVJUIHRoYXQgQU5HTEUgZ2VuZXJhdGVkIEdMU0wgd2lsbCBiZSBhY2NlcHRlZCBieSBP
cGVuR0wKLSAgICBBU1NFUlQoR0xDb21waWxlU3VjY2VzcyA9PSBHTF9UUlVFKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFu
dGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBs
ZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZF
Ul9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1Jf
QlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlUZXhJbWFnZTJE
KHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3Jk
ZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlz
YW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29w
eVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcgeG9m
ZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1w
bGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFt
ZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwg
eSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0g
ICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQs
IHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ3VsbEZhY2UobW9kZSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZsYWcpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aE1hc2soZmxhZyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoUmFuZ2UoZG91YmxlIHpOZWFyLCBk
b3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
ZXRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNo
YWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXRhY2hTaGFkZXIoKEdMdWlu
dCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGUoY2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0
cmliQXJyYXkoaW5kZXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJyYXlz
KHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmlyc3Qs
IGNvdW50KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVuc2ln
bmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBs
b25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4o
c3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGVWZXJ0ZXhBdHRy
aWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlzaCgpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGaW5pc2goKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2ln
bmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBs
YXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWludCkgYnVmZmVyOwotICAgIGlmIChh
dHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkgewotICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBUSF9BVFRBQ0hNRU5ULCByZW5kZXJi
dWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRl
cmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0
LCByZW5kZXJidWZmZXIpOwotICAgIH0gZWxzZQotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5k
ZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRl
cmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVy
ZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2ln
bmVkIGxvbmcgdGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxvbmcgbGV2ZWwp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGcmFtZWJ1ZmZl
clRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgKEdMdWludCkgdGV4
dHVyZSwgbGV2ZWwpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UodW5z
aWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsRnJvbnRGYWNlKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5l
cmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCi17Ci0gICAgaWYg
KCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICBHTGludCBtYXhBdHRyaWJ1dGVTaXplID0gMDsKLSAgICA6OmdsR2V0UHJvZ3Jh
bWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFY
X0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdMY2hhciBuYW1lW21heEF0dHJpYnV0
ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0
ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAgR0xpbnQgc2l6ZSA9
IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVBdHRyaWIoc3RhdGlj
X2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heEF0dHJpYnV0ZVNpemUsICZuYW1lTGVu
Z3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3RoKTsK
LSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0gICAgCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVVbmlmb3Jt
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5m
byYgaW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJy
b3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsK
LSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FD
VElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7Ci0gICAgR0xjaGFyIG5h
bWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1
ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOwotICAgIEdM
aW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsKLSAgICA6OmdsR2V0QWN0aXZlVW5p
Zm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4VW5pZm9ybVNpemUs
ICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1l
TGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFjaGVk
U2hhZGVycyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGludCBtYXhDb3VudCwgaW50KiBjb3Vu
dCwgdW5zaWduZWQgaW50KiBzaGFkZXJzKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEF0dGFjaGVk
U2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQsIHNo
YWRlcnMpOwotfQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9uKFBs
YXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIGlmICgh
cHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIC0xOwogICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHBy
b2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDNEOjpBdHRy
aWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygpCi17Ci0gICAg
cmV0dXJuIG1fYXR0cnM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEVycm9yKCkKLXsKLSAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4gMCkgewotICAg
ICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9IG1fc3ludGhl
dGljRXJyb3JzLmJlZ2luKCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gKml0ZXI7Ci0g
ICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKLSAgICAgICAgcmV0dXJuIGVy
cjsKLSAgICB9Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJu
IDo6Z2xHZXRFcnJvcigpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0cmlu
Zyh1bnNpZ25lZCBsb25nIG5hbWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5nKG5hbWUpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25nIHRhcmdldCwg
dW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBpZiAoIWJ1ZmZlcikK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICByZXR1cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc0VuYWJsZWQo
Y2FwKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcihQbGF0Zm9y
bTNET2JqZWN0IGZyYW1lYnVmZmVyKQotewotICAgIGlmICghZnJhbWVidWZmZXIpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKLX0K
LQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1Byb2dy
YW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVu
ZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGlmICghcmVu
ZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNSZW5kZXJidWZmZXJFWFQoKEdMdWlu
dCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIo
UGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgaWYgKCFzaGFkZXIpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
cmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotfQotCi1ib29sIEdyYXBoaWNz
Q29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQotewotICAgIGlm
ICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0
dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0
aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmVXaWR0
aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIEFTU0VSVChw
cm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmtQ
cm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
aXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFt
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFj
dG9yLCBkb3VibGUgdW5pdHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNf
Y2FzdDxmbG9hdD4odW5pdHMpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBp
eGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBo
ZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIGRh
dGEpCi17Ci0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0
aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVy
aW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZsdXNoKCk7Ci0gICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRp
c2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHks
IHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9D
T0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsRmx1c2goKTsKLSAg
ICB9Ci0gICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBkYXRhKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211
bHRpc2FtcGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgbm90IGlt
cGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZkZWZzIGZvciB0
aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNp
Z25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dp
dGNoIChpbnRlcm5hbGZvcm1hdCkgewotICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKLSAgICAgICAg
aW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBERVBUSF9DT01QT05FTlQxNjoKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBH
TF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCQTQ6Ci0gICAg
Y2FzZSBSR0I1X0ExOgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUkdCNTY1OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JH
QjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhU
KHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2FtcGxlQ292ZXJh
Z2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIGNvbnN0
IFN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5Owot
Ci0gICAgZW50cnkuc291cmNlID0gc3RyaW5nOwotCi0gICAgbV9zaGFkZXJTb3VyY2VNYXAuc2V0
KHNoYWRlciwgZW50cnkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVu
Yyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsRnVuYyhmdW5j
LCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1Nl
cGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwg
dW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2sp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsTWFz
ayhtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0
ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxNYXNrU2VwYXJhdGUoZmFjZSwg
bWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcCh1bnNpZ25lZCBs
b25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwg
emZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxv
bmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWlsLCB6ZmFpbCwg
enBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJmKHVuc2ln
bmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1l
LCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dGV4UGFyYW1ldGVyaSh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBpbnQgdmFs
dWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJh
bWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWYo
bG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmdihs
b25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFmdihsb2NhdGlvbiwgc2l6ZSwgYXJy
YXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmYobG9uZyBsb2NhdGlv
biwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50
IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9m
IDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0yZnYo
bG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtM2YobG9jYXRp
b24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRpb24sIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB2MCwgdjEsIHYy
LCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYobG9uZyBsb2Nh
dGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5l
ZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBsb2NhdGlvbiwgaW50IHYwKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFpKGxvY2F0
aW9uLCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBs
b2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0aW9uLCBpbnQg
djAsIGludCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6
ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBs
b2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaShsb2NhdGlvbiwgdjAsIHYxLCB2Mik7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0zaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIs
IGludCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVu
aWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQot
ewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGl2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRy
aXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNp
emUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXgy
ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3Nl
LCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMg
dG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxv
Y2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAv
LyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24s
IHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShQbGF0Zm9ybTNET2Jq
ZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmFsaWRhdGVQcm9ncmFtKChHTHVpbnQpIHBy
b2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCog
YXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJm
KGluZHgsIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmKGluZHgsIHYwLCB2MSwg
djIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZnYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1bnNpZ25lZCBsb25nIGluZHgsIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwgdjAsIHYxLCB2
MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0ZnYodW5z
aWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgYXJyYXkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2lnbmVkIGxvbmcg
aW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQsIHVuc2lnbmVkIGxvbmcg
c3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwg
bm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxp
bnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2aWV3cG9y
dChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWln
aHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWaWV3cG9y
dChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwgc3RhdGljX2Nh
c3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9uZyBwbmFtZSwg
dW5zaWduZWQgY2hhciogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZh
bHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RmxvYXR2KHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBp
ZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpCi0gICAgICAgIGF0dGFj
aG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVOQ0lMX0FUVEFDSE1FTlQsIGVpdGhl
ciB3b3Jrcy4KLSAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQo
dGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewot
ICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVC9U
WVBFIGZvciBHTC4gIEFueSB2YWxpZAotICAgIC8vIGNvbWJpbmF0aW9uIHNob3VsZCB3b3JrLCBi
dXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUgdGhlIG1vc3QKLSAgICAvLyB1c2Vm
dWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCi0gICAgLy8gTmVlZCB0byBlbXVsYXRlIE1BWF9G
UkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBNQVhfVkFSWUlOR19WRUNUT1JTCi0g
ICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9uZGluZyBxdWVyaWVzIHJldHVybiB0
aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAgICAvLyB3aGVyZWFzIEdMRVMyIHJldHVybiB0aGUg
bnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0IGNvbXBvbmVudHMpLgotICAgIC8v
IFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlc2t0b3AgR0wgbmVlZHMgdG8gYmUg
ZGl2aWRlZCBieSA0LgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBzd2l0
Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoK
LSAgICAgICAgKnZhbHVlID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElNUExF
TUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKLSAgICAgICAgKnZhbHVlID0gR0xfVU5TSUdORURf
QllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNU
T1JTOgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09N
UE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKLSAgICAgICAgOjpnbEdldEludGVn
ZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1ZSk7Ci0gICAgICAgICp2
YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9WQVJZSU5HX1ZFQ1RPUlM6
Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFSWUlOR19GTE9BVFMsIHZhbHVlKTsK
LSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAg
ICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBwbmFtZSwg
dmFsdWUpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1JbmZvTG9n
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAg
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IGxlbmd0aDsKLSAg
ICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwg
Jmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXplOwotICAgIEdMY2hhciogaW5mbyA9IChH
TGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1
cm4gIiI7Ci0KLSAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2coKEdMdWludCkgcHJvZ3JhbSwgbGVu
Z3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFzdEZyZWUoaW5m
byk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFJlbmRl
cmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBu
YW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFtZSwgdmFsdWUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBBU1NF
UlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
Ci0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJh
dG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLSAgICAKLSAgICBz
d2l0Y2ggKHBuYW1lKSB7Ci0gICAgICAgIGNhc2UgREVMRVRFX1NUQVRVUzoKLSAgICAgICAgY2Fz
ZSBTSEFERVJfVFlQRToKLSAgICAgICAgICAgIC8vIExldCBPcGVuR0wgaGFuZGxlIHRoZXNlLgot
ICAgICAgICAKLSAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIHBu
YW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTVBJTEVf
U1RBVFVTOgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQo
KSkgewotICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3VsdC0+c2Vjb25k
LmlzVmFsaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2Fz
ZSBJTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291
cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOwotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAg
KCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIFNIQURFUl9TT1VSQ0VfTEVOR1RI
OgotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJTb3VyY2Uoc2hhZGVyKS5sZW5ndGgo
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfRU5VTSk7Ci0gICAgfQotfQotCi1TdHJp
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBz
aGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0KLSAgICBIYXNoTWFwPFBs
YXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9z
aGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRl
clNvdXJjZU1hcC5lbmQoKSkKLSAgICAgICAgIHJldHVybiAiIjsKLQotICAgICBTaGFkZXJTb3Vy
Y2VFbnRyeSBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0gICAgIGlmIChlbnRyeS5pc1ZhbGlk
KSB7Ci0gICAgICAgICBHTGludCBsZW5ndGg7Ci0gICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdM
dWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwotCi0gICAgICAgICBH
THNpemVpIHNpemU7Ci0gICAgICAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxv
YyhsZW5ndGgpOwotICAgICAgICAgaWYgKCFpbmZvKQotICAgICAgICAgICAgIHJldHVybiAiIjsK
LQotICAgICAgICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdMdWludCkgc2hhZGVyLCBsZW5ndGgs
ICZzaXplLCBpbmZvKTsKLQotICAgICAgICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgICAgICBmYXN0
RnJlZShpbmZvKTsKLSAgICAgICAgIHJldHVybiBzOwotICAgICB9Ci0gICAgIGVsc2UgewotICAg
ICAgICAgcmV0dXJuIGVudHJ5LmxvZzsKLSAgICAgfQotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBB
U1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAg
IEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciBy
ZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVzdWx0
ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBy
ZXR1cm4gcmVzdWx0LT5zZWNvbmQuc291cmNlOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFRleFBhcmFtZXRlcmZ2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25n
IHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBw
bmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtZnYo
UGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBmbG9hdCogdmFsdWUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRVbmlmb3JtZnYo
KEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VW5pZm9ybWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2Nh
dGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwot
fQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24oUGxhdGZvcm0z
RE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dy
YW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4g
OjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNp
Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJm
dihpbmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
aW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi1sb25nIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQodW5zaWduZWQgbG9uZyBpbmRleCwg
dW5zaWduZWQgbG9uZyBwbmFtZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgCi0gICAgdm9pZCogcG9pbnRlcjsKLSAgICA6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRl
cnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRlcik7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
bG9uZz4ocG9pbnRlcik7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1
bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBpbnRlcm5hbGZvcm1hdCwg
dW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYm9yZGVyLCB1bnNpZ25l
ZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBp
bnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVs
cyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1h
Z2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNp
Z25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3Jt
YXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0KLSAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQ
aXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlm
ZmVyIGZyb20gdGhlIHN1YmltYWdlIHNpemUKLSAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQs
IGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVC
dWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQg
bzsKLSAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwotICAgIHJldHVybiBvOwotfQotCi11bnNpZ25l
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIoKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlbkZyYW1lYnVmZmVy
c0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVQcm9ncmFtKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0Nv
bnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZv
KTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFHTUVOVF9TSEFE
RVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7Ci19Ci0KLXVuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAm
byk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUJ1
ZmZlcih1bnNpZ25lZCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQgZnJhbWVidWZmZXIpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhU
KDEsICZmcmFtZWJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVBy
b2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQgcmVuZGVyYnVmZmVyKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNF
WFQoMSwgJnJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0
ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7Ci19
Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6c2l6ZUluQnl0ZXMoaW50IHR5cGUpCi17Ci0gICAg
c3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfQllURToKLSAgICAgICAgICAgIHJldHVy
biBzaXplb2YoR0xieXRlKTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAg
ICAgICAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKLSAgICAgICAgY2FzZSBHTF9TSE9SVDoKLSAg
ICAgICAgICAgIHJldHVybiBzaXplb2YoR0xzaG9ydCk7Ci0gICAgICAgIGNhc2UgR0xfVU5TSUdO
RURfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKLSAgICAgICAg
Y2FzZSBHTF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMaW50KTsKLSAgICAgICAg
Y2FzZSBHTF9VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWludCk7
Ci0gICAgICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMZmxv
YXQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzeW50aGVzaXplR0xFcnJvcih1bnNpZ25lZCBsb25n
IGVycm9yKQotewotICAgIG1fc3ludGhldGljRXJyb3JzLmFkZChlcnJvcik7Ci19CiAKIH0KIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RP
cGVuR0wuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Blbmds
L0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkocmV2aXNpb24gNjY4ODcpCShmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tOjY2ODg3KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTY2MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRSgzRF9DQU5WQVMpCisKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQzRC5oIgorCisjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKKworI2luY2x1
ZGUgIkFycmF5QnVmZmVyLmgiCisjaW5jbHVkZSAiQXJyYXlCdWZmZXJWaWV3LmgiCisjaW5jbHVk
ZSAiV2ViR0xPYmplY3QuaCIKKyNpbmNsdWRlICJDYW52YXNSZW5kZXJpbmdDb250ZXh0LmgiCisj
aW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgor
I2luY2x1ZGUgIkludDMyQXJyYXkuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVyLmgiCisjaW5jbHVkZSA8
Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2luY2x1ZGUgPE9wZW5HTC9DR0xSZW5k
ZXJlcnMuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDx3dGYvVW51c2VkUGFy
YW0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworc3RhdGljIHZvaWQgc2V0UGl4ZWxGb3JtYXQoVmVjdG9yPENHTFBpeGVsRm9ybWF0QXR0
cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9yQml0cywgaW50IGRlcHRoQml0cywgYm9vbCBhY2Nl
bGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwgYm9vbCBjbG9zZXN0KQoreworICAgIGF0dHJpYnMu
Y2xlYXIoKTsKKyAgICAKKyAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ29sb3JTaXplKTsKKyAg
ICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oY29s
b3JCaXRzKSk7CisgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQURlcHRoU2l6ZSk7CisgICAgYXR0
cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGRlcHRoQml0
cykpOworICAgIAorICAgIGlmIChhY2NlbGVyYXRlZCkKKyAgICAgICAgYXR0cmlicy5hcHBlbmQo
a0NHTFBGQUFjY2VsZXJhdGVkKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXR0cmlicy5hcHBlbmQo
a0NHTFBGQVJlbmRlcmVySUQpOworICAgICAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxD
R0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NHTFJlbmRlcmVyR2VuZXJpY0Zsb2F0SUQpKTsKKyAg
ICB9CisgICAgICAgIAorICAgIGlmIChzdXBlcnNhbXBsZSkKKyAgICAgICAgYXR0cmlicy5hcHBl
bmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKKyAgICAgICAgCisgICAgaWYgKGNsb3Nlc3QpCisgICAg
ICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFDbG9zZXN0UG9saWN5KTsKKyAgICAgICAgCisgICAg
YXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KDApKTsK
K30KKworUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRD4gR3JhcGhpY3NDb250ZXh0M0Q6OmNy
ZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9z
dFdpbmRvdykKK3sKKyAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNvbnRleHQobmV3IEdy
YXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0V2luZG93KSk7CisgICAgcmV0dXJuIGNvbnRleHQt
Pm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVsZWFzZSgpIDogMDsKK30KKworR3JhcGhpY3NDb250
ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0
dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93KQorICAgIDogbV9jdXJyZW50V2lkdGgoMCkKKyAg
ICAsIG1fY3VycmVudEhlaWdodCgwKQorICAgICwgbV9hdHRycyhhdHRycykKKyAgICAsIG1fY29u
dGV4dE9iaigwKQorICAgICwgbV90ZXh0dXJlKDApCisgICAgLCBtX2ZibygwKQorICAgICwgbV9k
ZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAgICAsIG1fYm91bmRGQk8oMCkKKyAgICAsIG1fbXVsdGlz
YW1wbGVGQk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAg
ICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcigwKQoreworICAgIFVOVVNFRF9QQVJBTShob3N0
V2luZG93KTsKKworICAgIFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4gYXR0cmliczsK
KyAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhlbEZvcm1hdE9iaiA9IDA7CisgICAgR0xpbnQgbnVt
UGl4ZWxGb3JtYXRzID0gMDsKKyAgICAKKyAgICAvLyBXZSB3aWxsIHRyeToKKyAgICAvLworICAg
IC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQvc3VwZXJzYW1wbGVk
CisgICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMyIGJpdCBkZXB0aC9hY2NlbGVyYXRlZAorICAgIC8v
ICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQKKyAgICAvLyAgNCkgY2xv
c2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvc29mdHdhcmUgcmVuZGVyZXIKKyAgICAv
LworICAgIC8vICBJZiBub25lIG9mIHRoYXQgd29ya3MsIHdlIHNpbXBseSBmYWlsIGFuZCBzZXQg
bV9jb250ZXh0T2JqIHRvIDAuCisgICAgCisgICAgc2V0UGl4ZWxGb3JtYXQoYXR0cmlicywgMzIs
IDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmli
cy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7CisgICAgaWYgKG51
bVBpeGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMy
LCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQo
YXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7CisgICAg
ICAgIAorICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsKKyAgICAgICAgICAgIHNl
dFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAg
ICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRP
YmosICZudW1QaXhlbEZvcm1hdHMpOworICAgICAgICAKKyAgICAgICAgICAgIGlmIChudW1QaXhl
bEZvcm1hdHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMs
IDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBDR0xDaG9vc2VQ
aXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3Jt
YXRzKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAw
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIGFuIGFjY2VwdGFibGUg
cmVuZGVyZXIgLSBmYWlsCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQ0dMRXJy
b3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1hdE9iaiwgMCwgJm1fY29udGV4dE9i
aik7CisgICAgQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0T2JqKTsKKyAgICAKKyAg
ICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8ICFtX2NvbnRleHRPYmopIHsKKyAgICAgICAgLy8g
Q291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4dCAtIGZhaWwKKyAgICAgICAgbV9jb250ZXh0T2Jq
ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY3VycmVudCBj
b250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8gdXMuCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKKworICAgIC8v
IENyZWF0ZSB0aGUgV2ViR0xMYXllcgorICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUwor
ICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRXaXRo
R3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgW21fd2Vi
R0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2ViR0wgTGF5ZXIiXTsKKyNlbmRpZiAgICAKKyAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgLy8gY3JlYXRlIGEgdGV4dHVyZSB0
byByZW5kZXIgaW50bworICAgIDo6Z2xHZW5UZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKKyAgICA6
OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICA6OmdsVGV4UGFy
YW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7
CisgICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklM
VEVSLCBHTF9MSU5FQVIpOworICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdM
X1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7CisgICAgOjpnbFRleFBhcmFtZXRlcmkoR0xfVEVY
VFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QKTsKKyAgICA6OmdsQmluZFRleHR1
cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgCisgICAgLy8gY3JlYXRlIGFuIEZCTworICAgIDo6
Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKKyAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIAorICAgIG1fYm91bmRGQk8gPSBt
X2ZibzsKKyAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwg
bV9hdHRycy5kZXB0aCkpCisgICAgICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX2Rl
cHRoU3RlbmNpbEJ1ZmZlcik7CisKKyAgICAvLyBjcmVhdGUgYW4gbXVsdGlzYW1wbGUgRkJPCisg
ICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNF
WFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIG1fYm91bmRG
Qk8gPSBtX211bHRpc2FtcGxlRkJPOworICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgx
LCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQo
MSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgIH0KKyAgICAKKyAgICAv
LyBBTkdMRSBpbml0aWFsaXphdGlvbi4KKworICAgIFRCdWlsdEluUmVzb3VyY2UgQU5HTEVSZXNv
dXJjZXM7CisKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKKyAgICBn
ZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVS
ZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4
VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpN
QVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZv
cm1WZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7Cisg
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZB
TkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4
VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29u
dGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5N
YXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmlu
ZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0
M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4
Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVy
ZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhf
VEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRz
KTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKKyAg
ICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVD
VE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOworCisgICAg
Ly8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCisgICAgQU5HTEVSZXNvdXJjZXMuTWF4
RHJhd0J1ZmZlcnMgPSAxOworICAgIAorICAgIG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xF
UmVzb3VyY2VzKTsKKyAgICAKKyAgICA6OmdsRW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5U
X1NJWkUpOworICAgIDo6Z2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOworfQorCitHcmFwaGljc0Nv
bnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKK3sKKyAgICBpZiAobV9jb250ZXh0T2JqKSB7
CisgICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgICAgIDo6
Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKKyAgICAgICAgaWYgKG1fYXR0cnMuYW50
aWFsaWFzKSB7CisgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9t
dWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwg
fHwgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgICAgICA6
OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0
aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0
aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIDo6Z2xEZWxldGVGcmFtZWJ1ZmZl
cnNFWFQoMSwgJm1fZmJvKTsKKyAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoMCk7CisgICAg
ICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0ZXMoKQoreworICAgIGNvbnN0IGNoYXIq
IGV4dGVuc2lvbnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5n
KEdMX0VYVEVOU0lPTlMpKTsKKyAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7CisgICAgICAgIGlm
IChzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIikp
IHsKKyAgICAgICAgICAgIGlmICghbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICBtX2F0
dHJzLmRlcHRoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2F0dHJzLnN0
ZW5jaWwgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAg
ICAgIGJvb2wgaXNWYWxpZFZlbmRvciA9IHRydWU7CisgICAgICAgIC8vIEN1cnJlbnRseSBpbiBN
YWMgd2Ugb25seSB0dXJuIG9uIGFudGlhbGlhcyBpZiB2ZW5kb3IgaXMgTlZJRElBLgorICAgICAg
ICBjb25zdCBjaGFyKiB2ZW5kb3IgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6Omds
R2V0U3RyaW5nKEdMX1ZFTkRPUikpOworICAgICAgICBpZiAoIXN0ZDo6c3Ryc3RyKHZlbmRvciwg
Ik5WSURJQSIpKQorICAgICAgICAgICAgaXNWYWxpZFZlbmRvciA9IGZhbHNlOworICAgICAgICBp
ZiAoIWlzVmFsaWRWZW5kb3IgfHwgIXN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfZnJh
bWVidWZmZXJfbXVsdGlzYW1wbGUiKSkKKyAgICAgICAgICAgIG1fYXR0cnMuYW50aWFsaWFzID0g
ZmFsc2U7CisgICAgfQorICAgIC8vIEZJWE1FOiBpbnN0ZWFkIG9mIGVuZm9yY2luZyBwcmVtdWx0
aXBsaWVkQWxwaGEgPSB0cnVlLCBpbXBsZW1lbnQgdGhlCisgICAgLy8gY29ycmVjdCBiZWhhdmlv
ciB3aGVuIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlIGlzIHJlcXVlc3RlZC4KKyAgICBtX2F0
dHJzLnByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6Om1ha2VDb250ZXh0Q3VycmVudCgpCit7CisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9j
b250ZXh0T2JqKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdS
ZXN1bHRzVG9DYW52YXMoQ2FudmFzUmVuZGVyaW5nQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBI
VE1MQ2FudmFzRWxlbWVudCogY2FudmFzID0gY29udGV4dC0+Y2FudmFzKCk7CisgICAgSW1hZ2VC
dWZmZXIqIGltYWdlQnVmZmVyID0gY2FudmFzLT5idWZmZXIoKTsKKworICAgIGludCByb3dCeXRl
cyA9IG1fY3VycmVudFdpZHRoICogNDsKKyAgICBpbnQgdG90YWxCeXRlcyA9IHJvd0J5dGVzICog
bV9jdXJyZW50SGVpZ2h0OworCisgICAgT3duQXJyYXlQdHI8dW5zaWduZWQgY2hhcj4gcGl4ZWxz
KG5ldyB1bnNpZ25lZCBjaGFyW3RvdGFsQnl0ZXNdKTsKKyAgICBpZiAoIXBpeGVscykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKwor
ICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxp
YXMpIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVS
X0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQo
R0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1
ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1
cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5F
QVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKKyAgICAgICAgICAgIG11c3RSZXN0b3Jl
RkJPID0gdHJ1ZTsKKyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVC
VUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBHTGludCBwYWNrQWxp
Z25tZW50ID0gNDsKKyAgICBib29sIG11c3RSZXN0b3JlUGFja0FsaWdubWVudCA9IGZhbHNlOwor
ICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9QQUNLX0FMSUdOTUVOVCwgJnBhY2tBbGlnbm1lbnQpOwor
ICAgIGlmIChwYWNrQWxpZ25tZW50ID4gNCkgeworICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xf
UEFDS19BTElHTk1FTlQsIDQpOworICAgICAgICBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSB0
cnVlOworICAgIH0KKworICAgIDo6Z2xSZWFkUGl4ZWxzKDAsIDAsIG1fY3VycmVudFdpZHRoLCBt
X2N1cnJlbnRIZWlnaHQsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgcGl4
ZWxzLmdldCgpKTsKKworICAgIGlmIChtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQpCisgICAgICAg
IDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgcGFja0FsaWdubWVudCk7CisKKyAg
ICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKKworICAgIHBhaW50VG9DYW52YXMocGl4ZWxz
LmdldCgpLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAg
ICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFnZUJ1ZmZlci0+Y29udGV4
dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6Omlz
R0xFUzJDb21wbGlhbnQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25zdAoreworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFcnJvckdlbmVyYXRlZE9u
T3V0T2ZCb3VuZHNBY2Nlc3NlcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sK
KyAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhl
aWdodCB8fCAhbV9jb250ZXh0T2JqKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9jdXJy
ZW50V2lkdGggPSB3aWR0aDsKKyAgICBtX2N1cnJlbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgCisg
ICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICBHTHVpbnQg
aW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9y
bWF0ID0gMDsKKyAgICBpZiAobV9hdHRycy5hbHBoYSkgeworICAgICAgICBpbnRlcm5hbENvbG9y
Rm9ybWF0ID0gR0xfUkdCQTg7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gR0xfUkdCQTsKKyAgICB9
IGVsc2UgeworICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCODsKKyAgICAgICAg
Y29sb3JGb3JtYXQgPSBHTF9SR0I7CisgICAgfQorICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwg
bV9hdHRycy5kZXB0aCkgeworICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyB0aGUgbG9naWMgd2hl
cmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQgZGVwdGggaXMgbm90LgorICAgICAgICAvLyBTZWUg
R3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0b3IuCisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgJiYgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9y
bWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgIH0K
KworICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKworICAgIC8vIHJlc2l6ZSBtdWx0
aXNhbXBsZSBGQk8KKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgR0xpbnQg
bWF4U2FtcGxlQ291bnQ7CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfU0FNUExFU19F
WFQsICZtYXhTYW1wbGVDb3VudCk7CisgICAgICAgIEdMaW50IHNhbXBsZUNvdW50ID0gc3RkOjpt
aW4oOCwgbWF4U2FtcGxlQ291bnQpOworICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBtYXhTYW1w
bGVDb3VudCkKKyAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gbWF4U2FtcGxlQ291bnQ7CisgICAg
ICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVsdGlzYW1wbGVGQk8pIHsKKyAgICAgICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJP
KTsKKyAgICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAg
ICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlQ29sb3JCdWZmZXIpOworICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2Ft
cGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbENvbG9yRm9y
bWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9SRU5E
RVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOworICAgICAgICBpZiAobV9h
dHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpIHsKKyAgICAgICAgICAgIDo6Z2xCaW5kUmVu
ZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIpOworICAgICAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBs
ZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50ZXJuYWxEZXB0aFN0ZW5j
aWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKKyAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgICAgIGlmICht
X2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZl
ckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5E
RVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAg
fQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAw
KTsKKyAgICAgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZF
Ul9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgeworICAgICAgICAgICAgLy8g
RklYTUU6IGNsZWFudXAuCisgICAgICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICB9
CisgICAgfQorCisgICAgLy8gcmVzaXplIHJlZ3VsYXIgRkJPCisgICAgaWYgKG1fYm91bmRGQk8g
IT0gbV9mYm8pIHsKKyAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOworICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KKyAg
ICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICA6OmdsVGV4
SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVp
Z2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5TSUdORURfQllURSwgMCk7CisgICAgOjpnbEZyYW1l
YnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVO
VDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3RleHR1cmUsIDApOworICAgIDo6Z2xCaW5kVGV4dHVy
ZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpIHsKKyAgICAgICAgOjpnbEJpbmRSZW5kZXJi
dWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOworICAg
ICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBpbnRl
cm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwpCisgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQo
R0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJC
VUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgIGlmIChtX2F0dHJzLmRl
cHRoKQorICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQo
R0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7CisgICAgfQorICAgIGlmIChnbENoZWNrRnJhbWVidWZm
ZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVU
RV9FWFQpIHsKKyAgICAgICAgLy8gRklYTUU6IGNsZWFudXAKKyAgICAgICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8p
OworICAgICAgICBpZiAobV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICAg
ICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHJl
bmRlcmJ1ZmZlcnMgdG8gMC4KKyAgICBHTGJvb2xlYW4gY29sb3JNYXNrW10gPSB7R0xfVFJVRSwg
R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0sIGRlcHRoTWFzayA9IEdMX1RSVUUsIHN0ZW5jaWxN
YXNrID0gR0xfVFJVRTsKKyAgICBHTGJvb2xlYW4gaXNTY2lzc29yRW5hYmxlZCA9IEdMX0ZBTFNF
OworICAgIEdMYm9vbGVhbiBpc0RpdGhlckVuYWJsZWQgPSBHTF9GQUxTRTsKKyAgICBHTGJpdGZp
ZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JVRkZFUl9CSVQ7CisgICAgOjpnbEdldEJvb2xlYW52
KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JNYXNrKTsKKyAgICA6OmdsQ29sb3JNYXNrKEdMX1RS
VUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOworICAgIGlmIChtX2F0dHJzLmRlcHRoKSB7
CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9ERVBUSF9XUklURU1BU0ssICZkZXB0aE1hc2sp
OworICAgICAgICA6OmdsRGVwdGhNYXNrKEdMX1RSVUUpOworICAgICAgICBjbGVhck1hc2sgfD0g
R0xfREVQVEhfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewor
ICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfU1RFTkNJTF9XUklURU1BU0ssICZzdGVuY2lsTWFz
ayk7CisgICAgICAgIDo6Z2xTdGVuY2lsTWFzayhHTF9UUlVFKTsKKyAgICAgICAgY2xlYXJNYXNr
IHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaXNTY2lzc29yRW5hYmxlZCA9
IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9URVNUKTsKKyAgICA6OmdsRGlzYWJsZShHTF9TQ0lT
U09SX1RFU1QpOworICAgIGlzRGl0aGVyRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfRElUSEVS
KTsKKyAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIpOworCisgICAgOjpnbENsZWFyKGNsZWFyTWFz
ayk7CisKKyAgICA6OmdsQ29sb3JNYXNrKGNvbG9yTWFza1swXSwgY29sb3JNYXNrWzFdLCBjb2xv
ck1hc2tbMl0sIGNvbG9yTWFza1szXSk7CisgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAg
IDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsKKyAgICBpZiAobV9hdHRycy5zdGVuY2lsKQorICAg
ICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNpbE1hc2spOworICAgIGlmIChpc1NjaXNzb3JFbmFi
bGVkKQorICAgICAgICA6OmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZWxzZQorICAg
ICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGlmIChpc0RpdGhlckVuYWJs
ZWQpCisgICAgICAgIDo6Z2xFbmFibGUoR0xfRElUSEVSKTsKKyAgICBlbHNlCisgICAgICAgIDo6
Z2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAgICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsK
KworICAgIDo6Z2xGbHVzaCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlQ29udGV4
dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCit7CisgICAgaWYgKCFjb250ZXh0KQorICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgIENHTENvbnRleHRPYmogY3VycmVudENvbnRleHQgPSBDR0xH
ZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBjb250ZXh0KQor
ICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7
CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQs
IG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRX
aWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVp
Z2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7CisgICAgfQorICAg
IDo6Z2xGaW5pc2goKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVy
ZSh1bnNpZ25lZCBsb25nIHRleHR1cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjphdHRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9y
bTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7CisgICAgQVNTRVJUKHNo
YWRlcik7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xBdHRhY2hT
aGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YmluZEF0dHJpYkxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3Jh
bSwgdW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VS
VChwcm9ncmFtKTsKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJp
bmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBpbmRleCwgbmFtZS51dGY4KCkuZGF0
YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcih1bnNpZ25lZCBs
b25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVm
ZmVyKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5z
aWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTHVpbnQgZmJvOworICAgIGlmIChidWZmZXIp
CisgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOworICAgIGVsc2UKKyAgICAgICAgZmJvID0g
KG1fYXR0cnMuYW50aWFsaWFzID8gbV9tdWx0aXNhbXBsZUZCTyA6IG1fZmJvKTsKKyAgICBpZiAo
ZmJvICE9IG1fYm91bmRGQk8pIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVCh0YXJn
ZXQsIGZibyk7CisgICAgICAgIG1fYm91bmRGQk8gPSBmYm87CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQ
bGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCAoR0x1aW50KSBy
ZW5kZXJidWZmZXIpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRUZXh0dXJl
KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kVGV4dHVyZSh0YXJnZXQs
IChHTHVpbnQpIHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZENv
bG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwgZG91YmxlIGJsdWUsIGRvdWJsZSBhbHBoYSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kQ29sb3Io
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRp
Y19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFscGhhKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSAp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCbGVuZEVxdWF0
aW9uKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEVxdWF0aW9uU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1bnNpZ25lZCBsb25nIG1vZGVBbHBoYSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRXF1YXRpb25T
ZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNmYWN0b3IsIHVuc2lnbmVkIGxvbmcgZGZhY3Rv
cikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRnVu
YyhzZmFjdG9yLCBkZmFjdG9yKTsKK30gICAgICAgCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdCLCB1bnNpZ25lZCBsb25nIGRz
dFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQgbG9uZyBkc3RBbHBoYSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRnVuY1NlcGFy
YXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwg
dW5zaWduZWQgbG9uZyB1c2FnZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCAwLCB1c2FnZSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBz
aXplLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsb25nIHVzYWdlKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUs
IGRhdGEsIHVzYWdlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyU3ViRGF0
YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBzaXplLCBjb25zdCB2b2lk
KiBkYXRhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVm
ZmVyU3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKK3Vuc2lnbmVkIGxv
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0dXModW5zaWduZWQgbG9u
ZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVy
biA6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVCh0YXJnZXQpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIsIGRv
dWJsZSBhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQ2xl
YXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2spCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhcihtYXNrKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhckRlcHRoKGRlcHRoKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKGxvbmcgcykKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbENsZWFyU3RlbmNpbChzKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBi
b29sIGJsdWUsIGJvb2wgYWxwaGEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVy
KQoreworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKworICAgIGludCBHTHNoYWRlclR5cGU7CisgICAgQU5HTEVTaGFkZXJUeXBlIHNoYWRlclR5
cGU7CisKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgU0hBREVSX1RZUEUsICZHTHNoYWRlclR5
cGUpOworICAgIAorICAgIGlmIChHTHNoYWRlclR5cGUgPT0gVkVSVEVYX1NIQURFUikKKyAgICAg
ICAgc2hhZGVyVHlwZSA9IFNIQURFUl9UWVBFX1ZFUlRFWDsKKyAgICBlbHNlIGlmIChHTHNoYWRl
clR5cGUgPT0gRlJBR01FTlRfU0hBREVSKQorICAgICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZ
UEVfRlJBR01FTlQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm47IC8vIEludmFsaWQgc2hhZGVy
IHR5cGUuCisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5
Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisg
ICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU2hhZGVyU291cmNlRW50cnkmIGVudHJ5ID0gcmVzdWx0LT5zZWNvbmQ7CisKKyAg
ICBTdHJpbmcgdHJhbnNsYXRlZFNoYWRlclNvdXJjZTsKKyAgICBTdHJpbmcgc2hhZGVySW5mb0xv
ZzsKKworICAgIGJvb2wgaXNWYWxpZCA9IG1fY29tcGlsZXIudmFsaWRhdGVTaGFkZXJTb3VyY2Uo
ZW50cnkuc291cmNlLnV0ZjgoKS5kYXRhKCksIHNoYWRlclR5cGUsIHRyYW5zbGF0ZWRTaGFkZXJT
b3VyY2UsIHNoYWRlckluZm9Mb2cpOworCisgICAgZW50cnkubG9nID0gc2hhZGVySW5mb0xvZzsK
KyAgICBlbnRyeS5pc1ZhbGlkID0gaXNWYWxpZDsKKworICAgIGlmICghaXNWYWxpZCkKKyAgICAg
ICAgcmV0dXJuOyAvLyBTaGFkZXIgZGlkbid0IHZhbGlkYXRlLCBkb24ndCBtb3ZlIGZvcndhcmQg
d2l0aCBjb21waWxpbmcgdHJhbnNsYXRlZCBzb3VyY2UgICAgCisKKyAgICBpbnQgdHJhbnNsYXRl
ZFNoYWRlckxlbmd0aCA9IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UubGVuZ3RoKCk7CisKKyAgICBj
b25zdCBDU3RyaW5nJiB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZyA9IHRyYW5zbGF0ZWRTaGFkZXJT
b3VyY2UudXRmOCgpOworICAgIGNvbnN0IGNoYXIqIHRyYW5zbGF0ZWRTaGFkZXJQdHIgPSB0cmFu
c2xhdGVkU2hhZGVyQ1N0cmluZy5kYXRhKCk7CisgICAgCisgICAgOjpnbFNoYWRlclNvdXJjZSgo
R0x1aW50KSBzaGFkZXIsIDEsICZ0cmFuc2xhdGVkU2hhZGVyUHRyLCAmdHJhbnNsYXRlZFNoYWRl
ckxlbmd0aCk7CisgICAgCisgICAgOjpnbENvbXBpbGVTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsK
KyAgICAKKyAgICBpbnQgR0xDb21waWxlU3VjY2VzczsKKyAgICAKKyAgICA6OmdsR2V0U2hhZGVy
aXYoKEdMdWludCkgc2hhZGVyLCBDT01QSUxFX1NUQVRVUywgJkdMQ29tcGlsZVN1Y2Nlc3MpOwor
ICAgIAorICAgIC8vIEFTU0VSVCB0aGF0IEFOR0xFIGdlbmVyYXRlZCBHTFNMIHdpbGwgYmUgYWNj
ZXB0ZWQgYnkgT3BlbkdMCisgICAgQVNTRVJUKEdMQ29tcGlsZVN1Y2Nlc3MgPT0gR0xfVFJVRSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25n
IHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxv
bmcgYm9yZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1f
bXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQo
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQs
IEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xDb3B5
VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhl
aWdodCwgYm9yZGVyKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9
PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVs
LCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBt
X211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVB
RF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6
Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4
ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
CisgICAgfQorICAgIDo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0
LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxp
YXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEN1bGxGYWNlKG1vZGUp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBm
dW5jKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhG
dW5jKGZ1bmMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aE1hc2soYm9vbCBm
bGFnKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhN
YXNrKGZsYWcpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJs
ZSB6TmVhciwgZG91YmxlIHpGYXIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgUGxhdGZvcm0z
RE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIEFTU0VSVChzaGFk
ZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGV0YWNoU2hh
ZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEaXNhYmxlKGNhcCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGlu
ZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGlzYWJs
ZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25nIG1vZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEcmF3QXJyYXlzKG1v
ZGUsIGZpcnN0LCBjb3VudCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVt
ZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxv
bmcgdHlwZSwgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIHJlaW50ZXJwcmV0X2Nh
c3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEVuYWJsZShjYXApOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGlu
ZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRW5hYmxl
VmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpm
aW5pc2goKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRmlu
aXNoKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNoKCkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEZsdXNoKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVy
dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsK
KyAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHsKKyAgICAg
ICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVO
VCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAgICAgICA6OmdsRnJhbWVi
dWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFDSE1FTlQsIHJlbmRlcmJ1
ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKyAgICB9IGVsc2UKKyAgICAgICAgOjpnbEZyYW1l
YnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFy
Z2V0LCByZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1
ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2ht
ZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBs
b25nIGxldmVsKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
RnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChH
THVpbnQpIHRleHR1cmUsIGxldmVsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJv
bnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbEZyb250RmFjZShtb2RlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Z2VuZXJhdGVNaXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQp
OworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIoUGxhdGZvcm0z
RE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQor
eworICAgIGlmICghcHJvZ3JhbSkgeworICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElE
X1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6ZSA9IDA7CisgICAgOjpn
bEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfQVRU
UklCVVRFX01BWF9MRU5HVEgsICZtYXhBdHRyaWJ1dGVTaXplKTsKKyAgICBHTGNoYXIgbmFtZVtt
YXhBdHRyaWJ1dGVTaXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIGluY2x1
ZGVzIG51bGwgdGVybWluYXRpb24KKyAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOworICAgIEdM
aW50IHNpemUgPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICA6OmdsR2V0QWN0aXZlQXR0
cmliKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4LCBtYXhBdHRyaWJ1dGVTaXpl
LCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBpZiAoIW5hbWVMZW5ndGgp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFt
ZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZvLnNpemUgPSBzaXplOwor
ICAgIHJldHVybiB0cnVlOworfQorICAgIAorYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0
aXZlVW5pZm9ybShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgs
IEFjdGl2ZUluZm8mIGluZm8pCit7CisgICAgaWYgKCFwcm9ncmFtKSB7CisgICAgICAgIHN5bnRo
ZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTGludCBtYXhVbmlmb3Jt
U2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dy
YW0pLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RILCAmbWF4VW5pZm9ybVNpemUpOworICAg
IEdMY2hhciBuYW1lW21heFVuaWZvcm1TaXplXTsgLy8gR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xF
TkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCisgICAgR0xzaXplaSBuYW1lTGVuZ3RoID0g
MDsKKyAgICBHTGludCBzaXplID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IDA7CisgICAgOjpnbEdl
dEFjdGl2ZVVuaWZvcm0oc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heFVu
aWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBpZiAoIW5h
bWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBTdHJpbmco
bmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZvLnNpemUg
PSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRBdHRhY2hlZFNoYWRlcnMoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBpbnQgbWF4Q291bnQs
IGludCogY291bnQsIHVuc2lnbmVkIGludCogc2hhZGVycykKK3sKKyAgICBpZiAoIXByb2dyYW0p
IHsKKyAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xH
ZXRBdHRhY2hlZFNoYWRlcnMoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgbWF4Q291bnQs
IGNvdW50LCBzaGFkZXJzKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJM
b2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sK
KyAgICBpZiAoIXByb2dyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xHZXRBdHRyaWJMb2NhdGlvbigo
R0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworfQorCitHcmFwaGljc0NvbnRl
eHQzRDo6QXR0cmlidXRlcyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Q29udGV4dEF0dHJpYnV0ZXMo
KQoreworICAgIHJldHVybiBtX2F0dHJzOworfQorCit1bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRFcnJvcigpCit7CisgICAgaWYgKG1fc3ludGhldGljRXJyb3JzLnNpemUoKSA+
IDApIHsKKyAgICAgICAgTGlzdEhhc2hTZXQ8dW5zaWduZWQgbG9uZz46Oml0ZXJhdG9yIGl0ZXIg
PSBtX3N5bnRoZXRpY0Vycm9ycy5iZWdpbigpOworICAgICAgICB1bnNpZ25lZCBsb25nIGVyciA9
ICppdGVyOworICAgICAgICBtX3N5bnRoZXRpY0Vycm9ycy5yZW1vdmUoaXRlcik7CisgICAgICAg
IHJldHVybiBlcnI7CisgICAgfQorCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICByZXR1cm4gU3RyaW5nKChjb25zdCBjaGFyKikgOjpnbEdldFN0cmlu
ZyhuYW1lKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEhpbnQodGFyZ2V0LCBtb2RlKTsKK30KKworYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNCdWZmZXIoUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7CisgICAgaWYg
KCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIp
OworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBj
YXApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6Omds
SXNFbmFibGVkKGNhcCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZm
ZXIoUGxhdGZvcm0zRE9iamVjdCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBpZiAoIWZyYW1lYnVmZmVy
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1ZmZlckVYVCgoR0x1aW50KSBmcmFtZWJ1
ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCit7CisgICAgaWYgKCFwcm9ncmFtKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6
OmdsSXNQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOworfQorCitib29sIEdyYXBoaWNzQ29udGV4
dDNEOjppc1JlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAg
ICBpZiAoIXJlbmRlcmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpnbElzUmVuZGVyYnVmZmVy
RVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmlzU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAgIGlmICghc2hhZGVyKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKK30KKworYm9v
bCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkK
K3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc1RleHR1cmUoKEdM
dWludCkgdGV4dHVyZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmVXaWR0aChk
b3VibGUgd2lkdGgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKK3sKKyAg
ICBBU1NFUlQocHJvZ3JhbSk7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xMaW5rUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cGl4ZWxTdG9yZWkodW5zaWduZWQgbG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFBpeGVsU3RvcmVpKHBu
YW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQo
ZG91YmxlIGZhY3RvciwgZG91YmxlIHVuaXRzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0aWNfY2FzdDxmbG9hdD4oZmFjdG9y
KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBl
LCB2b2lkKiBkYXRhKQoreworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhlIHR3byBnbEZsdXNoIGNh
bGxzIHdoZW4gdGhlIGRyaXZlciBidWcgaXMgZml4ZWQsIGkuZS4sCisgICAgLy8gYWxsIHByZXZp
b3VzIHJlbmRlcmluZyBjYWxscyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgcmVhZGluZyBwaXhlbHMu
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xGbHVzaCgpOworICAg
IGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8p
IHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZl
ckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhl
aWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKKyAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEZs
dXNoKCk7CisgICAgfQorICAgIDo6Z2xSZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZv
cm1hdCwgdHlwZSwgZGF0YSk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRG
Qk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIoKQoreworICAgIC8vIEZJWE1FOiBUaGlz
IGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBkZXNrdG9wIE9wZW5HTC4gV2UgbmVlZCB0byBoYXZlIGlm
ZGVmcyBmb3IgdGhlIGRpZmZlcmVudCBHTCB2YXJpYW50cworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICAvLzo6Z2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIoKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25lZCBsb25nIHRh
cmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICBjYXNlIERFUFRIX1NURU5DSUw6
CisgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgREVQVEhfQ09NUE9ORU5UMTY6CisgICAgICAgIGludGVybmFs
Zm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJH
QkE0OgorICAgIGNhc2UgUkdCNV9BMToKKyAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0JB
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJHQjU2NToKKyAgICAgICAgaW50ZXJuYWxmb3Jt
YXQgPSBHTF9SR0I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmdsUmVuZGVyYnVmZmVy
U3RvcmFnZUVYVCh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292ZXJhZ2UoZG91YmxlIHZhbHVlLCBib29s
IGludmVydCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFNh
bXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSksIGludmVydCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hh
ZGVyLCBjb25zdCBTdHJpbmcmIHN0cmluZykKK3sKKyAgICBBU1NFUlQoc2hhZGVyKTsKKyAgICAK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBTaGFkZXJTb3VyY2VFbnRy
eSBlbnRyeTsKKworICAgIGVudHJ5LnNvdXJjZSA9IHN0cmluZzsKKworICAgIG1fc2hhZGVyU291
cmNlTWFwLnNldChzaGFkZXIsIGVudHJ5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBt
YXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNp
bEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZnVuYywg
bG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVuYywgcmVmLCBt
YXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2sodW5zaWduZWQg
bG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
U3RlbmNpbE1hc2sobWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxN
YXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1hc2spCit7Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xTdGVuY2lsTWFza1NlcGFy
YXRlKGZhY2UsIG1hc2spOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3Ao
dW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpw
YXNzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNp
bE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0
ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmYWlsLCB1
bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFp
bCwgemZhaWwsIHpwYXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1l
dGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1ZSkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFRleFBhcmFtZXRlcmYodGFy
Z2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFt
ZSwgaW50IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUp
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmKGxvbmcgbG9jYXRpb24s
IGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
VW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0xZnYobG9jYXRpb24s
IHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmKGxv
bmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yZihsb2NhdGlvbiwgdjAsIHYxKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdihsb25nIGxvY2F0aW9uLCBmbG9hdCog
YXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBt
dWx0aXBsZSBvZiAyCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xV
bmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0
IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9y
bTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAg
IC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2Z2KGxvY2F0aW9uLCBzaXpl
LCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00Zihsb25nIGxv
Y2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00Zihsb2NhdGlvbiwg
djAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxvbmcgbG9jYXRpb24sIGlu
dCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZv
cm0xaShsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
MWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwg
YXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2Nh
dGlvbiwgaW50IHYwLCBpbnQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNp
emUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yaXYobG9j
YXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRpb24sIHYwLCB2
MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KGxvbmcgbG9j
YXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2
MSwgaW50IHYyLCBpbnQgdjMpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBp
bnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUg
b2YgNAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTRp
dihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJy
YXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0
aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlm
b3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihsb25nIGxvY2F0aW9uLCBib29s
IHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVu
Z3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQorICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNw
b3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0
ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUp
Cit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDE2Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtTWF0cml4NGZ2
KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVc2VQcm9ncmFtKChHTHVpbnQpIHBy
b2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZVByb2dyYW0oUGxh
dGZvcm0zRE9iamVjdCBwcm9ncmFtKQoreworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICAKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZhbGlkYXRlUHJvZ3JhbSgo
R0x1aW50KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliMWYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjFmKGluZHgsIHYwKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5k
eCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxv
YXQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5k
eCwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1
bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4
LCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmli
M2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9u
ZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjRmKGluZHgs
IHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNp
Z25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNp
Z25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNp
emUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3Rh
dGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVk
IGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsVmlld3BvcnQoc3RhdGljX2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSks
IHN0YXRpY19jYXN0PEdMc2l6ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxv
bmcgcG5hbWUsIHVuc2lnbmVkIGNoYXIqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZhbHVlKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0
YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQs
IHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1
bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZhbHVlKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQorICAg
ICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hN
RU5ULCBlaXRoZXIgd29ya3MuCisgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFt
ZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0SW50ZWdlcnYodW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2
YWx1ZSkKK3sKKyAgICAvLyBOZWVkIHRvIGVtdWxhdGUgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVB
RF9GT1JNQVQvVFlQRSBmb3IgR0wuICBBbnkgdmFsaWQKKyAgICAvLyBjb21iaW5hdGlvbiBzaG91
bGQgd29yaywgYnV0IEdMX1JHQi9HTF9VTlNJR05FRF9CWVRFIG1pZ2h0IGJlIHRoZSBtb3N0Cisg
ICAgLy8gdXNlZnVsIGZvciBkZXNrdG9wIFdlYkdMIHVzZXJzLgorICAgIC8vIE5lZWQgdG8gZW11
bGF0ZSBNQVhfRlJBR01FTlQvVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyBhbmQgTUFYX1ZBUllJTkdf
VkVDVE9SUworICAgIC8vIGJlY2F1c2UgZGVza3RvcCBHTCdzIGNvcnJlc3BvbmRpbmcgcXVlcmll
cyByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgLy8gd2hlcmVhcyBHTEVTMiBy
ZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzIChlYWNoIHZlY3RvciBoYXMgNCBjb21wb25lbnRz
KS4KKyAgICAvLyBUaGVyZWZvcmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZXNrdG9wIEdMIG5l
ZWRzIHRvIGJlIGRpdmlkZWQgYnkgNC4KKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVB
RF9GT1JNQVQ6CisgICAgICAgICp2YWx1ZSA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6CisgICAgICAgICp2YWx1ZSA9IEdM
X1VOU0lHTkVEX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFYX0ZSQUdNRU5UX1VO
SUZPUk1fVkVDVE9SUzoKKyAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9GUkFHTUVOVF9V
TklGT1JNX0NPTVBPTkVOVFMsIHZhbHVlKTsKKyAgICAgICAgKnZhbHVlIC89IDQ7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6CisgICAgICAgIDo6
Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOwor
ICAgICAgICAqdmFsdWUgLz0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfVkFSWUlO
R19WRUNUT1JTOgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZBUllJTkdfRkxPQVRT
LCB2YWx1ZSk7CisgICAgICAgICp2YWx1ZSAvPSA0OworICAgICAgICBicmVhazsKKyAgICBkZWZh
dWx0OgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYocG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3Jh
bSwgcG5hbWUsIHZhbHVlKTsKK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9n
cmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgQVNTRVJUKHByb2dy
YW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTGludCBs
ZW5ndGg7CisgICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBHTF9JTkZPX0xP
R19MRU5HVEgsICZsZW5ndGgpOworICAgIAorICAgIEdMc2l6ZWkgc2l6ZTsKKyAgICBHTGNoYXIq
IGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAgIGlmICghaW5mbykKKyAg
ICAgICAgcmV0dXJuICIiOworCisgICAgOjpnbEdldFByb2dyYW1JbmZvTG9nKChHTHVpbnQpIHBy
b2dyYW0sIGxlbmd0aCwgJnNpemUsIGluZm8pOworICAgIFN0cmluZyBzKGluZm8pOworICAgIGZh
c3RGcmVlKGluZm8pOworICAgIHJldHVybiBzOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWdu
ZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKHRhcmdldCwgcG5h
bWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyaXYoUGxh
dGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7
CisgICAgQVNTRVJUKHNoYWRlcik7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIAorICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50
cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Cisg
ICAgCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIERFTEVURV9TVEFUVVM6Cisg
ICAgICAgIGNhc2UgU0hBREVSX1RZUEU6CisgICAgICAgICAgICAvLyBMZXQgT3BlbkdMIGhhbmRs
ZSB0aGVzZS4KKyAgICAgICAgCisgICAgICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkg
c2hhZGVyLCBwbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2Fz
ZSBDT01QSUxFX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3Vy
Y2VNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAoKnZhbHVlKSA9IHN0YXRpY19jYXN0PGlu
dD4oZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1
bHQtPnNlY29uZC5pc1ZhbGlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisg
ICAgICAgIGNhc2UgSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBt
X3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICgqdmFsdWUpID0gMDsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpLmxlbmd0aCgpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBTSEFERVJfU09V
UkNFX0xFTkdUSDoKKyAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVyU291cmNlKHNoYWRl
cikubGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX0VOVU0pOworICAgIH0K
K30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTG9nKFBsYXRmb3Jt
M0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOworCisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMaW50IGxlbmd0aDsKKyAgICA6OmdsR2V0U2hhZGVy
aXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOworCisgICAg
SGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJl
c3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKKworICAgIGlmIChyZXN1bHQg
PT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCisgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAg
U2hhZGVyU291cmNlRW50cnkgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKKworICAgICBpZiAoZW50
cnkuaXNWYWxpZCkgeworICAgICAgICAgR0xpbnQgbGVuZ3RoOworICAgICAgICAgOjpnbEdldFNo
YWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKKwor
ICAgICAgICAgR0xzaXplaSBzaXplOworICAgICAgICAgR0xjaGFyKiBpbmZvID0gKEdMY2hhciop
IGZhc3RNYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgIGlmICghaW5mbykKKyAgICAgICAgICAgICBy
ZXR1cm4gIiI7CisKKyAgICAgICAgIDo6Z2xHZXRTaGFkZXJJbmZvTG9nKChHTHVpbnQpIHNoYWRl
ciwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7CisKKyAgICAgICAgIFN0cmluZyBzKGluZm8pOworICAg
ICAgICAgZmFzdEZyZWUoaW5mbyk7CisgICAgICAgICByZXR1cm4gczsKKyAgICAgfQorICAgICBl
bHNlIHsKKyAgICAgICAgIHJldHVybiBlbnRyeS5sb2c7CisgICAgIH0KK30KKworU3RyaW5nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIp
Cit7CisgICAgQVNTRVJUKHNoYWRlcik7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6
aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisgICAg
aWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuICIi
OworCisgICAgcmV0dXJuIHJlc3VsdC0+c2Vjb25kLnNvdXJjZTsKK30KKworCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdmFs
dWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdih1bnNp
Z25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFRleFBhcmFtZXRlcml2
KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQq
IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0
VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xHZXRVbmlmb3JtaXYoKEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24s
IHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybUxvY2F0aW9u
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFT
U0VSVChwcm9ncmFtKTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgbmFtZS51
dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0
cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZh
bHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VmVy
dGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKK30KKwor
bG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxv
bmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIAorICAgIHZvaWQqIHBvaW50ZXI7CisgICAgOjpnbEdldFZlcnRleEF0
dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgJnBvaW50ZXIpOworICAgIHJldHVybiByZWludGVy
cHJldF9jYXN0PGxvbmc+KHBvaW50ZXIpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eEltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgaW50ZXJu
YWxmb3JtYXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJvcmRl
ciwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgOjpnbFRleEltYWdlMkQodGFyZ2V0
LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0
eXBlLCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6
OnRleFN1YkltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQg
eG9mZiwgdW5zaWduZWQgeW9mZiwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5z
aWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBk
ZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVy
cyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCisgICAgOjpnbFRleFN1YkltYWdl
MkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQz
RDo6Y3JlYXRlQnVmZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgR0x1aW50IG87CisgICAgZ2xHZW5CdWZmZXJzKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30K
KwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUZyYW1lYnVmZmVyKCkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IG87CisgICAgZ2xHZW5G
cmFtZWJ1ZmZlcnNFWFQoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit1bnNpZ25lZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIHJldHVybiBnbENyZWF0ZVByb2dyYW0oKTsKK30KKwordW5zaWduZWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcigpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9uZyB0eXBlKQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJB
R01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwor
fQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuVGV4
dHVyZXMoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJmJ1ZmZlcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1lYnVmZmVyKHVuc2lnbmVkIGZyYW1lYnVmZmVy
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUZyYW1l
YnVmZmVyc0VYVCgxLCAmZnJhbWVidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW0pCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2lnbmVkIHJlbmRlcmJ1ZmZl
cikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZ2xEZWxldGVSZW5k
ZXJidWZmZXJzRVhUKDEsICZyZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkZWxldGVTaGFkZXIodW5zaWduZWQgc2hhZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVUZXh0dXJlKHVuc2lnbmVkIHRleHR1cmUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRl
eHR1cmUpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnNpemVJbkJ5dGVzKGludCB0eXBl
KQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdMX0JZVEU6CisgICAgICAg
ICAgICByZXR1cm4gc2l6ZW9mKEdMYnl0ZSk7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllU
RToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1Ynl0ZSk7CisgICAgICAgIGNhc2UgR0xf
U0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMc2hvcnQpOworICAgICAgICBjYXNl
IEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVzaG9ydCk7
CisgICAgICAgIGNhc2UgR0xfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGludCk7
CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVv
ZihHTHVpbnQpOworICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHNp
emVvZihHTGZsb2F0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3ludGhlc2l6ZUdMRXJyb3IodW5z
aWduZWQgbG9uZyBlcnJvcikKK3sKKyAgICBtX3N5bnRoZXRpY0Vycm9ycy5hZGQoZXJyb3IpOwor
fQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoM0RfQ0FOVkFTKQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbmdsL0dyYXBoaWNzQ29udGV4dDNE
T3BlbkdMLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Bl
bmdsL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjksOCArMjksNiBAQAog
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKIAotI2ltcG9ydCAiQmxvY2tFeGNlcHRp
b25zLmgiCi0KICNpbmNsdWRlICJBcnJheUJ1ZmZlci5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVy
Vmlldy5oIgogI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCkBAIC00MiwxOTMgKzQwLDE3IEBACiAj
aW5jbHVkZSAiSW50MzJBcnJheS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5j
bHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1ZGUgIldlYkdMTGF5ZXIuaCIKLSNpbmNsdWRlIDxD
b3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CisKKyNpZiBQTEFURk9STShNQUMpCiAjaW5j
bHVkZSA8T3BlbkdML0NHTFJlbmRlcmVycy5oPgogI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2Vu
ZGlmCisKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGljIHZvaWQgc2V0UGl4ZWxG
b3JtYXQoVmVjdG9yPENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9y
Qml0cywgaW50IGRlcHRoQml0cywgYm9vbCBhY2NlbGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwg
Ym9vbCBjbG9zZXN0KQotewotICAgIGF0dHJpYnMuY2xlYXIoKTsKLSAgICAKLSAgICBhdHRyaWJz
LmFwcGVuZChrQ0dMUEZBQ29sb3JTaXplKTsKLSAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2Fz
dDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oY29sb3JCaXRzKSk7Ci0gICAgYXR0cmlicy5hcHBl
bmQoa0NHTFBGQURlcHRoU2l6ZSk7Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dM
UGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGRlcHRoQml0cykpOwotICAgIAotICAgIGlmIChhY2NlbGVy
YXRlZCkKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUFjY2VsZXJhdGVkKTsKLSAgICBl
bHNlIHsKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVJlbmRlcmVySUQpOwotICAgICAg
ICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NH
TFJlbmRlcmVyR2VuZXJpY0Zsb2F0SUQpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChzdXBl
cnNhbXBsZSkKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKLSAg
ICAgICAgCi0gICAgaWYgKGNsb3Nlc3QpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFD
bG9zZXN0UG9saWN5KTsKLSAgICAgICAgCi0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8
Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KDApKTsKLX0KLQotUGFzc093blB0cjxHcmFwaGljc0Nv
bnRleHQzRD4gR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0
cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKLXsKLSAgICBPd25QdHI8R3Jh
cGhpY3NDb250ZXh0M0Q+IGNvbnRleHQobmV3IEdyYXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0
V2luZG93KSk7Ci0gICAgcmV0dXJuIGNvbnRleHQtPm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVs
ZWFzZSgpIDogMDsKLX0KLQotR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdy
YXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93
KQotICAgIDogbV9jdXJyZW50V2lkdGgoMCkKLSAgICAsIG1fY3VycmVudEhlaWdodCgwKQotICAg
ICwgbV9hdHRycyhhdHRycykKLSAgICAsIG1fY29udGV4dE9iaigwKQotICAgICwgbV90ZXh0dXJl
KDApCi0gICAgLCBtX2ZibygwKQotICAgICwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIoMCkKLSAgICAs
IG1fYm91bmRGQk8oMCkKLSAgICAsIG1fbXVsdGlzYW1wbGVGQk8oMCkKLSAgICAsIG1fbXVsdGlz
YW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIoMCkKLSAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZl
cigwKQotewotICAgIFVOVVNFRF9QQVJBTShob3N0V2luZG93KTsKLQotICAgIFZlY3RvcjxDR0xQ
aXhlbEZvcm1hdEF0dHJpYnV0ZT4gYXR0cmliczsKLSAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhl
bEZvcm1hdE9iaiA9IDA7Ci0gICAgR0xpbnQgbnVtUGl4ZWxGb3JtYXRzID0gMDsKLSAgICAKLSAg
ICAvLyBXZSB3aWxsIHRyeToKLSAgICAvLwotICAgIC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQg
ZGVwdGgvYWNjZWxlcmF0ZWQvc3VwZXJzYW1wbGVkCi0gICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMy
IGJpdCBkZXB0aC9hY2NlbGVyYXRlZAotICAgIC8vICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVw
dGgvYWNjZWxlcmF0ZWQKLSAgICAvLyAgNCkgY2xvc2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQg
ZGVwdGgvc29mdHdhcmUgcmVuZGVyZXIKLSAgICAvLwotICAgIC8vICBJZiBub25lIG9mIHRoYXQg
d29ya3MsIHdlIHNpbXBseSBmYWlsIGFuZCBzZXQgbV9jb250ZXh0T2JqIHRvIDAuCi0gICAgCi0g
ICAgc2V0UGl4ZWxGb3JtYXQoYXR0cmlicywgMzIsIDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0g
ICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwg
Jm51bVBpeGVsRm9ybWF0cyk7Ci0gICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAg
ICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsK
LSAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1h
dE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7Ci0gICAgICAgIAotICAgICAgICBpZiAobnVtUGl4ZWxG
b3JtYXRzID09IDApIHsKLSAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAx
NiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0
KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAg
ICAgICAKLSAgICAgICAgICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICAg
ICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVl
KTsKLSAgICAgICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwg
JnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAg
ICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IENvdWxkIG5vdCBmaW5kIGFuIGFjY2VwdGFibGUgcmVuZGVyZXIgLSBmYWlsCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQ0dMRXJyb3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChw
aXhlbEZvcm1hdE9iaiwgMCwgJm1fY29udGV4dE9iaik7Ci0gICAgQ0dMRGVzdHJveVBpeGVsRm9y
bWF0KHBpeGVsRm9ybWF0T2JqKTsKLSAgICAKLSAgICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8
ICFtX2NvbnRleHRPYmopIHsKLSAgICAgICAgLy8gQ291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4
dCAtIGZhaWwKLSAgICAgICAgbV9jb250ZXh0T2JqID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIC8vIFNldCB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8g
dXMuCi0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKLSAgICB2
YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgV2ViR0xMYXllcgotICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHRO
UyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRXaXRoR3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOwot
I2lmbmRlZiBOREVCVUcKLSAgICAgICAgW21fd2ViR0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2Vi
R0wgTGF5ZXIiXTsKLSNlbmRpZiAgICAKLSAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCi0g
ICAgCi0gICAgLy8gY3JlYXRlIGEgdGV4dHVyZSB0byByZW5kZXIgaW50bwotICAgIDo6Z2xHZW5U
ZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8y
RCwgbV90ZXh0dXJlKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9U
RVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgOjpnbFRleFBhcmFtZXRlcmYoR0xf
VEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIDo6Z2xU
ZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7
Ci0gICAgOjpnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1Qs
IEdMX0NMQU1QKTsKLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAg
Ci0gICAgLy8gY3JlYXRlIGFuIEZCTwotICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1f
ZmJvKTsKLSAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9m
Ym8pOwotICAgIAotICAgIG1fYm91bmRGQk8gPSBtX2ZibzsKLSAgICBpZiAoIW1fYXR0cnMuYW50
aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpCi0gICAgICAgIDo6
Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0KLSAgICAv
LyBjcmVhdGUgYW4gbXVsdGlzYW1wbGUgRkJPCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7
Ci0gICAgICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOwot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0
aXNhbXBsZUZCTyk7Ci0gICAgICAgIG1fYm91bmRGQk8gPSBtX211bHRpc2FtcGxlRkJPOwotICAg
ICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVy
KTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQotICAgICAg
ICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyBBTkdMRSBpbml0aWFsaXphdGlvbi4KLQot
ICAgIFRCdWlsdEluUmVzb3VyY2UgQU5HTEVSZXNvdXJjZXM7Ci0KLSAgICBBTkdMRVJlc291cmNl
cy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQz
RDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOwotICAgIGdl
dEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywg
JkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZvcm1WZWN0b3JzKTsKLSAgICBBTkdMRVJlc291
cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250
ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVj
dG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAw
OwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVf
SU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7Ci0g
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lN
QUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldElu
dGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xF
UmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzKTsKLSAgICBBTkdMRVJlc291cmNlcy5NYXhG
cmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRl
eHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZy
YWdtZW50VW5pZm9ybVZlY3RvcnMpOwotCi0gICAgLy8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVu
R0wgRVMuCi0gICAgQU5HTEVSZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSAxOwotICAgIAotICAg
IG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xFUmVzb3VyY2VzKTsKLSAgICAKLSAgICA6Omds
RW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUpOwotICAgIDo6Z2xDbGVhckNvbG9y
KDAsIDAsIDAsIDApOwotfQotCi1HcmFwaGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNE
KCkKLXsKLSAgICBpZiAobV9jb250ZXh0T2JqKSB7Ci0gICAgICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgICAgIDo6Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0
dXJlKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgICAgICA6Omds
RGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAg
ICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAg
ICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRo
U3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEs
ICZtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICht
X2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRGVs
ZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9
Ci0gICAgICAgIDo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKLSAgICAgICAg
Q0dMU2V0Q3VycmVudENvbnRleHQoMCk7Ci0gICAgICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgfQotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0
dHJpYnV0ZXMoKQogewogICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSByZWludGVycHJldF9j
YXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKQEAgLTI1Mywx
MSArNzUsNiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0CiAgICAg
bV9hdHRycy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQoKQotewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0
KG1fY29udGV4dE9iaik7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVy
aW5nUmVzdWx0c1RvQ2FudmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCiB7CiAg
ICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwpAQCAtMzA2
LDIxICsxMjMsNiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1JlCiAg
ICAgICAgICAgICAgICAgICBjYW52YXMtPndpZHRoKCksIGNhbnZhcy0+aGVpZ2h0KCksIGltYWdl
QnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAotYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNl
OwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMyTlBPVFN0cmljdCgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0Vy
cm9yR2VuZXJhdGVkT25PdXRPZkJvdW5kc0FjY2Vzc2VzKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
ZmFsc2U7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBp
bnQgaGVpZ2h0KQogewogICAgIGlmICh3aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQg
PT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFtX2NvbnRleHRPYmopCkBAIC00NTIsMTkgKzI1NCw5IEBA
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHQKICAgICA6OmdsRmx1c2go
KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVuc3VyZUNvbnRleHQoQ0dMQ29udGV4dE9iaiBj
b250ZXh0KQotewotICAgIGlmICghY29udGV4dCkKLSAgICAgICAgcmV0dXJuOwotICAgICAgICAK
LSAgICBDR0xDb250ZXh0T2JqIGN1cnJlbnRDb250ZXh0ID0gQ0dMR2V0Q3VycmVudENvbnRleHQo
KTsKLSAgICBpZiAoY3VycmVudENvbnRleHQgIT0gY29udGV4dCkKLSAgICAgICAgQ0dMU2V0Q3Vy
cmVudENvbnRleHQoY29udGV4dCk7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnByZXBh
cmVUZXh0dXJlKCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CiAgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CiAgICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlz
YW1wbGVGQk8pOwogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVC
VUZGRVJfRVhULCBtX2Zibyk7CkBAIC00NzYsNyArMjY4LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6cHJlcGFyZVRleHR1cmUoKQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVU
ZXh0dXJlKHVuc2lnbmVkIGxvbmcgdGV4dHVyZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEFjdGl2ZVRleHR1
cmUodGV4dHVyZSk7CiB9CiAKQEAgLTQ4NCwyNyArMjc2LDI3IEBAIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmF0dGFjaFNoYWRlcihQbGEKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7CiAgICAgQVNT
RVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xBdHRhY2hTaGFkZXIoKEdMdWludCkgcHJvZ3JhbSwg
KEdMdWludCkgc2hhZGVyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEF0dHJp
YkxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwg
Y29uc3QgU3RyaW5nJiBuYW1lKQogewogICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpn
bEJpbmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBpbmRleCwgbmFtZS51dGY4KCku
ZGF0YSgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcih1bnNpZ25l
ZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xC
aW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVmZmVyKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3Jt
M0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBHTHVpbnQgZmJvOwogICAgIGlmIChidWZmZXIp
CiAgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOwpAQCAtNTE4LDEwNiArMzEwLDEwNiBAQCB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIoCiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3Jt
M0RPYmplY3QgcmVuZGVyYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVY
VCh0YXJnZXQsIChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7CiB9CiAKIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmpl
Y3QgdGV4dHVyZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkg
dGV4dHVyZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91Ymxl
IHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAg
ICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4o
YWxwaGEpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5z
aWduZWQgbG9uZyBtb2RlICkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEJsZW5kRXF1YXRpb24obW9kZSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSh1bnNpZ25l
ZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6Omds
QmxlbmRFcXVhdGlvblNlcGFyYXRlKG1vZGVSR0IsIG1vZGVBbHBoYSk7CiB9CiAKIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWdu
ZWQgbG9uZyBkZmFjdG9yKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3IsIGRmYWN0
b3IpOwogfSAgICAgICAKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5jU2VwYXJh
dGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNpZ25lZCBs
b25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQmxl
bmRGdW5jU2VwYXJhdGUoc3JjUkdCLCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGludCBzaXplLCB1bnNpZ25lZCBsb25nIHVzYWdlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQnVmZmVyRGF0
YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRh
dGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdl
dCwgc2l6ZSwgZGF0YSwgdXNhZ2UpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZm
ZXJTdWJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNv
bnN0IHZvaWQqIGRhdGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xCdWZmZXJTdWJEYXRhKHRhcmdldCwgb2Zm
c2V0LCBzaXplLCBkYXRhKTsKIH0KIAogdW5zaWduZWQgbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6
Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25nIHRhcmdldCkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAg
cmV0dXJuIDo6Z2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUg
YiwgZG91YmxlIGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xDbGVhckNvbG9yKHN0YXRpY19jYXN0PGZsb2F0
PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksIHN0YXRp
Y19jYXN0PGZsb2F0PihhKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyKHVu
c2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbENsZWFyKG1hc2spOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAg
OjpnbENsZWFyRGVwdGgoZGVwdGgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjbGVh
clN0ZW5jaWwobG9uZyBzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJv
b2wgYmx1ZSwgYm9vbCBhbHBoYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbENvbG9yTWFzayhyZWQsIGdyZWVu
LCBibHVlLCBhbHBoYSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFk
ZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCiB7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwog
CiAgICAgaW50IEdMc2hhZGVyVHlwZTsKICAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsK
QEAgLTY0MSw2ICs0MzMsMTAgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29tcGlsZVNoYWRl
cihQbAogICAgIFN0cmluZyB0cmFuc2xhdGVkU2hhZGVyU291cmNlOwogICAgIFN0cmluZyBzaGFk
ZXJJbmZvTG9nOwogCisgICAgZm9yIChpbnQgc3RyWCA9IDA7IHN0clggPCAxMDsgc3RyWCsrKSB7
CisgICAgICAgIHByaW50Zigic3RyWyVpXSA9ICV1XG4iLHN0clgsZW50cnkuc291cmNlLnV0Zjgo
KS5kYXRhKClbc3RyWF0pOworICAgIH0KKwogICAgIGJvb2wgaXNWYWxpZCA9IG1fY29tcGlsZXIu
dmFsaWRhdGVTaGFkZXJTb3VyY2UoZW50cnkuc291cmNlLnV0ZjgoKS5kYXRhKCksIHNoYWRlclR5
cGUsIHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UsIHNoYWRlckluZm9Mb2cpOwogCiAgICAgZW50cnku
bG9nID0gc2hhZGVySW5mb0xvZzsKQEAgLTY2OCw3ICs0NjQsNyBAQCB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjb21waWxlU2hhZGVyKFBsCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlU
ZXhJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBsb25n
IGludGVybmFsZm9ybWF0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5z
aWduZWQgbG9uZyBoZWlnaHQsIGxvbmcgYm9yZGVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBpZiAobV9hdHRycy5h
bnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1w
bGVGQk8pOwogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZG
RVJfRVhULCBtX2Zibyk7CkBAIC02ODIsNyArNDc4LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6Y29weVRleEltYWdlMkQodQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3Vi
SW1hZ2UyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBsZXZlbCwgbG9uZyB4b2Zmc2V0LCBs
b25nIHlvZmZzZXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25l
ZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91
bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewogICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKICAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwpA
QCAtNjk2LDI1ICs0OTIsMjUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleFN1Yklt
YWdlMgogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjdWxsRmFjZSh1bnNpZ25lZCBsb25nIG1v
ZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0
Q3VycmVudCgpOwogICAgIDo6Z2xDdWxsRmFjZShtb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVwdGhGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYykKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbERl
cHRoRnVuYyhmdW5jKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhNYXNrKGJv
b2wgZmxhZykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNv
bnRleHRDdXJyZW50KCk7CiAgICAgOjpnbERlcHRoTWFzayhmbGFnKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZGVwdGhSYW5nZShkb3VibGUgek5lYXIsIGRvdWJsZSB6RmFyKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICA6OmdsRGVwdGhSYW5nZSh6TmVhciwgekZhcik7CiB9CiAKQEAgLTcyMiw2MSArNTE4
LDYxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRldGFjaFNoYWRlcihQbGEKIHsKICAgICBB
U1NFUlQocHJvZ3JhbSk7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xEZXRhY2hT
aGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpn
bERpc2FibGUoY2FwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGlzYWJsZVZlcnRl
eEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xEaXNhYmxl
VmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
cmF3QXJyYXlzKHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50
KCk7CiAgICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmlyc3QsIGNvdW50KTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVuc2lnbmVkIGxvbmcgbW9kZSwgdW5zaWdu
ZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBsb25nIG9mZnNldCkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgOjpnbERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2FzdDx2
b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsRW5h
YmxlKGNhcCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJp
YkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xFbmFibGVWZXJ0ZXhB
dHRyaWJBcnJheShpbmRleCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlzaCgp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIDo6Z2xGaW5pc2goKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
Zmx1c2goKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKICAgICA6OmdsRmx1c2goKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2ln
bmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBs
YXRmb3JtM0RPYmplY3QgYnVmZmVyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0g
KEdMdWludCkgYnVmZmVyOwogICAgIGlmIChhdHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRU
QUNITUVOVCkgewogICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0
LCBERVBUSF9BVFRBQ0hNRU5ULCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7CkBA
IC03ODcsMTkgKzU4MywxOSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1ZmZlclJl
bmRlCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVyZTJEKHVuc2ln
bmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcg
dGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxvbmcgbGV2ZWwpCiB7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwog
ICAgIDo6Z2xGcmFtZWJ1ZmZlclRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRh
cmdldCwgKEdMdWludCkgdGV4dHVyZSwgbGV2ZWwpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpmcm9udEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsRnJvbnRG
YWNlKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5lcmF0ZU1pcG1hcCh1
bnNpZ25lZCBsb25nIHRhcmdldCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRh
cmdldCk7CiB9CiAKQEAgLTgwOSw3ICs2MDUsNyBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRBY3RpdmVBdHRyaWIoCiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUp
OwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBHTGludCBtYXhBdHRyaWJ1
dGVTaXplID0gMDsKICAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJv
Z3JhbSksIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFYX0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUp
OwogICAgIEdMY2hhciBuYW1lW21heEF0dHJpYnV0ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklC
VVRFX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdGlvbgpAQCAtODMxLDcgKzYyNyw3
IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZVVuaWZvcm0KICAgICAgICAgc3lu
dGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsKICAgICA6OmdsR2V0UHJvZ3Jh
bWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9VTklGT1JNX01BWF9M
RU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4VW5pZm9ybVNpemVd
OyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1ZGVzIG51bGwgdGVybWluYXRp
b24KQEAgLTg1Myw3ICs2NDksNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRhY2hl
ZFNoYWRlCiAgICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwogICAgICAg
ICByZXR1cm47CiAgICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBt
YWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0QXR0YWNoZWRTaGFkZXJzKHN0YXRpY19j
YXN0PEdMdWludD4ocHJvZ3JhbSksIG1heENvdW50LCBjb3VudCwgc2hhZGVycyk7CiB9CiAKQEAg
LTg2MSw4ICs2NTcsOCBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9u
CiB7CiAgICAgaWYgKCFwcm9ncmFtKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgcmV0dXJuIDo6Z2xHZXRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0
ZjgoKS5kYXRhKCkpOwogfQogCkBAIC04ODAsMTkgKzY3NiwxOSBAQCB1bnNpZ25lZCBsb25nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRFcnJvCiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgp
OwogICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKIH0KIAogU3RyaW5nIEdyYXBoaWNzQ29udGV4
dDNEOjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICByZXR1cm4gU3Ry
aW5nKChjb25zdCBjaGFyKikgOjpnbEdldFN0cmluZyhuYW1lKSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9k
ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbEhpbnQodGFyZ2V0LCBtb2RlKTsKIH0KIApAQCAtOTAwLDE0ICs2
OTYsMTQgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZmZXIoUGxhdGZvcgogewogICAg
IGlmICghYnVmZmVyKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgcmV0
dXJuIDo6Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIpOwogfQogCiBib29sIEdyYXBoaWNzQ29u
dGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIHJldHVybiA6
OmdsSXNFbmFibGVkKGNhcCk7CiB9CiAKQEAgLTkxNSw4ICs3MTEsOCBAQCBib29sIEdyYXBoaWNz
Q29udGV4dDNEOjppc0ZyYW1lYnVmZmVyKFBsCiB7CiAgICAgaWYgKCFmcmFtZWJ1ZmZlcikKICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1
ZmZlckVYVCgoR0x1aW50KSBmcmFtZWJ1ZmZlcik7CiB9CiAKQEAgLTkyNCw4ICs3MjAsOCBAQCBi
b29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1Byb2dyYW0oUGxhdGZvCiB7CiAgICAgaWYgKCFwcm9n
cmFtKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgcmV0dXJuIDo6Z2xJ
c1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKQEAgLTkzMyw4ICs3MjksOCBAQCBib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc1JlbmRlcmJ1ZmZlcihQCiB7CiAgICAgaWYgKCFyZW5kZXJi
dWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICByZXR1cm4gOjpn
bElzUmVuZGVyYnVmZmVyRVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7CiB9CiAKQEAgLTk0Miw4
ICs3MzgsOCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc1NoYWRlcihQbGF0Zm9yCiB7CiAg
ICAgaWYgKCFzaGFkZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBy
ZXR1cm4gOjpnbElzU2hhZGVyKChHTHVpbnQpIHNoYWRlcik7CiB9CiAKQEAgLTk1MSwzMyArNzQ3
LDMzIEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzVGV4dHVyZShQbGF0Zm8KIHsKICAgICBp
ZiAoIXRleHR1cmUpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICByZXR1
cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0dXJlKTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0aCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbExpbmVXaWR0
aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQogewogICAgIEFTU0VSVChw
cm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRl
eHRDdXJyZW50KCk7CiAgICAgOjpnbExpbmtQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwaXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1l
LCBsb25nIHBhcmFtKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBt
YWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFtKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFjdG9y
LCBkb3VibGUgdW5pdHMpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0
PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNfY2FzdDxmbG9hdD4odW5pdHMpKTsKIH0KIApAQCAtOTg1
LDcgKzc4MSw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyAKIHsK
ICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoZSB0d28gZ2xGbHVzaCBjYWxscyB3aGVuIHRoZSBkcml2
ZXIgYnVnIGlzIGZpeGVkLCBpLmUuLAogICAgIC8vIGFsbCBwcmV2aW91cyByZW5kZXJpbmcgY2Fs
bHMgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHJlYWRpbmcgcGl4ZWxzLgotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsRmx1
c2goKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRp
c2FtcGxlRkJPKSB7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFN
RUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwpAQCAtMTAwMiwxMyArNzk4LDEzIEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMobG9uZyAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCiB7CiAgICAgLy8gRklYTUU6IFRoaXMgaXMg
bm90IGltcGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZkZWZz
IGZvciB0aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIC8vOjpnbFJlbGVhc2VTaGFk
ZXJDb21waWxlcigpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJT
dG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAg
c3dpdGNoIChpbnRlcm5hbGZvcm1hdCkgewogICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKICAgICAg
ICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKQEAgLTEwMjksMjEg
KzgyNSwyMSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yCiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNhbXBsZUNvdmVyYWdlKGRvdWJsZSB2YWx1ZSwgYm9vbCBp
bnZlcnQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTYW1wbGVDb3ZlcmFnZShzdGF0aWNfY2FzdDxmbG9hdD4o
dmFsdWUpLCBpbnZlcnQpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzY2lzc29yKGxv
bmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJy
ZW50KCk7CiAgICAgOjpnbFNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlciwg
Y29uc3QgU3RyaW5nJiBzdHJpbmcpCiB7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7
CiAKICAgICBTaGFkZXJTb3VyY2VFbnRyeSBlbnRyeTsKIApAQCAtMTA1NCwyNzAgKzg1MCwyNzAg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291cmNlKFBsYQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1
bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTdGVuY2lsRnVuYyhmdW5jLCByZWYs
IG1hc2spOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1NlcGFyYXRl
KHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWdu
ZWQgbG9uZyBtYXNrKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBt
YWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBm
dW5jLCByZWYsIG1hc2spOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFz
ayh1bnNpZ25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTdGVuY2lsTWFzayhtYXNrKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0ZSh1bnNpZ25l
ZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFN0ZW5jaWxN
YXNrU2VwYXJhdGUoZmFjZSwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0
ZW5jaWxPcCh1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVk
IGxvbmcgenBhc3MpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwgemZhaWwsIHpwYXNz
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2VwYXJhdGUodW5zaWdu
ZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVu
c2lnbmVkIGxvbmcgenBhc3MpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNl
LCBmYWlsLCB6ZmFpbCwgenBhc3MpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQ
YXJhbWV0ZXJmKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJl
bnQoKTsKICAgICA6OmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxm
bG9hdD4odmFsdWUpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1ldGVy
aSh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBpbnQgdmFsdWUpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IDo6Z2xUZXhQYXJhbWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1
ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlv
biwgZmxvYXQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3JtMWYobG9jYXRpb24sIHYwKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmdihsb25nIGxvY2F0aW9uLCBmbG9h
dCogYXJyYXksIGludCBzaXplKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTFmdihsb2NhdGlvbiwg
c2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmYobG9u
ZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTJm
KGxvY2F0aW9uLCB2MCwgdjEpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
MmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklY
TUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZv
cm0yZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIDo6Z2xVbmlmb3JtM2YobG9jYXRpb24sIHYwLCB2MSwgdjIpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBh
cnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11
bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNv
bnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFycmF5
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRpb24s
IGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6Omds
VW5pZm9ybTRmKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm00ZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6
ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBsb2NhdGlvbiwgaW50IHYwKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICA6OmdsVW5pZm9ybTFpKGxvY2F0aW9uLCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0aW9uLCBpbnQgdjAs
IGludCB2MSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNv
bnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQq
IGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEg
bXVsdGlwbGUgb2YgMgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6ZSwgYXJy
YXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBsb2NhdGlv
biwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0zaShsb2Nh
dGlvbiwgdjAsIHYxLCB2Mik7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0z
aXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0z
aXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIsIGludCB2MykK
IHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJy
ZW50KCk7CiAgICAgOjpnbFVuaWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCog
YXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBt
dWx0aXBsZSBvZiA0Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3JtNGl2KGxvY2F0aW9uLCBzaXplLCBhcnJh
eSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgyZnYobG9uZyBs
b2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAg
Ly8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpn
bFVuaWZvcm1NYXRyaXgyZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9jYXRpb24s
IGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1F
OiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3Jt
TWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxvY2F0aW9uLCBib29sIHRy
YW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3Ro
IG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm1NYXRyaXg0
ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgOjpnbFVzZVByb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCiB7CiAg
ICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xWYWxpZGF0ZVByb2dyYW0o
KEdMdWludCkgcHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0
dHJpYjFmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjApCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIxZihpbmR4LCB2MCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRl
eEF0dHJpYjFmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKIHsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAg
OjpnbFZlcnRleEF0dHJpYjFmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnZlcnRleEF0dHJpYjJmKHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0
IHYxKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4
dEN1cnJlbnQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliMmYoaW5keCwgdjAsIHYxKTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMmZ2KHVuc2lnbmVkIGxvbmcgaW5k
eCwgZmxvYXQqIGFycmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliMmZ2KGluZHgsIGFy
cmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2YodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6
OmdsVmVydGV4QXR0cmliM2YoaW5keCwgdjAsIHYxLCB2Mik7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJh
eSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjNmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmKHVuc2lnbmVkIGxvbmcgaW5keCwg
ZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xW
ZXJ0ZXhBdHRyaWI0ZihpbmR4LCB2MCwgdjEsIHYyLCB2Myk7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OnZlcnRleEF0dHJpYjRmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJh
eSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbFZlcnRleEF0dHJpYjRmdihpbmR4LCBhcnJheSk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYlBvaW50ZXIodW5zaWduZWQgbG9uZyBp
bmR4LCBpbnQgc2l6ZSwgaW50IHR5cGUsIGJvb2wgbm9ybWFsaXplZCwgdW5zaWduZWQgbG9uZyBz
dHJpZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVmVydGV4QXR0cmli
UG9pbnRlcihpbmR4LCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUsIHJlaW50ZXJwcmV0
X2Nhc3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnZpZXdwb3J0KGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25n
IHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFZpZXdwb3J0KHN0
YXRpY19jYXN0PEdMaW50Pih4KSwgc3RhdGljX2Nhc3Q8R0xpbnQ+KHkpLCBzdGF0aWNfY2FzdDxH
THNpemVpPih3aWR0aCksIHN0YXRpY19jYXN0PEdMc2l6ZWk+KGhlaWdodCkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRCb29sZWFudih1bnNpZ25lZCBsb25nIHBuYW1lLCB1bnNp
Z25lZCBjaGFyKiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEdldEJvb2xlYW52KHBuYW1lLCB2YWx1
ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJ1ZmZlclBhcmFtZXRlcml2KHVu
c2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICA6OmdsR2V0QnVmZmVyUGFyYW1ldGVyaXYodGFyZ2V0LCBwbmFtZSwgdmFsdWUpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYodW5zaWduZWQgbG9uZyBwbmFt
ZSwgZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0RmxvYXR2KHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBh
cmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQs
IHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIGlmIChhdHRhY2ht
ZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkKICAgICAgICAgYXR0YWNobWVudCA9IERF
UFRIX0FUVEFDSE1FTlQ7IC8vIE9yIFNURU5DSUxfQVRUQUNITUVOVCwgZWl0aGVyIHdvcmtzLgog
ICAgIDo6Z2xHZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdkVYVCh0YXJnZXQsIGF0
dGFjaG1lbnQsIHBuYW1lLCB2YWx1ZSk7CkBAIC0xMzMyLDcgKzExMjgsNyBAQCB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpCiAgICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdM
J3MgY29ycmVzcG9uZGluZyBxdWVyaWVzIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMK
ICAgICAvLyB3aGVyZWFzIEdMRVMyIHJldHVybiB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgKGVhY2gg
dmVjdG9yIGhhcyA0IGNvbXBvbmVudHMpLgogICAgIC8vIFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJl
dHVybmVkIGJ5IGRlc2t0b3AgR0wgbmVlZHMgdG8gYmUgZGl2aWRlZCBieSA0LgotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBz
d2l0Y2ggKHBuYW1lKSB7CiAgICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1B
VDoKICAgICAgICAgKnZhbHVlID0gR0xfUkdCOwpAQCAtMTM1OSwxNSArMTE1NSwxNSBAQCB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpCiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWlu
dCkgcHJvZ3JhbSwgcG5hbWUsIHZhbHVlKTsKIH0KIAogU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRQcm9ncmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCiB7CiAgICAgQVNT
RVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKwor
ICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMaW50IGxlbmd0aDsKICAgICA6OmdsR2V0
UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7
CiAgICAgCkBAIC0xMzg0LDE2ICsxMTgwLDE2IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6
Z2V0UHJvZ3JhbUluZm8KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0UmVuZGVyYnVmZmVy
UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGlu
dCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdkVYVCh0
YXJnZXQsIHBuYW1lLCB2YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNo
YWRlcml2KFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyLCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQq
IHZhbHVlKQogewogICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICAKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworCiAgICAg
SGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJl
c3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKICAgICAKICAgICBzd2l0Y2gg
KHBuYW1lKSB7CkBAIC0xNDAzLDI1ICsxMTk5LDI1IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldFNoYWRlcml2KFBsYXQKICAgICAgICAgCiAgICAgICAgICAgICA6OmdsR2V0U2hhZGVyaXYo
KEdMdWludCkgc2hhZGVyLCBwbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgYnJlYWs7Ci0KKyAg
ICAgICAgCiAgICAgICAgIGNhc2UgQ09NUElMRV9TVEFUVVM6CiAgICAgICAgICAgICBpZiAocmVz
dWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgKCp2YWx1
ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KGZhbHNlKTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgICAgICAgKCp2
YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3VsdC0+c2Vjb25kLmlzVmFsaWQpOwogICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKyAgICAgICAgCiAgICAgICAgIGNhc2UgSU5GT19M
T0dfTEVOR1RIOgogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5l
bmQoKSkgewogICAgICAgICAgICAgICAgICgqdmFsdWUpID0gMDsKICAgICAgICAgICAgICAgICBy
ZXR1cm47CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAKKyAgICAgICAgCiAgICAgICAgICAg
ICAoKnZhbHVlKSA9IGdldFNoYWRlckluZm9Mb2coc2hhZGVyKS5sZW5ndGgoKTsKICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgCisgICAgICAgIAogICAgICAgICBjYXNlIFNIQURFUl9T
T1VSQ0VfTEVOR1RIOgogICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJTb3VyY2Uoc2hh
ZGVyKS5sZW5ndGgoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTQzNSw3ICsxMjMxLDcgQEAg
U3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTAogewogICAgIEFTU0VSVChz
aGFkZXIpOwogCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOwogICAgIEdMaW50IGxlbmd0aDsKICAgICA6OmdsR2V0U2hhZGVyaXYoKEdM
dWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwogCkBAIC0xNDcwLDcg
KzEyNjYsNyBAQCBTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlclNvdXJjCiB7CiAg
ICAgQVNTRVJUKHNoYWRlcik7CiAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAKICAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3Qs
IFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAu
ZmluZChzaGFkZXIpOwogCkBAIC0xNDgzLDUyICsxMjc5LDUyIEBAIFN0cmluZyBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4
UGFyYW1ldGVyZnYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGZs
b2F0KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEdldFRleFBhcmFtZXRlcmZ2KHRhcmdldCwgcG5h
bWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VGV4UGFyYW1ldGVy
aXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1mdihQbGF0Zm9ybTNET2Jq
ZWN0IHByb2dyYW0sIGxvbmcgbG9jYXRpb24sIGZsb2F0KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpn
bEdldFVuaWZvcm1mdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtaXYoUGxhdGZvcm0zRE9iamVjdCBwcm9n
cmFtLCBsb25nIGxvY2F0aW9uLCBpbnQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0VW5pZm9y
bWl2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7CiB9CiAKIGxvbmcgR3JhcGhp
Y3NDb250ZXh0M0Q6OmdldFVuaWZvcm1Mb2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IGNvbnN0IFN0cmluZyYgbmFtZSkKIHsKICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7
CiAgICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgbmFt
ZS51dGY4KCkuZGF0YSgpKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4
QXR0cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQq
IHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0VmVydGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2
YWx1ZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVu
c2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgp
OwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKIH0KIAog
bG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxv
bmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIAorICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOworCiAgICAgdm9pZCog
cG9pbnRlcjsKICAgICA6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRlcnYoaW5kZXgsIHBuYW1lLCAm
cG9pbnRlcik7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZz4ocG9pbnRlcik7CkBA
IC0xNTM2LDcgKzEzMzIsNyBAQCBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRy
aWJPCiAKIGludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQs
IHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgd2lkdGgs
IHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYm9yZGVyLCB1bnNpZ25lZCBmb3JtYXQsIHVuc2ln
bmVkIHR5cGUsIHZvaWQqIHBpeGVscykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAKICAgICA6OmdsVGV4SW1hZ2UyRCh0YXJn
ZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQs
IHR5cGUsIHBpeGVscyk7CiAgICAgcmV0dXJuIDA7CkBAIC0xNTQ0LDcgKzEzNDAsNyBAQCBpbnQg
R3JhcGhpY3NDb250ZXh0M0Q6OnRleEltYWdlMkQodW5zaWduCiAKIGludCBHcmFwaGljc0NvbnRl
eHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNp
Z25lZCB4b2ZmLCB1bnNpZ25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0
LCB1bnNpZ25lZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAK
ICAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQaXhlbFN0b3JlIHBhcmFt
cyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlmZmVyIGZyb20gdGhlIHN1
YmltYWdlIHNpemUKICAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2ZmLCB5
b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7CkBAIC0xNTUzLDcgKzEz
NDksNyBAQCBpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdlMkQodW5zCiAKIHVuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVCdWZmZXIoKQogewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBHTHVpbnQg
bzsKICAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwogICAgIHJldHVybiBvOwpAQCAtMTU2MSw3ICsx
MzU3LDcgQEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcgogCiB1bnNp
Z25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIoKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBH
THVpbnQgbzsKICAgICBnbEdlbkZyYW1lYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJuIG87
CkBAIC0xNTY5LDEzICsxMzY1LDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVh
dGVGcmFtZWIKIAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0oKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJl
bnQoKTsKICAgICByZXR1cm4gZ2xDcmVhdGVQcm9ncmFtKCk7CiB9CiAKIHVuc2lnbmVkIEdyYXBo
aWNzQ29udGV4dDNEOjpjcmVhdGVSZW5kZXJidWZmZXIoKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBHTHVpbnQgbzsK
ICAgICBnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm8pOwogICAgIHJldHVybiBvOwpAQCAtMTU4
MywxMyArMTM3OSwxMyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUmVuZGVy
CiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9u
ZyB0eXBlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKICAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJBR01F
TlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwogfQog
CiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IEdMdWludCBvOwogICAgIGdsR2VuVGV4dHVyZXMoMSwgJm8pOwogICAgIHJldHVybiBvOwpAQCAt
MTU5NywzNyArMTM5MywzNyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4
dHVyCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUJ1ZmZlcih1bnNpZ25lZCBidWZm
ZXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0
Q3VycmVudCgpOwogICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsKIH0KIAogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQgZnJhbWVidWZmZXIp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZmcmFtZWJ1ZmZlcik7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVByb2dyYW0odW5zaWduZWQgcHJvZ3Jh
bSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQgcmVuZGVyYnVmZmVyKQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJl
bnQoKTsKICAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNFWFQoMSwgJnJlbmRlcmJ1ZmZlcik7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7CiB9CiAKIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgZ2xE
ZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7CiB9CiAK
</data>
<flag name="review"
          id="56056"
          type_id="1"
          status="-"
          setter="cmarrin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66922</attachid>
            <date>2010-09-08 11:59:45 -0700</date>
            <delta_ts>2010-12-21 06:33:47 -0800</delta_ts>
            <desc>Removed CGL calls</desc>
            <filename>begin-gcd3d-refactor9</filename>
            <type>text/plain</type>
            <size>155132</size>
            <attacher name="Paul Sawaya">psawaya</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2Njk5OCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTU5IEBACisyMDEwLTA5LTA4ICBQYXVsIFNhd2F5YSAgPHBzYXdheWFAYXBwbGUu
Y29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFJl
ZmFjdG9yZWQgbm9uLU1hYyBzcGVjaWZpYyBjb2RlIGludG8gR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuCisgICAgICAgIAorICAgICAgICBNb3ZpbmcgdGhpcyBmaWxlIGludG8gcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjIGZvciBub3csIGFuZCBvbmx5IGJ1aWxkaW5nIG9uIE1hYy4KKyAgICAgICAgCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMDYyNQorCisg
ICAgICAgIE5vIG5ldyB0ZXN0cy4gKE9PUFMhKQorCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9HcmFw
aGljc0NvbnRleHQzRE1hYy5tbToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjptYWtlQ29udGV4dEN1cnJlbnQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OmlzRXJyb3JHZW5lcmF0ZWRPbk91dE9mQm91bmRzQWNjZXNzZXMpOgorICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL29wZW5nbDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3Mvb3BlbmdsL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcDogQ29waWVkIGZyb20gcGxhdGZv
cm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tLgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnByZXBhcmVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJlKToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjphdHRhY2hTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmJpbmRBdHRyaWJMb2NhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6YmluZEZyYW1lYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpiaW5kVGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6YmxlbmRDb2xvcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Ymxl
bmRFcXVhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRF
cXVhdGlvblNlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpi
bGVuZEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRnVu
Y1NlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJE
YXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRh
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVy
U3RhdHVzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjbGVhckNvbG9y
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjbGVhcik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aCk6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpjb2xvck1hc2spOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpjb3B5VGV4U3ViSW1hZ2UyRCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6Y3VsbEZhY2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmRlcHRoRnVuYyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVwdGhN
YXNrKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZXRhY2hTaGFkZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGUpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0FycmF5cyk6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjplbmFibGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KToKKyAgICAgICAgKFdlYkNvcmU6
OkdyYXBoaWNzQ29udGV4dDNEOjpmaW5pc2gpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmZsdXNoKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpm
cmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6ZnJhbWVidWZmZXJUZXh0dXJlMkQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OmZyb250RmFjZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2VuZXJhdGVNaXBtYXApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6
OmdldEFjdGl2ZUF0dHJpYik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Z2V0QWN0aXZlVW5pZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
Z2V0QXR0YWNoZWRTaGFkZXJzKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
OjpnZXRBdHRyaWJMb2NhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6Z2V0RXJyb3IpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0
cmluZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aGludCk6CisgICAg
ICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6aXNCdWZmZXIpOgorICAgICAgICAoV2Vi
Q29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjppc1JlbmRlcmJ1ZmZlcik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQzRDo6aXNTaGFkZXIpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omlz
VGV4dHVyZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRo
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpsaW5rUHJvZ3JhbSk6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6cGl4ZWxTdG9yZWkpOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlYWRQaXhlbHMpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnJlbGVhc2VTaGFkZXJDb21waWxlcik6CisgICAgICAgIChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcmFnZSk6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292ZXJhZ2UpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IpOgorICAgICAgICAoV2ViQ29yZTo6
R3JhcGhpY3NDb250ZXh0M0Q6OnNoYWRlclNvdXJjZSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6c3RlbmNpbEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJhdGUpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0M0Q6OnN0ZW5jaWxNYXNrKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29u
dGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNz
Q29udGV4dDNEOjpzdGVuY2lsT3ApOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnN0ZW5jaWxPcFNlcGFyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4
dDNEOjp0ZXhQYXJhbWV0ZXJmKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Ojp0ZXhQYXJhbWV0ZXJpKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtMWYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0x
ZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZik6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdik6CisgICAgICAg
IChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTNmKToKKyAgICAgICAgKFdlYkNv
cmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2KToKKyAgICAgICAgKFdlYkNvcmU6Okdy
YXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0Q6OnVuaWZvcm00ZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
M0Q6OnVuaWZvcm0xaSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTFpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJp
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYpOgorICAgICAgICAoV2ViQ29y
ZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFw
aGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybU1hdHJpeDJmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0Nv
bnRleHQzRDo6dXNlUHJvZ3JhbSk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RDo6dmFsaWRhdGVQcm9ncmFtKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNE
Ojp2ZXJ0ZXhBdHRyaWIxZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6
dmVydGV4QXR0cmliMWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVy
dGV4QXR0cmliMmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0
ZXhBdHRyaWIzZik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4
QXR0cmliM2Z2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhB
dHRyaWI0Zik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliNGZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRy
aWJQb2ludGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjp2aWV3cG9y
dCk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYpOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEJ1ZmZlclBhcmFtZXRlcml2
KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRGbG9hdHYpOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldEZyYW1lYnVmZmVyQXR0YWNobWVu
dFBhcmFtZXRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRJ
bnRlZ2Vydik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0UHJvZ3Jh
bWl2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9ncmFtSW5m
b0xvZyk6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0UmVuZGVyYnVm
ZmVyUGFyYW1ldGVyaXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6Omdl
dFNoYWRlcml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFk
ZXJJbmZvTG9nKToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFk
ZXJTb3VyY2UpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBh
cmFtZXRlcmZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQ
YXJhbWV0ZXJpdik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5p
Zm9ybWZ2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3Jt
aXYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1Mb2Nh
dGlvbik6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0
cmliZnYpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0
dHJpYml2KToKKyAgICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhB
dHRyaWJPZmZzZXQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnRleElt
YWdlMkQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OnRleFN1YkltYWdl
MkQpOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIp
OgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVByb2dyYW0pOgor
ICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcik6
CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlU2hhZGVyKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVCdWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1lYnVmZmVyKToKKyAgICAgICAg
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVQcm9ncmFtKToKKyAgICAgICAgKFdl
YkNvcmU6OkdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIpOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVNoYWRlcik6CisgICAgICAgIChXZWJD
b3JlOjpHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSk6CisKIDIwMTAtMDktMDggIEFu
ZHkgRXN0ZXMgIDxhZXN0ZXNAYXBwbGUuY29tPgogCiAgICAgICAgIFJ1YmJlci1zdGFtcGVkIGJ5
IERhcmluIEFkbGVyLgpJbmRleDogV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBi
eHByb2oJKHJldmlzaW9uIDY2ODg3KQorKysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTUzNjksNiArNTM2OSw3IEBACiAJCUZBQkU3
MkZFMTA1OUMyMTEwMEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQUJFNzJGQzEwNTlDMjExMDBEOTk5REQgLyog
TWF0aE1MTmFtZXMuY3BwICovOyB9OwogCQlGQUMxMkNDNDExMjBEQTY5MDBEQUNDMzYgLyogUmVu
ZGVyTWF0aE1MU3ViU3VwLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEZBQzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAu
Y3BwICovOyB9OwogCQlGQUMxMkNDNTExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3Vi
U3VwLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQUMx
MkNDMzExMjBEQTY5MDBEQUNDMzYgLyogUmVuZGVyTWF0aE1MU3ViU3VwLmggKi87IH07CisJCUZC
QzIyMERGMTIzN0ZCRUIwMEJDRjc4OCAvKiBHcmFwaGljc0NvbnRleHQzRE9wZW5HTC5jcHAgaW4g
U291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGQkMyMjBERTEyMzdG
QkVCMDBCQ0Y3ODggLyogR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwICovOyB9OwogCQlGRTZG
RDQ4ODBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDg1MEY2NzZFNTcwMDA5Mjg3MyAvKiBD
b29yZGluYXRlcy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07
IH07CiAJCUZFNkZENDhEMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDhCMEY2NzZF
OTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5hdGVzLmNwcCAqLzsgfTsKIAkJRkU2RkQ0OEUwRjY3NkU5
MzAwMDkyODczIC8qIEpTQ29vcmRpbmF0ZXMuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEZFNkZENDhDMEY2NzZFOTMwMDA5Mjg3MyAvKiBKU0Nvb3JkaW5h
dGVzLmggKi87IH07CkBAIC0xMTI0MCw2ICsxMTI0MSw3IEBACiAJCUZBQkU3MkZDMTA1OUMyMTEw
MEQ5OTlERCAvKiBNYXRoTUxOYW1lcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBNYXRoTUxOYW1lcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUZB
QzEyQ0MyMTEyMERBNjkwMERBQ0MzNiAvKiBSZW5kZXJNYXRoTUxTdWJTdXAuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gUmVuZGVyTWF0aE1MU3ViU3VwLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkFDMTJDQzMxMTIwREE2OTAwREFDQzM2IC8qIFJl
bmRlck1hdGhNTFN1YlN1cC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSZW5k
ZXJNYXRoTUxTdWJTdXAuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJRkJDMjIwREUx
MjM3RkJFQjAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9
IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU0OUVGOTcwREM1MTQ2MjAwNDI2NkUxIC8q
IERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluICovID0ge2lzYSA9IFBCWEZpbGVS
ZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gdGV4dDsgcGF0
aCA9IERhc2hib2FyZFN1cHBvcnRDU1NQcm9wZXJ0eU5hbWVzLmluOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQlGRTZGRDQ4NTBGNjc2RTU3MDAwOTI4NzMgLyogQ29vcmRpbmF0ZXMuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQ29vcmRpbmF0ZXMuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRkU2RkQ0ODYwRjY3NkU1NzAwMDkyODczIC8qIENvb3JkaW5h
dGVzLmlkbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSBDb29yZGluYXRlcy5pZGw7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xNTg2MSw2ICsxNTg2Myw3IEBACiAJCQkJQjUzMjBENjgx
MjJBMjRFOTAwMkQxNDQwIC8qIGNvY29hICovLAogCQkJCUE3NUU4QjdGMEUxREUyQjAwMDdGMjQ4
MSAvKiBmaWx0ZXJzICovLAogCQkJCUIyNzUzNTQ5MEIwNTM4MTQwMDJDRTY0RiAvKiBtYWMgKi8s
CisJCQkJRkJDMjIwREQxMjM3RkJFQjAwQkNGNzg4IC8qIG9wZW5nbCAqLywKIAkJCQlGNEVBRjRB
QjEwQzc0MjY4MDA5MTAwRDMgLyogb3BlbnR5cGUgKi8sCiAJCQkJNDlFOTExQjIwRUY4NkQyNzAw
OUQwQ0FGIC8qIHRyYW5zZm9ybXMgKi8sCiAJCQkJNDkwNzA3RTQxMjE5QzA0MzAwRDkwRTUxIC8q
IEFOR0xFV2ViS2l0QnJpZGdlLmNwcCAqLywKQEAgLTE3Njg4LDYgKzE3NjkxLDE0IEBACiAJCQlw
YXRoID0gbWF0aG1sOwogCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKIAkJfTsKKwkJRkJDMjIw
REQxMjM3RkJFQjAwQkNGNzg4IC8qIG9wZW5nbCAqLyA9IHsKKwkJCWlzYSA9IFBCWEdyb3VwOwor
CQkJY2hpbGRyZW4gPSAoCisJCQkJRkJDMjIwREUxMjM3RkJFQjAwQkNGNzg4IC8qIEdyYXBoaWNz
Q29udGV4dDNET3BlbkdMLmNwcCAqLywKKwkJCSk7CisJCQlwYXRoID0gb3BlbmdsOworCQkJc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIC8qIEVuZCBQQlhHcm91cCBzZWN0aW9uICovCiAK
IC8qIEJlZ2luIFBCWEhlYWRlcnNCdWlsZFBoYXNlIHNlY3Rpb24gKi8KQEAgLTIyODk1LDYgKzIy
OTA2LDcgQEAKIAkJCQk4OTg3ODVCODEyMkNBMkE3MDAzQUFCREEgLyogSlNNZXRhZGF0YUNhbGxi
YWNrLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTg5ODc4NUYwMTIyRTFFODcwMDNBQUJEQSAvKiBK
U0ZpbGVFeGNlcHRpb24uY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJODk4Nzg1RjQxMjJFMUVBQzAw
M0FBQkRBIC8qIEpTRmlsZVJlYWRlclN5bmMuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJRkJDMjIw
REYxMjM3RkJFQjAwQkNGNzg4IC8qIEdyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAw
OwogCQl9OwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250
ZXh0M0RNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMv
R3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHJldmlzaW9uIDY2ODg3KQorKysgV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvR3JhcGhpY3NDb250ZXh0M0RNYWMubW0JKHdvcmtpbmcgY29weSkK
QEAgLTMxLDIxICszMSwyMiBAQAogCiAjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKIAorI2lu
Y2x1ZGUgIkFOR0xFL1NoYWRlckxhbmcuaCIKICNpbmNsdWRlICJBcnJheUJ1ZmZlci5oIgogI2lu
Y2x1ZGUgIkFycmF5QnVmZmVyVmlldy5oIgotI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCiAjaW5j
bHVkZSAiQ2FudmFzUmVuZGVyaW5nQ29udGV4dC5oIgorI2luY2x1ZGUgPENvcmVHcmFwaGljcy9D
R0JpdG1hcENvbnRleHQuaD4KICNpbmNsdWRlICJGbG9hdDMyQXJyYXkuaCIKICNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJIVE1MQ2FudmFzRWxlbWVudC5oIgogI2luY2x1
ZGUgIkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiSW50MzJBcnJheS5oIgogI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCi0jaW5jbHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1ZGUgIldlYkdM
TGF5ZXIuaCIKLSNpbmNsdWRlIDxDb3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+CiAjaW5j
bHVkZSA8T3BlbkdML0NHTFJlbmRlcmVycy5oPgogI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2lu
Y2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVyLmgiCisjaW5jbHVkZSAi
V2ViR0xPYmplY3QuaCIKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KICNpbmNsdWRlIDx3
dGYvdGV4dC9DU3RyaW5nLmg+CiAKQEAgLTIyOSw4MSArMjMwLDE0IEBAIEdyYXBoaWNzQ29udGV4
dDNEOjp+R3JhcGhpY3NDb250ZXh0M0QoKQogICAgIH0KIH0KIAotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6dmFsaWRhdGVBdHRyaWJ1dGVzKCkKLXsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb25z
ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhHTF9FWFRFTlNJ
T05TKSk7Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewotICAgICAgICBpZiAoc3RkOjpzdHJz
dHIoZXh0ZW5zaW9ucywgIkdMX0VYVF9wYWNrZWRfZGVwdGhfc3RlbmNpbCIpKSB7Ci0gICAgICAg
ICAgICBpZiAoIW1fYXR0cnMuZGVwdGgpCi0gICAgICAgICAgICAgICAgbV9hdHRycy5kZXB0aCA9
IHRydWU7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbV9hdHRycy5zdGVuY2lsID0gZmFs
c2U7Ci0gICAgfQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBib29sIGlz
VmFsaWRWZW5kb3IgPSB0cnVlOwotICAgICAgICAvLyBDdXJyZW50bHkgaW4gTWFjIHdlIG9ubHkg
dHVybiBvbiBhbnRpYWxpYXMgaWYgdmVuZG9yIGlzIE5WSURJQS4KLSAgICAgICAgY29uc3QgY2hh
ciogdmVuZG9yID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oOjpnbEdldFN0cmluZyhH
TF9WRU5ET1IpKTsKLSAgICAgICAgaWYgKCFzdGQ6OnN0cnN0cih2ZW5kb3IsICJOVklESUEiKSkK
LSAgICAgICAgICAgIGlzVmFsaWRWZW5kb3IgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFpc1ZhbGlk
VmVuZG9yIHx8ICFzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xfRVhUX2ZyYW1lYnVmZmVyX211
bHRpc2FtcGxlIikpCi0gICAgICAgICAgICBtX2F0dHJzLmFudGlhbGlhcyA9IGZhbHNlOwotICAg
IH0KLSAgICAvLyBGSVhNRTogaW5zdGVhZCBvZiBlbmZvcmNpbmcgcHJlbXVsdGlwbGllZEFscGhh
ID0gdHJ1ZSwgaW1wbGVtZW50IHRoZQotICAgIC8vIGNvcnJlY3QgYmVoYXZpb3Igd2hlbiBwcmVt
dWx0aXBsaWVkQWxwaGEgPSBmYWxzZSBpcyByZXF1ZXN0ZWQuCi0gICAgbV9hdHRycy5wcmVtdWx0
aXBsaWVkQWxwaGEgPSB0cnVlOwotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjptYWtlQ29u
dGV4dEN1cnJlbnQoKQogewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVyaW5nUmVzdWx0c1RvQ2Fu
dmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCi17Ci0gICAgSFRNTENhbnZhc0Vs
ZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwotICAgIEltYWdlQnVmZmVyKiBpbWFn
ZUJ1ZmZlciA9IGNhbnZhcy0+YnVmZmVyKCk7Ci0KLSAgICBpbnQgcm93Qnl0ZXMgPSBtX2N1cnJl
bnRXaWR0aCAqIDQ7Ci0gICAgaW50IHRvdGFsQnl0ZXMgPSByb3dCeXRlcyAqIG1fY3VycmVudEhl
aWdodDsKLQotICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IHBpeGVscyhuZXcgdW5zaWdu
ZWQgY2hhclt0b3RhbEJ5dGVzXSk7Ci0gICAgaWYgKCFwaXhlbHMpCisgICAgaWYgKCFtX2NvbnRl
eHRPYmopCiAgICAgICAgIHJldHVybjsKIAotICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0KLSAgICBib29sIG11c3RSZXN0b3JlRkJPID0gZmFsc2U7Ci0gICAgaWYgKG1f
YXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVB
RF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgICAgIDo6
Z2xCbGl0RnJhbWVidWZmZXJFWFQoMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdo
dCwgMCwgMCwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwgR0xfQ09MT1JfQlVGRkVS
X0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFN
RUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAg
IH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX2JvdW5kRkJPICE9IG1fZmJvKSB7Ci0gICAgICAgICAg
ICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAg
R0xpbnQgcGFja0FsaWdubWVudCA9IDQ7Ci0gICAgYm9vbCBtdXN0UmVzdG9yZVBhY2tBbGlnbm1l
bnQgPSBmYWxzZTsKLSAgICA6OmdsR2V0SW50ZWdlcnYoR0xfUEFDS19BTElHTk1FTlQsICZwYWNr
QWxpZ25tZW50KTsKLSAgICBpZiAocGFja0FsaWdubWVudCA+IDQpIHsKLSAgICAgICAgOjpnbFBp
eGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCA0KTsKLSAgICAgICAgbXVzdFJlc3RvcmVQYWNr
QWxpZ25tZW50ID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICA6OmdsUmVhZFBpeGVscygwLCAwLCBtX2N1
cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84
XzhfOF9SRVYsIHBpeGVscy5nZXQoKSk7Ci0KLSAgICBpZiAobXVzdFJlc3RvcmVQYWNrQWxpZ25t
ZW50KQotICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xfUEFDS19BTElHTk1FTlQsIHBhY2tBbGln
bm1lbnQpOwotCi0gICAgaWYgKG11c3RSZXN0b3JlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7Ci0KLSAgICBwYWludFRv
Q2FudmFzKHBpeGVscy5nZXQoKSwgbV9jdXJyZW50V2lkdGgsIG1fY3VycmVudEhlaWdodCwKLSAg
ICAgICAgICAgICAgICAgIGNhbnZhcy0+d2lkdGgoKSwgY2FudmFzLT5oZWlnaHQoKSwgaW1hZ2VC
dWZmZXItPmNvbnRleHQoKS0+cGxhdGZvcm1Db250ZXh0KCkpOworICAgIENHTENvbnRleHRPYmog
Y3VycmVudENvbnRleHQgPSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50
Q29udGV4dCAhPSBtX2NvbnRleHRPYmopCisgICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1f
Y29udGV4dE9iaik7CiB9CiAKIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzR0xFUzJDb21wbGlh
bnQoKSBjb25zdApAQCAtMzIwLDEzNDMgKzI1NCw3IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmlzRXJyb3JHZW5lcmF0ZWQKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9Ci0KLXZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotewotICAgIGlmICh3
aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFt
X2NvbnRleHRPYmopCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX2N1cnJlbnRXaWR0aCA9
IHdpZHRoOwotICAgIG1fY3VycmVudEhlaWdodCA9IGhlaWdodDsKLSAgICAKLSAgICBDR0xTZXRD
dXJyZW50Q29udGV4dChtX2NvbnRleHRPYmopOwotICAgIAotICAgIEdMdWludCBpbnRlcm5hbENv
bG9yRm9ybWF0LCBjb2xvckZvcm1hdCwgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSAwOwot
ICAgIGlmIChtX2F0dHJzLmFscGhhKSB7Ci0gICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBH
TF9SR0JBODsKLSAgICAgICAgY29sb3JGb3JtYXQgPSBHTF9SR0JBOwotICAgIH0gZWxzZSB7Ci0g
ICAgICAgIGludGVybmFsQ29sb3JGb3JtYXQgPSBHTF9SR0I4OwotICAgICAgICBjb2xvckZvcm1h
dCA9IEdMX1JHQjsKLSAgICB9Ci0gICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRl
cHRoKSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGFsbG93IHRoZSBsb2dpYyB3aGVyZSBzdGVuY2ls
IGlzIHJlcXVpcmVkIGFuZCBkZXB0aCBpcyBub3QuCi0gICAgICAgIC8vIFNlZSBHcmFwaGljc0Nv
bnRleHQzRCBjb25zdHJ1Y3Rvci4KLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCAmJiBtX2F0
dHJzLmRlcHRoKQotICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9E
RVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaW50ZXJuYWxE
ZXB0aFN0ZW5jaWxGb3JtYXQgPSBHTF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgfQotCi0gICAgYm9v
bCBtdXN0UmVzdG9yZUZCTyA9IGZhbHNlOwotCi0gICAgLy8gcmVzaXplIG11bHRpc2FtcGxlIEZC
TwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICBHTGludCBtYXhTYW1wbGVD
b3VudDsKLSAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9TQU1QTEVTX0VYVCwgJm1heFNh
bXBsZUNvdW50KTsKLSAgICAgICAgR0xpbnQgc2FtcGxlQ291bnQgPSBzdGQ6Om1pbig4LCBtYXhT
YW1wbGVDb3VudCk7Ci0gICAgICAgIGlmIChzYW1wbGVDb3VudCA+IG1heFNhbXBsZUNvdW50KQot
ICAgICAgICAgICAgc2FtcGxlQ291bnQgPSBtYXhTYW1wbGVDb3VudDsKLSAgICAgICAgaWYgKG1f
Ym91bmRGQk8gIT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAgICAgICAgOjpnbEJpbmRGcmFt
ZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwotICAgICAg
ICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIDo6Z2xCaW5k
UmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1
ZmZlcik7Ci0gICAgICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGVFWFQoR0xf
UkVOREVSQlVGRkVSX0VYVCwgc2FtcGxlQ291bnQsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRo
LCBoZWlnaHQpOwotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcik7Ci0gICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgfHwgbV9hdHRycy5kZXB0aCkgewotICAgICAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJF
WFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7
Ci0gICAgICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlRVhUKEdMX1JF
TkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCwg
d2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsKQotICAgICAg
ICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9F
WFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVs
dGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICAgICAgaWYgKG1fYXR0cnMuZGVw
dGgpCi0gICAgICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9F
WFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAg
IDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIDApOwotICAgICAg
ICBpZiAoZ2xDaGVja0ZyYW1lYnVmZmVyU3RhdHVzRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCkgIT0g
R0xfRlJBTUVCVUZGRVJfQ09NUExFVEVfRVhUKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogY2xl
YW51cC4KLSAgICAgICAgICAgIG5vdEltcGxlbWVudGVkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICAvLyByZXNpemUgcmVndWxhciBGQk8KLSAgICBpZiAobV9ib3VuZEZCTyAhPSBtX2Zibykg
ewotICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7Ci0gICAgfQotICAgIDo6Z2xCaW5k
VGV4dHVyZShHTF9URVhUVVJFXzJELCBtX3RleHR1cmUpOwotICAgIDo6Z2xUZXhJbWFnZTJEKEdM
X1RFWFRVUkVfMkQsIDAsIGludGVybmFsQ29sb3JGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIGNv
bG9yRm9ybWF0LCBHTF9VTlNJR05FRF9CWVRFLCAwKTsKLSAgICA6OmdsRnJhbWVidWZmZXJUZXh0
dXJlMkRFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBHTF9DT0xPUl9BVFRBQ0hNRU5UMF9FWFQsIEdM
X1RFWFRVUkVfMkQsIG1fdGV4dHVyZSwgMCk7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKEdMX1RFWFRV
UkVfMkQsIDApOwotICAgIGlmICghbV9hdHRycy5hbnRpYWxpYXMgJiYgKG1fYXR0cnMuc3RlbmNp
bCB8fCBtX2F0dHJzLmRlcHRoKSkgewotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChH
TF9SRU5ERVJCVUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xS
ZW5kZXJidWZmZXJTdG9yYWdlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIGludGVybmFsRGVwdGhT
dGVuY2lsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKLSAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVChHTF9GUkFNRUJV
RkZFUl9FWFQsIEdMX1NURU5DSUxfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuZGVwdGgpCi0gICAg
ICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhU
LCBHTF9ERVBUSF9BVFRBQ0hNRU5UX0VYVCwgR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0
ZW5jaWxCdWZmZXIpOwotICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJC
VUZGRVJfRVhULCAwKTsKLSAgICB9Ci0gICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VY
VChHTF9GUkFNRUJVRkZFUl9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgewot
ICAgICAgICAvLyBGSVhNRTogY2xlYW51cAotICAgICAgICBub3RJbXBsZW1lbnRlZCgpOwotICAg
IH0KLQotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1l
YnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAg
IGlmIChtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgICAgICBtdXN0UmVz
dG9yZUZCTyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgcmVuZGVyYnVmZmVy
cyB0byAwLgotICAgIEdMYm9vbGVhbiBjb2xvck1hc2tbXSA9IHtHTF9UUlVFLCBHTF9UUlVFLCBH
TF9UUlVFLCBHTF9UUlVFfSwgZGVwdGhNYXNrID0gR0xfVFJVRSwgc3RlbmNpbE1hc2sgPSBHTF9U
UlVFOwotICAgIEdMYm9vbGVhbiBpc1NjaXNzb3JFbmFibGVkID0gR0xfRkFMU0U7Ci0gICAgR0xi
b29sZWFuIGlzRGl0aGVyRW5hYmxlZCA9IEdMX0ZBTFNFOwotICAgIEdMYml0ZmllbGQgY2xlYXJN
YXNrID0gR0xfQ09MT1JfQlVGRkVSX0JJVDsKLSAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfQ09MT1Jf
V1JJVEVNQVNLLCBjb2xvck1hc2spOwotICAgIDo6Z2xDb2xvck1hc2soR0xfVFJVRSwgR0xfVFJV
RSwgR0xfVFJVRSwgR0xfVFJVRSk7Ci0gICAgaWYgKG1fYXR0cnMuZGVwdGgpIHsKLSAgICAgICAg
OjpnbEdldEJvb2xlYW52KEdMX0RFUFRIX1dSSVRFTUFTSywgJmRlcHRoTWFzayk7Ci0gICAgICAg
IDo6Z2xEZXB0aE1hc2soR0xfVFJVRSk7Ci0gICAgICAgIGNsZWFyTWFzayB8PSBHTF9ERVBUSF9C
VUZGRVJfQklUOwotICAgIH0KLSAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7Ci0gICAgICAgIDo6
Z2xHZXRCb29sZWFudihHTF9TVEVOQ0lMX1dSSVRFTUFTSywgJnN0ZW5jaWxNYXNrKTsKLSAgICAg
ICAgOjpnbFN0ZW5jaWxNYXNrKEdMX1RSVUUpOwotICAgICAgICBjbGVhck1hc2sgfD0gR0xfU1RF
TkNJTF9CVUZGRVJfQklUOwotICAgIH0KLSAgICBpc1NjaXNzb3JFbmFibGVkID0gOjpnbElzRW5h
YmxlZChHTF9TQ0lTU09SX1RFU1QpOwotICAgIDo6Z2xEaXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7
Ci0gICAgaXNEaXRoZXJFbmFibGVkID0gOjpnbElzRW5hYmxlZChHTF9ESVRIRVIpOwotICAgIDo6
Z2xEaXNhYmxlKEdMX0RJVEhFUik7Ci0KLSAgICA6OmdsQ2xlYXIoY2xlYXJNYXNrKTsKLQotICAg
IDo6Z2xDb2xvck1hc2soY29sb3JNYXNrWzBdLCBjb2xvck1hc2tbMV0sIGNvbG9yTWFza1syXSwg
Y29sb3JNYXNrWzNdKTsKLSAgICBpZiAobV9hdHRycy5kZXB0aCkKLSAgICAgICAgOjpnbERlcHRo
TWFzayhkZXB0aE1hc2spOwotICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwpCi0gICAgICAgIDo6Z2xT
dGVuY2lsTWFzayhzdGVuY2lsTWFzayk7Ci0gICAgaWYgKGlzU2Npc3NvckVuYWJsZWQpCi0gICAg
ICAgIDo6Z2xFbmFibGUoR0xfU0NJU1NPUl9URVNUKTsKLSAgICBlbHNlCi0gICAgICAgIDo6Z2xE
aXNhYmxlKEdMX1NDSVNTT1JfVEVTVCk7Ci0gICAgaWYgKGlzRGl0aGVyRW5hYmxlZCkKLSAgICAg
ICAgOjpnbEVuYWJsZShHTF9ESVRIRVIpOwotICAgIGVsc2UKLSAgICAgICAgOjpnbERpc2FibGUo
R0xfRElUSEVSKTsKLQotICAgIGlmIChtdXN0UmVzdG9yZUZCTykKLSAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fYm91bmRGQk8pOwotCi0gICAgOjpn
bEZsdXNoKCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbnN1cmVDb250ZXh0KENHTENvbnRl
eHRPYmogY29udGV4dCkKLXsKLSAgICBpZiAoIWNvbnRleHQpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgQ0dMQ29udGV4dE9iaiBjdXJyZW50Q29udGV4dCA9IENHTEdldEN1cnJlbnRD
b250ZXh0KCk7Ci0gICAgaWYgKGN1cnJlbnRDb250ZXh0ICE9IGNvbnRleHQpCi0gICAgICAgIENH
TFNldEN1cnJlbnRDb250ZXh0KGNvbnRleHQpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpwcmVwYXJlVGV4dHVyZSgpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwot
ICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1
cnJlbnRIZWlnaHQsIDAsIDAsIG1fY3VycmVudFdpZHRoLCBtX2N1cnJlbnRIZWlnaHQsIEdMX0NP
TE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKLSAgICB9Ci0gICAgOjpnbEZpbmlz
aCgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjphY3RpdmVUZXh0dXJlKHVuc2lnbmVk
IGxvbmcgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
OjpnbEFjdGl2ZVRleHR1cmUodGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmF0dGFjaFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIFBsYXRmb3JtM0RPYmplY3Qg
c2hhZGVyKQotewotICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICBBU1NFUlQoc2hhZGVyKTsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEF0dGFjaFNoYWRlcigoR0x1
aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCB1bnNpZ25l
ZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dyYW0p
OwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmluZEF0dHJpYkxv
Y2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0
LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7Ci0gICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZmZXIpOwotfQot
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNpZ25lZCBsb25n
IHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIEdMdWludCBmYm87Ci0gICAgaWYgKGJ1ZmZlcikKLSAgICAgICAg
ZmJvID0gKEdMdWludClidWZmZXI7Ci0gICAgZWxzZQotICAgICAgICBmYm8gPSAobV9hdHRycy5h
bnRpYWxpYXMgPyBtX211bHRpc2FtcGxlRkJPIDogbV9mYm8pOwotICAgIGlmIChmYm8gIT0gbV9i
b3VuZEZCTykgewotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKHRhcmdldCwgZmJvKTsK
LSAgICAgICAgbV9ib3VuZEZCTyA9IGZibzsKLSAgICB9Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmJpbmRSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RP
YmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVCh0YXJnZXQsIChHTHVpbnQpIHJlbmRlcmJ1ZmZl
cik7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFRleHR1cmUodW5zaWduZWQg
bG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJpbmRUZXh0dXJlKHRhcmdldCwgKEdMdWludCkg
dGV4dHVyZSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kQ29sb3IoZG91Ymxl
IHJlZCwgZG91YmxlIGdyZWVuLCBkb3VibGUgYmx1ZSwgZG91YmxlIGFscGhhKQotewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRDb2xvcihzdGF0aWNfY2Fz
dDxmbG9hdD4ocmVkKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdyZWVuKSwgc3RhdGljX2Nhc3Q8Zmxv
YXQ+KGJsdWUpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYWxwaGEpKTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6YmxlbmRFcXVhdGlvbiggdW5zaWduZWQgbG9uZyBtb2RlICkKLXsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEJsZW5kRXF1YXRpb24obW9kZSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb25TZXBhcmF0ZSh1bnNp
Z25lZCBsb25nIG1vZGVSR0IsIHVuc2lnbmVkIGxvbmcgbW9kZUFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRFcXVhdGlvblNlcGFyYXRlKG1v
ZGVSR0IsIG1vZGVBbHBoYSk7Ci19Ci0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRG
dW5jKHVuc2lnbmVkIGxvbmcgc2ZhY3RvciwgdW5zaWduZWQgbG9uZyBkZmFjdG9yKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jKHNmYWN0b3Is
IGRmYWN0b3IpOwotfSAgICAgICAKLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRGdW5j
U2VwYXJhdGUodW5zaWduZWQgbG9uZyBzcmNSR0IsIHVuc2lnbmVkIGxvbmcgZHN0UkdCLCB1bnNp
Z25lZCBsb25nIHNyY0FscGhhLCB1bnNpZ25lZCBsb25nIGRzdEFscGhhKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQmxlbmRGdW5jU2VwYXJhdGUoc3JjUkdC
LCBkc3RSR0IsIHNyY0FscGhhLCBkc3RBbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBzaXplLCB1bnNpZ25lZCBs
b25nIHVzYWdlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6Omds
QnVmZmVyRGF0YSh0YXJnZXQsIHNpemUsIDAsIHVzYWdlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6YnVmZmVyRGF0YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIGNvbnN0
IHZvaWQqIGRhdGEsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCi17Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgZGF0YSwgdXNh
Z2UpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJTdWJEYXRhKHVuc2lnbmVk
IGxvbmcgdGFyZ2V0LCBsb25nIG9mZnNldCwgaW50IHNpemUsIGNvbnN0IHZvaWQqIGRhdGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xCdWZmZXJTdWJEYXRh
KHRhcmdldCwgb2Zmc2V0LCBzaXplLCBkYXRhKTsKLX0KLQotdW5zaWduZWQgbG9uZyBHcmFwaGlj
c0NvbnRleHQzRDo6Y2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyh1bnNpZ25lZCBsb25nIHRhcmdldCkK
LXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xDaGVj
a0ZyYW1lYnVmZmVyU3RhdHVzRVhUKHRhcmdldCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmNsZWFyQ29sb3IoZG91YmxlIHIsIGRvdWJsZSBnLCBkb3VibGUgYiwgZG91YmxlIGEpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xDbGVhckNvbG9yKHN0
YXRpY19jYXN0PGZsb2F0PihyKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGcpLCBzdGF0aWNfY2FzdDxm
bG9hdD4oYiksIHN0YXRpY19jYXN0PGZsb2F0PihhKSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNsZWFyKHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyKG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpjbGVhckRlcHRoKGRvdWJsZSBkZXB0aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbENsZWFyRGVwdGgoZGVwdGgpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhclN0ZW5jaWwobG9uZyBzKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ2xlYXJTdGVuY2lsKHMpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjb2xvck1hc2soYm9vbCByZWQsIGJvb2wgZ3JlZW4sIGJvb2wgYmx1ZSwg
Ym9vbCBhbHBoYSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bENvbG9yTWFzayhyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAg
QVNTRVJUKHNoYWRlcik7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotCi0gICAg
aW50IEdMc2hhZGVyVHlwZTsKLSAgICBBTkdMRVNoYWRlclR5cGUgc2hhZGVyVHlwZTsKLQotICAg
IGdsR2V0U2hhZGVyaXYoc2hhZGVyLCBTSEFERVJfVFlQRSwgJkdMc2hhZGVyVHlwZSk7Ci0gICAg
Ci0gICAgaWYgKEdMc2hhZGVyVHlwZSA9PSBWRVJURVhfU0hBREVSKQotICAgICAgICBzaGFkZXJU
eXBlID0gU0hBREVSX1RZUEVfVkVSVEVYOwotICAgIGVsc2UgaWYgKEdMc2hhZGVyVHlwZSA9PSBG
UkFHTUVOVF9TSEFERVIpCi0gICAgICAgIHNoYWRlclR5cGUgPSBTSEFERVJfVFlQRV9GUkFHTUVO
VDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybjsgLy8gSW52YWxpZCBzaGFkZXIgdHlwZS4KLQot
ICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRv
ciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVz
dWx0ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBT
aGFkZXJTb3VyY2VFbnRyeSYgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKLQotICAgIFN0cmluZyB0
cmFuc2xhdGVkU2hhZGVyU291cmNlOwotICAgIFN0cmluZyBzaGFkZXJJbmZvTG9nOwotCi0gICAg
Ym9vbCBpc1ZhbGlkID0gbV9jb21waWxlci52YWxpZGF0ZVNoYWRlclNvdXJjZShlbnRyeS5zb3Vy
Y2UudXRmOCgpLmRhdGEoKSwgc2hhZGVyVHlwZSwgdHJhbnNsYXRlZFNoYWRlclNvdXJjZSwgc2hh
ZGVySW5mb0xvZyk7Ci0KLSAgICBlbnRyeS5sb2cgPSBzaGFkZXJJbmZvTG9nOwotICAgIGVudHJ5
LmlzVmFsaWQgPSBpc1ZhbGlkOwotCi0gICAgaWYgKCFpc1ZhbGlkKQotICAgICAgICByZXR1cm47
IC8vIFNoYWRlciBkaWRuJ3QgdmFsaWRhdGUsIGRvbid0IG1vdmUgZm9yd2FyZCB3aXRoIGNvbXBp
bGluZyB0cmFuc2xhdGVkIHNvdXJjZSAgICAKLQotICAgIGludCB0cmFuc2xhdGVkU2hhZGVyTGVu
Z3RoID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS5sZW5ndGgoKTsKLQotICAgIGNvbnN0IENTdHJp
bmcmIHRyYW5zbGF0ZWRTaGFkZXJDU3RyaW5nID0gdHJhbnNsYXRlZFNoYWRlclNvdXJjZS51dGY4
KCk7Ci0gICAgY29uc3QgY2hhciogdHJhbnNsYXRlZFNoYWRlclB0ciA9IHRyYW5zbGF0ZWRTaGFk
ZXJDU3RyaW5nLmRhdGEoKTsKLSAgICAKLSAgICA6OmdsU2hhZGVyU291cmNlKChHTHVpbnQpIHNo
YWRlciwgMSwgJnRyYW5zbGF0ZWRTaGFkZXJQdHIsICZ0cmFuc2xhdGVkU2hhZGVyTGVuZ3RoKTsK
LSAgICAKLSAgICA6OmdsQ29tcGlsZVNoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotICAgIAotICAg
IGludCBHTENvbXBpbGVTdWNjZXNzOwotICAgIAotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIENPTVBJTEVfU1RBVFVTLCAmR0xDb21waWxlU3VjY2Vzcyk7Ci0gICAgCi0gICAg
Ly8gQVNTRVJUIHRoYXQgQU5HTEUgZ2VuZXJhdGVkIEdMU0wgd2lsbCBiZSBhY2NlcHRlZCBieSBP
cGVuR0wKLSAgICBBU1NFUlQoR0xDb21waWxlU3VjY2VzcyA9PSBHTF9UUlVFKTsKLX0KLQotdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y29weVRleEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQs
IGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5
LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGlmIChtX2F0dHJzLmFu
dGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBs
ZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZF
Ul9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCh4LCB5LCB4ICsg
d2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhlaWdodCwgR0xfQ09MT1Jf
QlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0gICAgOjpnbENvcHlUZXhJbWFnZTJE
KHRhcmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBib3Jk
ZXIpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlz
YW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29w
eVRleFN1YkltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIGxvbmcgeG9m
ZnNldCwgbG9uZyB5b2Zmc2V0LCBsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1w
bGVGQk8pIHsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICAgICAgOjpnbEJsaXRGcmFt
ZWJ1ZmZlckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwg
eSArIGhlaWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKLSAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKLSAgICB9Ci0g
ICAgOjpnbENvcHlUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmZzZXQsIHlvZmZzZXQs
IHgsIHksIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2Jv
dW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pCi0gICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJF
WFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJPKTsKLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3VsbEZhY2UodW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsQ3VsbEZhY2UobW9kZSk7Ci19Ci0KLXZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoRnVuYyh1bnNpZ25lZCBsb25nIGZ1bmMpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aEZ1bmMoZnVuYyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoTWFzayhib29sIGZsYWcpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXB0aE1hc2soZmxhZyk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlcHRoUmFuZ2UoZG91YmxlIHpOZWFyLCBk
b3VibGUgekZhcikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERlcHRoUmFuZ2Uoek5lYXIsIHpGYXIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpk
ZXRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9ybTNET2JqZWN0IHNo
YWRlcikKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEZXRhY2hTaGFkZXIoKEdMdWlu
dCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6ZGlzYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbERpc2FibGUoY2FwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xEaXNhYmxlVmVydGV4QXR0
cmliQXJyYXkoaW5kZXgpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3QXJyYXlz
KHVuc2lnbmVkIGxvbmcgbW9kZSwgbG9uZyBmaXJzdCwgbG9uZyBjb3VudCkKLXsKLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbERyYXdBcnJheXMobW9kZSwgZmlyc3Qs
IGNvdW50KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZHJhd0VsZW1lbnRzKHVuc2ln
bmVkIGxvbmcgbW9kZSwgdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyB0eXBlLCBs
b25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bERyYXdFbGVtZW50cyhtb2RlLCBjb3VudCwgdHlwZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4o
c3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZW5hYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICA6OmdsRW5hYmxlKGNhcCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHVuc2lnbmVkIGxvbmcgaW5kZXgpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xFbmFibGVWZXJ0ZXhBdHRy
aWJBcnJheShpbmRleCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZpbmlzaCgpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGaW5pc2goKTsKLX0K
LQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Zmx1c2goKQotewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKLSAgICA6OmdsRmx1c2goKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6ZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2ln
bmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9uZyByZW5kZXJidWZmZXJ0YXJnZXQsIFBs
YXRmb3JtM0RPYmplY3QgYnVmZmVyKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICBHTHVpbnQgcmVuZGVyYnVmZmVyID0gKEdMdWludCkgYnVmZmVyOwotICAgIGlmIChh
dHRhY2htZW50ID09IERFUFRIX1NURU5DSUxfQVRUQUNITUVOVCkgewotICAgICAgICA6OmdsRnJh
bWVidWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBERVBUSF9BVFRBQ0hNRU5ULCByZW5kZXJi
dWZmZXJ0YXJnZXQsIHJlbmRlcmJ1ZmZlcik7Ci0gICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRl
cmJ1ZmZlckVYVCh0YXJnZXQsIFNURU5DSUxfQVRUQUNITUVOVCwgcmVuZGVyYnVmZmVydGFyZ2V0
LCByZW5kZXJidWZmZXIpOwotICAgIH0gZWxzZQotICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5k
ZXJidWZmZXJFWFQodGFyZ2V0LCBhdHRhY2htZW50LCByZW5kZXJidWZmZXJ0YXJnZXQsIHJlbmRl
cmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyVGV4dHVy
ZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2ln
bmVkIGxvbmcgdGV4dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUsIGxvbmcgbGV2ZWwp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xGcmFtZWJ1ZmZl
clRleHR1cmUyREVYVCh0YXJnZXQsIGF0dGFjaG1lbnQsIHRleHRhcmdldCwgKEdMdWludCkgdGV4
dHVyZSwgbGV2ZWwpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcm9udEZhY2UodW5z
aWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsRnJvbnRGYWNlKG1vZGUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZW5l
cmF0ZU1pcG1hcCh1bnNpZ25lZCBsb25nIHRhcmdldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbEdlbmVyYXRlTWlwbWFwRVhUKHRhcmdldCk7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEFjdGl2ZUF0dHJpYihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgsIEFjdGl2ZUluZm8mIGluZm8pCi17Ci0gICAgaWYg
KCFwcm9ncmFtKSB7Ci0gICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOwot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICBHTGludCBtYXhBdHRyaWJ1dGVTaXplID0gMDsKLSAgICA6OmdsR2V0UHJvZ3Jh
bWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FDVElWRV9BVFRSSUJVVEVfTUFY
X0xFTkdUSCwgJm1heEF0dHJpYnV0ZVNpemUpOwotICAgIEdMY2hhciBuYW1lW21heEF0dHJpYnV0
ZVNpemVdOyAvLyBHTF9BQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0
ZXJtaW5hdGlvbgotICAgIEdMc2l6ZWkgbmFtZUxlbmd0aCA9IDA7Ci0gICAgR0xpbnQgc2l6ZSA9
IDA7Ci0gICAgR0xlbnVtIHR5cGUgPSAwOwotICAgIDo6Z2xHZXRBY3RpdmVBdHRyaWIoc3RhdGlj
X2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heEF0dHJpYnV0ZVNpemUsICZuYW1lTGVu
Z3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1lTGVuZ3RoKTsK
LSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJu
IHRydWU7Ci19Ci0gICAgCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVVbmlmb3Jt
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQgbG9uZyBpbmRleCwgQWN0aXZlSW5m
byYgaW5mbykKLXsKLSAgICBpZiAoIXByb2dyYW0pIHsKLSAgICAgICAgc3ludGhlc2l6ZUdMRXJy
b3IoSU5WQUxJRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IG1heFVuaWZvcm1TaXplID0gMDsK
LSAgICA6OmdsR2V0UHJvZ3JhbWl2KHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIEdMX0FD
VElWRV9VTklGT1JNX01BWF9MRU5HVEgsICZtYXhVbmlmb3JtU2l6ZSk7Ci0gICAgR0xjaGFyIG5h
bWVbbWF4VW5pZm9ybVNpemVdOyAvLyBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RIIGluY2x1
ZGVzIG51bGwgdGVybWluYXRpb24KLSAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOwotICAgIEdM
aW50IHNpemUgPSAwOwotICAgIEdMZW51bSB0eXBlID0gMDsKLSAgICA6OmdsR2V0QWN0aXZlVW5p
Zm9ybShzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBpbmRleCwgbWF4VW5pZm9ybVNpemUs
ICZuYW1lTGVuZ3RoLCAmc2l6ZSwgJnR5cGUsIG5hbWUpOwotICAgIGlmICghbmFtZUxlbmd0aCkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGluZm8ubmFtZSA9IFN0cmluZyhuYW1lLCBuYW1l
TGVuZ3RoKTsKLSAgICBpbmZvLnR5cGUgPSB0eXBlOwotICAgIGluZm8uc2l6ZSA9IHNpemU7Ci0g
ICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFjaGVk
U2hhZGVycyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGludCBtYXhDb3VudCwgaW50KiBjb3Vu
dCwgdW5zaWduZWQgaW50KiBzaGFkZXJzKQotewotICAgIGlmICghcHJvZ3JhbSkgewotICAgICAg
ICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEdldEF0dGFjaGVk
U2hhZGVycyhzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBtYXhDb3VudCwgY291bnQsIHNo
YWRlcnMpOwotfQotCi1pbnQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dHJpYkxvY2F0aW9uKFBs
YXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQotewotICAgIGlmICgh
cHJvZ3JhbSkKLSAgICAgICAgcmV0dXJuIC0xOwogICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHBy
b2dyYW0sIG5hbWUudXRmOCgpLmRhdGEoKSk7Ci19Ci0KLUdyYXBoaWNzQ29udGV4dDNEOjpBdHRy
aWJ1dGVzIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRDb250ZXh0QXR0cmlidXRlcygpCi17Ci0gICAg
cmV0dXJuIG1fYXR0cnM7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6Omdl
dEVycm9yKCkKLXsKLSAgICBpZiAobV9zeW50aGV0aWNFcnJvcnMuc2l6ZSgpID4gMCkgewotICAg
ICAgICBMaXN0SGFzaFNldDx1bnNpZ25lZCBsb25nPjo6aXRlcmF0b3IgaXRlciA9IG1fc3ludGhl
dGljRXJyb3JzLmJlZ2luKCk7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgZXJyID0gKml0ZXI7Ci0g
ICAgICAgIG1fc3ludGhldGljRXJyb3JzLnJlbW92ZShpdGVyKTsKLSAgICAgICAgcmV0dXJuIGVy
cjsKLSAgICB9Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJu
IDo6Z2xHZXRFcnJvcigpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFN0cmlu
Zyh1bnNpZ25lZCBsb25nIG5hbWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIHJldHVybiBTdHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5nKG5hbWUpKTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25nIHRhcmdldCwg
dW5zaWduZWQgbG9uZyBtb2RlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNE
Ojppc0J1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKLXsKLSAgICBpZiAoIWJ1ZmZlcikK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICByZXR1cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7Ci19Ci0KLWJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25nIGNhcCkKLXsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc0VuYWJsZWQo
Y2FwKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNGcmFtZWJ1ZmZlcihQbGF0Zm9y
bTNET2JqZWN0IGZyYW1lYnVmZmVyKQotewotICAgIGlmICghZnJhbWVidWZmZXIpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgcmV0dXJuIDo6Z2xJc0ZyYW1lYnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKLX0K
LQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJv
Z3JhbSkKLXsKLSAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgcmV0dXJuIDo6Z2xJc1Byb2dy
YW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19Ci0KLWJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVu
ZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3QgcmVuZGVyYnVmZmVyKQotewotICAgIGlmICghcmVu
ZGVyYnVmZmVyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIHJldHVybiA6OmdsSXNSZW5kZXJidWZmZXJFWFQoKEdMdWlu
dCkgcmVuZGVyYnVmZmVyKTsKLX0KLQotYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNTaGFkZXIo
UGxhdGZvcm0zRE9iamVjdCBzaGFkZXIpCi17Ci0gICAgaWYgKCFzaGFkZXIpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
cmV0dXJuIDo6Z2xJc1NoYWRlcigoR0x1aW50KSBzaGFkZXIpOwotfQotCi1ib29sIEdyYXBoaWNz
Q29udGV4dDNEOjppc1RleHR1cmUoUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQotewotICAgIGlm
ICghdGV4dHVyZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4gOjpnbElzVGV4dHVyZSgoR0x1aW50KSB0ZXh0
dXJlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6bGluZVdpZHRoKGRvdWJsZSB3aWR0
aCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmVXaWR0
aChzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6bGlua1Byb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQotewotICAgIEFTU0VSVChw
cm9ncmFtKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbExpbmtQ
cm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpw
aXhlbFN0b3JlaSh1bnNpZ25lZCBsb25nIHBuYW1lLCBsb25nIHBhcmFtKQotewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsUGl4ZWxTdG9yZWkocG5hbWUsIHBhcmFt
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cG9seWdvbk9mZnNldChkb3VibGUgZmFj
dG9yLCBkb3VibGUgdW5pdHMpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xQb2x5Z29uT2Zmc2V0KHN0YXRpY19jYXN0PGZsb2F0PihmYWN0b3IpLCBzdGF0aWNf
Y2FzdDxmbG9hdD4odW5pdHMpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBp
eGVscyhsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBo
ZWlnaHQsIHVuc2lnbmVkIGxvbmcgZm9ybWF0LCB1bnNpZ25lZCBsb25nIHR5cGUsIHZvaWQqIGRh
dGEpCi17Ci0gICAgLy8gRklYTUU6IHJlbW92ZSB0aGUgdHdvIGdsRmx1c2ggY2FsbHMgd2hlbiB0
aGUgZHJpdmVyIGJ1ZyBpcyBmaXhlZCwgaS5lLiwKLSAgICAvLyBhbGwgcHJldmlvdXMgcmVuZGVy
aW5nIGNhbGxzIHNob3VsZCBiZSBkb25lIGJlZm9yZSByZWFkaW5nIHBpeGVscy4KLSAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbEZsdXNoKCk7Ci0gICAgaWYgKG1fYXR0
cnMuYW50aWFsaWFzICYmIG1fYm91bmRGQk8gPT0gbV9tdWx0aXNhbXBsZUZCTykgewotICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX1JFQURfRlJBTUVCVUZGRVJfRVhULCBtX211bHRp
c2FtcGxlRkJPKTsKLSAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9EUkFXX0ZSQU1F
QlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsQmxpdEZyYW1lYnVmZmVyRVhUKHgsIHks
IHggKyB3aWR0aCwgeSArIGhlaWdodCwgeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCBHTF9D
T0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOwotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOwotICAgICAgICA6OmdsRmx1c2goKTsKLSAg
ICB9Ci0gICAgOjpnbFJlYWRQaXhlbHMoeCwgeSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBkYXRhKTsKLSAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211
bHRpc2FtcGxlRkJPKQotICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVG
RkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OnJlbGVhc2VTaGFkZXJDb21waWxlcigpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMgaXMgbm90IGlt
cGxlbWVudGVkIG9uIGRlc2t0b3AgT3BlbkdMLiBXZSBuZWVkIHRvIGhhdmUgaWZkZWZzIGZvciB0
aGUgZGlmZmVyZW50IEdMIHZhcmlhbnRzCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIC8vOjpnbFJlbGVhc2VTaGFkZXJDb21waWxlcigpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZW5kZXJidWZmZXJTdG9yYWdlKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNp
Z25lZCBsb25nIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1bnNpZ25lZCBs
b25nIGhlaWdodCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgc3dp
dGNoIChpbnRlcm5hbGZvcm1hdCkgewotICAgIGNhc2UgREVQVEhfU1RFTkNJTDoKLSAgICAgICAg
aW50ZXJuYWxmb3JtYXQgPSBHTF9ERVBUSDI0X1NURU5DSUw4X0VYVDsKLSAgICAgICAgYnJlYWs7
Ci0gICAgY2FzZSBERVBUSF9DT01QT05FTlQxNjoKLSAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBH
TF9ERVBUSF9DT01QT05FTlQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUkdCQTQ6Ci0gICAg
Y2FzZSBSR0I1X0ExOgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JHQkE7Ci0gICAgICAg
IGJyZWFrOwotICAgIGNhc2UgUkdCNTY1OgotICAgICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX1JH
QjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIDo6Z2xSZW5kZXJidWZmZXJTdG9yYWdlRVhU
KHRhcmdldCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzYW1wbGVDb3ZlcmFnZShkb3VibGUgdmFsdWUsIGJvb2wgaW52ZXJ0KQot
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsU2FtcGxlQ292ZXJh
Z2Uoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSwgaW52ZXJ0KTsKLX0KLQotdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6c2Npc3Nvcihsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xTY2lzc29yKHgsIHksIHdpZHRoLCBoZWlnaHQpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIGNvbnN0
IFN0cmluZyYgc3RyaW5nKQotewotICAgIEFTU0VSVChzaGFkZXIpOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5Owot
Ci0gICAgZW50cnkuc291cmNlID0gc3RyaW5nOwotCi0gICAgbV9zaGFkZXJTb3VyY2VNYXAuc2V0
KHNoYWRlciwgZW50cnkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVu
Yyh1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNpZ25lZCBsb25nIG1hc2spCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsRnVuYyhmdW5j
LCByZWYsIG1hc2spOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsRnVuY1Nl
cGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwg
dW5zaWduZWQgbG9uZyBtYXNrKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
LSAgICA6OmdsU3RlbmNpbEZ1bmNTZXBhcmF0ZShmYWNlLCBmdW5jLCByZWYsIG1hc2spOwotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFzayh1bnNpZ25lZCBsb25nIG1hc2sp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsTWFz
ayhtYXNrKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2tTZXBhcmF0
ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgbWFzaykKLXsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFN0ZW5jaWxNYXNrU2VwYXJhdGUoZmFjZSwg
bWFzayk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxPcCh1bnNpZ25lZCBs
b25nIGZhaWwsIHVuc2lnbmVkIGxvbmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3AoZmFpbCwg
emZhaWwsIHpwYXNzKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE9wU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZhaWwsIHVuc2lnbmVkIGxv
bmcgemZhaWwsIHVuc2lnbmVkIGxvbmcgenBhc3MpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xTdGVuY2lsT3BTZXBhcmF0ZShmYWNlLCBmYWlsLCB6ZmFpbCwg
enBhc3MpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0ZXJmKHVuc2ln
bmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGZsb2F0IHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZih0YXJnZXQsIHBuYW1l
LCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dGV4UGFyYW1ldGVyaSh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBpbnQgdmFs
dWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xUZXhQYXJh
bWV0ZXJpKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWYobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAp
Ci17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWYo
bG9jYXRpb24sIHYwKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmdihs
b25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFmdihsb2NhdGlvbiwgc2l6ZSwgYXJy
YXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmYobG9uZyBsb2NhdGlv
biwgZmxvYXQgdjAsIGZsb2F0IHYxKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTJmKGxvY2F0aW9uLCB2MCwgdjEpOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp1bmlmb3JtMmZ2KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50
IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9m
IDIKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0yZnYo
bG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5p
Zm9ybTNmKGxvbmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtM2YobG9jYXRp
b24sIHYwLCB2MSwgdjIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2Z2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
LX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRmKGxvbmcgbG9jYXRpb24sIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTRmKGxvY2F0aW9uLCB2MCwgdjEsIHYy
LCB2Myk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00ZnYobG9uZyBsb2Nh
dGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAvLyBGSVhNRTogbGVuZ3RoIG5l
ZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKLSAgICA6OmdsVW5pZm9ybTRmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWkobG9uZyBsb2NhdGlvbiwgaW50IHYwKQotewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTFpKGxvY2F0
aW9uLCB2MCk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaXYobG9uZyBs
b2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtMWl2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yaShsb25nIGxvY2F0aW9uLCBpbnQg
djAsIGludCB2MSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0yaShsb2NhdGlvbiwgdjAsIHYxKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dW5pZm9ybTJpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVW5pZm9ybTJpdihsb2NhdGlvbiwgc2l6
ZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2kobG9uZyBs
b2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MikKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm0zaShsb2NhdGlvbiwgdjAsIHYxLCB2Mik7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bFVuaWZvcm0zaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dW5pZm9ybTRpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIs
IGludCB2MykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVu
aWZvcm00aShsb2NhdGlvbiwgdjAsIHYxLCB2MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjp1bmlmb3JtNGl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQot
ewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xVbmlmb3JtNGl2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRy
aXgyZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNp
emUpCi17Ci0gICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXgy
ZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjp1bmlmb3JtTWF0cml4M2Z2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3Nl
LCBmbG9hdCogYXJyYXksIGludCBzaXplKQotewotICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMg
dG8gYmUgYSBtdWx0aXBsZSBvZiA5Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwot
ICAgIDo6Z2xVbmlmb3JtTWF0cml4M2Z2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5
KTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDRmdihsb25nIGxv
Y2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKLXsKLSAgICAv
LyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMTYKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVuaWZvcm1NYXRyaXg0ZnYobG9jYXRpb24s
IHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
c2VQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFVzZVByb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7Ci19
Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZhbGlkYXRlUHJvZ3JhbShQbGF0Zm9ybTNET2Jq
ZWN0IHByb2dyYW0pCi17Ci0gICAgQVNTRVJUKHByb2dyYW0pOwotICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmFsaWRhdGVQcm9ncmFtKChHTHVpbnQpIHBy
b2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0IHYwKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliMWYoaW5keCwgdjApOwotfQotCi12b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIxZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCog
YXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIxZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSkKLXsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJm
KGluZHgsIHYwLCB2MSk7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJp
YjJmdih1bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0KiBhcnJheSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjJmdihpbmR4LCBhcnJheSk7
Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnZlcnRleEF0dHJpYjNmKHVuc2lnbmVkIGxv
bmcgaW5keCwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MikKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYjNmKGluZHgsIHYwLCB2MSwg
djIpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZnYodW5zaWdu
ZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZnYoaW5keCwgYXJyYXkpOwotfQotCi12b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0Zih1bnNpZ25lZCBsb25nIGluZHgsIGZs
b2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIsIGZsb2F0IHYzKQotewotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsVmVydGV4QXR0cmliNGYoaW5keCwgdjAsIHYxLCB2
MiwgdjMpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWI0ZnYodW5z
aWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOwotICAgIDo6Z2xWZXJ0ZXhBdHRyaWI0ZnYoaW5keCwgYXJyYXkpOwotfQotCi12
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWJQb2ludGVyKHVuc2lnbmVkIGxvbmcg
aW5keCwgaW50IHNpemUsIGludCB0eXBlLCBib29sIG5vcm1hbGl6ZWQsIHVuc2lnbmVkIGxvbmcg
c3RyaWRlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5keCwgc2l6ZSwgdHlwZSwg
bm9ybWFsaXplZCwgc3RyaWRlLCByZWludGVycHJldF9jYXN0PHZvaWQqPihzdGF0aWNfY2FzdDxp
bnRwdHJfdD4ob2Zmc2V0KSkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2aWV3cG9y
dChsb25nIHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWln
aHQpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xWaWV3cG9y
dChzdGF0aWNfY2FzdDxHTGludD4oeCksIHN0YXRpY19jYXN0PEdMaW50Pih5KSwgc3RhdGljX2Nh
c3Q8R0xzaXplaT4od2lkdGgpLCBzdGF0aWNfY2FzdDxHTHNpemVpPihoZWlnaHQpKTsKLX0KLQot
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Qm9vbGVhbnYodW5zaWduZWQgbG9uZyBwbmFtZSwg
dW5zaWduZWQgY2hhciogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRCb29sZWFudihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRCdWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldEJ1ZmZlclBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZh
bHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RmxvYXR2KHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGZsb2F0KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgOjpnbEdldEZsb2F0dihwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih1bnNpZ25lZCBs
b25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHBuYW1l
LCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBp
ZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpCi0gICAgICAgIGF0dGFj
aG1lbnQgPSBERVBUSF9BVFRBQ0hNRU5UOyAvLyBPciBTVEVOQ0lMX0FUVEFDSE1FTlQsIGVpdGhl
ciB3b3Jrcy4KLSAgICA6OmdsR2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXZFWFQo
dGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRJbnRlZ2Vydih1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewot
ICAgIC8vIE5lZWQgdG8gZW11bGF0ZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVC9U
WVBFIGZvciBHTC4gIEFueSB2YWxpZAotICAgIC8vIGNvbWJpbmF0aW9uIHNob3VsZCB3b3JrLCBi
dXQgR0xfUkdCL0dMX1VOU0lHTkVEX0JZVEUgbWlnaHQgYmUgdGhlIG1vc3QKLSAgICAvLyB1c2Vm
dWwgZm9yIGRlc2t0b3AgV2ViR0wgdXNlcnMuCi0gICAgLy8gTmVlZCB0byBlbXVsYXRlIE1BWF9G
UkFHTUVOVC9WRVJURVhfVU5JRk9STV9WRUNUT1JTIGFuZCBNQVhfVkFSWUlOR19WRUNUT1JTCi0g
ICAgLy8gYmVjYXVzZSBkZXNrdG9wIEdMJ3MgY29ycmVzcG9uZGluZyBxdWVyaWVzIHJldHVybiB0
aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAgICAvLyB3aGVyZWFzIEdMRVMyIHJldHVybiB0aGUg
bnVtYmVyIG9mIHZlY3RvcnMgKGVhY2ggdmVjdG9yIGhhcyA0IGNvbXBvbmVudHMpLgotICAgIC8v
IFRoZXJlZm9yZSwgdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlc2t0b3AgR0wgbmVlZHMgdG8gYmUg
ZGl2aWRlZCBieSA0LgotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBzd2l0
Y2ggKHBuYW1lKSB7Ci0gICAgY2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX0ZPUk1BVDoK
LSAgICAgICAgKnZhbHVlID0gR0xfUkdCOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIElNUExF
TUVOVEFUSU9OX0NPTE9SX1JFQURfVFlQRToKLSAgICAgICAgKnZhbHVlID0gR0xfVU5TSUdORURf
QllURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNU
T1JTOgotICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09N
UE9ORU5UUywgdmFsdWUpOwotICAgICAgICAqdmFsdWUgLz0gNDsKLSAgICAgICAgYnJlYWs7Ci0g
ICAgY2FzZSBNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUzoKLSAgICAgICAgOjpnbEdldEludGVn
ZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTLCB2YWx1ZSk7Ci0gICAgICAgICp2
YWx1ZSAvPSA0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1BWF9WQVJZSU5HX1ZFQ1RPUlM6
Ci0gICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkFSWUlOR19GTE9BVFMsIHZhbHVlKTsK
LSAgICAgICAgKnZhbHVlIC89IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAg
ICAgIDo6Z2xHZXRJbnRlZ2VydihwbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBwbmFtZSwg
dmFsdWUpOwotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1JbmZvTG9n
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKLXsKLSAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAg
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIEdMaW50IGxlbmd0aDsKLSAg
ICA6OmdsR2V0UHJvZ3JhbWl2KChHTHVpbnQpIHByb2dyYW0sIEdMX0lORk9fTE9HX0xFTkdUSCwg
Jmxlbmd0aCk7Ci0gICAgCi0gICAgR0xzaXplaSBzaXplOwotICAgIEdMY2hhciogaW5mbyA9IChH
TGNoYXIqKSBmYXN0TWFsbG9jKGxlbmd0aCk7Ci0gICAgaWYgKCFpbmZvKQotICAgICAgICByZXR1
cm4gIiI7Ci0KLSAgICA6OmdsR2V0UHJvZ3JhbUluZm9Mb2coKEdMdWludCkgcHJvZ3JhbSwgbGVu
Z3RoLCAmc2l6ZSwgaW5mbyk7Ci0gICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgZmFzdEZyZWUoaW5m
byk7Ci0gICAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFJlbmRl
cmJ1ZmZlclBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBu
YW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAg
ICA6OmdsR2V0UmVuZGVyYnVmZmVyUGFyYW1ldGVyaXZFWFQodGFyZ2V0LCBwbmFtZSwgdmFsdWUp
OwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJpdihQbGF0Zm9ybTNET2Jq
ZWN0IHNoYWRlciwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKLXsKLSAgICBBU1NF
UlQoc2hhZGVyKTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAg
Ci0gICAgSGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJh
dG9yIHJlc3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKLSAgICAKLSAgICBz
d2l0Y2ggKHBuYW1lKSB7Ci0gICAgICAgIGNhc2UgREVMRVRFX1NUQVRVUzoKLSAgICAgICAgY2Fz
ZSBTSEFERVJfVFlQRToKLSAgICAgICAgICAgIC8vIExldCBPcGVuR0wgaGFuZGxlIHRoZXNlLgot
ICAgICAgICAKLSAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50KSBzaGFkZXIsIHBu
YW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIENPTVBJTEVf
U1RBVFVTOgotICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQo
KSkgewotICAgICAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihmYWxzZSk7
Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
IAotICAgICAgICAgICAgKCp2YWx1ZSkgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlc3VsdC0+c2Vjb25k
LmlzVmFsaWQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKLSAgICAgICAgY2Fz
ZSBJTkZPX0xPR19MRU5HVEg6Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291
cmNlTWFwLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOwotICAgICAgICAg
ICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAg
KCp2YWx1ZSkgPSBnZXRTaGFkZXJJbmZvTG9nKHNoYWRlcikubGVuZ3RoKCk7Ci0gICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIAotICAgICAgICBjYXNlIFNIQURFUl9TT1VSQ0VfTEVOR1RI
OgotICAgICAgICAgICAgKCp2YWx1ZSkgPSBnZXRTaGFkZXJTb3VyY2Uoc2hhZGVyKS5sZW5ndGgo
KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAg
ICAgICAgIHN5bnRoZXNpemVHTEVycm9yKElOVkFMSURfRU5VTSk7Ci0gICAgfQotfQotCi1TdHJp
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9Mb2coUGxhdGZvcm0zRE9iamVjdCBz
aGFkZXIpCi17Ci0gICAgQVNTRVJUKHNoYWRlcik7Ci0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0xpbnQgbGVuZ3RoOwotICAgIDo6Z2xHZXRTaGFkZXJpdigoR0x1aW50
KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7Ci0KLSAgICBIYXNoTWFwPFBs
YXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9z
aGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwotCi0gICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRl
clNvdXJjZU1hcC5lbmQoKSkKLSAgICAgICAgIHJldHVybiAiIjsKLQotICAgICBTaGFkZXJTb3Vy
Y2VFbnRyeSBlbnRyeSA9IHJlc3VsdC0+c2Vjb25kOwotCi0gICAgIGlmIChlbnRyeS5pc1ZhbGlk
KSB7Ci0gICAgICAgICBHTGludCBsZW5ndGg7Ci0gICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdM
dWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOwotCi0gICAgICAgICBH
THNpemVpIHNpemU7Ci0gICAgICAgICBHTGNoYXIqIGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxv
YyhsZW5ndGgpOwotICAgICAgICAgaWYgKCFpbmZvKQotICAgICAgICAgICAgIHJldHVybiAiIjsK
LQotICAgICAgICAgOjpnbEdldFNoYWRlckluZm9Mb2coKEdMdWludCkgc2hhZGVyLCBsZW5ndGgs
ICZzaXplLCBpbmZvKTsKLQotICAgICAgICAgU3RyaW5nIHMoaW5mbyk7Ci0gICAgICAgICBmYXN0
RnJlZShpbmZvKTsKLSAgICAgICAgIHJldHVybiBzOwotICAgICB9Ci0gICAgIGVsc2UgewotICAg
ICAgICAgcmV0dXJuIGVudHJ5LmxvZzsKLSAgICAgfQotfQotCi1TdHJpbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFNoYWRlclNvdXJjZShQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKLXsKLSAgICBB
U1NFUlQoc2hhZGVyKTsKLQotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLQotICAg
IEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciBy
ZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Ci0KLSAgICBpZiAocmVzdWx0
ID09IG1fc2hhZGVyU291cmNlTWFwLmVuZCgpKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBy
ZXR1cm4gcmVzdWx0LT5zZWNvbmQuc291cmNlOwotfQotCi0KLXZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFRleFBhcmFtZXRlcmZ2KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCB1bnNpZ25lZCBsb25n
IHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIDo6Z2xHZXRUZXhQYXJhbWV0ZXJmdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7Ci19Ci0K
LXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFRleFBhcmFtZXRlcml2KHVuc2lnbmVkIGxvbmcg
dGFyZ2V0LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBpbnQqIHZhbHVlKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICA6OmdsR2V0VGV4UGFyYW1ldGVyaXYodGFyZ2V0LCBw
bmFtZSwgdmFsdWUpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtZnYo
UGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBsb25nIGxvY2F0aW9uLCBmbG9hdCogdmFsdWUpCi17
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRVbmlmb3JtZnYo
KEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0VW5pZm9ybWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2Nh
dGlvbiwgaW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0g
ICAgOjpnbEdldFVuaWZvcm1pdigoR0x1aW50KSBwcm9ncmFtLCBsb2NhdGlvbiwgdmFsdWUpOwot
fQotCi1sb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRVbmlmb3JtTG9jYXRpb24oUGxhdGZvcm0z
RE9iamVjdCBwcm9ncmFtLCBjb25zdCBTdHJpbmcmIG5hbWUpCi17Ci0gICAgQVNTRVJUKHByb2dy
YW0pOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICByZXR1cm4g
OjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRh
KCkpOwotfQotCi12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJmdih1bnNp
Z25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCi17Ci0g
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJm
dihpbmRleCwgcG5hbWUsIHZhbHVlKTsKLX0KLQotdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VmVydGV4QXR0cmliaXYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
aW50KiB2YWx1ZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgOjpn
bEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwotfQotCi1sb25nIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQodW5zaWduZWQgbG9uZyBpbmRleCwg
dW5zaWduZWQgbG9uZyBwbmFtZSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgCi0gICAgdm9pZCogcG9pbnRlcjsKLSAgICA6OmdsR2V0VmVydGV4QXR0cmliUG9pbnRl
cnYoaW5kZXgsIHBuYW1lLCAmcG9pbnRlcik7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8
bG9uZz4ocG9pbnRlcik7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1
bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCBpbnRlcm5hbGZvcm1hdCwg
dW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYm9yZGVyLCB1bnNpZ25l
ZCBmb3JtYXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0KLSAgICA6OmdsVGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBp
bnRlcm5hbGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgYm9yZGVyLCBmb3JtYXQsIHR5cGUsIHBpeGVs
cyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1h
Z2UyRCh1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIGxldmVsLCB1bnNpZ25lZCB4b2ZmLCB1bnNp
Z25lZCB5b2ZmLCB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBmb3Jt
YXQsIHVuc2lnbmVkIHR5cGUsIHZvaWQqIHBpeGVscykKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0KLSAgICAvLyBGSVhNRTogd2Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBQ
aXhlbFN0b3JlIHBhcmFtcyB3aGVuIGRlYWxpbmcgd2l0aCBpbWFnZSBidWZmZXJzIHRoYXQgZGlm
ZmVyIGZyb20gdGhlIHN1YmltYWdlIHNpemUKLSAgICA6OmdsVGV4U3ViSW1hZ2UyRCh0YXJnZXQs
IGxldmVsLCB4b2ZmLCB5b2ZmLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIHBpeGVscyk7
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVC
dWZmZXIoKQotewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQg
bzsKLSAgICBnbEdlbkJ1ZmZlcnMoMSwgJm8pOwotICAgIHJldHVybiBvOwotfQotCi11bnNpZ25l
ZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlRnJhbWVidWZmZXIoKQotewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBHTHVpbnQgbzsKLSAgICBnbEdlbkZyYW1lYnVmZmVy
c0VYVCgxLCAmbyk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXVuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVQcm9ncmFtKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
Ci0gICAgcmV0dXJuIGdsQ3JlYXRlUHJvZ3JhbSgpOwotfQotCi11bnNpZ25lZCBHcmFwaGljc0Nv
bnRleHQzRDo6Y3JlYXRlUmVuZGVyYnVmZmVyKCkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZv
KTsKLSAgICByZXR1cm4gbzsKLX0KLQotdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0
ZVNoYWRlcih1bnNpZ25lZCBsb25nIHR5cGUpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOwotICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFHTUVOVF9TSEFE
RVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7Ci19Ci0KLXVuc2ln
bmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgR0x1aW50IG87Ci0gICAgZ2xHZW5UZXh0dXJlcygxLCAm
byk7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUJ1
ZmZlcih1bnNpZ25lZCBidWZmZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OwotICAgIGdsRGVsZXRlQnVmZmVycygxLCAmYnVmZmVyKTsKLX0KLQotdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGVsZXRlRnJhbWVidWZmZXIodW5zaWduZWQgZnJhbWVidWZmZXIpCi17Ci0gICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwotICAgIGdsRGVsZXRlRnJhbWVidWZmZXJzRVhU
KDEsICZmcmFtZWJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVBy
b2dyYW0odW5zaWduZWQgcHJvZ3JhbSkKLXsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7Ci0gICAgZ2xEZWxldGVQcm9ncmFtKHByb2dyYW0pOwotfQotCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpkZWxldGVSZW5kZXJidWZmZXIodW5zaWduZWQgcmVuZGVyYnVmZmVyKQotewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICBnbERlbGV0ZVJlbmRlcmJ1ZmZlcnNF
WFQoMSwgJnJlbmRlcmJ1ZmZlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0
ZVNoYWRlcih1bnNpZ25lZCBzaGFkZXIpCi17Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOwotICAgIGdsRGVsZXRlU2hhZGVyKHNoYWRlcik7Ci19Ci0KLXZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmRlbGV0ZVRleHR1cmUodW5zaWduZWQgdGV4dHVyZSkKLXsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7Ci19
Ci0KLWludCBHcmFwaGljc0NvbnRleHQzRDo6c2l6ZUluQnl0ZXMoaW50IHR5cGUpCi17Ci0gICAg
c3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgR0xfQllURToKLSAgICAgICAgICAgIHJldHVy
biBzaXplb2YoR0xieXRlKTsKLSAgICAgICAgY2FzZSBHTF9VTlNJR05FRF9CWVRFOgotICAgICAg
ICAgICAgcmV0dXJuIHNpemVvZihHTHVieXRlKTsKLSAgICAgICAgY2FzZSBHTF9TSE9SVDoKLSAg
ICAgICAgICAgIHJldHVybiBzaXplb2YoR0xzaG9ydCk7Ci0gICAgICAgIGNhc2UgR0xfVU5TSUdO
RURfU0hPUlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdXNob3J0KTsKLSAgICAgICAg
Y2FzZSBHTF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMaW50KTsKLSAgICAgICAg
Y2FzZSBHTF9VTlNJR05FRF9JTlQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMdWludCk7
Ci0gICAgICAgIGNhc2UgR0xfRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMZmxv
YXQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQot
Ci12b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzeW50aGVzaXplR0xFcnJvcih1bnNpZ25lZCBsb25n
IGVycm9yKQotewotICAgIG1fc3ludGhldGljRXJyb3JzLmFkZChlcnJvcik7Ci19CiAKIH0KIApJ
bmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RP
cGVuR0wuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Blbmds
L0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkocmV2aXNpb24gNjY4ODcpCShmcm9tIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0dyYXBoaWNzQ29udGV4dDNETWFjLm1tOjY2ODg3KQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RPcGVu
R0wuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTY2MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRSgzRF9DQU5WQVMpCisKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQzRC5oIgorCisjaW1wb3J0ICJCbG9ja0V4Y2VwdGlvbnMuaCIKKworI2luY2x1
ZGUgIkFycmF5QnVmZmVyLmgiCisjaW5jbHVkZSAiQXJyYXlCdWZmZXJWaWV3LmgiCisjaW5jbHVk
ZSAiV2ViR0xPYmplY3QuaCIKKyNpbmNsdWRlICJDYW52YXNSZW5kZXJpbmdDb250ZXh0LmgiCisj
aW5jbHVkZSAiRmxvYXQzMkFycmF5LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisj
aW5jbHVkZSAiSFRNTENhbnZhc0VsZW1lbnQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgor
I2luY2x1ZGUgIkludDMyQXJyYXkuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNpbmNsdWRlICJXZWJHTExheWVyLmgiCisjaW5jbHVkZSA8
Q29yZUdyYXBoaWNzL0NHQml0bWFwQ29udGV4dC5oPgorI2luY2x1ZGUgPE9wZW5HTC9DR0xSZW5k
ZXJlcnMuaD4KKyNpbmNsdWRlIDxPcGVuR0wvZ2wuaD4KKyNpbmNsdWRlIDx3dGYvVW51c2VkUGFy
YW0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworc3RhdGljIHZvaWQgc2V0UGl4ZWxGb3JtYXQoVmVjdG9yPENHTFBpeGVsRm9ybWF0QXR0
cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9yQml0cywgaW50IGRlcHRoQml0cywgYm9vbCBhY2Nl
bGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwgYm9vbCBjbG9zZXN0KQoreworICAgIGF0dHJpYnMu
Y2xlYXIoKTsKKyAgICAKKyAgICBhdHRyaWJzLmFwcGVuZChrQ0dMUEZBQ29sb3JTaXplKTsKKyAg
ICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oY29s
b3JCaXRzKSk7CisgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQURlcHRoU2l6ZSk7CisgICAgYXR0
cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGRlcHRoQml0
cykpOworICAgIAorICAgIGlmIChhY2NlbGVyYXRlZCkKKyAgICAgICAgYXR0cmlicy5hcHBlbmQo
a0NHTFBGQUFjY2VsZXJhdGVkKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXR0cmlicy5hcHBlbmQo
a0NHTFBGQVJlbmRlcmVySUQpOworICAgICAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxD
R0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NHTFJlbmRlcmVyR2VuZXJpY0Zsb2F0SUQpKTsKKyAg
ICB9CisgICAgICAgIAorICAgIGlmIChzdXBlcnNhbXBsZSkKKyAgICAgICAgYXR0cmlicy5hcHBl
bmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKKyAgICAgICAgCisgICAgaWYgKGNsb3Nlc3QpCisgICAg
ICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFDbG9zZXN0UG9saWN5KTsKKyAgICAgICAgCisgICAg
YXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KDApKTsK
K30KKworUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRD4gR3JhcGhpY3NDb250ZXh0M0Q6OmNy
ZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9z
dFdpbmRvdykKK3sKKyAgICBPd25QdHI8R3JhcGhpY3NDb250ZXh0M0Q+IGNvbnRleHQobmV3IEdy
YXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0V2luZG93KSk7CisgICAgcmV0dXJuIGNvbnRleHQt
Pm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVsZWFzZSgpIDogMDsKK30KKworR3JhcGhpY3NDb250
ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0
dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93KQorICAgIDogbV9jdXJyZW50V2lkdGgoMCkKKyAg
ICAsIG1fY3VycmVudEhlaWdodCgwKQorICAgICwgbV9hdHRycyhhdHRycykKKyAgICAsIG1fY29u
dGV4dE9iaigwKQorICAgICwgbV90ZXh0dXJlKDApCisgICAgLCBtX2ZibygwKQorICAgICwgbV9k
ZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAgICAsIG1fYm91bmRGQk8oMCkKKyAgICAsIG1fbXVsdGlz
YW1wbGVGQk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIoMCkKKyAg
ICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZlcigwKQoreworICAgIFVOVVNFRF9QQVJBTShob3N0
V2luZG93KTsKKworICAgIFZlY3RvcjxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4gYXR0cmliczsK
KyAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhlbEZvcm1hdE9iaiA9IDA7CisgICAgR0xpbnQgbnVt
UGl4ZWxGb3JtYXRzID0gMDsKKyAgICAKKyAgICAvLyBXZSB3aWxsIHRyeToKKyAgICAvLworICAg
IC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQvc3VwZXJzYW1wbGVk
CisgICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMyIGJpdCBkZXB0aC9hY2NlbGVyYXRlZAorICAgIC8v
ICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvYWNjZWxlcmF0ZWQKKyAgICAvLyAgNCkgY2xv
c2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQgZGVwdGgvc29mdHdhcmUgcmVuZGVyZXIKKyAgICAv
LworICAgIC8vICBJZiBub25lIG9mIHRoYXQgd29ya3MsIHdlIHNpbXBseSBmYWlsIGFuZCBzZXQg
bV9jb250ZXh0T2JqIHRvIDAuCisgICAgCisgICAgc2V0UGl4ZWxGb3JtYXQoYXR0cmlicywgMzIs
IDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmli
cy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7CisgICAgaWYgKG51
bVBpeGVsRm9ybWF0cyA9PSAwKSB7CisgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMy
LCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQo
YXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7CisgICAg
ICAgIAorICAgICAgICBpZiAobnVtUGl4ZWxGb3JtYXRzID09IDApIHsKKyAgICAgICAgICAgIHNl
dFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAg
ICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRP
YmosICZudW1QaXhlbEZvcm1hdHMpOworICAgICAgICAKKyAgICAgICAgICAgIGlmIChudW1QaXhl
bEZvcm1hdHMgPT0gMCkgeworICAgICAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMs
IDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBDR0xDaG9vc2VQ
aXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwgJnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3Jt
YXRzKTsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAw
KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIGFuIGFjY2VwdGFibGUg
cmVuZGVyZXIgLSBmYWlsCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgQ0dMRXJy
b3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChwaXhlbEZvcm1hdE9iaiwgMCwgJm1fY29udGV4dE9i
aik7CisgICAgQ0dMRGVzdHJveVBpeGVsRm9ybWF0KHBpeGVsRm9ybWF0T2JqKTsKKyAgICAKKyAg
ICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8ICFtX2NvbnRleHRPYmopIHsKKyAgICAgICAgLy8g
Q291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4dCAtIGZhaWwKKyAgICAgICAgbV9jb250ZXh0T2Jq
ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFNldCB0aGUgY3VycmVudCBj
b250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8gdXMuCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKKworICAgIC8v
IENyZWF0ZSB0aGUgV2ViR0xMYXllcgorICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUwor
ICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHROUyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRXaXRo
R3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgW21fd2Vi
R0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2ViR0wgTGF5ZXIiXTsKKyNlbmRpZiAgICAKKyAgICBF
TkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCisgICAgCisgICAgLy8gY3JlYXRlIGEgdGV4dHVyZSB0
byByZW5kZXIgaW50bworICAgIDo6Z2xHZW5UZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKKyAgICA6
OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICA6OmdsVGV4UGFy
YW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7
CisgICAgOjpnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklM
VEVSLCBHTF9MSU5FQVIpOworICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdM
X1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7CisgICAgOjpnbFRleFBhcmFtZXRlcmkoR0xfVEVY
VFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QKTsKKyAgICA6OmdsQmluZFRleHR1
cmUoR0xfVEVYVFVSRV8yRCwgMCk7CisgICAgCisgICAgLy8gY3JlYXRlIGFuIEZCTworICAgIDo6
Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKKyAgICA6OmdsQmluZEZyYW1lYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIAorICAgIG1fYm91bmRGQk8gPSBt
X2ZibzsKKyAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwg
bV9hdHRycy5kZXB0aCkpCisgICAgICAgIDo6Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX2Rl
cHRoU3RlbmNpbEJ1ZmZlcik7CisKKyAgICAvLyBjcmVhdGUgYW4gbXVsdGlzYW1wbGUgRkJPCisg
ICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNF
WFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhU
KEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIG1fYm91bmRG
Qk8gPSBtX211bHRpc2FtcGxlRkJPOworICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgx
LCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQo
MSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIpOworICAgIH0KKyAgICAKKyAgICAv
LyBBTkdMRSBpbml0aWFsaXphdGlvbi4KKworICAgIFRCdWlsdEluUmVzb3VyY2UgQU5HTEVSZXNv
dXJjZXM7CisKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKKyAgICBn
ZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVS
ZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4
VW5pZm9ybVZlY3RvcnMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpN
QVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZv
cm1WZWN0b3JzKTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7Cisg
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZB
TkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4
VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29u
dGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVfSU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5N
YXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmlu
ZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7CisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0
M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4
Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7CisgICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVy
ZUltYWdlVW5pdHMgPSAwOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhf
VEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRz
KTsKKyAgICBBTkdMRVJlc291cmNlcy5NYXhGcmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKKyAg
ICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVD
VE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOworCisgICAg
Ly8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCisgICAgQU5HTEVSZXNvdXJjZXMuTWF4
RHJhd0J1ZmZlcnMgPSAxOworICAgIAorICAgIG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xF
UmVzb3VyY2VzKTsKKyAgICAKKyAgICA6OmdsRW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5U
X1NJWkUpOworICAgIDo6Z2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOworfQorCitHcmFwaGljc0Nv
bnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKK3sKKyAgICBpZiAobV9jb250ZXh0T2JqKSB7
CisgICAgICAgIENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgICAgIDo6
Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKKyAgICAgICAgaWYgKG1fYXR0cnMuYW50
aWFsaWFzKSB7CisgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9t
dWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwg
fHwgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgICAgICA6
OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEsICZtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAg
fSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0
aCkKKyAgICAgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0
aFN0ZW5jaWxCdWZmZXIpOworICAgICAgICB9CisgICAgICAgIDo6Z2xEZWxldGVGcmFtZWJ1ZmZl
cnNFWFQoMSwgJm1fZmJvKTsKKyAgICAgICAgQ0dMU2V0Q3VycmVudENvbnRleHQoMCk7CisgICAg
ICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0ZXMoKQoreworICAgIGNvbnN0IGNoYXIq
IGV4dGVuc2lvbnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5n
KEdMX0VYVEVOU0lPTlMpKTsKKyAgICBpZiAobV9hdHRycy5zdGVuY2lsKSB7CisgICAgICAgIGlm
IChzdGQ6OnN0cnN0cihleHRlbnNpb25zLCAiR0xfRVhUX3BhY2tlZF9kZXB0aF9zdGVuY2lsIikp
IHsKKyAgICAgICAgICAgIGlmICghbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICBtX2F0
dHJzLmRlcHRoID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtX2F0dHJzLnN0
ZW5jaWwgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAg
ICAgIGJvb2wgaXNWYWxpZFZlbmRvciA9IHRydWU7CisgICAgICAgIC8vIEN1cnJlbnRseSBpbiBN
YWMgd2Ugb25seSB0dXJuIG9uIGFudGlhbGlhcyBpZiB2ZW5kb3IgaXMgTlZJRElBLgorICAgICAg
ICBjb25zdCBjaGFyKiB2ZW5kb3IgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPig6Omds
R2V0U3RyaW5nKEdMX1ZFTkRPUikpOworICAgICAgICBpZiAoIXN0ZDo6c3Ryc3RyKHZlbmRvciwg
Ik5WSURJQSIpKQorICAgICAgICAgICAgaXNWYWxpZFZlbmRvciA9IGZhbHNlOworICAgICAgICBp
ZiAoIWlzVmFsaWRWZW5kb3IgfHwgIXN0ZDo6c3Ryc3RyKGV4dGVuc2lvbnMsICJHTF9FWFRfZnJh
bWVidWZmZXJfbXVsdGlzYW1wbGUiKSkKKyAgICAgICAgICAgIG1fYXR0cnMuYW50aWFsaWFzID0g
ZmFsc2U7CisgICAgfQorICAgIC8vIEZJWE1FOiBpbnN0ZWFkIG9mIGVuZm9yY2luZyBwcmVtdWx0
aXBsaWVkQWxwaGEgPSB0cnVlLCBpbXBsZW1lbnQgdGhlCisgICAgLy8gY29ycmVjdCBiZWhhdmlv
ciB3aGVuIHByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlIGlzIHJlcXVlc3RlZC4KKyAgICBtX2F0
dHJzLnByZW11bHRpcGxpZWRBbHBoYSA9IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6Om1ha2VDb250ZXh0Q3VycmVudCgpCit7CisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9j
b250ZXh0T2JqKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdS
ZXN1bHRzVG9DYW52YXMoQ2FudmFzUmVuZGVyaW5nQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBI
VE1MQ2FudmFzRWxlbWVudCogY2FudmFzID0gY29udGV4dC0+Y2FudmFzKCk7CisgICAgSW1hZ2VC
dWZmZXIqIGltYWdlQnVmZmVyID0gY2FudmFzLT5idWZmZXIoKTsKKworICAgIGludCByb3dCeXRl
cyA9IG1fY3VycmVudFdpZHRoICogNDsKKyAgICBpbnQgdG90YWxCeXRlcyA9IHJvd0J5dGVzICog
bV9jdXJyZW50SGVpZ2h0OworCisgICAgT3duQXJyYXlQdHI8dW5zaWduZWQgY2hhcj4gcGl4ZWxz
KG5ldyB1bnNpZ25lZCBjaGFyW3RvdGFsQnl0ZXNdKTsKKyAgICBpZiAoIXBpeGVscykKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKwor
ICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxp
YXMpIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVS
X0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQo
R0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1
ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1
cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5F
QVIpOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwg
bV9mYm8pOworICAgICAgICBtdXN0UmVzdG9yZUZCTyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgaWYgKG1fYm91bmRGQk8gIT0gbV9mYm8pIHsKKyAgICAgICAgICAgIG11c3RSZXN0b3Jl
RkJPID0gdHJ1ZTsKKyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVC
VUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBHTGludCBwYWNrQWxp
Z25tZW50ID0gNDsKKyAgICBib29sIG11c3RSZXN0b3JlUGFja0FsaWdubWVudCA9IGZhbHNlOwor
ICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9QQUNLX0FMSUdOTUVOVCwgJnBhY2tBbGlnbm1lbnQpOwor
ICAgIGlmIChwYWNrQWxpZ25tZW50ID4gNCkgeworICAgICAgICA6OmdsUGl4ZWxTdG9yZWkoR0xf
UEFDS19BTElHTk1FTlQsIDQpOworICAgICAgICBtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQgPSB0
cnVlOworICAgIH0KKworICAgIDo6Z2xSZWFkUGl4ZWxzKDAsIDAsIG1fY3VycmVudFdpZHRoLCBt
X2N1cnJlbnRIZWlnaHQsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgcGl4
ZWxzLmdldCgpKTsKKworICAgIGlmIChtdXN0UmVzdG9yZVBhY2tBbGlnbm1lbnQpCisgICAgICAg
IDo6Z2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgcGFja0FsaWdubWVudCk7CisKKyAg
ICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsKKworICAgIHBhaW50VG9DYW52YXMocGl4ZWxz
LmdldCgpLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVpZ2h0LAorICAgICAgICAgICAgICAg
ICAgY2FudmFzLT53aWR0aCgpLCBjYW52YXMtPmhlaWdodCgpLCBpbWFnZUJ1ZmZlci0+Y29udGV4
dCgpLT5wbGF0Zm9ybUNvbnRleHQoKSk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6Omlz
R0xFUzJDb21wbGlhbnQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBH
cmFwaGljc0NvbnRleHQzRDo6aXNHTEVTMk5QT1RTdHJpY3QoKSBjb25zdAoreworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNFcnJvckdlbmVyYXRlZE9u
T3V0T2ZCb3VuZHNBY2Nlc3NlcygpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpyZXNoYXBlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sK
KyAgICBpZiAod2lkdGggPT0gbV9jdXJyZW50V2lkdGggJiYgaGVpZ2h0ID09IG1fY3VycmVudEhl
aWdodCB8fCAhbV9jb250ZXh0T2JqKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9jdXJy
ZW50V2lkdGggPSB3aWR0aDsKKyAgICBtX2N1cnJlbnRIZWlnaHQgPSBoZWlnaHQ7CisgICAgCisg
ICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICAKKyAgICBHTHVpbnQg
aW50ZXJuYWxDb2xvckZvcm1hdCwgY29sb3JGb3JtYXQsIGludGVybmFsRGVwdGhTdGVuY2lsRm9y
bWF0ID0gMDsKKyAgICBpZiAobV9hdHRycy5hbHBoYSkgeworICAgICAgICBpbnRlcm5hbENvbG9y
Rm9ybWF0ID0gR0xfUkdCQTg7CisgICAgICAgIGNvbG9yRm9ybWF0ID0gR0xfUkdCQTsKKyAgICB9
IGVsc2UgeworICAgICAgICBpbnRlcm5hbENvbG9yRm9ybWF0ID0gR0xfUkdCODsKKyAgICAgICAg
Y29sb3JGb3JtYXQgPSBHTF9SR0I7CisgICAgfQorICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwg
bV9hdHRycy5kZXB0aCkgeworICAgICAgICAvLyBXZSBkb24ndCBhbGxvdyB0aGUgbG9naWMgd2hl
cmUgc3RlbmNpbCBpcyByZXF1aXJlZCBhbmQgZGVwdGggaXMgbm90LgorICAgICAgICAvLyBTZWUg
R3JhcGhpY3NDb250ZXh0M0QgY29uc3RydWN0b3IuCisgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgJiYgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgIGludGVybmFsRGVwdGhTdGVuY2lsRm9y
bWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IGludGVybmFsRGVwdGhTdGVuY2lsRm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgIH0K
KworICAgIGJvb2wgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKworICAgIC8vIHJlc2l6ZSBtdWx0
aXNhbXBsZSBGQk8KKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgR0xpbnQg
bWF4U2FtcGxlQ291bnQ7CisgICAgICAgIDo6Z2xHZXRJbnRlZ2VydihHTF9NQVhfU0FNUExFU19F
WFQsICZtYXhTYW1wbGVDb3VudCk7CisgICAgICAgIEdMaW50IHNhbXBsZUNvdW50ID0gc3RkOjpt
aW4oOCwgbWF4U2FtcGxlQ291bnQpOworICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBtYXhTYW1w
bGVDb3VudCkKKyAgICAgICAgICAgIHNhbXBsZUNvdW50ID0gbWF4U2FtcGxlQ291bnQ7CisgICAg
ICAgIGlmIChtX2JvdW5kRkJPICE9IG1fbXVsdGlzYW1wbGVGQk8pIHsKKyAgICAgICAgICAgIDo6
Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRkJP
KTsKKyAgICAgICAgICAgIG11c3RSZXN0b3JlRkJPID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAg
ICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBtX211bHRpc2Ft
cGxlQ29sb3JCdWZmZXIpOworICAgICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2Ft
cGxlRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIHNhbXBsZUNvdW50LCBpbnRlcm5hbENvbG9yRm9y
bWF0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVy
RVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVOVDBfRVhULCBHTF9SRU5E
RVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlQ29sb3JCdWZmZXIpOworICAgICAgICBpZiAobV9h
dHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVwdGgpIHsKKyAgICAgICAgICAgIDo6Z2xCaW5kUmVu
ZGVyYnVmZmVyRVhUKEdMX1JFTkRFUkJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIpOworICAgICAgICAgICAgOjpnbFJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBs
ZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBzYW1wbGVDb3VudCwgaW50ZXJuYWxEZXB0aFN0ZW5j
aWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNp
bCkKKyAgICAgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQoR0xfRlJB
TUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJCVUZGRVJf
RVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgICAgIGlmICht
X2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZl
ckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIEdMX0RFUFRIX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5E
RVJCVUZGRVJfRVhULCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAg
fQorICAgICAgICA6OmdsQmluZFJlbmRlcmJ1ZmZlckVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCAw
KTsKKyAgICAgICAgaWYgKGdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVChHTF9GUkFNRUJVRkZF
Ul9FWFQpICE9IEdMX0ZSQU1FQlVGRkVSX0NPTVBMRVRFX0VYVCkgeworICAgICAgICAgICAgLy8g
RklYTUU6IGNsZWFudXAuCisgICAgICAgICAgICBub3RJbXBsZW1lbnRlZCgpOworICAgICAgICB9
CisgICAgfQorCisgICAgLy8gcmVzaXplIHJlZ3VsYXIgRkJPCisgICAgaWYgKG1fYm91bmRGQk8g
IT0gbV9mYm8pIHsKKyAgICAgICAgbXVzdFJlc3RvcmVGQk8gPSB0cnVlOworICAgICAgICA6Omds
QmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9mYm8pOworICAgIH0KKyAg
ICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICA6OmdsVGV4
SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBpbnRlcm5hbENvbG9yRm9ybWF0LCB3aWR0aCwgaGVp
Z2h0LCAwLCBjb2xvckZvcm1hdCwgR0xfVU5TSUdORURfQllURSwgMCk7CisgICAgOjpnbEZyYW1l
YnVmZmVyVGV4dHVyZTJERVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgR0xfQ09MT1JfQVRUQUNITUVO
VDBfRVhULCBHTF9URVhUVVJFXzJELCBtX3RleHR1cmUsIDApOworICAgIDo6Z2xCaW5kVGV4dHVy
ZShHTF9URVhUVVJFXzJELCAwKTsKKyAgICBpZiAoIW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0
dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpIHsKKyAgICAgICAgOjpnbEJpbmRSZW5kZXJi
dWZmZXJFWFQoR0xfUkVOREVSQlVGRkVSX0VYVCwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOworICAg
ICAgICA6OmdsUmVuZGVyYnVmZmVyU3RvcmFnZUVYVChHTF9SRU5ERVJCVUZGRVJfRVhULCBpbnRl
cm5hbERlcHRoU3RlbmNpbEZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGlmIChtX2F0
dHJzLnN0ZW5jaWwpCisgICAgICAgICAgICA6OmdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXJFWFQo
R0xfRlJBTUVCVUZGRVJfRVhULCBHTF9TVEVOQ0lMX0FUVEFDSE1FTlRfRVhULCBHTF9SRU5ERVJC
VUZGRVJfRVhULCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgIGlmIChtX2F0dHJzLmRl
cHRoKQorICAgICAgICAgICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKEdMX0ZSQU1F
QlVGRkVSX0VYVCwgR0xfREVQVEhfQVRUQUNITUVOVF9FWFQsIEdMX1JFTkRFUkJVRkZFUl9FWFQs
IG1fZGVwdGhTdGVuY2lsQnVmZmVyKTsKKyAgICAgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQo
R0xfUkVOREVSQlVGRkVSX0VYVCwgMCk7CisgICAgfQorICAgIGlmIChnbENoZWNrRnJhbWVidWZm
ZXJTdGF0dXNFWFQoR0xfRlJBTUVCVUZGRVJfRVhUKSAhPSBHTF9GUkFNRUJVRkZFUl9DT01QTEVU
RV9FWFQpIHsKKyAgICAgICAgLy8gRklYTUU6IGNsZWFudXAKKyAgICAgICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICB9CisKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpn
bEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8p
OworICAgICAgICBpZiAobV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICAg
ICAgbXVzdFJlc3RvcmVGQk8gPSBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIHJl
bmRlcmJ1ZmZlcnMgdG8gMC4KKyAgICBHTGJvb2xlYW4gY29sb3JNYXNrW10gPSB7R0xfVFJVRSwg
R0xfVFJVRSwgR0xfVFJVRSwgR0xfVFJVRX0sIGRlcHRoTWFzayA9IEdMX1RSVUUsIHN0ZW5jaWxN
YXNrID0gR0xfVFJVRTsKKyAgICBHTGJvb2xlYW4gaXNTY2lzc29yRW5hYmxlZCA9IEdMX0ZBTFNF
OworICAgIEdMYm9vbGVhbiBpc0RpdGhlckVuYWJsZWQgPSBHTF9GQUxTRTsKKyAgICBHTGJpdGZp
ZWxkIGNsZWFyTWFzayA9IEdMX0NPTE9SX0JVRkZFUl9CSVQ7CisgICAgOjpnbEdldEJvb2xlYW52
KEdMX0NPTE9SX1dSSVRFTUFTSywgY29sb3JNYXNrKTsKKyAgICA6OmdsQ29sb3JNYXNrKEdMX1RS
VUUsIEdMX1RSVUUsIEdMX1RSVUUsIEdMX1RSVUUpOworICAgIGlmIChtX2F0dHJzLmRlcHRoKSB7
CisgICAgICAgIDo6Z2xHZXRCb29sZWFudihHTF9ERVBUSF9XUklURU1BU0ssICZkZXB0aE1hc2sp
OworICAgICAgICA6OmdsRGVwdGhNYXNrKEdMX1RSVUUpOworICAgICAgICBjbGVhck1hc2sgfD0g
R0xfREVQVEhfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCkgewor
ICAgICAgICA6OmdsR2V0Qm9vbGVhbnYoR0xfU1RFTkNJTF9XUklURU1BU0ssICZzdGVuY2lsTWFz
ayk7CisgICAgICAgIDo6Z2xTdGVuY2lsTWFzayhHTF9UUlVFKTsKKyAgICAgICAgY2xlYXJNYXNr
IHw9IEdMX1NURU5DSUxfQlVGRkVSX0JJVDsKKyAgICB9CisgICAgaXNTY2lzc29yRW5hYmxlZCA9
IDo6Z2xJc0VuYWJsZWQoR0xfU0NJU1NPUl9URVNUKTsKKyAgICA6OmdsRGlzYWJsZShHTF9TQ0lT
U09SX1RFU1QpOworICAgIGlzRGl0aGVyRW5hYmxlZCA9IDo6Z2xJc0VuYWJsZWQoR0xfRElUSEVS
KTsKKyAgICA6OmdsRGlzYWJsZShHTF9ESVRIRVIpOworCisgICAgOjpnbENsZWFyKGNsZWFyTWFz
ayk7CisKKyAgICA6OmdsQ29sb3JNYXNrKGNvbG9yTWFza1swXSwgY29sb3JNYXNrWzFdLCBjb2xv
ck1hc2tbMl0sIGNvbG9yTWFza1szXSk7CisgICAgaWYgKG1fYXR0cnMuZGVwdGgpCisgICAgICAg
IDo6Z2xEZXB0aE1hc2soZGVwdGhNYXNrKTsKKyAgICBpZiAobV9hdHRycy5zdGVuY2lsKQorICAg
ICAgICA6OmdsU3RlbmNpbE1hc2soc3RlbmNpbE1hc2spOworICAgIGlmIChpc1NjaXNzb3JFbmFi
bGVkKQorICAgICAgICA6OmdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgZWxzZQorICAg
ICAgICA6OmdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgIGlmIChpc0RpdGhlckVuYWJs
ZWQpCisgICAgICAgIDo6Z2xFbmFibGUoR0xfRElUSEVSKTsKKyAgICBlbHNlCisgICAgICAgIDo6
Z2xEaXNhYmxlKEdMX0RJVEhFUik7CisKKyAgICBpZiAobXVzdFJlc3RvcmVGQk8pCisgICAgICAg
IDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2JvdW5kRkJPKTsK
KworICAgIDo6Z2xGbHVzaCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJlQ29udGV4
dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCit7CisgICAgaWYgKCFjb250ZXh0KQorICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgIENHTENvbnRleHRPYmogY3VycmVudENvbnRleHQgPSBDR0xH
ZXRDdXJyZW50Q29udGV4dCgpOworICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBjb250ZXh0KQor
ICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKK30KKwordm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMpIHsKKyAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7
CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQs
IG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZlckVYVCgwLCAwLCBtX2N1cnJlbnRX
aWR0aCwgbV9jdXJyZW50SGVpZ2h0LCAwLCAwLCBtX2N1cnJlbnRXaWR0aCwgbV9jdXJyZW50SGVp
Z2h0LCBHTF9DT0xPUl9CVUZGRVJfQklULCBHTF9MSU5FQVIpOworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9ib3VuZEZCTyk7CisgICAgfQorICAg
IDo6Z2xGaW5pc2goKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YWN0aXZlVGV4dHVy
ZSh1bnNpZ25lZCBsb25nIHRleHR1cmUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIDo6Z2xBY3RpdmVUZXh0dXJlKHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjphdHRhY2hTaGFkZXIoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBQbGF0Zm9y
bTNET2JqZWN0IHNoYWRlcikKK3sKKyAgICBBU1NFUlQocHJvZ3JhbSk7CisgICAgQVNTRVJUKHNo
YWRlcik7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xBdHRhY2hT
aGFkZXIoKEdMdWludCkgcHJvZ3JhbSwgKEdMdWludCkgc2hhZGVyKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6YmluZEF0dHJpYkxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3Jh
bSwgdW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFTU0VS
VChwcm9ncmFtKTsKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJp
bmRBdHRyaWJMb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBpbmRleCwgbmFtZS51dGY4KCkuZGF0
YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZEJ1ZmZlcih1bnNpZ25lZCBs
b25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7CisgICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kQnVmZmVyKHRhcmdldCwgKEdMdWludCkgYnVm
ZmVyKTsKK30KKworCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kRnJhbWVidWZmZXIodW5z
aWduZWQgbG9uZyB0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgYnVmZmVyKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTHVpbnQgZmJvOworICAgIGlmIChidWZmZXIp
CisgICAgICAgIGZibyA9IChHTHVpbnQpYnVmZmVyOworICAgIGVsc2UKKyAgICAgICAgZmJvID0g
KG1fYXR0cnMuYW50aWFsaWFzID8gbV9tdWx0aXNhbXBsZUZCTyA6IG1fZmJvKTsKKyAgICBpZiAo
ZmJvICE9IG1fYm91bmRGQk8pIHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVCh0YXJn
ZXQsIGZibyk7CisgICAgICAgIG1fYm91bmRGQk8gPSBmYm87CisgICAgfQorfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpiaW5kUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQ
bGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEJpbmRSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCAoR0x1aW50KSBy
ZW5kZXJidWZmZXIpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRUZXh0dXJl
KHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IHRleHR1cmUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCaW5kVGV4dHVyZSh0YXJnZXQs
IChHTHVpbnQpIHRleHR1cmUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZENv
bG9yKGRvdWJsZSByZWQsIGRvdWJsZSBncmVlbiwgZG91YmxlIGJsdWUsIGRvdWJsZSBhbHBoYSkK
K3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kQ29sb3Io
c3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlZCksIHN0YXRpY19jYXN0PGZsb2F0PihncmVlbiksIHN0YXRp
Y19jYXN0PGZsb2F0PihibHVlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGFscGhhKSk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJsZW5kRXF1YXRpb24oIHVuc2lnbmVkIGxvbmcgbW9kZSAp
Cit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xCbGVuZEVxdWF0
aW9uKG1vZGUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEVxdWF0aW9uU2Vw
YXJhdGUodW5zaWduZWQgbG9uZyBtb2RlUkdCLCB1bnNpZ25lZCBsb25nIG1vZGVBbHBoYSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRXF1YXRpb25T
ZXBhcmF0ZShtb2RlUkdCLCBtb2RlQWxwaGEpOworfQorCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OmJsZW5kRnVuYyh1bnNpZ25lZCBsb25nIHNmYWN0b3IsIHVuc2lnbmVkIGxvbmcgZGZhY3Rv
cikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRnVu
YyhzZmFjdG9yLCBkZmFjdG9yKTsKK30gICAgICAgCisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmJsZW5kRnVuY1NlcGFyYXRlKHVuc2lnbmVkIGxvbmcgc3JjUkdCLCB1bnNpZ25lZCBsb25nIGRz
dFJHQiwgdW5zaWduZWQgbG9uZyBzcmNBbHBoYSwgdW5zaWduZWQgbG9uZyBkc3RBbHBoYSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEJsZW5kRnVuY1NlcGFy
YXRlKHNyY1JHQiwgZHN0UkdCLCBzcmNBbHBoYSwgZHN0QWxwaGEpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBpbnQgc2l6ZSwg
dW5zaWduZWQgbG9uZyB1c2FnZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCAwLCB1c2FnZSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlckRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGludCBz
aXplLCBjb25zdCB2b2lkKiBkYXRhLCB1bnNpZ25lZCBsb25nIHVzYWdlKQoreworICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVmZmVyRGF0YSh0YXJnZXQsIHNpemUs
IGRhdGEsIHVzYWdlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyU3ViRGF0
YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgbG9uZyBvZmZzZXQsIGludCBzaXplLCBjb25zdCB2b2lk
KiBkYXRhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQnVm
ZmVyU3ViRGF0YSh0YXJnZXQsIG9mZnNldCwgc2l6ZSwgZGF0YSk7Cit9CisKK3Vuc2lnbmVkIGxv
bmcgR3JhcGhpY3NDb250ZXh0M0Q6OmNoZWNrRnJhbWVidWZmZXJTdGF0dXModW5zaWduZWQgbG9u
ZyB0YXJnZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVy
biA6OmdsQ2hlY2tGcmFtZWJ1ZmZlclN0YXR1c0VYVCh0YXJnZXQpOworfQorCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpjbGVhckNvbG9yKGRvdWJsZSByLCBkb3VibGUgZywgZG91YmxlIGIsIGRv
dWJsZSBhKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsQ2xl
YXJDb2xvcihzdGF0aWNfY2FzdDxmbG9hdD4ociksIHN0YXRpY19jYXN0PGZsb2F0PihnKSwgc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYSkpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpjbGVhcih1bnNpZ25lZCBsb25nIG1hc2spCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhcihtYXNrKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Y2xlYXJEZXB0aChkb3VibGUgZGVwdGgpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xDbGVhckRlcHRoKGRlcHRoKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJTdGVuY2lsKGxvbmcgcykKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbENsZWFyU3RlbmNpbChzKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29sb3JNYXNrKGJvb2wgcmVkLCBib29sIGdyZWVuLCBi
b29sIGJsdWUsIGJvb2wgYWxwaGEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xDb2xvck1hc2socmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpjb21waWxlU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVy
KQoreworICAgIEFTU0VSVChzaGFkZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKworICAgIGludCBHTHNoYWRlclR5cGU7CisgICAgQU5HTEVTaGFkZXJUeXBlIHNoYWRlclR5
cGU7CisKKyAgICBnbEdldFNoYWRlcml2KHNoYWRlciwgU0hBREVSX1RZUEUsICZHTHNoYWRlclR5
cGUpOworICAgIAorICAgIGlmIChHTHNoYWRlclR5cGUgPT0gVkVSVEVYX1NIQURFUikKKyAgICAg
ICAgc2hhZGVyVHlwZSA9IFNIQURFUl9UWVBFX1ZFUlRFWDsKKyAgICBlbHNlIGlmIChHTHNoYWRl
clR5cGUgPT0gRlJBR01FTlRfU0hBREVSKQorICAgICAgICBzaGFkZXJUeXBlID0gU0hBREVSX1RZ
UEVfRlJBR01FTlQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm47IC8vIEludmFsaWQgc2hhZGVy
IHR5cGUuCisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5
Pjo6aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisg
ICAgaWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgU2hhZGVyU291cmNlRW50cnkmIGVudHJ5ID0gcmVzdWx0LT5zZWNvbmQ7CisKKyAg
ICBTdHJpbmcgdHJhbnNsYXRlZFNoYWRlclNvdXJjZTsKKyAgICBTdHJpbmcgc2hhZGVySW5mb0xv
ZzsKKworICAgIGJvb2wgaXNWYWxpZCA9IG1fY29tcGlsZXIudmFsaWRhdGVTaGFkZXJTb3VyY2Uo
ZW50cnkuc291cmNlLnV0ZjgoKS5kYXRhKCksIHNoYWRlclR5cGUsIHRyYW5zbGF0ZWRTaGFkZXJT
b3VyY2UsIHNoYWRlckluZm9Mb2cpOworCisgICAgZW50cnkubG9nID0gc2hhZGVySW5mb0xvZzsK
KyAgICBlbnRyeS5pc1ZhbGlkID0gaXNWYWxpZDsKKworICAgIGlmICghaXNWYWxpZCkKKyAgICAg
ICAgcmV0dXJuOyAvLyBTaGFkZXIgZGlkbid0IHZhbGlkYXRlLCBkb24ndCBtb3ZlIGZvcndhcmQg
d2l0aCBjb21waWxpbmcgdHJhbnNsYXRlZCBzb3VyY2UgICAgCisKKyAgICBpbnQgdHJhbnNsYXRl
ZFNoYWRlckxlbmd0aCA9IHRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UubGVuZ3RoKCk7CisKKyAgICBj
b25zdCBDU3RyaW5nJiB0cmFuc2xhdGVkU2hhZGVyQ1N0cmluZyA9IHRyYW5zbGF0ZWRTaGFkZXJT
b3VyY2UudXRmOCgpOworICAgIGNvbnN0IGNoYXIqIHRyYW5zbGF0ZWRTaGFkZXJQdHIgPSB0cmFu
c2xhdGVkU2hhZGVyQ1N0cmluZy5kYXRhKCk7CisgICAgCisgICAgOjpnbFNoYWRlclNvdXJjZSgo
R0x1aW50KSBzaGFkZXIsIDEsICZ0cmFuc2xhdGVkU2hhZGVyUHRyLCAmdHJhbnNsYXRlZFNoYWRl
ckxlbmd0aCk7CisgICAgCisgICAgOjpnbENvbXBpbGVTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsK
KyAgICAKKyAgICBpbnQgR0xDb21waWxlU3VjY2VzczsKKyAgICAKKyAgICA6OmdsR2V0U2hhZGVy
aXYoKEdMdWludCkgc2hhZGVyLCBDT01QSUxFX1NUQVRVUywgJkdMQ29tcGlsZVN1Y2Nlc3MpOwor
ICAgIAorICAgIC8vIEFTU0VSVCB0aGF0IEFOR0xFIGdlbmVyYXRlZCBHTFNMIHdpbGwgYmUgYWNj
ZXB0ZWQgYnkgT3BlbkdMCisgICAgQVNTRVJUKEdMQ29tcGlsZVN1Y2Nlc3MgPT0gR0xfVFJVRSk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhJbWFnZTJEKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0LCBsb25nIGxldmVsLCB1bnNpZ25lZCBsb25nIGludGVybmFsZm9ybWF0LCBsb25n
IHgsIGxvbmcgeSwgdW5zaWduZWQgbG9uZyB3aWR0aCwgdW5zaWduZWQgbG9uZyBoZWlnaHQsIGxv
bmcgYm9yZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBpZiAo
bV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1f
bXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdf
RlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6Z2xCbGl0RnJhbWVidWZmZXJFWFQo
eCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQs
IEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgfQorICAgIDo6Z2xDb3B5
VGV4SW1hZ2UyRCh0YXJnZXQsIGxldmVsLCBpbnRlcm5hbGZvcm1hdCwgeCwgeSwgd2lkdGgsIGhl
aWdodCwgYm9yZGVyKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9
PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZS
QU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmNvcHlUZXhTdWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVs
LCBsb25nIHhvZmZzZXQsIGxvbmcgeW9mZnNldCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9ib3VuZEZCTyA9PSBt
X211bHRpc2FtcGxlRkJPKSB7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfUkVB
RF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7CisgICAgICAgIDo6
Z2xCbGl0RnJhbWVidWZmZXJFWFQoeCwgeSwgeCArIHdpZHRoLCB5ICsgaGVpZ2h0LCB4LCB5LCB4
ICsgd2lkdGgsIHkgKyBoZWlnaHQsIEdMX0NPTE9SX0JVRkZFUl9CSVQsIEdMX0xJTkVBUik7Cisg
ICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
CisgICAgfQorICAgIDo6Z2xDb3B5VGV4U3ViSW1hZ2UyRCh0YXJnZXQsIGxldmVsLCB4b2Zmc2V0
LCB5b2Zmc2V0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICBpZiAobV9hdHRycy5hbnRpYWxp
YXMgJiYgbV9ib3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKQorICAgICAgICA6OmdsQmluZEZy
YW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEN1bGxGYWNlKG1vZGUp
OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBm
dW5jKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhG
dW5jKGZ1bmMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aE1hc2soYm9vbCBm
bGFnKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGVwdGhN
YXNrKGZsYWcpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJs
ZSB6TmVhciwgZG91YmxlIHpGYXIpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgUGxhdGZvcm0z
RE9iamVjdCBzaGFkZXIpCit7CisgICAgQVNTRVJUKHByb2dyYW0pOworICAgIEFTU0VSVChzaGFk
ZXIpOworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGV0YWNoU2hh
ZGVyKChHTHVpbnQpIHByb2dyYW0sIChHTHVpbnQpIHNoYWRlcik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmRpc2FibGUodW5zaWduZWQgbG9uZyBjYXApCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEaXNhYmxlKGNhcCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGlu
ZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRGlzYWJs
ZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
ZHJhd0FycmF5cyh1bnNpZ25lZCBsb25nIG1vZGUsIGxvbmcgZmlyc3QsIGxvbmcgY291bnQpCit7
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xEcmF3QXJyYXlzKG1v
ZGUsIGZpcnN0LCBjb3VudCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmRyYXdFbGVt
ZW50cyh1bnNpZ25lZCBsb25nIG1vZGUsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxv
bmcgdHlwZSwgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xEcmF3RWxlbWVudHMobW9kZSwgY291bnQsIHR5cGUsIHJlaW50ZXJwcmV0X2Nh
c3Q8dm9pZCo+KHN0YXRpY19jYXN0PGludHB0cl90PihvZmZzZXQpKSk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmVuYWJsZSh1bnNpZ25lZCBsb25nIGNhcCkKK3sKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEVuYWJsZShjYXApOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjplbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh1bnNpZ25lZCBsb25nIGlu
ZGV4KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRW5hYmxl
VmVydGV4QXR0cmliQXJyYXkoaW5kZXgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpm
aW5pc2goKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsRmlu
aXNoKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZsdXNoKCkKK3sKKyAgICBlbnN1
cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEZsdXNoKCk7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFy
Z2V0LCB1bnNpZ25lZCBsb25nIGF0dGFjaG1lbnQsIHVuc2lnbmVkIGxvbmcgcmVuZGVyYnVmZmVy
dGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1ZmZlcikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgR0x1aW50IHJlbmRlcmJ1ZmZlciA9IChHTHVpbnQpIGJ1ZmZlcjsK
KyAgICBpZiAoYXR0YWNobWVudCA9PSBERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpIHsKKyAgICAg
ICAgOjpnbEZyYW1lYnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgREVQVEhfQVRUQUNITUVO
VCwgcmVuZGVyYnVmZmVydGFyZ2V0LCByZW5kZXJidWZmZXIpOworICAgICAgICA6OmdsRnJhbWVi
dWZmZXJSZW5kZXJidWZmZXJFWFQodGFyZ2V0LCBTVEVOQ0lMX0FUVEFDSE1FTlQsIHJlbmRlcmJ1
ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsKKyAgICB9IGVsc2UKKyAgICAgICAgOjpnbEZyYW1l
YnVmZmVyUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgYXR0YWNobWVudCwgcmVuZGVyYnVmZmVydGFy
Z2V0LCByZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpmcmFtZWJ1
ZmZlclRleHR1cmUyRCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBhdHRhY2ht
ZW50LCB1bnNpZ25lZCBsb25nIHRleHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlLCBs
b25nIGxldmVsKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
RnJhbWVidWZmZXJUZXh0dXJlMkRFWFQodGFyZ2V0LCBhdHRhY2htZW50LCB0ZXh0YXJnZXQsIChH
THVpbnQpIHRleHR1cmUsIGxldmVsKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJv
bnRGYWNlKHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbEZyb250RmFjZShtb2RlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6Z2VuZXJhdGVNaXBtYXAodW5zaWduZWQgbG9uZyB0YXJnZXQpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZW5lcmF0ZU1pcG1hcEVYVCh0YXJnZXQp
OworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBY3RpdmVBdHRyaWIoUGxhdGZvcm0z
RE9iamVjdCBwcm9ncmFtLCB1bnNpZ25lZCBsb25nIGluZGV4LCBBY3RpdmVJbmZvJiBpbmZvKQor
eworICAgIGlmICghcHJvZ3JhbSkgeworICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElE
X1ZBTFVFKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgR0xpbnQgbWF4QXR0cmlidXRlU2l6ZSA9IDA7CisgICAgOjpn
bEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dyYW0pLCBHTF9BQ1RJVkVfQVRU
UklCVVRFX01BWF9MRU5HVEgsICZtYXhBdHRyaWJ1dGVTaXplKTsKKyAgICBHTGNoYXIgbmFtZVtt
YXhBdHRyaWJ1dGVTaXplXTsgLy8gR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RIIGluY2x1
ZGVzIG51bGwgdGVybWluYXRpb24KKyAgICBHTHNpemVpIG5hbWVMZW5ndGggPSAwOworICAgIEdM
aW50IHNpemUgPSAwOworICAgIEdMZW51bSB0eXBlID0gMDsKKyAgICA6OmdsR2V0QWN0aXZlQXR0
cmliKHN0YXRpY19jYXN0PEdMdWludD4ocHJvZ3JhbSksIGluZGV4LCBtYXhBdHRyaWJ1dGVTaXpl
LCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBpZiAoIW5hbWVMZW5ndGgp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBTdHJpbmcobmFtZSwgbmFt
ZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZvLnNpemUgPSBzaXplOwor
ICAgIHJldHVybiB0cnVlOworfQorICAgIAorYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0
aXZlVW5pZm9ybShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIHVuc2lnbmVkIGxvbmcgaW5kZXgs
IEFjdGl2ZUluZm8mIGluZm8pCit7CisgICAgaWYgKCFwcm9ncmFtKSB7CisgICAgICAgIHN5bnRo
ZXNpemVHTEVycm9yKElOVkFMSURfVkFMVUUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
fQorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTGludCBtYXhVbmlmb3Jt
U2l6ZSA9IDA7CisgICAgOjpnbEdldFByb2dyYW1pdihzdGF0aWNfY2FzdDxHTHVpbnQ+KHByb2dy
YW0pLCBHTF9BQ1RJVkVfVU5JRk9STV9NQVhfTEVOR1RILCAmbWF4VW5pZm9ybVNpemUpOworICAg
IEdMY2hhciBuYW1lW21heFVuaWZvcm1TaXplXTsgLy8gR0xfQUNUSVZFX1VOSUZPUk1fTUFYX0xF
TkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCisgICAgR0xzaXplaSBuYW1lTGVuZ3RoID0g
MDsKKyAgICBHTGludCBzaXplID0gMDsKKyAgICBHTGVudW0gdHlwZSA9IDA7CisgICAgOjpnbEdl
dEFjdGl2ZVVuaWZvcm0oc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgaW5kZXgsIG1heFVu
aWZvcm1TaXplLCAmbmFtZUxlbmd0aCwgJnNpemUsICZ0eXBlLCBuYW1lKTsKKyAgICBpZiAoIW5h
bWVMZW5ndGgpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpbmZvLm5hbWUgPSBTdHJpbmco
bmFtZSwgbmFtZUxlbmd0aCk7CisgICAgaW5mby50eXBlID0gdHlwZTsKKyAgICBpbmZvLnNpemUg
PSBzaXplOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpn
ZXRBdHRhY2hlZFNoYWRlcnMoUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtLCBpbnQgbWF4Q291bnQs
IGludCogY291bnQsIHVuc2lnbmVkIGludCogc2hhZGVycykKK3sKKyAgICBpZiAoIXByb2dyYW0p
IHsKKyAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xH
ZXRBdHRhY2hlZFNoYWRlcnMoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgbWF4Q291bnQs
IGNvdW50LCBzaGFkZXJzKTsKK30KKworaW50IEdyYXBoaWNzQ29udGV4dDNEOjpnZXRBdHRyaWJM
b2NhdGlvbihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0sIGNvbnN0IFN0cmluZyYgbmFtZSkKK3sK
KyAgICBpZiAoIXByb2dyYW0pCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xHZXRBdHRyaWJMb2NhdGlvbigo
R0x1aW50KSBwcm9ncmFtLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOworfQorCitHcmFwaGljc0NvbnRl
eHQzRDo6QXR0cmlidXRlcyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0Q29udGV4dEF0dHJpYnV0ZXMo
KQoreworICAgIHJldHVybiBtX2F0dHJzOworfQorCit1bnNpZ25lZCBsb25nIEdyYXBoaWNzQ29u
dGV4dDNEOjpnZXRFcnJvcigpCit7CisgICAgaWYgKG1fc3ludGhldGljRXJyb3JzLnNpemUoKSA+
IDApIHsKKyAgICAgICAgTGlzdEhhc2hTZXQ8dW5zaWduZWQgbG9uZz46Oml0ZXJhdG9yIGl0ZXIg
PSBtX3N5bnRoZXRpY0Vycm9ycy5iZWdpbigpOworICAgICAgICB1bnNpZ25lZCBsb25nIGVyciA9
ICppdGVyOworICAgICAgICBtX3N5bnRoZXRpY0Vycm9ycy5yZW1vdmUoaXRlcik7CisgICAgICAg
IHJldHVybiBlcnI7CisgICAgfQorCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIHJldHVybiA6OmdsR2V0RXJyb3IoKTsKK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRTdHJpbmcodW5zaWduZWQgbG9uZyBuYW1lKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICByZXR1cm4gU3RyaW5nKChjb25zdCBjaGFyKikgOjpnbEdldFN0cmlu
ZyhuYW1lKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmhpbnQodW5zaWduZWQgbG9u
ZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgbW9kZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbEhpbnQodGFyZ2V0LCBtb2RlKTsKK30KKworYm9vbCBHcmFwaGlj
c0NvbnRleHQzRDo6aXNCdWZmZXIoUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCit7CisgICAgaWYg
KCFidWZmZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc0J1ZmZlcigoR0x1aW50KSBidWZmZXIp
OworfQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0VuYWJsZWQodW5zaWduZWQgbG9uZyBj
YXApCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6Omds
SXNFbmFibGVkKGNhcCk7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzRnJhbWVidWZm
ZXIoUGxhdGZvcm0zRE9iamVjdCBmcmFtZWJ1ZmZlcikKK3sKKyAgICBpZiAoIWZyYW1lYnVmZmVy
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIHJldHVybiA6OmdsSXNGcmFtZWJ1ZmZlckVYVCgoR0x1aW50KSBmcmFtZWJ1
ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm9ybTNE
T2JqZWN0IHByb2dyYW0pCit7CisgICAgaWYgKCFwcm9ncmFtKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIHJldHVybiA6
OmdsSXNQcm9ncmFtKChHTHVpbnQpIHByb2dyYW0pOworfQorCitib29sIEdyYXBoaWNzQ29udGV4
dDNEOjppc1JlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0IHJlbmRlcmJ1ZmZlcikKK3sKKyAg
ICBpZiAoIXJlbmRlcmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gOjpnbElzUmVuZGVyYnVmZmVy
RVhUKChHTHVpbnQpIHJlbmRlcmJ1ZmZlcik7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmlzU2hhZGVyKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVyKQoreworICAgIGlmICghc2hhZGVyKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKK30KKworYm9v
bCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSkK
K3sKKyAgICBpZiAoIXRleHR1cmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgcmV0dXJuIDo6Z2xJc1RleHR1cmUoKEdM
dWludCkgdGV4dHVyZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmxpbmVXaWR0aChk
b3VibGUgd2lkdGgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6
Z2xMaW5lV2lkdGgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZHRoKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OmxpbmtQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKK3sKKyAg
ICBBU1NFUlQocHJvZ3JhbSk7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IDo6Z2xMaW5rUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cGl4ZWxTdG9yZWkodW5zaWduZWQgbG9uZyBwbmFtZSwgbG9uZyBwYXJhbSkKK3sK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFBpeGVsU3RvcmVpKHBu
YW1lLCBwYXJhbSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBvbHlnb25PZmZzZXQo
ZG91YmxlIGZhY3RvciwgZG91YmxlIHVuaXRzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsUG9seWdvbk9mZnNldChzdGF0aWNfY2FzdDxmbG9hdD4oZmFjdG9y
KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHVuaXRzKSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
M0Q6OnJlYWRQaXhlbHMobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0LCB1bnNpZ25lZCBsb25nIGZvcm1hdCwgdW5zaWduZWQgbG9uZyB0eXBl
LCB2b2lkKiBkYXRhKQoreworICAgIC8vIEZJWE1FOiByZW1vdmUgdGhlIHR3byBnbEZsdXNoIGNh
bGxzIHdoZW4gdGhlIGRyaXZlciBidWcgaXMgZml4ZWQsIGkuZS4sCisgICAgLy8gYWxsIHByZXZp
b3VzIHJlbmRlcmluZyBjYWxscyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgcmVhZGluZyBwaXhlbHMu
CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xGbHVzaCgpOworICAg
IGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8p
IHsKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VY
VCwgbV9tdWx0aXNhbXBsZUZCTyk7CisgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xf
RFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEJsaXRGcmFtZWJ1ZmZl
ckVYVCh4LCB5LCB4ICsgd2lkdGgsIHkgKyBoZWlnaHQsIHgsIHksIHggKyB3aWR0aCwgeSArIGhl
aWdodCwgR0xfQ09MT1JfQlVGRkVSX0JJVCwgR0xfTElORUFSKTsKKyAgICAgICAgOjpnbEJpbmRG
cmFtZWJ1ZmZlckVYVChHTF9GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKKyAgICAgICAgOjpnbEZs
dXNoKCk7CisgICAgfQorICAgIDo6Z2xSZWFkUGl4ZWxzKHgsIHksIHdpZHRoLCBoZWlnaHQsIGZv
cm1hdCwgdHlwZSwgZGF0YSk7CisgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzICYmIG1fYm91bmRG
Qk8gPT0gbV9tdWx0aXNhbXBsZUZCTykKKyAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChH
TF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpyZWxlYXNlU2hhZGVyQ29tcGlsZXIoKQoreworICAgIC8vIEZJWE1FOiBUaGlz
IGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBkZXNrdG9wIE9wZW5HTC4gV2UgbmVlZCB0byBoYXZlIGlm
ZGVmcyBmb3IgdGhlIGRpZmZlcmVudCBHTCB2YXJpYW50cworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICAvLzo6Z2xSZWxlYXNlU2hhZGVyQ29tcGlsZXIoKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6cmVuZGVyYnVmZmVyU3RvcmFnZSh1bnNpZ25lZCBsb25nIHRh
cmdldCwgdW5zaWduZWQgbG9uZyBpbnRlcm5hbGZvcm1hdCwgdW5zaWduZWQgbG9uZyB3aWR0aCwg
dW5zaWduZWQgbG9uZyBoZWlnaHQpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIHN3aXRjaCAoaW50ZXJuYWxmb3JtYXQpIHsKKyAgICBjYXNlIERFUFRIX1NURU5DSUw6
CisgICAgICAgIGludGVybmFsZm9ybWF0ID0gR0xfREVQVEgyNF9TVEVOQ0lMOF9FWFQ7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgREVQVEhfQ09NUE9ORU5UMTY6CisgICAgICAgIGludGVybmFs
Zm9ybWF0ID0gR0xfREVQVEhfQ09NUE9ORU5UOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJH
QkE0OgorICAgIGNhc2UgUkdCNV9BMToKKyAgICAgICAgaW50ZXJuYWxmb3JtYXQgPSBHTF9SR0JB
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJHQjU2NToKKyAgICAgICAgaW50ZXJuYWxmb3Jt
YXQgPSBHTF9SR0I7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICA6OmdsUmVuZGVyYnVmZmVy
U3RvcmFnZUVYVCh0YXJnZXQsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292ZXJhZ2UoZG91YmxlIHZhbHVlLCBib29s
IGludmVydCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFNh
bXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZSksIGludmVydCk7Cit9CisKK3Zv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3IobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hh
ZGVyLCBjb25zdCBTdHJpbmcmIHN0cmluZykKK3sKKyAgICBBU1NFUlQoc2hhZGVyKTsKKyAgICAK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBTaGFkZXJTb3VyY2VFbnRy
eSBlbnRyeTsKKworICAgIGVudHJ5LnNvdXJjZSA9IHN0cmluZzsKKworICAgIG1fc2hhZGVyU291
cmNlTWFwLnNldChzaGFkZXIsIGVudHJ5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
c3RlbmNpbEZ1bmModW5zaWduZWQgbG9uZyBmdW5jLCBsb25nIHJlZiwgdW5zaWduZWQgbG9uZyBt
YXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNp
bEZ1bmMoZnVuYywgcmVmLCBtYXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3Rl
bmNpbEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZnVuYywg
bG9uZyByZWYsIHVuc2lnbmVkIGxvbmcgbWFzaykKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgOjpnbFN0ZW5jaWxGdW5jU2VwYXJhdGUoZmFjZSwgZnVuYywgcmVmLCBt
YXNrKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3RlbmNpbE1hc2sodW5zaWduZWQg
bG9uZyBtYXNrKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
U3RlbmNpbE1hc2sobWFzayk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxN
YXNrU2VwYXJhdGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIG1hc2spCit7Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xTdGVuY2lsTWFza1NlcGFy
YXRlKGZhY2UsIG1hc2spOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3Ao
dW5zaWduZWQgbG9uZyBmYWlsLCB1bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpw
YXNzKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNp
bE9wKGZhaWwsIHpmYWlsLCB6cGFzcyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0
ZW5jaWxPcFNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBmYWlsLCB1
bnNpZ25lZCBsb25nIHpmYWlsLCB1bnNpZ25lZCBsb25nIHpwYXNzKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsU3RlbmNpbE9wU2VwYXJhdGUoZmFjZSwgZmFp
bCwgemZhaWwsIHpwYXNzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dGV4UGFyYW1l
dGVyZih1bnNpZ25lZCB0YXJnZXQsIHVuc2lnbmVkIHBuYW1lLCBmbG9hdCB2YWx1ZSkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFRleFBhcmFtZXRlcmYodGFy
Z2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnRleFBhcmFtZXRlcmkodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFt
ZSwgaW50IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsVGV4UGFyYW1ldGVyaSh0YXJnZXQsIHBuYW1lLCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUp
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFmKGxvbmcgbG9jYXRpb24s
IGZsb2F0IHYwKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6Omds
VW5pZm9ybTFmKGxvY2F0aW9uLCB2MCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVu
aWZvcm0xZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0xZnYobG9jYXRpb24s
IHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmKGxv
bmcgbG9jYXRpb24sIGZsb2F0IHYwLCBmbG9hdCB2MSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yZihsb2NhdGlvbiwgdjAsIHYxKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJmdihsb25nIGxvY2F0aW9uLCBmbG9hdCog
YXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBt
dWx0aXBsZSBvZiAyCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xV
bmlmb3JtMmZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OnVuaWZvcm0zZihsb25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0
IHYyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9y
bTNmKGxvY2F0aW9uLCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
dW5pZm9ybTNmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBzaXplKQoreworICAg
IC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2Z2KGxvY2F0aW9uLCBzaXpl
LCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00Zihsb25nIGxv
Y2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00Zihsb2NhdGlvbiwg
djAsIHYxLCB2MiwgdjMpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGZ2
KGxvbmcgbG9jYXRpb24sIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCit7CisgICAgLy8gRklYTUU6
IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm00ZnYobG9jYXRpb24sIHNpemUsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTFpKGxvbmcgbG9jYXRpb24sIGlu
dCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZv
cm0xaShsb2NhdGlvbiwgdjApOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3Jt
MWl2KGxvbmcgbG9jYXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTFpdihsb2NhdGlvbiwgc2l6ZSwg
YXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMmkobG9uZyBsb2Nh
dGlvbiwgaW50IHYwLCBpbnQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xVbmlmb3JtMmkobG9jYXRpb24sIHYwLCB2MSk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVuaWZvcm0yaXYobG9uZyBsb2NhdGlvbiwgaW50KiBhcnJheSwgaW50IHNp
emUpCit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDIK
KyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFVuaWZvcm0yaXYobG9j
YXRpb24sIHNpemUsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTNpKGxvbmcgbG9jYXRpb24sIGludCB2MCwgaW50IHYxLCBpbnQgdjIpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtM2kobG9jYXRpb24sIHYwLCB2
MSwgdjIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtM2l2KGxvbmcgbG9j
YXRpb24sIGludCogYXJyYXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVl
ZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAzCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xVbmlmb3JtM2l2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aShsb25nIGxvY2F0aW9uLCBpbnQgdjAsIGludCB2
MSwgaW50IHYyLCBpbnQgdjMpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIDo6Z2xVbmlmb3JtNGkobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTRpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBp
bnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUg
b2YgNAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybTRp
dihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1
bmlmb3JtTWF0cml4MmZ2KGxvbmcgbG9jYXRpb24sIGJvb2wgdHJhbnNwb3NlLCBmbG9hdCogYXJy
YXksIGludCBzaXplKQoreworICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0
aXBsZSBvZiA0CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlm
b3JtTWF0cml4MmZ2KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDNmdihsb25nIGxvY2F0aW9uLCBib29s
IHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKK3sKKyAgICAvLyBGSVhNRTogbGVu
Z3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgOQorICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICA6OmdsVW5pZm9ybU1hdHJpeDNmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNw
b3NlLCBhcnJheSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXg0
ZnYobG9uZyBsb2NhdGlvbiwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUp
Cit7CisgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDE2Cisg
ICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVbmlmb3JtTWF0cml4NGZ2
KGxvY2F0aW9uLCBzaXplLCB0cmFuc3Bvc2UsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dXNlUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xVc2VQcm9ncmFtKChHTHVpbnQpIHBy
b2dyYW0pOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZVByb2dyYW0oUGxh
dGZvcm0zRE9iamVjdCBwcm9ncmFtKQoreworICAgIEFTU0VSVChwcm9ncmFtKTsKKyAgICAKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZhbGlkYXRlUHJvZ3JhbSgo
R0x1aW50KSBwcm9ncmFtKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliMWYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKK3sKKyAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjFmKGluZHgsIHYwKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5k
eCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKK30KKwordm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxv
YXQgdjEpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0
ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2
ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCogYXJyYXkpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5k
eCwgYXJyYXkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1
bnNpZ25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4
LCB2MCwgdjEsIHYyKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmli
M2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9u
ZyBpbmR4LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKK3sKKyAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbFZlcnRleEF0dHJpYjRmKGluZHgs
IHYwLCB2MSwgdjIsIHYzKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0
cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQoreworICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5
KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNp
Z25lZCBsb25nIGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNp
Z25lZCBsb25nIHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xWZXJ0ZXhBdHRyaWJQb2ludGVyKGluZHgsIHNp
emUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oc3Rh
dGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVk
IGxvbmcgaGVpZ2h0KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6
OmdsVmlld3BvcnQoc3RhdGljX2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSks
IHN0YXRpY19jYXN0PEdMc2l6ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0
KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxv
bmcgcG5hbWUsIHVuc2lnbmVkIGNoYXIqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZhbHVlKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0
YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQs
IHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1
bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9hdCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZhbHVlKTsKK30KKwordm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQorICAg
ICAgICBhdHRhY2htZW50ID0gREVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hN
RU5ULCBlaXRoZXIgd29ya3MuCisgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFt
ZXRlcml2RVhUKHRhcmdldCwgYXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6Z2V0SW50ZWdlcnYodW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2
YWx1ZSkKK3sKKyAgICAvLyBOZWVkIHRvIGVtdWxhdGUgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVB
RF9GT1JNQVQvVFlQRSBmb3IgR0wuICBBbnkgdmFsaWQKKyAgICAvLyBjb21iaW5hdGlvbiBzaG91
bGQgd29yaywgYnV0IEdMX1JHQi9HTF9VTlNJR05FRF9CWVRFIG1pZ2h0IGJlIHRoZSBtb3N0Cisg
ICAgLy8gdXNlZnVsIGZvciBkZXNrdG9wIFdlYkdMIHVzZXJzLgorICAgIC8vIE5lZWQgdG8gZW11
bGF0ZSBNQVhfRlJBR01FTlQvVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyBhbmQgTUFYX1ZBUllJTkdf
VkVDVE9SUworICAgIC8vIGJlY2F1c2UgZGVza3RvcCBHTCdzIGNvcnJlc3BvbmRpbmcgcXVlcmll
cyByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzCisgICAgLy8gd2hlcmVhcyBHTEVTMiBy
ZXR1cm4gdGhlIG51bWJlciBvZiB2ZWN0b3JzIChlYWNoIHZlY3RvciBoYXMgNCBjb21wb25lbnRz
KS4KKyAgICAvLyBUaGVyZWZvcmUsIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBkZXNrdG9wIEdMIG5l
ZWRzIHRvIGJlIGRpdmlkZWQgYnkgNC4KKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgc3dpdGNoIChwbmFtZSkgeworICAgIGNhc2UgSU1QTEVNRU5UQVRJT05fQ09MT1JfUkVB
RF9GT1JNQVQ6CisgICAgICAgICp2YWx1ZSA9IEdMX1JHQjsKKyAgICAgICAgYnJlYWs7CisgICAg
Y2FzZSBJTVBMRU1FTlRBVElPTl9DT0xPUl9SRUFEX1RZUEU6CisgICAgICAgICp2YWx1ZSA9IEdM
X1VOU0lHTkVEX0JZVEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFYX0ZSQUdNRU5UX1VO
SUZPUk1fVkVDVE9SUzoKKyAgICAgICAgOjpnbEdldEludGVnZXJ2KEdMX01BWF9GUkFHTUVOVF9V
TklGT1JNX0NPTVBPTkVOVFMsIHZhbHVlKTsKKyAgICAgICAgKnZhbHVlIC89IDQ7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgTUFYX1ZFUlRFWF9VTklGT1JNX1ZFQ1RPUlM6CisgICAgICAgIDo6
Z2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VOSUZPUk1fQ09NUE9ORU5UUywgdmFsdWUpOwor
ICAgICAgICAqdmFsdWUgLz0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNQVhfVkFSWUlO
R19WRUNUT1JTOgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYoR0xfTUFYX1ZBUllJTkdfRkxPQVRT
LCB2YWx1ZSk7CisgICAgICAgICp2YWx1ZSAvPSA0OworICAgICAgICBicmVhazsKKyAgICBkZWZh
dWx0OgorICAgICAgICA6OmdsR2V0SW50ZWdlcnYocG5hbWUsIHZhbHVlKTsKKyAgICB9Cit9CisK
K3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFByb2dyYW1pdihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIDo6Z2xHZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3Jh
bSwgcG5hbWUsIHZhbHVlKTsKK30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRQcm9n
cmFtSW5mb0xvZyhQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCit7CisgICAgQVNTRVJUKHByb2dy
YW0pOworICAgIAorICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBHTGludCBs
ZW5ndGg7CisgICAgOjpnbEdldFByb2dyYW1pdigoR0x1aW50KSBwcm9ncmFtLCBHTF9JTkZPX0xP
R19MRU5HVEgsICZsZW5ndGgpOworICAgIAorICAgIEdMc2l6ZWkgc2l6ZTsKKyAgICBHTGNoYXIq
IGluZm8gPSAoR0xjaGFyKikgZmFzdE1hbGxvYyhsZW5ndGgpOworICAgIGlmICghaW5mbykKKyAg
ICAgICAgcmV0dXJuICIiOworCisgICAgOjpnbEdldFByb2dyYW1JbmZvTG9nKChHTHVpbnQpIHBy
b2dyYW0sIGxlbmd0aCwgJnNpemUsIGluZm8pOworICAgIFN0cmluZyBzKGluZm8pOworICAgIGZh
c3RGcmVlKGluZm8pOworICAgIHJldHVybiBzOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRSZW5kZXJidWZmZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWdu
ZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4
dE9iaik7CisgICAgOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhUKHRhcmdldCwgcG5h
bWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyaXYoUGxh
dGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCit7
CisgICAgQVNTRVJUKHNoYWRlcik7CisgICAgCisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIAorICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVjdCwgU2hhZGVyU291cmNlRW50
cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1hcC5maW5kKHNoYWRlcik7Cisg
ICAgCisgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIERFTEVURV9TVEFUVVM6Cisg
ICAgICAgIGNhc2UgU0hBREVSX1RZUEU6CisgICAgICAgICAgICAvLyBMZXQgT3BlbkdMIGhhbmRs
ZSB0aGVzZS4KKyAgICAgICAgCisgICAgICAgICAgICA6OmdsR2V0U2hhZGVyaXYoKEdMdWludCkg
c2hhZGVyLCBwbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2Fz
ZSBDT01QSUxFX1NUQVRVUzoKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbV9zaGFkZXJTb3Vy
Y2VNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAoKnZhbHVlKSA9IHN0YXRpY19jYXN0PGlu
dD4oZmFsc2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgICgqdmFsdWUpID0gc3RhdGljX2Nhc3Q8aW50PihyZXN1
bHQtPnNlY29uZC5pc1ZhbGlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgCisg
ICAgICAgIGNhc2UgSU5GT19MT0dfTEVOR1RIOgorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBt
X3NoYWRlclNvdXJjZU1hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgICgqdmFsdWUpID0gMDsK
KyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpLmxlbmd0aCgpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBTSEFERVJfU09V
UkNFX0xFTkdUSDoKKyAgICAgICAgICAgICgqdmFsdWUpID0gZ2V0U2hhZGVyU291cmNlKHNoYWRl
cikubGVuZ3RoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgICAgIGRlZmF1
bHQ6CisgICAgICAgICAgICBzeW50aGVzaXplR0xFcnJvcihJTlZBTElEX0VOVU0pOworICAgIH0K
K30KKworU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJJbmZvTG9nKFBsYXRmb3Jt
M0RPYmplY3Qgc2hhZGVyKQoreworICAgIEFTU0VSVChzaGFkZXIpOworCisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMaW50IGxlbmd0aDsKKyAgICA6OmdsR2V0U2hhZGVy
aXYoKEdMdWludCkgc2hhZGVyLCBHTF9JTkZPX0xPR19MRU5HVEgsICZsZW5ndGgpOworCisgICAg
SGFzaE1hcDxQbGF0Zm9ybTNET2JqZWN0LCBTaGFkZXJTb3VyY2VFbnRyeT46Oml0ZXJhdG9yIHJl
c3VsdCA9IG1fc2hhZGVyU291cmNlTWFwLmZpbmQoc2hhZGVyKTsKKworICAgIGlmIChyZXN1bHQg
PT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpCisgICAgICAgICByZXR1cm4gIiI7CisKKyAgICAg
U2hhZGVyU291cmNlRW50cnkgZW50cnkgPSByZXN1bHQtPnNlY29uZDsKKworICAgICBpZiAoZW50
cnkuaXNWYWxpZCkgeworICAgICAgICAgR0xpbnQgbGVuZ3RoOworICAgICAgICAgOjpnbEdldFNo
YWRlcml2KChHTHVpbnQpIHNoYWRlciwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3RoKTsKKwor
ICAgICAgICAgR0xzaXplaSBzaXplOworICAgICAgICAgR0xjaGFyKiBpbmZvID0gKEdMY2hhciop
IGZhc3RNYWxsb2MobGVuZ3RoKTsKKyAgICAgICAgIGlmICghaW5mbykKKyAgICAgICAgICAgICBy
ZXR1cm4gIiI7CisKKyAgICAgICAgIDo6Z2xHZXRTaGFkZXJJbmZvTG9nKChHTHVpbnQpIHNoYWRl
ciwgbGVuZ3RoLCAmc2l6ZSwgaW5mbyk7CisKKyAgICAgICAgIFN0cmluZyBzKGluZm8pOworICAg
ICAgICAgZmFzdEZyZWUoaW5mbyk7CisgICAgICAgICByZXR1cm4gczsKKyAgICAgfQorICAgICBl
bHNlIHsKKyAgICAgICAgIHJldHVybiBlbnRyeS5sb2c7CisgICAgIH0KK30KKworU3RyaW5nIEdy
YXBoaWNzQ29udGV4dDNEOjpnZXRTaGFkZXJTb3VyY2UoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIp
Cit7CisgICAgQVNTRVJUKHNoYWRlcik7CisKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisKKyAgICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6
aXRlcmF0b3IgcmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOworCisgICAg
aWYgKHJlc3VsdCA9PSBtX3NoYWRlclNvdXJjZU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuICIi
OworCisgICAgcmV0dXJuIHJlc3VsdC0+c2Vjb25kLnNvdXJjZTsKK30KKworCit2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBwbmFtZSwgdmFs
dWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0ZXJpdih1bnNp
Z25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgOjpnbEdldFRleFBhcmFtZXRlcml2
KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
VW5pZm9ybWZ2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQq
IHZhbHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0
VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0s
IGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRl
eHRPYmopOworICAgIDo6Z2xHZXRVbmlmb3JtaXYoKEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24s
IHZhbHVlKTsKK30KKworbG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybUxvY2F0aW9u
KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgY29uc3QgU3RyaW5nJiBuYW1lKQoreworICAgIEFT
U0VSVChwcm9ncmFtKTsKKyAgICAKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgcmV0dXJuIDo6Z2xHZXRVbmlmb3JtTG9jYXRpb24oKEdMdWludCkgcHJvZ3JhbSwgbmFtZS51
dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0
cmliZnYodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgZmxvYXQqIHZh
bHVlKQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICA6OmdsR2V0VmVy
dGV4QXR0cmliZnYoaW5kZXgsIHBuYW1lLCB2YWx1ZSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFZlcnRleEF0dHJpYml2KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxv
bmcgcG5hbWUsIGludCogdmFsdWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJpdihpbmRleCwgcG5hbWUsIHZhbHVlKTsKK30KKwor
bG9uZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliT2Zmc2V0KHVuc2lnbmVkIGxv
bmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgcG5hbWUpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIAorICAgIHZvaWQqIHBvaW50ZXI7CisgICAgOjpnbEdldFZlcnRleEF0
dHJpYlBvaW50ZXJ2KGluZGV4LCBwbmFtZSwgJnBvaW50ZXIpOworICAgIHJldHVybiByZWludGVy
cHJldF9jYXN0PGxvbmc+KHBvaW50ZXIpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eEltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQgaW50ZXJu
YWxmb3JtYXQsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWlnaHQsIHVuc2lnbmVkIGJvcmRl
ciwgdW5zaWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgOjpnbFRleEltYWdlMkQodGFyZ2V0
LCBsZXZlbCwgaW50ZXJuYWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGJvcmRlciwgZm9ybWF0LCB0
eXBlLCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6
OnRleFN1YkltYWdlMkQodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBsZXZlbCwgdW5zaWduZWQg
eG9mZiwgdW5zaWduZWQgeW9mZiwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5z
aWduZWQgZm9ybWF0LCB1bnNpZ25lZCB0eXBlLCB2b2lkKiBwaXhlbHMpCit7CisgICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworCisgICAgLy8gRklYTUU6IHdlIHdpbGwgbmVlZCB0byBk
ZWFsIHdpdGggUGl4ZWxTdG9yZSBwYXJhbXMgd2hlbiBkZWFsaW5nIHdpdGggaW1hZ2UgYnVmZmVy
cyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzdWJpbWFnZSBzaXplCisgICAgOjpnbFRleFN1YkltYWdl
MkQodGFyZ2V0LCBsZXZlbCwgeG9mZiwgeW9mZiwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB0eXBl
LCBwaXhlbHMpOworICAgIHJldHVybiAwOworfQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQz
RDo6Y3JlYXRlQnVmZmVyKCkKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgR0x1aW50IG87CisgICAgZ2xHZW5CdWZmZXJzKDEsICZvKTsKKyAgICByZXR1cm4gbzsKK30K
KwordW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUZyYW1lYnVmZmVyKCkKK3sKKyAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgR0x1aW50IG87CisgICAgZ2xHZW5G
cmFtZWJ1ZmZlcnNFWFQoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit1bnNpZ25lZCBHcmFw
aGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgpCit7CisgICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIHJldHVybiBnbENyZWF0ZVByb2dyYW0oKTsKK30KKwordW5zaWduZWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcigpCit7CisgICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuUmVuZGVyYnVmZmVy
c0VYVCgxLCAmbyk7CisgICAgcmV0dXJuIG87Cit9CisKK3Vuc2lnbmVkIEdyYXBoaWNzQ29udGV4
dDNEOjpjcmVhdGVTaGFkZXIodW5zaWduZWQgbG9uZyB0eXBlKQoreworICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICByZXR1cm4gZ2xDcmVhdGVTaGFkZXIoKHR5cGUgPT0gRlJB
R01FTlRfU0hBREVSKSA/IEdMX0ZSQUdNRU5UX1NIQURFUiA6IEdMX1ZFUlRFWF9TSEFERVIpOwor
fQorCit1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlVGV4dHVyZSgpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIEdMdWludCBvOworICAgIGdsR2VuVGV4
dHVyZXMoMSwgJm8pOworICAgIHJldHVybiBvOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVCdWZmZXIodW5zaWduZWQgYnVmZmVyKQoreworICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUJ1ZmZlcnMoMSwgJmJ1ZmZlcik7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmRlbGV0ZUZyYW1lYnVmZmVyKHVuc2lnbmVkIGZyYW1lYnVmZmVy
KQoreworICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZUZyYW1l
YnVmZmVyc0VYVCgxLCAmZnJhbWVidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpkZWxldGVQcm9ncmFtKHVuc2lnbmVkIHByb2dyYW0pCit7CisgICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlUHJvZ3JhbShwcm9ncmFtKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUmVuZGVyYnVmZmVyKHVuc2lnbmVkIHJlbmRlcmJ1ZmZl
cikKK3sKKyAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgZ2xEZWxldGVSZW5k
ZXJidWZmZXJzRVhUKDEsICZyZW5kZXJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpkZWxldGVTaGFkZXIodW5zaWduZWQgc2hhZGVyKQoreworICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBnbERlbGV0ZVNoYWRlcihzaGFkZXIpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZWxldGVUZXh0dXJlKHVuc2lnbmVkIHRleHR1cmUpCit7CisgICAg
ZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIGdsRGVsZXRlVGV4dHVyZXMoMSwgJnRl
eHR1cmUpOworfQorCitpbnQgR3JhcGhpY3NDb250ZXh0M0Q6OnNpemVJbkJ5dGVzKGludCB0eXBl
KQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEdMX0JZVEU6CisgICAgICAg
ICAgICByZXR1cm4gc2l6ZW9mKEdMYnl0ZSk7CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfQllU
RToKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoR0x1Ynl0ZSk7CisgICAgICAgIGNhc2UgR0xf
U0hPUlQ6CisgICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEdMc2hvcnQpOworICAgICAgICBjYXNl
IEdMX1VOU0lHTkVEX1NIT1JUOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTHVzaG9ydCk7
CisgICAgICAgIGNhc2UgR0xfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVvZihHTGludCk7
CisgICAgICAgIGNhc2UgR0xfVU5TSUdORURfSU5UOgorICAgICAgICAgICAgcmV0dXJuIHNpemVv
ZihHTHVpbnQpOworICAgICAgICBjYXNlIEdMX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIHNp
emVvZihHTGZsb2F0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOwor
ICAgIH0KK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c3ludGhlc2l6ZUdMRXJyb3IodW5z
aWduZWQgbG9uZyBlcnJvcikKK3sKKyAgICBtX3N5bnRoZXRpY0Vycm9ycy5hZGQoZXJyb3IpOwor
fQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoM0RfQ0FOVkFTKQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9vcGVuZ2wvR3JhcGhpY3NDb250ZXh0M0RPcGVuR0wuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3BlbmdsL0dyYXBoaWNzQ29udGV4dDNE
T3BlbkdMLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvb3Bl
bmdsL0dyYXBoaWNzQ29udGV4dDNET3BlbkdMLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsx
LDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMjksOCArMjksNiBAQAog
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKIAotI2ltcG9ydCAiQmxvY2tFeGNlcHRp
b25zLmgiCi0KICNpbmNsdWRlICJBcnJheUJ1ZmZlci5oIgogI2luY2x1ZGUgIkFycmF5QnVmZmVy
Vmlldy5oIgogI2luY2x1ZGUgIldlYkdMT2JqZWN0LmgiCkBAIC00MiwxOTMgKzQwLDE2IEBACiAj
aW5jbHVkZSAiSW50MzJBcnJheS5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5j
bHVkZSAiVWludDhBcnJheS5oIgotI2luY2x1ZGUgIldlYkdMTGF5ZXIuaCIKLSNpbmNsdWRlIDxD
b3JlR3JhcGhpY3MvQ0dCaXRtYXBDb250ZXh0Lmg+Ci0jaW5jbHVkZSA8T3BlbkdML0NHTFJlbmRl
cmVycy5oPgorCisjaWYgUExBVEZPUk0oTUFDKQogI2luY2x1ZGUgPE9wZW5HTC9nbC5oPgorI2Vu
ZGlmCisKICNpbmNsdWRlIDx3dGYvVW51c2VkUGFyYW0uaD4KICNpbmNsdWRlIDx3dGYvdGV4dC9D
U3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotc3RhdGljIHZvaWQgc2V0UGl4ZWxG
b3JtYXQoVmVjdG9yPENHTFBpeGVsRm9ybWF0QXR0cmlidXRlPiYgYXR0cmlicywgaW50IGNvbG9y
Qml0cywgaW50IGRlcHRoQml0cywgYm9vbCBhY2NlbGVyYXRlZCwgYm9vbCBzdXBlcnNhbXBsZSwg
Ym9vbCBjbG9zZXN0KQotewotICAgIGF0dHJpYnMuY2xlYXIoKTsKLSAgICAKLSAgICBhdHRyaWJz
LmFwcGVuZChrQ0dMUEZBQ29sb3JTaXplKTsKLSAgICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2Fz
dDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oY29sb3JCaXRzKSk7Ci0gICAgYXR0cmlicy5hcHBl
bmQoa0NHTFBGQURlcHRoU2l6ZSk7Ci0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8Q0dM
UGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KGRlcHRoQml0cykpOwotICAgIAotICAgIGlmIChhY2NlbGVy
YXRlZCkKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQUFjY2VsZXJhdGVkKTsKLSAgICBl
bHNlIHsKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVJlbmRlcmVySUQpOwotICAgICAg
ICBhdHRyaWJzLmFwcGVuZChzdGF0aWNfY2FzdDxDR0xQaXhlbEZvcm1hdEF0dHJpYnV0ZT4oa0NH
TFJlbmRlcmVyR2VuZXJpY0Zsb2F0SUQpKTsKLSAgICB9Ci0gICAgICAgIAotICAgIGlmIChzdXBl
cnNhbXBsZSkKLSAgICAgICAgYXR0cmlicy5hcHBlbmQoa0NHTFBGQVN1cGVyc2FtcGxlKTsKLSAg
ICAgICAgCi0gICAgaWYgKGNsb3Nlc3QpCi0gICAgICAgIGF0dHJpYnMuYXBwZW5kKGtDR0xQRkFD
bG9zZXN0UG9saWN5KTsKLSAgICAgICAgCi0gICAgYXR0cmlicy5hcHBlbmQoc3RhdGljX2Nhc3Q8
Q0dMUGl4ZWxGb3JtYXRBdHRyaWJ1dGU+KDApKTsKLX0KLQotUGFzc093blB0cjxHcmFwaGljc0Nv
bnRleHQzRD4gR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0
cmlidXRlcyBhdHRycywgSG9zdFdpbmRvdyogaG9zdFdpbmRvdykKLXsKLSAgICBPd25QdHI8R3Jh
cGhpY3NDb250ZXh0M0Q+IGNvbnRleHQobmV3IEdyYXBoaWNzQ29udGV4dDNEKGF0dHJzLCBob3N0
V2luZG93KSk7Ci0gICAgcmV0dXJuIGNvbnRleHQtPm1fY29udGV4dE9iaiA/IGNvbnRleHQucmVs
ZWFzZSgpIDogMDsKLX0KLQotR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdy
YXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0dHJzLCBIb3N0V2luZG93KiBob3N0V2luZG93
KQotICAgIDogbV9jdXJyZW50V2lkdGgoMCkKLSAgICAsIG1fY3VycmVudEhlaWdodCgwKQotICAg
ICwgbV9hdHRycyhhdHRycykKLSAgICAsIG1fY29udGV4dE9iaigwKQotICAgICwgbV90ZXh0dXJl
KDApCi0gICAgLCBtX2ZibygwKQotICAgICwgbV9kZXB0aFN0ZW5jaWxCdWZmZXIoMCkKLSAgICAs
IG1fYm91bmRGQk8oMCkKLSAgICAsIG1fbXVsdGlzYW1wbGVGQk8oMCkKLSAgICAsIG1fbXVsdGlz
YW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIoMCkKLSAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZl
cigwKQotewotICAgIFVOVVNFRF9QQVJBTShob3N0V2luZG93KTsKLQotICAgIFZlY3RvcjxDR0xQ
aXhlbEZvcm1hdEF0dHJpYnV0ZT4gYXR0cmliczsKLSAgICBDR0xQaXhlbEZvcm1hdE9iaiBwaXhl
bEZvcm1hdE9iaiA9IDA7Ci0gICAgR0xpbnQgbnVtUGl4ZWxGb3JtYXRzID0gMDsKLSAgICAKLSAg
ICAvLyBXZSB3aWxsIHRyeToKLSAgICAvLwotICAgIC8vICAxKSAzMiBiaXQgUkdCQS8zMiBiaXQg
ZGVwdGgvYWNjZWxlcmF0ZWQvc3VwZXJzYW1wbGVkCi0gICAgLy8gIDIpIDMyIGJpdCBSR0JBLzMy
IGJpdCBkZXB0aC9hY2NlbGVyYXRlZAotICAgIC8vICAzKSAzMiBiaXQgUkdCQS8xNiBiaXQgZGVw
dGgvYWNjZWxlcmF0ZWQKLSAgICAvLyAgNCkgY2xvc2VzdCB0byAzMiBiaXQgUkdCQS8xNiBiaXQg
ZGVwdGgvc29mdHdhcmUgcmVuZGVyZXIKLSAgICAvLwotICAgIC8vICBJZiBub25lIG9mIHRoYXQg
d29ya3MsIHdlIHNpbXBseSBmYWlsIGFuZCBzZXQgbV9jb250ZXh0T2JqIHRvIDAuCi0gICAgCi0g
ICAgc2V0UGl4ZWxGb3JtYXQoYXR0cmlicywgMzIsIDMyLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0g
ICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1hdE9iaiwg
Jm51bVBpeGVsRm9ybWF0cyk7Ci0gICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAg
ICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAzMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsK
LSAgICAgICAgQ0dMQ2hvb3NlUGl4ZWxGb3JtYXQoYXR0cmlicy5kYXRhKCksICZwaXhlbEZvcm1h
dE9iaiwgJm51bVBpeGVsRm9ybWF0cyk7Ci0gICAgICAgIAotICAgICAgICBpZiAobnVtUGl4ZWxG
b3JtYXRzID09IDApIHsKLSAgICAgICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAx
NiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgICAgIENHTENob29zZVBpeGVsRm9ybWF0
KGF0dHJpYnMuZGF0YSgpLCAmcGl4ZWxGb3JtYXRPYmosICZudW1QaXhlbEZvcm1hdHMpOwotICAg
ICAgICAKLSAgICAgICAgICAgIGlmIChudW1QaXhlbEZvcm1hdHMgPT0gMCkgewotICAgICAgICAg
ICAgICAgIHNldFBpeGVsRm9ybWF0KGF0dHJpYnMsIDMyLCAxNiwgZmFsc2UsIGZhbHNlLCB0cnVl
KTsKLSAgICAgICAgICAgICAgICBDR0xDaG9vc2VQaXhlbEZvcm1hdChhdHRyaWJzLmRhdGEoKSwg
JnBpeGVsRm9ybWF0T2JqLCAmbnVtUGl4ZWxGb3JtYXRzKTsKLSAgICAgICAgCi0gICAgICAgICAg
ICAgICAgaWYgKG51bVBpeGVsRm9ybWF0cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8v
IENvdWxkIG5vdCBmaW5kIGFuIGFjY2VwdGFibGUgcmVuZGVyZXIgLSBmYWlsCi0gICAgICAgICAg
ICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQ0dMRXJyb3IgZXJyID0gQ0dMQ3JlYXRlQ29udGV4dChw
aXhlbEZvcm1hdE9iaiwgMCwgJm1fY29udGV4dE9iaik7Ci0gICAgQ0dMRGVzdHJveVBpeGVsRm9y
bWF0KHBpeGVsRm9ybWF0T2JqKTsKLSAgICAKLSAgICBpZiAoZXJyICE9IGtDR0xOb0Vycm9yIHx8
ICFtX2NvbnRleHRPYmopIHsKLSAgICAgICAgLy8gQ291bGQgbm90IGNyZWF0ZSB0aGUgY29udGV4
dCAtIGZhaWwKLSAgICAgICAgbV9jb250ZXh0T2JqID0gMDsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLQotICAgIC8vIFNldCB0aGUgY3VycmVudCBjb250ZXh0IHRvIHRoZSBvbmUgZ2l2ZW4gdG8g
dXMuCi0gICAgQ0dMU2V0Q3VycmVudENvbnRleHQobV9jb250ZXh0T2JqKTsKLSAgICAKLSAgICB2
YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgV2ViR0xMYXllcgotICAg
IEJFR0lOX0JMT0NLX09CSkNfRVhDRVBUSU9OUwotICAgICAgICBtX3dlYkdMTGF5ZXIuYWRvcHRO
UyhbW1dlYkdMTGF5ZXIgYWxsb2NdIGluaXRXaXRoR3JhcGhpY3NDb250ZXh0M0Q6dGhpc10pOwot
I2lmbmRlZiBOREVCVUcKLSAgICAgICAgW21fd2ViR0xMYXllci5nZXQoKSBzZXROYW1lOkAiV2Vi
R0wgTGF5ZXIiXTsKLSNlbmRpZiAgICAKLSAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05TCi0g
ICAgCi0gICAgLy8gY3JlYXRlIGEgdGV4dHVyZSB0byByZW5kZXIgaW50bwotICAgIDo6Z2xHZW5U
ZXh0dXJlcygxLCAmbV90ZXh0dXJlKTsKLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8y
RCwgbV90ZXh0dXJlKTsKLSAgICA6OmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9U
RVhUVVJFX01BR19GSUxURVIsIEdMX0xJTkVBUik7Ci0gICAgOjpnbFRleFBhcmFtZXRlcmYoR0xf
VEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpOwotICAgIDo6Z2xU
ZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUCk7
Ci0gICAgOjpnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1Qs
IEdMX0NMQU1QKTsKLSAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCk7Ci0gICAg
Ci0gICAgLy8gY3JlYXRlIGFuIEZCTwotICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1f
ZmJvKTsKLSAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9m
Ym8pOwotICAgIAotICAgIG1fYm91bmRGQk8gPSBtX2ZibzsKLSAgICBpZiAoIW1fYXR0cnMuYW50
aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkpCi0gICAgICAgIDo6
Z2xHZW5SZW5kZXJidWZmZXJzRVhUKDEsICZtX2RlcHRoU3RlbmNpbEJ1ZmZlcik7Ci0KLSAgICAv
LyBjcmVhdGUgYW4gbXVsdGlzYW1wbGUgRkJPCi0gICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7
Ci0gICAgICAgIDo6Z2xHZW5GcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVGQk8pOwot
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0
aXNhbXBsZUZCTyk7Ci0gICAgICAgIG1fYm91bmRGQk8gPSBtX211bHRpc2FtcGxlRkJPOwotICAg
ICAgICA6OmdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVy
KTsKLSAgICAgICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQotICAgICAg
ICAgICAgOjpnbEdlblJlbmRlcmJ1ZmZlcnNFWFQoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5j
aWxCdWZmZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyBBTkdMRSBpbml0aWFsaXphdGlvbi4KLQot
ICAgIFRCdWlsdEluUmVzb3VyY2UgQU5HTEVSZXNvdXJjZXM7Ci0KLSAgICBBTkdMRVJlc291cmNl
cy5NYXhWZXJ0ZXhBdHRyaWJzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQz
RDo6TUFYX1ZFUlRFWF9BVFRSSUJTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4QXR0cmlicyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VW5pZm9ybVZlY3RvcnMgPSAwOwotICAgIGdl
dEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywg
JkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleFVuaWZvcm1WZWN0b3JzKTsKLSAgICBBTkdMRVJlc291
cmNlcy5NYXhWYXJ5aW5nVmVjdG9ycyA9IDA7Ci0gICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250
ZXh0M0Q6Ok1BWF9WQVJZSU5HX1ZFQ1RPUlMsICZBTkdMRVJlc291cmNlcy5NYXhWYXJ5aW5nVmVj
dG9ycyk7Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgPSAw
OwotICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1RFWFRVUkVf
SU1BR0VfVU5JVFMsICZBTkdMRVJlc291cmNlcy5NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyA9IDA7Ci0g
ICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9DT01CSU5FRF9URVhUVVJFX0lN
QUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4Q29tYmluZWRUZXh0dXJlSW1hZ2VVbml0cyk7
Ci0gICAgQU5HTEVSZXNvdXJjZXMuTWF4VGV4dHVyZUltYWdlVW5pdHMgPSAwOwotICAgIGdldElu
dGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xF
UmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzKTsKLSAgICBBTkdMRVJlc291cmNlcy5NYXhG
cmFnbWVudFVuaWZvcm1WZWN0b3JzID0gMDsKLSAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRl
eHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZy
YWdtZW50VW5pZm9ybVZlY3RvcnMpOwotCi0gICAgLy8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVu
R0wgRVMuCi0gICAgQU5HTEVSZXNvdXJjZXMuTWF4RHJhd0J1ZmZlcnMgPSAxOwotICAgIAotICAg
IG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xFUmVzb3VyY2VzKTsKLSAgICAKLSAgICA6Omds
RW5hYmxlKEdMX1ZFUlRFWF9QUk9HUkFNX1BPSU5UX1NJWkUpOwotICAgIDo6Z2xDbGVhckNvbG9y
KDAsIDAsIDAsIDApOwotfQotCi1HcmFwaGljc0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNE
KCkKLXsKLSAgICBpZiAobV9jb250ZXh0T2JqKSB7Ci0gICAgICAgIENHTFNldEN1cnJlbnRDb250
ZXh0KG1fY29udGV4dE9iaik7Ci0gICAgICAgIDo6Z2xEZWxldGVUZXh0dXJlcygxLCAmbV90ZXh0
dXJlKTsKLSAgICAgICAgaWYgKG1fYXR0cnMuYW50aWFsaWFzKSB7Ci0gICAgICAgICAgICA6Omds
RGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKLSAg
ICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAg
ICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9tdWx0aXNhbXBsZURlcHRo
U3RlbmNpbEJ1ZmZlcik7Ci0gICAgICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzRVhUKDEs
ICZtX211bHRpc2FtcGxlRkJPKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICht
X2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkKLSAgICAgICAgICAgICAgICA6OmdsRGVs
ZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmbV9kZXB0aFN0ZW5jaWxCdWZmZXIpOwotICAgICAgICB9
Ci0gICAgICAgIDo6Z2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJm1fZmJvKTsKLSAgICAgICAg
Q0dMU2V0Q3VycmVudENvbnRleHQoMCk7Ci0gICAgICAgIENHTERlc3Ryb3lDb250ZXh0KG1fY29u
dGV4dE9iaik7Ci0gICAgfQotfQotCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0
dHJpYnV0ZXMoKQogewogICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbnMgPSByZWludGVycHJldF9j
YXN0PGNvbnN0IGNoYXIqPig6OmdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpKTsKQEAgLTI1Mywx
MSArNzQsNiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2YWxpZGF0ZUF0dHJpYnV0CiAgICAg
bV9hdHRycy5wcmVtdWx0aXBsaWVkQWxwaGEgPSB0cnVlOwogfQogCi12b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjptYWtlQ29udGV4dEN1cnJlbnQoKQotewotICAgIENHTFNldEN1cnJlbnRDb250ZXh0
KG1fY29udGV4dE9iaik7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBhaW50UmVuZGVy
aW5nUmVzdWx0c1RvQ2FudmFzKENhbnZhc1JlbmRlcmluZ0NvbnRleHQqIGNvbnRleHQpCiB7CiAg
ICAgSFRNTENhbnZhc0VsZW1lbnQqIGNhbnZhcyA9IGNvbnRleHQtPmNhbnZhcygpOwpAQCAtMjcw
LDcgKzg2LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cGFpbnRSZW5kZXJpbmdSZQogICAg
IGlmICghcGl4ZWxzKQogICAgICAgICByZXR1cm47CiAKLSAgICBDR0xTZXRDdXJyZW50Q29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogCiAgICAgYm9vbCBt
dXN0UmVzdG9yZUZCTyA9IGZhbHNlOwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgewpAQCAt
MzA2LDIxICsxMjIsNiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwYWludFJlbmRlcmluZ1Jl
CiAgICAgICAgICAgICAgICAgICBjYW52YXMtPndpZHRoKCksIGNhbnZhcy0+aGVpZ2h0KCksIGlt
YWdlQnVmZmVyLT5jb250ZXh0KCktPnBsYXRmb3JtQ29udGV4dCgpKTsKIH0KIAotYm9vbCBHcmFw
aGljc0NvbnRleHQzRDo6aXNHTEVTMkNvbXBsaWFudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGZh
bHNlOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMyTlBPVFN0cmljdCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEdyYXBoaWNzQ29udGV4dDNEOjpp
c0Vycm9yR2VuZXJhdGVkT25PdXRPZkJvdW5kc0FjY2Vzc2VzKCkgY29uc3QKLXsKLSAgICByZXR1
cm4gZmFsc2U7Ci19Ci0KIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlc2hhcGUoaW50IHdpZHRo
LCBpbnQgaGVpZ2h0KQogewogICAgIGlmICh3aWR0aCA9PSBtX2N1cnJlbnRXaWR0aCAmJiBoZWln
aHQgPT0gbV9jdXJyZW50SGVpZ2h0IHx8ICFtX2NvbnRleHRPYmopCkBAIC0zMjksNyArMTMwLDcg
QEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVzaGFwZShpbnQgd2lkdAogICAgIG1fY3VycmVu
dFdpZHRoID0gd2lkdGg7CiAgICAgbV9jdXJyZW50SGVpZ2h0ID0gaGVpZ2h0OwogICAgIAotICAg
IENHTFNldEN1cnJlbnRDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJy
ZW50KCk7CiAgICAgCiAgICAgR0x1aW50IGludGVybmFsQ29sb3JGb3JtYXQsIGNvbG9yRm9ybWF0
LCBpbnRlcm5hbERlcHRoU3RlbmNpbEZvcm1hdCA9IDA7CiAgICAgaWYgKG1fYXR0cnMuYWxwaGEp
IHsKQEAgLTQ1MiwxOSArMjUzLDkgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVzaGFwZShp
bnQgd2lkdAogICAgIDo6Z2xGbHVzaCgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5zdXJl
Q29udGV4dChDR0xDb250ZXh0T2JqIGNvbnRleHQpCi17Ci0gICAgaWYgKCFjb250ZXh0KQotICAg
ICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIENHTENvbnRleHRPYmogY3VycmVudENvbnRleHQg
PSBDR0xHZXRDdXJyZW50Q29udGV4dCgpOwotICAgIGlmIChjdXJyZW50Q29udGV4dCAhPSBjb250
ZXh0KQotICAgICAgICBDR0xTZXRDdXJyZW50Q29udGV4dChjb250ZXh0KTsKLX0KLQogdm9pZCBH
cmFwaGljc0NvbnRleHQzRDo6cHJlcGFyZVRleHR1cmUoKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBpZiAobV9hdHRy
cy5hbnRpYWxpYXMpIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZS
QU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVi
dWZmZXJFWFQoR0xfRFJBV19GUkFNRUJVRkZFUl9FWFQsIG1fZmJvKTsKQEAgLTQ3Niw3ICsyNjcs
NyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwcmVwYXJlVGV4dHVyZSgpCiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmFjdGl2ZVRleHR1cmUodW5zaWduZWQgbG9uZyB0ZXh0dXJlKQogewot
ICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICA6OmdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlKTsKIH0KIApAQCAtNDg0LDI3ICsyNzUs
MjcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YXR0YWNoU2hhZGVyKFBsYQogewogICAgIEFT
U0VSVChwcm9ncmFtKTsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEF0dGFjaFNo
YWRlcigoR0x1aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjpiaW5kQXR0cmliTG9jYXRpb24oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFt
LCB1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBTdHJpbmcmIG5hbWUpCiB7CiAgICAgQVNTRVJU
KHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQmluZEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dy
YW0sIGluZGV4LCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpiaW5kQnVmZmVyKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBQbGF0Zm9ybTNET2JqZWN0IGJ1
ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRl
eHRDdXJyZW50KCk7CiAgICAgOjpnbEJpbmRCdWZmZXIodGFyZ2V0LCAoR0x1aW50KSBidWZmZXIp
OwogfQogCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1ZmZlcih1bnNpZ25l
ZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMdWlu
dCBmYm87CiAgICAgaWYgKGJ1ZmZlcikKICAgICAgICAgZmJvID0gKEdMdWludClidWZmZXI7CkBA
IC01MTgsMTA2ICszMDksMTA2IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmJpbmRGcmFtZWJ1
ZmZlcigKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmluZFJlbmRlcmJ1ZmZlcih1bnNpZ25l
ZCBsb25nIHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCByZW5kZXJidWZmZXIpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IDo6Z2xCaW5kUmVuZGVyYnVmZmVyRVhUKHRhcmdldCwgKEdMdWludCkgcmVuZGVyYnVmZmVyKTsK
IH0KIAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpiaW5kVGV4dHVyZSh1bnNpZ25lZCBsb25n
IHRhcmdldCwgUGxhdGZvcm0zRE9iamVjdCB0ZXh0dXJlKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQmluZFRl
eHR1cmUodGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6YmxlbmRDb2xvcihkb3VibGUgcmVkLCBkb3VibGUgZ3JlZW4sIGRvdWJsZSBibHVlLCBk
b3VibGUgYWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xCbGVuZENvbG9yKHN0YXRpY19jYXN0PGZsb2F0
PihyZWQpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZ3JlZW4pLCBzdGF0aWNfY2FzdDxmbG9hdD4oYmx1
ZSksIHN0YXRpY19jYXN0PGZsb2F0PihhbHBoYSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpibGVuZEVxdWF0aW9uKCB1bnNpZ25lZCBsb25nIG1vZGUgKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6Omds
QmxlbmRFcXVhdGlvbihtb2RlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YmxlbmRF
cXVhdGlvblNlcGFyYXRlKHVuc2lnbmVkIGxvbmcgbW9kZVJHQiwgdW5zaWduZWQgbG9uZyBtb2Rl
QWxwaGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xCbGVuZEVxdWF0aW9uU2VwYXJhdGUobW9kZVJHQiwgbW9k
ZUFscGhhKTsKIH0KIAogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpibGVuZEZ1bmModW5zaWdu
ZWQgbG9uZyBzZmFjdG9yLCB1bnNpZ25lZCBsb25nIGRmYWN0b3IpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xC
bGVuZEZ1bmMoc2ZhY3RvciwgZGZhY3Rvcik7CiB9ICAgICAgIAogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpibGVuZEZ1bmNTZXBhcmF0ZSh1bnNpZ25lZCBsb25nIHNyY1JHQiwgdW5zaWduZWQg
bG9uZyBkc3RSR0IsIHVuc2lnbmVkIGxvbmcgc3JjQWxwaGEsIHVuc2lnbmVkIGxvbmcgZHN0QWxw
aGEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0
Q3VycmVudCgpOwogICAgIDo6Z2xCbGVuZEZ1bmNTZXBhcmF0ZShzcmNSR0IsIGRzdFJHQiwgc3Jj
QWxwaGEsIGRzdEFscGhhKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6YnVmZmVyRGF0
YSh1bnNpZ25lZCBsb25nIHRhcmdldCwgaW50IHNpemUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOwogICAgIDo6Z2xCdWZmZXJEYXRhKHRhcmdldCwgc2l6ZSwgMCwgdXNhZ2UpOwogfQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpidWZmZXJEYXRhKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBp
bnQgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSwgdW5zaWduZWQgbG9uZyB1c2FnZSkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgOjpnbEJ1ZmZlckRhdGEodGFyZ2V0LCBzaXplLCBkYXRhLCB1c2FnZSk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmJ1ZmZlclN1YkRhdGEodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxv
bmcgb2Zmc2V0LCBpbnQgc2l6ZSwgY29uc3Qgdm9pZCogZGF0YSkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEJ1
ZmZlclN1YkRhdGEodGFyZ2V0LCBvZmZzZXQsIHNpemUsIGRhdGEpOwogfQogCiB1bnNpZ25lZCBs
b25nIEdyYXBoaWNzQ29udGV4dDNEOjpjaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHVuc2lnbmVkIGxv
bmcgdGFyZ2V0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICByZXR1cm4gOjpnbENoZWNrRnJhbWVidWZmZXJTdGF0dXNF
WFQodGFyZ2V0KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y2xlYXJDb2xvcihkb3Vi
bGUgciwgZG91YmxlIGcsIGRvdWJsZSBiLCBkb3VibGUgYSkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbENsZWFy
Q29sb3Ioc3RhdGljX2Nhc3Q8ZmxvYXQ+KHIpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZyksIHN0YXRp
Y19jYXN0PGZsb2F0PihiKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6Y2xlYXIodW5zaWduZWQgbG9uZyBtYXNrKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6Omds
Q2xlYXIobWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyRGVwdGgoZG91
YmxlIGRlcHRoKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsQ2xlYXJEZXB0aChkZXB0aCk7CiB9CiAKIHZvaWQg
R3JhcGhpY3NDb250ZXh0M0Q6OmNsZWFyU3RlbmNpbChsb25nIHMpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xD
bGVhclN0ZW5jaWwocyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvbG9yTWFzayhi
b29sIHJlZCwgYm9vbCBncmVlbiwgYm9vbCBibHVlLCBib29sIGFscGhhKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6
OmdsQ29sb3JNYXNrKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6Y29tcGlsZVNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IHNoYWRlcikKIHsKICAg
ICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CiAKICAgICBpbnQgR0xzaGFkZXJUeXBlOwogICAgIEFOR0xF
U2hhZGVyVHlwZSBzaGFkZXJUeXBlOwpAQCAtNjY4LDcgKzQ1OSw3IEBAIHZvaWQgR3JhcGhpY3ND
b250ZXh0M0Q6OmNvbXBpbGVTaGFkZXIoUGwKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Y29w
eVRleEltYWdlMkQodW5zaWduZWQgbG9uZyB0YXJnZXQsIGxvbmcgbGV2ZWwsIHVuc2lnbmVkIGxv
bmcgaW50ZXJuYWxmb3JtYXQsIGxvbmcgeCwgbG9uZyB5LCB1bnNpZ25lZCBsb25nIHdpZHRoLCB1
bnNpZ25lZCBsb25nIGhlaWdodCwgbG9uZyBib3JkZXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIGlmIChtX2F0dHJz
LmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVsdGlzYW1wbGVGQk8pIHsKICAgICAgICAg
OjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZSQU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNh
bXBsZUZCTyk7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXJFWFQoR0xfRFJBV19GUkFNRUJV
RkZFUl9FWFQsIG1fZmJvKTsKQEAgLTY4Miw3ICs0NzMsNyBAQCB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpjb3B5VGV4SW1hZ2UyRCh1CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNvcHlUZXhT
dWJJbWFnZTJEKHVuc2lnbmVkIGxvbmcgdGFyZ2V0LCBsb25nIGxldmVsLCBsb25nIHhvZmZzZXQs
IGxvbmcgeW9mZnNldCwgbG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2ln
bmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAg
ICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBpZiAobV9hdHRycy5hbnRpYWxpYXMgJiYgbV9i
b3VuZEZCTyA9PSBtX211bHRpc2FtcGxlRkJPKSB7CiAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZm
ZXJFWFQoR0xfUkVBRF9GUkFNRUJVRkZFUl9FWFQsIG1fbXVsdGlzYW1wbGVGQk8pOwogICAgICAg
ICA6OmdsQmluZEZyYW1lYnVmZmVyRVhUKEdMX0RSQVdfRlJBTUVCVUZGRVJfRVhULCBtX2Zibyk7
CkBAIC02OTYsMjUgKzQ4NywyNSBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpjb3B5VGV4U3Vi
SW1hZ2UyCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmN1bGxGYWNlKHVuc2lnbmVkIGxvbmcg
bW9kZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRl
eHRDdXJyZW50KCk7CiAgICAgOjpnbEN1bGxGYWNlKG1vZGUpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpkZXB0aEZ1bmModW5zaWduZWQgbG9uZyBmdW5jKQogewotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6Omds
RGVwdGhGdW5jKGZ1bmMpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkZXB0aE1hc2so
Ym9vbCBmbGFnKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsRGVwdGhNYXNrKGZsYWcpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkZXB0aFJhbmdlKGRvdWJsZSB6TmVhciwgZG91YmxlIHpGYXIpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOwogICAgIDo6Z2xEZXB0aFJhbmdlKHpOZWFyLCB6RmFyKTsKIH0KIApAQCAtNzIyLDYxICs1
MTMsNjEgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGV0YWNoU2hhZGVyKFBsYQogewogICAg
IEFTU0VSVChwcm9ncmFtKTsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbERldGFj
aFNoYWRlcigoR0x1aW50KSBwcm9ncmFtLCAoR0x1aW50KSBzaGFkZXIpOwogfQogCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlKHVuc2lnbmVkIGxvbmcgY2FwKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6
OmdsRGlzYWJsZShjYXApOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpkaXNhYmxlVmVy
dGV4QXR0cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbERpc2Fi
bGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6
OmRyYXdBcnJheXModW5zaWduZWQgbG9uZyBtb2RlLCBsb25nIGZpcnN0LCBsb25nIGNvdW50KQog
ewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJl
bnQoKTsKICAgICA6OmdsRHJhd0FycmF5cyhtb2RlLCBmaXJzdCwgY291bnQpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkcmF3RWxlbWVudHModW5zaWduZWQgbG9uZyBtb2RlLCB1bnNp
Z25lZCBsb25nIGNvdW50LCB1bnNpZ25lZCBsb25nIHR5cGUsIGxvbmcgb2Zmc2V0KQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsK
ICAgICA6OmdsRHJhd0VsZW1lbnRzKG1vZGUsIGNvdW50LCB0eXBlLCByZWludGVycHJldF9jYXN0
PHZvaWQqPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4ob2Zmc2V0KSkpOwogfQogCiB2b2lkIEdyYXBo
aWNzQ29udGV4dDNEOjplbmFibGUodW5zaWduZWQgbG9uZyBjYXApCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xF
bmFibGUoY2FwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZW5hYmxlVmVydGV4QXR0
cmliQXJyYXkodW5zaWduZWQgbG9uZyBpbmRleCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEVuYWJsZVZlcnRl
eEF0dHJpYkFycmF5KGluZGV4KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZmluaXNo
KCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbEZpbmlzaCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
OjpmbHVzaCgpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xGbHVzaCgpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpmcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5z
aWduZWQgbG9uZyBhdHRhY2htZW50LCB1bnNpZ25lZCBsb25nIHJlbmRlcmJ1ZmZlcnRhcmdldCwg
UGxhdGZvcm0zRE9iamVjdCBidWZmZXIpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMdWludCByZW5kZXJidWZmZXIg
PSAoR0x1aW50KSBidWZmZXI7CiAgICAgaWYgKGF0dGFjaG1lbnQgPT0gREVQVEhfU1RFTkNJTF9B
VFRBQ0hNRU5UKSB7CiAgICAgICAgIDo6Z2xGcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlckVYVCh0YXJn
ZXQsIERFUFRIX0FUVEFDSE1FTlQsIHJlbmRlcmJ1ZmZlcnRhcmdldCwgcmVuZGVyYnVmZmVyKTsK
QEAgLTc4NywxOSArNTc4LDE5IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmZyYW1lYnVmZmVy
UmVuZGUKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZnJhbWVidWZmZXJUZXh0dXJlMkQodW5z
aWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVudCwgdW5zaWduZWQgbG9u
ZyB0ZXh0YXJnZXQsIFBsYXRmb3JtM0RPYmplY3QgdGV4dHVyZSwgbG9uZyBsZXZlbCkKIHsKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7
CiAgICAgOjpnbEZyYW1lYnVmZmVyVGV4dHVyZTJERVhUKHRhcmdldCwgYXR0YWNobWVudCwgdGV4
dGFyZ2V0LCAoR0x1aW50KSB0ZXh0dXJlLCBsZXZlbCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250
ZXh0M0Q6OmZyb250RmFjZSh1bnNpZ25lZCBsb25nIG1vZGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xGcm9u
dEZhY2UobW9kZSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdlbmVyYXRlTWlwbWFw
KHVuc2lnbmVkIGxvbmcgdGFyZ2V0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2Jq
KTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2VuZXJhdGVNaXBtYXBFWFQo
dGFyZ2V0KTsKIH0KIApAQCAtODA5LDcgKzYwMCw3IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6
OmdldEFjdGl2ZUF0dHJpYigKICAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxV
RSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMaW50IG1heEF0dHJp
YnV0ZVNpemUgPSAwOwogICAgIDo6Z2xHZXRQcm9ncmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihw
cm9ncmFtKSwgR0xfQUNUSVZFX0FUVFJJQlVURV9NQVhfTEVOR1RILCAmbWF4QXR0cmlidXRlU2l6
ZSk7CiAgICAgR0xjaGFyIG5hbWVbbWF4QXR0cmlidXRlU2l6ZV07IC8vIEdMX0FDVElWRV9BVFRS
SUJVVEVfTUFYX0xFTkdUSCBpbmNsdWRlcyBudWxsIHRlcm1pbmF0aW9uCkBAIC04MzEsNyArNjIy
LDcgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QWN0aXZlVW5pZm9ybQogICAgICAgICBz
eW50aGVzaXplR0xFcnJvcihJTlZBTElEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwog
ICAgIH0KLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgR0xpbnQgbWF4VW5pZm9ybVNpemUgPSAwOwogICAgIDo6Z2xHZXRQcm9n
cmFtaXYoc3RhdGljX2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgR0xfQUNUSVZFX1VOSUZPUk1fTUFY
X0xFTkdUSCwgJm1heFVuaWZvcm1TaXplKTsKICAgICBHTGNoYXIgbmFtZVttYXhVbmlmb3JtU2l6
ZV07IC8vIEdMX0FDVElWRV9VTklGT1JNX01BWF9MRU5HVEggaW5jbHVkZXMgbnVsbCB0ZXJtaW5h
dGlvbgpAQCAtODUzLDcgKzY0NCw3IEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEF0dGFj
aGVkU2hhZGUKICAgICAgICAgc3ludGhlc2l6ZUdMRXJyb3IoSU5WQUxJRF9WQUxVRSk7CiAgICAg
ICAgIHJldHVybjsKICAgICB9Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRBdHRhY2hlZFNoYWRlcnMoc3RhdGlj
X2Nhc3Q8R0x1aW50Pihwcm9ncmFtKSwgbWF4Q291bnQsIGNvdW50LCBzaGFkZXJzKTsKIH0KIApA
QCAtODYxLDggKzY1Miw4IEBAIGludCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QXR0cmliTG9jYXRp
b24KIHsKICAgICBpZiAoIXByb2dyYW0pCiAgICAgICAgIHJldHVybiAtMTsKLSAgICAKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsK
ICAgICByZXR1cm4gOjpnbEdldEF0dHJpYkxvY2F0aW9uKChHTHVpbnQpIHByb2dyYW0sIG5hbWUu
dXRmOCgpLmRhdGEoKSk7CiB9CiAKQEAgLTg4MCwxOSArNjcxLDE5IEBAIHVuc2lnbmVkIGxvbmcg
R3JhcGhpY3NDb250ZXh0M0Q6OmdldEVycm8KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50
KCk7CiAgICAgcmV0dXJuIDo6Z2xHZXRFcnJvcigpOwogfQogCiBTdHJpbmcgR3JhcGhpY3NDb250
ZXh0M0Q6OmdldFN0cmluZyh1bnNpZ25lZCBsb25nIG5hbWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIHJldHVybiBT
dHJpbmcoKGNvbnN0IGNoYXIqKSA6OmdsR2V0U3RyaW5nKG5hbWUpKTsKIH0KIAogdm9pZCBHcmFw
aGljc0NvbnRleHQzRDo6aGludCh1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBt
b2RlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4
dEN1cnJlbnQoKTsKICAgICA6OmdsSGludCh0YXJnZXQsIG1vZGUpOwogfQogCkBAIC05MDAsMTQg
KzY5MSwxNCBAQCBib29sIEdyYXBoaWNzQ29udGV4dDNEOjppc0J1ZmZlcihQbGF0Zm9yCiB7CiAg
ICAgaWYgKCFidWZmZXIpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBy
ZXR1cm4gOjpnbElzQnVmZmVyKChHTHVpbnQpIGJ1ZmZlcik7CiB9CiAKIGJvb2wgR3JhcGhpY3ND
b250ZXh0M0Q6OmlzRW5hYmxlZCh1bnNpZ25lZCBsb25nIGNhcCkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgcmV0dXJu
IDo6Z2xJc0VuYWJsZWQoY2FwKTsKIH0KIApAQCAtOTE1LDggKzcwNiw4IEBAIGJvb2wgR3JhcGhp
Y3NDb250ZXh0M0Q6OmlzRnJhbWVidWZmZXIoUGwKIHsKICAgICBpZiAoIWZyYW1lYnVmZmVyKQog
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgcmV0dXJuIDo6Z2xJc0ZyYW1l
YnVmZmVyRVhUKChHTHVpbnQpIGZyYW1lYnVmZmVyKTsKIH0KIApAQCAtOTI0LDggKzcxNSw4IEBA
IGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUHJvZ3JhbShQbGF0Zm8KIHsKICAgICBpZiAoIXBy
b2dyYW0pCiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICByZXR1cm4gOjpn
bElzUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKIH0KIApAQCAtOTMzLDggKzcyNCw4IEBAIGJv
b2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzUmVuZGVyYnVmZmVyKFAKIHsKICAgICBpZiAoIXJlbmRl
cmJ1ZmZlcikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIHJldHVybiA6
OmdsSXNSZW5kZXJidWZmZXJFWFQoKEdMdWludCkgcmVuZGVyYnVmZmVyKTsKIH0KIApAQCAtOTQy
LDggKzczMyw4IEBAIGJvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmlzU2hhZGVyKFBsYXRmb3IKIHsK
ICAgICBpZiAoIXNoYWRlcikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IHJldHVybiA6OmdsSXNTaGFkZXIoKEdMdWludCkgc2hhZGVyKTsKIH0KIApAQCAtOTUxLDMzICs3
NDIsMzMgQEAgYm9vbCBHcmFwaGljc0NvbnRleHQzRDo6aXNUZXh0dXJlKFBsYXRmbwogewogICAg
IGlmICghdGV4dHVyZSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIAotICAgIGVuc3VyZUNv
bnRleHQobV9jb250ZXh0T2JqKTsKKworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIHJl
dHVybiA6OmdsSXNUZXh0dXJlKChHTHVpbnQpIHRleHR1cmUpOwogfQogCiB2b2lkIEdyYXBoaWNz
Q29udGV4dDNEOjpsaW5lV2lkdGgoZG91YmxlIHdpZHRoKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsTGluZVdp
ZHRoKHN0YXRpY19jYXN0PGZsb2F0Pih3aWR0aCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjpsaW5rUHJvZ3JhbShQbGF0Zm9ybTNET2JqZWN0IHByb2dyYW0pCiB7CiAgICAgQVNTRVJU
KHByb2dyYW0pOwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29u
dGV4dEN1cnJlbnQoKTsKICAgICA6OmdsTGlua1Byb2dyYW0oKEdMdWludCkgcHJvZ3JhbSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnBpeGVsU3RvcmVpKHVuc2lnbmVkIGxvbmcgcG5h
bWUsIGxvbmcgcGFyYW0pCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xQaXhlbFN0b3JlaShwbmFtZSwgcGFyYW0p
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpwb2x5Z29uT2Zmc2V0KGRvdWJsZSBmYWN0
b3IsIGRvdWJsZSB1bml0cykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7Cisg
ICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFBvbHlnb25PZmZzZXQoc3RhdGljX2Nh
c3Q8ZmxvYXQ+KGZhY3RvciksIHN0YXRpY19jYXN0PGZsb2F0Pih1bml0cykpOwogfQogCkBAIC05
ODUsNyArNzc2LDcgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIAog
ewogICAgIC8vIEZJWE1FOiByZW1vdmUgdGhlIHR3byBnbEZsdXNoIGNhbGxzIHdoZW4gdGhlIGRy
aXZlciBidWcgaXMgZml4ZWQsIGkuZS4sCiAgICAgLy8gYWxsIHByZXZpb3VzIHJlbmRlcmluZyBj
YWxscyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgcmVhZGluZyBwaXhlbHMuCi0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xG
bHVzaCgpOwogICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcyAmJiBtX2JvdW5kRkJPID09IG1fbXVs
dGlzYW1wbGVGQk8pIHsKICAgICAgICAgOjpnbEJpbmRGcmFtZWJ1ZmZlckVYVChHTF9SRUFEX0ZS
QU1FQlVGRkVSX0VYVCwgbV9tdWx0aXNhbXBsZUZCTyk7CkBAIC0xMDAyLDEzICs3OTMsMTMgQEAg
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6cmVhZFBpeGVscyhsb25nIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6cmVsZWFzZVNoYWRlckNvbXBpbGVyKCkKIHsKICAgICAvLyBGSVhNRTogVGhpcyBp
cyBub3QgaW1wbGVtZW50ZWQgb24gZGVza3RvcCBPcGVuR0wuIFdlIG5lZWQgdG8gaGF2ZSBpZmRl
ZnMgZm9yIHRoZSBkaWZmZXJlbnQgR0wgdmFyaWFudHMKLSAgICBlbnN1cmVDb250ZXh0KG1fY29u
dGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgLy86OmdsUmVsZWFzZVNo
YWRlckNvbXBpbGVyKCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZl
clN0b3JhZ2UodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgaW50ZXJuYWxmb3Jt
YXQsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAg
ICBzd2l0Y2ggKGludGVybmFsZm9ybWF0KSB7CiAgICAgY2FzZSBERVBUSF9TVEVOQ0lMOgogICAg
ICAgICBpbnRlcm5hbGZvcm1hdCA9IEdMX0RFUFRIMjRfU1RFTkNJTDhfRVhUOwpAQCAtMTAyOSwy
MSArODIwLDIxIEBAIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnJlbmRlcmJ1ZmZlclN0b3IKIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6c2FtcGxlQ292ZXJhZ2UoZG91YmxlIHZhbHVlLCBib29s
IGludmVydCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNv
bnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFNhbXBsZUNvdmVyYWdlKHN0YXRpY19jYXN0PGZsb2F0
Pih2YWx1ZSksIGludmVydCk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNjaXNzb3Io
bG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxvbmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1
cnJlbnQoKTsKICAgICA6OmdsU2Npc3Nvcih4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6c2hhZGVyU291cmNlKFBsYXRmb3JtM0RPYmplY3Qgc2hhZGVy
LCBjb25zdCBTdHJpbmcmIHN0cmluZykKIHsKICAgICBBU1NFUlQoc2hhZGVyKTsKLSAgICAKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKIAogICAgIFNoYWRlclNvdXJjZUVudHJ5IGVudHJ5OwogCkBAIC0xMDU0LDI3MCArODQ1LDI3
MCBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzaGFkZXJTb3VyY2UoUGxhCiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jKHVuc2lnbmVkIGxvbmcgZnVuYywgbG9uZyByZWYs
IHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFN0ZW5jaWxGdW5jKGZ1bmMsIHJl
ZiwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxGdW5jU2VwYXJh
dGUodW5zaWduZWQgbG9uZyBmYWNlLCB1bnNpZ25lZCBsb25nIGZ1bmMsIGxvbmcgcmVmLCB1bnNp
Z25lZCBsb25nIG1hc2spCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAg
IG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xTdGVuY2lsRnVuY1NlcGFyYXRlKGZhY2Us
IGZ1bmMsIHJlZiwgbWFzayk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnN0ZW5jaWxN
YXNrKHVuc2lnbmVkIGxvbmcgbWFzaykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFN0ZW5jaWxNYXNrKG1hc2sp
OwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsTWFza1NlcGFyYXRlKHVuc2ln
bmVkIGxvbmcgZmFjZSwgdW5zaWduZWQgbG9uZyBtYXNrKQogewotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsU3RlbmNp
bE1hc2tTZXBhcmF0ZShmYWNlLCBtYXNrKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6
c3RlbmNpbE9wKHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwgdW5zaWdu
ZWQgbG9uZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFN0ZW5jaWxPcChmYWlsLCB6ZmFpbCwgenBh
c3MpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpzdGVuY2lsT3BTZXBhcmF0ZSh1bnNp
Z25lZCBsb25nIGZhY2UsIHVuc2lnbmVkIGxvbmcgZmFpbCwgdW5zaWduZWQgbG9uZyB6ZmFpbCwg
dW5zaWduZWQgbG9uZyB6cGFzcykKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7
CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFN0ZW5jaWxPcFNlcGFyYXRlKGZh
Y2UsIGZhaWwsIHpmYWlsLCB6cGFzcyk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnRl
eFBhcmFtZXRlcmYodW5zaWduZWQgdGFyZ2V0LCB1bnNpZ25lZCBwbmFtZSwgZmxvYXQgdmFsdWUp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIDo6Z2xUZXhQYXJhbWV0ZXJmKHRhcmdldCwgcG5hbWUsIHN0YXRpY19jYXN0
PGZsb2F0Pih2YWx1ZSkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhQYXJhbWV0
ZXJpKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgcG5hbWUsIGludCB2YWx1ZSkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgOjpnbFRleFBhcmFtZXRlcmkodGFyZ2V0LCBwbmFtZSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZh
bHVlKSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xZihsb25nIGxvY2F0
aW9uLCBmbG9hdCB2MCkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAg
bWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0xZihsb2NhdGlvbiwgdjApOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMWZ2KGxvbmcgbG9jYXRpb24sIGZs
b2F0KiBhcnJheSwgaW50IHNpemUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmop
OworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3JtMWZ2KGxvY2F0aW9u
LCBzaXplLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0yZihs
b25nIGxvY2F0aW9uLCBmbG9hdCB2MCwgZmxvYXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3Jt
MmYobG9jYXRpb24sIHYwLCB2MSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZv
cm0yZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBG
SVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMgotICAgIGVuc3VyZUNvbnRl
eHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5p
Zm9ybTJmdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4
dDNEOjp1bmlmb3JtM2YobG9uZyBsb2NhdGlvbiwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2
MikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0zZihsb2NhdGlvbiwgdjAsIHYxLCB2Mik7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zZnYobG9uZyBsb2NhdGlvbiwgZmxvYXQq
IGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEg
bXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTNmdihsb2NhdGlvbiwgc2l6ZSwgYXJy
YXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtNGYobG9uZyBsb2NhdGlv
biwgZmxvYXQgdjAsIGZsb2F0IHYxLCBmbG9hdCB2MiwgZmxvYXQgdjMpCiB7Ci0gICAgZW5zdXJl
Q29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6
Z2xVbmlmb3JtNGYobG9jYXRpb24sIHYwLCB2MSwgdjIsIHYzKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTRmdihsb25nIGxvY2F0aW9uLCBmbG9hdCogYXJyYXksIGludCBz
aXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiA0
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOwogICAgIDo6Z2xVbmlmb3JtNGZ2KGxvY2F0aW9uLCBzaXplLCBhcnJheSk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0xaShsb25nIGxvY2F0aW9uLCBpbnQgdjApCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOwogICAgIDo6Z2xVbmlmb3JtMWkobG9jYXRpb24sIHYwKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dW5pZm9ybTFpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6
ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm0xaXYobG9jYXRpb24sIHNpemUsIGFycmF5KTsKIH0K
IAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybTJpKGxvbmcgbG9jYXRpb24sIGludCB2
MCwgaW50IHYxKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtl
Q29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTJpKGxvY2F0aW9uLCB2MCwgdjEpOwog
fQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtMml2KGxvbmcgbG9jYXRpb24sIGlu
dCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5ndGggbmVlZHMgdG8gYmUg
YSBtdWx0aXBsZSBvZiAyCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1h
a2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xVbmlmb3JtMml2KGxvY2F0aW9uLCBzaXplLCBh
cnJheSk7CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm0zaShsb25nIGxvY2F0
aW9uLCBpbnQgdjAsIGludCB2MSwgaW50IHYyKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTNpKGxv
Y2F0aW9uLCB2MCwgdjEsIHYyKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9y
bTNpdihsb25nIGxvY2F0aW9uLCBpbnQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAgICAvLyBGSVhN
RTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgMwotICAgIGVuc3VyZUNvbnRleHQo
bV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9y
bTNpdihsb2NhdGlvbiwgc2l6ZSwgYXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNE
Ojp1bmlmb3JtNGkobG9uZyBsb2NhdGlvbiwgaW50IHYwLCBpbnQgdjEsIGludCB2MiwgaW50IHYz
KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1
cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybTRpKGxvY2F0aW9uLCB2MCwgdjEsIHYyLCB2Myk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm00aXYobG9uZyBsb2NhdGlvbiwgaW50
KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklYTUU6IGxlbmd0aCBuZWVkcyB0byBiZSBh
IG11bHRpcGxlIG9mIDQKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZvcm00aXYobG9jYXRpb24sIHNpemUsIGFy
cmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dW5pZm9ybU1hdHJpeDJmdihsb25n
IGxvY2F0aW9uLCBib29sIHRyYW5zcG9zZSwgZmxvYXQqIGFycmF5LCBpbnQgc2l6ZSkKIHsKICAg
ICAvLyBGSVhNRTogbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgNAotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6
OmdsVW5pZm9ybU1hdHJpeDJmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7CiB9
CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnVuaWZvcm1NYXRyaXgzZnYobG9uZyBsb2NhdGlv
biwgYm9vbCB0cmFuc3Bvc2UsIGZsb2F0KiBhcnJheSwgaW50IHNpemUpCiB7CiAgICAgLy8gRklY
TUU6IGxlbmd0aCBuZWVkcyB0byBiZSBhIG11bHRpcGxlIG9mIDkKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFVuaWZv
cm1NYXRyaXgzZnYobG9jYXRpb24sIHNpemUsIHRyYW5zcG9zZSwgYXJyYXkpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjp1bmlmb3JtTWF0cml4NGZ2KGxvbmcgbG9jYXRpb24sIGJvb2wg
dHJhbnNwb3NlLCBmbG9hdCogYXJyYXksIGludCBzaXplKQogewogICAgIC8vIEZJWE1FOiBsZW5n
dGggbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiAxNgotICAgIGVuc3VyZUNvbnRleHQobV9jb250
ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVW5pZm9ybU1hdHJp
eDRmdihsb2NhdGlvbiwgc2l6ZSwgdHJhbnNwb3NlLCBhcnJheSk7CiB9CiAKIHZvaWQgR3JhcGhp
Y3NDb250ZXh0M0Q6OnVzZVByb2dyYW0oUGxhdGZvcm0zRE9iamVjdCBwcm9ncmFtKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsK
ICAgICA6OmdsVXNlUHJvZ3JhbSgoR0x1aW50KSBwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dmFsaWRhdGVQcm9ncmFtKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsK
ICAgICBBU1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRP
YmopOworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFZhbGlkYXRlUHJvZ3Jh
bSgoR0x1aW50KSBwcm9ncmFtKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4
QXR0cmliMWYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCkKIHsKLSAgICBlbnN1cmVDb250
ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbFZl
cnRleEF0dHJpYjFmKGluZHgsIHYwKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVy
dGV4QXR0cmliMWZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFycmF5KQogewotICAgIGVu
c3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAg
ICA6OmdsVmVydGV4QXR0cmliMWZ2KGluZHgsIGFycmF5KTsKIH0KIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6dmVydGV4QXR0cmliMmYodW5zaWduZWQgbG9uZyBpbmR4LCBmbG9hdCB2MCwgZmxv
YXQgdjEpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250
ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZihpbmR4LCB2MCwgdjEpOwogfQog
CiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIyZnYodW5zaWduZWQgbG9uZyBp
bmR4LCBmbG9hdCogYXJyYXkpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRyaWIyZnYoaW5keCwg
YXJyYXkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjp2ZXJ0ZXhBdHRyaWIzZih1bnNp
Z25lZCBsb25nIGluZHgsIGZsb2F0IHYwLCBmbG9hdCB2MSwgZmxvYXQgdjIpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IDo6Z2xWZXJ0ZXhBdHRyaWIzZihpbmR4LCB2MCwgdjEsIHYyKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliM2Z2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFy
cmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4
dEN1cnJlbnQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliM2Z2KGluZHgsIGFycmF5KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGYodW5zaWduZWQgbG9uZyBpbmR4
LCBmbG9hdCB2MCwgZmxvYXQgdjEsIGZsb2F0IHYyLCBmbG9hdCB2MykKIHsKLSAgICBlbnN1cmVD
b250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpn
bFZlcnRleEF0dHJpYjRmKGluZHgsIHYwLCB2MSwgdjIsIHYzKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6dmVydGV4QXR0cmliNGZ2KHVuc2lnbmVkIGxvbmcgaW5keCwgZmxvYXQqIGFy
cmF5KQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4
dEN1cnJlbnQoKTsKICAgICA6OmdsVmVydGV4QXR0cmliNGZ2KGluZHgsIGFycmF5KTsKIH0KIAog
dm9pZCBHcmFwaGljc0NvbnRleHQzRDo6dmVydGV4QXR0cmliUG9pbnRlcih1bnNpZ25lZCBsb25n
IGluZHgsIGludCBzaXplLCBpbnQgdHlwZSwgYm9vbCBub3JtYWxpemVkLCB1bnNpZ25lZCBsb25n
IHN0cmlkZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2Nv
bnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xWZXJ0ZXhBdHRy
aWJQb2ludGVyKGluZHgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwgcmVpbnRlcnBy
ZXRfY2FzdDx2b2lkKj4oc3RhdGljX2Nhc3Q8aW50cHRyX3Q+KG9mZnNldCkpKTsKIH0KIAogdm9p
ZCBHcmFwaGljc0NvbnRleHQzRDo6dmlld3BvcnQobG9uZyB4LCBsb25nIHksIHVuc2lnbmVkIGxv
bmcgd2lkdGgsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KQogewotICAgIGVuc3VyZUNvbnRleHQobV9j
b250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsVmlld3BvcnQo
c3RhdGljX2Nhc3Q8R0xpbnQ+KHgpLCBzdGF0aWNfY2FzdDxHTGludD4oeSksIHN0YXRpY19jYXN0
PEdMc2l6ZWk+KHdpZHRoKSwgc3RhdGljX2Nhc3Q8R0xzaXplaT4oaGVpZ2h0KSk7CiB9CiAKIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEJvb2xlYW52KHVuc2lnbmVkIGxvbmcgcG5hbWUsIHVu
c2lnbmVkIGNoYXIqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0Qm9vbGVhbnYocG5hbWUsIHZh
bHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0QnVmZmVyUGFyYW1ldGVyaXYo
dW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGludCogdmFsdWUpCiB7
Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVu
dCgpOwogICAgIDo6Z2xHZXRCdWZmZXJQYXJhbWV0ZXJpdih0YXJnZXQsIHBuYW1lLCB2YWx1ZSk7
CiB9CiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEZsb2F0dih1bnNpZ25lZCBsb25nIHBu
YW1lLCBmbG9hdCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
ICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRGbG9hdHYocG5hbWUsIHZhbHVl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50
UGFyYW1ldGVyaXYodW5zaWduZWQgbG9uZyB0YXJnZXQsIHVuc2lnbmVkIGxvbmcgYXR0YWNobWVu
dCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0
KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgaWYgKGF0dGFj
aG1lbnQgPT0gREVQVEhfU1RFTkNJTF9BVFRBQ0hNRU5UKQogICAgICAgICBhdHRhY2htZW50ID0g
REVQVEhfQVRUQUNITUVOVDsgLy8gT3IgU1RFTkNJTF9BVFRBQ0hNRU5ULCBlaXRoZXIgd29ya3Mu
CiAgICAgOjpnbEdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2RVhUKHRhcmdldCwg
YXR0YWNobWVudCwgcG5hbWUsIHZhbHVlKTsKQEAgLTEzMzIsNyArMTEyMyw3IEBAIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmdldEludGVnZXJ2KHVuc2kKICAgICAvLyBiZWNhdXNlIGRlc2t0b3Ag
R0wncyBjb3JyZXNwb25kaW5nIHF1ZXJpZXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50
cwogICAgIC8vIHdoZXJlYXMgR0xFUzIgcmV0dXJuIHRoZSBudW1iZXIgb2YgdmVjdG9ycyAoZWFj
aCB2ZWN0b3IgaGFzIDQgY29tcG9uZW50cykuCiAgICAgLy8gVGhlcmVmb3JlLCB0aGUgdmFsdWUg
cmV0dXJuZWQgYnkgZGVza3RvcCBHTCBuZWVkcyB0byBiZSBkaXZpZGVkIGJ5IDQuCi0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IHN3aXRjaCAocG5hbWUpIHsKICAgICBjYXNlIElNUExFTUVOVEFUSU9OX0NPTE9SX1JFQURfRk9S
TUFUOgogICAgICAgICAqdmFsdWUgPSBHTF9SR0I7CkBAIC0xMzU5LDE1ICsxMTUwLDE1IEBAIHZv
aWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEludGVnZXJ2KHVuc2kKIAogdm9pZCBHcmFwaGljc0Nv
bnRleHQzRDo6Z2V0UHJvZ3JhbWl2KFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSwgdW5zaWduZWQg
bG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9i
aik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEdldFByb2dyYW1pdigoR0x1
aW50KSBwcm9ncmFtLCBwbmFtZSwgdmFsdWUpOwogfQogCiBTdHJpbmcgR3JhcGhpY3NDb250ZXh0
M0Q6OmdldFByb2dyYW1JbmZvTG9nKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3JhbSkKIHsKICAgICBB
U1NFUlQocHJvZ3JhbSk7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOwor
CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAgICAgR0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xH
ZXRQcm9ncmFtaXYoKEdMdWludCkgcHJvZ3JhbSwgR0xfSU5GT19MT0dfTEVOR1RILCAmbGVuZ3Ro
KTsKICAgICAKQEAgLTEzODQsMTYgKzExNzUsMTYgQEAgU3RyaW5nIEdyYXBoaWNzQ29udGV4dDNE
OjpnZXRQcm9ncmFtSW5mbwogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRSZW5kZXJidWZm
ZXJQYXJhbWV0ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
aW50KiB2YWx1ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFr
ZUNvbnRleHRDdXJyZW50KCk7CiAgICAgOjpnbEdldFJlbmRlcmJ1ZmZlclBhcmFtZXRlcml2RVhU
KHRhcmdldCwgcG5hbWUsIHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0
U2hhZGVyaXYoUGxhdGZvcm0zRE9iamVjdCBzaGFkZXIsIHVuc2lnbmVkIGxvbmcgcG5hbWUsIGlu
dCogdmFsdWUpCiB7CiAgICAgQVNTRVJUKHNoYWRlcik7Ci0gICAgCi0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOwotICAgIAorCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKICAg
ICBIYXNoTWFwPFBsYXRmb3JtM0RPYmplY3QsIFNoYWRlclNvdXJjZUVudHJ5Pjo6aXRlcmF0b3Ig
cmVzdWx0ID0gbV9zaGFkZXJTb3VyY2VNYXAuZmluZChzaGFkZXIpOwogICAgIAogICAgIHN3aXRj
aCAocG5hbWUpIHsKQEAgLTE0MDMsMjUgKzExOTQsMjUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQz
RDo6Z2V0U2hhZGVyaXYoUGxhdAogICAgICAgICAKICAgICAgICAgICAgIDo6Z2xHZXRTaGFkZXJp
digoR0x1aW50KSBzaGFkZXIsIHBuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKLQor
ICAgICAgICAKICAgICAgICAgY2FzZSBDT01QSUxFX1NUQVRVUzoKICAgICAgICAgICAgIGlmIChy
ZXN1bHQgPT0gbV9zaGFkZXJTb3VyY2VNYXAuZW5kKCkpIHsKICAgICAgICAgICAgICAgICAoKnZh
bHVlKSA9IHN0YXRpY19jYXN0PGludD4oZmFsc2UpOwogICAgICAgICAgICAgICAgIHJldHVybjsK
ICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKKyAgICAgICAgCiAgICAgICAgICAgICAo
KnZhbHVlKSA9IHN0YXRpY19jYXN0PGludD4ocmVzdWx0LT5zZWNvbmQuaXNWYWxpZCk7CiAgICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgICAgIAorICAgICAgICAKICAgICAgICAgY2FzZSBJTkZP
X0xPR19MRU5HVEg6CiAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG1fc2hhZGVyU291cmNlTWFw
LmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgKCp2YWx1ZSkgPSAwOwogICAgICAgICAgICAgICAg
IHJldHVybjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorICAgICAgICAKICAgICAgICAg
ICAgICgqdmFsdWUpID0gZ2V0U2hhZGVySW5mb0xvZyhzaGFkZXIpLmxlbmd0aCgpOwogICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAKKyAgICAgICAgCiAgICAgICAgIGNhc2UgU0hBREVS
X1NPVVJDRV9MRU5HVEg6CiAgICAgICAgICAgICAoKnZhbHVlKSA9IGdldFNoYWRlclNvdXJjZShz
aGFkZXIpLmxlbmd0aCgpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0xNDM1LDcgKzEyMjYsNyBA
QCBTdHJpbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFNoYWRlckluZm9MCiB7CiAgICAgQVNTRVJU
KHNoYWRlcik7CiAKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNv
bnRleHRDdXJyZW50KCk7CiAgICAgR0xpbnQgbGVuZ3RoOwogICAgIDo6Z2xHZXRTaGFkZXJpdigo
R0x1aW50KSBzaGFkZXIsIEdMX0lORk9fTE9HX0xFTkdUSCwgJmxlbmd0aCk7CiAKQEAgLTE0NzAs
NyArMTI2MSw3IEBAIFN0cmluZyBHcmFwaGljc0NvbnRleHQzRDo6Z2V0U2hhZGVyU291cmMKIHsK
ICAgICBBU1NFUlQoc2hhZGVyKTsKIAotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsK
KyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKIAogICAgIEhhc2hNYXA8UGxhdGZvcm0zRE9iamVj
dCwgU2hhZGVyU291cmNlRW50cnk+OjppdGVyYXRvciByZXN1bHQgPSBtX3NoYWRlclNvdXJjZU1h
cC5maW5kKHNoYWRlcik7CiAKQEAgLTE0ODMsNTIgKzEyNzQsNTIgQEAgU3RyaW5nIEdyYXBoaWNz
Q29udGV4dDNEOjpnZXRTaGFkZXJTb3VyYwogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRU
ZXhQYXJhbWV0ZXJmdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwg
ZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBt
YWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6OmdsR2V0VGV4UGFyYW1ldGVyZnYodGFyZ2V0LCBw
bmFtZSwgdmFsdWUpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRUZXhQYXJhbWV0
ZXJpdih1bnNpZ25lZCBsb25nIHRhcmdldCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1
ZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgOjpnbEdldFRleFBhcmFtZXRlcml2KHRhcmdldCwgcG5hbWUsIHZhbHVl
KTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybWZ2KFBsYXRmb3JtM0RP
YmplY3QgcHJvZ3JhbSwgbG9uZyBsb2NhdGlvbiwgZmxvYXQqIHZhbHVlKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICA6
OmdsR2V0VW5pZm9ybWZ2KChHTHVpbnQpIHByb2dyYW0sIGxvY2F0aW9uLCB2YWx1ZSk7CiB9CiAK
IHZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFVuaWZvcm1pdihQbGF0Zm9ybTNET2JqZWN0IHBy
b2dyYW0sIGxvbmcgbG9jYXRpb24sIGludCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dCht
X2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRVbmlm
b3JtaXYoKEdMdWludCkgcHJvZ3JhbSwgbG9jYXRpb24sIHZhbHVlKTsKIH0KIAogbG9uZyBHcmFw
aGljc0NvbnRleHQzRDo6Z2V0VW5pZm9ybUxvY2F0aW9uKFBsYXRmb3JtM0RPYmplY3QgcHJvZ3Jh
bSwgY29uc3QgU3RyaW5nJiBuYW1lKQogewogICAgIEFTU0VSVChwcm9ncmFtKTsKLSAgICAKLSAg
ICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQo
KTsKICAgICByZXR1cm4gOjpnbEdldFVuaWZvcm1Mb2NhdGlvbigoR0x1aW50KSBwcm9ncmFtLCBu
YW1lLnV0ZjgoKS5kYXRhKCkpOwogfQogCiB2b2lkIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0
ZXhBdHRyaWJmdih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHBuYW1lLCBmbG9h
dCogdmFsdWUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJmdihpbmRleCwgcG5hbWUs
IHZhbHVlKTsKIH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6Z2V0VmVydGV4QXR0cmliaXYo
dW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSwgaW50KiB2YWx1ZSkKIHsK
LSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50
KCk7CiAgICAgOjpnbEdldFZlcnRleEF0dHJpYml2KGluZGV4LCBwbmFtZSwgdmFsdWUpOwogfQog
CiBsb25nIEdyYXBoaWNzQ29udGV4dDNEOjpnZXRWZXJ0ZXhBdHRyaWJPZmZzZXQodW5zaWduZWQg
bG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyBwbmFtZSkKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1f
Y29udGV4dE9iaik7Ci0gICAgCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisKICAgICB2b2lk
KiBwb2ludGVyOwogICAgIDo6Z2xHZXRWZXJ0ZXhBdHRyaWJQb2ludGVydihpbmRleCwgcG5hbWUs
ICZwb2ludGVyKTsKICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxsb25nPihwb2ludGVyKTsK
QEAgLTE1MzYsNyArMTMyNyw3IEBAIGxvbmcgR3JhcGhpY3NDb250ZXh0M0Q6OmdldFZlcnRleEF0
dHJpYk8KIAogaW50IEdyYXBoaWNzQ29udGV4dDNEOjp0ZXhJbWFnZTJEKHVuc2lnbmVkIHRhcmdl
dCwgdW5zaWduZWQgbGV2ZWwsIHVuc2lnbmVkIGludGVybmFsZm9ybWF0LCB1bnNpZ25lZCB3aWR0
aCwgdW5zaWduZWQgaGVpZ2h0LCB1bnNpZ25lZCBib3JkZXIsIHVuc2lnbmVkIGZvcm1hdCwgdW5z
aWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0
T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKIAogICAgIDo6Z2xUZXhJbWFnZTJEKHRh
cmdldCwgbGV2ZWwsIGludGVybmFsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBib3JkZXIsIGZvcm1h
dCwgdHlwZSwgcGl4ZWxzKTsKICAgICByZXR1cm4gMDsKQEAgLTE1NDQsNyArMTMzNSw3IEBAIGlu
dCBHcmFwaGljc0NvbnRleHQzRDo6dGV4SW1hZ2UyRCh1bnNpZ24KIAogaW50IEdyYXBoaWNzQ29u
dGV4dDNEOjp0ZXhTdWJJbWFnZTJEKHVuc2lnbmVkIHRhcmdldCwgdW5zaWduZWQgbGV2ZWwsIHVu
c2lnbmVkIHhvZmYsIHVuc2lnbmVkIHlvZmYsIHVuc2lnbmVkIHdpZHRoLCB1bnNpZ25lZCBoZWln
aHQsIHVuc2lnbmVkIGZvcm1hdCwgdW5zaWduZWQgdHlwZSwgdm9pZCogcGl4ZWxzKQogewotICAg
IGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsK
IAogICAgIC8vIEZJWE1FOiB3ZSB3aWxsIG5lZWQgdG8gZGVhbCB3aXRoIFBpeGVsU3RvcmUgcGFy
YW1zIHdoZW4gZGVhbGluZyB3aXRoIGltYWdlIGJ1ZmZlcnMgdGhhdCBkaWZmZXIgZnJvbSB0aGUg
c3ViaW1hZ2Ugc2l6ZQogICAgIDo6Z2xUZXhTdWJJbWFnZTJEKHRhcmdldCwgbGV2ZWwsIHhvZmYs
IHlvZmYsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgcGl4ZWxzKTsKQEAgLTE1NTMsNyAr
MTM0NCw3IEBAIGludCBHcmFwaGljc0NvbnRleHQzRDo6dGV4U3ViSW1hZ2UyRCh1bnMKIAogdW5z
aWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZUJ1ZmZlcigpCiB7Ci0gICAgZW5zdXJlQ29u
dGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMdWlu
dCBvOwogICAgIGdsR2VuQnVmZmVycygxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0xNTYxLDcg
KzEzNTIsNyBAQCB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlQnVmZmVyCiAKIHVu
c2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVGcmFtZWJ1ZmZlcigpCiB7Ci0gICAgZW5z
dXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAg
IEdMdWludCBvOwogICAgIGdsR2VuRnJhbWVidWZmZXJzRVhUKDEsICZvKTsKICAgICByZXR1cm4g
bzsKQEAgLTE1NjksMTMgKzEzNjAsMTMgQEAgdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNy
ZWF0ZUZyYW1lYgogCiB1bnNpZ25lZCBHcmFwaGljc0NvbnRleHQzRDo6Y3JlYXRlUHJvZ3JhbSgp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIHJldHVybiBnbENyZWF0ZVByb2dyYW0oKTsKIH0KIAogdW5zaWduZWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVJlbmRlcmJ1ZmZlcigpCiB7Ci0gICAgZW5zdXJlQ29udGV4
dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3VycmVudCgpOwogICAgIEdMdWludCBv
OwogICAgIGdsR2VuUmVuZGVyYnVmZmVyc0VYVCgxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBAIC0x
NTgzLDEzICsxMzc0LDEzIEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVSZW5k
ZXIKIAogdW5zaWduZWQgR3JhcGhpY3NDb250ZXh0M0Q6OmNyZWF0ZVNoYWRlcih1bnNpZ25lZCBs
b25nIHR5cGUpCiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VD
b250ZXh0Q3VycmVudCgpOwogICAgIHJldHVybiBnbENyZWF0ZVNoYWRlcigodHlwZSA9PSBGUkFH
TUVOVF9TSEFERVIpID8gR0xfRlJBR01FTlRfU0hBREVSIDogR0xfVkVSVEVYX1NIQURFUik7CiB9
CiAKIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVUZXh0dXJlKCkKIHsKLSAgICBl
bnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CiAg
ICAgR0x1aW50IG87CiAgICAgZ2xHZW5UZXh0dXJlcygxLCAmbyk7CiAgICAgcmV0dXJuIG87CkBA
IC0xNTk3LDM3ICsxMzg4LDM3IEBAIHVuc2lnbmVkIEdyYXBoaWNzQ29udGV4dDNEOjpjcmVhdGVU
ZXh0dXIKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlQnVmZmVyKHVuc2lnbmVkIGJ1
ZmZlcikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRl
eHRDdXJyZW50KCk7CiAgICAgZ2xEZWxldGVCdWZmZXJzKDEsICZidWZmZXIpOwogfQogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDNEOjpkZWxldGVGcmFtZWJ1ZmZlcih1bnNpZ25lZCBmcmFtZWJ1ZmZl
cikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgZ2xEZWxldGVGcmFtZWJ1ZmZlcnNFWFQoMSwgJmZyYW1lYnVmZmVyKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlUHJvZ3JhbSh1bnNpZ25lZCBwcm9n
cmFtKQogewotICAgIGVuc3VyZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4
dEN1cnJlbnQoKTsKICAgICBnbERlbGV0ZVByb2dyYW0ocHJvZ3JhbSk7CiB9CiAKIHZvaWQgR3Jh
cGhpY3NDb250ZXh0M0Q6OmRlbGV0ZVJlbmRlcmJ1ZmZlcih1bnNpZ25lZCByZW5kZXJidWZmZXIp
CiB7Ci0gICAgZW5zdXJlQ29udGV4dChtX2NvbnRleHRPYmopOworICAgIG1ha2VDb250ZXh0Q3Vy
cmVudCgpOwogICAgIGdsRGVsZXRlUmVuZGVyYnVmZmVyc0VYVCgxLCAmcmVuZGVyYnVmZmVyKTsK
IH0KIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRDo6ZGVsZXRlU2hhZGVyKHVuc2lnbmVkIHNoYWRl
cikKIHsKLSAgICBlbnN1cmVDb250ZXh0KG1fY29udGV4dE9iaik7CisgICAgbWFrZUNvbnRleHRD
dXJyZW50KCk7CiAgICAgZ2xEZWxldGVTaGFkZXIoc2hhZGVyKTsKIH0KIAogdm9pZCBHcmFwaGlj
c0NvbnRleHQzRDo6ZGVsZXRlVGV4dHVyZSh1bnNpZ25lZCB0ZXh0dXJlKQogewotICAgIGVuc3Vy
ZUNvbnRleHQobV9jb250ZXh0T2JqKTsKKyAgICBtYWtlQ29udGV4dEN1cnJlbnQoKTsKICAgICBn
bERlbGV0ZVRleHR1cmVzKDEsICZ0ZXh0dXJlKTsKIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>