<?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>77266</bug_id>
          
          <creation_ts>2012-01-27 18:04:43 -0800</creation_ts>
          <short_desc>[chromium] Implement CSS filters on composited layers.</short_desc>
          <delta_ts>2012-02-11 09:47:11 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Stephen White">senorblanco</reporter>
          <assigned_to name="Stephen White">senorblanco</assigned_to>
          <cc>cc-bugs</cc>
    
    <cc>danakj</cc>
    
    <cc>enne</cc>
    
    <cc>jamesr</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>544558</commentid>
    <comment_count>0</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-27 18:04:43 -0800</bug_when>
    <thetext>[chromium] Implement CSS filters on composited layers.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>544560</commentid>
    <comment_count>1</comment_count>
      <attachid>124412</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-27 18:06:18 -0800</bug_when>
    <thetext>Created attachment 124412
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546168</commentid>
    <comment_count>2</comment_count>
      <attachid>124412</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-31 09:40:33 -0800</bug_when>
    <thetext>Comment on attachment 124412
Patch

James || Enne || Vangelis, could you take a look?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546228</commentid>
    <comment_count>3</comment_count>
      <attachid>124412</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-01-31 10:54:33 -0800</bug_when>
    <thetext>Comment on attachment 124412
Patch

I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.

Can we move the drawing logic into its own file? it&apos;s a lot of LOC.

Do we always have a ganesh context on the compositor context?  What does that imply resource-wise?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546287</commentid>
    <comment_count>4</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-31 11:30:37 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 124412 [details])
&gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; 
&gt; Can we move the drawing logic into its own file? it&apos;s a lot of LOC.

Can do.


&gt; Do we always have a ganesh context on the compositor context?  What does that imply resource-wise?

No, it&apos;s created lazily, at least according to GraphicsContext3DPrivate::grContext().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546390</commentid>
    <comment_count>5</comment_count>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-01-31 12:49:34 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 124412 [details])
&gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.

For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
https://bugs.webkit.org/attachment.cgi?id=124751&amp;action=review

Blur is a headache.. IIUC what filters are doing, a blur on a RenderSurface would make a boundary where occlusion computation from outside the RenderSurface&apos;s subtree would not be valid inside the subtree and vice versa. Line 467 in the above CL should not copy occlusion into such a subtree but detecting it here is not obvious.

What if we put some properties on RenderSurfaces that are computed in calcDrawTransformsAndVisibility?
 - has opaque-destroying filter
 - is in blur subtree (a pointer to the nearest blurring ancestor RenderSurface)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546522</commentid>
    <comment_count>6</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-31 14:53:05 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 124412 [details] [details])
&gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; 
&gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.

For now, could we simply be uber-conservative, and assume any layer with a filter is entirely opaque?  Then we can refine that in subsequent work.

&gt; https://bugs.webkit.org/attachment.cgi?id=124751&amp;action=review
&gt; 
&gt; Blur is a headache.. IIUC what filters are doing, a blur on a RenderSurface would make a boundary where occlusion computation from outside the RenderSurface&apos;s subtree would not be valid inside the subtree and vice versa. Line 467 in the above CL should not copy occlusion into such a subtree but detecting it here is not obvious.
&gt; 
&gt; What if we put some properties on RenderSurfaces that are computed in calcDrawTransformsAndVisibility?
&gt;  - has opaque-destroying filter
&gt;  - is in blur subtree (a pointer to the nearest blurring ancestor RenderSurface)

(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 124412 [details] [details])
&gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; 
&gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
&gt; https://bugs.webkit.org/attachment.cgi?id=124751&amp;action=review
&gt; 
&gt; Blur is a headache.. IIUC what filters are doing, a blur on a RenderSurface would make a boundary where occlusion computation from outside the RenderSurface&apos;s subtree would not be valid inside the subtree and vice versa. Line 467 in the above CL should not copy occlusion into such a subtree but detecting it here is not obvious.
&gt; 
&gt; What if we put some properties on RenderSurfaces that are computed in calcDrawTransformsAndVisibility?
&gt;  - has opaque-destroying filter
&gt;  - is in blur subtree (a pointer to the nearest blurring ancestor RenderSurface)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546528</commentid>
    <comment_count>7</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-31 14:55:51 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; (From update of attachment 124412 [details] [details] [details])
&gt; &gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; &gt; 
&gt; &gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
&gt; 
&gt; For now, could we simply be uber-conservative, and assume any layer with a filter is entirely opaque?  Then we can refine that in subsequent work.

Er, non-opaque.  Whatever the conservative assumption would be.  :)

&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=124751&amp;action=review
&gt; &gt; 
&gt; &gt; Blur is a headache.. IIUC what filters are doing, a blur on a RenderSurface would make a boundary where occlusion computation from outside the RenderSurface&apos;s subtree would not be valid inside the subtree and vice versa. Line 467 in the above CL should not copy occlusion into such a subtree but detecting it here is not obvious.
&gt; &gt; 
&gt; &gt; What if we put some properties on RenderSurfaces that are computed in calcDrawTransformsAndVisibility?
&gt; &gt;  - has opaque-destroying filter
&gt; &gt;  - is in blur subtree (a pointer to the nearest blurring ancestor RenderSurface)
&gt; 
&gt; (In reply to comment #5)
&gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; (From update of attachment 124412 [details] [details] [details])
&gt; &gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; &gt; 
&gt; &gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=124751&amp;action=review
&gt; &gt; 
&gt; &gt; Blur is a headache.. IIUC what filters are doing, a blur on a RenderSurface would make a boundary where occlusion computation from outside the RenderSurface&apos;s subtree would not be valid inside the subtree and vice versa. Line 467 in the above CL should not copy occlusion into such a subtree but detecting it here is not obvious.
&gt; &gt; 
&gt; &gt; What if we put some properties on RenderSurfaces that are computed in calcDrawTransformsAndVisibility?
&gt; &gt;  - has opaque-destroying filter
&gt; &gt;  - is in blur subtree (a pointer to the nearest blurring ancestor RenderSurface)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546532</commentid>
    <comment_count>8</comment_count>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-01-31 14:58:45 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (In reply to comment #6)
&gt; &gt; (In reply to comment #5)
&gt; &gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; (From update of attachment 124412 [details] [details] [details] [details])
&gt; &gt; &gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; &gt; &gt; 
&gt; &gt; &gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
&gt; &gt; 
&gt; &gt; For now, could we simply be uber-conservative, and assume any layer with a filter is entirely opaque?  Then we can refine that in subsequent work.
&gt; 
&gt; Er, non-opaque.  Whatever the conservative assumption would be.  :)

Yes that&apos;s fine, but it doesn&apos;t work for blur. We do need to know when we&apos;re entering a subtree of a RenderSurface that has blur (aka looking at a layer that will eventually be blurred at some point).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546550</commentid>
    <comment_count>9</comment_count>
      <attachid>124833</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-01-31 15:17:01 -0800</bug_when>
    <thetext>Created attachment 124833
move filters application to helper class</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546660</commentid>
    <comment_count>10</comment_count>
    <who name="Adrienne Walker">enne</who>
    <bug_when>2012-01-31 17:09:37 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; (In reply to comment #6)
&gt; &gt; &gt; (In reply to comment #5)
&gt; &gt; &gt; &gt; (In reply to comment #3)
&gt; &gt; &gt; &gt; &gt; (From update of attachment 124412 [details] [details] [details] [details] [details])
&gt; &gt; &gt; &gt; &gt; I think culling / occlusions need to be aware of filters since blur can cause different source pixels to be referenced and other filters can change opacity.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; For opacity changes, line 510 of CCLayerTreeHost.cpp in the below CL needs to know if the target surface has a filter that would make any opaque pixels non-opaque. This CL is in CQ so should end up on ToT shortly.
&gt; &gt; &gt; 
&gt; &gt; &gt; For now, could we simply be uber-conservative, and assume any layer with a filter is entirely opaque?  Then we can refine that in subsequent work.
&gt; &gt; 
&gt; &gt; Er, non-opaque.  Whatever the conservative assumption would be.  :)
&gt; 
&gt; Yes that&apos;s fine, but it doesn&apos;t work for blur. We do need to know when we&apos;re entering a subtree of a RenderSurface that has blur (aka looking at a layer that will eventually be blurred at some point).

On the draw culling side of things, we don&apos;t cull outside of a render surface, so blur shouldn&apos;t affect anything at the moment.  On the paint culling side, does a blur need to be handled much differently than a mask would be? They&apos;re both modifications to the opaque regions of a surface, and we can ignore them both for now.

(I don&apos;t really have additional comments about this patch; it looks good in general to me!)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546667</commentid>
    <comment_count>11</comment_count>
    <who name="Dana Jansens">danakj</who>
    <bug_when>2012-01-31 17:16:12 -0800</bug_when>
    <thetext>Blur is only different because it pushes occluded pixels out from behind occlusion. So the accumulated occlusion needs to account for that before it gets to the blurred stuff.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>546798</commentid>
    <comment_count>12</comment_count>
      <attachid>124833</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-01-31 21:49:33 -0800</bug_when>
    <thetext>Comment on attachment 124833
move filters application to helper class

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

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp:287
&gt; +            renderSurface-&gt;setFilters(layer-&gt;filters());

You&apos;ll need to call setFilters regardless of useSurfaceForFilters so that you can clear the filters from an existing RS if the layer ceases to have filters.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp:239
&gt; +    // FIXME: Put this in a &quot;LayerRenderChromium::resetContext()&quot; to

This seems pretty fragile indeed.  I would much prefer to have implement the LRC::resetContext() method.  There&apos;s some more state that gets set during rendering including the bound vertex and index arrays, scissoring, etc.  We need to make sure that they can be preserved.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:2
&gt; + * Copyright (C) 2011 Google Inc. All rights reserved.

2012

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:154
&gt; +    GrContext* gr = context3D-&gt;grContext();

We&apos;ll need to make sure that the resources allocated by this GrContext are also released when the compositor is asked to free up its textures.

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:168
&gt; +    source.setPixelRef(new SkGrTexturePixelRef(texture.get()))-&gt;unref();

You&apos;ll need to make sure that if filters.size() == 0 then you don&apos;t end up wrapping the original RS (managed) texture with an SkBitmap.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547122</commentid>
    <comment_count>13</comment_count>
      <attachid>124833</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-01 09:23:44 -0800</bug_when>
    <thetext>Comment on attachment 124833
move filters application to helper class

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp:287
&gt;&gt; +            renderSurface-&gt;setFilters(layer-&gt;filters());
&gt; 
&gt; You&apos;ll need to call setFilters regardless of useSurfaceForFilters so that you can clear the filters from an existing RS if the layer ceases to have filters.

Thanks, fixed.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp:239
&gt;&gt; +    // FIXME: Put this in a &quot;LayerRenderChromium::resetContext()&quot; to
&gt; 
&gt; This seems pretty fragile indeed.  I would much prefer to have implement the LRC::resetContext() method.  There&apos;s some more state that gets set during rendering including the bound vertex and index arrays, scissoring, etc.  We need to make sure that they can be preserved.

Done.  The buffer bindings should be restored by the call to GeometryBinding::prepareForDraw().

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:2
&gt;&gt; + * Copyright (C) 2011 Google Inc. All rights reserved.
&gt; 
&gt; 2012

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:154
&gt;&gt; +    GrContext* gr = context3D-&gt;grContext();
&gt; 
&gt; We&apos;ll need to make sure that the resources allocated by this GrContext are also released when the compositor is asked to free up its textures.

James and I were talking about that, and we think it could be handled by the mechanism that twiz is working on to reset the GrContext associated with a given GraphicsContext3D.  I can&apos;t trigger it from the compositor right now, since just asking for a grContext() will lazily create it, even if all we want to do is flush its resources.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.cpp:168
&gt;&gt; +    source.setPixelRef(new SkGrTexturePixelRef(texture.get()))-&gt;unref();
&gt; 
&gt; You&apos;ll need to make sure that if filters.size() == 0 then you don&apos;t end up wrapping the original RS (managed) texture with an SkBitmap.

This function is only called when filters.size() &gt; 0 (previously in CCRenderSurface::draw(), I&apos;ve moved that to CCRenderSurface::applyFilters()).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547123</commentid>
    <comment_count>14</comment_count>
      <attachid>124960</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-01 09:25:28 -0800</bug_when>
    <thetext>Created attachment 124960
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>547124</commentid>
    <comment_count>15</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-01 09:28:07 -0800</bug_when>
    <thetext>(In reply to comment #14)
&gt; Created an attachment (id=124960) [details]
&gt; Patch

This addresses Vangelis&apos;s comments, and also removes m_filterBitmap in favour of a parameter plumbed through drawSurface() and drawLayer().  Since the filtered bitmap is not currently cached anyway, this makes the lifetime issues a bit clearer.

This does not yet address Dana&apos;s comments, since I haven&apos;t been able to reproduce the blur problem yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551166</commentid>
    <comment_count>16</comment_count>
      <attachid>124960</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2012-02-07 11:28:33 -0800</bug_when>
    <thetext>Comment on attachment 124960
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:791
&gt; +    GLC(context3D, m_context-&gt;activeTexture(GraphicsContext3D::TEXTURE0));

It&apos;s set at LRC::beginDrawingFrame() sets some more state (colorMask, blendFunc, DEPTH_TEST, CULL_FACE, etc).  I think right now some of it is being re-set before we draw a quad (blendFunc, blend enabled) but some is not.  We need to find the exact state we depend on setting and move it all to this method.  beginDrawingFrame() should call this as well. 
I&apos;m still concerned that any change in the Ganesh code could break the compositor if a state is set in a way we don&apos;t expect.  Should we create an additional context to handle filters if we&apos;re running the compositor on the thread and re-using the canvas shared context if we&apos;re singlethreaded?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551210</commentid>
    <comment_count>17</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-07 12:00:40 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; (From update of attachment 124960 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=124960&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:791
&gt; &gt; +    GLC(context3D, m_context-&gt;activeTexture(GraphicsContext3D::TEXTURE0));
&gt; 
&gt; It&apos;s set at LRC::beginDrawingFrame() sets some more state (colorMask, blendFunc, DEPTH_TEST, CULL_FACE, etc).  I think right now some of it is being re-set before we draw a quad (blendFunc, blend enabled) but some is not.  We need to find the exact state we depend on setting and move it all to this method.  beginDrawingFrame() should call this as well. 

That sounds like a good idea.  However, is that something we need to do in this change, or something that could wait for a followup?  If it should be done now, could you send a list of all the compositor state you&apos;d like to see reset?

&gt; I&apos;m still concerned that any change in the Ganesh code could break the compositor if a state is set in a way we don&apos;t expect. 

Yes, I fully expect that the filters may have state change bugs which will be on me to fix, but if you don&apos;t use -webkit-filter, I don&apos;t think this patch will affect the compositor.  Note that accelerated painting suffers from some of the same problems.

&gt; Should we create an additional context to handle filters if we&apos;re running the compositor on the thread and re-using the canvas shared context if we&apos;re singlethreaded?

It could be done (although there was a reason I decided against it that I can&apos;t remember right now).    The other issue is that canvas shared context creation is all handled through ImageBuffers right now.  I wasn&apos;t sure if that dependency would be a problem for GTFO.  It also makes it a little tricky to extract out the backing store and have it live longer than the ImageBuffer which creates it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551655</commentid>
    <comment_count>18</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-07 18:18:54 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #16)
&gt; &gt; (From update of attachment 124960 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=124960&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/graphics/chromium/LayerRendererChromium.cpp:791
&gt; &gt; &gt; +    GLC(context3D, m_context-&gt;activeTexture(GraphicsContext3D::TEXTURE0));
&gt; &gt; 
&gt; &gt; It&apos;s set at LRC::beginDrawingFrame() sets some more state (colorMask, blendFunc, DEPTH_TEST, CULL_FACE, etc).  I think right now some of it is being re-set before we draw a quad (blendFunc, blend enabled) but some is not.  We need to find the exact state we depend on setting and move it all to this method.  beginDrawingFrame() should call this as well. 
&gt; 
&gt; That sounds like a good idea.  However, is that something we need to do in this change, or something that could wait for a followup?  If it should be done now, could you send a list of all the compositor state you&apos;d like to see reset?
&gt; 
&gt; &gt; I&apos;m still concerned that any change in the Ganesh code could break the compositor if a state is set in a way we don&apos;t expect. 
&gt; 
&gt; Yes, I fully expect that the filters may have state change bugs which will be on me to fix, but if you don&apos;t use -webkit-filter, I don&apos;t think this patch will affect the compositor.  Note that accelerated painting suffers from some of the same problems.
&gt; 
&gt; &gt; Should we create an additional context to handle filters if we&apos;re running the compositor on the thread and re-using the canvas shared context if we&apos;re singlethreaded?
&gt; 
&gt; It could be done (although there was a reason I decided against it that I can&apos;t remember right now).    The other issue is that canvas shared context creation is all handled through ImageBuffers right now.  I wasn&apos;t sure if that dependency would be a problem for GTFO.  It also makes it a little tricky to extract out the backing store and have it live longer than the ImageBuffer which creates it.

Forget everything I said.  :)

I just realized I don&apos;t need any of that ImageBuffer stuff.  I can just use the SharedGraphicsContext3D (and the GrContext on it) directly, and there should be no changes necessary for the filter code at all.  I&apos;ll give that a try tomorrow.

For the threaded case, I just need to figure out who will own/create the GC3D it&apos;ll use.  I think it should live as long as the one for the compositor, but I&apos;m not sure which class should own it.  Alternatively, I could just leave the feature off in the threaded case for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552301</commentid>
    <comment_count>19</comment_count>
      <attachid>126120</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-08 11:06:36 -0800</bug_when>
    <thetext>Created attachment 126120
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552308</commentid>
    <comment_count>20</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-08 11:11:39 -0800</bug_when>
    <thetext>(In reply to comment #19)
&gt; Created an attachment (id=126120) [details]
&gt; Patch

This version uses the SharedGraphicsContext3D as suggested, and leaves the compositor context state alone.  I needed to add a flush on each context change in order to get the texture contents up-to-date (this is expected)).  Filters are disabled for the threaded compositor case for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552364</commentid>
    <comment_count>21</comment_count>
      <attachid>126120</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-02-08 12:02:51 -0800</bug_when>
    <thetext>Comment on attachment 126120
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/LayerChromium.cpp:310
&gt; +    m_filters = filters;

can you compare FilterOperations for equality? our normal pattern for state setters like this is to early-out if the new value is the same as the old, so that even if WebKit pushes this state more frequently than this actually changes we don&apos;t produce unnecessary frames

when _does_ webkit push new filters?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp:231
&gt; +    // Don&apos;t use the utility context if we have a compositor thread, since
&gt; +    // it can race with canvas&apos;s use.

can you file a bug on this?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.h:38
&gt; +class CCRenderSurfaceFilters {

nit: newline before class declaration, please.

is class this just for namespacing? if so can you hide the c&apos;tor in a private section so people don&apos;t attempt to instantiate it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552386</commentid>
    <comment_count>22</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-08 12:22:43 -0800</bug_when>
    <thetext>(In reply to comment #21)
&gt; (From update of attachment 126120 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=126120&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/chromium/LayerChromium.cpp:310
&gt; &gt; +    m_filters = filters;
&gt; 
&gt; can you compare FilterOperations for equality? our normal pattern for state setters like this is to early-out if the new value is the same as the old, so that even if WebKit pushes this state more frequently than this actually changes we don&apos;t produce unnecessary frames

Yes, it does seem to have an operator==.  I&apos;ll add that check.

&gt; when _does_ webkit push new filters?

Good question.  Often enough?  :)

&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurface.cpp:231
&gt; &gt; +    // Don&apos;t use the utility context if we have a compositor thread, since
&gt; &gt; +    // it can race with canvas&apos;s use.
&gt; 
&gt; can you file a bug on this?

Done.  https://bugs.webkit.org/show_bug.cgi?id=78139

&gt; &gt; Source/WebCore/platform/graphics/chromium/cc/CCRenderSurfaceFilters.h:38
&gt; &gt; +class CCRenderSurfaceFilters {
&gt; 
&gt; nit: newline before class declaration, please.

&gt; is class this just for namespacing?

See Comment #3.

&gt; if so can you hide the c&apos;tor in a private section so people don&apos;t attempt to instantiate it?

Will do.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552398</commentid>
    <comment_count>23</comment_count>
      <attachid>126120</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2012-02-08 12:29:53 -0800</bug_when>
    <thetext>Comment on attachment 126120
Patch

OK, R=me with those changes then.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>554639</commentid>
    <comment_count>24</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2012-02-11 09:47:11 -0800</bug_when>
    <thetext>Committed r107480: &lt;http://trac.webkit.org/changeset/107480&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124412</attachid>
            <date>2012-01-27 18:06:18 -0800</date>
            <delta_ts>2012-01-31 15:16:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77266-20120127180617.patch</filename>
            <type>text/plain</type>
            <size>24570</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjE1OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDczIEBACisyMDEyLTAxLTI3ICBTdGVwaGVu
IFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisgICAgICAgIEVuYWJsZSBDU1Mg
ZmlsdGVycyBvbiBjb21wb3NpdGVkIGxheWVycy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTc3MjY2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgV2lsbCBiZSBjb3ZlcmVkIGJ5IGV4aXN0aW5nIHRlc3RzIGlu
IGNzczMvZmlsdGVycyAod2hlbiBlbmFibGVkKS4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldEZpbHRlcnMpOgorICAgICAgICAoV2ViQ29yZSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9t
aXVtLmg6CisgICAgICAgIChHcmFwaGljc0xheWVyQ2hyb21pdW0pOgorICAgICAgICBPdmVycmlk
ZSBzZXRGaWx0ZXJzKCkgdmlydHVhbCBmcm9tIEdyYXBoaWNzTGF5ZXIuCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpMYXllckNocm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IHNldEZp
bHRlcnMoKSB0byBjYWNoZSB0aGUgZmlsdGVycyBoZXJlLi4uCisKKyAgICAgICAgKFdlYkNvcmUp
OgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6cHVzaFByb3BlcnRpZXNUbyk6Cisg
ICAgICAgIC4uLiBhbmQgZm9yd2FyZCB0aGVtIG9uIHRvIHRoZSBDQ0xheWVySW1wbCBhdCBjb21t
aXQgdGltZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9t
aXVtLmg6CisgICAgICAgIChMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVy
Q2hyb21pdW06OmZpbHRlcnMpOgorICAgICAgICBJbXBsZW1lbnQgYWNjZXNzb3IuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmVuZGVyU3VyZmFjZUNocm9taXVtLmg6Cisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFJlbmRlclN1cmZhY2VDaHJvbWl1bSk6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJTdXJmYWNlQ2hyb21pdW06OnNldEZpbHRlcnMpOgorICAgICAg
ICBJbXBsZW1lbnQgc3R1YiB2ZXJzaW9uIG9mIHNldEZpbHRlcnMoKSwgdG8gc2F0aXNmeSB0aGUg
dGVtcGxhdGVzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5
ZXJJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJJbXBsOjpzZXRGaWx0ZXJzKToK
KyAgICAgICAgSW1wbGVtZW50IHNldHRlciB0byByZWNlaXZlIGZpbHRlcnMgYXQgY29tbWl0IHRp
bWUuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwu
aDoKKyAgICAgICAgKENDTGF5ZXJJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJJbXBs
OjpmaWx0ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IG1lbWJlciBhbmQgYWNjZXNzb3IgZm9yIGZp
bHRlcnMuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0Q29tbW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OmNhbGN1bGF0ZURyYXdUcmFuc2Zv
cm1zQW5kVmlzaWJpbGl0eUludGVybmFsKToKKyAgICAgICAgQWRkIGFub3RoZXIgY2xhdXNlIGhl
cmUgdG8gZm9yY2UgY3JlYXRpb24gb2YgYSBSZW5kZXJTdXJmYWNlIHdoZW4KKyAgICAgICAgZmls
dGVycyBhcmUgcHJlc2VudCwgYW5kIHRvIGZvcndhcmQgdGhlbSBmcm9tIHRoZSBsYXllciB0byB0
aGUKKyAgICAgICAgUmVuZGVyU3VyZmFjZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NSZW5k
ZXJTdXJmYWNlOjpkcmF3KToKKyAgICAgICAgQ2hlY2sgZm9yIGZpbHRlcnMgYXQgZHJhdyB0aW1l
LCBhcHBseSB0aGVtLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbgorICAgICAgICBtX2ZpbHRlckJp
dG1hcC4KKyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFjZTo6ZHJhd1N1cmZhY2UpOgor
ICAgICAgICBJZiBwcmVzZW50LCBwaWNrIHVwIHRoZSBwcmV2aW91c2x5LXJlbmRlcmVkIGZpbHRl
ciBiaXRtYXAsIGFuZCBiaW5kIGl0CisgICAgICAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBSZW5k
ZXJTdXJmYWNlIHRleHR1cmUuCisgICAgICAgIChXZWJDb3JlOjpnZXRTYXR1cmF0ZU1hdHJpeCk6
CisgICAgICAgIChXZWJDb3JlOjpnZXRIdWVSb3RhdGVNYXRyaXgpOgorICAgICAgICAoV2ViQ29y
ZTo6Z2V0SW52ZXJ0TWF0cml4KToKKyAgICAgICAgKFdlYkNvcmU6OmdldE9wYWNpdHlNYXRyaXgp
OgorICAgICAgICAoV2ViQ29yZTo6Z2V0R3JheXNjYWxlTWF0cml4KToKKyAgICAgICAgKFdlYkNv
cmU6OmdldFNlcGlhTWF0cml4KToKKyAgICAgICAgSGVscGVyIGZ1bmN0aW9ucyB0byBjb21wdXRl
IHRoZSBhcHByb3ByaWF0ZSBjb2xvciBtYXRyaWNlcyBmb3IgdGhlCisgICAgICAgIGRpZmZlcmVu
dCBtb2Rlcy4KKyAgICAgICAgKFdlYkNvcmU6OmFwcGx5Q29sb3JNYXRyaXgpOgorICAgICAgICBB
cHBseSBhIGNvbG9yIG1hdHJpeCB0byBhIGJpdG1hcCwgYW5kIGRyYXcgaXQgdXNpbmcgU2tpYS4K
KyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFjZTo6YXBwbHlGaWx0ZXJzKToKKyAgICAg
ICAgSXRlcmF0ZSB0aHJvdWdoIHRoZSBsaXN0IG9mIGZpbHRlcnMsIGFuZCBhcHBseSB0aGVtIGNv
bnNlY3V0aXZlbHkgCisgICAgICAgIHVzaW5nIFNraWEuICBVbnN1cHBvcnRlZCBmaWx0ZXJzIGFy
ZSBjdXJyZW50bHkgYSBuby1vcC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ1JlbmRlclN1cmZhY2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFj
ZTo6c2V0RmlsdGVycyk6CisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6OmZpbHRl
cnMpOgorICAgICAgICBEZWNsYXJlIGZpbHRlciBnZXR0ZXIgYW5kIHNldHRlci4KKyAgICAgICAg
KENDUmVuZGVyU3VyZmFjZSk6CisgICAgICAgIEFkZCBtZW1iZXIgdmFyaWFibGVzIGZvciBmaWx0
ZXJzLCBhbmQgdGVtcG9yYXJ5IGZpbHRlciBiaXRtYXAuCisKIDIwMTItMDEtMjcgIFRpZW4tUmVu
IENoZW4gIDx0cmNoZW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gQ0NMYXll
clRyZWVIb3N0SW1wbCBtaW5vciBjb2RlIGNsZWFudXAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhp
Y3NMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gMTA2MTQ2KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjU0LDYgKzI1NCwxMiBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1
bTo6c2V0Q29udGVudHNPCiAgICAgbV9sYXllci0+c2V0T3BhcXVlKG1fY29udGVudHNPcGFxdWUp
OwogfQogCitib29sIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0RmlsdGVycyhjb25zdCBGaWx0
ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQoreworICAgIG1fbGF5ZXItPnNldEZpbHRlcnMoZmlsdGVy
cyk7CisgICAgcmV0dXJuIEdyYXBoaWNzTGF5ZXI6OnNldEZpbHRlcnMoZmlsdGVycyk7Cit9CisK
IHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciog
bWFza0xheWVyKQogewogICAgIGlmIChtYXNrTGF5ZXIgPT0gbV9tYXNrTGF5ZXIpCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hy
b21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gMTA2MTQ2KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9t
aXVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTgyLDYgKzgyLDkgQEAgcHVibGljOgogCiAgICAgdmly
dHVhbCB2b2lkIHNldE9wYWNpdHkoZmxvYXQpOwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGZp
bHRlciBjYW4gYmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvc2l0b3IKKyAgICB2aXJ0dWFsIGJvb2wg
c2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJik7CisKICAgICB2aXJ0dWFsIHZvaWQg
c2V0TmVlZHNEaXNwbGF5KCk7CiAgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVj
dChjb25zdCBGbG9hdFJlY3QmKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNOZWVkc0Rp
c3BsYXkoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0xheWVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAxMDYxNDYpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVt
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzEyLDYgKzMxMiwxMiBAQCB2b2lkIExheWVyQ2hyb21p
dW06OnNldFJlcGxpY2FMYXllcihMYXllCiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAordm9p
ZCBMYXllckNocm9taXVtOjpzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRl
cnMpCit7CisgICAgbV9maWx0ZXJzID0gZmlsdGVyczsKKyAgICBzZXROZWVkc0NvbW1pdCgpOwor
fQorCiB2b2lkIExheWVyQ2hyb21pdW06OnNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkKIHsKICAg
ICBpZiAobV9vcGFjaXR5ID09IG9wYWNpdHkpCkBAIC00MTgsNiArNDI0LDcgQEAgdm9pZCBMYXll
ckNocm9taXVtOjpwdXNoUHJvcGVydGllc1RvKENDTAogICAgIGxheWVyLT5zZXREZWJ1Z0JvcmRl
cldpZHRoKG1fZGVidWdCb3JkZXJXaWR0aCk7CiAgICAgbGF5ZXItPnNldERvdWJsZVNpZGVkKG1f
ZG91YmxlU2lkZWQpOwogICAgIGxheWVyLT5zZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KCkp
OworICAgIGxheWVyLT5zZXRGaWx0ZXJzKGZpbHRlcnMoKSk7CiAgICAgbGF5ZXItPnNldElzTm9u
Q29tcG9zaXRlZENvbnRlbnQobV9pc05vbkNvbXBvc2l0ZWRDb250ZW50KTsKICAgICBsYXllci0+
c2V0TWFza3NUb0JvdW5kcyhtX21hc2tzVG9Cb3VuZHMpOwogICAgIGxheWVyLT5zZXRTY3JvbGxh
YmxlKG1fc2Nyb2xsYWJsZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAxMDYx
NDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNo
cm9taXVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2lmIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKIAorI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbnMuaCIKICNp
bmNsdWRlICJGbG9hdFBvaW50LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKQEAgLTEwNyw2ICsxMDgsOSBAQCBwdWJsaWM6CiAgICAg
dm9pZCBzZXRPcGFjaXR5KGZsb2F0KTsKICAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3QgeyByZXR1
cm4gbV9vcGFjaXR5OyB9CiAKKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0
aW9ucyYpOworICAgIGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMoKSBjb25zdCB7IHJl
dHVybiBtX2ZpbHRlcnM7IH0KKwogICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFxdWUoYm9vbCk7CiAg
ICAgYm9vbCBvcGFxdWUoKSBjb25zdCB7IHJldHVybiBtX29wYXF1ZTsgfQogCkBAIC0yNTYsNiAr
MjYwLDcgQEAgcHJpdmF0ZToKICAgICBDb2xvciBtX2RlYnVnQm9yZGVyQ29sb3I7CiAgICAgZmxv
YXQgbV9kZWJ1Z0JvcmRlcldpZHRoOwogICAgIGZsb2F0IG1fb3BhY2l0eTsKKyAgICBGaWx0ZXJP
cGVyYXRpb25zIG1fZmlsdGVyczsKICAgICBmbG9hdCBtX2FuY2hvclBvaW50WjsKICAgICBib29s
IG1faXNEcmF3YWJsZTsKICAgICBib29sIG1fbWFza3NUb0JvdW5kczsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oCShyZXZpc2lvbiAxMDYxNDYpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SZW5kZXJTdXJmYWNlQ2hyb21pdW0uaAko
d29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksNyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAK
K2NsYXNzIEZpbHRlck9wZXJhdGlvbnM7CiBjbGFzcyBMYXllckNocm9taXVtOwogY2xhc3MgTGF5
ZXJSZW5kZXJlckNocm9taXVtOwogY2xhc3MgTWFuYWdlZFRleHR1cmU7CkBAIC03NSw2ICs3Niwx
MSBAQCBwdWJsaWM6CiAgICAgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QoKSBjb25zdCB7IHJldHVy
biBtX2NsaXBSZWN0OyB9CiAgICAgdm9pZCBzZXRDbGlwUmVjdChjb25zdCBJbnRSZWN0JiBjbGlw
UmVjdCkgeyBtX2NsaXBSZWN0ID0gY2xpcFJlY3Q7IH0KIAorICAgIC8vIFdlIGRvbid0IGNhcmUg
YWJvdXQgZmlsdGVycyBoZXJlLCBidXQgd2UgbmVlZCB0byBzYXRpc2Z5IAorICAgIC8vIGNhbGN1
bGF0ZURyYXdUcmFuc2Zvcm1zQW5kVmlzaWJpbGl0eUludGVybmFsIHdoZW4gdGVtcGxhdGVkIG9u
IHRoaXMKKyAgICAvLyBjbGFzcy4KKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3Bl
cmF0aW9ucyYpIHsgfQorCiAgICAgYm9vbCBza2lwc0RyYXcoKSBjb25zdCB7IHJldHVybiBtX3Nr
aXBzRHJhdzsgfQogICAgIHZvaWQgc2V0U2tpcHNEcmF3KGJvb2wgc2tpcHNEcmF3KSB7IG1fc2tp
cHNEcmF3ID0gc2tpcHNEcmF3OyB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5jcHAJKHJl
dmlzaW9uIDEwNjE0NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDTGF5ZXJJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzgzLDYgKzM4MywxMiBA
QCB2b2lkIENDTGF5ZXJJbXBsOjpzZXRCYWNrZ3JvdW5kQ292ZXJzVmllCiAgICAgbV9sYXllclBy
b3BlcnR5Q2hhbmdlZCA9IHRydWU7CiB9CiAKK3ZvaWQgQ0NMYXllckltcGw6OnNldEZpbHRlcnMo
Y29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycykKK3sKKyAgICBtX2ZpbHRlcnMgPSBmaWx0
ZXJzOworICAgIG5vdGVMYXllclByb3BlcnR5Q2hhbmdlZEZvclN1YnRyZWUoKTsKK30KKwogdm9p
ZCBDQ0xheWVySW1wbDo6c2V0TWFza3NUb0JvdW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpCiB7CiAg
ICAgaWYgKG1fbWFza3NUb0JvdW5kcyA9PSBtYXNrc1RvQm91bmRzKQpJbmRleDogU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xh
eWVySW1wbC5oCShyZXZpc2lvbiAxMDYxNDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2
ICsyNyw3IEBACiAjZGVmaW5lIENDTGF5ZXJJbXBsX2gKIAogI2luY2x1ZGUgIkNvbG9yLmgiCisj
aW5jbHVkZSAiRmlsdGVyT3BlcmF0aW9ucy5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2lu
Y2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJUZXh0U3RyZWFtLmgiCkBAIC0xMDAsNiArMTAx
LDkgQEAgcHVibGljOgogICAgIHZvaWQgc2V0QmFja2dyb3VuZENvdmVyc1ZpZXdwb3J0KGJvb2wp
OwogICAgIGJvb2wgYmFja2dyb3VuZENvdmVyc1ZpZXdwb3J0KCkgY29uc3QgeyByZXR1cm4gbV9i
YWNrZ3JvdW5kQ292ZXJzVmlld3BvcnQ7IH0KIAorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBG
aWx0ZXJPcGVyYXRpb25zJik7CisgICAgY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycygp
IGNvbnN0IHsgcmV0dXJuIG1fZmlsdGVyczsgfQorCiAgICAgdm9pZCBzZXRNYXNrc1RvQm91bmRz
KGJvb2wpOwogICAgIGJvb2wgbWFza3NUb0JvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFza3NU
b0JvdW5kczsgfQogCkBAIC0yODcsNiArMjkxLDggQEAgcHJpdmF0ZToKICAgICBDb2xvciBtX2Rl
YnVnQm9yZGVyQ29sb3I7CiAgICAgZmxvYXQgbV9kZWJ1Z0JvcmRlcldpZHRoOwogCisgICAgRmls
dGVyT3BlcmF0aW9ucyBtX2ZpbHRlcnM7CisKICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX2Ry
YXdUcmFuc2Zvcm07CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9zY3JlZW5TcGFjZVRyYW5z
Zm9ybTsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3Bw
CShyZXZpc2lvbiAxMDYxNDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
NDQsNyArMjQ0LDggQEAgc3RhdGljIGJvb2wgY2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaQog
ICAgIGJvb2wgdXNlU3VyZmFjZUZvck1hc2tpbmcgPSBsYXllci0+bWFza0xheWVyKCk7CiAgICAg
Ym9vbCB1c2VTdXJmYWNlRm9yUmVmbGVjdGlvbiA9IGxheWVyLT5yZXBsaWNhTGF5ZXIoKTsKICAg
ICBib29sIHVzZVN1cmZhY2VGb3JGbGF0RGVzY2VuZGFudHMgPSBsYXllci0+cGFyZW50KCkgJiYg
bGF5ZXItPnBhcmVudCgpLT5wcmVzZXJ2ZXMzRCgpICYmICFsYXllci0+cHJlc2VydmVzM0QoKSAm
JiBsYXllci0+ZGVzY2VuZGFudERyYXdzQ29udGVudCgpOwotICAgIGlmICh1c2VTdXJmYWNlRm9y
TWFza2luZyB8fCB1c2VTdXJmYWNlRm9yUmVmbGVjdGlvbiB8fCB1c2VTdXJmYWNlRm9yRmxhdERl
c2NlbmRhbnRzIHx8ICgodXNlU3VyZmFjZUZvckNsaXBwaW5nIHx8IHVzZVN1cmZhY2VGb3JPcGFj
aXR5KSAmJiBsYXllci0+ZGVzY2VuZGFudERyYXdzQ29udGVudCgpKSkgeworICAgIGJvb2wgdXNl
U3VyZmFjZUZvckZpbHRlcnMgPSBsYXllci0+ZmlsdGVycygpLnNpemUoKSA+IDA7CisgICAgaWYg
KHVzZVN1cmZhY2VGb3JNYXNraW5nIHx8IHVzZVN1cmZhY2VGb3JSZWZsZWN0aW9uIHx8IHVzZVN1
cmZhY2VGb3JGbGF0RGVzY2VuZGFudHMgfHwgdXNlU3VyZmFjZUZvckZpbHRlcnMgfHwgKCh1c2VT
dXJmYWNlRm9yQ2xpcHBpbmcgfHwgdXNlU3VyZmFjZUZvck9wYWNpdHkpICYmIGxheWVyLT5kZXNj
ZW5kYW50RHJhd3NDb250ZW50KCkpKSB7CiAgICAgICAgIGlmICghbGF5ZXItPnJlbmRlclN1cmZh
Y2UoKSkKICAgICAgICAgICAgIGxheWVyLT5jcmVhdGVSZW5kZXJTdXJmYWNlKCk7CiAKQEAgLTI4
Miw2ICsyODMsOSBAQCBzdGF0aWMgYm9vbCBjYWxjdWxhdGVEcmF3VHJhbnNmb3Jtc0FuZFZpCiAg
ICAgICAgIGlmIChsYXllci0+cmVwbGljYUxheWVyKCkgJiYgbGF5ZXItPnJlcGxpY2FMYXllcigp
LT5tYXNrTGF5ZXIoKSkKICAgICAgICAgICAgIGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+bWFza0xh
eWVyKCktPnNldFRhcmdldFJlbmRlclN1cmZhY2UocmVuZGVyU3VyZmFjZSk7CiAKKyAgICAgICAg
aWYgKHVzZVN1cmZhY2VGb3JGaWx0ZXJzKQorICAgICAgICAgICAgcmVuZGVyU3VyZmFjZS0+c2V0
RmlsdGVycyhsYXllci0+ZmlsdGVycygpKTsKKwogICAgICAgICByZW5kZXJTdXJmYWNlTGF5ZXJM
aXN0LmFwcGVuZChsYXllcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbGF5ZXItPnNldERyYXdU
cmFuc2Zvcm0oY29tYmluZWRUcmFuc2Zvcm0pOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1
cmZhY2UuY3BwCShyZXZpc2lvbiAxMDYxNDYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yOSwxMCArMjksMTYgQEAKIAogI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZS5oIgogCisj
aW5jbHVkZSAiR2VvbWV0cnlCaW5kaW5nLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKICNpbmNsdWRlICJMYXllckNocm9taXVtLmgiCiAjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlckNo
cm9taXVtLmgiCiAjaW5jbHVkZSAiTWFuYWdlZFRleHR1cmUuaCIKKyNpbmNsdWRlICJTa0JsdXJJ
bWFnZUZpbHRlci5oIgorI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tDb2xvck1h
dHJpeEZpbHRlci5oIgorI2luY2x1ZGUgIlNrR3B1RGV2aWNlLmgiCisjaW5jbHVkZSAiU2tHclRl
eHR1cmVQaXhlbFJlZi5oIgogI2luY2x1ZGUgIlRleHRTdHJlYW0uaCIKICNpbmNsdWRlICJjYy9D
Q0RhbWFnZVRyYWNrZXIuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVySW1wbC5oIgpAQCAtMTA1LDYg
KzExMSwxMCBAQCB2b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhdyhMYXllclJlbmRlcmVyCiB7CiAg
ICAgaWYgKG1fc2tpcHNEcmF3IHx8ICFtX2NvbnRlbnRzVGV4dHVyZSkKICAgICAgICAgcmV0dXJu
OworICAgIGlmIChtX2ZpbHRlcnMuc2l6ZSgpID4gMCkKKyAgICAgICAgYXBwbHlGaWx0ZXJzKGxh
eWVyUmVuZGVyZXIpOworICAgIGVsc2UKKyAgICAgICAgbV9maWx0ZXJCaXRtYXAucmVzZXQoKTsK
ICAgICAvLyBGSVhNRTogQnkgdXNpbmcgdGhlIHNhbWUgUmVuZGVyU3VyZmFjZSBmb3IgYm90aCB0
aGUgY29udGVudCBhbmQgaXRzIHJlZmxlY3Rpb24sCiAgICAgLy8gaXQncyBjdXJyZW50bHkgbm90
IHBvc3NpYmxlIHRvIGFwcGx5IGEgc2VwYXJhdGUgbWFzayB0byB0aGUgcmVmbGVjdGlvbiBsYXll
cgogICAgIC8vIG9yIGNvcnJlY3RseSBoYW5kbGUgb3BhY2l0eSBpbiByZWZsZWN0aW9ucyAob3Bh
Y2l0eSBtdXN0IGJlIGFwcGxpZWQgYWZ0ZXIgZHJhd2luZwpAQCAtMTkxLDcgKzIwMSwxMSBAQCB2
b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhd1N1cmZhY2UoTGF5ZXJSCiAKICAgICBHTEMoY29udGV4
dDNELCBjb250ZXh0M0QtPmFjdGl2ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkUw
KSk7CiAgICAgR0xDKGNvbnRleHQzRCwgY29udGV4dDNELT51bmlmb3JtMWkocHJvZ3JhbS0+ZnJh
Z21lbnRTaGFkZXIoKS5zYW1wbGVyTG9jYXRpb24oKSwgMCkpOwotICAgIG1fY29udGVudHNUZXh0
dXJlLT5iaW5kVGV4dHVyZShjb250ZXh0M0QsIGxheWVyUmVuZGVyZXItPnJlbmRlclN1cmZhY2VU
ZXh0dXJlQWxsb2NhdG9yKCkpOworICAgIGlmIChtX2ZpbHRlckJpdG1hcC5nZXRUZXh0dXJlKCkp
IHsKKyAgICAgICAgR3JUZXh0dXJlKiB0ZXh0dXJlID0gcmVpbnRlcnByZXRfY2FzdDxHclRleHR1
cmUqPihtX2ZpbHRlckJpdG1hcC5nZXRUZXh0dXJlKCkpOworICAgICAgICBjb250ZXh0M0QtPmJp
bmRUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFXzJELCB0ZXh0dXJlLT5nZXRUZXh0
dXJlSGFuZGxlKCkpOworICAgIH0gZWxzZQorICAgICAgICBtX2NvbnRlbnRzVGV4dHVyZS0+Ymlu
ZFRleHR1cmUoY29udGV4dDNELCBsYXllclJlbmRlcmVyLT5yZW5kZXJTdXJmYWNlVGV4dHVyZUFs
bG9jYXRvcigpKTsKIAogICAgIGlmIChzaGFkZXJNYXNrU2FtcGxlckxvY2F0aW9uICE9IC0xKSB7
CiAgICAgICAgIEdMQyhjb250ZXh0M0QsIGNvbnRleHQzRC0+YWN0aXZlVGV4dHVyZShHcmFwaGlj
c0NvbnRleHQzRDo6VEVYVFVSRTEpKTsKQEAgLTIxNCw2ICsyMjgsMjM1IEBAIHZvaWQgQ0NSZW5k
ZXJTdXJmYWNlOjpkcmF3U3VyZmFjZShMYXllclIKICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHByb2dyYW0tPnZlcnRleFNoYWRlcigpLm1hdHJpeExvY2F0aW9uKCksIHByb2dy
YW0tPmZyYWdtZW50U2hhZGVyKCkuYWxwaGFMb2NhdGlvbigpLCBzaGFkZXJRdWFkTG9jYXRpb24p
OwogfQogCitzdGF0aWMgdm9pZCBnZXRTYXR1cmF0ZU1hdHJpeChmbG9hdCBhbW91bnQsIFNrU2Nh
bGFyIG1hdHJpeFsyMF0pCit7CisgICAgbWF0cml4WzBdID0gMC4yMTNmICsgMC43ODdmICogYW1v
dW50OworICAgIG1hdHJpeFsxXSA9IDAuNzE1ZiAtIDAuNzE1ZiAqIGFtb3VudDsKKyAgICBtYXRy
aXhbMl0gPSAwLjA3MmYgLSAwLjA3MmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzNdID0gbWF0cml4
WzRdID0gMDsKKyAgICBtYXRyaXhbNV0gPSAwLjIxM2YgLSAwLjIxM2YgKiBhbW91bnQ7CisgICAg
bWF0cml4WzZdID0gMC43MTVmICsgMC4yODVmICogYW1vdW50OworICAgIG1hdHJpeFs3XSA9IDAu
MDcyZiAtIDAuMDcyZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbOF0gPSBtYXRyaXhbOV0gPSAwOwor
ICAgIG1hdHJpeFsxMF0gPSAwLjIxM2YgLSAwLjIxM2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzEx
XSA9IDAuNzE1ZiAtIDAuNzE1ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMTJdID0gMC4wNzJmICsg
MC45MjhmICogYW1vdW50OworICAgIG1hdHJpeFsxM10gPSBtYXRyaXhbMTRdID0gMDsKKyAgICBt
YXRyaXhbMTVdID0gbWF0cml4WzE2XSA9IG1hdHJpeFsxN10gPSBtYXRyaXhbMTldID0gMDsKKyAg
ICBtYXRyaXhbMThdID0gMTsKK30KKworc3RhdGljIHZvaWQgZ2V0SHVlUm90YXRlTWF0cml4KGZs
b2F0IGh1ZSwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBmbG9hdCBjb3NIdWUgPSBjb3Nm
KGh1ZSAqIHBpRmxvYXQgLyAxODApOyAKKyAgICBmbG9hdCBzaW5IdWUgPSBzaW5mKGh1ZSAqIHBp
RmxvYXQgLyAxODApOyAKKyAgICBtYXRyaXhbMF0gPSAwLjIxM2YgKyBjb3NIdWUgKiAwLjc4N2Yg
LSBzaW5IdWUgKiAwLjIxM2Y7CisgICAgbWF0cml4WzFdID0gMC43MTVmIC0gY29zSHVlICogMC43
MTVmIC0gc2luSHVlICogMC43MTVmOworICAgIG1hdHJpeFsyXSA9IDAuMDcyZiAtIGNvc0h1ZSAq
IDAuMDcyZiArIHNpbkh1ZSAqIDAuOTI4ZjsKKyAgICBtYXRyaXhbM10gPSBtYXRyaXhbNF0gPSAw
OworICAgIG1hdHJpeFs1XSA9IDAuMjEzZiAtIGNvc0h1ZSAqIDAuMjEzZiArIHNpbkh1ZSAqIDAu
MTQzZjsKKyAgICBtYXRyaXhbNl0gPSAwLjcxNWYgKyBjb3NIdWUgKiAwLjI4NWYgKyBzaW5IdWUg
KiAwLjE0MGY7CisgICAgbWF0cml4WzddID0gMC4wNzJmIC0gY29zSHVlICogMC4wNzJmIC0gc2lu
SHVlICogMC4yODNmOworICAgIG1hdHJpeFs4XSA9IG1hdHJpeFs5XSA9IDA7CisgICAgbWF0cml4
WzEwXSA9IDAuMjEzZiAtIGNvc0h1ZSAqIDAuMjEzZiAtIHNpbkh1ZSAqIDAuNzg3ZjsKKyAgICBt
YXRyaXhbMTFdID0gMC43MTVmIC0gY29zSHVlICogMC43MTVmICsgc2luSHVlICogMC43MTVmOwor
ICAgIG1hdHJpeFsxMl0gPSAwLjA3MmYgKyBjb3NIdWUgKiAwLjkyOGYgKyBzaW5IdWUgKiAwLjA3
MmY7CisgICAgbWF0cml4WzEzXSA9IG1hdHJpeFsxNF0gPSAwOworICAgIG1hdHJpeFsxNV0gPSBt
YXRyaXhbMTZdID0gbWF0cml4WzE3XSA9IDA7CisgICAgbWF0cml4WzE4XSA9IDE7CisgICAgbWF0
cml4WzE5XSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldEludmVydE1hdHJpeChmbG9hdCBhbW91
bnQsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7CisgICAgbWVtc2V0KG1hdHJpeCwgMCwgMjAgKiBz
aXplb2YoU2tTY2FsYXIpKTsKKyAgICBtYXRyaXhbMF0gPSBtYXRyaXhbNl0gPSBtYXRyaXhbMTJd
ID0gMSAtIDIgKiBhbW91bnQ7CisgICAgbWF0cml4WzRdID0gbWF0cml4WzldID0gbWF0cml4WzE0
XSA9IGFtb3VudCAqIDI1NTsKKyAgICBtYXRyaXhbMThdID0gMTsKK30KKworc3RhdGljIHZvaWQg
Z2V0T3BhY2l0eU1hdHJpeChmbG9hdCBhbW91bnQsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7Cisg
ICAgbWVtc2V0KG1hdHJpeCwgMCwgMjAgKiBzaXplb2YoU2tTY2FsYXIpKTsKKyAgICBtYXRyaXhb
MF0gPSBtYXRyaXhbNl0gPSBtYXRyaXhbMTJdID0gMTsKKyAgICBtYXRyaXhbMThdID0gYW1vdW50
OworfQorCitzdGF0aWMgdm9pZCBnZXRHcmF5c2NhbGVNYXRyaXgoZmxvYXQgYW1vdW50LCBTa1Nj
YWxhciBtYXRyaXhbMjBdKQoreworICAgIG1hdHJpeFswXSA9IDAuMjEyNmYgKyAwLjc4NzRmICog
YW1vdW50OworICAgIG1hdHJpeFsxXSA9IDAuNzE1MmYgLSAwLjcxNTJmICogYW1vdW50OworICAg
IG1hdHJpeFsyXSA9IDAuMDcyMmYgLSAwLjA3MjJmICogYW1vdW50OworICAgIG1hdHJpeFszXSA9
IG1hdHJpeFs0XSA9IDA7CisKKyAgICBtYXRyaXhbNV0gPSAwLjIxMjZmIC0gMC4yMTI2ZiAqIGFt
b3VudDsKKyAgICBtYXRyaXhbNl0gPSAwLjcxNTJmICsgMC4yODQ4ZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbN10gPSAwLjA3MjJmIC0gMC4wNzIyZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbOF0gPSBt
YXRyaXhbOV0gPSAwOworCisgICAgbWF0cml4WzEwXSA9IDAuMjEyNmYgLSAwLjIxMjZmICogYW1v
dW50OworICAgIG1hdHJpeFsxMV0gPSAwLjcxNTJmIC0gMC43MTUyZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbMTJdID0gMC4wNzIyZiArIDAuOTI3OGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzEzXSA9
IG1hdHJpeFsxNF0gPSAwOworCisgICAgbWF0cml4WzE1XSA9IG1hdHJpeFsxNl0gPSBtYXRyaXhb
MTddID0gbWF0cml4WzE5XSA9IDA7CisgICAgbWF0cml4WzE4XSA9IDE7Cit9CisKK3N0YXRpYyB2
b2lkIGdldFNlcGlhTWF0cml4KGZsb2F0IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sK
KyAgICBtYXRyaXhbMF0gPSAwLjM5M2YgKyAwLjYwN2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzFd
ID0gMC43NjlmIC0gMC43NjlmICogYW1vdW50OworICAgIG1hdHJpeFsyXSA9IDAuMTg5ZiAtIDAu
MTg5ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbM10gPSBtYXRyaXhbNF0gPSAwOworCisgICAgbWF0
cml4WzVdID0gMC4zNDlmIC0gMC4zNDlmICogYW1vdW50OworICAgIG1hdHJpeFs2XSA9IDAuNjg2
ZiArIDAuMzE0ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbN10gPSAwLjE2OGYgLSAwLjE2OGYgKiBh
bW91bnQ7CisgICAgbWF0cml4WzhdID0gbWF0cml4WzldID0gMDsKKworICAgIG1hdHJpeFsxMF0g
PSAwLjI3MmYgLSAwLjI3MmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzExXSA9IDAuNTM0ZiAtIDAu
NTM0ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMTJdID0gMC4xMzFmICsgMC44NjlmICogYW1vdW50
OworICAgIG1hdHJpeFsxM10gPSBtYXRyaXhbMTRdID0gMDsKKworICAgIG1hdHJpeFsxNV0gPSBt
YXRyaXhbMTZdID0gbWF0cml4WzE3XSA9IG1hdHJpeFsxOV0gPSAwOworICAgIG1hdHJpeFsxOF0g
PSAxOworfQorCitzdGF0aWMgYm9vbCBhcHBseUNvbG9yTWF0cml4KFNrQ2FudmFzKiBjYW52YXMs
IFNrQml0bWFwIHNvdXJjZSwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKG1h
dHJpeCkpLT51bnJlZigpOworICAgIGNhbnZhcy0+ZHJhd0JpdG1hcChzb3VyY2UsIDAsIDAsICZw
YWludCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0NSZW5kZXJTdXJmYWNlOjphcHBs
eUZpbHRlcnMoTGF5ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRlcmVyKQoreworICAgIGlm
ICghbV9jb250ZW50c1RleHR1cmUpCisgICAgICAgIHJldHVybjsKKyAgICBHcmFwaGljc0NvbnRl
eHQzRCogY29udGV4dDNEID0gbGF5ZXJSZW5kZXJlci0+Y29udGV4dCgpOworICAgIGlmICghY29u
dGV4dDNEKQorICAgICAgICByZXR1cm47CisgICAgR3JDb250ZXh0KiBnciA9IGNvbnRleHQzRC0+
Z3JDb250ZXh0KCk7CisgICAgaWYgKCFncikKKyAgICAgICAgcmV0dXJuOworICAgIGdyLT5yZXNl
dENvbnRleHQoKTsKKyAgICAvLyBXcmFwIHRoZSBSZW5kZXJTdXJmYWNlJ3MgdGV4dHVyZSBpbiBh
IEdhbmVzaCBwbGF0Zm9ybSB0ZXh0dXJlLgorICAgIGludCB3aWR0aCA9IG1fY29udGVudFJlY3Qu
d2lkdGgoKSwgaGVpZ2h0ID0gbV9jb250ZW50UmVjdC5oZWlnaHQoKTsKKyAgICBHclBsYXRmb3Jt
VGV4dHVyZURlc2MgcGxhdGZvcm1UZXhEZXNjOworICAgIHBsYXRmb3JtVGV4RGVzYy5mV2lkdGgg
PSB3aWR0aDsKKyAgICBwbGF0Zm9ybVRleERlc2MuZkhlaWdodCA9IGhlaWdodDsKKyAgICBwbGF0
Zm9ybVRleERlc2MuZkNvbmZpZyA9IGtTa2lhODg4OF9QTV9HclBpeGVsQ29uZmlnOworICAgIHBs
YXRmb3JtVGV4RGVzYy5mVGV4dHVyZUhhbmRsZSA9IG1fY29udGVudHNUZXh0dXJlLT50ZXh0dXJl
SWQoKTsKKyAgICBTa0F1dG9UVW5yZWY8R3JUZXh0dXJlPiB0ZXh0dXJlKGdyLT5jcmVhdGVQbGF0
Zm9ybVRleHR1cmUocGxhdGZvcm1UZXhEZXNjKSk7CisgICAgLy8gUGxhY2UgdGhlIHBsYXRmb3Jt
IHRleHR1cmUgaW5zaWRlIGFuIFNrQml0bWFwLgorICAgIFNrQml0bWFwIHNvdXJjZTsKKyAgICBz
b3VyY2Uuc2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgd2lkdGgsIGhlaWdo
dCk7CisgICAgc291cmNlLnNldFBpeGVsUmVmKG5ldyBTa0dyVGV4dHVyZVBpeGVsUmVmKHRleHR1
cmUuZ2V0KCkpKS0+dW5yZWYoKTsKKyAgICAKKyAgICBHckNvbnRleHQ6OlRleHR1cmVDYWNoZUVu
dHJ5IGRlc3Q7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9maWx0ZXJzLnNpemUo
KTsgKytpKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIHByZXZpb3VzIHRleHR1cmUgY2FjaGUgZGVz
dGluYXRpb24gKGlmIGFueSksIGFuZCBrZWVwIGl0CisgICAgICAgIC8vIGxvY2tlZCBkdXJpbmcg
ZHJhdyB0byBwcmV2ZW50IGl0IGJlIHJlLXVzZWQgYXMgZGVzdGluYXRpb24uCisgICAgICAgIEdy
Q29udGV4dDo6VGV4dHVyZUNhY2hlRW50cnkgc291cmNlRW50cnkgPSBkZXN0OworICAgICAgICBj
b25zdCBGaWx0ZXJPcGVyYXRpb24qIGZpbHRlck9wZXJhdGlvbiA9IG1fZmlsdGVycy5hdChpKTsK
KyAgICAgICAgLy8gQWxsb2NhdGUgYSBkZXN0aW5hdGlvbiB0ZXh0dXJlLgorICAgICAgICBHclRl
eHR1cmVEZXNjIGRlc2M7CisgICAgICAgIGRlc2MuZkZsYWdzID0ga1JlbmRlclRhcmdldF9HclRl
eHR1cmVGbGFnQml0OworICAgICAgICBkZXNjLmZBQUxldmVsID0ga05vbmVfR3JBQUxldmVsOwor
ICAgICAgICBkZXNjLmZXaWR0aCA9IG1fY29udGVudFJlY3Qud2lkdGgoKTsKKyAgICAgICAgZGVz
Yy5mSGVpZ2h0ID0gbV9jb250ZW50UmVjdC5oZWlnaHQoKTsKKyAgICAgICAgZGVzYy5mQ29uZmln
ID0ga1JHQkFfODg4OF9HclBpeGVsQ29uZmlnOworICAgICAgICAvLyBUT0RPOiBjb3VsZCB3ZSB1
c2UgYXBwcm94aW1hdGUgbWF0Y2gsIGFuZCBmaXggdGV4Y29vcmRzIG9uIGRyYXcKKyAgICAgICAg
ZGVzdCA9IGdyLT5sb2NrU2NyYXRjaFRleHR1cmUoZGVzYywgR3JDb250ZXh0OjprRXhhY3RfU2Ny
YXRjaFRleE1hdGNoKTsKKyAgICAgICAgaWYgKCFkZXN0LnRleHR1cmUoKSkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgU2tHcHVEZXZpY2UgZGV2aWNlKGdyLCBkZXN0LnRleHR1cmUoKSk7
CisgICAgICAgIFNrQ2FudmFzIGNhbnZhcygmZGV2aWNlKTsKKyAgICAgICAgY2FudmFzLmNsZWFy
KDB4MCk7CisgICAgICAgIHN3aXRjaCAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBl
KCkpIHsKKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTogeworICAgICAg
ICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3AgPSBzdGF0aWNf
Y2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0
aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAgICAgICBnZXRH
cmF5c2NhbGVNYXRyaXgoMSAtIG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIGFw
cGx5Q29sb3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OlNFUElBOiB7Cisg
ICAgICAgICAgICBjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBvcCA9IHN0
YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJP
cGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAgICAgICAg
IGdldFNlcGlhTWF0cml4KDEgLSBvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAgICAgICBh
cHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpTQVRVUkFURTog
eworICAgICAgICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3Ag
PSBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmls
dGVyT3BlcmF0aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAg
ICAgICBnZXRTYXR1cmF0ZU1hdHJpeCgxIC0gb3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAg
ICAgICAgYXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6SFVF
X1JPVEFURTogeworICAgICAgICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJh
dGlvbiogb3AgPSBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0
aW9uKj4oZmlsdGVyT3BlcmF0aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07
CisgICAgICAgICAgICBnZXRIdWVSb3RhdGVNYXRyaXgob3AtPmFtb3VudCgpLCBtYXRyaXgpOwor
ICAgICAgICAgICAgYXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlv
bjo6SU5WRVJUOiB7CisgICAgICAgICAgICBjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3Bl
cmF0aW9uKiBvcCA9IHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIw
XTsKKyAgICAgICAgICAgIGdldEludmVydE1hdHJpeChvcC0+YW1vdW50KCksIG1hdHJpeCk7Cisg
ICAgICAgICAgICBhcHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9u
OjpPUEFDSVRZOiB7CisgICAgICAgICAgICBjb25zdCBCYXNpY0NvbXBvbmVudFRyYW5zZmVyRmls
dGVyT3BlcmF0aW9uKiBvcCA9IHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29tcG9uZW50VHJhbnNm
ZXJGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2Fs
YXIgbWF0cml4WzIwXTsKKyAgICAgICAgICAgIGdldE9wYWNpdHlNYXRyaXgob3AtPmFtb3VudCgp
LCBtYXRyaXgpOworICAgICAgICAgICAgYXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2Us
IG1hdHJpeCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZp
bHRlck9wZXJhdGlvbjo6QkxVUjogeworICAgICAgICAgICAgY29uc3QgQmx1ckZpbHRlck9wZXJh
dGlvbiogb3AgPSBzdGF0aWNfY2FzdDxjb25zdCBCbHVyRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVy
T3BlcmF0aW9uKTsKKyAgICAgICAgICAgIGZsb2F0IHN0ZFggPSBvcC0+c3RkRGV2aWF0aW9uKCku
Y2FsY0Zsb2F0VmFsdWUoMCk7CisgICAgICAgICAgICBmbG9hdCBzdGRZID0gb3AtPnN0ZERldmlh
dGlvbigpLmNhbGNGbG9hdFZhbHVlKDEpOworICAgICAgICAgICAgU2tBdXRvVFVucmVmPFNrSW1h
Z2VGaWx0ZXI+IGZpbHRlcihuZXcgU2tCbHVySW1hZ2VGaWx0ZXIoc3RkWCwgc3RkWSkpOworICAg
ICAgICAgICAgU2tQYWludCBwYWludDsKKyAgICAgICAgICAgIHBhaW50LnNldEltYWdlRmlsdGVy
KGZpbHRlci5nZXQoKSk7CisgICAgICAgICAgICBwYWludC5zZXRDb2xvcigweEZGRkZGRkZGKTsK
KyAgICAgICAgICAgIGNhbnZhcy5zYXZlTGF5ZXIoMCwgJnBhaW50KTsKKyAgICAgICAgICAgIGNh
bnZhcy5kcmF3Qml0bWFwKHNvdXJjZSwgMCwgMCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9y
ZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJP
cGVyYXRpb246OlBBU1NUSFJPVUdIOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2Fu
dmFzLmRyYXdCaXRtYXAoc291cmNlLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGdyLT5mbHVzaCgpOworICAgICAgICAvLyBEZXN0IHRleHR1cmUgZnJvbSB0
aGlzIGZpbHRlciBiZWNvbWVzIHNvdXJjZSBiaXRtYXAgZm9yIG5leHQgZmlsdGVyLgorICAgICAg
ICBzb3VyY2Uuc2V0UGl4ZWxSZWYobmV3IFNrR3JUZXh0dXJlUGl4ZWxSZWYoZGVzdC50ZXh0dXJl
KCkpKS0+dW5yZWYoKTsKKyAgICAgICAgLy8gVW5sb2NrIHRoZSBwcmV2aW91cyB0ZXh0dXJlIGNh
Y2hlIGVudHJ5LgorICAgICAgICBpZiAoc291cmNlRW50cnkudGV4dHVyZSgpKQorICAgICAgICAg
ICAgZ3ItPnVubG9ja1RleHR1cmUoc291cmNlRW50cnkpOworICAgIH0KKyAgICBpZiAoZGVzdC50
ZXh0dXJlKCkpCisgICAgICAgIGdyLT51bmxvY2tUZXh0dXJlKGRlc3QpOworICAgIG1fZmlsdGVy
Qml0bWFwID0gc291cmNlOworICAgIC8vIFJlc2V0IGFsbCB0b3VjaGVkIEdMIHN0YXRlIGJhY2sg
dG8gd2hhdCB0aGUgY29tcG9zaXRvciBleHBlY3RzLgorICAgIC8vIEZJWE1FOiBQdXQgdGhpcyBp
biBhICJMYXllclJlbmRlckNocm9taXVtOjpyZXNldENvbnRleHQiIHRvCisgICAgLy8gZ2V0IHJp
ZCBvZiB0aGUgY29uc3RfY2FzdD8KKyAgICBjb25zdF9jYXN0PEdlb21ldHJ5QmluZGluZyo+KGxh
eWVyUmVuZGVyZXItPnNoYXJlZEdlb21ldHJ5KCkpLT5wcmVwYXJlRm9yRHJhdygpOworICAgIEdM
Qyhjb250ZXh0M0QsIGNvbnRleHQzRC0+dmlld3BvcnQoMCwgMCwgbGF5ZXJSZW5kZXJlci0+dmll
d3BvcnRXaWR0aCgpLCBsYXllclJlbmRlcmVyLT52aWV3cG9ydEhlaWdodCgpKSk7CisgICAgR0xD
KGNvbnRleHQzRCwgY29udGV4dDNELT5iaW5kRnJhbWVidWZmZXIoR3JhcGhpY3NDb250ZXh0M0Q6
OkZSQU1FQlVGRkVSLCAwKSk7CisgICAgR0xDKGNvbnRleHQzRCwgY29udGV4dDNELT5hY3RpdmVU
ZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFMCkpOworfQorCiBTdHJpbmcgQ0NSZW5k
ZXJTdXJmYWNlOjpuYW1lKCkgY29uc3QKIHsKICAgICByZXR1cm4gU3RyaW5nOjpmb3JtYXQoIlJl
bmRlclN1cmZhY2UoaWQ9JWksb3duZXI9JXMpIiwgbV9vd25pbmdMYXllci0+aWQoKSwgbV9vd25p
bmdMYXllci0+bmFtZSgpLnV0ZjgoKS5kYXRhKCkpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJT
dXJmYWNlLmgJKHJldmlzaW9uIDEwNjE0NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
OSwxMCArMjksMTIgQEAKIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKIAorI2lu
Y2x1ZGUgIkZpbHRlck9wZXJhdGlvbnMuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNs
dWRlICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiUHJvZ3JhbUJpbmRpbmcuaCIKICNpbmNsdWRlICJT
aGFkZXJDaHJvbWl1bS5oIgorI2luY2x1ZGUgIlNrQml0bWFwLmgiCiAjaW5jbHVkZSAiVGV4dHVy
ZU1hbmFnZXIuaCIKICNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgogI2luY2x1ZGUg
ImNjL0NDTGF5ZXJRdWFkLmgiCkBAIC03MCw2ICs3MiwxMCBAQCBwdWJsaWM6CiAgICAgdm9pZCBz
ZXREcmF3VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3Jt
KSB7IG1fZHJhd1RyYW5zZm9ybSA9IGRyYXdUcmFuc2Zvcm07IH0KICAgICBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fZHJhd1RyYW5z
Zm9ybTsgfQogCisgICAgdm9pZCBzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZp
bHRlcnMpIHsgbV9maWx0ZXJzID0gZmlsdGVyczsgfQorICAgIGNvbnN0IEZpbHRlck9wZXJhdGlv
bnMmIGZpbHRlcnMoKSBjb25zdCB7IHJldHVybiBtX2ZpbHRlcnM7IH0KKyAgICB2b2lkIGFwcGx5
RmlsdGVycyhMYXllclJlbmRlcmVyQ2hyb21pdW0qKTsKKwogICAgIHZvaWQgc2V0UmVwbGljYURy
YXdUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHJlcGxpY2FEcmF3VHJhbnNm
b3JtKSB7IG1fcmVwbGljYURyYXdUcmFuc2Zvcm0gPSByZXBsaWNhRHJhd1RyYW5zZm9ybTsgfQog
ICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiByZXBsaWNhRHJhd1RyYW5zZm9ybSgpIGNv
bnN0IHsgcmV0dXJuIG1fcmVwbGljYURyYXdUcmFuc2Zvcm07IH0KIApAQCAtMTIyLDYgKzEyOCw4
IEBAIHByaXZhdGU6CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9kcmF3VHJhbnNmb3JtOwog
ICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fcmVwbGljYURyYXdUcmFuc2Zvcm07CiAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbV9vcmlnaW5UcmFuc2Zvcm07CisgICAgRmlsdGVyT3BlcmF0aW9u
cyBtX2ZpbHRlcnM7CisgICAgU2tCaXRtYXAgbV9maWx0ZXJCaXRtYXA7CiAgICAgSW50UmVjdCBt
X2NsaXBSZWN0OwogICAgIFZlY3RvcjxSZWZQdHI8Q0NMYXllckltcGw+ID4gbV9sYXllckxpc3Q7
CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124833</attachid>
            <date>2012-01-31 15:17:01 -0800</date>
            <delta_ts>2012-02-01 09:25:17 -0800</delta_ts>
            <desc>move filters application to helper class</desc>
            <filename>bug-77266-20120131181700.patch</filename>
            <type>text/plain</type>
            <size>29443</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjQwMCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYwIEBACisyMDEyLTAxLTMxICBTdGVwaGVu
IFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
RW5hYmxlIENTUyBmaWx0ZXJzIG9uIGNvbXBvc2l0ZWQgbGF5ZXJzLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNjYKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXaWxsIGJlIGNvdmVyZWQgYnkgZXhpc3Rp
bmcgdGVzdHMgaW4gY3NzMy9maWx0ZXJzICh3aGVuIGVuYWJsZWQpLgorCisgICAgICAgICogV2Vi
Q29yZS5neXBpOgorICAgICAgICBBZGQgQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy4qIHRvIHRoZSBD
aHJvbWl1bSBidWlsZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFw
aGljc0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNo
cm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgT3ZlcnJpZGUgc2V0RmlsdGVycygp
IHZpcnR1YWwgZnJvbSBHcmFwaGljc0xheWVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJv
bWl1bTo6c2V0RmlsdGVycyk6CisgICAgICAgIEltcGxlbWVudCBzZXRGaWx0ZXJzKCkgdG8gY2Fj
aGUgdGhlIGZpbHRlcnMgaGVyZS4uLgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6
cHVzaFByb3BlcnRpZXNUbyk6CisgICAgICAgIC4uLiBhbmQgcHVzaCB0aGVtIHRvIHRoZSBDQ0xh
eWVySW1wbCBhdCBjb21taXQgdGltZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpm
aWx0ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IGFjY2Vzc29yLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyU3VyZmFjZUNocm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgSW1wbGVt
ZW50IHN0dWIgdmVyc2lvbiBvZiBzZXRGaWx0ZXJzKCksIHRvIHNhdGlzZnkgdGhlIHRlbXBsYXRl
cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVySW1wbDo6c2V0RmlsdGVycyk6CisgICAgICAg
IEltcGxlbWVudCBzZXR0ZXIgdG8gcmVjZWl2ZSBmaWx0ZXJzIGF0IGNvbW1pdCB0aW1lLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmg6CisgICAg
ICAgIChXZWJDb3JlOjpDQ0xheWVySW1wbDo6ZmlsdGVycyk6CisgICAgICAgIEltcGxlbWVudCBt
ZW1iZXIgYW5kIGFjY2Vzc29yIGZvciBmaWx0ZXJzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpjYWxjdWxhdGVEcmF3VHJhbnNmb3Jtc0FuZFZpc2liaWxpdHlJbnRlcm5hbCk6CisgICAg
ICAgIEFkZCBhbm90aGVyIGNsYXVzZSBoZXJlIHRvIGZvcmNlIGNyZWF0aW9uIG9mIGEgUmVuZGVy
U3VyZmFjZSB3aGVuCisgICAgICAgIGZpbHRlcnMgYXJlIHByZXNlbnQsIGFuZCB0byBmb3J3YXJk
IHRoZW0gZnJvbSB0aGUgbGF5ZXIgdG8gdGhlCisgICAgICAgIFJlbmRlclN1cmZhY2UuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFjZTo6ZHJhdyk6CisgICAgICAgIENoZWNr
IGZvciBmaWx0ZXJzIGF0IGRyYXcgdGltZSwgYXBwbHkgdGhlbSwgYW5kIHN0b3JlIHRoZSByZXN1
bHQgaW4KKyAgICAgICAgbV9maWx0ZXJCaXRtYXAuCisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRl
clN1cmZhY2U6OmRyYXdTdXJmYWNlKToKKyAgICAgICAgSWYgcHJlc2VudCwgcGljayB1cCB0aGUg
cHJldmlvdXNseS1yZW5kZXJlZCBmaWx0ZXIgYml0bWFwLCBhbmQgYmluZCBpdAorICAgICAgICBp
bnN0ZWFkIG9mIHRoZSBub3JtYWwgUmVuZGVyU3VyZmFjZSB0ZXh0dXJlLgorICAgICAgICAoV2Vi
Q29yZTo6Q0NSZW5kZXJTdXJmYWNlOjphcHBseUZpbHRlcnMpOgorICAgICAgICBBcHBseSBmaWx0
ZXJzIHRvIHRoZSByZW5kZXIgc3VyZmFjZSB0ZXh0dXJlLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBp
bgorICAgICAgICBtX2ZpbHRlckJpdG1hcC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVy
U3VyZmFjZTo6c2V0RmlsdGVycyk6CisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6
OmZpbHRlcnMpOgorICAgICAgICBGaWx0ZXJzIGdldHRlcnMgYW5kIHNldHRlcnMuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Q0NSZW5kZXJTdXJmYWNlRmlsdGVyczo6YXBw
bHkpOgorICAgICAgICBFeHRlcm5hbCBpbnRlcmZhY2UgZm9yIHRoaXMgKHN0YXRpYykgY2xhc3Mu
ICBBbGwgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgYW5kIGhlbHBlciBmdW5jdGlv
bnMgYXJlIGluIHRoZSB1bm5hbWVkIG5hbWVzcGFjZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmg6IEFkZGVkLgorCiAyMDEy
LTAxLTMxICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAg
ICAgICBVbnJldmlld2VkLCByb2xsaW5nIG91dCByMTA2Mzc2LgpJbmRleDogU291cmNlL1dlYkNv
cmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lw
aQkocmV2aXNpb24gMTA2NDAwKQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMjc2LDYgKzMyNzYsOCBAQAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5oJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VEcmF3UXVhZC5jcHAnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFj
ZURyYXdRdWFkLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuY3BwJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmgnLAogICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyLmNwcCcsCiAgICAgICAg
ICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hlZHVsZXIuaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hlZHVsZXJTdGF0ZU1h
Y2hpbmUuY3BwJywKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAko
cmV2aXNpb24gMTA2NDAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjU0LDYg
KzI1NCwxMiBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHNPCiAgICAg
bV9sYXllci0+c2V0T3BhcXVlKG1fY29udGVudHNPcGFxdWUpOwogfQogCitib29sIEdyYXBoaWNz
TGF5ZXJDaHJvbWl1bTo6c2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJz
KQoreworICAgIG1fbGF5ZXItPnNldEZpbHRlcnMoZmlsdGVycyk7CisgICAgcmV0dXJuIEdyYXBo
aWNzTGF5ZXI6OnNldEZpbHRlcnMoZmlsdGVycyk7Cit9CisKIHZvaWQgR3JhcGhpY3NMYXllckNo
cm9taXVtOjpzZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciogbWFza0xheWVyKQogewogICAgIGlm
IChtYXNrTGF5ZXIgPT0gbV9tYXNrTGF5ZXIpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uaAkocmV2aXNpb24gMTA2NDAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmgJKHdvcmtpbmcgY29weSkK
QEAgLTgyLDYgKzgyLDkgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lkIHNldE9wYWNpdHko
ZmxvYXQpOwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGZpbHRlciBjYW4gYmUgcmVuZGVyZWQg
YnkgdGhlIGNvbXBvc2l0b3IKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RmlsdGVycyhjb25zdCBGaWx0
ZXJPcGVyYXRpb25zJik7CisKICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5KCk7CiAg
ICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBGbG9hdFJlY3QmKTsK
ICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNOZWVkc0Rpc3BsYXkoKTsKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAxMDY0MDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMzE0LDYgKzMxNCwxMiBAQCB2b2lkIExheWVyQ2hyb21pdW06OnNldFJlcGxpY2FMYXllcihM
YXllCiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAordm9pZCBMYXllckNocm9taXVtOjpzZXRG
aWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpCit7CisgICAgbV9maWx0ZXJz
ID0gZmlsdGVyczsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCiB2b2lkIExheWVyQ2hyb21p
dW06OnNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkKIHsKICAgICBpZiAobV9vcGFjaXR5ID09IG9w
YWNpdHkpCkBAIC00MjAsNiArNDI2LDcgQEAgdm9pZCBMYXllckNocm9taXVtOjpwdXNoUHJvcGVy
dGllc1RvKENDTAogICAgIGxheWVyLT5zZXREZWJ1Z0JvcmRlcldpZHRoKG1fZGVidWdCb3JkZXJX
aWR0aCk7CiAgICAgbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fZG91YmxlU2lkZWQpOwogICAgIGxh
eWVyLT5zZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KCkpOworICAgIGxheWVyLT5zZXRGaWx0
ZXJzKGZpbHRlcnMoKSk7CiAgICAgbGF5ZXItPnNldElzTm9uQ29tcG9zaXRlZENvbnRlbnQobV9p
c05vbkNvbXBvc2l0ZWRDb250ZW50KTsKICAgICBsYXllci0+c2V0TWFza3NUb0JvdW5kcyhtX21h
c2tzVG9Cb3VuZHMpOwogICAgIGxheWVyLT5zZXRTY3JvbGxhYmxlKG1fc2Nyb2xsYWJsZSk7Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9t
aXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAxMDY0MDApCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
IAorI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbnMuaCIKICNpbmNsdWRlICJGbG9hdFBvaW50Lmgi
CiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcu
aCIKQEAgLTEwOCw2ICsxMDksOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRPcGFjaXR5KGZsb2F0
KTsKICAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9vcGFjaXR5OyB9CiAKKyAg
ICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYpOworICAgIGNvbnN0IEZp
bHRlck9wZXJhdGlvbnMmIGZpbHRlcnMoKSBjb25zdCB7IHJldHVybiBtX2ZpbHRlcnM7IH0KKwog
ICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFxdWUoYm9vbCk7CiAgICAgYm9vbCBvcGFxdWUoKSBjb25z
dCB7IHJldHVybiBtX29wYXF1ZTsgfQogCkBAIC0yNzIsNiArMjc2LDcgQEAgcHJpdmF0ZToKICAg
ICBDb2xvciBtX2RlYnVnQm9yZGVyQ29sb3I7CiAgICAgZmxvYXQgbV9kZWJ1Z0JvcmRlcldpZHRo
OwogICAgIGZsb2F0IG1fb3BhY2l0eTsKKyAgICBGaWx0ZXJPcGVyYXRpb25zIG1fZmlsdGVyczsK
ICAgICBmbG9hdCBtX2FuY2hvclBvaW50WjsKICAgICBib29sIG1faXNEcmF3YWJsZTsKICAgICBi
b29sIG1fbWFza3NUb0JvdW5kczsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1
bS5oCShyZXZpc2lvbiAxMDY0MDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9SZW5kZXJTdXJmYWNlQ2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtMzks
NiArMzksNyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKK2NsYXNzIEZpbHRlck9wZXJhdGlv
bnM7CiBjbGFzcyBMYXllckNocm9taXVtOwogY2xhc3MgTGF5ZXJSZW5kZXJlckNocm9taXVtOwog
Y2xhc3MgTWFuYWdlZFRleHR1cmU7CkBAIC03Nyw2ICs3OCwxMSBAQCBwdWJsaWM6CiAgICAgY29u
c3QgSW50UmVjdCYgY2xpcFJlY3QoKSBjb25zdCB7IHJldHVybiBtX2NsaXBSZWN0OyB9CiAgICAg
dm9pZCBzZXRDbGlwUmVjdChjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCkgeyBtX2NsaXBSZWN0ID0g
Y2xpcFJlY3Q7IH0KIAorICAgIC8vIFdlIGRvbid0IGNhcmUgYWJvdXQgZmlsdGVycyBoZXJlLCBi
dXQgd2UgbmVlZCB0byBzYXRpc2Z5IAorICAgIC8vIGNhbGN1bGF0ZURyYXdUcmFuc2Zvcm1zQW5k
VmlzaWJpbGl0eUludGVybmFsIHdoZW4gdGVtcGxhdGVkIG9uIHRoaXMKKyAgICAvLyBjbGFzcy4K
KyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYpIHsgfQorCiAgICAg
Ym9vbCBza2lwc0RyYXcoKSBjb25zdCB7IHJldHVybiBtX3NraXBzRHJhdzsgfQogICAgIHZvaWQg
c2V0U2tpcHNEcmF3KGJvb2wgc2tpcHNEcmF3KSB7IG1fc2tpcHNEcmF3ID0gc2tpcHNEcmF3OyB9
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
TGF5ZXJJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5jcHAJKHJldmlzaW9uIDEwNjQwMCkKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzgzLDYgKzM4MywxMiBAQCB2b2lkIENDTGF5ZXJJbXBsOjpz
ZXRCYWNrZ3JvdW5kQ292ZXJzVmllCiAgICAgbV9sYXllclByb3BlcnR5Q2hhbmdlZCA9IHRydWU7
CiB9CiAKK3ZvaWQgQ0NMYXllckltcGw6OnNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0aW9u
cyYgZmlsdGVycykKK3sKKyAgICBtX2ZpbHRlcnMgPSBmaWx0ZXJzOworICAgIG5vdGVMYXllclBy
b3BlcnR5Q2hhbmdlZEZvclN1YnRyZWUoKTsKK30KKwogdm9pZCBDQ0xheWVySW1wbDo6c2V0TWFz
a3NUb0JvdW5kcyhib29sIG1hc2tzVG9Cb3VuZHMpCiB7CiAgICAgaWYgKG1fbWFza3NUb0JvdW5k
cyA9PSBtYXNrc1RvQm91bmRzKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5oCShyZXZpc2lvbiAx
MDY0MDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q0xheWVySW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw2ICsyNyw3IEBACiAjZGVmaW5lIEND
TGF5ZXJJbXBsX2gKIAogI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiRmlsdGVyT3BlcmF0
aW9ucy5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKICNp
bmNsdWRlICJUZXh0U3RyZWFtLmgiCkBAIC0xMDAsNiArMTAxLDkgQEAgcHVibGljOgogICAgIHZv
aWQgc2V0QmFja2dyb3VuZENvdmVyc1ZpZXdwb3J0KGJvb2wpOwogICAgIGJvb2wgYmFja2dyb3Vu
ZENvdmVyc1ZpZXdwb3J0KCkgY29uc3QgeyByZXR1cm4gbV9iYWNrZ3JvdW5kQ292ZXJzVmlld3Bv
cnQ7IH0KIAorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJik7Cisg
ICAgY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycygpIGNvbnN0IHsgcmV0dXJuIG1fZmls
dGVyczsgfQorCiAgICAgdm9pZCBzZXRNYXNrc1RvQm91bmRzKGJvb2wpOwogICAgIGJvb2wgbWFz
a3NUb0JvdW5kcygpIGNvbnN0IHsgcmV0dXJuIG1fbWFza3NUb0JvdW5kczsgfQogCkBAIC0yODcs
NiArMjkxLDggQEAgcHJpdmF0ZToKICAgICBDb2xvciBtX2RlYnVnQm9yZGVyQ29sb3I7CiAgICAg
ZmxvYXQgbV9kZWJ1Z0JvcmRlcldpZHRoOwogCisgICAgRmlsdGVyT3BlcmF0aW9ucyBtX2ZpbHRl
cnM7CisKICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX2RyYXdUcmFuc2Zvcm07CiAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbV9zY3JlZW5TcGFjZVRyYW5zZm9ybTsKIApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29t
bW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwCShyZXZpc2lvbiAxMDY0MDApCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJl
ZUhvc3RDb21tb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNDQsNyArMjQ0LDggQEAgc3RhdGlj
IGJvb2wgY2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaQogICAgIGJvb2wgdXNlU3VyZmFjZUZv
ck1hc2tpbmcgPSBsYXllci0+bWFza0xheWVyKCk7CiAgICAgYm9vbCB1c2VTdXJmYWNlRm9yUmVm
bGVjdGlvbiA9IGxheWVyLT5yZXBsaWNhTGF5ZXIoKTsKICAgICBib29sIHVzZVN1cmZhY2VGb3JG
bGF0RGVzY2VuZGFudHMgPSBsYXllci0+cGFyZW50KCkgJiYgbGF5ZXItPnBhcmVudCgpLT5wcmVz
ZXJ2ZXMzRCgpICYmICFsYXllci0+cHJlc2VydmVzM0QoKSAmJiBsYXllci0+ZGVzY2VuZGFudERy
YXdzQ29udGVudCgpOwotICAgIGlmICh1c2VTdXJmYWNlRm9yTWFza2luZyB8fCB1c2VTdXJmYWNl
Rm9yUmVmbGVjdGlvbiB8fCB1c2VTdXJmYWNlRm9yRmxhdERlc2NlbmRhbnRzIHx8ICgodXNlU3Vy
ZmFjZUZvckNsaXBwaW5nIHx8IHVzZVN1cmZhY2VGb3JPcGFjaXR5KSAmJiBsYXllci0+ZGVzY2Vu
ZGFudERyYXdzQ29udGVudCgpKSkgeworICAgIGJvb2wgdXNlU3VyZmFjZUZvckZpbHRlcnMgPSBs
YXllci0+ZmlsdGVycygpLnNpemUoKSA+IDA7CisgICAgaWYgKHVzZVN1cmZhY2VGb3JNYXNraW5n
IHx8IHVzZVN1cmZhY2VGb3JSZWZsZWN0aW9uIHx8IHVzZVN1cmZhY2VGb3JGbGF0RGVzY2VuZGFu
dHMgfHwgdXNlU3VyZmFjZUZvckZpbHRlcnMgfHwgKCh1c2VTdXJmYWNlRm9yQ2xpcHBpbmcgfHwg
dXNlU3VyZmFjZUZvck9wYWNpdHkpICYmIGxheWVyLT5kZXNjZW5kYW50RHJhd3NDb250ZW50KCkp
KSB7CiAgICAgICAgIGlmICghbGF5ZXItPnJlbmRlclN1cmZhY2UoKSkKICAgICAgICAgICAgIGxh
eWVyLT5jcmVhdGVSZW5kZXJTdXJmYWNlKCk7CiAKQEAgLTI4Miw2ICsyODMsOSBAQCBzdGF0aWMg
Ym9vbCBjYWxjdWxhdGVEcmF3VHJhbnNmb3Jtc0FuZFZpCiAgICAgICAgIGlmIChsYXllci0+cmVw
bGljYUxheWVyKCkgJiYgbGF5ZXItPnJlcGxpY2FMYXllcigpLT5tYXNrTGF5ZXIoKSkKICAgICAg
ICAgICAgIGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+bWFza0xheWVyKCktPnNldFRhcmdldFJlbmRl
clN1cmZhY2UocmVuZGVyU3VyZmFjZSk7CiAKKyAgICAgICAgaWYgKHVzZVN1cmZhY2VGb3JGaWx0
ZXJzKQorICAgICAgICAgICAgcmVuZGVyU3VyZmFjZS0+c2V0RmlsdGVycyhsYXllci0+ZmlsdGVy
cygpKTsKKwogICAgICAgICByZW5kZXJTdXJmYWNlTGF5ZXJMaXN0LmFwcGVuZChsYXllcik7CiAg
ICAgfSBlbHNlIHsKICAgICAgICAgbGF5ZXItPnNldERyYXdUcmFuc2Zvcm0oY29tYmluZWRUcmFu
c2Zvcm0pOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NSZW5kZXJTdXJmYWNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuY3BwCShyZXZpc2lvbiAx
MDY0MDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q1JlbmRlclN1cmZhY2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw2ICsyOSw4IEBACiAKICNp
bmNsdWRlICJjYy9DQ1JlbmRlclN1cmZhY2UuaCIKIAorI2luY2x1ZGUgIkdlb21ldHJ5QmluZGlu
Zy5oIgorI2luY2x1ZGUgIkdyVGV4dHVyZS5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNE
LmgiCiAjaW5jbHVkZSAiTGF5ZXJDaHJvbWl1bS5oIgogI2luY2x1ZGUgIkxheWVyUmVuZGVyZXJD
aHJvbWl1bS5oIgpAQCAtMzYsNiArMzgsNyBAQAogI2luY2x1ZGUgIlRleHRTdHJlYW0uaCIKICNp
bmNsdWRlICJjYy9DQ0RhbWFnZVRyYWNrZXIuaCIKICNpbmNsdWRlICJjYy9DQ0xheWVySW1wbC5o
IgorI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuaCIKICNpbmNsdWRlIDx3dGYv
dGV4dC9DU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTEwNSw2ICsxMDgsMTAg
QEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXcoTGF5ZXJSZW5kZXJlcgogewogICAgIGlmICht
X3NraXBzRHJhdyB8fCAhbV9jb250ZW50c1RleHR1cmUpCiAgICAgICAgIHJldHVybjsKKyAgICBp
ZiAobV9maWx0ZXJzLnNpemUoKSA+IDApCisgICAgICAgIGFwcGx5RmlsdGVycyhsYXllclJlbmRl
cmVyKTsKKyAgICBlbHNlCisgICAgICAgIG1fZmlsdGVyQml0bWFwLnJlc2V0KCk7CiAgICAgLy8g
RklYTUU6IEJ5IHVzaW5nIHRoZSBzYW1lIFJlbmRlclN1cmZhY2UgZm9yIGJvdGggdGhlIGNvbnRl
bnQgYW5kIGl0cyByZWZsZWN0aW9uLAogICAgIC8vIGl0J3MgY3VycmVudGx5IG5vdCBwb3NzaWJs
ZSB0byBhcHBseSBhIHNlcGFyYXRlIG1hc2sgdG8gdGhlIHJlZmxlY3Rpb24gbGF5ZXIKICAgICAv
LyBvciBjb3JyZWN0bHkgaGFuZGxlIG9wYWNpdHkgaW4gcmVmbGVjdGlvbnMgKG9wYWNpdHkgbXVz
dCBiZSBhcHBsaWVkIGFmdGVyIGRyYXdpbmcKQEAgLTE5MSw3ICsxOTgsMTEgQEAgdm9pZCBDQ1Jl
bmRlclN1cmZhY2U6OmRyYXdTdXJmYWNlKExheWVyUgogCiAgICAgR0xDKGNvbnRleHQzRCwgY29u
dGV4dDNELT5hY3RpdmVUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJFMCkpOwogICAg
IEdMQyhjb250ZXh0M0QsIGNvbnRleHQzRC0+dW5pZm9ybTFpKHByb2dyYW0tPmZyYWdtZW50U2hh
ZGVyKCkuc2FtcGxlckxvY2F0aW9uKCksIDApKTsKLSAgICBtX2NvbnRlbnRzVGV4dHVyZS0+Ymlu
ZFRleHR1cmUoY29udGV4dDNELCBsYXllclJlbmRlcmVyLT5yZW5kZXJTdXJmYWNlVGV4dHVyZUFs
bG9jYXRvcigpKTsKKyAgICBpZiAobV9maWx0ZXJCaXRtYXAuZ2V0VGV4dHVyZSgpKSB7CisgICAg
ICAgIEdyVGV4dHVyZSogdGV4dHVyZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8R3JUZXh0dXJlKj4obV9m
aWx0ZXJCaXRtYXAuZ2V0VGV4dHVyZSgpKTsKKyAgICAgICAgY29udGV4dDNELT5iaW5kVGV4dHVy
ZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgdGV4dHVyZS0+Z2V0VGV4dHVyZUhhbmRs
ZSgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9jb250ZW50c1RleHR1cmUtPmJpbmRUZXh0dXJl
KGNvbnRleHQzRCwgbGF5ZXJSZW5kZXJlci0+cmVuZGVyU3VyZmFjZVRleHR1cmVBbGxvY2F0b3Io
KSk7CiAKICAgICBpZiAoc2hhZGVyTWFza1NhbXBsZXJMb2NhdGlvbiAhPSAtMSkgewogICAgICAg
ICBHTEMoY29udGV4dDNELCBjb250ZXh0M0QtPmFjdGl2ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0
M0Q6OlRFWFRVUkUxKSk7CkBAIC0yMTQsNiArMjI1LDI1IEBAIHZvaWQgQ0NSZW5kZXJTdXJmYWNl
OjpkcmF3U3VyZmFjZShMYXllclIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHByb2dyYW0tPnZlcnRleFNoYWRlcigpLm1hdHJpeExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCkuYWxwaGFMb2NhdGlvbigpLCBzaGFkZXJRdWFkTG9jYXRpb24pOwogfQogCit2
b2lkIENDUmVuZGVyU3VyZmFjZTo6YXBwbHlGaWx0ZXJzKExheWVyUmVuZGVyZXJDaHJvbWl1bSog
bGF5ZXJSZW5kZXJlcikKK3sKKyAgICBpZiAoIW1fY29udGVudHNUZXh0dXJlKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dDNEID0gbGF5ZXJSZW5kZXJl
ci0+Y29udGV4dCgpOworICAgIGlmICghY29udGV4dDNEKQorICAgICAgICByZXR1cm47CisgICAg
CisgICAgbV9maWx0ZXJCaXRtYXAgPSBDQ1JlbmRlclN1cmZhY2VGaWx0ZXJzOjphcHBseShtX2Zp
bHRlcnMsIG1fY29udGVudHNUZXh0dXJlLT50ZXh0dXJlSWQoKSwgbV9jb250ZW50UmVjdC5zaXpl
KCksIGNvbnRleHQzRCk7CisgICAgLy8gUmVzZXQgYWxsIHRvdWNoZWQgR0wgc3RhdGUgYmFjayB0
byB3aGF0IHRoZSBjb21wb3NpdG9yIGV4cGVjdHMuCisgICAgLy8gRklYTUU6IFB1dCB0aGlzIGlu
IGEgIkxheWVyUmVuZGVyQ2hyb21pdW06OnJlc2V0Q29udGV4dCgpIiB0bworICAgIC8vIGdldCBy
aWQgb2YgdGhlIGNvbnN0X2Nhc3Q/CisgICAgY29uc3RfY2FzdDxHZW9tZXRyeUJpbmRpbmcqPihs
YXllclJlbmRlcmVyLT5zaGFyZWRHZW9tZXRyeSgpKS0+cHJlcGFyZUZvckRyYXcoKTsKKyAgICBH
TEMoY29udGV4dDNELCBjb250ZXh0M0QtPnZpZXdwb3J0KDAsIDAsIGxheWVyUmVuZGVyZXItPnZp
ZXdwb3J0V2lkdGgoKSwgbGF5ZXJSZW5kZXJlci0+dmlld3BvcnRIZWlnaHQoKSkpOworICAgIEdM
Qyhjb250ZXh0M0QsIGNvbnRleHQzRC0+YmluZEZyYW1lYnVmZmVyKEdyYXBoaWNzQ29udGV4dDNE
OjpGUkFNRUJVRkZFUiwgMCkpOworICAgIEdMQyhjb250ZXh0M0QsIGNvbnRleHQzRC0+YWN0aXZl
VGV4dHVyZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRTApKTsKK30KKwogU3RyaW5nIENDUmVu
ZGVyU3VyZmFjZTo6bmFtZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIFN0cmluZzo6Zm9ybWF0KCJS
ZW5kZXJTdXJmYWNlKGlkPSVpLG93bmVyPSVzKSIsIG1fb3duaW5nTGF5ZXItPmlkKCksIG1fb3du
aW5nTGF5ZXItPm5hbWUoKS51dGY4KCkuZGF0YSgpKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVy
U3VyZmFjZS5oCShyZXZpc2lvbiAxMDY0MDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaAkod29ya2luZyBjb3B5KQpAQCAt
MjksMTAgKzI5LDEyIEBACiAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCiAKKyNp
bmNsdWRlICJGaWx0ZXJPcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCiAjaW5j
bHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlByb2dyYW1CaW5kaW5nLmgiCiAjaW5jbHVkZSAi
U2hhZGVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJTa0JpdG1hcC5oIgogI2luY2x1ZGUgIlRleHR1
cmVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKICNpbmNsdWRl
ICJjYy9DQ0xheWVyUXVhZC5oIgpAQCAtNzAsNiArNzIsMTAgQEAgcHVibGljOgogICAgIHZvaWQg
c2V0RHJhd1RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9y
bSkgeyBtX2RyYXdUcmFuc2Zvcm0gPSBkcmF3VHJhbnNmb3JtOyB9CiAgICAgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBtX2RyYXdUcmFu
c2Zvcm07IH0KIAorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBm
aWx0ZXJzKSB7IG1fZmlsdGVycyA9IGZpbHRlcnM7IH0KKyAgICBjb25zdCBGaWx0ZXJPcGVyYXRp
b25zJiBmaWx0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9maWx0ZXJzOyB9CisgICAgdm9pZCBhcHBs
eUZpbHRlcnMoTGF5ZXJSZW5kZXJlckNocm9taXVtKik7CisKICAgICB2b2lkIHNldFJlcGxpY2FE
cmF3VHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiByZXBsaWNhRHJhd1RyYW5z
Zm9ybSkgeyBtX3JlcGxpY2FEcmF3VHJhbnNmb3JtID0gcmVwbGljYURyYXdUcmFuc2Zvcm07IH0K
ICAgICBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgcmVwbGljYURyYXdUcmFuc2Zvcm0oKSBj
b25zdCB7IHJldHVybiBtX3JlcGxpY2FEcmF3VHJhbnNmb3JtOyB9CiAKQEAgLTEyMiw2ICsxMjgs
OCBAQCBwcml2YXRlOgogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fZHJhd1RyYW5zZm9ybTsK
ICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX3JlcGxpY2FEcmF3VHJhbnNmb3JtOwogICAgIFRy
YW5zZm9ybWF0aW9uTWF0cml4IG1fb3JpZ2luVHJhbnNmb3JtOworICAgIEZpbHRlck9wZXJhdGlv
bnMgbV9maWx0ZXJzOworICAgIFNrQml0bWFwIG1fZmlsdGVyQml0bWFwOwogICAgIEludFJlY3Qg
bV9jbGlwUmVjdDsKICAgICBWZWN0b3I8UmVmUHRyPENDTGF5ZXJJbXBsPiA+IG1fbGF5ZXJMaXN0
OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q1JlbmRlclN1cmZhY2VGaWx0ZXJzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmNwcAko
cmV2aXNpb24gMCkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L2NjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDI2
NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoK
KyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKKworI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuaCIKKwor
I2luY2x1ZGUgIkdlb21ldHJ5QmluZGluZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNE
LmgiCisjaW5jbHVkZSAiU2tCbHVySW1hZ2VGaWx0ZXIuaCIKKyNpbmNsdWRlICJTa0NhbnZhcy5o
IgorI2luY2x1ZGUgIlNrQ29sb3JNYXRyaXhGaWx0ZXIuaCIKKyNpbmNsdWRlICJTa0dwdURldmlj
ZS5oIgorI2luY2x1ZGUgIlNrR3JUZXh0dXJlUGl4ZWxSZWYuaCIKKworbmFtZXNwYWNlIHsKKwor
dm9pZCBnZXRTYXR1cmF0ZU1hdHJpeChmbG9hdCBhbW91bnQsIFNrU2NhbGFyIG1hdHJpeFsyMF0p
Cit7CisgICAgbWF0cml4WzBdID0gMC4yMTNmICsgMC43ODdmICogYW1vdW50OworICAgIG1hdHJp
eFsxXSA9IDAuNzE1ZiAtIDAuNzE1ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMl0gPSAwLjA3MmYg
LSAwLjA3MmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzNdID0gbWF0cml4WzRdID0gMDsKKyAgICBt
YXRyaXhbNV0gPSAwLjIxM2YgLSAwLjIxM2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzZdID0gMC43
MTVmICsgMC4yODVmICogYW1vdW50OworICAgIG1hdHJpeFs3XSA9IDAuMDcyZiAtIDAuMDcyZiAq
IGFtb3VudDsKKyAgICBtYXRyaXhbOF0gPSBtYXRyaXhbOV0gPSAwOworICAgIG1hdHJpeFsxMF0g
PSAwLjIxM2YgLSAwLjIxM2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzExXSA9IDAuNzE1ZiAtIDAu
NzE1ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMTJdID0gMC4wNzJmICsgMC45MjhmICogYW1vdW50
OworICAgIG1hdHJpeFsxM10gPSBtYXRyaXhbMTRdID0gMDsKKyAgICBtYXRyaXhbMTVdID0gbWF0
cml4WzE2XSA9IG1hdHJpeFsxN10gPSBtYXRyaXhbMTldID0gMDsKKyAgICBtYXRyaXhbMThdID0g
MTsKK30KKwordm9pZCBnZXRIdWVSb3RhdGVNYXRyaXgoZmxvYXQgaHVlLCBTa1NjYWxhciBtYXRy
aXhbMjBdKQoreworICAgIGZsb2F0IGNvc0h1ZSA9IGNvc2YoaHVlICogcGlGbG9hdCAvIDE4MCk7
IAorICAgIGZsb2F0IHNpbkh1ZSA9IHNpbmYoaHVlICogcGlGbG9hdCAvIDE4MCk7IAorICAgIG1h
dHJpeFswXSA9IDAuMjEzZiArIGNvc0h1ZSAqIDAuNzg3ZiAtIHNpbkh1ZSAqIDAuMjEzZjsKKyAg
ICBtYXRyaXhbMV0gPSAwLjcxNWYgLSBjb3NIdWUgKiAwLjcxNWYgLSBzaW5IdWUgKiAwLjcxNWY7
CisgICAgbWF0cml4WzJdID0gMC4wNzJmIC0gY29zSHVlICogMC4wNzJmICsgc2luSHVlICogMC45
MjhmOworICAgIG1hdHJpeFszXSA9IG1hdHJpeFs0XSA9IDA7CisgICAgbWF0cml4WzVdID0gMC4y
MTNmIC0gY29zSHVlICogMC4yMTNmICsgc2luSHVlICogMC4xNDNmOworICAgIG1hdHJpeFs2XSA9
IDAuNzE1ZiArIGNvc0h1ZSAqIDAuMjg1ZiArIHNpbkh1ZSAqIDAuMTQwZjsKKyAgICBtYXRyaXhb
N10gPSAwLjA3MmYgLSBjb3NIdWUgKiAwLjA3MmYgLSBzaW5IdWUgKiAwLjI4M2Y7CisgICAgbWF0
cml4WzhdID0gbWF0cml4WzldID0gMDsKKyAgICBtYXRyaXhbMTBdID0gMC4yMTNmIC0gY29zSHVl
ICogMC4yMTNmIC0gc2luSHVlICogMC43ODdmOworICAgIG1hdHJpeFsxMV0gPSAwLjcxNWYgLSBj
b3NIdWUgKiAwLjcxNWYgKyBzaW5IdWUgKiAwLjcxNWY7CisgICAgbWF0cml4WzEyXSA9IDAuMDcy
ZiArIGNvc0h1ZSAqIDAuOTI4ZiArIHNpbkh1ZSAqIDAuMDcyZjsKKyAgICBtYXRyaXhbMTNdID0g
bWF0cml4WzE0XSA9IDA7CisgICAgbWF0cml4WzE1XSA9IG1hdHJpeFsxNl0gPSBtYXRyaXhbMTdd
ID0gMDsKKyAgICBtYXRyaXhbMThdID0gMTsKKyAgICBtYXRyaXhbMTldID0gMDsKK30KKwordm9p
ZCBnZXRJbnZlcnRNYXRyaXgoZmxvYXQgYW1vdW50LCBTa1NjYWxhciBtYXRyaXhbMjBdKQorewor
ICAgIG1lbXNldChtYXRyaXgsIDAsIDIwICogc2l6ZW9mKFNrU2NhbGFyKSk7CisgICAgbWF0cml4
WzBdID0gbWF0cml4WzZdID0gbWF0cml4WzEyXSA9IDEgLSAyICogYW1vdW50OworICAgIG1hdHJp
eFs0XSA9IG1hdHJpeFs5XSA9IG1hdHJpeFsxNF0gPSBhbW91bnQgKiAyNTU7CisgICAgbWF0cml4
WzE4XSA9IDE7Cit9CisKK3ZvaWQgZ2V0T3BhY2l0eU1hdHJpeChmbG9hdCBhbW91bnQsIFNrU2Nh
bGFyIG1hdHJpeFsyMF0pCit7CisgICAgbWVtc2V0KG1hdHJpeCwgMCwgMjAgKiBzaXplb2YoU2tT
Y2FsYXIpKTsKKyAgICBtYXRyaXhbMF0gPSBtYXRyaXhbNl0gPSBtYXRyaXhbMTJdID0gMTsKKyAg
ICBtYXRyaXhbMThdID0gYW1vdW50OworfQorCit2b2lkIGdldEdyYXlzY2FsZU1hdHJpeChmbG9h
dCBhbW91bnQsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7CisgICAgbWF0cml4WzBdID0gMC4yMTI2
ZiArIDAuNzg3NGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzFdID0gMC43MTUyZiAtIDAuNzE1MmYg
KiBhbW91bnQ7CisgICAgbWF0cml4WzJdID0gMC4wNzIyZiAtIDAuMDcyMmYgKiBhbW91bnQ7Cisg
ICAgbWF0cml4WzNdID0gbWF0cml4WzRdID0gMDsKKworICAgIG1hdHJpeFs1XSA9IDAuMjEyNmYg
LSAwLjIxMjZmICogYW1vdW50OworICAgIG1hdHJpeFs2XSA9IDAuNzE1MmYgKyAwLjI4NDhmICog
YW1vdW50OworICAgIG1hdHJpeFs3XSA9IDAuMDcyMmYgLSAwLjA3MjJmICogYW1vdW50OworICAg
IG1hdHJpeFs4XSA9IG1hdHJpeFs5XSA9IDA7CisKKyAgICBtYXRyaXhbMTBdID0gMC4yMTI2ZiAt
IDAuMjEyNmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzExXSA9IDAuNzE1MmYgLSAwLjcxNTJmICog
YW1vdW50OworICAgIG1hdHJpeFsxMl0gPSAwLjA3MjJmICsgMC45Mjc4ZiAqIGFtb3VudDsKKyAg
ICBtYXRyaXhbMTNdID0gbWF0cml4WzE0XSA9IDA7CisKKyAgICBtYXRyaXhbMTVdID0gbWF0cml4
WzE2XSA9IG1hdHJpeFsxN10gPSBtYXRyaXhbMTldID0gMDsKKyAgICBtYXRyaXhbMThdID0gMTsK
K30KKwordm9pZCBnZXRTZXBpYU1hdHJpeChmbG9hdCBhbW91bnQsIFNrU2NhbGFyIG1hdHJpeFsy
MF0pCit7CisgICAgbWF0cml4WzBdID0gMC4zOTNmICsgMC42MDdmICogYW1vdW50OworICAgIG1h
dHJpeFsxXSA9IDAuNzY5ZiAtIDAuNzY5ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMl0gPSAwLjE4
OWYgLSAwLjE4OWYgKiBhbW91bnQ7CisgICAgbWF0cml4WzNdID0gbWF0cml4WzRdID0gMDsKKwor
ICAgIG1hdHJpeFs1XSA9IDAuMzQ5ZiAtIDAuMzQ5ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbNl0g
PSAwLjY4NmYgKyAwLjMxNGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzddID0gMC4xNjhmIC0gMC4x
NjhmICogYW1vdW50OworICAgIG1hdHJpeFs4XSA9IG1hdHJpeFs5XSA9IDA7CisKKyAgICBtYXRy
aXhbMTBdID0gMC4yNzJmIC0gMC4yNzJmICogYW1vdW50OworICAgIG1hdHJpeFsxMV0gPSAwLjUz
NGYgLSAwLjUzNGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzEyXSA9IDAuMTMxZiArIDAuODY5ZiAq
IGFtb3VudDsKKyAgICBtYXRyaXhbMTNdID0gbWF0cml4WzE0XSA9IDA7CisKKyAgICBtYXRyaXhb
MTVdID0gbWF0cml4WzE2XSA9IG1hdHJpeFsxN10gPSBtYXRyaXhbMTldID0gMDsKKyAgICBtYXRy
aXhbMThdID0gMTsKK30KKworYm9vbCBhcHBseUNvbG9yTWF0cml4KFNrQ2FudmFzKiBjYW52YXMs
IFNrQml0bWFwIHNvdXJjZSwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBTa1BhaW50IHBh
aW50OworICAgIHBhaW50LnNldENvbG9yRmlsdGVyKG5ldyBTa0NvbG9yTWF0cml4RmlsdGVyKG1h
dHJpeCkpLT51bnJlZigpOworICAgIGNhbnZhcy0+ZHJhd0JpdG1hcChzb3VyY2UsIDAsIDAsICZw
YWludCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitTa0JpdG1hcCBDQ1JlbmRlclN1cmZhY2VGaWx0ZXJzOjphcHBseShjb25zdCBGaWx0ZXJPcGVy
YXRpb25zJiBmaWx0ZXJzLCB1bnNpZ25lZCB0ZXh0dXJlSWQsIGNvbnN0IEZsb2F0U2l6ZSYgc2l6
ZSwgR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQzRCkKK3sKKyAgICBpZiAoIWNvbnRleHQzRCkK
KyAgICAgICAgcmV0dXJuIFNrQml0bWFwKCk7CisgICAgR3JDb250ZXh0KiBnciA9IGNvbnRleHQz
RC0+Z3JDb250ZXh0KCk7CisgICAgaWYgKCFncikKKyAgICAgICAgcmV0dXJuIFNrQml0bWFwKCk7
CisgICAgZ3ItPnJlc2V0Q29udGV4dCgpOworICAgIC8vIFdyYXAgdGhlIFJlbmRlclN1cmZhY2Un
cyB0ZXh0dXJlIGluIGEgR2FuZXNoIHBsYXRmb3JtIHRleHR1cmUuCisgICAgR3JQbGF0Zm9ybVRl
eHR1cmVEZXNjIHBsYXRmb3JtVGV4RGVzYzsKKyAgICBwbGF0Zm9ybVRleERlc2MuZldpZHRoID0g
c2l6ZS53aWR0aCgpOworICAgIHBsYXRmb3JtVGV4RGVzYy5mSGVpZ2h0ID0gc2l6ZS5oZWlnaHQo
KTsKKyAgICBwbGF0Zm9ybVRleERlc2MuZkNvbmZpZyA9IGtTa2lhODg4OF9QTV9HclBpeGVsQ29u
ZmlnOworICAgIHBsYXRmb3JtVGV4RGVzYy5mVGV4dHVyZUhhbmRsZSA9IHRleHR1cmVJZDsKKyAg
ICBTa0F1dG9UVW5yZWY8R3JUZXh0dXJlPiB0ZXh0dXJlKGdyLT5jcmVhdGVQbGF0Zm9ybVRleHR1
cmUocGxhdGZvcm1UZXhEZXNjKSk7CisgICAgLy8gUGxhY2UgdGhlIHBsYXRmb3JtIHRleHR1cmUg
aW5zaWRlIGFuIFNrQml0bWFwLgorICAgIFNrQml0bWFwIHNvdXJjZTsKKyAgICBzb3VyY2Uuc2V0
Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0NvbmZpZywgc2l6ZS53aWR0aCgpLCBzaXplLmhl
aWdodCgpKTsKKyAgICBzb3VyY2Uuc2V0UGl4ZWxSZWYobmV3IFNrR3JUZXh0dXJlUGl4ZWxSZWYo
dGV4dHVyZS5nZXQoKSkpLT51bnJlZigpOworICAgIAorICAgIEdyQ29udGV4dDo6VGV4dHVyZUNh
Y2hlRW50cnkgZGVzdDsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmaWx0ZXJzLnNp
emUoKTsgKytpKSB7CisgICAgICAgIC8vIFNhdmUgdGhlIHByZXZpb3VzIHRleHR1cmUgY2FjaGUg
ZGVzdGluYXRpb24gKGlmIGFueSksIGFuZCBrZWVwIGl0CisgICAgICAgIC8vIGxvY2tlZCBkdXJp
bmcgZHJhdyB0byBwcmV2ZW50IGl0IGJlIHJlLXVzZWQgYXMgZGVzdGluYXRpb24uCisgICAgICAg
IEdyQ29udGV4dDo6VGV4dHVyZUNhY2hlRW50cnkgc291cmNlRW50cnkgPSBkZXN0OworICAgICAg
ICBjb25zdCBGaWx0ZXJPcGVyYXRpb24qIGZpbHRlck9wZXJhdGlvbiA9IGZpbHRlcnMuYXQoaSk7
CisgICAgICAgIC8vIEFsbG9jYXRlIGEgZGVzdGluYXRpb24gdGV4dHVyZS4KKyAgICAgICAgR3JU
ZXh0dXJlRGVzYyBkZXNjOworICAgICAgICBkZXNjLmZGbGFncyA9IGtSZW5kZXJUYXJnZXRfR3JU
ZXh0dXJlRmxhZ0JpdDsKKyAgICAgICAgZGVzYy5mQUFMZXZlbCA9IGtOb25lX0dyQUFMZXZlbDsK
KyAgICAgICAgZGVzYy5mV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgICAgIGRlc2MuZkhlaWdo
dCA9IHNpemUuaGVpZ2h0KCk7CisgICAgICAgIGRlc2MuZkNvbmZpZyA9IGtSR0JBXzg4ODhfR3JQ
aXhlbENvbmZpZzsKKyAgICAgICAgLy8gRklYTUU6IGNvdWxkIHdlIHVzZSBhcHByb3hpbWF0ZSBt
YXRjaCwgYW5kIGZpeCB0ZXhjb29yZHMgb24gZHJhdworICAgICAgICBkZXN0ID0gZ3ItPmxvY2tT
Y3JhdGNoVGV4dHVyZShkZXNjLCBHckNvbnRleHQ6OmtFeGFjdF9TY3JhdGNoVGV4TWF0Y2gpOwor
ICAgICAgICBpZiAoIWRlc3QudGV4dHVyZSgpKQorICAgICAgICAgICAgcmV0dXJuIFNrQml0bWFw
KCk7CisgICAgICAgIFNrR3B1RGV2aWNlIGRldmljZShnciwgZGVzdC50ZXh0dXJlKCkpOworICAg
ICAgICBTa0NhbnZhcyBjYW52YXMoJmRldmljZSk7CisgICAgICAgIGNhbnZhcy5jbGVhcigweDAp
OworICAgICAgICBzd2l0Y2ggKGZpbHRlck9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpKSB7
CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpHUkFZU0NBTEU6IHsKKyAgICAgICAgICAg
IGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qIG9wID0gc3RhdGljX2Nhc3Q8
Y29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbik7
CisgICAgICAgICAgICBTa1NjYWxhciBtYXRyaXhbMjBdOworICAgICAgICAgICAgZ2V0R3JheXNj
YWxlTWF0cml4KDEgLSBvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAgICAgICBhcHBseUNv
bG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpTRVBJQTogeworICAgICAg
ICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3AgPSBzdGF0aWNf
Y2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0
aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAgICAgICBnZXRT
ZXBpYU1hdHJpeCgxIC0gb3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAgICAgICAgYXBwbHlD
b2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6U0FUVVJBVEU6IHsKKyAg
ICAgICAgICAgIGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qIG9wID0gc3Rh
dGljX2Nhc3Q8Y29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9w
ZXJhdGlvbik7CisgICAgICAgICAgICBTa1NjYWxhciBtYXRyaXhbMjBdOworICAgICAgICAgICAg
Z2V0U2F0dXJhdGVNYXRyaXgoMSAtIG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAgICAgICAg
IGFwcGx5Q29sb3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OkhVRV9ST1RB
VEU6IHsKKyAgICAgICAgICAgIGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24q
IG9wID0gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbio+
KGZpbHRlck9wZXJhdGlvbik7CisgICAgICAgICAgICBTa1NjYWxhciBtYXRyaXhbMjBdOworICAg
ICAgICAgICAgZ2V0SHVlUm90YXRlTWF0cml4KG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAg
ICAgICAgIGFwcGx5Q29sb3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OklO
VkVSVDogeworICAgICAgICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlv
biogb3AgPSBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9u
Kj4oZmlsdGVyT3BlcmF0aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07Cisg
ICAgICAgICAgICBnZXRJbnZlcnRNYXRyaXgob3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAg
ICAgICAgYXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6T1BB
Q0lUWTogeworICAgICAgICAgICAgY29uc3QgQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRlck9w
ZXJhdGlvbiogb3AgPSBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0NvbXBvbmVudFRyYW5zZmVyRmls
dGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1h
dHJpeFsyMF07CisgICAgICAgICAgICBnZXRPcGFjaXR5TWF0cml4KG9wLT5hbW91bnQoKSwgbWF0
cml4KTsKKyAgICAgICAgICAgIGFwcGx5Q29sb3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRy
aXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJP
cGVyYXRpb246OkJMVVI6IHsKKyAgICAgICAgICAgIGNvbnN0IEJsdXJGaWx0ZXJPcGVyYXRpb24q
IG9wID0gc3RhdGljX2Nhc3Q8Y29uc3QgQmx1ckZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJh
dGlvbik7CisgICAgICAgICAgICBmbG9hdCBzdGRYID0gb3AtPnN0ZERldmlhdGlvbigpLmNhbGNG
bG9hdFZhbHVlKDApOworICAgICAgICAgICAgZmxvYXQgc3RkWSA9IG9wLT5zdGREZXZpYXRpb24o
KS5jYWxjRmxvYXRWYWx1ZSgxKTsKKyAgICAgICAgICAgIFNrQXV0b1RVbnJlZjxTa0ltYWdlRmls
dGVyPiBmaWx0ZXIobmV3IFNrQmx1ckltYWdlRmlsdGVyKHN0ZFgsIHN0ZFkpKTsKKyAgICAgICAg
ICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAgICAgICBwYWludC5zZXRJbWFnZUZpbHRlcihmaWx0
ZXIuZ2V0KCkpOworICAgICAgICAgICAgcGFpbnQuc2V0Q29sb3IoMHhGRkZGRkZGRik7CisgICAg
ICAgICAgICBjYW52YXMuc2F2ZUxheWVyKDAsICZwYWludCk7CisgICAgICAgICAgICBjYW52YXMu
ZHJhd0JpdG1hcChzb3VyY2UsIDAsIDApOworICAgICAgICAgICAgY2FudmFzLnJlc3RvcmUoKTsK
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0
aW9uOjpQQVNTVEhST1VHSDoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNhbnZhcy5k
cmF3Qml0bWFwKHNvdXJjZSwgMCwgMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgICAgICBnci0+Zmx1c2goKTsKKyAgICAgICAgLy8gRGVzdCB0ZXh0dXJlIGZyb20gdGhpcyBm
aWx0ZXIgYmVjb21lcyBzb3VyY2UgYml0bWFwIGZvciBuZXh0IGZpbHRlci4KKyAgICAgICAgc291
cmNlLnNldFBpeGVsUmVmKG5ldyBTa0dyVGV4dHVyZVBpeGVsUmVmKGRlc3QudGV4dHVyZSgpKSkt
PnVucmVmKCk7CisgICAgICAgIC8vIFVubG9jayB0aGUgcHJldmlvdXMgdGV4dHVyZSBjYWNoZSBl
bnRyeS4KKyAgICAgICAgaWYgKHNvdXJjZUVudHJ5LnRleHR1cmUoKSkKKyAgICAgICAgICAgIGdy
LT51bmxvY2tUZXh0dXJlKHNvdXJjZUVudHJ5KTsKKyAgICB9CisgICAgaWYgKGRlc3QudGV4dHVy
ZSgpKQorICAgICAgICBnci0+dW5sb2NrVGV4dHVyZShkZXN0KTsKKyAgICByZXR1cm4gc291cmNl
OworfQorCit9CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQpJbmRleDog
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJm
YWNlRmlsdGVycy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuaAkocmV2aXNpb24gMCkKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3Vy
ZmFjZUZpbHRlcnMuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxMiBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworI2lm
bmRlZiBDQ1JlbmRlclN1cmZhY2VGaWx0ZXJzX2gKKyNkZWZpbmUgQ0NSZW5kZXJTdXJmYWNlRmls
dGVyc19oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKK2NsYXNzIFNrQml0
bWFwOworCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBGaWx0ZXJPcGVyYXRpb25zOworY2xh
c3MgRmxvYXRTaXplOworY2xhc3MgR3JhcGhpY3NDb250ZXh0M0Q7CitjbGFzcyBDQ1JlbmRlclN1
cmZhY2VGaWx0ZXJzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgU2tCaXRtYXAgYXBwbHkoY29uc3Qg
RmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycywgdW5zaWduZWQgdGV4dHVyZUlkLCBjb25zdCBGbG9h
dFNpemUmLCBHcmFwaGljc0NvbnRleHQzRCopOworfTsKKworfQorI2VuZGlmIC8vIFVTRShBQ0NF
TEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlmCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>124960</attachid>
            <date>2012-02-01 09:25:28 -0800</date>
            <delta_ts>2012-02-08 11:06:32 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77266-20120201122526.patch</filename>
            <type>text/plain</type>
            <size>35820</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNjQ2NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY4IEBACisyMDEyLTAyLTAxICBTdGVwaGVu
IFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
RW5hYmxlIENTUyBmaWx0ZXJzIG9uIGNvbXBvc2l0ZWQgbGF5ZXJzLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNjYKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXaWxsIGJlIGNvdmVyZWQgYnkgZXhpc3Rp
bmcgdGVzdHMgaW4gY3NzMy9maWx0ZXJzICh3aGVuIGVuYWJsZWQpLgorCisgICAgICAgICogV2Vi
Q29yZS5neXBpOgorICAgICAgICBBZGQgQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy4qIHRvIHRoZSBD
aHJvbWl1bSBidWlsZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFw
aGljc0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNo
cm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgT3ZlcnJpZGUgc2V0RmlsdGVycygp
IHZpcnR1YWwgZnJvbSBHcmFwaGljc0xheWVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJv
bWl1bTo6c2V0RmlsdGVycyk6CisgICAgICAgIEltcGxlbWVudCBzZXRGaWx0ZXJzKCkgdG8gY2Fj
aGUgdGhlIGZpbHRlcnMgaGVyZS4uLgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6
cHVzaFByb3BlcnRpZXNUbyk6CisgICAgICAgIC4uLiBhbmQgcHVzaCB0aGVtIHRvIHRoZSBDQ0xh
eWVySW1wbCBhdCBjb21taXQgdGltZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpm
aWx0ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IGFjY2Vzc29yLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllclJlbmRlcmVyQ2hyb21pdW06OnJlc2V0Q29udGV4dCk6CisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmg6CisgICAg
ICAgIEltcGxlbWVudCByZXNldCBvZiBhIHN1YnNldCBvZiB0aGUgY29tcG9zaXRvcidzIEdMIHN0
YXRlLiAgVGhpcyBpcworICAgICAgICBjdXJyZW50bHkgb25seSB0aGUgc3Vic2V0IHRvdWNoZWQg
YnkgR2FuZXNoLCBhbmQgd2lsbCBiZSBleHBhbmRlZCBhcworICAgICAgICBuZWVkZWQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmVuZGVyU3VyZmFjZUNocm9taXVtLmg6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTdXJmYWNlQ2hyb21pdW06OnNldEZpbHRlcnMpOgor
ICAgICAgICBJbXBsZW1lbnQgc3R1YiB2ZXJzaW9uIG9mIHNldEZpbHRlcnMoKSwgdG8gc2F0aXNm
eSB0aGUgdGVtcGxhdGVzLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDTGF5ZXJJbXBsLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJJbXBsOjpzZXRGaWx0
ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IHNldHRlciB0byByZWNlaXZlIGZpbHRlcnMgYXQgY29t
bWl0IHRpbWUuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXll
ckltcGwuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNDTGF5ZXJJbXBsOjpmaWx0ZXJzKToKKyAgICAg
ICAgSW1wbGVtZW50IG1lbWJlciB2YXIgYW5kIGFjY2Vzc29yIGZvciBmaWx0ZXJzLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpjYWxjdWxhdGVEcmF3VHJhbnNmb3Jtc0FuZFZpc2liaWxp
dHlJbnRlcm5hbCk6CisgICAgICAgIEFkZCBhbm90aGVyIGNsYXVzZSBoZXJlIHRvIGZvcmNlIGNy
ZWF0aW9uIG9mIGEgUmVuZGVyU3VyZmFjZSB3aGVuCisgICAgICAgIGZpbHRlcnMgYXJlIHByZXNl
bnQsIGFuZCB0byBmb3J3YXJkIHRoZW0gZnJvbSB0aGUgbGF5ZXIgdG8gdGhlCisgICAgICAgIFJl
bmRlclN1cmZhY2UuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NS
ZW5kZXJTdXJmYWNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFjZTo6ZHJh
dyk6CisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6OmRyYXdMYXllcik6CisgICAg
ICAgIENoZWNrIGZvciBmaWx0ZXJzIGF0IGRyYXcgdGltZSwgYXBwbHkgdGhlbSwgYW5kIGZvcndh
cmQgdGhlIHJlc3VsdAorICAgICAgICB0aHJvdWdoIHRoZSBkcmF3aW5nIHRyYXZlcnNhbC4KKyAg
ICAgICAgKFdlYkNvcmU6OkNDUmVuZGVyU3VyZmFjZTo6ZHJhd1N1cmZhY2UpOgorICAgICAgICBJ
ZiBmaWx0ZXIgYml0bWFwIGlzIHByZXNlbnQsIGJpbmQgaXQgaW5zdGVhZCBvZiB0aGUgbm9ybWFs
CisgICAgICAgIFJlbmRlclN1cmZhY2UgdGV4dHVyZS4KKyAgICAgICAgKFdlYkNvcmU6OkNDUmVu
ZGVyU3VyZmFjZTo6YXBwbHlGaWx0ZXJzKToKKyAgICAgICAgQXBwbHkgZmlsdGVycyB0byB0aGUg
cmVuZGVyIHN1cmZhY2UgdGV4dHVyZSwgYW5kIHN0b3JlIHRoZSByZXN1bHQgaW4KKyAgICAgICAg
bV9maWx0ZXJCaXRtYXAuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NSZW5kZXJTdXJmYWNlLmg6CisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6OnNl
dEZpbHRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q0NSZW5kZXJTdXJmYWNlOjpmaWx0ZXJzKToK
KyAgICAgICAgKENDUmVuZGVyU3VyZmFjZSk6CisgICAgICAgIEZpbHRlcnMgZ2V0dGVycyBhbmQg
c2V0dGVycy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRl
clN1cmZhY2VGaWx0ZXJzLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1
cmZhY2VGaWx0ZXJzOjphcHBseSk6CisgICAgICAgIEV4dGVybmFsIGludGVyZmFjZSBmb3IgdGhp
cyAoc3RhdGljKSBjbGFzcy4gIEFsbCBpbnRlcm5hbAorICAgICAgICBpbXBsZW1lbnRhdGlvbiBh
bmQgaGVscGVyIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHVubmFtZWQgbmFtZXNwYWNlLgorICAgICAg
ICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMu
aDogQWRkZWQuCisKIDIwMTItMDItMDEgIFNoaW55YSBLYXdhbmFrYSAgPHNoaW55YWtAZ29vZ2xl
LmNvbT4KIAogICAgICAgICBDb250ZW50IGVsZW1lbnQgc2hvdWxkIGJlIGFibGUgdG8gYmUgZHlu
YW1pY2FsbHkgYWRkZWQvcmVtb3ZlZC9yZXBsYWNlZCBpbiBhIHNoYWRvdyB0cmVlLgpJbmRleDog
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L1dlYkNvcmUuZ3lwaQkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0zMjc2LDYgKzMyNzYsOCBAQAogICAgICAgICAgICAg
J3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5oJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VEcmF3
UXVhZC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
UmVuZGVyU3VyZmFjZURyYXdRdWFkLmgnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuY3BwJywKKyAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyLmNw
cCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hlZHVs
ZXIuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hl
ZHVsZXJTdGF0ZU1hY2hpbmUuY3BwJywKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNo
cm9taXVtLmNwcAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjU0LDYgKzI1NCwxMiBAQCB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29u
dGVudHNPCiAgICAgbV9sYXllci0+c2V0T3BhcXVlKG1fY29udGVudHNPcGFxdWUpOwogfQogCiti
b29sIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0RmlsdGVycyhjb25zdCBGaWx0ZXJPcGVyYXRp
b25zJiBmaWx0ZXJzKQoreworICAgIG1fbGF5ZXItPnNldEZpbHRlcnMoZmlsdGVycyk7CisgICAg
cmV0dXJuIEdyYXBoaWNzTGF5ZXI6OnNldEZpbHRlcnMoZmlsdGVycyk7Cit9CisKIHZvaWQgR3Jh
cGhpY3NMYXllckNocm9taXVtOjpzZXRNYXNrTGF5ZXIoR3JhcGhpY3NMYXllciogbWFza0xheWVy
KQogewogICAgIGlmIChtYXNrTGF5ZXIgPT0gbV9tYXNrTGF5ZXIpCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
cmFwaGljc0xheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmgJKHdv
cmtpbmcgY29weSkKQEAgLTgyLDYgKzgyLDkgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCB2b2lk
IHNldE9wYWNpdHkoZmxvYXQpOwogCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGZpbHRlciBjYW4g
YmUgcmVuZGVyZWQgYnkgdGhlIGNvbXBvc2l0b3IKKyAgICB2aXJ0dWFsIGJvb2wgc2V0RmlsdGVy
cyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJik7CisKICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNE
aXNwbGF5KCk7CiAgICAgdmlydHVhbCB2b2lkIHNldE5lZWRzRGlzcGxheUluUmVjdChjb25zdCBG
bG9hdFJlY3QmKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29udGVudHNOZWVkc0Rpc3BsYXkoKTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hy
b21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAxMDY0NjcpCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMzE0LDYgKzMxNCwxMiBAQCB2b2lkIExheWVyQ2hyb21pdW06OnNldFJl
cGxpY2FMYXllcihMYXllCiAgICAgc2V0TmVlZHNDb21taXQoKTsKIH0KIAordm9pZCBMYXllckNo
cm9taXVtOjpzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpCit7Cisg
ICAgbV9maWx0ZXJzID0gZmlsdGVyczsKKyAgICBzZXROZWVkc0NvbW1pdCgpOworfQorCiB2b2lk
IExheWVyQ2hyb21pdW06OnNldE9wYWNpdHkoZmxvYXQgb3BhY2l0eSkKIHsKICAgICBpZiAobV9v
cGFjaXR5ID09IG9wYWNpdHkpCkBAIC00MjAsNiArNDI2LDcgQEAgdm9pZCBMYXllckNocm9taXVt
OjpwdXNoUHJvcGVydGllc1RvKENDTAogICAgIGxheWVyLT5zZXREZWJ1Z0JvcmRlcldpZHRoKG1f
ZGVidWdCb3JkZXJXaWR0aCk7CiAgICAgbGF5ZXItPnNldERvdWJsZVNpZGVkKG1fZG91YmxlU2lk
ZWQpOwogICAgIGxheWVyLT5zZXREcmF3c0NvbnRlbnQoZHJhd3NDb250ZW50KCkpOworICAgIGxh
eWVyLT5zZXRGaWx0ZXJzKGZpbHRlcnMoKSk7CiAgICAgbGF5ZXItPnNldElzTm9uQ29tcG9zaXRl
ZENvbnRlbnQobV9pc05vbkNvbXBvc2l0ZWRDb250ZW50KTsKICAgICBsYXllci0+c2V0TWFza3NU
b0JvdW5kcyhtX21hc2tzVG9Cb3VuZHMpOwogICAgIGxheWVyLT5zZXRTY3JvbGxhYmxlKG1fc2Ny
b2xsYWJsZSk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAxMDY0NjcpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTM0LDYgKzM0LDcgQEAKIAogI2lmIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKIAorI2luY2x1ZGUgIkZpbHRlck9wZXJhdGlvbnMuaCIKICNpbmNsdWRlICJG
bG9hdFBvaW50LmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKQEAgLTEwOCw2ICsxMDksOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRP
cGFjaXR5KGZsb2F0KTsKICAgICBmbG9hdCBvcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gbV9vcGFj
aXR5OyB9CiAKKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYpOwor
ICAgIGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMoKSBjb25zdCB7IHJldHVybiBtX2Zp
bHRlcnM7IH0KKwogICAgIHZpcnR1YWwgdm9pZCBzZXRPcGFxdWUoYm9vbCk7CiAgICAgYm9vbCBv
cGFxdWUoKSBjb25zdCB7IHJldHVybiBtX29wYXF1ZTsgfQogCkBAIC0yNzIsNiArMjc2LDcgQEAg
cHJpdmF0ZToKICAgICBDb2xvciBtX2RlYnVnQm9yZGVyQ29sb3I7CiAgICAgZmxvYXQgbV9kZWJ1
Z0JvcmRlcldpZHRoOwogICAgIGZsb2F0IG1fb3BhY2l0eTsKKyAgICBGaWx0ZXJPcGVyYXRpb25z
IG1fZmlsdGVyczsKICAgICBmbG9hdCBtX2FuY2hvclBvaW50WjsKICAgICBib29sIG1faXNEcmF3
YWJsZTsKICAgICBib29sIG1fbWFza3NUb0JvdW5kczsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyUmVuZGVyZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJS
ZW5kZXJlckNocm9taXVtLmNwcAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNzgzLDYgKzc4MywxNCBAQCB2b2lkIExheWVyUmVuZGVyZXJDaHJvbWl1
bTo6ZHJhd1RleHR1cmVkCiAgICAgR0xDKG1fY29udGV4dCwgbV9jb250ZXh0LT5kcmF3RWxlbWVu
dHMoR3JhcGhpY3NDb250ZXh0M0Q6OlRSSUFOR0xFUywgNiwgR3JhcGhpY3NDb250ZXh0M0Q6OlVO
U0lHTkVEX1NIT1JULCAwKSk7CiB9CiAKK3ZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpyZXNl
dENvbnRleHQoKQoreworICAgIG1fc2hhcmVkR2VvbWV0cnktPnByZXBhcmVGb3JEcmF3KCk7Cisg
ICAgR0xDKGNvbnRleHQzRCwgbV9jb250ZXh0LT52aWV3cG9ydCgwLCAwLCB2aWV3cG9ydFdpZHRo
KCksIHZpZXdwb3J0SGVpZ2h0KCkpKTsKKyAgICBHTEMoY29udGV4dDNELCBtX2NvbnRleHQtPmJp
bmRGcmFtZWJ1ZmZlcihHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVCVUZGRVIsIDApKTsKKyAgICBH
TEMoY29udGV4dDNELCBtX2NvbnRleHQtPmFjdGl2ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0M0Q6
OlRFWFRVUkUwKSk7Cit9CisKIHZvaWQgTGF5ZXJSZW5kZXJlckNocm9taXVtOjpmaW5pc2goKQog
ewogICAgIFRSQUNFX0VWRU5UKCJMYXllclJlbmRlcmVyQ2hyb21pdW06OmZpbmlzaCIsIHRoaXMs
IDApOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5
ZXJSZW5kZXJlckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJSZW5kZXJlckNocm9taXVtLmgJKHJldmlzaW9uIDEw
NjQ2NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVy
UmVuZGVyZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xNTgsNiArMTU4LDggQEAgcHVi
bGljOgogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0
LCBmbG9hdCBvcGFjaXR5LCBjb25zdCBGbG9hdFF1YWQmLAogICAgICAgICAgICAgICAgICAgICAg
ICAgICBpbnQgbWF0cml4TG9jYXRpb24sIGludCBhbHBoYUxvY2F0aW9uLCBpbnQgcXVhZExvY2F0
aW9uKTsKIAorICAgIHZvaWQgcmVzZXRDb250ZXh0KCk7CisKIHByaXZhdGU6CiAgICAgTGF5ZXJS
ZW5kZXJlckNocm9taXVtKENDTGF5ZXJUcmVlSG9zdEltcGwqLCBQYXNzUmVmUHRyPEdyYXBoaWNz
Q29udGV4dDNEPik7CiAgICAgYm9vbCBpbml0aWFsaXplKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SZW5kZXJTdXJmYWNlQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SZW5k
ZXJTdXJmYWNlQ2hyb21pdW0uaAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmVuZGVyU3VyZmFjZUNocm9taXVtLmgJKHdvcmtp
bmcgY29weSkKQEAgLTM5LDYgKzM5LDcgQEAKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCitjbGFz
cyBGaWx0ZXJPcGVyYXRpb25zOwogY2xhc3MgTGF5ZXJDaHJvbWl1bTsKIGNsYXNzIExheWVyUmVu
ZGVyZXJDaHJvbWl1bTsKIGNsYXNzIE1hbmFnZWRUZXh0dXJlOwpAQCAtNzcsNiArNzgsMTEgQEAg
cHVibGljOgogICAgIGNvbnN0IEludFJlY3QmIGNsaXBSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9j
bGlwUmVjdDsgfQogICAgIHZvaWQgc2V0Q2xpcFJlY3QoY29uc3QgSW50UmVjdCYgY2xpcFJlY3Qp
IHsgbV9jbGlwUmVjdCA9IGNsaXBSZWN0OyB9CiAKKyAgICAvLyBXZSBkb24ndCBjYXJlIGFib3V0
IGZpbHRlcnMgaGVyZSwgYnV0IHdlIG5lZWQgdG8gc2F0aXNmeSAKKyAgICAvLyBjYWxjdWxhdGVE
cmF3VHJhbnNmb3Jtc0FuZFZpc2liaWxpdHlJbnRlcm5hbCB3aGVuIHRlbXBsYXRlZCBvbiB0aGlz
CisgICAgLy8gY2xhc3MuCisgICAgdm9pZCBzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlv
bnMmKSB7IH0KKwogICAgIGJvb2wgc2tpcHNEcmF3KCkgY29uc3QgeyByZXR1cm4gbV9za2lwc0Ry
YXc7IH0KICAgICB2b2lkIHNldFNraXBzRHJhdyhib29sIHNraXBzRHJhdykgeyBtX3NraXBzRHJh
dyA9IHNraXBzRHJhdzsgfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuY3BwCShyZXZpc2lv
biAxMDY0NjcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9j
Yy9DQ0xheWVySW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4Myw2ICszODMsMTIgQEAgdm9p
ZCBDQ0xheWVySW1wbDo6c2V0QmFja2dyb3VuZENvdmVyc1ZpZQogICAgIG1fbGF5ZXJQcm9wZXJ0
eUNoYW5nZWQgPSB0cnVlOwogfQogCit2b2lkIENDTGF5ZXJJbXBsOjpzZXRGaWx0ZXJzKGNvbnN0
IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpCit7CisgICAgbV9maWx0ZXJzID0gZmlsdGVyczsK
KyAgICBub3RlTGF5ZXJQcm9wZXJ0eUNoYW5nZWRGb3JTdWJ0cmVlKCk7Cit9CisKIHZvaWQgQ0NM
YXllckltcGw6OnNldE1hc2tzVG9Cb3VuZHMoYm9vbCBtYXNrc1RvQm91bmRzKQogewogICAgIGlm
IChtX21hc2tzVG9Cb3VuZHMgPT0gbWFza3NUb0JvdW5kcykKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllcklt
cGwuaAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcs
NyBAQAogI2RlZmluZSBDQ0xheWVySW1wbF9oCiAKICNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1
ZGUgIkZpbHRlck9wZXJhdGlvbnMuaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKICNpbmNsdWRl
ICJJbnRSZWN0LmgiCiAjaW5jbHVkZSAiVGV4dFN0cmVhbS5oIgpAQCAtMTAwLDYgKzEwMSw5IEBA
IHB1YmxpYzoKICAgICB2b2lkIHNldEJhY2tncm91bmRDb3ZlcnNWaWV3cG9ydChib29sKTsKICAg
ICBib29sIGJhY2tncm91bmRDb3ZlcnNWaWV3cG9ydCgpIGNvbnN0IHsgcmV0dXJuIG1fYmFja2dy
b3VuZENvdmVyc1ZpZXdwb3J0OyB9CiAKKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmlsdGVy
T3BlcmF0aW9ucyYpOworICAgIGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMoKSBjb25z
dCB7IHJldHVybiBtX2ZpbHRlcnM7IH0KKwogICAgIHZvaWQgc2V0TWFza3NUb0JvdW5kcyhib29s
KTsKICAgICBib29sIG1hc2tzVG9Cb3VuZHMoKSBjb25zdCB7IHJldHVybiBtX21hc2tzVG9Cb3Vu
ZHM7IH0KIApAQCAtMjg3LDYgKzI5MSw4IEBAIHByaXZhdGU6CiAgICAgQ29sb3IgbV9kZWJ1Z0Jv
cmRlckNvbG9yOwogICAgIGZsb2F0IG1fZGVidWdCb3JkZXJXaWR0aDsKIAorICAgIEZpbHRlck9w
ZXJhdGlvbnMgbV9maWx0ZXJzOworCiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9kcmF3VHJh
bnNmb3JtOwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fc2NyZWVuU3BhY2VUcmFuc2Zvcm07
CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
TGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNwcAkocmV2
aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NMYXllclRyZWVIb3N0Q29tbW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQ0LDcg
KzI0NCw4IEBAIHN0YXRpYyBib29sIGNhbGN1bGF0ZURyYXdUcmFuc2Zvcm1zQW5kVmkKICAgICBi
b29sIHVzZVN1cmZhY2VGb3JNYXNraW5nID0gbGF5ZXItPm1hc2tMYXllcigpOwogICAgIGJvb2wg
dXNlU3VyZmFjZUZvclJlZmxlY3Rpb24gPSBsYXllci0+cmVwbGljYUxheWVyKCk7CiAgICAgYm9v
bCB1c2VTdXJmYWNlRm9yRmxhdERlc2NlbmRhbnRzID0gbGF5ZXItPnBhcmVudCgpICYmIGxheWVy
LT5wYXJlbnQoKS0+cHJlc2VydmVzM0QoKSAmJiAhbGF5ZXItPnByZXNlcnZlczNEKCkgJiYgbGF5
ZXItPmRlc2NlbmRhbnREcmF3c0NvbnRlbnQoKTsKLSAgICBpZiAodXNlU3VyZmFjZUZvck1hc2tp
bmcgfHwgdXNlU3VyZmFjZUZvclJlZmxlY3Rpb24gfHwgdXNlU3VyZmFjZUZvckZsYXREZXNjZW5k
YW50cyB8fCAoKHVzZVN1cmZhY2VGb3JDbGlwcGluZyB8fCB1c2VTdXJmYWNlRm9yT3BhY2l0eSkg
JiYgbGF5ZXItPmRlc2NlbmRhbnREcmF3c0NvbnRlbnQoKSkpIHsKKyAgICBib29sIHVzZVN1cmZh
Y2VGb3JGaWx0ZXJzID0gbGF5ZXItPmZpbHRlcnMoKS5zaXplKCkgPiAwOworICAgIGlmICh1c2VT
dXJmYWNlRm9yTWFza2luZyB8fCB1c2VTdXJmYWNlRm9yUmVmbGVjdGlvbiB8fCB1c2VTdXJmYWNl
Rm9yRmxhdERlc2NlbmRhbnRzIHx8IHVzZVN1cmZhY2VGb3JGaWx0ZXJzIHx8ICgodXNlU3VyZmFj
ZUZvckNsaXBwaW5nIHx8IHVzZVN1cmZhY2VGb3JPcGFjaXR5KSAmJiBsYXllci0+ZGVzY2VuZGFu
dERyYXdzQ29udGVudCgpKSkgewogICAgICAgICBpZiAoIWxheWVyLT5yZW5kZXJTdXJmYWNlKCkp
CiAgICAgICAgICAgICBsYXllci0+Y3JlYXRlUmVuZGVyU3VyZmFjZSgpOwogCkBAIC0yODIsNiAr
MjgzLDggQEAgc3RhdGljIGJvb2wgY2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaQogICAgICAg
ICBpZiAobGF5ZXItPnJlcGxpY2FMYXllcigpICYmIGxheWVyLT5yZXBsaWNhTGF5ZXIoKS0+bWFz
a0xheWVyKCkpCiAgICAgICAgICAgICBsYXllci0+cmVwbGljYUxheWVyKCktPm1hc2tMYXllcigp
LT5zZXRUYXJnZXRSZW5kZXJTdXJmYWNlKHJlbmRlclN1cmZhY2UpOwogCisgICAgICAgIHJlbmRl
clN1cmZhY2UtPnNldEZpbHRlcnMobGF5ZXItPmZpbHRlcnMoKSk7CisKICAgICAgICAgcmVuZGVy
U3VyZmFjZUxheWVyTGlzdC5hcHBlbmQobGF5ZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGxh
eWVyLT5zZXREcmF3VHJhbnNmb3JtKGNvbWJpbmVkVHJhbnNmb3JtKTsKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NSZW5kZXJTdXJmYWNlLmNwcAkocmV2aXNpb24gMTA2NDY3KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMjksNiArMjksOCBAQAogCiAjaW5jbHVkZSAiY2MvQ0NSZW5kZXJTdXJm
YWNlLmgiCiAKKyNpbmNsdWRlICJHZW9tZXRyeUJpbmRpbmcuaCIKKyNpbmNsdWRlICJHclRleHR1
cmUuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgogI2luY2x1ZGUgIkxheWVyQ2hy
b21pdW0uaCIKICNpbmNsdWRlICJMYXllclJlbmRlcmVyQ2hyb21pdW0uaCIKQEAgLTM2LDYgKzM4
LDcgQEAKICNpbmNsdWRlICJUZXh0U3RyZWFtLmgiCiAjaW5jbHVkZSAiY2MvQ0NEYW1hZ2VUcmFj
a2VyLmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllckltcGwuaCIKKyNpbmNsdWRlICJjYy9DQ1JlbmRl
clN1cmZhY2VGaWx0ZXJzLmgiCiAjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgogCiBuYW1l
c3BhY2UgV2ViQ29yZSB7CkBAIC0xMDUsNiArMTA4LDggQEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6
OmRyYXcoTGF5ZXJSZW5kZXJlcgogewogICAgIGlmIChtX3NraXBzRHJhdyB8fCAhbV9jb250ZW50
c1RleHR1cmUpCiAgICAgICAgIHJldHVybjsKKworICAgIFNrQml0bWFwIGZpbHRlckJpdG1hcCA9
IGFwcGx5RmlsdGVycyhsYXllclJlbmRlcmVyKTsKICAgICAvLyBGSVhNRTogQnkgdXNpbmcgdGhl
IHNhbWUgUmVuZGVyU3VyZmFjZSBmb3IgYm90aCB0aGUgY29udGVudCBhbmQgaXRzIHJlZmxlY3Rp
b24sCiAgICAgLy8gaXQncyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGFwcGx5IGEgc2VwYXJh
dGUgbWFzayB0byB0aGUgcmVmbGVjdGlvbiBsYXllcgogICAgIC8vIG9yIGNvcnJlY3RseSBoYW5k
bGUgb3BhY2l0eSBpbiByZWZsZWN0aW9ucyAob3BhY2l0eSBtdXN0IGJlIGFwcGxpZWQgYWZ0ZXIg
ZHJhd2luZwpAQCAtMTI4LDEyICsxMzMsMTIgQEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXco
TGF5ZXJSZW5kZXJlcgogCiAgICAgLy8gUmVmbGVjdGlvbiBkcmF3cyBiZWZvcmUgdGhlIGxheWVy
LgogICAgIGlmIChtX293bmluZ0xheWVyLT5yZXBsaWNhTGF5ZXIoKSkKLSAgICAgICAgZHJhd0xh
eWVyKGxheWVyUmVuZGVyZXIsIHJlcGxpY2FNYXNrTGF5ZXIsIG1fcmVwbGljYURyYXdUcmFuc2Zv
cm0pOworICAgICAgICBkcmF3TGF5ZXIobGF5ZXJSZW5kZXJlciwgcmVwbGljYU1hc2tMYXllciwg
bV9yZXBsaWNhRHJhd1RyYW5zZm9ybSwgZmlsdGVyQml0bWFwKTsKIAotICAgIGRyYXdMYXllcihs
YXllclJlbmRlcmVyLCBtX21hc2tMYXllciwgbV9kcmF3VHJhbnNmb3JtKTsKKyAgICBkcmF3TGF5
ZXIobGF5ZXJSZW5kZXJlciwgbV9tYXNrTGF5ZXIsIG1fZHJhd1RyYW5zZm9ybSwgZmlsdGVyQml0
bWFwKTsKIH0KIAotdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXdMYXllcihMYXllclJlbmRlcmVy
Q2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIENDTGF5ZXJJbXBsKiBtYXNrTGF5ZXIsIGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtKQordm9pZCBDQ1JlbmRlclN1cmZhY2U6
OmRyYXdMYXllcihMYXllclJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIENDTGF5ZXJJ
bXBsKiBtYXNrTGF5ZXIsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3Jt
LCBjb25zdCBTa0JpdG1hcCYgZmlsdGVyQml0bWFwKQogewogICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4IHJlbmRlck1hdHJpeCA9IGRyYXdUcmFuc2Zvcm07CiAgICAgLy8gQXBwbHkgYSBzY2FsaW5n
IGZhY3RvciB0byBzaXplIHRoZSBxdWFkIGZyb20gMXgxIHRvIGl0cyBpbnRlbmRlZCBzaXplLgpA
QCAtMTY1LDI0ICsxNzAsMjQgQEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXdMYXllcihMYXll
clJlbgogICAgIGlmICh1c2VNYXNrKSB7CiAgICAgICAgIGlmICh1c2VBQSkgewogICAgICAgICAg
ICAgY29uc3QgTWFza1Byb2dyYW1BQSogcHJvZ3JhbSA9IGxheWVyUmVuZGVyZXItPnJlbmRlclN1
cmZhY2VNYXNrUHJvZ3JhbUFBKCk7Ci0gICAgICAgICAgICBkcmF3U3VyZmFjZShsYXllclJlbmRl
cmVyLCBtYXNrTGF5ZXIsIGRyYXdUcmFuc2Zvcm0sIGRldmljZU1hdHJpeCwgZGV2aWNlUmVjdCwg
bGF5ZXJRdWFkLCBwcm9ncmFtLCBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLm1hc2tTYW1wbGVy
TG9jYXRpb24oKSwgcHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkucG9pbnRMb2NhdGlvbigpLCBwcm9n
cmFtLT5mcmFnbWVudFNoYWRlcigpLmVkZ2VMb2NhdGlvbigpKTsKKyAgICAgICAgICAgIGRyYXdT
dXJmYWNlKGxheWVyUmVuZGVyZXIsIG1hc2tMYXllciwgZHJhd1RyYW5zZm9ybSwgZGV2aWNlTWF0
cml4LCBkZXZpY2VSZWN0LCBsYXllclF1YWQsIHByb2dyYW0sIHByb2dyYW0tPmZyYWdtZW50U2hh
ZGVyKCkubWFza1NhbXBsZXJMb2NhdGlvbigpLCBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS5wb2lu
dExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkuZWRnZUxvY2F0aW9uKCksIGZp
bHRlckJpdG1hcCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb25zdCBNYXNrUHJv
Z3JhbSogcHJvZ3JhbSA9IGxheWVyUmVuZGVyZXItPnJlbmRlclN1cmZhY2VNYXNrUHJvZ3JhbSgp
OwotICAgICAgICAgICAgZHJhd1N1cmZhY2UobGF5ZXJSZW5kZXJlciwgbWFza0xheWVyLCBkcmF3
VHJhbnNmb3JtLCBkZXZpY2VNYXRyaXgsIGRldmljZVJlY3QsIGxheWVyUXVhZCwgcHJvZ3JhbSwg
cHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5tYXNrU2FtcGxlckxvY2F0aW9uKCksIC0xLCAtMSk7
CisgICAgICAgICAgICBkcmF3U3VyZmFjZShsYXllclJlbmRlcmVyLCBtYXNrTGF5ZXIsIGRyYXdU
cmFuc2Zvcm0sIGRldmljZU1hdHJpeCwgZGV2aWNlUmVjdCwgbGF5ZXJRdWFkLCBwcm9ncmFtLCBw
cm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLm1hc2tTYW1wbGVyTG9jYXRpb24oKSwgLTEsIC0xLCBm
aWx0ZXJCaXRtYXApOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKHVzZUFB
KSB7CiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtQUEqIHByb2dyYW0gPSBsYXllclJlbmRlcmVy
LT5yZW5kZXJTdXJmYWNlUHJvZ3JhbUFBKCk7Ci0gICAgICAgICAgICBkcmF3U3VyZmFjZShsYXll
clJlbmRlcmVyLCBtYXNrTGF5ZXIsIGRyYXdUcmFuc2Zvcm0sIGRldmljZU1hdHJpeCwgZGV2aWNl
UmVjdCwgbGF5ZXJRdWFkLCBwcm9ncmFtLCAtMSwgcHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkucG9p
bnRMb2NhdGlvbigpLCBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLmVkZ2VMb2NhdGlvbigpKTsK
KyAgICAgICAgICAgIGRyYXdTdXJmYWNlKGxheWVyUmVuZGVyZXIsIG1hc2tMYXllciwgZHJhd1Ry
YW5zZm9ybSwgZGV2aWNlTWF0cml4LCBkZXZpY2VSZWN0LCBsYXllclF1YWQsIHByb2dyYW0sIC0x
LCBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS5wb2ludExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCkuZWRnZUxvY2F0aW9uKCksIGZpbHRlckJpdG1hcCk7CiAgICAgICAgIH0gZWxz
ZSB7CiAgICAgICAgICAgICBjb25zdCBQcm9ncmFtKiBwcm9ncmFtID0gbGF5ZXJSZW5kZXJlci0+
cmVuZGVyU3VyZmFjZVByb2dyYW0oKTsKLSAgICAgICAgICAgIGRyYXdTdXJmYWNlKGxheWVyUmVu
ZGVyZXIsIG1hc2tMYXllciwgZHJhd1RyYW5zZm9ybSwgZGV2aWNlTWF0cml4LCBkZXZpY2VSZWN0
LCBsYXllclF1YWQsIHByb2dyYW0sIC0xLCAtMSwgLTEpOworICAgICAgICAgICAgZHJhd1N1cmZh
Y2UobGF5ZXJSZW5kZXJlciwgbWFza0xheWVyLCBkcmF3VHJhbnNmb3JtLCBkZXZpY2VNYXRyaXgs
IGRldmljZVJlY3QsIGxheWVyUXVhZCwgcHJvZ3JhbSwgLTEsIC0xLCAtMSwgZmlsdGVyQml0bWFw
KTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIENDUmVu
ZGVyU3VyZmFjZTo6ZHJhd1N1cmZhY2UoTGF5ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRl
cmVyLCBDQ0xheWVySW1wbCogbWFza0xheWVyLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
ZHJhd1RyYW5zZm9ybSwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRldmljZVRyYW5zZm9y
bSwgY29uc3QgQ0NMYXllclF1YWQmIGRldmljZVJlY3QsIGNvbnN0IENDTGF5ZXJRdWFkJiBsYXll
clF1YWQsIGNvbnN0IFQqIHByb2dyYW0sIGludCBzaGFkZXJNYXNrU2FtcGxlckxvY2F0aW9uLCBp
bnQgc2hhZGVyUXVhZExvY2F0aW9uLCBpbnQgc2hhZGVyRWRnZUxvY2F0aW9uKQordm9pZCBDQ1Jl
bmRlclN1cmZhY2U6OmRyYXdTdXJmYWNlKExheWVyUmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5k
ZXJlciwgQ0NMYXllckltcGwqIG1hc2tMYXllciwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IGRyYXdUcmFuc2Zvcm0sIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkZXZpY2VUcmFuc2Zv
cm0sIGNvbnN0IENDTGF5ZXJRdWFkJiBkZXZpY2VSZWN0LCBjb25zdCBDQ0xheWVyUXVhZCYgbGF5
ZXJRdWFkLCBjb25zdCBUKiBwcm9ncmFtLCBpbnQgc2hhZGVyTWFza1NhbXBsZXJMb2NhdGlvbiwg
aW50IHNoYWRlclF1YWRMb2NhdGlvbiwgaW50IHNoYWRlckVkZ2VMb2NhdGlvbiwgY29uc3QgU2tC
aXRtYXAmIGZpbHRlckJpdG1hcCkKIHsKICAgICBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dDNE
ID0gbGF5ZXJSZW5kZXJlci0+Y29udGV4dCgpOwogCkBAIC0xOTEsNyArMTk2LDExIEBAIHZvaWQg
Q0NSZW5kZXJTdXJmYWNlOjpkcmF3U3VyZmFjZShMYXllclIKIAogICAgIEdMQyhjb250ZXh0M0Qs
IGNvbnRleHQzRC0+YWN0aXZlVGV4dHVyZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRTApKTsK
ICAgICBHTEMoY29udGV4dDNELCBjb250ZXh0M0QtPnVuaWZvcm0xaShwcm9ncmFtLT5mcmFnbWVu
dFNoYWRlcigpLnNhbXBsZXJMb2NhdGlvbigpLCAwKSk7Ci0gICAgbV9jb250ZW50c1RleHR1cmUt
PmJpbmRUZXh0dXJlKGNvbnRleHQzRCwgbGF5ZXJSZW5kZXJlci0+cmVuZGVyU3VyZmFjZVRleHR1
cmVBbGxvY2F0b3IoKSk7CisgICAgaWYgKGZpbHRlckJpdG1hcC5nZXRUZXh0dXJlKCkpIHsKKyAg
ICAgICAgR3JUZXh0dXJlKiB0ZXh0dXJlID0gcmVpbnRlcnByZXRfY2FzdDxHclRleHR1cmUqPihm
aWx0ZXJCaXRtYXAuZ2V0VGV4dHVyZSgpKTsKKyAgICAgICAgY29udGV4dDNELT5iaW5kVGV4dHVy
ZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgdGV4dHVyZS0+Z2V0VGV4dHVyZUhhbmRs
ZSgpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV9jb250ZW50c1RleHR1cmUtPmJpbmRUZXh0dXJl
KGNvbnRleHQzRCwgbGF5ZXJSZW5kZXJlci0+cmVuZGVyU3VyZmFjZVRleHR1cmVBbGxvY2F0b3Io
KSk7CiAKICAgICBpZiAoc2hhZGVyTWFza1NhbXBsZXJMb2NhdGlvbiAhPSAtMSkgewogICAgICAg
ICBHTEMoY29udGV4dDNELCBjb250ZXh0M0QtPmFjdGl2ZVRleHR1cmUoR3JhcGhpY3NDb250ZXh0
M0Q6OlRFWFRVUkUxKSk7CkBAIC0yMTQsNiArMjIzLDI0IEBAIHZvaWQgQ0NSZW5kZXJTdXJmYWNl
OjpkcmF3U3VyZmFjZShMYXllclIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IHByb2dyYW0tPnZlcnRleFNoYWRlcigpLm1hdHJpeExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCkuYWxwaGFMb2NhdGlvbigpLCBzaGFkZXJRdWFkTG9jYXRpb24pOwogfQogCitT
a0JpdG1hcCBDQ1JlbmRlclN1cmZhY2U6OmFwcGx5RmlsdGVycyhMYXllclJlbmRlcmVyQ2hyb21p
dW0qIGxheWVyUmVuZGVyZXIpCit7CisgICAgU2tCaXRtYXAgZmlsdGVyQml0bWFwOworCisgICAg
aWYgKCFtX2NvbnRlbnRzVGV4dHVyZSkKKyAgICAgICAgcmV0dXJuIGZpbHRlckJpdG1hcDsKKwor
ICAgIGlmICghbV9maWx0ZXJzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIGZpbHRlckJpdG1hcDsK
KworICAgIGZpbHRlckJpdG1hcCA9IENDUmVuZGVyU3VyZmFjZUZpbHRlcnM6OmFwcGx5KG1fZmls
dGVycywgbV9jb250ZW50c1RleHR1cmUtPnRleHR1cmVJZCgpLCBtX2NvbnRlbnRSZWN0LnNpemUo
KSwgbGF5ZXJSZW5kZXJlci0+Y29udGV4dCgpKTsKKworICAgIC8vIFJlc2V0IGFsbCB0b3VjaGVk
IEdMIHN0YXRlIGJhY2sgdG8gd2hhdCB0aGUgY29tcG9zaXRvciBleHBlY3RzLgorICAgIGxheWVy
UmVuZGVyZXItPnJlc2V0Q29udGV4dCgpOworCisgICAgcmV0dXJuIGZpbHRlckJpdG1hcDsKK30K
KwogU3RyaW5nIENDUmVuZGVyU3VyZmFjZTo6bmFtZSgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIFN0
cmluZzo6Zm9ybWF0KCJSZW5kZXJTdXJmYWNlKGlkPSVpLG93bmVyPSVzKSIsIG1fb3duaW5nTGF5
ZXItPmlkKCksIG1fb3duaW5nTGF5ZXItPm5hbWUoKS51dGY4KCkuZGF0YSgpKTsKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFj
ZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5oCShyZXZpc2lvbiAxMDY0NjcpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaAkod29y
a2luZyBjb3B5KQpAQCAtMjksMTAgKzI5LDEyIEBACiAKICNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCiAKKyNpbmNsdWRlICJGaWx0ZXJPcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiRmxv
YXRSZWN0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlByb2dyYW1CaW5kaW5n
LmgiCiAjaW5jbHVkZSAiU2hhZGVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJTa0JpdG1hcC5oIgog
I2luY2x1ZGUgIlRleHR1cmVNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRy
aXguaCIKICNpbmNsdWRlICJjYy9DQ0xheWVyUXVhZC5oIgpAQCAtNzAsNiArNzIsMTAgQEAgcHVi
bGljOgogICAgIHZvaWQgc2V0RHJhd1RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgZHJhd1RyYW5zZm9ybSkgeyBtX2RyYXdUcmFuc2Zvcm0gPSBkcmF3VHJhbnNmb3JtOyB9CiAg
ICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0oKSBjb25zdCB7IHJl
dHVybiBtX2RyYXdUcmFuc2Zvcm07IH0KIAorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBGaWx0
ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKSB7IG1fZmlsdGVycyA9IGZpbHRlcnM7IH0KKyAgICBjb25z
dCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9maWx0ZXJzOyB9
CisgICAgU2tCaXRtYXAgYXBwbHlGaWx0ZXJzKExheWVyUmVuZGVyZXJDaHJvbWl1bSopOworCiAg
ICAgdm9pZCBzZXRSZXBsaWNhRHJhd1RyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJp
eCYgcmVwbGljYURyYXdUcmFuc2Zvcm0pIHsgbV9yZXBsaWNhRHJhd1RyYW5zZm9ybSA9IHJlcGxp
Y2FEcmF3VHJhbnNmb3JtOyB9CiAgICAgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHJlcGxp
Y2FEcmF3VHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9yZXBsaWNhRHJhd1RyYW5zZm9ybTsg
fQogCkBAIC0xMDYsOSArMTEyLDkgQEAgcHVibGljOgogICAgIENDRGFtYWdlVHJhY2tlciogZGFt
YWdlVHJhY2tlcigpIGNvbnN0IHsgcmV0dXJuIG1fZGFtYWdlVHJhY2tlci5nZXQoKTsgfQogCiBw
cml2YXRlOgotICAgIHZvaWQgZHJhd0xheWVyKExheWVyUmVuZGVyZXJDaHJvbWl1bSosIENDTGF5
ZXJJbXBsKiwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmKTsKKyAgICB2b2lkIGRyYXdMYXll
cihMYXllclJlbmRlcmVyQ2hyb21pdW0qLCBDQ0xheWVySW1wbCosIGNvbnN0IFRyYW5zZm9ybWF0
aW9uTWF0cml4JiwgY29uc3QgU2tCaXRtYXAmIGZpbHRlckJpdG1hcCk7CiAgICAgdGVtcGxhdGUg
PGNsYXNzIFQ+Ci0gICAgdm9pZCBkcmF3U3VyZmFjZShMYXllclJlbmRlcmVyQ2hyb21pdW0qLCBD
Q0xheWVySW1wbCosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtLCBj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZGV2aWNlVHJhbnNmb3JtLCBjb25zdCBDQ0xheWVy
UXVhZCYgZGV2aWNlUmVjdCwgY29uc3QgQ0NMYXllclF1YWQmLCBjb25zdCBUKiBwcm9ncmFtLCBp
bnQgc2hhZGVyTWFza1NhbXBsZXJMb2NhdGlvbiwgaW50IHNoYWRlclF1YWRMb2NhdGlvbiwgaW50
IHNoYWRlckVkZ2VMb2NhdGlvbik7CisgICAgdm9pZCBkcmF3U3VyZmFjZShMYXllclJlbmRlcmVy
Q2hyb21pdW0qLCBDQ0xheWVySW1wbCosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3
VHJhbnNmb3JtLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZGV2aWNlVHJhbnNmb3JtLCBj
b25zdCBDQ0xheWVyUXVhZCYgZGV2aWNlUmVjdCwgY29uc3QgQ0NMYXllclF1YWQmLCBjb25zdCBU
KiBwcm9ncmFtLCBpbnQgc2hhZGVyTWFza1NhbXBsZXJMb2NhdGlvbiwgaW50IHNoYWRlclF1YWRM
b2NhdGlvbiwgaW50IHNoYWRlckVkZ2VMb2NhdGlvbiwgY29uc3QgU2tCaXRtYXAmIGZpbHRlckJp
dG1hcCk7CiAKICAgICBDQ0xheWVySW1wbCogbV9vd25pbmdMYXllcjsKICAgICBDQ0xheWVySW1w
bCogbV9tYXNrTGF5ZXI7CkBAIC0xMjIsNiArMTI4LDcgQEAgcHJpdmF0ZToKICAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCBtX2RyYXdUcmFuc2Zvcm07CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgg
bV9yZXBsaWNhRHJhd1RyYW5zZm9ybTsKICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX29yaWdp
blRyYW5zZm9ybTsKKyAgICBGaWx0ZXJPcGVyYXRpb25zIG1fZmlsdGVyczsKICAgICBJbnRSZWN0
IG1fY2xpcFJlY3Q7CiAgICAgVmVjdG9yPFJlZlB0cjxDQ0xheWVySW1wbD4gPiBtX2xheWVyTGlz
dDsKIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NSZW5kZXJTdXJmYWNlRmlsdGVycy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5jcHAJ
KHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwy
NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBVU0UoQUNDRUxFUkFURURf
Q09NUE9TSVRJTkcpCisKKyNpbmNsdWRlICJjYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmgiCisK
KyNpbmNsdWRlICJHZW9tZXRyeUJpbmRpbmcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQz
RC5oIgorI2luY2x1ZGUgIlNrQmx1ckltYWdlRmlsdGVyLmgiCisjaW5jbHVkZSAiU2tDYW52YXMu
aCIKKyNpbmNsdWRlICJTa0NvbG9yTWF0cml4RmlsdGVyLmgiCisjaW5jbHVkZSAiU2tHcHVEZXZp
Y2UuaCIKKyNpbmNsdWRlICJTa0dyVGV4dHVyZVBpeGVsUmVmLmgiCisKK25hbWVzcGFjZSB7CisK
K3ZvaWQgZ2V0U2F0dXJhdGVNYXRyaXgoZmxvYXQgYW1vdW50LCBTa1NjYWxhciBtYXRyaXhbMjBd
KQoreworICAgIG1hdHJpeFswXSA9IDAuMjEzZiArIDAuNzg3ZiAqIGFtb3VudDsKKyAgICBtYXRy
aXhbMV0gPSAwLjcxNWYgLSAwLjcxNWYgKiBhbW91bnQ7CisgICAgbWF0cml4WzJdID0gMC4wNzJm
IC0gMC4wNzJmICogYW1vdW50OworICAgIG1hdHJpeFszXSA9IG1hdHJpeFs0XSA9IDA7CisgICAg
bWF0cml4WzVdID0gMC4yMTNmIC0gMC4yMTNmICogYW1vdW50OworICAgIG1hdHJpeFs2XSA9IDAu
NzE1ZiArIDAuMjg1ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbN10gPSAwLjA3MmYgLSAwLjA3MmYg
KiBhbW91bnQ7CisgICAgbWF0cml4WzhdID0gbWF0cml4WzldID0gMDsKKyAgICBtYXRyaXhbMTBd
ID0gMC4yMTNmIC0gMC4yMTNmICogYW1vdW50OworICAgIG1hdHJpeFsxMV0gPSAwLjcxNWYgLSAw
LjcxNWYgKiBhbW91bnQ7CisgICAgbWF0cml4WzEyXSA9IDAuMDcyZiArIDAuOTI4ZiAqIGFtb3Vu
dDsKKyAgICBtYXRyaXhbMTNdID0gbWF0cml4WzE0XSA9IDA7CisgICAgbWF0cml4WzE1XSA9IG1h
dHJpeFsxNl0gPSBtYXRyaXhbMTddID0gbWF0cml4WzE5XSA9IDA7CisgICAgbWF0cml4WzE4XSA9
IDE7Cit9CisKK3ZvaWQgZ2V0SHVlUm90YXRlTWF0cml4KGZsb2F0IGh1ZSwgU2tTY2FsYXIgbWF0
cml4WzIwXSkKK3sKKyAgICBmbG9hdCBjb3NIdWUgPSBjb3NmKGh1ZSAqIHBpRmxvYXQgLyAxODAp
OyAKKyAgICBmbG9hdCBzaW5IdWUgPSBzaW5mKGh1ZSAqIHBpRmxvYXQgLyAxODApOyAKKyAgICBt
YXRyaXhbMF0gPSAwLjIxM2YgKyBjb3NIdWUgKiAwLjc4N2YgLSBzaW5IdWUgKiAwLjIxM2Y7Cisg
ICAgbWF0cml4WzFdID0gMC43MTVmIC0gY29zSHVlICogMC43MTVmIC0gc2luSHVlICogMC43MTVm
OworICAgIG1hdHJpeFsyXSA9IDAuMDcyZiAtIGNvc0h1ZSAqIDAuMDcyZiArIHNpbkh1ZSAqIDAu
OTI4ZjsKKyAgICBtYXRyaXhbM10gPSBtYXRyaXhbNF0gPSAwOworICAgIG1hdHJpeFs1XSA9IDAu
MjEzZiAtIGNvc0h1ZSAqIDAuMjEzZiArIHNpbkh1ZSAqIDAuMTQzZjsKKyAgICBtYXRyaXhbNl0g
PSAwLjcxNWYgKyBjb3NIdWUgKiAwLjI4NWYgKyBzaW5IdWUgKiAwLjE0MGY7CisgICAgbWF0cml4
WzddID0gMC4wNzJmIC0gY29zSHVlICogMC4wNzJmIC0gc2luSHVlICogMC4yODNmOworICAgIG1h
dHJpeFs4XSA9IG1hdHJpeFs5XSA9IDA7CisgICAgbWF0cml4WzEwXSA9IDAuMjEzZiAtIGNvc0h1
ZSAqIDAuMjEzZiAtIHNpbkh1ZSAqIDAuNzg3ZjsKKyAgICBtYXRyaXhbMTFdID0gMC43MTVmIC0g
Y29zSHVlICogMC43MTVmICsgc2luSHVlICogMC43MTVmOworICAgIG1hdHJpeFsxMl0gPSAwLjA3
MmYgKyBjb3NIdWUgKiAwLjkyOGYgKyBzaW5IdWUgKiAwLjA3MmY7CisgICAgbWF0cml4WzEzXSA9
IG1hdHJpeFsxNF0gPSAwOworICAgIG1hdHJpeFsxNV0gPSBtYXRyaXhbMTZdID0gbWF0cml4WzE3
XSA9IDA7CisgICAgbWF0cml4WzE4XSA9IDE7CisgICAgbWF0cml4WzE5XSA9IDA7Cit9CisKK3Zv
aWQgZ2V0SW52ZXJ0TWF0cml4KGZsb2F0IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sK
KyAgICBtZW1zZXQobWF0cml4LCAwLCAyMCAqIHNpemVvZihTa1NjYWxhcikpOworICAgIG1hdHJp
eFswXSA9IG1hdHJpeFs2XSA9IG1hdHJpeFsxMl0gPSAxIC0gMiAqIGFtb3VudDsKKyAgICBtYXRy
aXhbNF0gPSBtYXRyaXhbOV0gPSBtYXRyaXhbMTRdID0gYW1vdW50ICogMjU1OworICAgIG1hdHJp
eFsxOF0gPSAxOworfQorCit2b2lkIGdldE9wYWNpdHlNYXRyaXgoZmxvYXQgYW1vdW50LCBTa1Nj
YWxhciBtYXRyaXhbMjBdKQoreworICAgIG1lbXNldChtYXRyaXgsIDAsIDIwICogc2l6ZW9mKFNr
U2NhbGFyKSk7CisgICAgbWF0cml4WzBdID0gbWF0cml4WzZdID0gbWF0cml4WzEyXSA9IDE7Cisg
ICAgbWF0cml4WzE4XSA9IGFtb3VudDsKK30KKwordm9pZCBnZXRHcmF5c2NhbGVNYXRyaXgoZmxv
YXQgYW1vdW50LCBTa1NjYWxhciBtYXRyaXhbMjBdKQoreworICAgIG1hdHJpeFswXSA9IDAuMjEy
NmYgKyAwLjc4NzRmICogYW1vdW50OworICAgIG1hdHJpeFsxXSA9IDAuNzE1MmYgLSAwLjcxNTJm
ICogYW1vdW50OworICAgIG1hdHJpeFsyXSA9IDAuMDcyMmYgLSAwLjA3MjJmICogYW1vdW50Owor
ICAgIG1hdHJpeFszXSA9IG1hdHJpeFs0XSA9IDA7CisKKyAgICBtYXRyaXhbNV0gPSAwLjIxMjZm
IC0gMC4yMTI2ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbNl0gPSAwLjcxNTJmICsgMC4yODQ4ZiAq
IGFtb3VudDsKKyAgICBtYXRyaXhbN10gPSAwLjA3MjJmIC0gMC4wNzIyZiAqIGFtb3VudDsKKyAg
ICBtYXRyaXhbOF0gPSBtYXRyaXhbOV0gPSAwOworCisgICAgbWF0cml4WzEwXSA9IDAuMjEyNmYg
LSAwLjIxMjZmICogYW1vdW50OworICAgIG1hdHJpeFsxMV0gPSAwLjcxNTJmIC0gMC43MTUyZiAq
IGFtb3VudDsKKyAgICBtYXRyaXhbMTJdID0gMC4wNzIyZiArIDAuOTI3OGYgKiBhbW91bnQ7Cisg
ICAgbWF0cml4WzEzXSA9IG1hdHJpeFsxNF0gPSAwOworCisgICAgbWF0cml4WzE1XSA9IG1hdHJp
eFsxNl0gPSBtYXRyaXhbMTddID0gbWF0cml4WzE5XSA9IDA7CisgICAgbWF0cml4WzE4XSA9IDE7
Cit9CisKK3ZvaWQgZ2V0U2VwaWFNYXRyaXgoZmxvYXQgYW1vdW50LCBTa1NjYWxhciBtYXRyaXhb
MjBdKQoreworICAgIG1hdHJpeFswXSA9IDAuMzkzZiArIDAuNjA3ZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbMV0gPSAwLjc2OWYgLSAwLjc2OWYgKiBhbW91bnQ7CisgICAgbWF0cml4WzJdID0gMC4x
ODlmIC0gMC4xODlmICogYW1vdW50OworICAgIG1hdHJpeFszXSA9IG1hdHJpeFs0XSA9IDA7CisK
KyAgICBtYXRyaXhbNV0gPSAwLjM0OWYgLSAwLjM0OWYgKiBhbW91bnQ7CisgICAgbWF0cml4WzZd
ID0gMC42ODZmICsgMC4zMTRmICogYW1vdW50OworICAgIG1hdHJpeFs3XSA9IDAuMTY4ZiAtIDAu
MTY4ZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbOF0gPSBtYXRyaXhbOV0gPSAwOworCisgICAgbWF0
cml4WzEwXSA9IDAuMjcyZiAtIDAuMjcyZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMTFdID0gMC41
MzRmIC0gMC41MzRmICogYW1vdW50OworICAgIG1hdHJpeFsxMl0gPSAwLjEzMWYgKyAwLjg2OWYg
KiBhbW91bnQ7CisgICAgbWF0cml4WzEzXSA9IG1hdHJpeFsxNF0gPSAwOworCisgICAgbWF0cml4
WzE1XSA9IG1hdHJpeFsxNl0gPSBtYXRyaXhbMTddID0gbWF0cml4WzE5XSA9IDA7CisgICAgbWF0
cml4WzE4XSA9IDE7Cit9CisKK2Jvb2wgYXBwbHlDb2xvck1hdHJpeChTa0NhbnZhcyogY2FudmFz
LCBTa0JpdG1hcCBzb3VyY2UsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7CisgICAgU2tQYWludCBw
YWludDsKKyAgICBwYWludC5zZXRDb2xvckZpbHRlcihuZXcgU2tDb2xvck1hdHJpeEZpbHRlciht
YXRyaXgpKS0+dW5yZWYoKTsKKyAgICBjYW52YXMtPmRyYXdCaXRtYXAoc291cmNlLCAwLCAwLCAm
cGFpbnQpOworICAgIHJldHVybiB0cnVlOworfQorCit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworU2tCaXRtYXAgQ0NSZW5kZXJTdXJmYWNlRmlsdGVyczo6YXBwbHkoY29uc3QgRmlsdGVyT3Bl
cmF0aW9ucyYgZmlsdGVycywgdW5zaWduZWQgdGV4dHVyZUlkLCBjb25zdCBGbG9hdFNpemUmIHNp
emUsIEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0M0QpCit7CisgICAgU2tCaXRtYXAgc291cmNl
OworICAgIGlmICghY29udGV4dDNEKQorICAgICAgICByZXR1cm4gc291cmNlOworICAgIEdyQ29u
dGV4dCogZ3IgPSBjb250ZXh0M0QtPmdyQ29udGV4dCgpOworICAgIGlmICghZ3IpCisgICAgICAg
IHJldHVybiBzb3VyY2U7CisgICAgZ3ItPnJlc2V0Q29udGV4dCgpOworICAgIC8vIFdyYXAgdGhl
IFJlbmRlclN1cmZhY2UncyB0ZXh0dXJlIGluIGEgR2FuZXNoIHBsYXRmb3JtIHRleHR1cmUuCisg
ICAgR3JQbGF0Zm9ybVRleHR1cmVEZXNjIHBsYXRmb3JtVGV4RGVzYzsKKyAgICBwbGF0Zm9ybVRl
eERlc2MuZldpZHRoID0gc2l6ZS53aWR0aCgpOworICAgIHBsYXRmb3JtVGV4RGVzYy5mSGVpZ2h0
ID0gc2l6ZS5oZWlnaHQoKTsKKyAgICBwbGF0Zm9ybVRleERlc2MuZkNvbmZpZyA9IGtTa2lhODg4
OF9QTV9HclBpeGVsQ29uZmlnOworICAgIHBsYXRmb3JtVGV4RGVzYy5mVGV4dHVyZUhhbmRsZSA9
IHRleHR1cmVJZDsKKyAgICBTa0F1dG9UVW5yZWY8R3JUZXh0dXJlPiB0ZXh0dXJlKGdyLT5jcmVh
dGVQbGF0Zm9ybVRleHR1cmUocGxhdGZvcm1UZXhEZXNjKSk7CisgICAgLy8gUGxhY2UgdGhlIHBs
YXRmb3JtIHRleHR1cmUgaW5zaWRlIGFuIFNrQml0bWFwLgorICAgIHNvdXJjZS5zZXRDb25maWco
U2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmlnLCBzaXplLndpZHRoKCksIHNpemUuaGVpZ2h0KCkp
OworICAgIHNvdXJjZS5zZXRQaXhlbFJlZihuZXcgU2tHclRleHR1cmVQaXhlbFJlZih0ZXh0dXJl
LmdldCgpKSktPnVucmVmKCk7CisgICAgCisgICAgR3JDb250ZXh0OjpUZXh0dXJlQ2FjaGVFbnRy
eSBkZXN0OworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGZpbHRlcnMuc2l6ZSgpOyAr
K2kpIHsKKyAgICAgICAgLy8gU2F2ZSB0aGUgcHJldmlvdXMgdGV4dHVyZSBjYWNoZSBkZXN0aW5h
dGlvbiAoaWYgYW55KSwgYW5kIGtlZXAgaXQKKyAgICAgICAgLy8gbG9ja2VkIGR1cmluZyBkcmF3
IHRvIHByZXZlbnQgaXQgYmUgcmUtdXNlZCBhcyBkZXN0aW5hdGlvbi4KKyAgICAgICAgR3JDb250
ZXh0OjpUZXh0dXJlQ2FjaGVFbnRyeSBzb3VyY2VFbnRyeSA9IGRlc3Q7CisgICAgICAgIGNvbnN0
IEZpbHRlck9wZXJhdGlvbiogZmlsdGVyT3BlcmF0aW9uID0gZmlsdGVycy5hdChpKTsKKyAgICAg
ICAgLy8gQWxsb2NhdGUgYSBkZXN0aW5hdGlvbiB0ZXh0dXJlLgorICAgICAgICBHclRleHR1cmVE
ZXNjIGRlc2M7CisgICAgICAgIGRlc2MuZkZsYWdzID0ga1JlbmRlclRhcmdldF9HclRleHR1cmVG
bGFnQml0OworICAgICAgICBkZXNjLmZBQUxldmVsID0ga05vbmVfR3JBQUxldmVsOworICAgICAg
ICBkZXNjLmZXaWR0aCA9IHNpemUud2lkdGgoKTsKKyAgICAgICAgZGVzYy5mSGVpZ2h0ID0gc2l6
ZS5oZWlnaHQoKTsKKyAgICAgICAgZGVzYy5mQ29uZmlnID0ga1JHQkFfODg4OF9HclBpeGVsQ29u
ZmlnOworICAgICAgICAvLyBGSVhNRTogY291bGQgd2UgdXNlIGFwcHJveGltYXRlIG1hdGNoLCBh
bmQgZml4IHRleGNvb3JkcyBvbiBkcmF3CisgICAgICAgIGRlc3QgPSBnci0+bG9ja1NjcmF0Y2hU
ZXh0dXJlKGRlc2MsIEdyQ29udGV4dDo6a0V4YWN0X1NjcmF0Y2hUZXhNYXRjaCk7CisgICAgICAg
IGlmICghZGVzdC50ZXh0dXJlKCkpCisgICAgICAgICAgICByZXR1cm4gU2tCaXRtYXAoKTsKKyAg
ICAgICAgU2tHcHVEZXZpY2UgZGV2aWNlKGdyLCBkZXN0LnRleHR1cmUoKSk7CisgICAgICAgIFNr
Q2FudmFzIGNhbnZhcygmZGV2aWNlKTsKKyAgICAgICAgY2FudmFzLmNsZWFyKDB4MCk7CisgICAg
ICAgIHN3aXRjaCAoZmlsdGVyT3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCkpIHsKKyAgICAg
ICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OkdSQVlTQ0FMRTogeworICAgICAgICAgICAgY29uc3Qg
QmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3AgPSBzdGF0aWNfY2FzdDxjb25zdCBC
YXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uKTsKKyAgICAg
ICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAgICAgICBnZXRHcmF5c2NhbGVNYXRy
aXgoMSAtIG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIGFwcGx5Q29sb3JNYXRy
aXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OlNFUElBOiB7CisgICAgICAgICAgICBj
b25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBvcCA9IHN0YXRpY19jYXN0PGNv
bnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24pOwor
ICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAgICAgICAgIGdldFNlcGlhTWF0
cml4KDEgLSBvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAgICAgICBhcHBseUNvbG9yTWF0
cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpTQVRVUkFURTogeworICAgICAgICAg
ICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3AgPSBzdGF0aWNfY2Fz
dDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9u
KTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAgICAgICBnZXRTYXR1
cmF0ZU1hdHJpeCgxIC0gb3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAgICAgICAgYXBwbHlD
b2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6SFVFX1JPVEFURTogewor
ICAgICAgICAgICAgY29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbiogb3AgPSBz
dGF0aWNfY2FzdDxjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVy
T3BlcmF0aW9uKTsKKyAgICAgICAgICAgIFNrU2NhbGFyIG1hdHJpeFsyMF07CisgICAgICAgICAg
ICBnZXRIdWVSb3RhdGVNYXRyaXgob3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAgICAgICAg
YXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6SU5WRVJUOiB7
CisgICAgICAgICAgICBjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBvcCA9
IHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihmaWx0
ZXJPcGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAgICAg
ICAgIGdldEludmVydE1hdHJpeChvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAgICAgICBh
cHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpPUEFDSVRZOiB7
CisgICAgICAgICAgICBjb25zdCBCYXNpY0NvbXBvbmVudFRyYW5zZmVyRmlsdGVyT3BlcmF0aW9u
KiBvcCA9IHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVy
YXRpb24qPihmaWx0ZXJPcGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIw
XTsKKyAgICAgICAgICAgIGdldE9wYWNpdHlNYXRyaXgob3AtPmFtb3VudCgpLCBtYXRyaXgpOwor
ICAgICAgICAgICAgYXBwbHlDb2xvck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlv
bjo6QkxVUjogeworICAgICAgICAgICAgY29uc3QgQmx1ckZpbHRlck9wZXJhdGlvbiogb3AgPSBz
dGF0aWNfY2FzdDxjb25zdCBCbHVyRmlsdGVyT3BlcmF0aW9uKj4oZmlsdGVyT3BlcmF0aW9uKTsK
KyAgICAgICAgICAgIGZsb2F0IHN0ZFggPSBvcC0+c3RkRGV2aWF0aW9uKCkuY2FsY0Zsb2F0VmFs
dWUoMCk7CisgICAgICAgICAgICBmbG9hdCBzdGRZID0gb3AtPnN0ZERldmlhdGlvbigpLmNhbGNG
bG9hdFZhbHVlKDEpOworICAgICAgICAgICAgU2tBdXRvVFVucmVmPFNrSW1hZ2VGaWx0ZXI+IGZp
bHRlcihuZXcgU2tCbHVySW1hZ2VGaWx0ZXIoc3RkWCwgc3RkWSkpOworICAgICAgICAgICAgU2tQ
YWludCBwYWludDsKKyAgICAgICAgICAgIHBhaW50LnNldEltYWdlRmlsdGVyKGZpbHRlci5nZXQo
KSk7CisgICAgICAgICAgICBwYWludC5zZXRDb2xvcigweEZGRkZGRkZGKTsKKyAgICAgICAgICAg
IGNhbnZhcy5zYXZlTGF5ZXIoMCwgJnBhaW50KTsKKyAgICAgICAgICAgIGNhbnZhcy5kcmF3Qml0
bWFwKHNvdXJjZSwgMCwgMCk7CisgICAgICAgICAgICBjYW52YXMucmVzdG9yZSgpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OlBB
U1NUSFJPVUdIOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FudmFzLmRyYXdCaXRt
YXAoc291cmNlLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGdyLT5mbHVzaCgpOworICAgICAgICAvLyBEZXN0IHRleHR1cmUgZnJvbSB0aGlzIGZpbHRlciBi
ZWNvbWVzIHNvdXJjZSBiaXRtYXAgZm9yIG5leHQgZmlsdGVyLgorICAgICAgICBzb3VyY2Uuc2V0
UGl4ZWxSZWYobmV3IFNrR3JUZXh0dXJlUGl4ZWxSZWYoZGVzdC50ZXh0dXJlKCkpKS0+dW5yZWYo
KTsKKyAgICAgICAgLy8gVW5sb2NrIHRoZSBwcmV2aW91cyB0ZXh0dXJlIGNhY2hlIGVudHJ5Lgor
ICAgICAgICBpZiAoc291cmNlRW50cnkudGV4dHVyZSgpKQorICAgICAgICAgICAgZ3ItPnVubG9j
a1RleHR1cmUoc291cmNlRW50cnkpOworICAgIH0KKyAgICBpZiAoZGVzdC50ZXh0dXJlKCkpCisg
ICAgICAgIGdyLT51bmxvY2tUZXh0dXJlKGRlc3QpOworICAgIHJldHVybiBzb3VyY2U7Cit9CisK
K30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0
ZXJzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmls
dGVycy5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIEND
UmVuZGVyU3VyZmFjZUZpbHRlcnNfaAorI2RlZmluZSBDQ1JlbmRlclN1cmZhY2VGaWx0ZXJzX2gK
KworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworY2xhc3MgU2tCaXRtYXA7CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEZpbHRlck9wZXJhdGlvbnM7CitjbGFzcyBGbG9h
dFNpemU7CitjbGFzcyBHcmFwaGljc0NvbnRleHQzRDsKK2NsYXNzIENDUmVuZGVyU3VyZmFjZUZp
bHRlcnMgeworcHVibGljOgorICAgIHN0YXRpYyBTa0JpdG1hcCBhcHBseShjb25zdCBGaWx0ZXJP
cGVyYXRpb25zJiBmaWx0ZXJzLCB1bnNpZ25lZCB0ZXh0dXJlSWQsIGNvbnN0IEZsb2F0U2l6ZSYs
IEdyYXBoaWNzQ29udGV4dDNEKik7Cit9OworCit9CisjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorCisjZW5kaWYK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126120</attachid>
            <date>2012-02-08 11:06:36 -0800</date>
            <delta_ts>2012-02-08 12:29:53 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-77266-20120208140635.patch</filename>
            <type>text/plain</type>
            <size>33947</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEwNzEwNikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDYzIEBACisyMDEyLTAyLTA4ICBTdGVwaGVu
IFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
RW5hYmxlIENTUyBmaWx0ZXJzIG9uIGNvbXBvc2l0ZWQgbGF5ZXJzLgorICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzcyNjYKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXaWxsIGJlIGNvdmVyZWQgYnkgZXhpc3Rp
bmcgdGVzdHMgaW4gY3NzMy9maWx0ZXJzICh3aGVuIGVuYWJsZWQpLgorCisgICAgICAgICogV2Vi
Q29yZS5neXBpOgorICAgICAgICBBZGQgQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy4qIHRvIHRoZSBD
aHJvbWl1bSBidWlsZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFw
aGljc0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNo
cm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgT3ZlcnJpZGUgc2V0RmlsdGVycygp
IHZpcnR1YWwgZnJvbSBHcmFwaGljc0xheWVyLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJv
bWl1bTo6c2V0RmlsdGVycyk6CisgICAgICAgIEltcGxlbWVudCBzZXRGaWx0ZXJzKCkgdG8gY2Fj
aGUgdGhlIGZpbHRlcnMgaGVyZS4uLgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6
cHVzaFByb3BlcnRpZXNUbyk6CisgICAgICAgIC4uLiBhbmQgcHVzaCB0aGVtIHRvIHRoZSBDQ0xh
eWVySW1wbCBhdCBjb21taXQgdGltZS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpm
aWx0ZXJzKToKKyAgICAgICAgSW1wbGVtZW50IGFjY2Vzc29yLgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oOgorICAgICAgICAoV2Vi
Q29yZTo6UmVuZGVyU3VyZmFjZUNocm9taXVtOjpzZXRGaWx0ZXJzKToKKyAgICAgICAgSW1wbGVt
ZW50IHN0dWIgdmVyc2lvbiBvZiBzZXRGaWx0ZXJzKCksIHRvIHNhdGlzZnkgdGhlIHRlbXBsYXRl
cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVySW1wbDo6c2V0RmlsdGVycyk6CisgICAgICAg
IEltcGxlbWVudCBzZXR0ZXIgdG8gcmVjZWl2ZSBmaWx0ZXJzIGF0IGNvbW1pdCB0aW1lLgorICAg
ICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmg6CisgICAg
ICAgIChXZWJDb3JlOjpDQ0xheWVySW1wbDo6ZmlsdGVycyk6CisgICAgICAgIEltcGxlbWVudCBt
ZW1iZXIgdmFyIGFuZCBhY2Nlc3NvciBmb3IgZmlsdGVycy4KKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6Y2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwpOgor
ICAgICAgICBBZGQgYW5vdGhlciBjbGF1c2UgaGVyZSB0byBmb3JjZSBjcmVhdGlvbiBvZiBhIFJl
bmRlclN1cmZhY2Ugd2hlbgorICAgICAgICBmaWx0ZXJzIGFyZSBwcmVzZW50LCBhbmQgdG8gZm9y
d2FyZCB0aGVtIGZyb20gdGhlIGxheWVyIHRvIHRoZQorICAgICAgICBSZW5kZXJTdXJmYWNlLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6OmRyYXcpOgorICAgICAgICAo
V2ViQ29yZTo6Q0NSZW5kZXJTdXJmYWNlOjpkcmF3TGF5ZXIpOgorICAgICAgICBDaGVjayBmb3Ig
ZmlsdGVycyBhdCBkcmF3IHRpbWUsIGFwcGx5IHRoZW0sIGFuZCBmb3J3YXJkIHRoZSByZXN1bHQK
KyAgICAgICAgdGhyb3VnaCB0aGUgZHJhd2luZyB0cmF2ZXJzYWwuCisgICAgICAgIChXZWJDb3Jl
OjpDQ1JlbmRlclN1cmZhY2U6OmRyYXdTdXJmYWNlKToKKyAgICAgICAgSWYgZmlsdGVyIGJpdG1h
cCBpcyBwcmVzZW50LCBiaW5kIGl0IGluc3RlYWQgb2YgdGhlIG5vcm1hbAorICAgICAgICBSZW5k
ZXJTdXJmYWNlIHRleHR1cmUuCisgICAgICAgIChXZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2U6OmFw
cGx5RmlsdGVycyk6CisgICAgICAgIEFwcGx5IGZpbHRlcnMgdG8gdGhlIHJlbmRlciBzdXJmYWNl
IHRleHR1cmUsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgICAgVGhpcyBmdW5jdGlvbiBp
cyBhIG5vLW9wIGZvciB0aGUgdGhyZWFkZWQgY29tcG9zaXRvciwgZHVlIHRvIHVzZQorICAgICAg
ICBvZiB0aGUgU2hhcmVkR3JhcGhpY3NDb250ZXh0M0QuCisgICAgICAgICogcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmg6CisgICAgICAgIChXZWJDb3JlOjpD
Q1JlbmRlclN1cmZhY2U6OnNldEZpbHRlcnMpOgorICAgICAgICAoV2ViQ29yZTo6Q0NSZW5kZXJT
dXJmYWNlOjpmaWx0ZXJzKToKKyAgICAgICAgKENDUmVuZGVyU3VyZmFjZSk6CisgICAgICAgIEZp
bHRlcnMgZ2V0dGVycyBhbmQgc2V0dGVycy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmNwcDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpDQ1JlbmRlclN1cmZhY2VGaWx0ZXJzOjphcHBseSk6CisgICAgICAgIEV4dGVybmFs
IGludGVyZmFjZSBmb3IgdGhpcyAoc3RhdGljKSBjbGFzcy4gIEFsbCBpbnRlcm5hbAorICAgICAg
ICBpbXBsZW1lbnRhdGlvbiBhbmQgaGVscGVyIGZ1bmN0aW9ucyBhcmUgaW4gdGhlIHVubmFtZWQg
bmFtZXNwYWNlLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVu
ZGVyU3VyZmFjZUZpbHRlcnMuaDogQWRkZWQuCisKIDIwMTItMDItMDggIElseWEgVGlraG9ub3Zz
a3kgIDxsb2lzbG9AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IGhlYXAg
c25hcHNob3Q6IGltcGxlbWVudCBEaXN0YW5jZSBjb2x1bW4gaW4gT2JqZWN0J3MgcmV0YWluaW5n
IHRyZWUuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiAxMDcxMDYpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTMyNzQsNiArMzI3NCw4IEBA
CiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJm
YWNlLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVu
ZGVyU3VyZmFjZURyYXdRdWFkLmNwcCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRHJhd1F1YWQuaCcsCisgICAgICAgICAgICAncGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5jcHAnLAor
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFj
ZUZpbHRlcnMuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2Mv
Q0NTY2hlZHVsZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ1NjaGVkdWxlci5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5jcHAnLApJbmRleDogU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9H
cmFwaGljc0xheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAxMDcxMDYpCisrKyBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yNTQsNiArMjU0LDEyIEBAIHZvaWQgR3JhcGhpY3NMYXllckNo
cm9taXVtOjpzZXRDb250ZW50c08KICAgICBtX2xheWVyLT5zZXRPcGFxdWUobV9jb250ZW50c09w
YXF1ZSk7CiB9CiAKK2Jvb2wgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRGaWx0ZXJzKGNvbnN0
IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMpCit7CisgICAgbV9sYXllci0+c2V0RmlsdGVycyhm
aWx0ZXJzKTsKKyAgICByZXR1cm4gR3JhcGhpY3NMYXllcjo6c2V0RmlsdGVycyhmaWx0ZXJzKTsK
K30KKwogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldE1hc2tMYXllcihHcmFwaGljc0xh
eWVyKiBtYXNrTGF5ZXIpCiB7CiAgICAgaWYgKG1hc2tMYXllciA9PSBtX21hc2tMYXllcikKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5
ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAxMDcxMDYpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtODIsNiArODIsOSBAQCBwdWJsaWM6CiAKICAg
ICB2aXJ0dWFsIHZvaWQgc2V0T3BhY2l0eShmbG9hdCk7CiAKKyAgICAvLyBSZXR1cm5zIHRydWUg
aWYgZmlsdGVyIGNhbiBiZSByZW5kZXJlZCBieSB0aGUgY29tcG9zaXRvcgorICAgIHZpcnR1YWwg
Ym9vbCBzZXRGaWx0ZXJzKGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmKTsKKwogICAgIHZpcnR1YWwg
dm9pZCBzZXROZWVkc0Rpc3BsYXkoKTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0TmVlZHNEaXNwbGF5
SW5SZWN0KGNvbnN0IEZsb2F0UmVjdCYpOwogICAgIHZpcnR1YWwgdm9pZCBzZXRDb250ZW50c05l
ZWRzRGlzcGxheSgpOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDEwNzEw
NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hy
b21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDUsNiArMzA1LDEyIEBAIHZvaWQgTGF5ZXJD
aHJvbWl1bTo6c2V0UmVwbGljYUxheWVyKExheWUKICAgICBzZXROZWVkc0NvbW1pdCgpOwogfQog
Cit2b2lkIExheWVyQ2hyb21pdW06OnNldEZpbHRlcnMoY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYg
ZmlsdGVycykKK3sKKyAgICBtX2ZpbHRlcnMgPSBmaWx0ZXJzOworICAgIHNldE5lZWRzQ29tbWl0
KCk7Cit9CisKIHZvaWQgTGF5ZXJDaHJvbWl1bTo6c2V0T3BhY2l0eShmbG9hdCBvcGFjaXR5KQog
ewogICAgIGlmIChtX29wYWNpdHkgPT0gb3BhY2l0eSkKQEAgLTQxMSw2ICs0MTcsNyBAQCB2b2lk
IExheWVyQ2hyb21pdW06OnB1c2hQcm9wZXJ0aWVzVG8oQ0NMCiAgICAgbGF5ZXItPnNldERlYnVn
Qm9yZGVyV2lkdGgobV9kZWJ1Z0JvcmRlcldpZHRoKTsKICAgICBsYXllci0+c2V0RG91YmxlU2lk
ZWQobV9kb3VibGVTaWRlZCk7CiAgICAgbGF5ZXItPnNldERyYXdzQ29udGVudChkcmF3c0NvbnRl
bnQoKSk7CisgICAgbGF5ZXItPnNldEZpbHRlcnMoZmlsdGVycygpKTsKICAgICBsYXllci0+c2V0
SXNOb25Db21wb3NpdGVkQ29udGVudChtX2lzTm9uQ29tcG9zaXRlZENvbnRlbnQpOwogICAgIGxh
eWVyLT5zZXRNYXNrc1RvQm91bmRzKG1fbWFza3NUb0JvdW5kcyk7CiAgICAgbGF5ZXItPnNldFNj
cm9sbGFibGUobV9zY3JvbGxhYmxlKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgJKHJldmlzaW9u
IDEwNzEwNikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyQ2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogCiAjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQogCisjaW5jbHVkZSAiRmlsdGVyT3BlcmF0aW9ucy5o
IgogI2luY2x1ZGUgIkZsb2F0UG9pbnQuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
ICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgpAQCAtMTA4LDYgKzEwOSw5IEBAIHB1YmxpYzoK
ICAgICB2b2lkIHNldE9wYWNpdHkoZmxvYXQpOwogICAgIGZsb2F0IG9wYWNpdHkoKSBjb25zdCB7
IHJldHVybiBtX29wYWNpdHk7IH0KIAorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBGaWx0ZXJP
cGVyYXRpb25zJik7CisgICAgY29uc3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycygpIGNvbnN0
IHsgcmV0dXJuIG1fZmlsdGVyczsgfQorCiAgICAgdmlydHVhbCB2b2lkIHNldE9wYXF1ZShib29s
KTsKICAgICBib29sIG9wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fb3BhcXVlOyB9CiAKQEAgLTI2
Nyw2ICsyNzEsNyBAQCBwcml2YXRlOgogICAgIENvbG9yIG1fZGVidWdCb3JkZXJDb2xvcjsKICAg
ICBmbG9hdCBtX2RlYnVnQm9yZGVyV2lkdGg7CiAgICAgZmxvYXQgbV9vcGFjaXR5OworICAgIEZp
bHRlck9wZXJhdGlvbnMgbV9maWx0ZXJzOwogICAgIGZsb2F0IG1fYW5jaG9yUG9pbnRaOwogICAg
IGJvb2wgbV9pc0RyYXdhYmxlOwogICAgIGJvb2wgbV9tYXNrc1RvQm91bmRzOwpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmVuZGVyU3VyZmFjZUNocm9t
aXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vUmVuZGVyU3VyZmFjZUNocm9taXVtLmgJKHJldmlzaW9uIDEwNzEwNikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1
bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAKIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAorY2xhc3MgRmlsdGVyT3BlcmF0aW9uczsKIGNsYXNzIExheWVyQ2hyb21pdW07CiBjbGFz
cyBMYXllclJlbmRlcmVyQ2hyb21pdW07CiBjbGFzcyBNYW5hZ2VkVGV4dHVyZTsKQEAgLTc2LDYg
Kzc3LDExIEBAIHB1YmxpYzoKICAgICBjb25zdCBJbnRSZWN0JiBjbGlwUmVjdCgpIGNvbnN0IHsg
cmV0dXJuIG1fY2xpcFJlY3Q7IH0KICAgICB2b2lkIHNldENsaXBSZWN0KGNvbnN0IEludFJlY3Qm
IGNsaXBSZWN0KSB7IG1fY2xpcFJlY3QgPSBjbGlwUmVjdDsgfQogCisgICAgLy8gV2UgZG9uJ3Qg
Y2FyZSBhYm91dCBmaWx0ZXJzIGhlcmUsIGJ1dCB3ZSBuZWVkIHRvIHNhdGlzZnkgCisgICAgLy8g
Y2FsY3VsYXRlRHJhd1RyYW5zZm9ybXNBbmRWaXNpYmlsaXR5SW50ZXJuYWwgd2hlbiB0ZW1wbGF0
ZWQgb24gdGhpcworICAgIC8vIGNsYXNzLgorICAgIHZvaWQgc2V0RmlsdGVycyhjb25zdCBGaWx0
ZXJPcGVyYXRpb25zJikgeyB9CisKICAgICBib29sIHNraXBzRHJhdygpIGNvbnN0IHsgcmV0dXJu
IG1fc2tpcHNEcmF3OyB9CiAgICAgdm9pZCBzZXRTa2lwc0RyYXcoYm9vbCBza2lwc0RyYXcpIHsg
bV9za2lwc0RyYXcgPSBza2lwc0RyYXc7IH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllckltcGwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmNw
cAkocmV2aXNpb24gMTA3MTA2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllckltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zODMsNiArMzgz
LDEyIEBAIHZvaWQgQ0NMYXllckltcGw6OnNldEJhY2tncm91bmRDb3ZlcnNWaWUKICAgICBtX2xh
eWVyUHJvcGVydHlDaGFuZ2VkID0gdHJ1ZTsKIH0KIAordm9pZCBDQ0xheWVySW1wbDo6c2V0Rmls
dGVycyhjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0ZXJzKQoreworICAgIG1fZmlsdGVycyA9
IGZpbHRlcnM7CisgICAgbm90ZUxheWVyUHJvcGVydHlDaGFuZ2VkRm9yU3VidHJlZSgpOworfQor
CiB2b2lkIENDTGF5ZXJJbXBsOjpzZXRNYXNrc1RvQm91bmRzKGJvb2wgbWFza3NUb0JvdW5kcykK
IHsKICAgICBpZiAobV9tYXNrc1RvQm91bmRzID09IG1hc2tzVG9Cb3VuZHMpCkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVySW1wbC5oCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDTGF5ZXJJbXBsLmgJKHJldmlzaW9uIDEwNzEwNikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAg
LTI3LDYgKzI3LDcgQEAKICNkZWZpbmUgQ0NMYXllckltcGxfaAogCiAjaW5jbHVkZSAiQ29sb3Iu
aCIKKyNpbmNsdWRlICJGaWx0ZXJPcGVyYXRpb25zLmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0Lmgi
CiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlRleHRTdHJlYW0uaCIKQEAgLTEwMSw2
ICsxMDIsOSBAQCBwdWJsaWM6CiAgICAgdm9pZCBzZXRCYWNrZ3JvdW5kQ292ZXJzVmlld3BvcnQo
Ym9vbCk7CiAgICAgYm9vbCBiYWNrZ3JvdW5kQ292ZXJzVmlld3BvcnQoKSBjb25zdCB7IHJldHVy
biBtX2JhY2tncm91bmRDb3ZlcnNWaWV3cG9ydDsgfQogCisgICAgdm9pZCBzZXRGaWx0ZXJzKGNv
bnN0IEZpbHRlck9wZXJhdGlvbnMmKTsKKyAgICBjb25zdCBGaWx0ZXJPcGVyYXRpb25zJiBmaWx0
ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9maWx0ZXJzOyB9CisKICAgICB2b2lkIHNldE1hc2tzVG9C
b3VuZHMoYm9vbCk7CiAgICAgYm9vbCBtYXNrc1RvQm91bmRzKCkgY29uc3QgeyByZXR1cm4gbV9t
YXNrc1RvQm91bmRzOyB9CiAKQEAgLTI4OCw2ICsyOTIsOCBAQCBwcml2YXRlOgogICAgIENvbG9y
IG1fZGVidWdCb3JkZXJDb2xvcjsKICAgICBmbG9hdCBtX2RlYnVnQm9yZGVyV2lkdGg7CiAKKyAg
ICBGaWx0ZXJPcGVyYXRpb25zIG1fZmlsdGVyczsKKwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IG1fZHJhd1RyYW5zZm9ybTsKICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBtX3NjcmVlblNwYWNl
VHJhbnNmb3JtOwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9jYy9DQ0xheWVyVHJlZUhvc3RDb21tb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1v
bi5jcHAJKHJldmlzaW9uIDEwNzEwNikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTI0NCw3ICsyNDQsOCBAQCBzdGF0aWMgYm9vbCBjYWxjdWxhdGVEcmF3VHJhbnNmb3Jtc0Fu
ZFZpCiAgICAgYm9vbCB1c2VTdXJmYWNlRm9yTWFza2luZyA9IGxheWVyLT5tYXNrTGF5ZXIoKTsK
ICAgICBib29sIHVzZVN1cmZhY2VGb3JSZWZsZWN0aW9uID0gbGF5ZXItPnJlcGxpY2FMYXllcigp
OwogICAgIGJvb2wgdXNlU3VyZmFjZUZvckZsYXREZXNjZW5kYW50cyA9IGxheWVyLT5wYXJlbnQo
KSAmJiBsYXllci0+cGFyZW50KCktPnByZXNlcnZlczNEKCkgJiYgIWxheWVyLT5wcmVzZXJ2ZXMz
RCgpICYmIGxheWVyLT5kZXNjZW5kYW50RHJhd3NDb250ZW50KCk7Ci0gICAgaWYgKHVzZVN1cmZh
Y2VGb3JNYXNraW5nIHx8IHVzZVN1cmZhY2VGb3JSZWZsZWN0aW9uIHx8IHVzZVN1cmZhY2VGb3JG
bGF0RGVzY2VuZGFudHMgfHwgKCh1c2VTdXJmYWNlRm9yQ2xpcHBpbmcgfHwgdXNlU3VyZmFjZUZv
ck9wYWNpdHkpICYmIGxheWVyLT5kZXNjZW5kYW50RHJhd3NDb250ZW50KCkpKSB7CisgICAgYm9v
bCB1c2VTdXJmYWNlRm9yRmlsdGVycyA9IGxheWVyLT5maWx0ZXJzKCkuc2l6ZSgpID4gMDsKKyAg
ICBpZiAodXNlU3VyZmFjZUZvck1hc2tpbmcgfHwgdXNlU3VyZmFjZUZvclJlZmxlY3Rpb24gfHwg
dXNlU3VyZmFjZUZvckZsYXREZXNjZW5kYW50cyB8fCB1c2VTdXJmYWNlRm9yRmlsdGVycyB8fCAo
KHVzZVN1cmZhY2VGb3JDbGlwcGluZyB8fCB1c2VTdXJmYWNlRm9yT3BhY2l0eSkgJiYgbGF5ZXIt
PmRlc2NlbmRhbnREcmF3c0NvbnRlbnQoKSkpIHsKICAgICAgICAgaWYgKCFsYXllci0+cmVuZGVy
U3VyZmFjZSgpKQogICAgICAgICAgICAgbGF5ZXItPmNyZWF0ZVJlbmRlclN1cmZhY2UoKTsKIApA
QCAtMjgyLDYgKzI4Myw4IEBAIHN0YXRpYyBib29sIGNhbGN1bGF0ZURyYXdUcmFuc2Zvcm1zQW5k
VmkKICAgICAgICAgaWYgKGxheWVyLT5yZXBsaWNhTGF5ZXIoKSAmJiBsYXllci0+cmVwbGljYUxh
eWVyKCktPm1hc2tMYXllcigpKQogICAgICAgICAgICAgbGF5ZXItPnJlcGxpY2FMYXllcigpLT5t
YXNrTGF5ZXIoKS0+c2V0VGFyZ2V0UmVuZGVyU3VyZmFjZShyZW5kZXJTdXJmYWNlKTsKIAorICAg
ICAgICByZW5kZXJTdXJmYWNlLT5zZXRGaWx0ZXJzKGxheWVyLT5maWx0ZXJzKCkpOworCiAgICAg
ICAgIHJlbmRlclN1cmZhY2VMYXllckxpc3QuYXBwZW5kKGxheWVyKTsKICAgICB9IGVsc2Ugewog
ICAgICAgICBsYXllci0+c2V0RHJhd1RyYW5zZm9ybShjb21iaW5lZFRyYW5zZm9ybSk7CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1
cmZhY2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZS5jcHAJKHJldmlzaW9uIDEwNzEwNikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFj
ZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDEzICsyOSwxOCBAQAogCiAjaW5jbHVkZSAiY2Mv
Q0NSZW5kZXJTdXJmYWNlLmgiCiAKKyNpbmNsdWRlICJHZW9tZXRyeUJpbmRpbmcuaCIKKyNpbmNs
dWRlICJHclRleHR1cmUuaCIKICNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRC5oIgogI2luY2x1
ZGUgIkxheWVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJMYXllclJlbmRlcmVyQ2hyb21pdW0uaCIK
ICNpbmNsdWRlICJNYW5hZ2VkVGV4dHVyZS5oIgorI2luY2x1ZGUgIlNoYXJlZEdyYXBoaWNzQ29u
dGV4dDNELmgiCiAjaW5jbHVkZSAiVGV4dFN0cmVhbS5oIgogI2luY2x1ZGUgImNjL0NDRGFtYWdl
VHJhY2tlci5oIgogI2luY2x1ZGUgImNjL0NDTGF5ZXJJbXBsLmgiCisjaW5jbHVkZSAiY2MvQ0NQ
cm94eS5oIgorI2luY2x1ZGUgImNjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuaCIKICNpbmNsdWRl
IDx3dGYvdGV4dC9DU3RyaW5nLmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTEwNSw2ICsx
MTAsOCBAQCB2b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhdyhMYXllclJlbmRlcmVyCiB7CiAgICAg
aWYgKG1fc2tpcHNEcmF3IHx8ICFtX2NvbnRlbnRzVGV4dHVyZSkKICAgICAgICAgcmV0dXJuOwor
CisgICAgU2tCaXRtYXAgZmlsdGVyQml0bWFwID0gYXBwbHlGaWx0ZXJzKGxheWVyUmVuZGVyZXIp
OwogICAgIC8vIEZJWE1FOiBCeSB1c2luZyB0aGUgc2FtZSBSZW5kZXJTdXJmYWNlIGZvciBib3Ro
IHRoZSBjb250ZW50IGFuZCBpdHMgcmVmbGVjdGlvbiwKICAgICAvLyBpdCdzIGN1cnJlbnRseSBu
b3QgcG9zc2libGUgdG8gYXBwbHkgYSBzZXBhcmF0ZSBtYXNrIHRvIHRoZSByZWZsZWN0aW9uIGxh
eWVyCiAgICAgLy8gb3IgY29ycmVjdGx5IGhhbmRsZSBvcGFjaXR5IGluIHJlZmxlY3Rpb25zIChv
cGFjaXR5IG11c3QgYmUgYXBwbGllZCBhZnRlciBkcmF3aW5nCkBAIC0xMjgsMTIgKzEzNSwxMiBA
QCB2b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhdyhMYXllclJlbmRlcmVyCiAKICAgICAvLyBSZWZs
ZWN0aW9uIGRyYXdzIGJlZm9yZSB0aGUgbGF5ZXIuCiAgICAgaWYgKG1fb3duaW5nTGF5ZXItPnJl
cGxpY2FMYXllcigpKQotICAgICAgICBkcmF3TGF5ZXIobGF5ZXJSZW5kZXJlciwgcmVwbGljYU1h
c2tMYXllciwgbV9yZXBsaWNhRHJhd1RyYW5zZm9ybSk7CisgICAgICAgIGRyYXdMYXllcihsYXll
clJlbmRlcmVyLCByZXBsaWNhTWFza0xheWVyLCBtX3JlcGxpY2FEcmF3VHJhbnNmb3JtLCBmaWx0
ZXJCaXRtYXApOwogCi0gICAgZHJhd0xheWVyKGxheWVyUmVuZGVyZXIsIG1fbWFza0xheWVyLCBt
X2RyYXdUcmFuc2Zvcm0pOworICAgIGRyYXdMYXllcihsYXllclJlbmRlcmVyLCBtX21hc2tMYXll
ciwgbV9kcmF3VHJhbnNmb3JtLCBmaWx0ZXJCaXRtYXApOwogfQogCi12b2lkIENDUmVuZGVyU3Vy
ZmFjZTo6ZHJhd0xheWVyKExheWVyUmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5kZXJlciwgQ0NM
YXllckltcGwqIG1hc2tMYXllciwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRyYXdUcmFu
c2Zvcm0pCit2b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhd0xheWVyKExheWVyUmVuZGVyZXJDaHJv
bWl1bSogbGF5ZXJSZW5kZXJlciwgQ0NMYXllckltcGwqIG1hc2tMYXllciwgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIGRyYXdUcmFuc2Zvcm0sIGNvbnN0IFNrQml0bWFwJiBmaWx0ZXJCaXRt
YXApCiB7CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggcmVuZGVyTWF0cml4ID0gZHJhd1RyYW5z
Zm9ybTsKICAgICAvLyBBcHBseSBhIHNjYWxpbmcgZmFjdG9yIHRvIHNpemUgdGhlIHF1YWQgZnJv
bSAxeDEgdG8gaXRzIGludGVuZGVkIHNpemUuCkBAIC0xNjUsMjQgKzE3MiwyNCBAQCB2b2lkIEND
UmVuZGVyU3VyZmFjZTo6ZHJhd0xheWVyKExheWVyUmVuCiAgICAgaWYgKHVzZU1hc2spIHsKICAg
ICAgICAgaWYgKHVzZUFBKSB7CiAgICAgICAgICAgICBjb25zdCBNYXNrUHJvZ3JhbUFBKiBwcm9n
cmFtID0gbGF5ZXJSZW5kZXJlci0+cmVuZGVyU3VyZmFjZU1hc2tQcm9ncmFtQUEoKTsKLSAgICAg
ICAgICAgIGRyYXdTdXJmYWNlKGxheWVyUmVuZGVyZXIsIG1hc2tMYXllciwgZHJhd1RyYW5zZm9y
bSwgZGV2aWNlTWF0cml4LCBkZXZpY2VSZWN0LCBsYXllclF1YWQsIHByb2dyYW0sIHByb2dyYW0t
PmZyYWdtZW50U2hhZGVyKCkubWFza1NhbXBsZXJMb2NhdGlvbigpLCBwcm9ncmFtLT52ZXJ0ZXhT
aGFkZXIoKS5wb2ludExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkuZWRnZUxv
Y2F0aW9uKCkpOworICAgICAgICAgICAgZHJhd1N1cmZhY2UobGF5ZXJSZW5kZXJlciwgbWFza0xh
eWVyLCBkcmF3VHJhbnNmb3JtLCBkZXZpY2VNYXRyaXgsIGRldmljZVJlY3QsIGxheWVyUXVhZCwg
cHJvZ3JhbSwgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5tYXNrU2FtcGxlckxvY2F0aW9uKCks
IHByb2dyYW0tPnZlcnRleFNoYWRlcigpLnBvaW50TG9jYXRpb24oKSwgcHJvZ3JhbS0+ZnJhZ21l
bnRTaGFkZXIoKS5lZGdlTG9jYXRpb24oKSwgZmlsdGVyQml0bWFwKTsKICAgICAgICAgfSBlbHNl
IHsKICAgICAgICAgICAgIGNvbnN0IE1hc2tQcm9ncmFtKiBwcm9ncmFtID0gbGF5ZXJSZW5kZXJl
ci0+cmVuZGVyU3VyZmFjZU1hc2tQcm9ncmFtKCk7Ci0gICAgICAgICAgICBkcmF3U3VyZmFjZShs
YXllclJlbmRlcmVyLCBtYXNrTGF5ZXIsIGRyYXdUcmFuc2Zvcm0sIGRldmljZU1hdHJpeCwgZGV2
aWNlUmVjdCwgbGF5ZXJRdWFkLCBwcm9ncmFtLCBwcm9ncmFtLT5mcmFnbWVudFNoYWRlcigpLm1h
c2tTYW1wbGVyTG9jYXRpb24oKSwgLTEsIC0xKTsKKyAgICAgICAgICAgIGRyYXdTdXJmYWNlKGxh
eWVyUmVuZGVyZXIsIG1hc2tMYXllciwgZHJhd1RyYW5zZm9ybSwgZGV2aWNlTWF0cml4LCBkZXZp
Y2VSZWN0LCBsYXllclF1YWQsIHByb2dyYW0sIHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkubWFz
a1NhbXBsZXJMb2NhdGlvbigpLCAtMSwgLTEsIGZpbHRlckJpdG1hcCk7CiAgICAgICAgIH0KICAg
ICB9IGVsc2UgewogICAgICAgICBpZiAodXNlQUEpIHsKICAgICAgICAgICAgIGNvbnN0IFByb2dy
YW1BQSogcHJvZ3JhbSA9IGxheWVyUmVuZGVyZXItPnJlbmRlclN1cmZhY2VQcm9ncmFtQUEoKTsK
LSAgICAgICAgICAgIGRyYXdTdXJmYWNlKGxheWVyUmVuZGVyZXIsIG1hc2tMYXllciwgZHJhd1Ry
YW5zZm9ybSwgZGV2aWNlTWF0cml4LCBkZXZpY2VSZWN0LCBsYXllclF1YWQsIHByb2dyYW0sIC0x
LCBwcm9ncmFtLT52ZXJ0ZXhTaGFkZXIoKS5wb2ludExvY2F0aW9uKCksIHByb2dyYW0tPmZyYWdt
ZW50U2hhZGVyKCkuZWRnZUxvY2F0aW9uKCkpOworICAgICAgICAgICAgZHJhd1N1cmZhY2UobGF5
ZXJSZW5kZXJlciwgbWFza0xheWVyLCBkcmF3VHJhbnNmb3JtLCBkZXZpY2VNYXRyaXgsIGRldmlj
ZVJlY3QsIGxheWVyUXVhZCwgcHJvZ3JhbSwgLTEsIHByb2dyYW0tPnZlcnRleFNoYWRlcigpLnBv
aW50TG9jYXRpb24oKSwgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5lZGdlTG9jYXRpb24oKSwg
ZmlsdGVyQml0bWFwKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNvbnN0IFByb2dy
YW0qIHByb2dyYW0gPSBsYXllclJlbmRlcmVyLT5yZW5kZXJTdXJmYWNlUHJvZ3JhbSgpOwotICAg
ICAgICAgICAgZHJhd1N1cmZhY2UobGF5ZXJSZW5kZXJlciwgbWFza0xheWVyLCBkcmF3VHJhbnNm
b3JtLCBkZXZpY2VNYXRyaXgsIGRldmljZVJlY3QsIGxheWVyUXVhZCwgcHJvZ3JhbSwgLTEsIC0x
LCAtMSk7CisgICAgICAgICAgICBkcmF3U3VyZmFjZShsYXllclJlbmRlcmVyLCBtYXNrTGF5ZXIs
IGRyYXdUcmFuc2Zvcm0sIGRldmljZU1hdHJpeCwgZGV2aWNlUmVjdCwgbGF5ZXJRdWFkLCBwcm9n
cmFtLCAtMSwgLTEsIC0xLCBmaWx0ZXJCaXRtYXApOwogICAgICAgICB9CiAgICAgfQogfQogCiB0
ZW1wbGF0ZSA8Y2xhc3MgVD4KLXZvaWQgQ0NSZW5kZXJTdXJmYWNlOjpkcmF3U3VyZmFjZShMYXll
clJlbmRlcmVyQ2hyb21pdW0qIGxheWVyUmVuZGVyZXIsIENDTGF5ZXJJbXBsKiBtYXNrTGF5ZXIs
IGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtLCBjb25zdCBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgZGV2aWNlVHJhbnNmb3JtLCBjb25zdCBDQ0xheWVyUXVhZCYgZGV2aWNl
UmVjdCwgY29uc3QgQ0NMYXllclF1YWQmIGxheWVyUXVhZCwgY29uc3QgVCogcHJvZ3JhbSwgaW50
IHNoYWRlck1hc2tTYW1wbGVyTG9jYXRpb24sIGludCBzaGFkZXJRdWFkTG9jYXRpb24sIGludCBz
aGFkZXJFZGdlTG9jYXRpb24pCit2b2lkIENDUmVuZGVyU3VyZmFjZTo6ZHJhd1N1cmZhY2UoTGF5
ZXJSZW5kZXJlckNocm9taXVtKiBsYXllclJlbmRlcmVyLCBDQ0xheWVySW1wbCogbWFza0xheWVy
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9ybSwgY29uc3QgVHJhbnNm
b3JtYXRpb25NYXRyaXgmIGRldmljZVRyYW5zZm9ybSwgY29uc3QgQ0NMYXllclF1YWQmIGRldmlj
ZVJlY3QsIGNvbnN0IENDTGF5ZXJRdWFkJiBsYXllclF1YWQsIGNvbnN0IFQqIHByb2dyYW0sIGlu
dCBzaGFkZXJNYXNrU2FtcGxlckxvY2F0aW9uLCBpbnQgc2hhZGVyUXVhZExvY2F0aW9uLCBpbnQg
c2hhZGVyRWRnZUxvY2F0aW9uLCBjb25zdCBTa0JpdG1hcCYgZmlsdGVyQml0bWFwKQogewogICAg
IEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0M0QgPSBsYXllclJlbmRlcmVyLT5jb250ZXh0KCk7
CiAKQEAgLTE5MSw3ICsxOTgsMTEgQEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXdTdXJmYWNl
KExheWVyUgogCiAgICAgR0xDKGNvbnRleHQzRCwgY29udGV4dDNELT5hY3RpdmVUZXh0dXJlKEdy
YXBoaWNzQ29udGV4dDNEOjpURVhUVVJFMCkpOwogICAgIEdMQyhjb250ZXh0M0QsIGNvbnRleHQz
RC0+dW5pZm9ybTFpKHByb2dyYW0tPmZyYWdtZW50U2hhZGVyKCkuc2FtcGxlckxvY2F0aW9uKCks
IDApKTsKLSAgICBtX2NvbnRlbnRzVGV4dHVyZS0+YmluZFRleHR1cmUoY29udGV4dDNELCBsYXll
clJlbmRlcmVyLT5yZW5kZXJTdXJmYWNlVGV4dHVyZUFsbG9jYXRvcigpKTsKKyAgICBpZiAoZmls
dGVyQml0bWFwLmdldFRleHR1cmUoKSkgeworICAgICAgICBHclRleHR1cmUqIHRleHR1cmUgPSBy
ZWludGVycHJldF9jYXN0PEdyVGV4dHVyZSo+KGZpbHRlckJpdG1hcC5nZXRUZXh0dXJlKCkpOwor
ICAgICAgICBjb250ZXh0M0QtPmJpbmRUZXh0dXJlKEdyYXBoaWNzQ29udGV4dDNEOjpURVhUVVJF
XzJELCB0ZXh0dXJlLT5nZXRUZXh0dXJlSGFuZGxlKCkpOworICAgIH0gZWxzZQorICAgICAgICBt
X2NvbnRlbnRzVGV4dHVyZS0+YmluZFRleHR1cmUoY29udGV4dDNELCBsYXllclJlbmRlcmVyLT5y
ZW5kZXJTdXJmYWNlVGV4dHVyZUFsbG9jYXRvcigpKTsKIAogICAgIGlmIChzaGFkZXJNYXNrU2Ft
cGxlckxvY2F0aW9uICE9IC0xKSB7CiAgICAgICAgIEdMQyhjb250ZXh0M0QsIGNvbnRleHQzRC0+
YWN0aXZlVGV4dHVyZShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRTEpKTsKQEAgLTIxNCw2ICsy
MjUsMTcgQEAgdm9pZCBDQ1JlbmRlclN1cmZhY2U6OmRyYXdTdXJmYWNlKExheWVyUgogICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS0+dmVydGV4U2hhZGVyKCkubWF0
cml4TG9jYXRpb24oKSwgcHJvZ3JhbS0+ZnJhZ21lbnRTaGFkZXIoKS5hbHBoYUxvY2F0aW9uKCks
IHNoYWRlclF1YWRMb2NhdGlvbik7CiB9CiAKK1NrQml0bWFwIENDUmVuZGVyU3VyZmFjZTo6YXBw
bHlGaWx0ZXJzKExheWVyUmVuZGVyZXJDaHJvbWl1bSogbGF5ZXJSZW5kZXJlcikKK3sKKyAgICAv
LyBEb24ndCB1c2UgdGhlIHV0aWxpdHkgY29udGV4dCBpZiB3ZSBoYXZlIGEgY29tcG9zaXRvciB0
aHJlYWQsIHNpbmNlCisgICAgLy8gaXQgY2FuIHJhY2Ugd2l0aCBjYW52YXMncyB1c2UuCisgICAg
aWYgKCFtX2NvbnRlbnRzVGV4dHVyZSB8fCAhbV9maWx0ZXJzLnNpemUoKSB8fCBDQ1Byb3h5Ojpo
YXNJbXBsVGhyZWFkKCkpCisgICAgICAgIHJldHVybiBTa0JpdG1hcCgpOworCisgICAgbGF5ZXJS
ZW5kZXJlci0+Y29udGV4dCgpLT5mbHVzaCgpOworICAgIHJldHVybiBDQ1JlbmRlclN1cmZhY2VG
aWx0ZXJzOjphcHBseShtX2ZpbHRlcnMsIG1fY29udGVudHNUZXh0dXJlLT50ZXh0dXJlSWQoKSwg
bV9jb250ZW50UmVjdC5zaXplKCksIFNoYXJlZEdyYXBoaWNzQ29udGV4dDNEOjpnZXQoKSk7Cit9
CisKIFN0cmluZyBDQ1JlbmRlclN1cmZhY2U6Om5hbWUoKSBjb25zdAogewogICAgIHJldHVybiBT
dHJpbmc6OmZvcm1hdCgiUmVuZGVyU3VyZmFjZShpZD0laSxvd25lcj0lcykiLCBtX293bmluZ0xh
eWVyLT5pZCgpLCBtX293bmluZ0xheWVyLT5uYW1lKCkudXRmOCgpLmRhdGEoKSk7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZh
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaAkocmV2aXNpb24gMTA3MTA2KQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NSZW5kZXJTdXJmYWNlLmgJKHdv
cmtpbmcgY29weSkKQEAgLTI5LDEwICsyOSwxMiBAQAogCiAjaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQogCisjaW5jbHVkZSAiRmlsdGVyT3BlcmF0aW9ucy5oIgogI2luY2x1ZGUgIkZs
b2F0UmVjdC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJQcm9ncmFtQmluZGlu
Zy5oIgogI2luY2x1ZGUgIlNoYWRlckNocm9taXVtLmgiCisjaW5jbHVkZSAiU2tCaXRtYXAuaCIK
ICNpbmNsdWRlICJUZXh0dXJlTWFuYWdlci5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0
cml4LmgiCiAjaW5jbHVkZSAiY2MvQ0NMYXllclF1YWQuaCIKQEAgLTcwLDYgKzcyLDEwIEBAIHB1
YmxpYzoKICAgICB2b2lkIHNldERyYXdUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIGRyYXdUcmFuc2Zvcm0pIHsgbV9kcmF3VHJhbnNmb3JtID0gZHJhd1RyYW5zZm9ybTsgfQog
ICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiBkcmF3VHJhbnNmb3JtKCkgY29uc3QgeyBy
ZXR1cm4gbV9kcmF3VHJhbnNmb3JtOyB9CiAKKyAgICB2b2lkIHNldEZpbHRlcnMoY29uc3QgRmls
dGVyT3BlcmF0aW9ucyYgZmlsdGVycykgeyBtX2ZpbHRlcnMgPSBmaWx0ZXJzOyB9CisgICAgY29u
c3QgRmlsdGVyT3BlcmF0aW9ucyYgZmlsdGVycygpIGNvbnN0IHsgcmV0dXJuIG1fZmlsdGVyczsg
fQorICAgIFNrQml0bWFwIGFwcGx5RmlsdGVycyhMYXllclJlbmRlcmVyQ2hyb21pdW0qKTsKKwog
ICAgIHZvaWQgc2V0UmVwbGljYURyYXdUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIHJlcGxpY2FEcmF3VHJhbnNmb3JtKSB7IG1fcmVwbGljYURyYXdUcmFuc2Zvcm0gPSByZXBs
aWNhRHJhd1RyYW5zZm9ybTsgfQogICAgIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiByZXBs
aWNhRHJhd1RyYW5zZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcmVwbGljYURyYXdUcmFuc2Zvcm07
IH0KIApAQCAtMTA2LDkgKzExMiw5IEBAIHB1YmxpYzoKICAgICBDQ0RhbWFnZVRyYWNrZXIqIGRh
bWFnZVRyYWNrZXIoKSBjb25zdCB7IHJldHVybiBtX2RhbWFnZVRyYWNrZXIuZ2V0KCk7IH0KIAog
cHJpdmF0ZToKLSAgICB2b2lkIGRyYXdMYXllcihMYXllclJlbmRlcmVyQ2hyb21pdW0qLCBDQ0xh
eWVySW1wbCosIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4Jik7CisgICAgdm9pZCBkcmF3TGF5
ZXIoTGF5ZXJSZW5kZXJlckNocm9taXVtKiwgQ0NMYXllckltcGwqLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYsIGNvbnN0IFNrQml0bWFwJiBmaWx0ZXJCaXRtYXApOwogICAgIHRlbXBsYXRl
IDxjbGFzcyBUPgotICAgIHZvaWQgZHJhd1N1cmZhY2UoTGF5ZXJSZW5kZXJlckNocm9taXVtKiwg
Q0NMYXllckltcGwqLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJhd1RyYW5zZm9ybSwg
Y29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRldmljZVRyYW5zZm9ybSwgY29uc3QgQ0NMYXll
clF1YWQmIGRldmljZVJlY3QsIGNvbnN0IENDTGF5ZXJRdWFkJiwgY29uc3QgVCogcHJvZ3JhbSwg
aW50IHNoYWRlck1hc2tTYW1wbGVyTG9jYXRpb24sIGludCBzaGFkZXJRdWFkTG9jYXRpb24sIGlu
dCBzaGFkZXJFZGdlTG9jYXRpb24pOworICAgIHZvaWQgZHJhd1N1cmZhY2UoTGF5ZXJSZW5kZXJl
ckNocm9taXVtKiwgQ0NMYXllckltcGwqLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgZHJh
d1RyYW5zZm9ybSwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIGRldmljZVRyYW5zZm9ybSwg
Y29uc3QgQ0NMYXllclF1YWQmIGRldmljZVJlY3QsIGNvbnN0IENDTGF5ZXJRdWFkJiwgY29uc3Qg
VCogcHJvZ3JhbSwgaW50IHNoYWRlck1hc2tTYW1wbGVyTG9jYXRpb24sIGludCBzaGFkZXJRdWFk
TG9jYXRpb24sIGludCBzaGFkZXJFZGdlTG9jYXRpb24sIGNvbnN0IFNrQml0bWFwJiBmaWx0ZXJC
aXRtYXApOwogCiAgICAgQ0NMYXllckltcGwqIG1fb3duaW5nTGF5ZXI7CiAgICAgQ0NMYXllcklt
cGwqIG1fbWFza0xheWVyOwpAQCAtMTIyLDYgKzEyOCw3IEBAIHByaXZhdGU6CiAgICAgVHJhbnNm
b3JtYXRpb25NYXRyaXggbV9kcmF3VHJhbnNmb3JtOwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
IG1fcmVwbGljYURyYXdUcmFuc2Zvcm07CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV9vcmln
aW5UcmFuc2Zvcm07CisgICAgRmlsdGVyT3BlcmF0aW9ucyBtX2ZpbHRlcnM7CiAgICAgSW50UmVj
dCBtX2NsaXBSZWN0OwogICAgIFZlY3RvcjxSZWZQdHI8Q0NMYXllckltcGw+ID4gbV9sYXllckxp
c3Q7CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2Nj
L0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3VyZmFjZUZpbHRlcnMuY3Bw
CShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MjY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAq
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVT
RSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJBVEVE
X0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiY2MvQ0NSZW5kZXJTdXJmYWNlRmlsdGVycy5oIgor
CisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNpbmNsdWRlICJTa0JsdXJJbWFnZUZp
bHRlci5oIgorI2luY2x1ZGUgIlNrQ2FudmFzLmgiCisjaW5jbHVkZSAiU2tDb2xvck1hdHJpeEZp
bHRlci5oIgorI2luY2x1ZGUgIlNrR3B1RGV2aWNlLmgiCisjaW5jbHVkZSAiU2tHclRleHR1cmVQ
aXhlbFJlZi5oIgorCituYW1lc3BhY2UgeworCit2b2lkIGdldFNhdHVyYXRlTWF0cml4KGZsb2F0
IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBtYXRyaXhbMF0gPSAwLjIxM2Yg
KyAwLjc4N2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzFdID0gMC43MTVmIC0gMC43MTVmICogYW1v
dW50OworICAgIG1hdHJpeFsyXSA9IDAuMDcyZiAtIDAuMDcyZiAqIGFtb3VudDsKKyAgICBtYXRy
aXhbM10gPSBtYXRyaXhbNF0gPSAwOworICAgIG1hdHJpeFs1XSA9IDAuMjEzZiAtIDAuMjEzZiAq
IGFtb3VudDsKKyAgICBtYXRyaXhbNl0gPSAwLjcxNWYgKyAwLjI4NWYgKiBhbW91bnQ7CisgICAg
bWF0cml4WzddID0gMC4wNzJmIC0gMC4wNzJmICogYW1vdW50OworICAgIG1hdHJpeFs4XSA9IG1h
dHJpeFs5XSA9IDA7CisgICAgbWF0cml4WzEwXSA9IDAuMjEzZiAtIDAuMjEzZiAqIGFtb3VudDsK
KyAgICBtYXRyaXhbMTFdID0gMC43MTVmIC0gMC43MTVmICogYW1vdW50OworICAgIG1hdHJpeFsx
Ml0gPSAwLjA3MmYgKyAwLjkyOGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzEzXSA9IG1hdHJpeFsx
NF0gPSAwOworICAgIG1hdHJpeFsxNV0gPSBtYXRyaXhbMTZdID0gbWF0cml4WzE3XSA9IG1hdHJp
eFsxOV0gPSAwOworICAgIG1hdHJpeFsxOF0gPSAxOworfQorCit2b2lkIGdldEh1ZVJvdGF0ZU1h
dHJpeChmbG9hdCBodWUsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7CisgICAgZmxvYXQgY29zSHVl
ID0gY29zZihodWUgKiBwaUZsb2F0IC8gMTgwKTsgCisgICAgZmxvYXQgc2luSHVlID0gc2luZiho
dWUgKiBwaUZsb2F0IC8gMTgwKTsgCisgICAgbWF0cml4WzBdID0gMC4yMTNmICsgY29zSHVlICog
MC43ODdmIC0gc2luSHVlICogMC4yMTNmOworICAgIG1hdHJpeFsxXSA9IDAuNzE1ZiAtIGNvc0h1
ZSAqIDAuNzE1ZiAtIHNpbkh1ZSAqIDAuNzE1ZjsKKyAgICBtYXRyaXhbMl0gPSAwLjA3MmYgLSBj
b3NIdWUgKiAwLjA3MmYgKyBzaW5IdWUgKiAwLjkyOGY7CisgICAgbWF0cml4WzNdID0gbWF0cml4
WzRdID0gMDsKKyAgICBtYXRyaXhbNV0gPSAwLjIxM2YgLSBjb3NIdWUgKiAwLjIxM2YgKyBzaW5I
dWUgKiAwLjE0M2Y7CisgICAgbWF0cml4WzZdID0gMC43MTVmICsgY29zSHVlICogMC4yODVmICsg
c2luSHVlICogMC4xNDBmOworICAgIG1hdHJpeFs3XSA9IDAuMDcyZiAtIGNvc0h1ZSAqIDAuMDcy
ZiAtIHNpbkh1ZSAqIDAuMjgzZjsKKyAgICBtYXRyaXhbOF0gPSBtYXRyaXhbOV0gPSAwOworICAg
IG1hdHJpeFsxMF0gPSAwLjIxM2YgLSBjb3NIdWUgKiAwLjIxM2YgLSBzaW5IdWUgKiAwLjc4N2Y7
CisgICAgbWF0cml4WzExXSA9IDAuNzE1ZiAtIGNvc0h1ZSAqIDAuNzE1ZiArIHNpbkh1ZSAqIDAu
NzE1ZjsKKyAgICBtYXRyaXhbMTJdID0gMC4wNzJmICsgY29zSHVlICogMC45MjhmICsgc2luSHVl
ICogMC4wNzJmOworICAgIG1hdHJpeFsxM10gPSBtYXRyaXhbMTRdID0gMDsKKyAgICBtYXRyaXhb
MTVdID0gbWF0cml4WzE2XSA9IG1hdHJpeFsxN10gPSAwOworICAgIG1hdHJpeFsxOF0gPSAxOwor
ICAgIG1hdHJpeFsxOV0gPSAwOworfQorCit2b2lkIGdldEludmVydE1hdHJpeChmbG9hdCBhbW91
bnQsIFNrU2NhbGFyIG1hdHJpeFsyMF0pCit7CisgICAgbWVtc2V0KG1hdHJpeCwgMCwgMjAgKiBz
aXplb2YoU2tTY2FsYXIpKTsKKyAgICBtYXRyaXhbMF0gPSBtYXRyaXhbNl0gPSBtYXRyaXhbMTJd
ID0gMSAtIDIgKiBhbW91bnQ7CisgICAgbWF0cml4WzRdID0gbWF0cml4WzldID0gbWF0cml4WzE0
XSA9IGFtb3VudCAqIDI1NTsKKyAgICBtYXRyaXhbMThdID0gMTsKK30KKwordm9pZCBnZXRPcGFj
aXR5TWF0cml4KGZsb2F0IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBtZW1z
ZXQobWF0cml4LCAwLCAyMCAqIHNpemVvZihTa1NjYWxhcikpOworICAgIG1hdHJpeFswXSA9IG1h
dHJpeFs2XSA9IG1hdHJpeFsxMl0gPSAxOworICAgIG1hdHJpeFsxOF0gPSBhbW91bnQ7Cit9CisK
K3ZvaWQgZ2V0R3JheXNjYWxlTWF0cml4KGZsb2F0IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIw
XSkKK3sKKyAgICBtYXRyaXhbMF0gPSAwLjIxMjZmICsgMC43ODc0ZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbMV0gPSAwLjcxNTJmIC0gMC43MTUyZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbMl0gPSAw
LjA3MjJmIC0gMC4wNzIyZiAqIGFtb3VudDsKKyAgICBtYXRyaXhbM10gPSBtYXRyaXhbNF0gPSAw
OworCisgICAgbWF0cml4WzVdID0gMC4yMTI2ZiAtIDAuMjEyNmYgKiBhbW91bnQ7CisgICAgbWF0
cml4WzZdID0gMC43MTUyZiArIDAuMjg0OGYgKiBhbW91bnQ7CisgICAgbWF0cml4WzddID0gMC4w
NzIyZiAtIDAuMDcyMmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzhdID0gbWF0cml4WzldID0gMDsK
KworICAgIG1hdHJpeFsxMF0gPSAwLjIxMjZmIC0gMC4yMTI2ZiAqIGFtb3VudDsKKyAgICBtYXRy
aXhbMTFdID0gMC43MTUyZiAtIDAuNzE1MmYgKiBhbW91bnQ7CisgICAgbWF0cml4WzEyXSA9IDAu
MDcyMmYgKyAwLjkyNzhmICogYW1vdW50OworICAgIG1hdHJpeFsxM10gPSBtYXRyaXhbMTRdID0g
MDsKKworICAgIG1hdHJpeFsxNV0gPSBtYXRyaXhbMTZdID0gbWF0cml4WzE3XSA9IG1hdHJpeFsx
OV0gPSAwOworICAgIG1hdHJpeFsxOF0gPSAxOworfQorCit2b2lkIGdldFNlcGlhTWF0cml4KGZs
b2F0IGFtb3VudCwgU2tTY2FsYXIgbWF0cml4WzIwXSkKK3sKKyAgICBtYXRyaXhbMF0gPSAwLjM5
M2YgKyAwLjYwN2YgKiBhbW91bnQ7CisgICAgbWF0cml4WzFdID0gMC43NjlmIC0gMC43NjlmICog
YW1vdW50OworICAgIG1hdHJpeFsyXSA9IDAuMTg5ZiAtIDAuMTg5ZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbM10gPSBtYXRyaXhbNF0gPSAwOworCisgICAgbWF0cml4WzVdID0gMC4zNDlmIC0gMC4z
NDlmICogYW1vdW50OworICAgIG1hdHJpeFs2XSA9IDAuNjg2ZiArIDAuMzE0ZiAqIGFtb3VudDsK
KyAgICBtYXRyaXhbN10gPSAwLjE2OGYgLSAwLjE2OGYgKiBhbW91bnQ7CisgICAgbWF0cml4Wzhd
ID0gbWF0cml4WzldID0gMDsKKworICAgIG1hdHJpeFsxMF0gPSAwLjI3MmYgLSAwLjI3MmYgKiBh
bW91bnQ7CisgICAgbWF0cml4WzExXSA9IDAuNTM0ZiAtIDAuNTM0ZiAqIGFtb3VudDsKKyAgICBt
YXRyaXhbMTJdID0gMC4xMzFmICsgMC44NjlmICogYW1vdW50OworICAgIG1hdHJpeFsxM10gPSBt
YXRyaXhbMTRdID0gMDsKKworICAgIG1hdHJpeFsxNV0gPSBtYXRyaXhbMTZdID0gbWF0cml4WzE3
XSA9IG1hdHJpeFsxOV0gPSAwOworICAgIG1hdHJpeFsxOF0gPSAxOworfQorCitib29sIGFwcGx5
Q29sb3JNYXRyaXgoU2tDYW52YXMqIGNhbnZhcywgU2tCaXRtYXAgc291cmNlLCBTa1NjYWxhciBt
YXRyaXhbMjBdKQoreworICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgcGFpbnQuc2V0Q29sb3JGaWx0
ZXIobmV3IFNrQ29sb3JNYXRyaXhGaWx0ZXIobWF0cml4KSktPnVucmVmKCk7CisgICAgY2FudmFz
LT5kcmF3Qml0bWFwKHNvdXJjZSwgMCwgMCwgJnBhaW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworfQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1NrQml0bWFwIENDUmVuZGVyU3VyZmFjZUZp
bHRlcnM6OmFwcGx5KGNvbnN0IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMsIHVuc2lnbmVkIHRl
eHR1cmVJZCwgY29uc3QgRmxvYXRTaXplJiBzaXplLCBHcmFwaGljc0NvbnRleHQzRCogY29udGV4
dDNEKQoreworICAgIFNrQml0bWFwIHNvdXJjZTsKKyAgICBpZiAoIWNvbnRleHQzRCkKKyAgICAg
ICAgcmV0dXJuIHNvdXJjZTsKKworICAgIEdyQ29udGV4dCogZ3IgPSBjb250ZXh0M0QtPmdyQ29u
dGV4dCgpOworICAgIGlmICghZ3IpCisgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgLy8gV3Jh
cCB0aGUgUmVuZGVyU3VyZmFjZSdzIHRleHR1cmUgaW4gYSBHYW5lc2ggcGxhdGZvcm0gdGV4dHVy
ZS4KKyAgICBHclBsYXRmb3JtVGV4dHVyZURlc2MgcGxhdGZvcm1UZXhEZXNjOworICAgIHBsYXRm
b3JtVGV4RGVzYy5mV2lkdGggPSBzaXplLndpZHRoKCk7CisgICAgcGxhdGZvcm1UZXhEZXNjLmZI
ZWlnaHQgPSBzaXplLmhlaWdodCgpOworICAgIHBsYXRmb3JtVGV4RGVzYy5mQ29uZmlnID0ga1Nr
aWE4ODg4X1BNX0dyUGl4ZWxDb25maWc7CisgICAgcGxhdGZvcm1UZXhEZXNjLmZUZXh0dXJlSGFu
ZGxlID0gdGV4dHVyZUlkOworICAgIFNrQXV0b1RVbnJlZjxHclRleHR1cmU+IHRleHR1cmUoZ3It
PmNyZWF0ZVBsYXRmb3JtVGV4dHVyZShwbGF0Zm9ybVRleERlc2MpKTsKKyAgICAvLyBQbGFjZSB0
aGUgcGxhdGZvcm0gdGV4dHVyZSBpbnNpZGUgYW4gU2tCaXRtYXAuCisgICAgc291cmNlLnNldENv
bmZpZyhTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcsIHNpemUud2lkdGgoKSwgc2l6ZS5oZWln
aHQoKSk7CisgICAgc291cmNlLnNldFBpeGVsUmVmKG5ldyBTa0dyVGV4dHVyZVBpeGVsUmVmKHRl
eHR1cmUuZ2V0KCkpKS0+dW5yZWYoKTsKKyAgICAKKyAgICBHckNvbnRleHQ6OlRleHR1cmVDYWNo
ZUVudHJ5IGRlc3Q7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZmlsdGVycy5zaXpl
KCk7ICsraSkgeworICAgICAgICAvLyBTYXZlIHRoZSBwcmV2aW91cyB0ZXh0dXJlIGNhY2hlIGRl
c3RpbmF0aW9uIChpZiBhbnkpLCBhbmQga2VlcCBpdAorICAgICAgICAvLyBsb2NrZWQgZHVyaW5n
IGRyYXcgdG8gcHJldmVudCBpdCBiZSByZS11c2VkIGFzIGRlc3RpbmF0aW9uLgorICAgICAgICBH
ckNvbnRleHQ6OlRleHR1cmVDYWNoZUVudHJ5IHNvdXJjZUVudHJ5ID0gZGVzdDsKKyAgICAgICAg
Y29uc3QgRmlsdGVyT3BlcmF0aW9uKiBmaWx0ZXJPcGVyYXRpb24gPSBmaWx0ZXJzLmF0KGkpOwor
ICAgICAgICAvLyBBbGxvY2F0ZSBhIGRlc3RpbmF0aW9uIHRleHR1cmUuCisgICAgICAgIEdyVGV4
dHVyZURlc2MgZGVzYzsKKyAgICAgICAgZGVzYy5mRmxhZ3MgPSBrUmVuZGVyVGFyZ2V0X0dyVGV4
dHVyZUZsYWdCaXQ7CisgICAgICAgIGRlc2MuZkFBTGV2ZWwgPSBrTm9uZV9HckFBTGV2ZWw7Cisg
ICAgICAgIGRlc2MuZldpZHRoID0gc2l6ZS53aWR0aCgpOworICAgICAgICBkZXNjLmZIZWlnaHQg
PSBzaXplLmhlaWdodCgpOworICAgICAgICBkZXNjLmZDb25maWcgPSBrUkdCQV84ODg4X0dyUGl4
ZWxDb25maWc7CisgICAgICAgIC8vIEZJWE1FOiBjb3VsZCB3ZSB1c2UgYXBwcm94aW1hdGUgbWF0
Y2gsIGFuZCBmaXggdGV4Y29vcmRzIG9uIGRyYXcKKyAgICAgICAgZGVzdCA9IGdyLT5sb2NrU2Ny
YXRjaFRleHR1cmUoZGVzYywgR3JDb250ZXh0OjprRXhhY3RfU2NyYXRjaFRleE1hdGNoKTsKKyAg
ICAgICAgaWYgKCFkZXN0LnRleHR1cmUoKSkKKyAgICAgICAgICAgIHJldHVybiBTa0JpdG1hcCgp
OworICAgICAgICBTa0dwdURldmljZSBkZXZpY2UoZ3IsIGRlc3QudGV4dHVyZSgpKTsKKyAgICAg
ICAgU2tDYW52YXMgY2FudmFzKCZkZXZpY2UpOworICAgICAgICBjYW52YXMuY2xlYXIoMHgwKTsK
KyAgICAgICAgc3dpdGNoIChmaWx0ZXJPcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSkgewor
ICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6R1JBWVNDQUxFOiB7CisgICAgICAgICAgICBj
b25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBvcCA9IHN0YXRpY19jYXN0PGNv
bnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRpb24pOwor
ICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAgICAgICAgIGdldEdyYXlzY2Fs
ZU1hdHJpeCgxIC0gb3AtPmFtb3VudCgpLCBtYXRyaXgpOworICAgICAgICAgICAgYXBwbHlDb2xv
ck1hdHJpeCgmY2FudmFzLCBzb3VyY2UsIG1hdHJpeCk7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlvbjo6U0VQSUE6IHsKKyAgICAgICAg
ICAgIGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qIG9wID0gc3RhdGljX2Nh
c3Q8Y29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlv
bik7CisgICAgICAgICAgICBTa1NjYWxhciBtYXRyaXhbMjBdOworICAgICAgICAgICAgZ2V0U2Vw
aWFNYXRyaXgoMSAtIG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAgICAgICAgIGFwcGx5Q29s
b3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246OlNBVFVSQVRFOiB7CisgICAg
ICAgICAgICBjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBvcCA9IHN0YXRp
Y19jYXN0PGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVy
YXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAgICAgICAgIGdl
dFNhdHVyYXRlTWF0cml4KDEgLSBvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAgICAgICBh
cHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpIVUVfUk9UQVRF
OiB7CisgICAgICAgICAgICBjb25zdCBCYXNpY0NvbG9yTWF0cml4RmlsdGVyT3BlcmF0aW9uKiBv
cCA9IHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24qPihm
aWx0ZXJPcGVyYXRpb24pOworICAgICAgICAgICAgU2tTY2FsYXIgbWF0cml4WzIwXTsKKyAgICAg
ICAgICAgIGdldEh1ZVJvdGF0ZU1hdHJpeChvcC0+YW1vdW50KCksIG1hdHJpeCk7CisgICAgICAg
ICAgICBhcHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4KTsKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3BlcmF0aW9uOjpJTlZF
UlQ6IHsKKyAgICAgICAgICAgIGNvbnN0IEJhc2ljQ29sb3JNYXRyaXhGaWx0ZXJPcGVyYXRpb24q
IG9wID0gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNDb2xvck1hdHJpeEZpbHRlck9wZXJhdGlvbio+
KGZpbHRlck9wZXJhdGlvbik7CisgICAgICAgICAgICBTa1NjYWxhciBtYXRyaXhbMjBdOworICAg
ICAgICAgICAgZ2V0SW52ZXJ0TWF0cml4KG9wLT5hbW91bnQoKSwgbWF0cml4KTsKKyAgICAgICAg
ICAgIGFwcGx5Q29sb3JNYXRyaXgoJmNhbnZhcywgc291cmNlLCBtYXRyaXgpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGaWx0ZXJPcGVyYXRpb246Ok9QQUNJ
VFk6IHsKKyAgICAgICAgICAgIGNvbnN0IEJhc2ljQ29tcG9uZW50VHJhbnNmZXJGaWx0ZXJPcGVy
YXRpb24qIG9wID0gc3RhdGljX2Nhc3Q8Y29uc3QgQmFzaWNDb21wb25lbnRUcmFuc2ZlckZpbHRl
ck9wZXJhdGlvbio+KGZpbHRlck9wZXJhdGlvbik7CisgICAgICAgICAgICBTa1NjYWxhciBtYXRy
aXhbMjBdOworICAgICAgICAgICAgZ2V0T3BhY2l0eU1hdHJpeChvcC0+YW1vdW50KCksIG1hdHJp
eCk7CisgICAgICAgICAgICBhcHBseUNvbG9yTWF0cml4KCZjYW52YXMsIHNvdXJjZSwgbWF0cml4
KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRmlsdGVyT3Bl
cmF0aW9uOjpCTFVSOiB7CisgICAgICAgICAgICBjb25zdCBCbHVyRmlsdGVyT3BlcmF0aW9uKiBv
cCA9IHN0YXRpY19jYXN0PGNvbnN0IEJsdXJGaWx0ZXJPcGVyYXRpb24qPihmaWx0ZXJPcGVyYXRp
b24pOworICAgICAgICAgICAgZmxvYXQgc3RkWCA9IG9wLT5zdGREZXZpYXRpb24oKS5jYWxjRmxv
YXRWYWx1ZSgwKTsKKyAgICAgICAgICAgIGZsb2F0IHN0ZFkgPSBvcC0+c3RkRGV2aWF0aW9uKCku
Y2FsY0Zsb2F0VmFsdWUoMSk7CisgICAgICAgICAgICBTa0F1dG9UVW5yZWY8U2tJbWFnZUZpbHRl
cj4gZmlsdGVyKG5ldyBTa0JsdXJJbWFnZUZpbHRlcihzdGRYLCBzdGRZKSk7CisgICAgICAgICAg
ICBTa1BhaW50IHBhaW50OworICAgICAgICAgICAgcGFpbnQuc2V0SW1hZ2VGaWx0ZXIoZmlsdGVy
LmdldCgpKTsKKyAgICAgICAgICAgIHBhaW50LnNldENvbG9yKDB4RkZGRkZGRkYpOworICAgICAg
ICAgICAgY2FudmFzLnNhdmVMYXllcigwLCAmcGFpbnQpOworICAgICAgICAgICAgY2FudmFzLmRy
YXdCaXRtYXAoc291cmNlLCAwLCAwKTsKKyAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlKCk7Cisg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZpbHRlck9wZXJhdGlv
bjo6UEFTU1RIUk9VR0g6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYW52YXMuZHJh
d0JpdG1hcChzb3VyY2UsIDAsIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgLy8gRGVzdCB0ZXh0dXJlIGZyb20gdGhpcyBmaWx0ZXIgYmVjb21lcyBzb3VyY2UgYml0
bWFwIGZvciBuZXh0IGZpbHRlci4KKyAgICAgICAgc291cmNlLnNldFBpeGVsUmVmKG5ldyBTa0dy
VGV4dHVyZVBpeGVsUmVmKGRlc3QudGV4dHVyZSgpKSktPnVucmVmKCk7CisgICAgICAgIC8vIFVu
bG9jayB0aGUgcHJldmlvdXMgdGV4dHVyZSBjYWNoZSBlbnRyeS4KKyAgICAgICAgaWYgKHNvdXJj
ZUVudHJ5LnRleHR1cmUoKSkKKyAgICAgICAgICAgIGdyLT51bmxvY2tUZXh0dXJlKHNvdXJjZUVu
dHJ5KTsKKyAgICB9CisgICAgaWYgKGRlc3QudGV4dHVyZSgpKQorICAgICAgICBnci0+dW5sb2Nr
VGV4dHVyZShkZXN0KTsKKyAgICBjb250ZXh0M0QtPmZsdXNoKCk7CisgICAgcmV0dXJuIHNvdXJj
ZTsKK30KKworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDUmVuZGVyU3Vy
ZmFjZUZpbHRlcnMuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2VGaWx0ZXJzLmgJKHJldmlzaW9uIDApCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1
cmZhY2VGaWx0ZXJzLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTIgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNp
Zm5kZWYgQ0NSZW5kZXJTdXJmYWNlRmlsdGVyc19oCisjZGVmaW5lIENDUmVuZGVyU3VyZmFjZUZp
bHRlcnNfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCitjbGFzcyBTa0Jp
dG1hcDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgRmlsdGVyT3BlcmF0aW9uczsKK2Ns
YXNzIEZsb2F0U2l6ZTsKK2NsYXNzIEdyYXBoaWNzQ29udGV4dDNEOworY2xhc3MgQ0NSZW5kZXJT
dXJmYWNlRmlsdGVycyB7CitwdWJsaWM6CisgICAgc3RhdGljIFNrQml0bWFwIGFwcGx5KGNvbnN0
IEZpbHRlck9wZXJhdGlvbnMmIGZpbHRlcnMsIHVuc2lnbmVkIHRleHR1cmVJZCwgY29uc3QgRmxv
YXRTaXplJiwgR3JhcGhpY3NDb250ZXh0M0QqKTsKK307CisKK30KKyNlbmRpZiAvLyBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCisKKyNlbmRpZgo=
</data>
<flag name="review"
          id="127842"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>