<?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>70367</bug_id>
          
          <creation_ts>2011-10-18 14:36:41 -0700</creation_ts>
          <short_desc>[chromium] Canvas2D should rate-limit drawing to prevent swamping the GPU process</short_desc>
          <delta_ts>2011-10-26 06:24:14 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Canvas</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</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>jamesr</cc>
    
    <cc>jbates</cc>
    
    <cc>kbr</cc>
    
    <cc>mdelaney7</cc>
    
    <cc>nduca</cc>
    
    <cc>vangelis</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>486317</commentid>
    <comment_count>0</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-18 14:36:41 -0700</bug_when>
    <thetext>[chromium] Canvas2D should rate-limit drawing to prevent swamping the GPU process</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486318</commentid>
    <comment_count>1</comment_count>
      <attachid>111506</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-18 14:37:52 -0700</bug_when>
    <thetext>Created attachment 111506
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486326</commentid>
    <comment_count>2</comment_count>
      <attachid>111506</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-18 14:54:00 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:69
&gt; +    return (m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB() == GraphicsContext3D::NO_ERROR);

why is this changed?

&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:95
&gt; +        m_rateLimitingTimer.startOneShot(0);

I&apos;m a little worried about the use of WebCore::Timer for this. What&apos;s the intended behavior here? When exactly should this timer fire?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486332</commentid>
    <comment_count>3</comment_count>
      <attachid>111506</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-18 15:02:09 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:60
&gt; +    m_contextSupportsRateLimitingExtension = context-&gt;getExtensions()-&gt;supports(&quot;GL_CHROMIUM_rate_limit_offscreen_context&quot;);

Might want to double check that our implementaiton of supports() is handled client side. Would suck if this was a call to the GPU process for every layer. :&apos;(

&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:92
&gt; +void Canvas2DLayerChromium::contentChanged()

In the case where the user has three canvases, this will rate limit three times, right? Since its all one context, we need to rate limit only once. The problem here is the rateLimit code basically says &quot;insert a token. Increment a counter. Dont return until the GPU process has processed at least up to counter - 2.&quot; So, for example, 3 rateLimits in a row is a glFinish.

&gt; Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.cpp:308
&gt;  void GraphicsLayerChromium::setContentsNeedsDisplay()

Would this get called in unexpected cases? E.g. during layout or when someone changes the size of a div? The thing I&apos;m worrying about is that we&apos;ll end up calling rateLimit when we didn&apos;t mean to... although, that might be OK.

&gt; Source/WebCore/platform/graphics/chromium/LayerChromium.h:198
&gt; +    virtual void contentChanged() { }

Might want to make a comment about what this means semantically.

I&apos;m a bit worried about adding this on all layers, mainly because its pretty complex as it is. This is from an external perspective, hopefully Vangelis has a smart thing to say here. Whatever semantic definition we agree on for contentChanged, we probably want to be self consistent.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486339</commentid>
    <comment_count>4</comment_count>
      <attachid>111506</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-18 15:06:17 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:69
&gt;&gt; +    return (m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB() == GraphicsContext3D::NO_ERROR);
&gt; 
&gt; why is this changed?

I honestly can&apos;t remember the details (this tiny patch has been too long in the making).  I think the reason is that, since the call to contentChanged() happens inside a &quot;drawsContent()&quot; check higher up the stack, we want the contentChanged() to happen even if the layer is currently disabled (texture ID 0), so that if a texture is created for it in the interim, it still gets rate limited.  But I&apos;m not certain about that.

&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:95
&gt;&gt; +        m_rateLimitingTimer.startOneShot(0);
&gt; 
&gt; I&apos;m a little worried about the use of WebCore::Timer for this. What&apos;s the intended behavior here? When exactly should this timer fire?

Basically, it should fire after the current chunk of JavaScript code and any Canvas2D drawing calls made by it have finished executing.  By putting it on a timer, we know it won&apos;t get called until v8 returns.  The same trick is used in WebGLLayerChromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486343</commentid>
    <comment_count>5</comment_count>
      <attachid>111506</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-18 15:11:47 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:60
&gt;&gt; +    m_contextSupportsRateLimitingExtension = context-&gt;getExtensions()-&gt;supports(&quot;GL_CHROMIUM_rate_limit_offscreen_context&quot;);
&gt; 
&gt; Might want to double check that our implementaiton of supports() is handled client side. Would suck if this was a call to the GPU process for every layer. :&apos;(

Hmmm.  Well, WebGL does the same thing (although perhaps that&apos;s no excuse).  I&apos;ll look into it.

&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:92
&gt;&gt; +void Canvas2DLayerChromium::contentChanged()
&gt; 
&gt; In the case where the user has three canvases, this will rate limit three times, right? Since its all one context, we need to rate limit only once. The problem here is the rateLimit code basically says &quot;insert a token. Increment a counter. Dont return until the GPU process has processed at least up to counter - 2.&quot; So, for example, 3 rateLimits in a row is a glFinish.

Yeah, that&apos;s what I thought.  I thought I would see a big perf penalty on multiple canvas layers.  But there isn&apos;t, either on my test cases, or on Fireflies or Fishbowl, two recent demos which use a lot of canvas layers.  I was rather surprised.  I did another implementation with a single timer for all canvases, and there was no difference.  I&apos;m not sure why, though.

&gt;&gt; Source/WebCore/platform/graphics/chromium/LayerChromium.h:198
&gt;&gt; +    virtual void contentChanged() { }
&gt; 
&gt; Might want to make a comment about what this means semantically.
&gt; 
&gt; I&apos;m a bit worried about adding this on all layers, mainly because its pretty complex as it is. This is from an external perspective, hopefully Vangelis has a smart thing to say here. Whatever semantic definition we agree on for contentChanged, we probably want to be self consistent.

My hope was that we could re-use this for WebGL, and we could remove some code from WebGLRenderingContext, and de-couple GraphicsContext3D from WebGLLayerChromium a bit too.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486418</commentid>
    <comment_count>6</comment_count>
      <attachid>111506</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2011-10-18 16:24:20 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:92
&gt;&gt;&gt; +void Canvas2DLayerChromium::contentChanged()
&gt;&gt; 
&gt;&gt; In the case where the user has three canvases, this will rate limit three times, right? Since its all one context, we need to rate limit only once. The problem here is the rateLimit code basically says &quot;insert a token. Increment a counter. Dont return until the GPU process has processed at least up to counter - 2.&quot; So, for example, 3 rateLimits in a row is a glFinish.
&gt; 
&gt; Yeah, that&apos;s what I thought.  I thought I would see a big perf penalty on multiple canvas layers.  But there isn&apos;t, either on my test cases, or on Fireflies or Fishbowl, two recent demos which use a lot of canvas layers.  I was rather surprised.  I did another implementation with a single timer for all canvases, and there was no difference.  I&apos;m not sure why, though.

Should we add some tracing around the place where the blocking happens to make sure it functions as intended?

&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/LayerChromium.h:198
&gt;&gt;&gt; +    virtual void contentChanged() { }
&gt;&gt; 
&gt;&gt; Might want to make a comment about what this means semantically.
&gt;&gt; 
&gt;&gt; I&apos;m a bit worried about adding this on all layers, mainly because its pretty complex as it is. This is from an external perspective, hopefully Vangelis has a smart thing to say here. Whatever semantic definition we agree on for contentChanged, we probably want to be self consistent.
&gt; 
&gt; My hope was that we could re-use this for WebGL, and we could remove some code from WebGLRenderingContext, and de-couple GraphicsContext3D from WebGLLayerChromium a bit too.

It seems reasonable to me to define a contentChanged() method for LC&apos;s and I like the idea of using the same mechanism to rate-limit WebGL.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486782</commentid>
    <comment_count>7</comment_count>
      <attachid>111506</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-19 07:37:50 -0700</bug_when>
    <thetext>Comment on attachment 111506
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:60
&gt;&gt;&gt; +    m_contextSupportsRateLimitingExtension = context-&gt;getExtensions()-&gt;supports(&quot;GL_CHROMIUM_rate_limit_offscreen_context&quot;);
&gt;&gt; 
&gt;&gt; Might want to double check that our implementaiton of supports() is handled client side. Would suck if this was a call to the GPU process for every layer. :&apos;(
&gt; 
&gt; Hmmm.  Well, WebGL does the same thing (although perhaps that&apos;s no excuse).  I&apos;ll look into it.

Seems to be handled client-side.

&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:69
&gt;&gt;&gt; +    return (m_context-&gt;getExtensions()-&gt;getGraphicsResetStatusARB() == GraphicsContext3D::NO_ERROR);
&gt;&gt; 
&gt;&gt; why is this changed?
&gt; 
&gt; I honestly can&apos;t remember the details (this tiny patch has been too long in the making).  I think the reason is that, since the call to contentChanged() happens inside a &quot;drawsContent()&quot; check higher up the stack, we want the contentChanged() to happen even if the layer is currently disabled (texture ID 0), so that if a texture is created for it in the interim, it still gets rate limited.  But I&apos;m not certain about that.

Forget everything I said.  This was a bad merge.  Removed.

&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:92
&gt;&gt;&gt;&gt; +void Canvas2DLayerChromium::contentChanged()
&gt;&gt;&gt; 
&gt;&gt;&gt; In the case where the user has three canvases, this will rate limit three times, right? Since its all one context, we need to rate limit only once. The problem here is the rateLimit code basically says &quot;insert a token. Increment a counter. Dont return until the GPU process has processed at least up to counter - 2.&quot; So, for example, 3 rateLimits in a row is a glFinish.
&gt;&gt; 
&gt;&gt; Yeah, that&apos;s what I thought.  I thought I would see a big perf penalty on multiple canvas layers.  But there isn&apos;t, either on my test cases, or on Fireflies or Fishbowl, two recent demos which use a lot of canvas layers.  I was rather surprised.  I did another implementation with a single timer for all canvases, and there was no difference.  I&apos;m not sure why, though.
&gt; 
&gt; Should we add some tracing around the place where the blocking happens to make sure it functions as intended?

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486796</commentid>
    <comment_count>8</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-19 08:01:03 -0700</bug_when>
    <thetext>See also:  http://code.google.com/p/chromium/issues/detail?id=84781</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>486797</commentid>
    <comment_count>9</comment_count>
      <attachid>111621</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-19 08:02:34 -0700</bug_when>
    <thetext>Created attachment 111621
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487368</commentid>
    <comment_count>10</comment_count>
      <attachid>111621</attachid>
    <who name="Vangelis Kokkevis">vangelis</who>
    <bug_when>2011-10-19 23:51:30 -0700</bug_when>
    <thetext>Comment on attachment 111621
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/Canvas2DLayerChromium.cpp:103
&gt; +    Extensions3DChromium* extensions = static_cast&lt;Extensions3DChromium*&gt;(m_context-&gt;getExtensions());

So what does the trace look like if you have multiple canvas&apos; on a single page?  Does throttling always kick in?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487540</commentid>
    <comment_count>11</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 07:08:48 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; So what does the trace look like if you have multiple canvas&apos; on a single page?  Does throttling always kick in?

Yes, the throttling works:  in my test case and on Fireflies startup, Canvas2DLayerChromium::rateLimitContext() shows up fairly high in the trace.

I&apos;ve attached that test case here too, since it shows pretty clearly how bad things are without this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487543</commentid>
    <comment_count>12</comment_count>
      <attachid>111766</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 07:10:13 -0700</bug_when>
    <thetext>Created attachment 111766
Test case w/16 animated 1Kx1K canvases and a short setTimeout()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487761</commentid>
    <comment_count>13</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 12:11:13 -0700</bug_when>
    <thetext>Ping?  James, Vangelis, Nat:  further comments/suggestions?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487786</commentid>
    <comment_count>14</comment_count>
      <attachid>111621</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-20 12:32:29 -0700</bug_when>
    <thetext>Comment on attachment 111621
Patch

The case where this patch doesn&apos;t work, I think, is where you had touched multiple canvases in different setTimeouts.

The rate limiter is here, btw: gpu/command_buffer/client/gles2_implementation.cc 

When you touch N canvases inside one setTimeout, we post N rateLimiting tasks. Effectively, N canvases looks like this to the command buffer client:
  for(i = 0 .. N)
    if(i &gt; 2)
      waitToken(i-2)
    setToken(i);
  }

But, if you managed to squeeze multiple setTimeouts into one frame, e.g. by chaining setTimeouts together and drawing to a different canvas each time, then you&apos;d get this on the client side:
  for(i = 0 .. N)
    if(i &gt; 2)
      waitToken(i-2)
    setToken(i);
    drawing commands for canvas i;
  }

Code that would do that would be:
  function renderAll() {
    var i = 0;
  for(i = 0 .. N)
    if(i &gt; 2)
      waitToken(i-2)
    setToken(i);
  }

For that case, you&apos;d get a performance penalty.

So, the question is, does the fact that we over-penalize multiple setTimeouts matter?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487797</commentid>
    <comment_count>15</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-20 12:46:56 -0700</bug_when>
    <thetext>The case that I think would overthrottle would be this:
  function fillAllCanvases(canvases[]) {
     var i = 0;
     function drawOne() {
        canvases[i].getContext(&apos;2d&apos;).fillRect(0,0,100,100);
        if (++i &lt; canvases.length)
          setTimeout(drawOne, 0);
     }
     setTimeout(drawOne, 0);
  }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487800</commentid>
    <comment_count>16</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 12:48:52 -0700</bug_when>
    <thetext>(In reply to comment #14)
&gt; (From update of attachment 111621 [details])
&gt; The case where this patch doesn&apos;t work, I think, is where you had touched multiple canvases in different setTimeouts.
&gt; 
&gt; The rate limiter is here, btw: gpu/command_buffer/client/gles2_implementation.cc 
&gt; 
&gt; When you touch N canvases inside one setTimeout, we post N rateLimiting tasks. Effectively, N canvases looks like this to the command buffer client:
&gt;   for(i = 0 .. N)
&gt;     if(i &gt; 2)
&gt;       waitToken(i-2)
&gt;     setToken(i);
&gt;   }
&gt; 
&gt; But, if you managed to squeeze multiple setTimeouts into one frame, e.g. by chaining setTimeouts together and drawing to a different canvas each time, then you&apos;d get this on the client side:

[elided]

That&apos;s a very good point, and explains why I wasn&apos;t running into this problem before:  all the examples I looked at had the drawing code all running in the same JS timer callback.

I&apos;m try to work up a test case with multiple setTimeouts to see how it looks with/without this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487809</commentid>
    <comment_count>17</comment_count>
      <attachid>111830</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 13:09:07 -0700</bug_when>
    <thetext>Created attachment 111830
Test case w/16 animated 1Kx1K canvases drawn on separate timeouts</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487826</commentid>
    <comment_count>18</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-20 13:25:34 -0700</bug_when>
    <thetext>My JS-fu is pretty weak, but I&apos;ve given it a shot (see attachment).

It runs at ~35FPS with this patch, and ~1FPS without it, basically identical to the single-timeout test case.  One strange thing is, both with and without this patch, there&apos;s a ~2 sec startup while it seems each canvas seems to allocate and does its first draw.  I didn&apos;t see that in the other test case. 

It&apos;s entirely possible I&apos;ve done something stupid in the JS, though.  I&apos;m going to try some variants with differing timeouts per-canvas.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>487842</commentid>
    <comment_count>19</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-20 13:44:35 -0700</bug_when>
    <thetext>Just guessing, but I&apos;d be curious about the performance of a 3 canvas case where the drawing in each canvas is actually time consuming. That is where things go bad --- here, since there&apos;s very little gpu-process side work to be done per canvas, a finish is of marginal impact.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489548</commentid>
    <comment_count>20</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-24 12:54:17 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; Just guessing, but I&apos;d be curious about the performance of a 3 canvas case where the drawing in each canvas is actually time consuming. That is where things go bad --- here, since there&apos;s very little gpu-process side work to be done per canvas, a finish is of marginal impact.

OK, I wrote up a 3-canvas test case with separate timers, and a heavier GPU load.  I&apos;ll attach it here.  However, it doesn&apos;t seem to have any worse performance with this patch than without it.

I agree with you that in theory, there should be some cases where having multiple rate limiting callbacks on the same context would be problematic, I can&apos;t seem to create one in practice.  Since this patch addresses known issues with known test cases, could we land it as-is, and see if we can find future problems in another patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489550</commentid>
    <comment_count>21</comment_count>
      <attachid>112236</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-24 12:55:18 -0700</bug_when>
    <thetext>Created attachment 112236
Test case w/3 canvases, separate timers and a heavy GPU load</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489582</commentid>
    <comment_count>22</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-24 13:41:19 -0700</bug_when>
    <thetext>Its really your call.

I have substantial respect for all the work you&apos;ve put in showing that the concern isnt important in practice. From a &quot;land it&quot; point of view, I&apos;m fine.

But, isn&apos;t the fix can just be to move the throttling timer up to CCLayerTreeHost. Is that not the case?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489625</commentid>
    <comment_count>23</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-24 14:02:34 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; Its really your call.
&gt; 
&gt; I have substantial respect for all the work you&apos;ve put in showing that the concern isnt important in practice. From a &quot;land it&quot; point of view, I&apos;m fine.
&gt; 
&gt; But, isn&apos;t the fix can just be to move the throttling timer up to CCLayerTreeHost. Is that not the case?

Yes, and the context to throttle.  It&apos;s definitely doable, just that I thought it was somewhat canvas-specific, since it&apos;s the only case that re-uses a single context for multiple layers, so baking that into CCLayerTreeHost felt weird to me, and it seemed to work fine hidden in Canvas2DLayerChromium.  But let me give it a try to see how it looks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490061</commentid>
    <comment_count>24</comment_count>
      <attachid>112343</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 09:06:02 -0700</bug_when>
    <thetext>Created attachment 112343
new approach using refactored RateLimiter class</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490068</commentid>
    <comment_count>25</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 09:32:53 -0700</bug_when>
    <thetext>The most recent patch refactors the</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490070</commentid>
    <comment_count>26</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 09:39:14 -0700</bug_when>
    <thetext>Be careful what you wish for... :) 

The most recent patch refactors the rate limiting from WebGL into its own class (RateLimiter).  This class is used internally by CCLayerTreeHost::startRateLimiter(ctx), which is called by Canvas2DLayerChromium and WebGLLayerChromium.  Canvas2DLayerChromium will always pass the same context; WebGL&apos;s will be different per-layer.  The context is hashed to find the appropriate RateLimiter, so canvas will only rate limit once for all canvas elements.

As threatened, I also refactored the WebGL layer invalidation (formerly WebGLLayerChromium::setTextureUpdated()) into the common path CanvasLayerChromium::contentChanged(), called by GraphicsContextLayer::setNeedsDisplay().  As a bonus, this aids in decoupling WebGLLayerChromium from GraphicsContext3D a bit (something twiz is grappling with in his DrawingBuffer refactor).

Note that RateLimiters are not currently deleted until the CCLayerTreeHost is freed.  I could actually delete them after the timer fires, but it would thrash memory a bit more (once per frame * numcontexts) and would also require checking for the extension every frame.  It does mean they may live longer than the context (they will just no longer be used).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490092</commentid>
    <comment_count>27</comment_count>
      <attachid>112343</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-25 10:06:50 -0700</bug_when>
    <thetext>Comment on attachment 112343
new approach using refactored RateLimiter class

This is awesome! Wrt the leak, maybe the right way to do this is to put the rate limiter on the WebGL layer, but put the rate limiter class on CCLTH? E.g.
   CanvasLayer::contentsChanged() {
     layerTreeHost()-&gt;getCanvasRateLimiter()-&gt;start()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490133</commentid>
    <comment_count>28</comment_count>
      <attachid>112343</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 10:43:03 -0700</bug_when>
    <thetext>Comment on attachment 112343
new approach using refactored RateLimiter class

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

&gt; Source/WebCore/platform/graphics/chromium/RateLimiter.h:53
&gt; +    GraphicsContext3D* m_context;

if this object doesn&apos;t take a reference to the GraphicsContext3D, then what assurance do you have that this GC3D still exists when the timer fires?  Couldn&apos;t it be GC&apos;d by this point if it was a WebGL context?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:436
&gt; +    ASSERT(context-&gt;getExtensions());

not sure why this ASSERT() is here</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490147</commentid>
    <comment_count>29</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 11:00:03 -0700</bug_when>
    <thetext>(In reply to comment #27)
&gt; (From update of attachment 112343 [details])
&gt; This is awesome! Wrt the leak, maybe the right way to do this is to put the rate limiter on the WebGL layer, but put the rate limiter class on CCLTH? E.g.
&gt;    CanvasLayer::contentsChanged() {
&gt;      layerTreeHost()-&gt;getCanvasRateLimiter()-&gt;start()

Interesting.  Not sure what the ownership semantics would be in that case.  It&apos;d be tempting to just have the layers ref a RateLimiter vended by the CCLTH, but since the CCLTH needs to do the hashing, it sort of needs to do the owning, too.

Another option would be to trigger off GraphicsContext3D destruction somehow to trigger destruction of the associated RateLimiter as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490176</commentid>
    <comment_count>30</comment_count>
      <attachid>112343</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 11:21:21 -0700</bug_when>
    <thetext>Comment on attachment 112343
new approach using refactored RateLimiter class

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/RateLimiter.h:53
&gt;&gt; +    GraphicsContext3D* m_context;
&gt; 
&gt; if this object doesn&apos;t take a reference to the GraphicsContext3D, then what assurance do you have that this GC3D still exists when the timer fires?  Couldn&apos;t it be GC&apos;d by this point if it was a WebGL context?

None, and yes.  This patch is a work-in-progress.  :)

I tried a few ways of breaking it, but couldn&apos;t.  It might be that the short fuse (0sec) of the timer prevents this, since a GC cycle can&apos;t sneak in, but I&apos;d rather not count on that.

I suppose another way to do this would be to have the GraphicsContext3D own the rate-limiting timer.  Then it would be certain never to outlive the GC3D, and we wouldn&apos;t need the hash either.

Yet another way would be find some place to hang a callback off V8-is-done-this-chunk-of-code, and use that instead of a timer.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:436
&gt;&gt; +    ASSERT(context-&gt;getExtensions());
&gt; 
&gt; not sure why this ASSERT() is here

Hysterical reasons.  Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490189</commentid>
    <comment_count>31</comment_count>
      <attachid>112367</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 11:44:23 -0700</bug_when>
    <thetext>Created attachment 112367
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490222</commentid>
    <comment_count>32</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 12:19:21 -0700</bug_when>
    <thetext>GC3D is refcounted so you could just grab a ref in the rate limiter, right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490248</commentid>
    <comment_count>33</comment_count>
      <attachid>112376</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 12:41:01 -0700</bug_when>
    <thetext>Created attachment 112376
new patch; added rate limiter cancelling</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490261</commentid>
    <comment_count>34</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 12:51:19 -0700</bug_when>
    <thetext>(In reply to comment #32)
&gt; GC3D is refcounted so you could just grab a ref in the rate limiter, right?

I could, but I&apos;m not a big fan of shared ownership semantics.

Instead, I added code in WebGLLayerChromium::setContext() to stop any pending rate limiter calls on the old context.  Let me know what you think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490271</commentid>
    <comment_count>35</comment_count>
      <attachid>112376</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-25 13:04:11 -0700</bug_when>
    <thetext>Comment on attachment 112376
new patch; added rate limiter cancelling

Thanks, this approach makes me much happier.

Recapping an offline conversation: I asked about having a start/stopRateLimiting method on CCLTH and not having the RateLimiter class at all. However, it was pointed out to me that such an approach then has issues with deciding m_contextSupportsRateLimiting. We could make chrome-specific assumptions at that point, but to me its a can of worms not worth pursuing since this whole thing will change with &quot;new scheduler.&quot;

So, LGTM unofficially. I&apos;m a bit too swamped to do a nit pass, can someone else jump in and make Stephen miserable? ;)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490337</commentid>
    <comment_count>36</comment_count>
      <attachid>112376</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 14:01:25 -0700</bug_when>
    <thetext>Comment on attachment 112376
new patch; added rate limiter cancelling

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

R=me, usual assortment of nits

&gt; Source/WebCore/platform/graphics/chromium/RateLimiter.cpp:8
&gt; + *     * Redistributions of source code must retain the above copyright

should use 2-clause license for new files

&gt; Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp:130
&gt; +    if (layerTreeHost() &amp;&amp; contextChanged)
&gt; +        layerTreeHost()-&gt;stopRateLimiter(m_context);

do we call setContext(NULL) before destroying a WebGLLayerChromium?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:438
&gt; +    RateLimiterMap::iterator i = m_rateLimiters.find(context);

we normally use &apos;it&apos; for iterators and reserve &apos;i&apos; for loop counters

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:450
&gt; +    RateLimiterMap::iterator i = m_rateLimiters.find(context);

same here - i-&gt;it

&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.h:53
&gt; +typedef HashMap&lt;GraphicsContext3D*, RefPtr&lt;RateLimiter&gt; &gt; RateLimiterMap;

you could put this typedef inside the class next to the declaration so it&apos;s not in the WebCore namespace</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490363</commentid>
    <comment_count>37</comment_count>
      <attachid>112403</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 14:30:28 -0700</bug_when>
    <thetext>Created attachment 112403
fixed nits</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490365</commentid>
    <comment_count>38</comment_count>
      <attachid>112376</attachid>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-25 14:32:15 -0700</bug_when>
    <thetext>Comment on attachment 112376
new patch; added rate limiter cancelling

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

&gt;&gt; Source/WebCore/platform/graphics/chromium/RateLimiter.cpp:8
&gt;&gt; + *     * Redistributions of source code must retain the above copyright
&gt; 
&gt; should use 2-clause license for new files

Done.

&gt;&gt; Source/WebCore/platform/graphics/chromium/WebGLLayerChromium.cpp:130
&gt;&gt; +        layerTreeHost()-&gt;stopRateLimiter(m_context);
&gt; 
&gt; do we call setContext(NULL) before destroying a WebGLLayerChromium?

Dunno, but I put a call to stopRateLimiter() in the destructor, just in case.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:438
&gt;&gt; +    RateLimiterMap::iterator i = m_rateLimiters.find(context);
&gt; 
&gt; we normally use &apos;it&apos; for iterators and reserve &apos;i&apos; for loop counters

Done.

&gt;&gt; Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp:450
&gt;&gt; +    RateLimiterMap::iterator i = m_rateLimiters.find(context);
&gt; 
&gt; same here - i-&gt;it

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490788</commentid>
    <comment_count>39</comment_count>
    <who name="Stephen White">senorblanco</who>
    <bug_when>2011-10-26 06:24:14 -0700</bug_when>
    <thetext>Committed r98471: &lt;http://trac.webkit.org/changeset/98471&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>111506</attachid>
            <date>2011-10-18 14:37:52 -0700</date>
            <delta_ts>2011-10-19 08:02:30 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70367-20111018173750.patch</filename>
            <type>text/plain</type>
            <size>5555</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk3NzkwKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTEtMTAtMTggIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MDM2NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMgaW4gZmFzdC9jYW52YXMvIGFuZCBjYW52YXMv
cGhpbGlwLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRM
YXllckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1
bTo6Q2FudmFzMkRMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5
ZXJDaHJvbWl1bTo6ZHJhd3NDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5
ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzMkRM
YXllckNocm9taXVtOjpyYXRlTGltaXRDb250ZXh0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorCiAyMDEx
LTEwLTE4ICBKdWxpZW4gQ2hhZmZyYWl4ICA8amNoYWZmcmFpeEB3ZWJraXQub3JnPgogCiAgICAg
ICAgIENyYXNoIGluIFJlbmRlckRlcHJlY2F0ZWRGbGV4aWJsZUJveDo6bGF5b3V0SG9yaXpvbnRh
bEJveApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2Fu
dmFzMkRMYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lv
biA5Nzc4NSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0Nh
bnZhczJETGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAK
IAogI2luY2x1ZGUgIkV4dGVuc2lvbnMzRENocm9taXVtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0M0QuaCIKKyNpbmNsdWRlICJMYXllclJlbmRlcmVyQ2hyb21pdW0uaCIKIAogI2lmIFVT
RShTS0lBKQogI2luY2x1ZGUgIkdyQ29udGV4dC5oIgpAQCAtNTEsNyArNTIsMTIgQEAgUGFzc1Jl
ZlB0cjxDYW52YXMyRExheWVyQ2hyb21pdW0+IENhbnZhcwogQ2FudmFzMkRMYXllckNocm9taXVt
OjpDYW52YXMyRExheWVyQ2hyb21pdW0oR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpCiAgICAg
OiBDYW52YXNMYXllckNocm9taXVtKDApCiAgICAgLCBtX2NvbnRleHQoY29udGV4dCkKKyAgICAs
IG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uKGZhbHNlKQorICAgICwgbV9y
YXRlTGltaXRpbmdUaW1lcih0aGlzLCAmQ2FudmFzMkRMYXllckNocm9taXVtOjpyYXRlTGltaXRD
b250ZXh0KQogeworICAgIEFTU0VSVChjb250ZXh0KTsKKyAgICBBU1NFUlQoY29udGV4dC0+Z2V0
RXh0ZW5zaW9ucygpKTsKKyAgICBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lv
biA9IGNvbnRleHQtPmdldEV4dGVuc2lvbnMoKS0+c3VwcG9ydHMoIkdMX0NIUk9NSVVNX3JhdGVf
bGltaXRfb2Zmc2NyZWVuX2NvbnRleHQiKTsKIH0KIAogQ2FudmFzMkRMYXllckNocm9taXVtOjp+
Q2FudmFzMkRMYXllckNocm9taXVtKCkKQEAgLTYwLDggKzY2LDcgQEAgQ2FudmFzMkRMYXllckNo
cm9taXVtOjp+Q2FudmFzMkRMYXllckNocgogCiBib29sIENhbnZhczJETGF5ZXJDaHJvbWl1bTo6
ZHJhd3NDb250ZW50KCkgY29uc3QKIHsKLSAgICByZXR1cm4gbV90ZXh0dXJlSWQgJiYgKG1fY29u
dGV4dAotICAgICAgICAgICAgJiYgKG1fY29udGV4dC0+Z2V0RXh0ZW5zaW9ucygpLT5nZXRHcmFw
aGljc1Jlc2V0U3RhdHVzQVJCKCkgPT0gR3JhcGhpY3NDb250ZXh0M0Q6Ok5PX0VSUk9SKSk7Cisg
ICAgcmV0dXJuIChtX2NvbnRleHQtPmdldEV4dGVuc2lvbnMoKS0+Z2V0R3JhcGhpY3NSZXNldFN0
YXR1c0FSQigpID09IEdyYXBoaWNzQ29udGV4dDNEOjpOT19FUlJPUik7CiB9CiAKIHZvaWQgQ2Fu
dmFzMkRMYXllckNocm9taXVtOjp1cGRhdGVDb21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29u
dGV4dDNEKiwgVGV4dHVyZUFsbG9jYXRvciopCkBAIC04NCw1ICs4OSwxOCBAQCB2b2lkIENhbnZh
czJETGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zCiAgICAgcmVzZXROZWVkc0Rpc3BsYXkoKTsK
IH0KIAordm9pZCBDYW52YXMyRExheWVyQ2hyb21pdW06OmNvbnRlbnRDaGFuZ2VkKCkKK3sKKyAg
ICBpZiAobGF5ZXJUcmVlSG9zdCgpICYmICFsYXllclRyZWVIb3N0KCktPmFuaW1hdGluZygpICYm
IG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uICYmICFtX3JhdGVMaW1pdGlu
Z1RpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fcmF0ZUxpbWl0aW5nVGltZXIuc3RhcnRPbmVT
aG90KDApOworfQorCit2b2lkIENhbnZhczJETGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4
dChUaW1lcjxDYW52YXMyRExheWVyQ2hyb21pdW0+KikKK3sKKyAgICBFeHRlbnNpb25zM0RDaHJv
bWl1bSogZXh0ZW5zaW9ucyA9IHN0YXRpY19jYXN0PEV4dGVuc2lvbnMzRENocm9taXVtKj4obV9j
b250ZXh0LT5nZXRFeHRlbnNpb25zKCkpOworCisgICAgZXh0ZW5zaW9ucy0+cmF0ZUxpbWl0T2Zm
c2NyZWVuQ29udGV4dENIUk9NSVVNKCk7Cit9CisKIH0KICNlbmRpZiAvLyBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAko
cmV2aXNpb24gOTc3ODUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtMzUsNiArMzUs
NyBAQAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKIAogI2luY2x1ZGUgIkNhbnZh
c0xheWVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJUaW1lci5oIgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKQEAgLTQ4LDExICs0OSwxNCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIGRyYXdz
Q29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgVGV4dHVyZUFsbG9jYXRvciopOwogCi0gICAgdm9pZCBz
ZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpOwor
ICAgIHZvaWQgcmF0ZUxpbWl0Q29udGV4dChUaW1lcjxDYW52YXMyRExheWVyQ2hyb21pdW0+Kik7
CiAKIHByaXZhdGU6CiAgICAgZXhwbGljaXQgQ2FudmFzMkRMYXllckNocm9taXVtKEdyYXBoaWNz
Q29udGV4dDNEKik7CiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKKyAgICBib29s
IG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uOworICAgIFRpbWVyPENhbnZh
czJETGF5ZXJDaHJvbWl1bT4gbV9yYXRlTGltaXRpbmdUaW1lcjsKIH07CiAKIH0KSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJv
bWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gOTc3ODUpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hy
b21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDcsOCArMzA3LDEwIEBAIHZvaWQgR3JhcGhp
Y3NMYXllckNocm9taXVtOjpzZXRSZXBsaWNhdGUKIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21p
dW06OnNldENvbnRlbnRzTmVlZHNEaXNwbGF5KCkKIHsKLSAgICBpZiAobV9jb250ZW50c0xheWVy
KQorICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKICAgICAgICAgbV9jb250ZW50c0xheWVyLT5z
ZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgbV9jb250ZW50c0xheWVyLT5jb250ZW50Q2hhbmdl
ZCgpOworICAgIH0KIH0KIAogdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldE5lZWRzRGlz
cGxheSgpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9M
YXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA5Nzc4NSkKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAkod29y
a2luZyBjb3B5KQpAQCAtMTk1LDYgKzE5NSw3IEBAIHB1YmxpYzoKIAogICAgIC8vIFJldHVybnMg
dHJ1ZSBpZiBhbnkgb2YgdGhlIGxheWVyJ3MgZGVzY2VuZGFudHMgaGFzIGNvbnRlbnQgdG8gZHJh
dy4KICAgICBib29sIGRlc2NlbmRhbnREcmF3c0NvbnRlbnQoKTsKKyAgICB2aXJ0dWFsIHZvaWQg
Y29udGVudENoYW5nZWQoKSB7IH0KIAogICAgIENDTGF5ZXJUcmVlSG9zdCogbGF5ZXJUcmVlSG9z
dCgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5ZXJUcmVlSG9zdC5nZXQoKTsgfQogICAgIHZvaWQgY2xl
YW51cFJlc291cmNlc1JlY3Vyc2l2ZSgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>111621</attachid>
            <date>2011-10-19 08:02:34 -0700</date>
            <delta_ts>2011-10-25 09:05:57 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70367-20111019110233.patch</filename>
            <type>text/plain</type>
            <size>5174</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk3ODYxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTEtMTAtMTggIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD03MDM2NworCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAg
ICAgIENvdmVyZWQgYnkgZXhpc3RpbmcgdGVzdHMgaW4gZmFzdC9jYW52YXMvIGFuZCBjYW52YXMv
cGhpbGlwLgorCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRM
YXllckNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1
bTo6Q2FudmFzMkRMYXllckNocm9taXVtKToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5
ZXJDaHJvbWl1bTo6ZHJhd3NDb250ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5
ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q2FudmFzMkRM
YXllckNocm9taXVtOjpyYXRlTGltaXRDb250ZXh0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50c05lZWRzRGlzcGxheSk6
CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oOgor
ICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorCiAyMDEx
LTEwLTE5ICBDaHJpcyBGbGVpemFjaCAgPGNmbGVpemFjaEBhcHBsZS5jb20+CiAKICAgICAgICAg
QVg6IGJ1dHRvbnMgb2YgbnVtYmVyIHR5cGUgPGlucHV0PiBjb250cm9scyBhcmUgbm90IGZ1bGx5
IGFjY2Vzc2libGUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNwcAko
cmV2aXNpb24gOTc4NjEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw2ICsz
Niw3IEBACiAKICNpbmNsdWRlICJFeHRlbnNpb25zM0RDaHJvbWl1bS5oIgogI2luY2x1ZGUgIkdy
YXBoaWNzQ29udGV4dDNELmgiCisjaW5jbHVkZSAiTGF5ZXJSZW5kZXJlckNocm9taXVtLmgiCiAK
ICNpZiBVU0UoU0tJQSkKICNpbmNsdWRlICJHckNvbnRleHQuaCIKQEAgLTUxLDcgKzUyLDEyIEBA
IFBhc3NSZWZQdHI8Q2FudmFzMkRMYXllckNocm9taXVtPiBDYW52YXMKIENhbnZhczJETGF5ZXJD
aHJvbWl1bTo6Q2FudmFzMkRMYXllckNocm9taXVtKEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0
KQogICAgIDogQ2FudmFzTGF5ZXJDaHJvbWl1bSgwKQogICAgICwgbV9jb250ZXh0KGNvbnRleHQp
CisgICAgLCBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lvbihmYWxzZSkKKyAg
ICAsIG1fcmF0ZUxpbWl0aW5nVGltZXIodGhpcywgJkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6cmF0
ZUxpbWl0Q29udGV4dCkKIHsKKyAgICBBU1NFUlQoY29udGV4dCk7CisgICAgQVNTRVJUKGNvbnRl
eHQtPmdldEV4dGVuc2lvbnMoKSk7CisgICAgbV9jb250ZXh0U3VwcG9ydHNSYXRlTGltaXRpbmdF
eHRlbnNpb24gPSBjb250ZXh0LT5nZXRFeHRlbnNpb25zKCktPnN1cHBvcnRzKCJHTF9DSFJPTUlV
TV9yYXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7CiB9CiAKIENhbnZhczJETGF5ZXJDaHJv
bWl1bTo6fkNhbnZhczJETGF5ZXJDaHJvbWl1bSgpCkBAIC04NCw1ICs5MCwyMCBAQCB2b2lkIENh
bnZhczJETGF5ZXJDaHJvbWl1bTo6dXBkYXRlQ29tcG9zCiAgICAgcmVzZXROZWVkc0Rpc3BsYXko
KTsKIH0KIAordm9pZCBDYW52YXMyRExheWVyQ2hyb21pdW06OmNvbnRlbnRDaGFuZ2VkKCkKK3sK
KyAgICBpZiAobGF5ZXJUcmVlSG9zdCgpICYmICFsYXllclRyZWVIb3N0KCktPmFuaW1hdGluZygp
ICYmIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uICYmICFtX3JhdGVMaW1p
dGluZ1RpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fcmF0ZUxpbWl0aW5nVGltZXIuc3RhcnRP
bmVTaG90KDApOworfQorCit2b2lkIENhbnZhczJETGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29u
dGV4dChUaW1lcjxDYW52YXMyRExheWVyQ2hyb21pdW0+KikKK3sKKyAgICBUUkFDRV9FVkVOVCgi
Q2FudmFzMkRMYXllckNocm9taXVtOjpyYXRlTGltaXRDb250ZXh0IiwgdGhpcywgMCk7CisKKyAg
ICBFeHRlbnNpb25zM0RDaHJvbWl1bSogZXh0ZW5zaW9ucyA9IHN0YXRpY19jYXN0PEV4dGVuc2lv
bnMzRENocm9taXVtKj4obV9jb250ZXh0LT5nZXRFeHRlbnNpb25zKCkpOworCisgICAgZXh0ZW5z
aW9ucy0+cmF0ZUxpbWl0T2Zmc2NyZWVuQ29udGV4dENIUk9NSVVNKCk7Cit9CisKIH0KICNlbmRp
ZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMy
RExheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gOTc4NjEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkod29ya2luZyBj
b3B5KQpAQCAtMzUsNiArMzUsNyBAQAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykK
IAogI2luY2x1ZGUgIkNhbnZhc0xheWVyQ2hyb21pdW0uaCIKKyNpbmNsdWRlICJUaW1lci5oIgog
CiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTQ4LDExICs0OSwxNCBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgVGV4dHVyZUFsbG9jYXRv
ciopOwogCi0gICAgdm9pZCBzZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBj
b250ZW50Q2hhbmdlZCgpOworICAgIHZvaWQgcmF0ZUxpbWl0Q29udGV4dChUaW1lcjxDYW52YXMy
RExheWVyQ2hyb21pdW0+Kik7CiAKIHByaXZhdGU6CiAgICAgZXhwbGljaXQgQ2FudmFzMkRMYXll
ckNocm9taXVtKEdyYXBoaWNzQ29udGV4dDNEKik7CiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1f
Y29udGV4dDsKKyAgICBib29sIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9u
OworICAgIFRpbWVyPENhbnZhczJETGF5ZXJDaHJvbWl1bT4gbV9yYXRlTGltaXRpbmdUaW1lcjsK
IH07CiAKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAkocmV2
aXNpb24gOTc4NjEpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMDcsOCArMzA3
LDEwIEBAIHZvaWQgR3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRSZXBsaWNhdGUKIAogdm9pZCBH
cmFwaGljc0xheWVyQ2hyb21pdW06OnNldENvbnRlbnRzTmVlZHNEaXNwbGF5KCkKIHsKLSAgICBp
ZiAobV9jb250ZW50c0xheWVyKQorICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpIHsKICAgICAgICAg
bV9jb250ZW50c0xheWVyLT5zZXROZWVkc0Rpc3BsYXkoKTsKKyAgICAgICAgbV9jb250ZW50c0xh
eWVyLT5jb250ZW50Q2hhbmdlZCgpOworICAgIH0KIH0KIAogdm9pZCBHcmFwaGljc0xheWVyQ2hy
b21pdW06OnNldE5lZWRzRGlzcGxheSgpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9MYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lv
biA5Nzg2MSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xh
eWVyQ2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtMTk1LDYgKzE5NSw3IEBAIHB1YmxpYzoK
IAogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGxheWVyJ3MgZGVzY2VuZGFudHMg
aGFzIGNvbnRlbnQgdG8gZHJhdy4KICAgICBib29sIGRlc2NlbmRhbnREcmF3c0NvbnRlbnQoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgY29udGVudENoYW5nZWQoKSB7IH0KIAogICAgIENDTGF5ZXJUcmVl
SG9zdCogbGF5ZXJUcmVlSG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1fbGF5ZXJUcmVlSG9zdC5nZXQo
KTsgfQogICAgIHZvaWQgY2xlYW51cFJlc291cmNlc1JlY3Vyc2l2ZSgpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>111766</attachid>
            <date>2011-10-20 07:10:13 -0700</date>
            <delta_ts>2011-10-20 07:10:13 -0700</delta_ts>
            <desc>Test case w/16 animated 1Kx1K canvases and a short setTimeout()</desc>
            <filename>canvas-anim-in-layers.html</filename>
            <type>text/html</type>
            <size>853</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPjxoZWFkPgo8dGl0bGU+Q29tcG9zaXRlZCBjYW52YXNlcyB3
aXRoIGludGVybmFsIGFuaW1hdGlvbjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxzY3JpcHQ+CnZh
ciBzaXplID0gMTAyNDsKdmFyIG51bUNhbnZhc2VzID0gMTY7CnZhciBjYW52YXMgPSBuZXcgQXJy
YXkoKTsKdmFyIHNxdWFyZVNpemUgPSBzaXplIC8gbnVtQ2FudmFzZXM7CmZvciAoaSA9IDA7IGkg
PCBudW1DYW52YXNlczsgaSsrKSB7CiAgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJj
YW52YXMiKTsKICBjLndpZHRoID0gYy5oZWlnaHQgPSBzaXplOwogIGMuc3R5bGUubGVmdCA9IGMu
c3R5bGUudG9wID0gIjBweCI7CiAgYy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgZG9j
dW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTsKICBjYW52YXNbaV0gPSBjOwp9CgpmdW5jdGlvbiBy
ZWRyYXcoKSB7CiAgdmFyIGk7CiAgZm9yIChpID0gMDsgaSA8IG51bUNhbnZhc2VzOyBpKyspIHsK
ICAgIHZhciBjID0gY2FudmFzW2ldOwogICAgICB2YXIgY3R4ID0gYy5nZXRDb250ZXh0KCIyZCIp
OwogICAgICBjdHguY2xlYXJSZWN0KDAsIDAsIGMud2lkdGgsIGMuaGVpZ2h0KTsKICAgICAgY3R4
LmZpbGxTdHlsZSA9ICJyZ2JhKDAsIDAsIDI1NSwgMC41KSI7CiAgICAgIGN0eC5maWxsUmVjdChN
YXRoLnJhbmRvbSgpICogYy53aWR0aCwgTWF0aC5yYW5kb20oKSAqIGMuaGVpZ2h0LCBzcXVhcmVT
aXplLCBzcXVhcmVTaXplKTsKICB9CiAgd2luZG93LnNldFRpbWVvdXQocmVkcmF3LCAxKTsKfQp3
aW5kb3cuc2V0VGltZW91dChyZWRyYXcsIDEpOwo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>111830</attachid>
            <date>2011-10-20 13:09:07 -0700</date>
            <delta_ts>2011-10-20 13:09:07 -0700</delta_ts>
            <desc>Test case w/16 animated 1Kx1K canvases drawn on separate timeouts</desc>
            <filename>canvas-anim-in-layers-separate-timeouts.html</filename>
            <type>text/html</type>
            <size>795</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPjxoZWFkPgo8dGl0bGU+Q29tcG9zaXRlZCBjYW52YXNlcyB3
aXRoIGludGVybmFsIGFuaW1hdGlvbjwvdGl0bGU+CjwvaGVhZD4KPGJvZHk+CjxzY3JpcHQ+CnZh
ciBzaXplID0gMTAyNDsKdmFyIG51bUNhbnZhc2VzID0gMTY7CnZhciBjYW52YXMgPSBuZXcgQXJy
YXkoKTsKdmFyIHNxdWFyZVNpemUgPSBzaXplIC8gbnVtQ2FudmFzZXM7CgpmdW5jdGlvbiByZWRy
YXcoaSkgewogIHZhciBjID0gY2FudmFzW2ldOwogIHZhciBjdHggPSBjLmdldENvbnRleHQoIjJk
Iik7CiAgY3R4LmNsZWFyUmVjdCgwLCAwLCBjLndpZHRoLCBjLmhlaWdodCk7CiAgY3R4LmZpbGxT
dHlsZSA9ICJyZ2JhKDAsIDAsIDI1NSwgMC41KSI7CiAgY3R4LmZpbGxSZWN0KE1hdGgucmFuZG9t
KCkgKiBjLndpZHRoLCBNYXRoLnJhbmRvbSgpICogYy5oZWlnaHQsIHNxdWFyZVNpemUsIHNxdWFy
ZVNpemUpOwogIHdpbmRvdy5zZXRUaW1lb3V0KHJlZHJhdywgMiwgaSk7Cn0KCmZvciAoaSA9IDA7
IGkgPCBudW1DYW52YXNlczsgaSsrKSB7CiAgdmFyIGMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCJjYW52YXMiKTsKICBjLndpZHRoID0gYy5oZWlnaHQgPSBzaXplOwogIGMuc3R5bGUubGVmdCA9
IGMuc3R5bGUudG9wID0gIjBweCI7CiAgYy5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAg
ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjKTsKICBjYW52YXNbaV0gPSBjOwogIHdpbmRvdy5z
ZXRUaW1lb3V0KHJlZHJhdywgMiwgaSk7Cn0KCjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>112236</attachid>
            <date>2011-10-24 12:55:18 -0700</date>
            <delta_ts>2011-10-24 12:55:18 -0700</delta_ts>
            <desc>Test case w/3 canvases, separate timers and a heavy GPU load</desc>
            <filename>canvas-radial-blur.html</filename>
            <type>text/html</type>
            <size>1405</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIEhUTUw+CjxodG1sPgo8aGVhZD4KPC9oZWFkPgo8Ym9keT4KPHAgaWQ9ImRlc2Ny
aXB0aW9uIj48L3A+CjxzY3JpcHQ+Cgp2YXIgaXRlcnMgPSAxMDsKdmFyIG51bVNxdWFyZXMgPSAy
Owp2YXIgY2FudmFzU2l6ZSA9IDEwMjQ7CnZhciBudW1DYW52YXNlcyA9IDM7Cgp2YXIgY2FudmFz
ID0gbmV3IEFycmF5KCk7CnZhciBhbmdsZSA9IG5ldyBBcnJheSgpOwoKZm9yIChpID0gMDsgaSA8
IG51bUNhbnZhc2VzOyBpKyspIHsKICB2YXIgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNh
bnZhcyIpOwogIGMud2lkdGggPSBjLmhlaWdodCA9IGNhbnZhc1NpemU7CiAgYy5zdHlsZS5sZWZ0
ID0gYy5zdHlsZS50b3AgPSAiMHB4IjsKICBjLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsK
ICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGMpOwogIGNhbnZhc1tpXSA9IGM7CiAgYW5nbGVb
aV0gPSAwOwogIHdpbmRvdy5zZXRUaW1lb3V0KCJyZWRyYXcoIitpKyIpIiwgMTAgKiAoaSArIDEp
KTsKfQoKZnVuY3Rpb24gcmVkcmF3KGkpIHsKICB2YXIgYyA9IGNhbnZhc1tpXTsKICB2YXIgY3R4
ID0gYy5nZXRDb250ZXh0KCIyZCIpOwogIGN0eC5jbGVhclJlY3QoMCwgMCwgYy53aWR0aCwgYy5o
ZWlnaHQpOwogIGN0eC5nbG9iYWxBbHBoYSA9IDEgLyBpdGVycyAvIG51bUNhbnZhc2VzOwogIHZh
ciB3aWR0aCA9IGMud2lkdGggLyBudW1TcXVhcmVzOwogIHZhciBoZWlnaHQgPSBjLmhlaWdodCAv
IG51bVNxdWFyZXM7CiAgdmFyIGh1ZSA9IGkgLyBudW1DYW52YXNlcyAqIDM2MDsKICBmb3IgKHZh
ciBpdGVyID0gMDsgaXRlciA8IGl0ZXJzOyBpdGVyKyspIHsKICAgIGN0eC5zYXZlKCk7CiAgICBj
dHgudHJhbnNsYXRlKGMud2lkdGggLyAyLCBjLmhlaWdodCAvIDIpOwogICAgY3R4LnJvdGF0ZShh
bmdsZVtpXSk7CiAgICBjdHgudHJhbnNsYXRlKC1jLndpZHRoIC8gMiwgLWMuaGVpZ2h0IC8gMik7
CiAgICBhbmdsZVtpXSArPSAwLjAxMDsKICAgIGN0eC5maWxsU3R5bGUgPSAiaHNsKCIgKyBodWUg
KyAiLCAxMDAlLCA1MCUpIjsKICAgIHZhciBib3JkZXIgPSB3aWR0aCAqIDAuMjsKICAgIGZvciAo
dmFyIGogPSAwOyBqIDwgbnVtU3F1YXJlczsgaisrKSB7CiAgICAgIGZvciAodmFyIGsgPSAwOyBr
IDwgbnVtU3F1YXJlczsgaysrKSB7CiAgICAgICAgY3R4LmZpbGxSZWN0KGogKiB3aWR0aCArIGJv
cmRlciwgayAqIGhlaWdodCArIGJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSBi
b3JkZXIgKiAyLCBoZWlnaHQgLSBib3JkZXIgKiAyKTsKICAgICAgfQogICAgfQogICAgY3R4LnJl
c3RvcmUoKTsKICB9CiAgd2luZG93LnNldFRpbWVvdXQoInJlZHJhdygiK2krIikiLCAxMCAqIChp
ICsgMSkpOwp9Cgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112343</attachid>
            <date>2011-10-25 09:06:02 -0700</date>
            <delta_ts>2011-10-25 11:44:17 -0700</delta_ts>
            <desc>new approach using refactored RateLimiter class</desc>
            <filename>bug-70367-20111025120600.patch</filename>
            <type>text/plain</type>
            <size>19251</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4MzQ4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTIgQEAKKzIwMTEtMTAtMjUgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzAzNjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBTYWRseSwgd2UgZG9uJ3QgaGF2ZSBpbmZyYXN0cnVjdHVyZSB0byB0ZXN0IHRoaXMga2lu
ZCBvZiBHUFUgc3dhbXBpbmcKKyAgICAgICAgeWV0LgorCisgICAgICAgICogV2ViQ29yZS5neXBp
OgorICAgICAgICBBZGRlZCBSYXRlTGltaXRlciB0byB0aGUgQ2hyb21pdW0gYnVpbGQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5n
ZWQpOgorICAgICAgICBXaGVuIHRoZSBsYXllciBpcyBub3RpZmllZCB0aGF0IHRoZSBjb250ZW50
cyBoYXZlIGNoYW5nZWQsIHBpbmcgdGhlCisgICAgICAgIHJhdGUgbGltaXRlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50
c05lZWRzRGlzcGxheSk6CisgICAgICAgIENhbGwgKG5ldykgdmlydHVhbCBjb250ZW50Q2hhbmdl
ZCgpIG9uIGEgbGF5ZXIgd2hlbiBpdHMgY29udGVudHMgaGF2ZQorICAgICAgICBiZWVuIGNoYW5n
ZWQgKGUuZy4sIGJ5IGEgZHJhd2luZyBjYWxsKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIE5ldyB2aXJ0dWFsIGNvbnRlbnRD
aGFuZ2VkKCkuCisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdl
ZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVMaW1pdGVyOjpjcmVhdGUpOgorICAgICAg
ICBSYXRlIGxpbWl0ZXIgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVM
aW1pdGVyOjpSYXRlTGltaXRlcik6CisgICAgICAgIChXZWJDb3JlOjpSYXRlTGltaXRlcjo6c3Rh
cnQpOgorICAgICAgICBQdWJsaWMgQVBJIHRvIHN0YXJ0IHJhdGUgbGltaXRpbmcgYSBjb250ZXh0
LgorICAgICAgICAoV2ViQ29yZTo6UmF0ZUxpbWl0ZXI6OnJhdGVMaW1pdENvbnRleHQpOgorICAg
ICAgICBJbnRlcm5hbCB0aW1lciBjYWxsYmFjayB3aGVuIGEgY29udGV4dCBzaG91bGQgYmUgcmF0
ZSBsaW1pdGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1p
dGVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdM
TGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTExheWVyQ2hyb21pdW06
OldlYkdMTGF5ZXJDaHJvbWl1bSk6CisgICAgICAgIFJlbW92ZSByYXRlIGxpbWl0aW5nIHRpbWVy
IGFuZCBleHRlbnNpb24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4KKyAgICAgICAgKFdl
YkNvcmU6OldlYkdMTGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorICAgICAgICBzZXRU
ZXh0dXJlVXBkYXRlZCgpIHJlbmFtZWQgdG8gY29udGVudENoYW5nZWQoKSB0byBvdmVycmlkZSAK
KyAgICAgICAgYmFzZSBjbGFzcyB2aXJ0dWFsLiAgQ2FsbCByYXRlIGxpbWl0aW5nIGluIENDTGF5
ZXJUcmVlSG9zdCBvbgorICAgICAgICBjb250ZW50IGNoYW5nZS4KKyAgICAgICAgKFdlYkNvcmU6
OldlYkdMTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGV4dCk6CisgICAgICAgIFJlbW92ZSBleHRlbnNp
b24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgUmVtb3ZlIHJhdGUg
bGltaXRpbmcgdGltZXIgYW5kIGV4dGVuc2lvbiBjaGVjayAobW92ZWQgdG8gUmF0ZUxpbWl0ZXIp
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9z
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3Q6OnN0YXJ0UmF0ZUxpbWl0
ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVl
SG9zdC5oOgorICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBwZXItR3JhcGhpY3NDb250ZXh0M0Qg
UmF0ZUxpbWl0ZXIuCisKIDIwMTEtMTAtMjUgIFl1cnkgU2VtaWtoYXRza3kgIDx5dXJ5c0BjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogcmVkZXNpZ24gd29ya2VycyBzaWRl
YmFyIHBhbmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDk4MzQ3KQorKysgU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0zNDk2LDYgKzM0OTYsOCBA
QAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1BsdWdpbkxheWVyQ2hy
b21pdW0uaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUHJvZ3Jh
bUJpbmRpbmcuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Q
cm9ncmFtQmluZGluZy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9SYXRlTGltaXRlci5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL1JhdGVMaW1pdGVyLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaGFkZXJDaHJvbWl1bS5jcHAnLApJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9t
aXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJv
bWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgIkV4
dGVuc2lvbnMzRENocm9taXVtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNp
bmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3QuaCIKIAogI2lmIFVTRShTS0lBKQogI2luY2x1ZGUg
IkdyQ29udGV4dC5oIgpAQCAtODQsNSArODUsMTEgQEAgdm9pZCBDYW52YXMyRExheWVyQ2hyb21p
dW06OnVwZGF0ZUNvbXBvcwogICAgIHJlc2V0TmVlZHNEaXNwbGF5KCk7CiB9CiAKK3ZvaWQgQ2Fu
dmFzMkRMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgpCit7CisgICAgaWYgKGxheWVyVHJl
ZUhvc3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJhdGVMaW1pdGVyKG1fY29u
dGV4dCk7Cit9CisKIH0KICNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExh
eWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gOTgzNDcpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVy
Q2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgVGV4dHVyZUFsbG9jYXRv
ciopOwogCi0gICAgdm9pZCBzZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBj
b250ZW50Q2hhbmdlZCgpOwogCiBwcml2YXRlOgogICAgIGV4cGxpY2l0IENhbnZhczJETGF5ZXJD
aHJvbWl1bShHcmFwaGljc0NvbnRleHQzRCopOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xh
eWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwNyw4ICszMDcsMTAgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNl
dFJlcGxpY2F0ZQogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHNOZWVk
c0Rpc3BsYXkoKQogewotICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgaWYgKG1fY29udGVu
dHNMYXllcikgewogICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOwor
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPmNvbnRlbnRDaGFuZ2VkKCk7CisgICAgfQogfQogCiB2
b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KCkKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXll
ckNocm9taXVtLmgJKHJldmlzaW9uIDk4MzQ3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTUs
NiArMTk1LDcgQEAgcHVibGljOgogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUg
bGF5ZXIncyBkZXNjZW5kYW50cyBoYXMgY29udGVudCB0byBkcmF3LgogICAgIGJvb2wgZGVzY2Vu
ZGFudERyYXdzQ29udGVudCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsg
fQogCiAgICAgQ0NMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KCkgY29uc3QgeyByZXR1cm4g
bV9sYXllclRyZWVIb3N0LmdldCgpOyB9CiAgICAgdm9pZCBjbGVhbnVwUmVzb3VyY2VzUmVjdXJz
aXZlKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9S
YXRlTGltaXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiUmF0ZUxpbWl0ZXIuaCIKKworI2luY2x1
ZGUgIkV4dGVuc2lvbnMzRENocm9taXVtLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKKyNpbmNsdWRlICJUcmFjZUV2ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFz
c1JlZlB0cjxSYXRlTGltaXRlcj4gUmF0ZUxpbWl0ZXI6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQz
RCogY29udGV4dCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJhdGVMaW1pdGVyKGNvbnRl
eHQpKTsKK30KKworUmF0ZUxpbWl0ZXI6OlJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKiBj
b250ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX3RpbWVyKHRoaXMsICZS
YXRlTGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCkKK3sKKyAgICBBU1NFUlQoY29udGV4dCk7Cisg
ICAgQVNTRVJUKGNvbnRleHQtPmdldEV4dGVuc2lvbnMoKSk7CisgICAgbV9jb250ZXh0U3VwcG9y
dHNSYXRlTGltaXRpbmdFeHRlbnNpb24gPSBjb250ZXh0LT5nZXRFeHRlbnNpb25zKCktPnN1cHBv
cnRzKCJHTF9DSFJPTUlVTV9yYXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7Cit9CisKK3Zv
aWQgUmF0ZUxpbWl0ZXI6OnN0YXJ0KCkKK3sKKyAgICBpZiAobV9jb250ZXh0U3VwcG9ydHNSYXRl
TGltaXRpbmdFeHRlbnNpb24gJiYgIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV90aW1l
ci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgUmF0ZUxpbWl0ZXI6OnJhdGVMaW1pdENvbnRl
eHQoVGltZXI8UmF0ZUxpbWl0ZXI+KikKK3sKKyAgICBUUkFDRV9FVkVOVCgiUmF0ZUxpbWl0ZXI6
OnJhdGVMaW1pdENvbnRleHQiLCB0aGlzLCAwKTsKKworICAgIEV4dGVuc2lvbnMzRENocm9taXVt
KiBleHRlbnNpb25zID0gc3RhdGljX2Nhc3Q8RXh0ZW5zaW9uczNEQ2hyb21pdW0qPihtX2NvbnRl
eHQtPmdldEV4dGVuc2lvbnMoKSk7CisKKyAgICBleHRlbnNpb25zLT5yYXRlTGltaXRPZmZzY3Jl
ZW5Db250ZXh0Q0hST01JVU0oKTsKK30KKworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1pdGVyLmNwcApfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46
ZW9sLXN0eWxlCiAgICsgTEYKCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1pdGVyLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIFJhdGVMaW1pdGVyX2gKKyNkZWZp
bmUgUmF0ZUxpbWl0ZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
aW5jbHVkZSAiUGFzc1JlZlB0ci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8d3Rm
L1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0Nv
bnRleHQzRDsKKworLy8gQSBjbGFzcyBjb250YWluaW5nIGEgdGltZXIsIHdoaWNoIGNhbGxzIHJh
dGVMaW1pdENIUk9NSVVNIG9uIGV4cGlyeQorY2xhc3MgUmF0ZUxpbWl0ZXIgOiBwdWJsaWMgUmVm
Q291bnRlZDxSYXRlTGltaXRlcj4geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJh
dGVMaW1pdGVyPiBjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0QqKTsKKyAgICB2b2lkIHN0YXJ0KCk7
CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgUmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250ZXh0M0Qq
KTsKKyAgICBHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0OworICAgIGJvb2wgbV9jb250ZXh0
U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb247CisgICAgVGltZXI8UmF0ZUxpbWl0ZXI+IG1f
dGltZXI7CisgICAgdm9pZCByYXRlTGltaXRDb250ZXh0KFRpbWVyPFJhdGVMaW1pdGVyPiopOwor
fTsKKworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlm
CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9SYXRlTGltaXRlci5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dl
YkdMTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gOTgz
NDcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExh
eWVyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCw4ICs1MCw2IEBAIFdlYkdMTGF5
ZXJDaHJvbWl1bTo6V2ViR0xMYXllckNocm9taXVtKEMKICAgICA6IENhbnZhc0xheWVyQ2hyb21p
dW0oZGVsZWdhdGUpCiAgICAgLCBtX2NvbnRleHQoMCkKICAgICAsIG1fdGV4dHVyZUNoYW5nZWQo
dHJ1ZSkKLSAgICAsIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uKGZhbHNl
KQotICAgICwgbV9yYXRlTGltaXRpbmdUaW1lcih0aGlzLCAmV2ViR0xMYXllckNocm9taXVtOjpy
YXRlTGltaXRDb250ZXh0KQogICAgICwgbV90ZXh0dXJlVXBkYXRlZChmYWxzZSkKIHsKIH0KQEAg
LTExNSwxMyArMTEzLDEzIEBAIGJvb2wgV2ViR0xMYXllckNocm9taXVtOjpwYWludFJlbmRlcmVk
UmUKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBXZWJHTExheWVyQ2hyb21pdW06OnNldFRl
eHR1cmVVcGRhdGVkKCkKK3ZvaWQgV2ViR0xMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgp
CiB7CiAgICAgbV90ZXh0dXJlVXBkYXRlZCA9IHRydWU7CiAgICAgLy8gSWYgV2ViR0wgY29tbWFu
ZHMgYXJlIGlzc3VlZCBvdXRzaWRlIG9mIGEgdGhlIGFuaW1hdGlvbiBjYWxsYmFja3MsIHRoZW4g
dXNlCiAgICAgLy8gY2FsbCByYXRlTGltaXRPZmZzY3JlZW5Db250ZXh0Q0hST01JVU0oKSB0byBr
ZWVwIHRoZSBjb250ZXh0IGZyb20gZ2V0dGluZyB0b28gZmFyIGFoZWFkLgotICAgIGlmIChsYXll
clRyZWVIb3N0KCkgJiYgIWxheWVyVHJlZUhvc3QoKS0+YW5pbWF0aW5nKCkgJiYgbV9jb250ZXh0
U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb24gJiYgIW1fcmF0ZUxpbWl0aW5nVGltZXIuaXNB
Y3RpdmUoKSkKLSAgICAgICAgbV9yYXRlTGltaXRpbmdUaW1lci5zdGFydE9uZVNob3QoMCk7Cisg
ICAgaWYgKGxheWVyVHJlZUhvc3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJh
dGVMaW1pdGVyKG1fY29udGV4dCk7CiB9CiAKIHZvaWQgV2ViR0xMYXllckNocm9taXVtOjpzZXRD
b250ZXh0KGNvbnN0IEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KQpAQCAtMTQyLDcgKzE0MCw2
IEBAIHZvaWQgV2ViR0xMYXllckNocm9taXVtOjpzZXRDb250ZXh0KGNvbnMKICAgICBHcmFwaGlj
c0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbV9jb250ZXh0LT5nZXRDb250ZXh0
QXR0cmlidXRlcygpOwogICAgIG1faGFzQWxwaGEgPSBhdHRyaWJ1dGVzLmFscGhhOwogICAgIG1f
cHJlbXVsdGlwbGllZEFscGhhID0gYXR0cmlidXRlcy5wcmVtdWx0aXBsaWVkQWxwaGE7Ci0gICAg
bV9jb250ZXh0U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb24gPSBtX2NvbnRleHQtPmdldEV4
dGVuc2lvbnMoKS0+c3VwcG9ydHMoIkdMX0NIUk9NSVVNX3JhdGVfbGltaXRfb2Zmc2NyZWVuX2Nv
bnRleHQiKTsKIH0KIAogR3JhcGhpY3NDb250ZXh0M0QqIFdlYkdMTGF5ZXJDaHJvbWl1bTo6bGF5
ZXJSZW5kZXJlckNvbnRleHQoKQpAQCAtMTU0LDE2ICsxNTEsNSBAQCBHcmFwaGljc0NvbnRleHQz
RCogV2ViR0xMYXllckNocm9taXVtOjpsCiAgICAgcmV0dXJuIGxheWVyVHJlZUhvc3QoKS0+Y29u
dGV4dCgpOwogfQogCi12b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4dChU
aW1lcjxXZWJHTExheWVyQ2hyb21pdW0+KikKLXsKLSAgICBUUkFDRV9FVkVOVCgiV2ViR0xMYXll
ckNocm9taXVtOjpyYXRlTGltaXRDb250ZXh0IiwgdGhpcywgMCk7Ci0KLSAgICBpZiAoIW1fY29u
dGV4dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRXh0ZW5zaW9uczNEQ2hyb21pdW0qIGV4dGVu
c2lvbnMgPSBzdGF0aWNfY2FzdDxFeHRlbnNpb25zM0RDaHJvbWl1bSo+KG1fY29udGV4dC0+Z2V0
RXh0ZW5zaW9ucygpKTsKLSAgICBleHRlbnNpb25zLT5yYXRlTGltaXRPZmZzY3JlZW5Db250ZXh0
Q0hST01JVU0oKTsKLX0KLQogfQogI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdM
TGF5ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA5ODM0NykKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJv
bWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw2IEBACiAjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQogCiAjaW5jbHVkZSAiQ2FudmFzTGF5ZXJDaHJvbWl1bS5oIgotI2lu
Y2x1ZGUgIlRpbWVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNTEsNyArNTAsNyBA
QCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGJvb2wgZHJhd3NDb250ZW50KCkgY29uc3Q7CiAgICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoR3JhcGhpY3NDb250ZXh0M0Qq
LCBUZXh0dXJlQWxsb2NhdG9yKik7Ci0gICAgdm9pZCBzZXRUZXh0dXJlVXBkYXRlZCgpOworICAg
IHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpOwogICAgIGJvb2wgcGFpbnRSZW5kZXJlZFJl
c3VsdHNUb0NhbnZhcyhJbWFnZUJ1ZmZlciopOwogCiAgICAgdm9pZCBzZXRDb250ZXh0KGNvbnN0
IEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KTsKQEAgLTYzLDE1ICs2MiwxMSBAQCBwcml2YXRl
OgogCiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIGxheWVyUmVuZGVyZXJDb250ZXh0KCk7CiAKLSAg
ICB2b2lkIHJhdGVMaW1pdENvbnRleHQoVGltZXI8V2ViR0xMYXllckNocm9taXVtPiopOwotCiAg
ICAgLy8gR3JhcGhpY3NDb250ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIgaGFzIGEgc2lkZS1lZmZlY3Qg
b2YgYXNzaWduaW5nIGl0c2VsZgogICAgIC8vIHRvIHRoZSBsYXllci4gQmVjYXVzZSBvZiB0aGF0
IEdyYXBoaWNzQ29udGV4dDNEJ3MgZGVzdHJ1Y3RvciB3aWxsIHJlc2V0CiAgICAgLy8gbGF5ZXIn
cyBjb250ZXh0IHRvIDAuCiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKICAgICBi
b29sIG1fdGV4dHVyZUNoYW5nZWQ7Ci0gICAgYm9vbCBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1p
dGluZ0V4dGVuc2lvbjsKLSAgICBUaW1lcjxXZWJHTExheWVyQ2hyb21pdW0+IG1fcmF0ZUxpbWl0
aW5nVGltZXI7CiAgICAgYm9vbCBtX3RleHR1cmVVcGRhdGVkOwogfTsKIApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ0xheWVyVHJlZUhvc3QuY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQyOCw0ICs0MjgsMjAgQEAgdm9pZCBDQ0xheWVyVHJlZUhvc3Q6OmFw
cGx5U2Nyb2xsRGVsdGFzKAogICAgIH0KIH0KIAordm9pZCBDQ0xheWVyVHJlZUhvc3Q6OnN0YXJ0
UmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpCit7CisgICAgaWYgKGFuaW1h
dGluZygpKQorICAgICAgICByZXR1cm47CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIEFTU0VS
VChjb250ZXh0LT5nZXRFeHRlbnNpb25zKCkpOworICAgIFJhdGVMaW1pdGVyTWFwOjppdGVyYXRv
ciBpID0gbV9yYXRlTGltaXRlcnMuZmluZChjb250ZXh0KTsKKyAgICBpZiAoaSAhPSBtX3JhdGVM
aW1pdGVycy5lbmQoKSkKKyAgICAgICAgaS0+c2Vjb25kLT5zdGFydCgpOworICAgIGVsc2Ugewor
ICAgICAgUmVmUHRyPFJhdGVMaW1pdGVyPiByYXRlTGltaXRlciA9IFJhdGVMaW1pdGVyOjpjcmVh
dGUoY29udGV4dCk7CisgICAgICAgIG1fcmF0ZUxpbWl0ZXJzLnNldChjb250ZXh0LCByYXRlTGlt
aXRlcik7CisgICAgICAgIHJhdGVMaW1pdGVyLT5zdGFydCgpOworICAgIH0KK30KKwogfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRy
ZWVIb3N0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJKHJldmlzaW9uIDk4MzQ3KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTI3LDEwICsyNywxMiBAQAogCiAjaW5jbHVkZSAiR3JhcGhpY3NU
eXBlczNELmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlJhdGVMaW1pdGVyLmgi
CiAjaW5jbHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKICNpbmNsdWRlICJjYy9DQ0xheWVy
VHJlZUhvc3RDb21tb24uaCIKICNpbmNsdWRlICJjYy9DQ1Byb3h5LmgiCiAKKyNpbmNsdWRlIDx3
dGYvSGFzaE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVkZSA8d3Rm
L1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgpAQCAtNDcsNiArNDks
NyBAQCBjbGFzcyBMYXllckNocm9taXVtOwogY2xhc3MgTGF5ZXJQYWludGVyQ2hyb21pdW07CiBj
bGFzcyBUZXh0dXJlQWxsb2NhdG9yOwogY2xhc3MgVGV4dHVyZU1hbmFnZXI7Cit0eXBlZGVmIEhh
c2hNYXA8R3JhcGhpY3NDb250ZXh0M0QqLCBSZWZQdHI8UmF0ZUxpbWl0ZXI+ID4gUmF0ZUxpbWl0
ZXJNYXA7CiAKIGNsYXNzIENDTGF5ZXJUcmVlSG9zdENsaWVudCB7CiBwdWJsaWM6CkBAIC0xNTcs
NiArMTYwLDcgQEAgcHVibGljOgogICAgIHZvaWQgdXBkYXRlTGF5ZXJzKCk7CiAKICAgICB2b2lk
IGFwcGx5U2Nyb2xsRGVsdGFzKGNvbnN0IENDU2Nyb2xsVXBkYXRlU2V0Jik7CisgICAgdm9pZCBz
dGFydFJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKik7CiBwcm90ZWN0ZWQ6CiAgICAgQ0NM
YXllclRyZWVIb3N0KENDTGF5ZXJUcmVlSG9zdENsaWVudCosIFBhc3NSZWZQdHI8TGF5ZXJDaHJv
bWl1bT4gcm9vdExheWVyLCBjb25zdCBDQ1NldHRpbmdzJik7CiAgICAgYm9vbCBpbml0aWFsaXpl
KCk7CkBAIC0xOTMsNiArMTk3LDcgQEAgcHJpdmF0ZToKICAgICBJbnRTaXplIG1fdmlld3BvcnRT
aXplOwogICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG1fem9vbUFuaW1hdG9yVHJhbnNmb3JtOwog
ICAgIGJvb2wgbV92aXNpYmxlOworICAgIFJhdGVMaW1pdGVyTWFwIG1fcmF0ZUxpbWl0ZXJzOwog
fTsKIAogfQpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4MzQ4KQor
KysgU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxNCBAQAorMjAxMS0xMC0yNSAgU3RlcGhlbiBXaGl0ZSAgPHNlbm9yYmxhbmNvQGNocm9t
aXVtLm9yZz4KKworICAgICAgICBbY2hyb21pdW1dIENhbnZhczJEIHNob3VsZCByYXRlLWxpbWl0
IGRyYXdpbmcgdG8gcHJldmVudCBzd2FtcGluZyB0aGUgR1BVIHByb2Nlc3MuCisgICAgICAgIGh0
dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM2NworCisgICAgICAgICog
c3JjL0dyYXBoaWNzQ29udGV4dDNEQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3Jh
cGhpY3NDb250ZXh0M0RQcml2YXRlOjptYXJrQ29udGV4dENoYW5nZWQpOgorICAgICAgICBSZW1v
dmUgdGhlIGNhbGwgdG8gc2V0VGV4dHVyZUNoYW5nZWQgKGl0IHdpbGwgYmUgaGFuZGxlZCBpbnRl
cm5hbGx5CisgICAgICAgIGJ5IHRoZSBjb21wb3NpdG9yIGluIHNldENvbnRleHROZWVkc0Rpc3Bs
YXkoKSBpbnN0ZWFkKS4gIFRoaXMgZGVjb3VwbGVzCisgICAgICAgIEdyYXBoaWNzQ29udGV4dDNE
IGZyb20gV2ViR0xMYXllckNocm9taXVtIGEgYml0LgorCiAyMDExLTEwLTI1ICBZdXJ5IFNlbWlr
aGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IHJl
ZGVzaWduIHdvcmtlcnMgc2lkZWJhciBwYW5lCkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVt
L3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9taXVtLmNwcAkocmV2aXNp
b24gOTgzNDcpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQz
RENocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjI1LDkgKzIyNSw2IEBAIFdlYkdMTGF5
ZXJDaHJvbWl1bSogR3JhcGhpY3NDb250ZXh0M0RQcmkKIAogdm9pZCBHcmFwaGljc0NvbnRleHQz
RFByaXZhdGU6Om1hcmtDb250ZXh0Q2hhbmdlZCgpCiB7Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NP
TVBPU0lUSU5HKQotICAgIHBsYXRmb3JtTGF5ZXIoKS0+c2V0VGV4dHVyZVVwZGF0ZWQoKTsKLSNl
bmRpZgogICAgIG1fbGF5ZXJDb21wb3NpdGVkID0gZmFsc2U7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112367</attachid>
            <date>2011-10-25 11:44:23 -0700</date>
            <delta_ts>2011-10-25 12:40:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70367-20111025144422.patch</filename>
            <type>text/plain</type>
            <size>19214</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4MzQ4KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTIgQEAKKzIwMTEtMTAtMjUgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzAzNjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBTYWRseSwgd2UgZG9uJ3QgaGF2ZSBpbmZyYXN0cnVjdHVyZSB0byB0ZXN0IHRoaXMga2lu
ZCBvZiBHUFUgc3dhbXBpbmcKKyAgICAgICAgeWV0LgorCisgICAgICAgICogV2ViQ29yZS5neXBp
OgorICAgICAgICBBZGRlZCBSYXRlTGltaXRlciB0byB0aGUgQ2hyb21pdW0gYnVpbGQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5n
ZWQpOgorICAgICAgICBXaGVuIHRoZSBsYXllciBpcyBub3RpZmllZCB0aGF0IHRoZSBjb250ZW50
cyBoYXZlIGNoYW5nZWQsIHBpbmcgdGhlCisgICAgICAgIHJhdGUgbGltaXRlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50
c05lZWRzRGlzcGxheSk6CisgICAgICAgIENhbGwgKG5ldykgdmlydHVhbCBjb250ZW50Q2hhbmdl
ZCgpIG9uIGEgbGF5ZXIgd2hlbiBpdHMgY29udGVudHMgaGF2ZQorICAgICAgICBiZWVuIGNoYW5n
ZWQgKGUuZy4sIGJ5IGEgZHJhd2luZyBjYWxsKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIE5ldyB2aXJ0dWFsIGNvbnRlbnRD
aGFuZ2VkKCkuCisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdl
ZCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVMaW1pdGVyOjpjcmVhdGUpOgorICAgICAg
ICBSYXRlIGxpbWl0ZXIgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVM
aW1pdGVyOjpSYXRlTGltaXRlcik6CisgICAgICAgIChXZWJDb3JlOjpSYXRlTGltaXRlcjo6c3Rh
cnQpOgorICAgICAgICBQdWJsaWMgQVBJIHRvIHN0YXJ0IHJhdGUgbGltaXRpbmcgYSBjb250ZXh0
LgorICAgICAgICAoV2ViQ29yZTo6UmF0ZUxpbWl0ZXI6OnJhdGVMaW1pdENvbnRleHQpOgorICAg
ICAgICBJbnRlcm5hbCB0aW1lciBjYWxsYmFjayB3aGVuIGEgY29udGV4dCBzaG91bGQgYmUgcmF0
ZSBsaW1pdGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1p
dGVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdM
TGF5ZXJDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTExheWVyQ2hyb21pdW06
OldlYkdMTGF5ZXJDaHJvbWl1bSk6CisgICAgICAgIFJlbW92ZSByYXRlIGxpbWl0aW5nIHRpbWVy
IGFuZCBleHRlbnNpb24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4KKyAgICAgICAgKFdl
YkNvcmU6OldlYkdMTGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5nZWQpOgorICAgICAgICBzZXRU
ZXh0dXJlVXBkYXRlZCgpIHJlbmFtZWQgdG8gY29udGVudENoYW5nZWQoKSB0byBvdmVycmlkZSAK
KyAgICAgICAgYmFzZSBjbGFzcyB2aXJ0dWFsLiAgQ2FsbCByYXRlIGxpbWl0aW5nIGluIENDTGF5
ZXJUcmVlSG9zdCBvbgorICAgICAgICBjb250ZW50IGNoYW5nZS4KKyAgICAgICAgKFdlYkNvcmU6
OldlYkdMTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGV4dCk6CisgICAgICAgIFJlbW92ZSBleHRlbnNp
b24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uaDoKKyAgICAgICAgUmVtb3ZlIHJhdGUg
bGltaXRpbmcgdGltZXIgYW5kIGV4dGVuc2lvbiBjaGVjayAobW92ZWQgdG8gUmF0ZUxpbWl0ZXIp
LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9z
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDQ0xheWVyVHJlZUhvc3Q6OnN0YXJ0UmF0ZUxpbWl0
ZXIpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVl
SG9zdC5oOgorICAgICAgICBJbXBsZW1lbnRhdGlvbiBvZiBwZXItR3JhcGhpY3NDb250ZXh0M0Qg
UmF0ZUxpbWl0ZXIuCisKIDIwMTEtMTAtMjUgIFl1cnkgU2VtaWtoYXRza3kgIDx5dXJ5c0BjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgV2ViIEluc3BlY3RvcjogcmVkZXNpZ24gd29ya2VycyBzaWRl
YmFyIHBhbmUKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDk4MzQ3KQorKysgU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0zNDk2LDYgKzM0OTYsOCBA
QAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1BsdWdpbkxheWVyQ2hy
b21pdW0uaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUHJvZ3Jh
bUJpbmRpbmcuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Q
cm9ncmFtQmluZGluZy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9SYXRlTGltaXRlci5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL1JhdGVMaW1pdGVyLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaGFkZXJDaHJvbWl1bS5jcHAnLApJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9t
aXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJv
bWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgIkV4
dGVuc2lvbnMzRENocm9taXVtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNp
bmNsdWRlICJjYy9DQ0xheWVyVHJlZUhvc3QuaCIKIAogI2lmIFVTRShTS0lBKQogI2luY2x1ZGUg
IkdyQ29udGV4dC5oIgpAQCAtODQsNSArODUsMTEgQEAgdm9pZCBDYW52YXMyRExheWVyQ2hyb21p
dW06OnVwZGF0ZUNvbXBvcwogICAgIHJlc2V0TmVlZHNEaXNwbGF5KCk7CiB9CiAKK3ZvaWQgQ2Fu
dmFzMkRMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgpCit7CisgICAgaWYgKGxheWVyVHJl
ZUhvc3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJhdGVMaW1pdGVyKG1fY29u
dGV4dCk7Cit9CisKIH0KICNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExh
eWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gOTgzNDcpCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVy
Q2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQCBwdWJsaWM6CiAgICAg
dmlydHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRh
dGVDb21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgVGV4dHVyZUFsbG9jYXRv
ciopOwogCi0gICAgdm9pZCBzZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBj
b250ZW50Q2hhbmdlZCgpOwogCiBwcml2YXRlOgogICAgIGV4cGxpY2l0IENhbnZhczJETGF5ZXJD
aHJvbWl1bShHcmFwaGljc0NvbnRleHQzRCopOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xh
eWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTMwNyw4ICszMDcsMTAgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNl
dFJlcGxpY2F0ZQogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHNOZWVk
c0Rpc3BsYXkoKQogewotICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgaWYgKG1fY29udGVu
dHNMYXllcikgewogICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOwor
ICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPmNvbnRlbnRDaGFuZ2VkKCk7CisgICAgfQogfQogCiB2
b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KCkKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXll
ckNocm9taXVtLmgJKHJldmlzaW9uIDk4MzQ3KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTUs
NiArMTk1LDcgQEAgcHVibGljOgogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUg
bGF5ZXIncyBkZXNjZW5kYW50cyBoYXMgY29udGVudCB0byBkcmF3LgogICAgIGJvb2wgZGVzY2Vu
ZGFudERyYXdzQ29udGVudCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsg
fQogCiAgICAgQ0NMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KCkgY29uc3QgeyByZXR1cm4g
bV9sYXllclRyZWVIb3N0LmdldCgpOyB9CiAgICAgdm9pZCBjbGVhbnVwUmVzb3VyY2VzUmVjdXJz
aXZlKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9S
YXRlTGltaXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lv
biAwKQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiUmF0ZUxpbWl0ZXIuaCIKKworI2luY2x1
ZGUgIkV4dGVuc2lvbnMzRENocm9taXVtLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0Qu
aCIKKyNpbmNsdWRlICJUcmFjZUV2ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFz
c1JlZlB0cjxSYXRlTGltaXRlcj4gUmF0ZUxpbWl0ZXI6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQz
RCogY29udGV4dCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJhdGVMaW1pdGVyKGNvbnRl
eHQpKTsKK30KKworUmF0ZUxpbWl0ZXI6OlJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKiBj
b250ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX3RpbWVyKHRoaXMsICZS
YXRlTGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCkKK3sKKyAgICBBU1NFUlQoY29udGV4dCk7Cisg
ICAgQVNTRVJUKGNvbnRleHQtPmdldEV4dGVuc2lvbnMoKSk7CisgICAgbV9jb250ZXh0U3VwcG9y
dHNSYXRlTGltaXRpbmdFeHRlbnNpb24gPSBjb250ZXh0LT5nZXRFeHRlbnNpb25zKCktPnN1cHBv
cnRzKCJHTF9DSFJPTUlVTV9yYXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7Cit9CisKK3Zv
aWQgUmF0ZUxpbWl0ZXI6OnN0YXJ0KCkKK3sKKyAgICBpZiAobV9jb250ZXh0U3VwcG9ydHNSYXRl
TGltaXRpbmdFeHRlbnNpb24gJiYgIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV90aW1l
ci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgUmF0ZUxpbWl0ZXI6OnJhdGVMaW1pdENvbnRl
eHQoVGltZXI8UmF0ZUxpbWl0ZXI+KikKK3sKKyAgICBUUkFDRV9FVkVOVCgiUmF0ZUxpbWl0ZXI6
OnJhdGVMaW1pdENvbnRleHQiLCB0aGlzLCAwKTsKKworICAgIEV4dGVuc2lvbnMzRENocm9taXVt
KiBleHRlbnNpb25zID0gc3RhdGljX2Nhc3Q8RXh0ZW5zaW9uczNEQ2hyb21pdW0qPihtX2NvbnRl
eHQtPmdldEV4dGVuc2lvbnMoKSk7CisKKyAgICBleHRlbnNpb25zLT5yYXRlTGltaXRPZmZzY3Jl
ZW5Db250ZXh0Q0hST01JVU0oKTsKK30KKworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9D
T01QT1NJVElORykKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1pdGVyLmNwcApfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46
ZW9sLXN0eWxlCiAgICsgTEYKCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1pdGVyLmgJKHJldmlzaW9uIDApCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIFJhdGVMaW1pdGVyX2gKKyNkZWZp
bmUgUmF0ZUxpbWl0ZXJfaAorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisj
aW5jbHVkZSAiUGFzc1JlZlB0ci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSA8d3Rm
L1JlZkNvdW50ZWQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHcmFwaGljc0Nv
bnRleHQzRDsKKworLy8gQSBjbGFzcyBjb250YWluaW5nIGEgdGltZXIsIHdoaWNoIGNhbGxzIHJh
dGVMaW1pdENIUk9NSVVNIG9uIGV4cGlyeQorY2xhc3MgUmF0ZUxpbWl0ZXIgOiBwdWJsaWMgUmVm
Q291bnRlZDxSYXRlTGltaXRlcj4geworcHVibGljOgorICAgIHN0YXRpYyBQYXNzUmVmUHRyPFJh
dGVMaW1pdGVyPiBjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0QqKTsKKyAgICB2b2lkIHN0YXJ0KCk7
CisKK3ByaXZhdGU6CisgICAgZXhwbGljaXQgUmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250ZXh0M0Qq
KTsKKyAgICBHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0OworICAgIGJvb2wgbV9jb250ZXh0
U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb247CisgICAgVGltZXI8UmF0ZUxpbWl0ZXI+IG1f
dGltZXI7CisgICAgdm9pZCByYXRlTGltaXRDb250ZXh0KFRpbWVyPFJhdGVMaW1pdGVyPiopOwor
fTsKKworfQorI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2VuZGlm
CgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9SYXRlTGltaXRlci5oCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KQWRkZWQ6IHN2bjplb2wtc3R5bGUKICAg
KyBMRgoKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dl
YkdMTGF5ZXJDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcAkocmV2aXNpb24gOTgz
NDcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExh
eWVyQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCw4ICs1MCw2IEBAIFdlYkdMTGF5
ZXJDaHJvbWl1bTo6V2ViR0xMYXllckNocm9taXVtKEMKICAgICA6IENhbnZhc0xheWVyQ2hyb21p
dW0oZGVsZWdhdGUpCiAgICAgLCBtX2NvbnRleHQoMCkKICAgICAsIG1fdGV4dHVyZUNoYW5nZWQo
dHJ1ZSkKLSAgICAsIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uKGZhbHNl
KQotICAgICwgbV9yYXRlTGltaXRpbmdUaW1lcih0aGlzLCAmV2ViR0xMYXllckNocm9taXVtOjpy
YXRlTGltaXRDb250ZXh0KQogICAgICwgbV90ZXh0dXJlVXBkYXRlZChmYWxzZSkKIHsKIH0KQEAg
LTExNSwxMyArMTEzLDEzIEBAIGJvb2wgV2ViR0xMYXllckNocm9taXVtOjpwYWludFJlbmRlcmVk
UmUKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBXZWJHTExheWVyQ2hyb21pdW06OnNldFRl
eHR1cmVVcGRhdGVkKCkKK3ZvaWQgV2ViR0xMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgp
CiB7CiAgICAgbV90ZXh0dXJlVXBkYXRlZCA9IHRydWU7CiAgICAgLy8gSWYgV2ViR0wgY29tbWFu
ZHMgYXJlIGlzc3VlZCBvdXRzaWRlIG9mIGEgdGhlIGFuaW1hdGlvbiBjYWxsYmFja3MsIHRoZW4g
dXNlCiAgICAgLy8gY2FsbCByYXRlTGltaXRPZmZzY3JlZW5Db250ZXh0Q0hST01JVU0oKSB0byBr
ZWVwIHRoZSBjb250ZXh0IGZyb20gZ2V0dGluZyB0b28gZmFyIGFoZWFkLgotICAgIGlmIChsYXll
clRyZWVIb3N0KCkgJiYgIWxheWVyVHJlZUhvc3QoKS0+YW5pbWF0aW5nKCkgJiYgbV9jb250ZXh0
U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb24gJiYgIW1fcmF0ZUxpbWl0aW5nVGltZXIuaXNB
Y3RpdmUoKSkKLSAgICAgICAgbV9yYXRlTGltaXRpbmdUaW1lci5zdGFydE9uZVNob3QoMCk7Cisg
ICAgaWYgKGxheWVyVHJlZUhvc3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJh
dGVMaW1pdGVyKG1fY29udGV4dCk7CiB9CiAKIHZvaWQgV2ViR0xMYXllckNocm9taXVtOjpzZXRD
b250ZXh0KGNvbnN0IEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KQpAQCAtMTQyLDcgKzE0MCw2
IEBAIHZvaWQgV2ViR0xMYXllckNocm9taXVtOjpzZXRDb250ZXh0KGNvbnMKICAgICBHcmFwaGlj
c0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gbV9jb250ZXh0LT5nZXRDb250ZXh0
QXR0cmlidXRlcygpOwogICAgIG1faGFzQWxwaGEgPSBhdHRyaWJ1dGVzLmFscGhhOwogICAgIG1f
cHJlbXVsdGlwbGllZEFscGhhID0gYXR0cmlidXRlcy5wcmVtdWx0aXBsaWVkQWxwaGE7Ci0gICAg
bV9jb250ZXh0U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb24gPSBtX2NvbnRleHQtPmdldEV4
dGVuc2lvbnMoKS0+c3VwcG9ydHMoIkdMX0NIUk9NSVVNX3JhdGVfbGltaXRfb2Zmc2NyZWVuX2Nv
bnRleHQiKTsKIH0KIAogR3JhcGhpY3NDb250ZXh0M0QqIFdlYkdMTGF5ZXJDaHJvbWl1bTo6bGF5
ZXJSZW5kZXJlckNvbnRleHQoKQpAQCAtMTU0LDE2ICsxNTEsNSBAQCBHcmFwaGljc0NvbnRleHQz
RCogV2ViR0xMYXllckNocm9taXVtOjpsCiAgICAgcmV0dXJuIGxheWVyVHJlZUhvc3QoKS0+Y29u
dGV4dCgpOwogfQogCi12b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4dChU
aW1lcjxXZWJHTExheWVyQ2hyb21pdW0+KikKLXsKLSAgICBUUkFDRV9FVkVOVCgiV2ViR0xMYXll
ckNocm9taXVtOjpyYXRlTGltaXRDb250ZXh0IiwgdGhpcywgMCk7Ci0KLSAgICBpZiAoIW1fY29u
dGV4dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgRXh0ZW5zaW9uczNEQ2hyb21pdW0qIGV4dGVu
c2lvbnMgPSBzdGF0aWNfY2FzdDxFeHRlbnNpb25zM0RDaHJvbWl1bSo+KG1fY29udGV4dC0+Z2V0
RXh0ZW5zaW9ucygpKTsKLSAgICBleHRlbnNpb25zLT5yYXRlTGltaXRPZmZzY3JlZW5Db250ZXh0
Q0hST01JVU0oKTsKLX0KLQogfQogI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElO
RykKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdM
TGF5ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiA5ODM0NykKKysr
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJv
bWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw2IEBACiAjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQogCiAjaW5jbHVkZSAiQ2FudmFzTGF5ZXJDaHJvbWl1bS5oIgotI2lu
Y2x1ZGUgIlRpbWVyLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIApAQCAtNTEsNyArNTAsNyBA
QCBwdWJsaWM6CiAKICAgICB2aXJ0dWFsIGJvb2wgZHJhd3NDb250ZW50KCkgY29uc3Q7CiAgICAg
dmlydHVhbCB2b2lkIHVwZGF0ZUNvbXBvc2l0b3JSZXNvdXJjZXMoR3JhcGhpY3NDb250ZXh0M0Qq
LCBUZXh0dXJlQWxsb2NhdG9yKik7Ci0gICAgdm9pZCBzZXRUZXh0dXJlVXBkYXRlZCgpOworICAg
IHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpOwogICAgIGJvb2wgcGFpbnRSZW5kZXJlZFJl
c3VsdHNUb0NhbnZhcyhJbWFnZUJ1ZmZlciopOwogCiAgICAgdm9pZCBzZXRDb250ZXh0KGNvbnN0
IEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0KTsKQEAgLTYzLDE1ICs2MiwxMSBAQCBwcml2YXRl
OgogCiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIGxheWVyUmVuZGVyZXJDb250ZXh0KCk7CiAKLSAg
ICB2b2lkIHJhdGVMaW1pdENvbnRleHQoVGltZXI8V2ViR0xMYXllckNocm9taXVtPiopOwotCiAg
ICAgLy8gR3JhcGhpY3NDb250ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIgaGFzIGEgc2lkZS1lZmZlY3Qg
b2YgYXNzaWduaW5nIGl0c2VsZgogICAgIC8vIHRvIHRoZSBsYXllci4gQmVjYXVzZSBvZiB0aGF0
IEdyYXBoaWNzQ29udGV4dDNEJ3MgZGVzdHJ1Y3RvciB3aWxsIHJlc2V0CiAgICAgLy8gbGF5ZXIn
cyBjb250ZXh0IHRvIDAuCiAgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKICAgICBi
b29sIG1fdGV4dHVyZUNoYW5nZWQ7Ci0gICAgYm9vbCBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1p
dGluZ0V4dGVuc2lvbjsKLSAgICBUaW1lcjxXZWJHTExheWVyQ2hyb21pdW0+IG1fcmF0ZUxpbWl0
aW5nVGltZXI7CiAgICAgYm9vbCBtX3RleHR1cmVVcGRhdGVkOwogfTsKIApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9jYy9DQ0xheWVyVHJlZUhvc3QuY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTQyOCw0ICs0MjgsMTkgQEAgdm9pZCBDQ0xheWVyVHJlZUhvc3Q6OmFw
cGx5U2Nyb2xsRGVsdGFzKAogICAgIH0KIH0KIAordm9pZCBDQ0xheWVyVHJlZUhvc3Q6OnN0YXJ0
UmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpCit7CisgICAgaWYgKGFuaW1h
dGluZygpKQorICAgICAgICByZXR1cm47CisgICAgQVNTRVJUKGNvbnRleHQpOworICAgIFJhdGVM
aW1pdGVyTWFwOjppdGVyYXRvciBpID0gbV9yYXRlTGltaXRlcnMuZmluZChjb250ZXh0KTsKKyAg
ICBpZiAoaSAhPSBtX3JhdGVMaW1pdGVycy5lbmQoKSkKKyAgICAgICAgaS0+c2Vjb25kLT5zdGFy
dCgpOworICAgIGVsc2UgeworICAgICAgICBSZWZQdHI8UmF0ZUxpbWl0ZXI+IHJhdGVMaW1pdGVy
ID0gUmF0ZUxpbWl0ZXI6OmNyZWF0ZShjb250ZXh0KTsKKyAgICAgICAgbV9yYXRlTGltaXRlcnMu
c2V0KGNvbnRleHQsIHJhdGVMaW1pdGVyKTsKKyAgICAgICAgcmF0ZUxpbWl0ZXItPnN0YXJ0KCk7
CisgICAgfQorfQorCiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3QuaAkocmV2aXNp
b24gOTgzNDcpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9j
Yy9DQ0xheWVyVHJlZUhvc3QuaAkod29ya2luZyBjb3B5KQpAQCAtMjcsMTAgKzI3LDEyIEBACiAK
ICNpbmNsdWRlICJHcmFwaGljc1R5cGVzM0QuaCIKICNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5j
bHVkZSAiUmF0ZUxpbWl0ZXIuaCIKICNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgog
I2luY2x1ZGUgImNjL0NDTGF5ZXJUcmVlSG9zdENvbW1vbi5oIgogI2luY2x1ZGUgImNjL0NDUHJv
eHkuaCIKIAorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NPd25Q
dHIuaD4KICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3Vu
dGVkLmg+CkBAIC00Nyw2ICs0OSw3IEBAIGNsYXNzIExheWVyQ2hyb21pdW07CiBjbGFzcyBMYXll
clBhaW50ZXJDaHJvbWl1bTsKIGNsYXNzIFRleHR1cmVBbGxvY2F0b3I7CiBjbGFzcyBUZXh0dXJl
TWFuYWdlcjsKK3R5cGVkZWYgSGFzaE1hcDxHcmFwaGljc0NvbnRleHQzRCosIFJlZlB0cjxSYXRl
TGltaXRlcj4gPiBSYXRlTGltaXRlck1hcDsKIAogY2xhc3MgQ0NMYXllclRyZWVIb3N0Q2xpZW50
IHsKIHB1YmxpYzoKQEAgLTE1Nyw2ICsxNjAsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCB1cGRhdGVM
YXllcnMoKTsKIAogICAgIHZvaWQgYXBwbHlTY3JvbGxEZWx0YXMoY29uc3QgQ0NTY3JvbGxVcGRh
dGVTZXQmKTsKKyAgICB2b2lkIHN0YXJ0UmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250ZXh0M0QqKTsK
IHByb3RlY3RlZDoKICAgICBDQ0xheWVyVHJlZUhvc3QoQ0NMYXllclRyZWVIb3N0Q2xpZW50Kiwg
UGFzc1JlZlB0cjxMYXllckNocm9taXVtPiByb290TGF5ZXIsIGNvbnN0IENDU2V0dGluZ3MmKTsK
ICAgICBib29sIGluaXRpYWxpemUoKTsKQEAgLTE5Myw2ICsxOTcsNyBAQCBwcml2YXRlOgogICAg
IEludFNpemUgbV92aWV3cG9ydFNpemU7CiAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbV96b29t
QW5pbWF0b3JUcmFuc2Zvcm07CiAgICAgYm9vbCBtX3Zpc2libGU7CisgICAgUmF0ZUxpbWl0ZXJN
YXAgbV9yYXRlTGltaXRlcnM7CiB9OwogCiB9CkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVt
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxv
ZwkocmV2aXNpb24gOTgzNDgpCisrKyBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwko
d29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDExLTEwLTI1ICBTdGVwaGVuIFdoaXRl
ICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gQ2FudmFz
MkQgc2hvdWxkIHJhdGUtbGltaXQgZHJhd2luZyB0byBwcmV2ZW50IHN3YW1waW5nIHRoZSBHUFUg
cHJvY2Vzcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTcwMzY3CisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHA6Cisg
ICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6Om1hcmtDb250ZXh0Q2hh
bmdlZCk6CisgICAgICAgIFJlbW92ZSB0aGUgY2FsbCB0byBzZXRUZXh0dXJlQ2hhbmdlZCAoaXQg
d2lsbCBiZSBoYW5kbGVkIGludGVybmFsbHkKKyAgICAgICAgYnkgdGhlIGNvbXBvc2l0b3IgaW4g
c2V0Q29udGV4dE5lZWRzRGlzcGxheSgpIGluc3RlYWQpLiAgVGhpcyBkZWNvdXBsZXMKKyAgICAg
ICAgR3JhcGhpY3NDb250ZXh0M0QgZnJvbSBXZWJHTExheWVyQ2hyb21pdW0gYSBiaXQuCisKIDIw
MTEtMTAtMjUgIFl1cnkgU2VtaWtoYXRza3kgIDx5dXJ5c0BjaHJvbWl1bS5vcmc+CiAKICAgICAg
ICAgV2ViIEluc3BlY3RvcjogcmVkZXNpZ24gd29ya2VycyBzaWRlYmFyIHBhbmUKSW5kZXg6IFNv
dXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBoaWNzQ29udGV4dDNEQ2hyb21pdW0uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0vc3JjL0dyYXBoaWNzQ29udGV4dDNE
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM0NykKKysrIFNvdXJjZS9XZWJLaXQvY2hyb21pdW0v
c3JjL0dyYXBoaWNzQ29udGV4dDNEQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMjUs
OSArMjI1LDYgQEAgV2ViR0xMYXllckNocm9taXVtKiBHcmFwaGljc0NvbnRleHQzRFByaQogCiB2
b2lkIEdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6bWFya0NvbnRleHRDaGFuZ2VkKCkKIHsKLSNp
ZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCi0gICAgcGxhdGZvcm1MYXllcigpLT5zZXRU
ZXh0dXJlVXBkYXRlZCgpOwotI2VuZGlmCiAgICAgbV9sYXllckNvbXBvc2l0ZWQgPSBmYWxzZTsK
IH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112376</attachid>
            <date>2011-10-25 12:41:01 -0700</date>
            <delta_ts>2011-10-25 14:32:15 -0700</delta_ts>
            <desc>new patch; added rate limiter cancelling</desc>
            <filename>bug-70367-20111025154059.patch</filename>
            <type>text/plain</type>
            <size>20250</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTkgQEAKKzIwMTEtMTAtMjUgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzAzNjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBTYWRseSwgd2UgZG9uJ3QgaGF2ZSBpbmZyYXN0cnVjdHVyZSB0byB0ZXN0IHRoaXMga2lu
ZCBvZiBHUFUgc3dhbXBpbmcKKyAgICAgICAgeWV0LgorCisgICAgICAgICogV2ViQ29yZS5neXBp
OgorICAgICAgICBBZGQgUmF0ZUxpbWl0ZXIuKiB0byB0aGUgQ2hyb21pdW0gYnVpbGQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5n
ZWQpOgorICAgICAgICBXaGVuIHRoZSBsYXllciBpcyBub3RpZmllZCB0aGF0IHRoZSBjb250ZW50
cyBoYXZlIGNoYW5nZWQsIHBpbmcgdGhlCisgICAgICAgIHJhdGUgbGltaXRlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50
c05lZWRzRGlzcGxheSk6CisgICAgICAgIENhbGwgKG5ldykgdmlydHVhbCBjb250ZW50Q2hhbmdl
ZCgpIG9uIGEgbGF5ZXIgd2hlbiBpdHMgY29udGVudHMgaGF2ZQorICAgICAgICBiZWVuIGNoYW5n
ZWQgKGUuZy4sIGJ5IGEgZHJhd2luZyBjYWxsKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9t
aXVtOjpjb250ZW50Q2hhbmdlZCk6CisgICAgICAgIE5ldyB2aXJ0dWFsIGNvbnRlbnRDaGFuZ2Vk
KCkuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVMaW1pdGVyOjpjcmVhdGUpOgorICAgICAg
ICBSYXRlIGxpbWl0ZXIgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVM
aW1pdGVyOjpSYXRlTGltaXRlcik6CisgICAgICAgIChXZWJDb3JlOjpSYXRlTGltaXRlcjo6c3Rh
cnQpOgorICAgICAgICBQdWJsaWMgQVBJIHRvIHN0YXJ0IHJhdGUgbGltaXRpbmcgYSBjb250ZXh0
LgorICAgICAgICAoV2ViQ29yZTo6UmF0ZUxpbWl0ZXI6OnN0b3ApOgorICAgICAgICBQdWJsaWMg
QVBJIHRvIHN0b3AgcmF0ZSBsaW1pdGluZyBhIGNvbnRleHQuCisgICAgICAgIChXZWJDb3JlOjpS
YXRlTGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCk6CisgICAgICAgIEludGVybmFsIHRpbWVyIGNh
bGxiYWNrIHdoZW4gYSBjb250ZXh0IHNob3VsZCBiZSByYXRlIGxpbWl0ZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuaDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OldlYkdMTGF5ZXJDaHJvbWl1bTo6V2ViR0xMYXllckNocm9taXVtKToK
KyAgICAgICAgUmVtb3ZlIHJhdGUgbGltaXRpbmcgdGltZXIgYW5kIGV4dGVuc2lvbiBjaGVjayAo
bW92ZWQgdG8gUmF0ZUxpbWl0ZXIpLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xMYXllckNocm9t
aXVtOjpjb250ZW50Q2hhbmdlZCk6CisgICAgICAgIFRoZSBmdW5jdGlvbiBmb3JtZXJseSBrbm93
biBhcyBzZXRUZXh0dXJlVXBkYXRlZCgpLCBub3cgcmVuYW1lZCB0bworICAgICAgICBtYXRjaCB0
aGUgYmFzZSBjbGFzcyB2aXJ0dWFsIGNvbnRlbnRDaGFuZ2VkKCkuICBDYWxsIHJhdGUgbGltaXRl
ciBpbgorICAgICAgICBDQ0xheWVyVHJlZUhvc3QgKGxvY2FsIGltcGxlbWVudGF0aW9uIHJlbW92
ZWQpLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xMYXllckNocm9taXVtOjpzZXRDb250ZXh0KToK
KyAgICAgICAgV2hlbiB0aGUgY29udGV4dCBpcyBjaGFuZ2VkLCBzdG9wIHRoZSBwZW5kaW5nIHJh
dGUgbGltaXRlciBvbiB0aGUgb2xkCisgICAgICAgIGNvbnRleHQuICBSZW1vdmUgZXh0ZW5zaW9u
IGNoZWNrIChtb3ZlZCB0byBSYXRlTGltaXRlcikuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmg6CisgICAgICAgIFJlbW92ZSByYXRlIGxp
bWl0aW5nIHRpbWVyIGFuZCBleHRlbnNpb24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3Qu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0OjpzdGFydFJhdGVMaW1pdGVy
KToKKyAgICAgICAgUHVibGljIEFQSSBmb3Igc3RhcnRpbmcgcGVyLWNvbnRleHQgcmF0ZSBsaW1p
dGVyLgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0OjpzdG9wUmF0ZUxpbWl0ZXIp
OgorICAgICAgICBQdWJsaWMgQVBJIGZvciBzdG9wcGluZyBwZXItY29udGV4dCByYXRlIGxpbWl0
ZXIuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVI
b3N0Lmg6CisgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHBlci1HcmFwaGljc0NvbnRleHQzRCBS
YXRlTGltaXRlci4KKworCiAyMDExLTEwLTI1ICBDaHJpcyBFdmFucyAgPGNldmFuc0Bnb29nbGUu
Y29tPgogCiAgICAgICAgIE1hbmFnZSB0aGUgQ1NTIHByb3BlcnR5IGFycmF5IGxlbmd0aCBjb3Jy
ZWN0bHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dl
YkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0zNDk2LDYgKzM0OTYsOCBAQAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1BsdWdpbkxheWVyQ2hyb21p
dW0uaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUHJvZ3JhbUJp
bmRpbmcuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Qcm9n
cmFtQmluZGluZy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9S
YXRlTGltaXRlci5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L1JhdGVMaW1pdGVyLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L1JlbmRlclN1cmZhY2VDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaGFkZXJDaHJvbWl1bS5jcHAnLApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVt
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM3NikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1
bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgIkV4dGVu
c2lvbnMzRENocm9taXVtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNpbmNs
dWRlICJjYy9DQ0xheWVyVHJlZUhvc3QuaCIKIAogI2lmIFVTRShTS0lBKQogI2luY2x1ZGUgIkdy
Q29udGV4dC5oIgpAQCAtODQsNSArODUsMTEgQEAgdm9pZCBDYW52YXMyRExheWVyQ2hyb21pdW06
OnVwZGF0ZUNvbXBvcwogICAgIHJlc2V0TmVlZHNEaXNwbGF5KCk7CiB9CiAKK3ZvaWQgQ2FudmFz
MkRMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgpCit7CisgICAgaWYgKGxheWVyVHJlZUhv
c3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJhdGVMaW1pdGVyKG1fY29udGV4
dCk7Cit9CisKIH0KICNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVy
Q2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gOTgzNzYpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hy
b21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQCBwdWJsaWM6CiAgICAgdmly
dHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgQ0NUZXh0dXJlVXBkYXRlciYp
OwogCi0gICAgdm9pZCBzZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250
ZW50Q2hhbmdlZCgpOwogCiBwcml2YXRlOgogICAgIGV4cGxpY2l0IENhbnZhczJETGF5ZXJDaHJv
bWl1bShHcmFwaGljc0NvbnRleHQzRCopOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM3NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMwNyw4ICszMDcsMTAgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldFJl
cGxpY2F0ZQogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHNOZWVkc0Rp
c3BsYXkoKQogewotICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgaWYgKG1fY29udGVudHNM
YXllcikgewogICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAg
ICAgICBtX2NvbnRlbnRzTGF5ZXItPmNvbnRlbnRDaGFuZ2VkKCk7CisgICAgfQogfQogCiB2b2lk
IEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNo
cm9taXVtLmgJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTYsNiAr
MTk2LDcgQEAgcHVibGljOgogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgbGF5
ZXIncyBkZXNjZW5kYW50cyBoYXMgY29udGVudCB0byBkcmF3LgogICAgIGJvb2wgZGVzY2VuZGFu
dERyYXdzQ29udGVudCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsgfQog
CiAgICAgQ0NMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KCkgY29uc3QgeyByZXR1cm4gbV9s
YXllclRyZWVIb3N0LmdldCgpOyB9CiAgICAgdm9pZCBjbGVhbnVwUmVzb3VyY2VzUmVjdXJzaXZl
KCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRl
TGltaXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNFKEFDQ0VMRVJB
VEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiUmF0ZUxpbWl0ZXIuaCIKKworI2luY2x1ZGUg
IkV4dGVuc2lvbnMzRENocm9taXVtLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIK
KyNpbmNsdWRlICJUcmFjZUV2ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1Jl
ZlB0cjxSYXRlTGltaXRlcj4gUmF0ZUxpbWl0ZXI6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRCog
Y29udGV4dCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJhdGVMaW1pdGVyKGNvbnRleHQp
KTsKK30KKworUmF0ZUxpbWl0ZXI6OlJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKiBjb250
ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX3RpbWVyKHRoaXMsICZSYXRl
TGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCkKK3sKKyAgICBBU1NFUlQoY29udGV4dCk7CisgICAg
QVNTRVJUKGNvbnRleHQtPmdldEV4dGVuc2lvbnMoKSk7CisgICAgbV9jb250ZXh0U3VwcG9ydHNS
YXRlTGltaXRpbmdFeHRlbnNpb24gPSBjb250ZXh0LT5nZXRFeHRlbnNpb25zKCktPnN1cHBvcnRz
KCJHTF9DSFJPTUlVTV9yYXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7Cit9CisKK3ZvaWQg
UmF0ZUxpbWl0ZXI6OnN0YXJ0KCkKK3sKKyAgICBpZiAobV9jb250ZXh0U3VwcG9ydHNSYXRlTGlt
aXRpbmdFeHRlbnNpb24gJiYgIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV90aW1lci5z
dGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgUmF0ZUxpbWl0ZXI6OnN0b3AoKQoreworICAgIG1f
dGltZXIuc3RvcCgpOworfQorCit2b2lkIFJhdGVMaW1pdGVyOjpyYXRlTGltaXRDb250ZXh0KFRp
bWVyPFJhdGVMaW1pdGVyPiopCit7CisgICAgVFJBQ0VfRVZFTlQoIlJhdGVMaW1pdGVyOjpyYXRl
TGltaXRDb250ZXh0IiwgdGhpcywgMCk7CisKKyAgICBFeHRlbnNpb25zM0RDaHJvbWl1bSogZXh0
ZW5zaW9ucyA9IHN0YXRpY19jYXN0PEV4dGVuc2lvbnMzRENocm9taXVtKj4obV9jb250ZXh0LT5n
ZXRFeHRlbnNpb25zKCkpOworCisgICAgZXh0ZW5zaW9ucy0+cmF0ZUxpbWl0T2Zmc2NyZWVuQ29u
dGV4dENIUk9NSVVNKCk7Cit9CisKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5jcHAKX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDogc3ZuOmVvbC1z
dHlsZQogICArIExGCgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vUmF0ZUxpbWl0ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCShyZXZpc2lvbiAwKQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKworI2lmbmRlZiBSYXRlTGltaXRlcl9oCisjZGVmaW5lIFJh
dGVMaW1pdGVyX2gKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKKworI2luY2x1
ZGUgIlBhc3NSZWZQdHIuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgPHd0Zi9SZWZD
b3VudGVkLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhpY3NDb250ZXh0
M0Q7CisKKy8vIEEgY2xhc3MgY29udGFpbmluZyBhIHRpbWVyLCB3aGljaCBjYWxscyByYXRlTGlt
aXRDSFJPTUlVTSBvbiBleHBpcnkKK2NsYXNzIFJhdGVMaW1pdGVyIDogcHVibGljIFJlZkNvdW50
ZWQ8UmF0ZUxpbWl0ZXI+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxSYXRlTGlt
aXRlcj4gY3JlYXRlKEdyYXBoaWNzQ29udGV4dDNEKik7CisgICAgdm9pZCBzdGFydCgpOworICAg
IHZvaWQgc3RvcCgpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IFJhdGVMaW1pdGVyKEdyYXBo
aWNzQ29udGV4dDNEKik7CisgICAgR3JhcGhpY3NDb250ZXh0M0QqIG1fY29udGV4dDsKKyAgICBi
b29sIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uOworICAgIFRpbWVyPFJh
dGVMaW1pdGVyPiBtX3RpbWVyOworICAgIHZvaWQgcmF0ZUxpbWl0Q29udGV4dChUaW1lcjxSYXRl
TGltaXRlcj4qKTsKK307CisKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpCisKKyNlbmRpZgoKUHJvcGVydHkgY2hhbmdlcyBvbjogU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuaApfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBzdm46
ZW9sLXN0eWxlCiAgICsgTEYKCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5jcHAJ
KHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTAsOCArNTAs
NiBAQCBXZWJHTExheWVyQ2hyb21pdW06OldlYkdMTGF5ZXJDaHJvbWl1bShDCiAgICAgOiBDYW52
YXNMYXllckNocm9taXVtKGRlbGVnYXRlKQogICAgICwgbV9jb250ZXh0KDApCiAgICAgLCBtX3Rl
eHR1cmVDaGFuZ2VkKHRydWUpCi0gICAgLCBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1pdGluZ0V4
dGVuc2lvbihmYWxzZSkKLSAgICAsIG1fcmF0ZUxpbWl0aW5nVGltZXIodGhpcywgJldlYkdMTGF5
ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4dCkKICAgICAsIG1fdGV4dHVyZVVwZGF0ZWQoZmFs
c2UpCiB7CiB9CkBAIC0xMTUsMTkgKzExMywyMiBAQCBib29sIFdlYkdMTGF5ZXJDaHJvbWl1bTo6
cGFpbnRSZW5kZXJlZFJlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgV2ViR0xMYXllckNo
cm9taXVtOjpzZXRUZXh0dXJlVXBkYXRlZCgpCit2b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6Y29u
dGVudENoYW5nZWQoKQogewogICAgIG1fdGV4dHVyZVVwZGF0ZWQgPSB0cnVlOwogICAgIC8vIElm
IFdlYkdMIGNvbW1hbmRzIGFyZSBpc3N1ZWQgb3V0c2lkZSBvZiBhIHRoZSBhbmltYXRpb24gY2Fs
bGJhY2tzLCB0aGVuIHVzZQogICAgIC8vIGNhbGwgcmF0ZUxpbWl0T2Zmc2NyZWVuQ29udGV4dENI
Uk9NSVVNKCkgdG8ga2VlcCB0aGUgY29udGV4dCBmcm9tIGdldHRpbmcgdG9vIGZhciBhaGVhZC4K
LSAgICBpZiAobGF5ZXJUcmVlSG9zdCgpICYmICFsYXllclRyZWVIb3N0KCktPmFuaW1hdGluZygp
ICYmIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5zaW9uICYmICFtX3JhdGVMaW1p
dGluZ1RpbWVyLmlzQWN0aXZlKCkpCi0gICAgICAgIG1fcmF0ZUxpbWl0aW5nVGltZXIuc3RhcnRP
bmVTaG90KDApOworICAgIGlmIChsYXllclRyZWVIb3N0KCkpCisgICAgICAgIGxheWVyVHJlZUhv
c3QoKS0+c3RhcnRSYXRlTGltaXRlcihtX2NvbnRleHQpOwogfQogCiB2b2lkIFdlYkdMTGF5ZXJD
aHJvbWl1bTo6c2V0Q29udGV4dChjb25zdCBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCkKIHsK
ICAgICBib29sIGNvbnRleHRDaGFuZ2VkID0gKG1fY29udGV4dCAhPSBjb250ZXh0KTsKIAorICAg
IGlmIChsYXllclRyZWVIb3N0KCkgJiYgY29udGV4dENoYW5nZWQpCisgICAgICAgIGxheWVyVHJl
ZUhvc3QoKS0+c3RvcFJhdGVMaW1pdGVyKG1fY29udGV4dCk7CisKICAgICBtX2NvbnRleHQgPSBj
b25zdF9jYXN0PEdyYXBoaWNzQ29udGV4dDNEKj4oY29udGV4dCk7CiAKICAgICBpZiAoIW1fY29u
dGV4dCkKQEAgLTE0Miw3ICsxNDMsNiBAQCB2b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6c2V0Q29u
dGV4dChjb25zCiAgICAgR3JhcGhpY3NDb250ZXh0M0Q6OkF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9
IG1fY29udGV4dC0+Z2V0Q29udGV4dEF0dHJpYnV0ZXMoKTsKICAgICBtX2hhc0FscGhhID0gYXR0
cmlidXRlcy5hbHBoYTsKICAgICBtX3ByZW11bHRpcGxpZWRBbHBoYSA9IGF0dHJpYnV0ZXMucHJl
bXVsdGlwbGllZEFscGhhOwotICAgIG1fY29udGV4dFN1cHBvcnRzUmF0ZUxpbWl0aW5nRXh0ZW5z
aW9uID0gbV9jb250ZXh0LT5nZXRFeHRlbnNpb25zKCktPnN1cHBvcnRzKCJHTF9DSFJPTUlVTV9y
YXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7CiB9CiAKIEdyYXBoaWNzQ29udGV4dDNEKiBX
ZWJHTExheWVyQ2hyb21pdW06OmxheWVyUmVuZGVyZXJDb250ZXh0KCkKQEAgLTE1NCwxNiArMTU0
LDUgQEAgR3JhcGhpY3NDb250ZXh0M0QqIFdlYkdMTGF5ZXJDaHJvbWl1bTo6bAogICAgIHJldHVy
biBsYXllclRyZWVIb3N0KCktPmNvbnRleHQoKTsKIH0KIAotdm9pZCBXZWJHTExheWVyQ2hyb21p
dW06OnJhdGVMaW1pdENvbnRleHQoVGltZXI8V2ViR0xMYXllckNocm9taXVtPiopCi17Ci0gICAg
VFJBQ0VfRVZFTlQoIldlYkdMTGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4dCIsIHRoaXMs
IDApOwotCi0gICAgaWYgKCFtX2NvbnRleHQpCi0gICAgICAgIHJldHVybjsKLQotICAgIEV4dGVu
c2lvbnMzRENocm9taXVtKiBleHRlbnNpb25zID0gc3RhdGljX2Nhc3Q8RXh0ZW5zaW9uczNEQ2hy
b21pdW0qPihtX2NvbnRleHQtPmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgZXh0ZW5zaW9ucy0+cmF0
ZUxpbWl0T2Zmc2NyZWVuQ29udGV4dENIUk9NSVVNKCk7Ci19Ci0KIH0KICNlbmRpZiAvLyBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0u
aAkocmV2aXNpb24gOTgzNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9XZWJHTExheWVyQ2hyb21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtMzUsNyArMzUs
NiBAQAogI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKIAogI2luY2x1ZGUgIkNhbnZh
c0xheWVyQ2hyb21pdW0uaCIKLSNpbmNsdWRlICJUaW1lci5oIgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKQEAgLTUxLDcgKzUwLDcgQEAgcHVibGljOgogCiAgICAgdmlydHVhbCBib29sIGRyYXdz
Q29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb21wb3NpdG9yUmVzb3Vy
Y2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgQ0NUZXh0dXJlVXBkYXRlciYpOwotICAgIHZvaWQgc2V0
VGV4dHVyZVVwZGF0ZWQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29udGVudENoYW5nZWQoKTsKICAg
ICBib29sIHBhaW50UmVuZGVyZWRSZXN1bHRzVG9DYW52YXMoSW1hZ2VCdWZmZXIqKTsKIAogICAg
IHZvaWQgc2V0Q29udGV4dChjb25zdCBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCk7CkBAIC02
MywxNSArNjIsMTEgQEAgcHJpdmF0ZToKIAogICAgIEdyYXBoaWNzQ29udGV4dDNEKiBsYXllclJl
bmRlcmVyQ29udGV4dCgpOwogCi0gICAgdm9pZCByYXRlTGltaXRDb250ZXh0KFRpbWVyPFdlYkdM
TGF5ZXJDaHJvbWl1bT4qKTsKLQogICAgIC8vIEdyYXBoaWNzQ29udGV4dDNEOjpwbGF0Zm9ybUxh
eWVyIGhhcyBhIHNpZGUtZWZmZWN0IG9mIGFzc2lnbmluZyBpdHNlbGYKICAgICAvLyB0byB0aGUg
bGF5ZXIuIEJlY2F1c2Ugb2YgdGhhdCBHcmFwaGljc0NvbnRleHQzRCdzIGRlc3RydWN0b3Igd2ls
bCByZXNldAogICAgIC8vIGxheWVyJ3MgY29udGV4dCB0byAwLgogICAgIEdyYXBoaWNzQ29udGV4
dDNEKiBtX2NvbnRleHQ7CiAgICAgYm9vbCBtX3RleHR1cmVDaGFuZ2VkOwotICAgIGJvb2wgbV9j
b250ZXh0U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb247Ci0gICAgVGltZXI8V2ViR0xMYXll
ckNocm9taXVtPiBtX3JhdGVMaW1pdGluZ1RpbWVyOwogICAgIGJvb2wgbV90ZXh0dXJlVXBkYXRl
ZDsKIH07CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNwcAkocmV2aXNpb24g
OTgzNzYpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q0xheWVyVHJlZUhvc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MzAsNCArNDMwLDI4IEBAIHZv
aWQgQ0NMYXllclRyZWVIb3N0OjphcHBseVNjcm9sbERlbHRhcygKICAgICB9CiB9CiAKK3ZvaWQg
Q0NMYXllclRyZWVIb3N0OjpzdGFydFJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKiBjb250
ZXh0KQoreworICAgIGlmIChhbmltYXRpbmcoKSkKKyAgICAgICAgcmV0dXJuOworICAgIEFTU0VS
VChjb250ZXh0KTsKKyAgICBSYXRlTGltaXRlck1hcDo6aXRlcmF0b3IgaSA9IG1fcmF0ZUxpbWl0
ZXJzLmZpbmQoY29udGV4dCk7CisgICAgaWYgKGkgIT0gbV9yYXRlTGltaXRlcnMuZW5kKCkpCisg
ICAgICAgIGktPnNlY29uZC0+c3RhcnQoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgUmVmUHRyPFJh
dGVMaW1pdGVyPiByYXRlTGltaXRlciA9IFJhdGVMaW1pdGVyOjpjcmVhdGUoY29udGV4dCk7Cisg
ICAgICAgIG1fcmF0ZUxpbWl0ZXJzLnNldChjb250ZXh0LCByYXRlTGltaXRlcik7CisgICAgICAg
IHJhdGVMaW1pdGVyLT5zdGFydCgpOworICAgIH0KK30KKwordm9pZCBDQ0xheWVyVHJlZUhvc3Q6
OnN0b3BSYXRlTGltaXRlcihHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCkKK3sKKyAgICBSYXRl
TGltaXRlck1hcDo6aXRlcmF0b3IgaSA9IG1fcmF0ZUxpbWl0ZXJzLmZpbmQoY29udGV4dCk7Cisg
ICAgaWYgKGkgIT0gbV9yYXRlTGltaXRlcnMuZW5kKCkpIHsKKyAgICAgICAgaS0+c2Vjb25kLT5z
dG9wKCk7CisgICAgICAgIG1fcmF0ZUxpbWl0ZXJzLnJlbW92ZShpKTsKKyAgICB9Cit9CisKIH0K
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5
ZXJUcmVlSG9zdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5oCShyZXZpc2lvbiA5ODM3NikKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9z
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNywxMCArMjcsMTIgQEAKIAogI2luY2x1ZGUgIkdyYXBo
aWNzVHlwZXMzRC5oIgogI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJSYXRlTGltaXRl
ci5oIgogI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCiAjaW5jbHVkZSAiY2MvQ0NM
YXllclRyZWVIb3N0Q29tbW9uLmgiCiAjaW5jbHVkZSAiY2MvQ0NQcm94eS5oIgogCisjaW5jbHVk
ZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgogI2luY2x1ZGUg
PHd0Zi9QYXNzUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1JlZkNvdW50ZWQuaD4KQEAgLTQ4LDYg
KzUwLDcgQEAgY2xhc3MgTGF5ZXJDaHJvbWl1bTsKIGNsYXNzIExheWVyUGFpbnRlckNocm9taXVt
OwogY2xhc3MgVGV4dHVyZUFsbG9jYXRvcjsKIGNsYXNzIFRleHR1cmVNYW5hZ2VyOwordHlwZWRl
ZiBIYXNoTWFwPEdyYXBoaWNzQ29udGV4dDNEKiwgUmVmUHRyPFJhdGVMaW1pdGVyPiA+IFJhdGVM
aW1pdGVyTWFwOwogCiBjbGFzcyBDQ0xheWVyVHJlZUhvc3RDbGllbnQgewogcHVibGljOgpAQCAt
MTYwLDYgKzE2Myw4IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291
cmNlcyhHcmFwaGljc0NvbnRleHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKTsKICAgICB2b2lkIGFw
cGx5U2Nyb2xsRGVsdGFzKGNvbnN0IENDU2Nyb2xsVXBkYXRlU2V0Jik7CisgICAgdm9pZCBzdGFy
dFJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4dDNEKik7CisgICAgdm9pZCBzdG9wUmF0ZUxpbWl0
ZXIoR3JhcGhpY3NDb250ZXh0M0QqKTsKIHByb3RlY3RlZDoKICAgICBDQ0xheWVyVHJlZUhvc3Qo
Q0NMYXllclRyZWVIb3N0Q2xpZW50KiwgUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiByb290TGF5
ZXIsIGNvbnN0IENDU2V0dGluZ3MmKTsKICAgICBib29sIGluaXRpYWxpemUoKTsKQEAgLTE5NCw2
ICsxOTksNyBAQCBwcml2YXRlOgogICAgIEludFNpemUgbV92aWV3cG9ydFNpemU7CiAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggbV96b29tQW5pbWF0b3JUcmFuc2Zvcm07CiAgICAgYm9vbCBtX3Zp
c2libGU7CisgICAgUmF0ZUxpbWl0ZXJNYXAgbV9yYXRlTGltaXRlcnM7CiB9OwogCiB9CkluZGV4
OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gOTgzNzYpCisrKyBTb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisy
MDExLTEwLTI1ICBTdGVwaGVuIFdoaXRlICA8c2Vub3JibGFuY29AY2hyb21pdW0ub3JnPgorCisg
ICAgICAgIFtjaHJvbWl1bV0gQ2FudmFzMkQgc2hvdWxkIHJhdGUtbGltaXQgZHJhd2luZyB0byBw
cmV2ZW50IHN3YW1waW5nIHRoZSBHUFUgcHJvY2Vzcy4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcwMzY3CisKKyAgICAgICAgKiBzcmMvR3JhcGhpY3ND
b250ZXh0M0RDaHJvbWl1bS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRleHQz
RFByaXZhdGU6Om1hcmtDb250ZXh0Q2hhbmdlZCk6CisgICAgICAgIFJlbW92ZSB0aGUgY2FsbCB0
byBzZXRUZXh0dXJlQ2hhbmdlZCAoaXQgd2lsbCBiZSBoYW5kbGVkIGludGVybmFsbHkKKyAgICAg
ICAgYnkgdGhlIGNvbXBvc2l0b3IgaW4gc2V0Q29udGV4dE5lZWRzRGlzcGxheSgpIGluc3RlYWQp
LiAgVGhpcyBkZWNvdXBsZXMKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0M0QgZnJvbSBXZWJHTExh
eWVyQ2hyb21pdW0gYSBiaXQuCisKIDIwMTEtMTAtMjUgIEdlbmUgR2lyYXJkICA8Z2lyYXJkQGNo
cm9taXVtLm9yZz4KIAogICAgICAgICBSZS1lbmFibGUgdG91Y2ggdGVzdHMgKGZyb20gNjY1Nzcp
CkluZGV4OiBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9t
aXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViS2l0L2Nocm9taXVtL3NyYy9HcmFwaGlj
c0NvbnRleHQzRENocm9taXVtLmNwcAkocmV2aXNpb24gOTgzNzYpCisrKyBTb3VyY2UvV2ViS2l0
L2Nocm9taXVtL3NyYy9HcmFwaGljc0NvbnRleHQzRENocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjI1LDkgKzIyNSw2IEBAIFdlYkdMTGF5ZXJDaHJvbWl1bSogR3JhcGhpY3NDb250ZXh0
M0RQcmkKIAogdm9pZCBHcmFwaGljc0NvbnRleHQzRFByaXZhdGU6Om1hcmtDb250ZXh0Q2hhbmdl
ZCgpCiB7Ci0jaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQotICAgIHBsYXRmb3JtTGF5
ZXIoKS0+c2V0VGV4dHVyZVVwZGF0ZWQoKTsKLSNlbmRpZgogICAgIG1fbGF5ZXJDb21wb3NpdGVk
ID0gZmFsc2U7CiB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112403</attachid>
            <date>2011-10-25 14:30:28 -0700</date>
            <delta_ts>2011-10-25 15:55:59 -0700</delta_ts>
            <desc>fixed nits</desc>
            <filename>bug-70367-20111025173026.patch</filename>
            <type>text/plain</type>
            <size>19858</size>
            <attacher name="Stephen White">senorblanco</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTkgQEAKKzIwMTEtMTAtMjUgIFN0ZXBoZW4g
V2hpdGUgIDxzZW5vcmJsYW5jb0BjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgW2Nocm9taXVtXSBD
YW52YXMyRCBzaG91bGQgcmF0ZS1saW1pdCBkcmF3aW5nIHRvIHByZXZlbnQgc3dhbXBpbmcgdGhl
IEdQVSBwcm9jZXNzLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9NzAzNjcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBTYWRseSwgd2UgZG9uJ3QgaGF2ZSBpbmZyYXN0cnVjdHVyZSB0byB0ZXN0IHRoaXMga2lu
ZCBvZiBHUFUgc3dhbXBpbmcKKyAgICAgICAgeWV0LgorCisgICAgICAgICogV2ViQ29yZS5neXBp
OgorICAgICAgICBBZGQgUmF0ZUxpbWl0ZXIuKiB0byB0aGUgQ2hyb21pdW0gYnVpbGQuCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVtLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNhbnZhczJETGF5ZXJDaHJvbWl1bTo6Y29udGVudENoYW5n
ZWQpOgorICAgICAgICBXaGVuIHRoZSBsYXllciBpcyBub3RpZmllZCB0aGF0IHRoZSBjb250ZW50
cyBoYXZlIGNoYW5nZWQsIHBpbmcgdGhlCisgICAgICAgIHJhdGUgbGltaXRlci4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaDoKKyAg
ICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0u
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NMYXllckNocm9taXVtOjpzZXRDb250ZW50
c05lZWRzRGlzcGxheSk6CisgICAgICAgIENhbGwgKG5ldykgdmlydHVhbCBjb250ZW50Q2hhbmdl
ZCgpIG9uIGEgbGF5ZXIgd2hlbiBpdHMgY29udGVudHMgaGF2ZQorICAgICAgICBiZWVuIGNoYW5n
ZWQgKGUuZy4sIGJ5IGEgZHJhd2luZyBjYWxsKS4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9MYXllckNocm9taXVtLmg6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNocm9t
aXVtOjpjb250ZW50Q2hhbmdlZCk6CisgICAgICAgIE5ldyB2aXJ0dWFsIGNvbnRlbnRDaGFuZ2Vk
KCkuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVMaW1pdGVyOjpjcmVhdGUpOgorICAgICAg
ICBSYXRlIGxpbWl0ZXIgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OlJhdGVM
aW1pdGVyOjpSYXRlTGltaXRlcik6CisgICAgICAgIChXZWJDb3JlOjpSYXRlTGltaXRlcjo6c3Rh
cnQpOgorICAgICAgICBQdWJsaWMgQVBJIHRvIHN0YXJ0IHJhdGUgbGltaXRpbmcgYSBjb250ZXh0
LgorICAgICAgICAoV2ViQ29yZTo6UmF0ZUxpbWl0ZXI6OnN0b3ApOgorICAgICAgICBQdWJsaWMg
QVBJIHRvIHN0b3AgcmF0ZSBsaW1pdGluZyBhIGNvbnRleHQuCisgICAgICAgIChXZWJDb3JlOjpS
YXRlTGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCk6CisgICAgICAgIEludGVybmFsIHRpbWVyIGNh
bGxiYWNrIHdoZW4gYSBjb250ZXh0IHNob3VsZCBiZSByYXRlIGxpbWl0ZWQuCisgICAgICAgICog
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuaDogQWRkZWQuCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OldlYkdMTGF5ZXJDaHJvbWl1bTo6V2ViR0xMYXllckNocm9taXVtKToK
KyAgICAgICAgUmVtb3ZlIHJhdGUgbGltaXRpbmcgdGltZXIgYW5kIGV4dGVuc2lvbiBjaGVjayAo
bW92ZWQgdG8gUmF0ZUxpbWl0ZXIpLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xMYXllckNocm9t
aXVtOjpjb250ZW50Q2hhbmdlZCk6CisgICAgICAgIFRoZSBmdW5jdGlvbiBmb3JtZXJseSBrbm93
biBhcyBzZXRUZXh0dXJlVXBkYXRlZCgpLCBub3cgcmVuYW1lZCB0bworICAgICAgICBtYXRjaCB0
aGUgYmFzZSBjbGFzcyB2aXJ0dWFsIGNvbnRlbnRDaGFuZ2VkKCkuICBDYWxsIHJhdGUgbGltaXRl
ciBpbgorICAgICAgICBDQ0xheWVyVHJlZUhvc3QgKGxvY2FsIGltcGxlbWVudGF0aW9uIHJlbW92
ZWQpLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xMYXllckNocm9taXVtOjpzZXRDb250ZXh0KToK
KyAgICAgICAgV2hlbiB0aGUgY29udGV4dCBpcyBjaGFuZ2VkLCBzdG9wIHRoZSBwZW5kaW5nIHJh
dGUgbGltaXRlciBvbiB0aGUgb2xkCisgICAgICAgIGNvbnRleHQuICBSZW1vdmUgZXh0ZW5zaW9u
IGNoZWNrIChtb3ZlZCB0byBSYXRlTGltaXRlcikuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmg6CisgICAgICAgIFJlbW92ZSByYXRlIGxp
bWl0aW5nIHRpbWVyIGFuZCBleHRlbnNpb24gY2hlY2sgKG1vdmVkIHRvIFJhdGVMaW1pdGVyKS4K
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhvc3Qu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0OjpzdGFydFJhdGVMaW1pdGVy
KToKKyAgICAgICAgUHVibGljIEFQSSBmb3Igc3RhcnRpbmcgcGVyLWNvbnRleHQgcmF0ZSBsaW1p
dGVyLgorICAgICAgICAoV2ViQ29yZTo6Q0NMYXllclRyZWVIb3N0OjpzdG9wUmF0ZUxpbWl0ZXIp
OgorICAgICAgICBQdWJsaWMgQVBJIGZvciBzdG9wcGluZyBwZXItY29udGV4dCByYXRlIGxpbWl0
ZXIuCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVI
b3N0Lmg6CisgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHBlci1HcmFwaGljc0NvbnRleHQzRCBS
YXRlTGltaXRlci4KKworCiAyMDExLTEwLTI1ICBDaHJpcyBFdmFucyAgPGNldmFuc0Bnb29nbGUu
Y29tPgogCiAgICAgICAgIE1hbmFnZSB0aGUgQ1NTIHByb3BlcnR5IGFycmF5IGxlbmd0aCBjb3Jy
ZWN0bHkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dl
YkNvcmUvV2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0zNDk2LDYgKzM0OTYsOCBAQAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1BsdWdpbkxheWVyQ2hyb21p
dW0uaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUHJvZ3JhbUJp
bmRpbmcuY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Qcm9n
cmFtQmluZGluZy5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9S
YXRlTGltaXRlci5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L1JhdGVMaW1pdGVyLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L1JlbmRlclN1cmZhY2VDaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL1JlbmRlclN1cmZhY2VDaHJvbWl1bS5oJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaGFkZXJDaHJvbWl1bS5jcHAnLApJbmRleDogU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzMkRMYXllckNocm9taXVt
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJv
bWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM3NikKKysrIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1
bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAKIAogI2luY2x1ZGUgIkV4dGVu
c2lvbnMzRENocm9taXVtLmgiCiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNpbmNs
dWRlICJjYy9DQ0xheWVyVHJlZUhvc3QuaCIKIAogI2lmIFVTRShTS0lBKQogI2luY2x1ZGUgIkdy
Q29udGV4dC5oIgpAQCAtODQsNSArODUsMTEgQEAgdm9pZCBDYW52YXMyRExheWVyQ2hyb21pdW06
OnVwZGF0ZUNvbXBvcwogICAgIHJlc2V0TmVlZHNEaXNwbGF5KCk7CiB9CiAKK3ZvaWQgQ2FudmFz
MkRMYXllckNocm9taXVtOjpjb250ZW50Q2hhbmdlZCgpCit7CisgICAgaWYgKGxheWVyVHJlZUhv
c3QoKSkKKyAgICAgICAgbGF5ZXJUcmVlSG9zdCgpLT5zdGFydFJhdGVMaW1pdGVyKG1fY29udGV4
dCk7Cit9CisKIH0KICNlbmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVy
Q2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hyb21pdW0uaAkocmV2aXNpb24gOTgzNzYpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXMyRExheWVyQ2hy
b21pdW0uaAkod29ya2luZyBjb3B5KQpAQCAtNDgsNyArNDgsNyBAQCBwdWJsaWM6CiAgICAgdmly
dHVhbCBib29sIGRyYXdzQ29udGVudCgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVD
b21wb3NpdG9yUmVzb3VyY2VzKEdyYXBoaWNzQ29udGV4dDNEKiwgQ0NUZXh0dXJlVXBkYXRlciYp
OwogCi0gICAgdm9pZCBzZXRUZXh0dXJlQ2hhbmdlZCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250
ZW50Q2hhbmdlZCgpOwogCiBwcml2YXRlOgogICAgIGV4cGxpY2l0IENhbnZhczJETGF5ZXJDaHJv
bWl1bShHcmFwaGljc0NvbnRleHQzRCopOwpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vR3JhcGhpY3NMYXllckNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM3NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0dyYXBoaWNzTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMwNyw4ICszMDcsMTAgQEAgdm9pZCBHcmFwaGljc0xheWVyQ2hyb21pdW06OnNldFJl
cGxpY2F0ZQogCiB2b2lkIEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0Q29udGVudHNOZWVkc0Rp
c3BsYXkoKQogewotICAgIGlmIChtX2NvbnRlbnRzTGF5ZXIpCisgICAgaWYgKG1fY29udGVudHNM
YXllcikgewogICAgICAgICBtX2NvbnRlbnRzTGF5ZXItPnNldE5lZWRzRGlzcGxheSgpOworICAg
ICAgICBtX2NvbnRlbnRzTGF5ZXItPmNvbnRlbnRDaGFuZ2VkKCk7CisgICAgfQogfQogCiB2b2lk
IEdyYXBoaWNzTGF5ZXJDaHJvbWl1bTo6c2V0TmVlZHNEaXNwbGF5KCkKSW5kZXg6IFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0xheWVyQ2hyb21pdW0uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9MYXllckNo
cm9taXVtLmgJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vTGF5ZXJDaHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTYsNiAr
MTk2LDcgQEAgcHVibGljOgogCiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgbGF5
ZXIncyBkZXNjZW5kYW50cyBoYXMgY29udGVudCB0byBkcmF3LgogICAgIGJvb2wgZGVzY2VuZGFu
dERyYXdzQ29udGVudCgpOworICAgIHZpcnR1YWwgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsgfQog
CiAgICAgQ0NMYXllclRyZWVIb3N0KiBsYXllclRyZWVIb3N0KCkgY29uc3QgeyByZXR1cm4gbV9s
YXllclRyZWVIb3N0LmdldCgpOyB9CiAgICAgdm9pZCBjbGVhbnVwUmVzb3VyY2VzUmVjdXJzaXZl
KCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRl
TGltaXRlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAwKQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuY3BwCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Cisg
KiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgVVNF
KEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorCisjaW5jbHVkZSAiUmF0ZUxpbWl0ZXIuaCIKKwor
I2luY2x1ZGUgIkV4dGVuc2lvbnMzRENocm9taXVtLmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250
ZXh0M0QuaCIKKyNpbmNsdWRlICJUcmFjZUV2ZW50LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworUGFzc1JlZlB0cjxSYXRlTGltaXRlcj4gUmF0ZUxpbWl0ZXI6OmNyZWF0ZShHcmFwaGljc0Nv
bnRleHQzRCogY29udGV4dCkKK3sKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IFJhdGVMaW1pdGVy
KGNvbnRleHQpKTsKK30KKworUmF0ZUxpbWl0ZXI6OlJhdGVMaW1pdGVyKEdyYXBoaWNzQ29udGV4
dDNEKiBjb250ZXh0KQorICAgIDogbV9jb250ZXh0KGNvbnRleHQpCisgICAgLCBtX3RpbWVyKHRo
aXMsICZSYXRlTGltaXRlcjo6cmF0ZUxpbWl0Q29udGV4dCkKK3sKKyAgICBBU1NFUlQoY29udGV4
dCk7CisgICAgQVNTRVJUKGNvbnRleHQtPmdldEV4dGVuc2lvbnMoKSk7CisgICAgbV9jb250ZXh0
U3VwcG9ydHNSYXRlTGltaXRpbmdFeHRlbnNpb24gPSBjb250ZXh0LT5nZXRFeHRlbnNpb25zKCkt
PnN1cHBvcnRzKCJHTF9DSFJPTUlVTV9yYXRlX2xpbWl0X29mZnNjcmVlbl9jb250ZXh0Iik7Cit9
CisKK3ZvaWQgUmF0ZUxpbWl0ZXI6OnN0YXJ0KCkKK3sKKyAgICBpZiAobV9jb250ZXh0U3VwcG9y
dHNSYXRlTGltaXRpbmdFeHRlbnNpb24gJiYgIW1fdGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAg
bV90aW1lci5zdGFydE9uZVNob3QoMCk7Cit9CisKK3ZvaWQgUmF0ZUxpbWl0ZXI6OnN0b3AoKQor
eworICAgIG1fdGltZXIuc3RvcCgpOworfQorCit2b2lkIFJhdGVMaW1pdGVyOjpyYXRlTGltaXRD
b250ZXh0KFRpbWVyPFJhdGVMaW1pdGVyPiopCit7CisgICAgVFJBQ0VfRVZFTlQoIlJhdGVMaW1p
dGVyOjpyYXRlTGltaXRDb250ZXh0IiwgdGhpcywgMCk7CisKKyAgICBFeHRlbnNpb25zM0RDaHJv
bWl1bSogZXh0ZW5zaW9ucyA9IHN0YXRpY19jYXN0PEV4dGVuc2lvbnMzRENocm9taXVtKj4obV9j
b250ZXh0LT5nZXRFeHRlbnNpb25zKCkpOworCisgICAgZXh0ZW5zaW9ucy0+cmF0ZUxpbWl0T2Zm
c2NyZWVuQ29udGV4dENIUk9NSVVNKCk7Cit9CisKK30KKyNlbmRpZiAvLyBVU0UoQUNDRUxFUkFU
RURfQ09NUE9TSVRJTkcpCgpQcm9wZXJ0eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5jcHAKX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBZGRlZDog
c3ZuOmVvbC1zdHlsZQogICArIExGCgpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9SYXRlTGltaXRlci5oCShyZXZpc2lvbiAwKQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vUmF0ZUxpbWl0ZXIu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgUmF0ZUxpbWl0
ZXJfaAorI2RlZmluZSBSYXRlTGltaXRlcl9oCisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9T
SVRJTkcpCisKKyNpbmNsdWRlICJQYXNzUmVmUHRyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNp
bmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEdyYXBoaWNzQ29udGV4dDNEOworCisvLyBBIGNsYXNzIGNvbnRhaW5pbmcgYSB0aW1lciwgd2hp
Y2ggY2FsbHMgcmF0ZUxpbWl0Q0hST01JVU0gb24gZXhwaXJ5CitjbGFzcyBSYXRlTGltaXRlciA6
IHB1YmxpYyBSZWZDb3VudGVkPFJhdGVMaW1pdGVyPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBh
c3NSZWZQdHI8UmF0ZUxpbWl0ZXI+IGNyZWF0ZShHcmFwaGljc0NvbnRleHQzRCopOworICAgIHZv
aWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKworcHJpdmF0ZToKKyAgICBleHBsaWNpdCBS
YXRlTGltaXRlcihHcmFwaGljc0NvbnRleHQzRCopOworICAgIEdyYXBoaWNzQ29udGV4dDNEKiBt
X2NvbnRleHQ7CisgICAgYm9vbCBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lv
bjsKKyAgICBUaW1lcjxSYXRlTGltaXRlcj4gbV90aW1lcjsKKyAgICB2b2lkIHJhdGVMaW1pdENv
bnRleHQoVGltZXI8UmF0ZUxpbWl0ZXI+Kik7Cit9OworCit9CisjZW5kaWYgLy8gVVNFKEFDQ0VM
RVJBVEVEX0NPTVBPU0lUSU5HKQorCisjZW5kaWYKClByb3BlcnR5IGNoYW5nZXMgb246IFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL1JhdGVMaW1pdGVyLmgKX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fXwpBZGRlZDogc3ZuOmVvbC1zdHlsZQogICArIExGCgpJbmRleDogU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9XZWJHTExh
eWVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA5ODM3NikKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2Nocm9taXVtL1dlYkdMTGF5ZXJDaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTUwLDE0ICs1MCwxNCBAQCBXZWJHTExheWVyQ2hyb21pdW06OldlYkdMTGF5ZXJDaHJv
bWl1bShDCiAgICAgOiBDYW52YXNMYXllckNocm9taXVtKGRlbGVnYXRlKQogICAgICwgbV9jb250
ZXh0KDApCiAgICAgLCBtX3RleHR1cmVDaGFuZ2VkKHRydWUpCi0gICAgLCBtX2NvbnRleHRTdXBw
b3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lvbihmYWxzZSkKLSAgICAsIG1fcmF0ZUxpbWl0aW5nVGlt
ZXIodGhpcywgJldlYkdMTGF5ZXJDaHJvbWl1bTo6cmF0ZUxpbWl0Q29udGV4dCkKICAgICAsIG1f
dGV4dHVyZVVwZGF0ZWQoZmFsc2UpCiB7CiB9CiAKIFdlYkdMTGF5ZXJDaHJvbWl1bTo6fldlYkdM
TGF5ZXJDaHJvbWl1bSgpCiB7CisgICAgaWYgKG1fY29udGV4dCAmJiBsYXllclRyZWVIb3N0KCkp
CisgICAgICAgIGxheWVyVHJlZUhvc3QoKS0+c3RvcFJhdGVMaW1pdGVyKG1fY29udGV4dCk7CiB9
CiAKIGJvb2wgV2ViR0xMYXllckNocm9taXVtOjpkcmF3c0NvbnRlbnQoKSBjb25zdApAQCAtMTE1
LDE5ICsxMTUsMjIgQEAgYm9vbCBXZWJHTExheWVyQ2hyb21pdW06OnBhaW50UmVuZGVyZWRSZQog
ICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIFdlYkdMTGF5ZXJDaHJvbWl1bTo6c2V0VGV4dHVy
ZVVwZGF0ZWQoKQordm9pZCBXZWJHTExheWVyQ2hyb21pdW06OmNvbnRlbnRDaGFuZ2VkKCkKIHsK
ICAgICBtX3RleHR1cmVVcGRhdGVkID0gdHJ1ZTsKICAgICAvLyBJZiBXZWJHTCBjb21tYW5kcyBh
cmUgaXNzdWVkIG91dHNpZGUgb2YgYSB0aGUgYW5pbWF0aW9uIGNhbGxiYWNrcywgdGhlbiB1c2UK
ICAgICAvLyBjYWxsIHJhdGVMaW1pdE9mZnNjcmVlbkNvbnRleHRDSFJPTUlVTSgpIHRvIGtlZXAg
dGhlIGNvbnRleHQgZnJvbSBnZXR0aW5nIHRvbyBmYXIgYWhlYWQuCi0gICAgaWYgKGxheWVyVHJl
ZUhvc3QoKSAmJiAhbGF5ZXJUcmVlSG9zdCgpLT5hbmltYXRpbmcoKSAmJiBtX2NvbnRleHRTdXBw
b3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lvbiAmJiAhbV9yYXRlTGltaXRpbmdUaW1lci5pc0FjdGl2
ZSgpKQotICAgICAgICBtX3JhdGVMaW1pdGluZ1RpbWVyLnN0YXJ0T25lU2hvdCgwKTsKKyAgICBp
ZiAobGF5ZXJUcmVlSG9zdCgpKQorICAgICAgICBsYXllclRyZWVIb3N0KCktPnN0YXJ0UmF0ZUxp
bWl0ZXIobV9jb250ZXh0KTsKIH0KIAogdm9pZCBXZWJHTExheWVyQ2hyb21pdW06OnNldENvbnRl
eHQoY29uc3QgR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpCiB7CiAgICAgYm9vbCBjb250ZXh0
Q2hhbmdlZCA9IChtX2NvbnRleHQgIT0gY29udGV4dCk7CiAKKyAgICBpZiAobGF5ZXJUcmVlSG9z
dCgpICYmIGNvbnRleHRDaGFuZ2VkKQorICAgICAgICBsYXllclRyZWVIb3N0KCktPnN0b3BSYXRl
TGltaXRlcihtX2NvbnRleHQpOworCiAgICAgbV9jb250ZXh0ID0gY29uc3RfY2FzdDxHcmFwaGlj
c0NvbnRleHQzRCo+KGNvbnRleHQpOwogCiAgICAgaWYgKCFtX2NvbnRleHQpCkBAIC0xNDIsNyAr
MTQ1LDYgQEAgdm9pZCBXZWJHTExheWVyQ2hyb21pdW06OnNldENvbnRleHQoY29ucwogICAgIEdy
YXBoaWNzQ29udGV4dDNEOjpBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBtX2NvbnRleHQtPmdldENv
bnRleHRBdHRyaWJ1dGVzKCk7CiAgICAgbV9oYXNBbHBoYSA9IGF0dHJpYnV0ZXMuYWxwaGE7CiAg
ICAgbV9wcmVtdWx0aXBsaWVkQWxwaGEgPSBhdHRyaWJ1dGVzLnByZW11bHRpcGxpZWRBbHBoYTsK
LSAgICBtX2NvbnRleHRTdXBwb3J0c1JhdGVMaW1pdGluZ0V4dGVuc2lvbiA9IG1fY29udGV4dC0+
Z2V0RXh0ZW5zaW9ucygpLT5zdXBwb3J0cygiR0xfQ0hST01JVU1fcmF0ZV9saW1pdF9vZmZzY3Jl
ZW5fY29udGV4dCIpOwogfQogCiBHcmFwaGljc0NvbnRleHQzRCogV2ViR0xMYXllckNocm9taXVt
OjpsYXllclJlbmRlcmVyQ29udGV4dCgpCkBAIC0xNTQsMTYgKzE1Niw1IEBAIEdyYXBoaWNzQ29u
dGV4dDNEKiBXZWJHTExheWVyQ2hyb21pdW06OmwKICAgICByZXR1cm4gbGF5ZXJUcmVlSG9zdCgp
LT5jb250ZXh0KCk7CiB9CiAKLXZvaWQgV2ViR0xMYXllckNocm9taXVtOjpyYXRlTGltaXRDb250
ZXh0KFRpbWVyPFdlYkdMTGF5ZXJDaHJvbWl1bT4qKQotewotICAgIFRSQUNFX0VWRU5UKCJXZWJH
TExheWVyQ2hyb21pdW06OnJhdGVMaW1pdENvbnRleHQiLCB0aGlzLCAwKTsKLQotICAgIGlmICgh
bV9jb250ZXh0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBFeHRlbnNpb25zM0RDaHJvbWl1bSog
ZXh0ZW5zaW9ucyA9IHN0YXRpY19jYXN0PEV4dGVuc2lvbnMzRENocm9taXVtKj4obV9jb250ZXh0
LT5nZXRFeHRlbnNpb25zKCkpOwotICAgIGV4dGVuc2lvbnMtPnJhdGVMaW1pdE9mZnNjcmVlbkNv
bnRleHRDSFJPTUlVTSgpOwotfQotCiB9CiAjZW5kaWYgLy8gVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
V2ViR0xMYXllckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXllckNocm9taXVtLmgJKHJldmlzaW9uIDk4Mzc2
KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vV2ViR0xMYXll
ckNocm9taXVtLmgJKHdvcmtpbmcgY29weSkKQEAgLTM1LDcgKzM1LDYgQEAKICNpZiBVU0UoQUND
RUxFUkFURURfQ09NUE9TSVRJTkcpCiAKICNpbmNsdWRlICJDYW52YXNMYXllckNocm9taXVtLmgi
Ci0jaW5jbHVkZSAiVGltZXIuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCkBAIC01MSw3ICs1
MCw3IEBAIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgYm9vbCBkcmF3c0NvbnRlbnQoKSBjb25zdDsK
ICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhHcmFwaGljc0NvbnRl
eHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKTsKLSAgICB2b2lkIHNldFRleHR1cmVVcGRhdGVkKCk7
CisgICAgdmlydHVhbCB2b2lkIGNvbnRlbnRDaGFuZ2VkKCk7CiAgICAgYm9vbCBwYWludFJlbmRl
cmVkUmVzdWx0c1RvQ2FudmFzKEltYWdlQnVmZmVyKik7CiAKICAgICB2b2lkIHNldENvbnRleHQo
Y29uc3QgR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpOwpAQCAtNjMsMTUgKzYyLDExIEBAIHBy
aXZhdGU6CiAKICAgICBHcmFwaGljc0NvbnRleHQzRCogbGF5ZXJSZW5kZXJlckNvbnRleHQoKTsK
IAotICAgIHZvaWQgcmF0ZUxpbWl0Q29udGV4dChUaW1lcjxXZWJHTExheWVyQ2hyb21pdW0+Kik7
Ci0KICAgICAvLyBHcmFwaGljc0NvbnRleHQzRDo6cGxhdGZvcm1MYXllciBoYXMgYSBzaWRlLWVm
ZmVjdCBvZiBhc3NpZ25pbmcgaXRzZWxmCiAgICAgLy8gdG8gdGhlIGxheWVyLiBCZWNhdXNlIG9m
IHRoYXQgR3JhcGhpY3NDb250ZXh0M0QncyBkZXN0cnVjdG9yIHdpbGwgcmVzZXQKICAgICAvLyBs
YXllcidzIGNvbnRleHQgdG8gMC4KICAgICBHcmFwaGljc0NvbnRleHQzRCogbV9jb250ZXh0Owog
ICAgIGJvb2wgbV90ZXh0dXJlQ2hhbmdlZDsKLSAgICBib29sIG1fY29udGV4dFN1cHBvcnRzUmF0
ZUxpbWl0aW5nRXh0ZW5zaW9uOwotICAgIFRpbWVyPFdlYkdMTGF5ZXJDaHJvbWl1bT4gbV9yYXRl
TGltaXRpbmdUaW1lcjsKICAgICBib29sIG1fdGV4dHVyZVVwZGF0ZWQ7CiB9OwogCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ0xheWVyVHJlZUhv
c3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL2NjL0NDTGF5ZXJUcmVlSG9zdC5jcHAJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDMwLDQgKzQzMCwyOCBAQCB2b2lkIENDTGF5ZXJUcmVlSG9z
dDo6YXBwbHlTY3JvbGxEZWx0YXMoCiAgICAgfQogfQogCit2b2lkIENDTGF5ZXJUcmVlSG9zdDo6
c3RhcnRSYXRlTGltaXRlcihHcmFwaGljc0NvbnRleHQzRCogY29udGV4dCkKK3sKKyAgICBpZiAo
YW5pbWF0aW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICBBU1NFUlQoY29udGV4dCk7CisgICAg
UmF0ZUxpbWl0ZXJNYXA6Oml0ZXJhdG9yIGl0ID0gbV9yYXRlTGltaXRlcnMuZmluZChjb250ZXh0
KTsKKyAgICBpZiAoaXQgIT0gbV9yYXRlTGltaXRlcnMuZW5kKCkpCisgICAgICAgIGl0LT5zZWNv
bmQtPnN0YXJ0KCk7CisgICAgZWxzZSB7CisgICAgICAgIFJlZlB0cjxSYXRlTGltaXRlcj4gcmF0
ZUxpbWl0ZXIgPSBSYXRlTGltaXRlcjo6Y3JlYXRlKGNvbnRleHQpOworICAgICAgICBtX3JhdGVM
aW1pdGVycy5zZXQoY29udGV4dCwgcmF0ZUxpbWl0ZXIpOworICAgICAgICByYXRlTGltaXRlci0+
c3RhcnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NMYXllclRyZWVIb3N0OjpzdG9wUmF0ZUxpbWl0
ZXIoR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQpCit7CisgICAgUmF0ZUxpbWl0ZXJNYXA6Oml0
ZXJhdG9yIGl0ID0gbV9yYXRlTGltaXRlcnMuZmluZChjb250ZXh0KTsKKyAgICBpZiAoaXQgIT0g
bV9yYXRlTGltaXRlcnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC0+c3RvcCgpOworICAg
ICAgICBtX3JhdGVMaW1pdGVycy5yZW1vdmUoaXQpOworICAgIH0KK30KKwogfQpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21p
dW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NMYXllclRyZWVIb3N0LmgJKHdvcmtp
bmcgY29weSkKQEAgLTI3LDEwICsyNywxMiBAQAogCiAjaW5jbHVkZSAiR3JhcGhpY3NUeXBlczNE
LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlJhdGVMaW1pdGVyLmgiCiAjaW5j
bHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKICNpbmNsdWRlICJjYy9DQ0xheWVyVHJlZUhv
c3RDb21tb24uaCIKICNpbmNsdWRlICJjYy9DQ1Byb3h5LmgiCiAKKyNpbmNsdWRlIDx3dGYvSGFz
aE1hcC5oPgogI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CiAjaW5jbHVkZSA8d3RmL1Bhc3NS
ZWZQdHIuaD4KICNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgpAQCAtMTYwLDYgKzE2Miw4IEBA
IHB1YmxpYzoKIAogICAgIHZvaWQgdXBkYXRlQ29tcG9zaXRvclJlc291cmNlcyhHcmFwaGljc0Nv
bnRleHQzRCosIENDVGV4dHVyZVVwZGF0ZXImKTsKICAgICB2b2lkIGFwcGx5U2Nyb2xsRGVsdGFz
KGNvbnN0IENDU2Nyb2xsVXBkYXRlU2V0Jik7CisgICAgdm9pZCBzdGFydFJhdGVMaW1pdGVyKEdy
YXBoaWNzQ29udGV4dDNEKik7CisgICAgdm9pZCBzdG9wUmF0ZUxpbWl0ZXIoR3JhcGhpY3NDb250
ZXh0M0QqKTsKIHByb3RlY3RlZDoKICAgICBDQ0xheWVyVHJlZUhvc3QoQ0NMYXllclRyZWVIb3N0
Q2xpZW50KiwgUGFzc1JlZlB0cjxMYXllckNocm9taXVtPiByb290TGF5ZXIsIGNvbnN0IENDU2V0
dGluZ3MmKTsKICAgICBib29sIGluaXRpYWxpemUoKTsKQEAgLTE5NCw2ICsxOTgsOCBAQCBwcml2
YXRlOgogICAgIEludFNpemUgbV92aWV3cG9ydFNpemU7CiAgICAgVHJhbnNmb3JtYXRpb25NYXRy
aXggbV96b29tQW5pbWF0b3JUcmFuc2Zvcm07CiAgICAgYm9vbCBtX3Zpc2libGU7CisgICAgdHlw
ZWRlZiBIYXNoTWFwPEdyYXBoaWNzQ29udGV4dDNEKiwgUmVmUHRyPFJhdGVMaW1pdGVyPiA+IFJh
dGVMaW1pdGVyTWFwOworICAgIFJhdGVMaW1pdGVyTWFwIG1fcmF0ZUxpbWl0ZXJzOwogfTsKIAog
fQpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDk4Mzc2KQorKysgU291
cmNlL1dlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwx
NCBAQAorMjAxMS0xMC0yNSAgU3RlcGhlbiBXaGl0ZSAgPHNlbm9yYmxhbmNvQGNocm9taXVtLm9y
Zz4KKworICAgICAgICBbY2hyb21pdW1dIENhbnZhczJEIHNob3VsZCByYXRlLWxpbWl0IGRyYXdp
bmcgdG8gcHJldmVudCBzd2FtcGluZyB0aGUgR1BVIHByb2Nlc3MuCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDM2NworCisgICAgICAgICogc3JjL0dy
YXBoaWNzQ29udGV4dDNEQ2hyb21pdW0uY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3ND
b250ZXh0M0RQcml2YXRlOjptYXJrQ29udGV4dENoYW5nZWQpOgorICAgICAgICBSZW1vdmUgdGhl
IGNhbGwgdG8gc2V0VGV4dHVyZUNoYW5nZWQgKGl0IHdpbGwgYmUgaGFuZGxlZCBpbnRlcm5hbGx5
CisgICAgICAgIGJ5IHRoZSBjb21wb3NpdG9yIGluIHNldENvbnRleHROZWVkc0Rpc3BsYXkoKSBp
bnN0ZWFkKS4gIFRoaXMgZGVjb3VwbGVzCisgICAgICAgIEdyYXBoaWNzQ29udGV4dDNEIGZyb20g
V2ViR0xMYXllckNocm9taXVtIGEgYml0LgorCiAyMDExLTEwLTI1ICBHZW5lIEdpcmFyZCAgPGdp
cmFyZEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmUtZW5hYmxlIHRvdWNoIHRlc3RzIChmcm9t
IDY2NTc3KQpJbmRleDogU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0
M0RDaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYktpdC9jaHJvbWl1bS9zcmMv
R3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDk4Mzc2KQorKysgU291cmNl
L1dlYktpdC9jaHJvbWl1bS9zcmMvR3JhcGhpY3NDb250ZXh0M0RDaHJvbWl1bS5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTIyNSw5ICsyMjUsNiBAQCBXZWJHTExheWVyQ2hyb21pdW0qIEdyYXBoaWNz
Q29udGV4dDNEUHJpCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjptYXJrQ29udGV4
dENoYW5nZWQoKQogewotI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykKLSAgICBwbGF0
Zm9ybUxheWVyKCktPnNldFRleHR1cmVVcGRhdGVkKCk7Ci0jZW5kaWYKICAgICBtX2xheWVyQ29t
cG9zaXRlZCA9IGZhbHNlOwogfQogCg==
</data>
<flag name="review"
          id="110475"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>