<?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>42124</bug_id>
          
          <creation_ts>2010-07-12 18:13:57 -0700</creation_ts>
          <short_desc>WebGLBuffer::associateBufferData(ArrayBufferView* array) copies incorrect data for sliced views</short_desc>
          <delta_ts>2010-08-06 11:04:37 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>
          <dependson>41884</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>oliver</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>zmo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>250211</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-07-12 18:13:57 -0700</bug_when>
    <thetext>From code inspection, WebGLBuffer::associateBufferData(ArrayBufferView* array) will copy the wrong data from the passed ArrayBufferView in the case where the WebGLBuffer is bound to the ELEMENT_ARRAY_BUFFER binding point, and the passed ArrayBufferView is a slice of a larger ArrayBuffer with a non-zero offset.

The reason is that the m_elementArrayBuffer is a copy of the entire backing store of the ArrayBufferView (ArrayBuffer::create(array-&gt;buffer().get())), but actually needs to be a copy of only the portion referenced by the view.

Ideally, both associateBufferData(ArrayBufferView*) and the new WebGLBuffer::associateBufferData(ArrayBuffer* array) being introduced in bug 41884 would be implemented in terms of an associateBufferDataImpl(ArrayBuffer*, int offset, int length). associateBufferSubData(long, ArrayBufferView*) and associateBufferSubData(long, ArrayBuffer*) should also share their implementations.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260252</commentid>
    <comment_count>1</comment_count>
      <attachid>63505</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-04 15:41:45 -0700</bug_when>
    <thetext>Created attachment 63505
patch

The test cases have been committed to khronos already and are copied over using copy-from-khronos script.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260309</commentid>
    <comment_count>2</comment_count>
      <attachid>63505</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-04 18:02:52 -0700</bug_when>
    <thetext>Comment on attachment 63505
patch

Generally looks very good. A few comments / questions.

&gt; Index: WebCore/ChangeLog
&gt; ===================================================================
&gt; --- WebCore/ChangeLog	(revision 64684)
&gt; +++ WebCore/ChangeLog	(working copy)
&gt; @@ -1,3 +1,17 @@
&gt; +2010-08-04  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        WebGLBuffer::associateBufferData(ArrayBufferView* array) copies incorrect data for sliced views
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=42124
&gt; +
&gt; +        * html/canvas/WebGLBuffer.cpp:
&gt; +        (WebCore::WebGLBuffer::associateBufferDataImpl): Helper function that&apos;s called by all associateBufferData().
&gt; +        (WebCore::WebGLBuffer::associateBufferData): Call associateBufferDataImpl().
&gt; +        (WebCore::WebGLBuffer::associateBufferSubDataImpl): Helper function that&apos;s called by all associateBufferSubData().
&gt; +        (WebCore::WebGLBuffer::associateBufferSubData): Call associateBufferSubDataImpl().
&gt; +        * html/canvas/WebGLBuffer.h: Declare helper functions.
&gt; +
&gt;  2010-08-04  Dan Bernstein  &lt;mitz@apple.com&gt;
&gt;  
&gt;          Build fix.
&gt; Index: WebCore/html/canvas/WebGLBuffer.cpp
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLBuffer.cpp	(revision 64660)
&gt; +++ WebCore/html/canvas/WebGLBuffer.cpp	(working copy)
&gt; @@ -52,148 +52,96 @@ void WebGLBuffer::_deleteObject(Platform
&gt;      context()-&gt;graphicsContext3D()-&gt;deleteBuffer(object);
&gt;  }
&gt;  
&gt; -bool WebGLBuffer::associateBufferData(int size)
&gt; +bool WebGLBuffer::associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength)
&gt;  {
&gt; -    if (!m_target)
&gt; +    if (array &amp;&amp; byteLength &amp;&amp; (byteOffset &gt;= array-&gt;byteLength() || array-&gt;byteLength() - byteOffset &lt; byteLength))

Are these checks sufficient to guard against integer overflow? Should we use the CheckedInt class?

&gt;          return false;
&gt;  
&gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; -        m_byteLength = size;
&gt; +    switch (m_target) {
&gt; +    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
&gt; +        m_byteLength = byteLength;
&gt;          clearCachedMaxIndices();
&gt; -        m_elementArrayBuffer = ArrayBuffer::create(size, 1);
&gt; -        if (!m_elementArrayBuffer) {
&gt; +        m_elementArrayBuffer = ArrayBuffer::create(byteLength, 1);
&gt; +        if (byteLength &amp;&amp; !m_elementArrayBuffer) {

Would it be better to explicitly test whether byteLength == 0?

&gt;              m_byteLength = 0;
&gt;              return false;
&gt;          }
&gt; +        if (array) {
&gt; +            // We must always clone the incoming data because client-side
&gt; +            // modifications without calling bufferData or bufferSubData
&gt; +            // must never be able to change the validation results.
&gt; +            memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()),
&gt; +                   static_cast&lt;unsigned char*&gt;(array-&gt;data()) + byteOffset,
&gt; +                   byteLength);
&gt; +        }
&gt;          return true;
&gt; -    } else if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; -        m_byteLength = size;
&gt; +    case GraphicsContext3D::ARRAY_BUFFER:
&gt; +        m_byteLength = byteLength;
&gt;          return true;
&gt; +    default:
&gt; +        return false;
&gt;      }
&gt; +}
&gt;  
&gt; -    return false;
&gt; +bool WebGLBuffer::associateBufferData(int size)
&gt; +{
&gt; +    if (size &lt; 0)
&gt; +        return false;
&gt; +    return associateBufferDataImpl(0, 0, static_cast&lt;unsigned&gt;(size));
&gt;  }
&gt;  
&gt;  bool WebGLBuffer::associateBufferData(ArrayBuffer* array)
&gt;  {
&gt; -    if (!m_target)
&gt; -        return false;
&gt;      if (!array)
&gt;          return false;
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; -        clearCachedMaxIndices();
&gt; -        m_byteLength = array-&gt;byteLength();
&gt; -        // We must always clone the incoming data because client-side
&gt; -        // modifications without calling bufferData or bufferSubData
&gt; -        // must never be able to change the validation results.
&gt; -        m_elementArrayBuffer = ArrayBuffer::create(array);
&gt; -        if (!m_elementArrayBuffer) {
&gt; -            m_byteLength = 0;
&gt; -            return false;
&gt; -        }
&gt; -        return true;
&gt; -    }
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; -        m_byteLength = array-&gt;byteLength();
&gt; -        return true;
&gt; -    }
&gt; -
&gt; -    return false;
&gt; +    return associateBufferDataImpl(array, 0, array-&gt;byteLength());
&gt;  }
&gt;  
&gt;  bool WebGLBuffer::associateBufferData(ArrayBufferView* array)
&gt;  {
&gt; -    if (!m_target)
&gt; -        return false;
&gt;      if (!array)
&gt;          return false;
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; -        clearCachedMaxIndices();
&gt; -        m_byteLength = array-&gt;byteLength();
&gt; -        // We must always clone the incoming data because client-side
&gt; -        // modifications without calling bufferData or bufferSubData
&gt; -        // must never be able to change the validation results.
&gt; -        m_elementArrayBuffer = ArrayBuffer::create(array-&gt;buffer().get());
&gt; -        if (!m_elementArrayBuffer) {
&gt; -            m_byteLength = 0;
&gt; -            return false;
&gt; -        }
&gt; -        return true;
&gt; -    }
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; -        m_byteLength = array-&gt;byteLength();
&gt; -        return true;
&gt; -    }
&gt; -    
&gt; -    return false;
&gt; +    return associateBufferDataImpl(array-&gt;buffer().get(), array-&gt;byteOffset(), array-&gt;byteLength());
&gt;  }
&gt;  
&gt; -bool WebGLBuffer::associateBufferSubData(long offset, ArrayBuffer* array)
&gt; +bool WebGLBuffer::associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned arrayByteLength)
&gt;  {
&gt; -    if (!m_target)
&gt; +    if (!array || offset &lt; 0)
&gt;          return false;
&gt; -    if (!array)
&gt; +    if (arrayByteLength &amp;&amp; (arrayByteOffset &gt;= array-&gt;byteLength() || array-&gt;byteLength() - arrayByteOffset &lt; arrayByteLength))

Same question as above about whether we should use CheckedInt.

&gt; +        return false;
&gt; +    unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; +    if (arrayByteLength &amp;&amp; (uoffset &gt;= m_byteLength || arrayByteLength &gt; m_byteLength - uoffset))

Same question about CheckedInt.

&gt;          return false;
&gt;  
&gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; +    switch (m_target) {
&gt; +    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
&gt;          clearCachedMaxIndices();
&gt; -
&gt; -        // We need to protect against integer overflow with these tests
&gt; -        if (offset &lt; 0)
&gt; -            return false;
&gt; -
&gt; -        unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; -        if (uoffset &gt; m_byteLength || array-&gt;byteLength() &gt; m_byteLength - uoffset)
&gt; -            return false;
&gt; -
&gt;          if (!m_elementArrayBuffer)
&gt;              return false;
&gt; -
&gt;          memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()) + offset,
&gt; -               static_cast&lt;unsigned char*&gt;(array-&gt;data()),
&gt; -               array-&gt;byteLength());
&gt; +               static_cast&lt;unsigned char*&gt;(array-&gt;data()) + arrayByteOffset,
&gt; +               arrayByteLength);
&gt; +        return true;
&gt; +    case GraphicsContext3D::ARRAY_BUFFER:
&gt;          return true;
&gt; +    default:
&gt; +        return false;
&gt;      }
&gt; +}
&gt;  
&gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER)
&gt; -        return array-&gt;byteLength() + offset &lt;= m_byteLength;
&gt; -
&gt; -    return false;
&gt; +bool WebGLBuffer::associateBufferSubData(long offset, ArrayBuffer* array)
&gt; +{
&gt; +    if (!array)
&gt; +        return false;
&gt; +    return associateBufferSubDataImpl(offset, array, 0, array-&gt;byteLength());
&gt;  }
&gt;  
&gt;  bool WebGLBuffer::associateBufferSubData(long offset, ArrayBufferView* array)
&gt;  {
&gt; -    if (!m_target)
&gt; -        return false;
&gt;      if (!array)
&gt;          return false;
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; -        clearCachedMaxIndices();
&gt; -
&gt; -        // We need to protect against integer overflow with these tests
&gt; -        if (offset &lt; 0)
&gt; -            return false;
&gt; -            
&gt; -        unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; -        if (uoffset &gt; m_byteLength || array-&gt;byteLength() &gt; m_byteLength - uoffset)
&gt; -            return false;
&gt; -            
&gt; -        if (!m_elementArrayBuffer)
&gt; -            return false;
&gt; -
&gt; -        memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()) + offset, array-&gt;baseAddress(), array-&gt;byteLength());
&gt; -        return true;
&gt; -    }
&gt; -
&gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER)
&gt; -        return array-&gt;byteLength() + offset &lt;= m_byteLength;
&gt; -
&gt; -    return false;
&gt; +    return associateBufferSubDataImpl(offset, array-&gt;buffer().get(), array-&gt;byteOffset(), array-&gt;byteLength());
&gt;  }
&gt;  
&gt;  unsigned WebGLBuffer::byteLength() const
&gt; Index: WebCore/html/canvas/WebGLBuffer.h
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLBuffer.h	(revision 64660)
&gt; +++ WebCore/html/canvas/WebGLBuffer.h	(working copy)
&gt; @@ -90,6 +90,11 @@ namespace WebCore {
&gt;  
&gt;          // Clears all of the cached max indices.
&gt;          void clearCachedMaxIndices();
&gt; +
&gt; +        // Helper function called by the three associateBufferData().
&gt; +        bool associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength);
&gt; +        // Helper function called by the two associateBufferSubData().
&gt; +        bool associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned arrayByteLength);
&gt;      };
&gt;      
&gt;  } // namespace WebCore
&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 64684)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2010-08-04  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        WebGLBuffer::associateBufferData(ArrayBufferView* array) copies incorrect data for sliced views
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=42124
&gt; +
&gt; +        * fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt: Adding test case for bufferData and bufferSubData with ArrayBufferView input.
&gt; +        * fast/canvas/webgl/draw-elements-out-of-bounds.html: Ditto.
&gt; +
&gt;  2010-08-04  Dan Bernstein  &lt;mitz@apple.com&gt;
&gt;  
&gt;          Reviewed by Simon Fraser.
&gt; Index: LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt	(revision 64660)
&gt; +++ LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt	(working copy)
&gt; @@ -28,6 +28,12 @@ PASS context.drawElements(context.TRIANG
&gt;  PASS context.drawElements(context.TRIANGLES, 0xffffffff, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_VALUE.
&gt;  PASS context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_OPERATION.
&gt;  PASS context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0x7fffffff) generated expected GL error: INVALID_OPERATION.
&gt; +PASS context.bufferData(context.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1), context.STATIC_DRAW) generated expected GL error: NO_ERROR.
&gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: NO_ERROR.
&gt; +PASS context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1])) generated expected GL error: NO_ERROR.
&gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_OPERATION.
&gt; +PASS context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1)) generated expected GL error: NO_ERROR.
&gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: NO_ERROR.
&gt;  
&gt;  Test buffer with interleaved (3+2) float vectors
&gt;  PASS context.drawElements(context.TRIANGLES, 9, context.UNSIGNED_SHORT, 0) generated expected GL error: NO_ERROR.
&gt; Index: LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html	(revision 64660)
&gt; +++ LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html	(working copy)
&gt; @@ -55,6 +55,13 @@ shouldGenerateGLError(context, context.I
&gt;  shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0)&quot;);
&gt;  shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0x7fffffff)&quot;);
&gt;  
&gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferData(context.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1), context.STATIC_DRAW)&quot;);
&gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1]))&quot;);
&gt; +shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1))&quot;);
&gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; +
&gt;  debug(&quot;&quot;)
&gt;  debug(&quot;Test buffer with interleaved (3+2) float vectors&quot;)
&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260321</commentid>
    <comment_count>3</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-04 18:37:27 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 63505 [details])
&gt; Generally looks very good. A few comments / questions.
&gt; 
&gt; &gt; Index: WebCore/ChangeLog
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/ChangeLog	(revision 64684)
&gt; &gt; +++ WebCore/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,17 @@
&gt; &gt; +2010-08-04  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        WebGLBuffer::associateBufferData(ArrayBufferView* array) copies incorrect data for sliced views
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=42124
&gt; &gt; +
&gt; &gt; +        * html/canvas/WebGLBuffer.cpp:
&gt; &gt; +        (WebCore::WebGLBuffer::associateBufferDataImpl): Helper function that&apos;s called by all associateBufferData().
&gt; &gt; +        (WebCore::WebGLBuffer::associateBufferData): Call associateBufferDataImpl().
&gt; &gt; +        (WebCore::WebGLBuffer::associateBufferSubDataImpl): Helper function that&apos;s called by all associateBufferSubData().
&gt; &gt; +        (WebCore::WebGLBuffer::associateBufferSubData): Call associateBufferSubDataImpl().
&gt; &gt; +        * html/canvas/WebGLBuffer.h: Declare helper functions.
&gt; &gt; +
&gt; &gt;  2010-08-04  Dan Bernstein  &lt;mitz@apple.com&gt;
&gt; &gt;  
&gt; &gt;          Build fix.
&gt; &gt; Index: WebCore/html/canvas/WebGLBuffer.cpp
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/html/canvas/WebGLBuffer.cpp	(revision 64660)
&gt; &gt; +++ WebCore/html/canvas/WebGLBuffer.cpp	(working copy)
&gt; &gt; @@ -52,148 +52,96 @@ void WebGLBuffer::_deleteObject(Platform
&gt; &gt;      context()-&gt;graphicsContext3D()-&gt;deleteBuffer(object);
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; -bool WebGLBuffer::associateBufferData(int size)
&gt; &gt; +bool WebGLBuffer::associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength)
&gt; &gt;  {
&gt; &gt; -    if (!m_target)
&gt; &gt; +    if (array &amp;&amp; byteLength &amp;&amp; (byteOffset &gt;= array-&gt;byteLength() || array-&gt;byteLength() - byteOffset &lt; byteLength))
&gt; 
&gt; Are these checks sufficient to guard against integer overflow? Should we use the CheckedInt class?

Yes, the logic is designed to avoid overflow.  However, I agree that using CheckedInt is a better option for readability.  Will revise.

&gt; 
&gt; &gt;          return false;
&gt; &gt;  
&gt; &gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; &gt; -        m_byteLength = size;
&gt; &gt; +    switch (m_target) {
&gt; &gt; +    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
&gt; &gt; +        m_byteLength = byteLength;
&gt; &gt;          clearCachedMaxIndices();
&gt; &gt; -        m_elementArrayBuffer = ArrayBuffer::create(size, 1);
&gt; &gt; -        if (!m_elementArrayBuffer) {
&gt; &gt; +        m_elementArrayBuffer = ArrayBuffer::create(byteLength, 1);
&gt; &gt; +        if (byteLength &amp;&amp; !m_elementArrayBuffer) {
&gt; 
&gt; Would it be better to explicitly test whether byteLength == 0?
&gt; 
&gt; &gt;              m_byteLength = 0;
&gt; &gt;              return false;
&gt; &gt;          }
&gt; &gt; +        if (array) {
&gt; &gt; +            // We must always clone the incoming data because client-side
&gt; &gt; +            // modifications without calling bufferData or bufferSubData
&gt; &gt; +            // must never be able to change the validation results.
&gt; &gt; +            memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()),
&gt; &gt; +                   static_cast&lt;unsigned char*&gt;(array-&gt;data()) + byteOffset,
&gt; &gt; +                   byteLength);
&gt; &gt; +        }
&gt; &gt;          return true;
&gt; &gt; -    } else if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; &gt; -        m_byteLength = size;
&gt; &gt; +    case GraphicsContext3D::ARRAY_BUFFER:
&gt; &gt; +        m_byteLength = byteLength;
&gt; &gt;          return true;
&gt; &gt; +    default:
&gt; &gt; +        return false;
&gt; &gt;      }
&gt; &gt; +}
&gt; &gt;  
&gt; &gt; -    return false;
&gt; &gt; +bool WebGLBuffer::associateBufferData(int size)
&gt; &gt; +{
&gt; &gt; +    if (size &lt; 0)
&gt; &gt; +        return false;
&gt; &gt; +    return associateBufferDataImpl(0, 0, static_cast&lt;unsigned&gt;(size));
&gt; &gt;  }
&gt; &gt;  
&gt; &gt;  bool WebGLBuffer::associateBufferData(ArrayBuffer* array)
&gt; &gt;  {
&gt; &gt; -    if (!m_target)
&gt; &gt; -        return false;
&gt; &gt;      if (!array)
&gt; &gt;          return false;
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; &gt; -        clearCachedMaxIndices();
&gt; &gt; -        m_byteLength = array-&gt;byteLength();
&gt; &gt; -        // We must always clone the incoming data because client-side
&gt; &gt; -        // modifications without calling bufferData or bufferSubData
&gt; &gt; -        // must never be able to change the validation results.
&gt; &gt; -        m_elementArrayBuffer = ArrayBuffer::create(array);
&gt; &gt; -        if (!m_elementArrayBuffer) {
&gt; &gt; -            m_byteLength = 0;
&gt; &gt; -            return false;
&gt; &gt; -        }
&gt; &gt; -        return true;
&gt; &gt; -    }
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; &gt; -        m_byteLength = array-&gt;byteLength();
&gt; &gt; -        return true;
&gt; &gt; -    }
&gt; &gt; -
&gt; &gt; -    return false;
&gt; &gt; +    return associateBufferDataImpl(array, 0, array-&gt;byteLength());
&gt; &gt;  }
&gt; &gt;  
&gt; &gt;  bool WebGLBuffer::associateBufferData(ArrayBufferView* array)
&gt; &gt;  {
&gt; &gt; -    if (!m_target)
&gt; &gt; -        return false;
&gt; &gt;      if (!array)
&gt; &gt;          return false;
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; &gt; -        clearCachedMaxIndices();
&gt; &gt; -        m_byteLength = array-&gt;byteLength();
&gt; &gt; -        // We must always clone the incoming data because client-side
&gt; &gt; -        // modifications without calling bufferData or bufferSubData
&gt; &gt; -        // must never be able to change the validation results.
&gt; &gt; -        m_elementArrayBuffer = ArrayBuffer::create(array-&gt;buffer().get());
&gt; &gt; -        if (!m_elementArrayBuffer) {
&gt; &gt; -            m_byteLength = 0;
&gt; &gt; -            return false;
&gt; &gt; -        }
&gt; &gt; -        return true;
&gt; &gt; -    }
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER) {
&gt; &gt; -        m_byteLength = array-&gt;byteLength();
&gt; &gt; -        return true;
&gt; &gt; -    }
&gt; &gt; -    
&gt; &gt; -    return false;
&gt; &gt; +    return associateBufferDataImpl(array-&gt;buffer().get(), array-&gt;byteOffset(), array-&gt;byteLength());
&gt; &gt;  }
&gt; &gt;  
&gt; &gt; -bool WebGLBuffer::associateBufferSubData(long offset, ArrayBuffer* array)
&gt; &gt; +bool WebGLBuffer::associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned arrayByteLength)
&gt; &gt;  {
&gt; &gt; -    if (!m_target)
&gt; &gt; +    if (!array || offset &lt; 0)
&gt; &gt;          return false;
&gt; &gt; -    if (!array)
&gt; &gt; +    if (arrayByteLength &amp;&amp; (arrayByteOffset &gt;= array-&gt;byteLength() || array-&gt;byteLength() - arrayByteOffset &lt; arrayByteLength))
&gt; 
&gt; Same question as above about whether we should use CheckedInt.
&gt; 
&gt; &gt; +        return false;
&gt; &gt; +    unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; &gt; +    if (arrayByteLength &amp;&amp; (uoffset &gt;= m_byteLength || arrayByteLength &gt; m_byteLength - uoffset))
&gt; 
&gt; Same question about CheckedInt.
&gt; 
&gt; &gt;          return false;
&gt; &gt;  
&gt; &gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; &gt; +    switch (m_target) {
&gt; &gt; +    case GraphicsContext3D::ELEMENT_ARRAY_BUFFER:
&gt; &gt;          clearCachedMaxIndices();
&gt; &gt; -
&gt; &gt; -        // We need to protect against integer overflow with these tests
&gt; &gt; -        if (offset &lt; 0)
&gt; &gt; -            return false;
&gt; &gt; -
&gt; &gt; -        unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; &gt; -        if (uoffset &gt; m_byteLength || array-&gt;byteLength() &gt; m_byteLength - uoffset)
&gt; &gt; -            return false;
&gt; &gt; -
&gt; &gt;          if (!m_elementArrayBuffer)
&gt; &gt;              return false;
&gt; &gt; -
&gt; &gt;          memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()) + offset,
&gt; &gt; -               static_cast&lt;unsigned char*&gt;(array-&gt;data()),
&gt; &gt; -               array-&gt;byteLength());
&gt; &gt; +               static_cast&lt;unsigned char*&gt;(array-&gt;data()) + arrayByteOffset,
&gt; &gt; +               arrayByteLength);
&gt; &gt; +        return true;
&gt; &gt; +    case GraphicsContext3D::ARRAY_BUFFER:
&gt; &gt;          return true;
&gt; &gt; +    default:
&gt; &gt; +        return false;
&gt; &gt;      }
&gt; &gt; +}
&gt; &gt;  
&gt; &gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER)
&gt; &gt; -        return array-&gt;byteLength() + offset &lt;= m_byteLength;
&gt; &gt; -
&gt; &gt; -    return false;
&gt; &gt; +bool WebGLBuffer::associateBufferSubData(long offset, ArrayBuffer* array)
&gt; &gt; +{
&gt; &gt; +    if (!array)
&gt; &gt; +        return false;
&gt; &gt; +    return associateBufferSubDataImpl(offset, array, 0, array-&gt;byteLength());
&gt; &gt;  }
&gt; &gt;  
&gt; &gt;  bool WebGLBuffer::associateBufferSubData(long offset, ArrayBufferView* array)
&gt; &gt;  {
&gt; &gt; -    if (!m_target)
&gt; &gt; -        return false;
&gt; &gt;      if (!array)
&gt; &gt;          return false;
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ELEMENT_ARRAY_BUFFER) {
&gt; &gt; -        clearCachedMaxIndices();
&gt; &gt; -
&gt; &gt; -        // We need to protect against integer overflow with these tests
&gt; &gt; -        if (offset &lt; 0)
&gt; &gt; -            return false;
&gt; &gt; -            
&gt; &gt; -        unsigned long uoffset = static_cast&lt;unsigned long&gt;(offset);
&gt; &gt; -        if (uoffset &gt; m_byteLength || array-&gt;byteLength() &gt; m_byteLength - uoffset)
&gt; &gt; -            return false;
&gt; &gt; -            
&gt; &gt; -        if (!m_elementArrayBuffer)
&gt; &gt; -            return false;
&gt; &gt; -
&gt; &gt; -        memcpy(static_cast&lt;unsigned char*&gt;(m_elementArrayBuffer-&gt;data()) + offset, array-&gt;baseAddress(), array-&gt;byteLength());
&gt; &gt; -        return true;
&gt; &gt; -    }
&gt; &gt; -
&gt; &gt; -    if (m_target == GraphicsContext3D::ARRAY_BUFFER)
&gt; &gt; -        return array-&gt;byteLength() + offset &lt;= m_byteLength;
&gt; &gt; -
&gt; &gt; -    return false;
&gt; &gt; +    return associateBufferSubDataImpl(offset, array-&gt;buffer().get(), array-&gt;byteOffset(), array-&gt;byteLength());
&gt; &gt;  }
&gt; &gt;  
&gt; &gt;  unsigned WebGLBuffer::byteLength() const
&gt; &gt; Index: WebCore/html/canvas/WebGLBuffer.h
&gt; &gt; ===================================================================
&gt; &gt; --- WebCore/html/canvas/WebGLBuffer.h	(revision 64660)
&gt; &gt; +++ WebCore/html/canvas/WebGLBuffer.h	(working copy)
&gt; &gt; @@ -90,6 +90,11 @@ namespace WebCore {
&gt; &gt;  
&gt; &gt;          // Clears all of the cached max indices.
&gt; &gt;          void clearCachedMaxIndices();
&gt; &gt; +
&gt; &gt; +        // Helper function called by the three associateBufferData().
&gt; &gt; +        bool associateBufferDataImpl(ArrayBuffer* array, unsigned byteOffset, unsigned byteLength);
&gt; &gt; +        // Helper function called by the two associateBufferSubData().
&gt; &gt; +        bool associateBufferSubDataImpl(long offset, ArrayBuffer* array, unsigned arrayByteOffset, unsigned arrayByteLength);
&gt; &gt;      };
&gt; &gt;      
&gt; &gt;  } // namespace WebCore
&gt; &gt; Index: LayoutTests/ChangeLog
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/ChangeLog	(revision 64684)
&gt; &gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; &gt; @@ -1,3 +1,13 @@
&gt; &gt; +2010-08-04  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; &gt; +
&gt; &gt; +        Reviewed by NOBODY (OOPS!).
&gt; &gt; +
&gt; &gt; +        WebGLBuffer::associateBufferData(ArrayBufferView* array) copies incorrect data for sliced views
&gt; &gt; +        https://bugs.webkit.org/show_bug.cgi?id=42124
&gt; &gt; +
&gt; &gt; +        * fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt: Adding test case for bufferData and bufferSubData with ArrayBufferView input.
&gt; &gt; +        * fast/canvas/webgl/draw-elements-out-of-bounds.html: Ditto.
&gt; &gt; +
&gt; &gt;  2010-08-04  Dan Bernstein  &lt;mitz@apple.com&gt;
&gt; &gt;  
&gt; &gt;          Reviewed by Simon Fraser.
&gt; &gt; Index: LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt	(revision 64660)
&gt; &gt; +++ LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds-expected.txt	(working copy)
&gt; &gt; @@ -28,6 +28,12 @@ PASS context.drawElements(context.TRIANG
&gt; &gt;  PASS context.drawElements(context.TRIANGLES, 0xffffffff, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_VALUE.
&gt; &gt;  PASS context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_OPERATION.
&gt; &gt;  PASS context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0x7fffffff) generated expected GL error: INVALID_OPERATION.
&gt; &gt; +PASS context.bufferData(context.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1), context.STATIC_DRAW) generated expected GL error: NO_ERROR.
&gt; &gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: NO_ERROR.
&gt; &gt; +PASS context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1])) generated expected GL error: NO_ERROR.
&gt; &gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: INVALID_OPERATION.
&gt; &gt; +PASS context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1)) generated expected GL error: NO_ERROR.
&gt; &gt; +PASS context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0) generated expected GL error: NO_ERROR.
&gt; &gt;  
&gt; &gt;  Test buffer with interleaved (3+2) float vectors
&gt; &gt;  PASS context.drawElements(context.TRIANGLES, 9, context.UNSIGNED_SHORT, 0) generated expected GL error: NO_ERROR.
&gt; &gt; Index: LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html
&gt; &gt; ===================================================================
&gt; &gt; --- LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html	(revision 64660)
&gt; &gt; +++ LayoutTests/fast/canvas/webgl/draw-elements-out-of-bounds.html	(working copy)
&gt; &gt; @@ -55,6 +55,13 @@ shouldGenerateGLError(context, context.I
&gt; &gt;  shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0)&quot;);
&gt; &gt;  shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 0x7fffffff, context.UNSIGNED_BYTE, 0x7fffffff)&quot;);
&gt; &gt;  
&gt; &gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferData(context.ELEMENT_ARRAY_BUFFER, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1), context.STATIC_DRAW)&quot;);
&gt; &gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; &gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, new Uint8Array([ 3, 0, 1]))&quot;);
&gt; &gt; +shouldGenerateGLError(context, context.INVALID_OPERATION, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; &gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.bufferSubData(context.ELEMENT_ARRAY_BUFFER, 0, (new Uint8Array([ 3, 0, 1, 2 ])).slice(1))&quot;);
&gt; &gt; +shouldGenerateGLError(context, context.NO_ERROR, &quot;context.drawElements(context.TRIANGLES, 3, context.UNSIGNED_BYTE, 0)&quot;);
&gt; &gt; +
&gt; &gt;  debug(&quot;&quot;)
&gt; &gt;  debug(&quot;Test buffer with interleaved (3+2) float vectors&quot;)
&gt; &gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260332</commentid>
    <comment_count>4</comment_count>
      <attachid>63530</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-04 19:17:39 -0700</bug_when>
    <thetext>Created attachment 63530
revised patch: responding to kbr&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260335</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-04 19:20:16 -0700</bug_when>
    <thetext>Attachment 63530 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/html/canvas/WebGLBuffer.cpp:30:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260337</commentid>
    <comment_count>6</comment_count>
      <attachid>63532</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-04 19:20:41 -0700</bug_when>
    <thetext>Created attachment 63532
revised patch: tiny modification</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260338</commentid>
    <comment_count>7</comment_count>
      <attachid>63533</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-04 19:22:24 -0700</bug_when>
    <thetext>Created attachment 63533
revised patch: fix a style issue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260339</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-08-04 19:22:54 -0700</bug_when>
    <thetext>Attachment 63532 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebCore/html/canvas/WebGLBuffer.cpp:30:  Found other header before a header this file implements. Should be: config.h, primary header, blank line, and then alphabetically sorted.  [build/include_order] [4]
Total errors found: 1 in 6 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260769</commentid>
    <comment_count>9</comment_count>
      <attachid>63533</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-08-05 12:26:41 -0700</bug_when>
    <thetext>Comment on attachment 63533
revised patch: fix a style issue

Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>260875</commentid>
    <comment_count>10</comment_count>
      <attachid>63533</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-08-05 14:43:34 -0700</bug_when>
    <thetext>Comment on attachment 63533
revised patch: fix a style issue

ok.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>261358</commentid>
    <comment_count>11</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-08-06 11:04:37 -0700</bug_when>
    <thetext>Committed r64859: &lt;http://trac.webkit.org/changeset/64859&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63505</attachid>
            <date>2010-08-04 15:41:45 -0700</date>
            <delta_ts>2010-08-04 19:17:39 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bufferData.patch</filename>
            <type>text/plain</type>
            <size>12899</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDY4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWJHTEJ1
ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5KSBjb3BpZXMg
aW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dl
YkdMQnVmZmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhSW1wbCk6IEhlbHBlciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3Nv
Y2lhdGVCdWZmZXJEYXRhKCkuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2Np
YXRlQnVmZmVyRGF0YSk6IENhbGwgYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoKS4KKyAgICAgICAg
KFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbCk6IEhlbHBl
ciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhKCku
CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YSk6
IENhbGwgYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwoKS4KKyAgICAgICAgKiBodG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oOiBEZWNsYXJlIGhlbHBlciBmdW5jdGlvbnMuCisKIDIwMTAtMDgtMDQg
IERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXguCklu
ZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkocmV2aXNpb24gNjQ2NjApCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTIs
MTQ4ICs1Miw5NiBAQCB2b2lkIFdlYkdMQnVmZmVyOjpfZGVsZXRlT2JqZWN0KFBsYXRmb3JtCiAg
ICAgY29udGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpLT5kZWxldGVCdWZmZXIob2JqZWN0KTsK
IH0KIAotYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShpbnQgc2l6ZSkKK2Jv
b2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlckRhdGFJbXBsKEFycmF5QnVmZmVyKiBhcnJh
eSwgdW5zaWduZWQgYnl0ZU9mZnNldCwgdW5zaWduZWQgYnl0ZUxlbmd0aCkKIHsKLSAgICBpZiAo
IW1fdGFyZ2V0KQorICAgIGlmIChhcnJheSAmJiBieXRlTGVuZ3RoICYmIChieXRlT2Zmc2V0ID49
IGFycmF5LT5ieXRlTGVuZ3RoKCkgfHwgYXJyYXktPmJ5dGVMZW5ndGgoKSAtIGJ5dGVPZmZzZXQg
PCBieXRlTGVuZ3RoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKG1fdGFyZ2V0
ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBt
X2J5dGVMZW5ndGggPSBzaXplOworICAgIHN3aXRjaCAobV90YXJnZXQpIHsKKyAgICBjYXNlIEdy
YXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUjoKKyAgICAgICAgbV9ieXRlTGVu
Z3RoID0gYnl0ZUxlbmd0aDsKICAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0gICAg
ICAgIG1fZWxlbWVudEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXI6OmNyZWF0ZShzaXplLCAxKTsK
LSAgICAgICAgaWYgKCFtX2VsZW1lbnRBcnJheUJ1ZmZlcikgeworICAgICAgICBtX2VsZW1lbnRB
cnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoYnl0ZUxlbmd0aCwgMSk7CisgICAgICAg
IGlmIChieXRlTGVuZ3RoICYmICFtX2VsZW1lbnRBcnJheUJ1ZmZlcikgewogICAgICAgICAgICAg
bV9ieXRlTGVuZ3RoID0gMDsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQor
ICAgICAgICBpZiAoYXJyYXkpIHsKKyAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNsb25l
IHRoZSBpbmNvbWluZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKKyAgICAgICAgICAgIC8vIG1v
ZGlmaWNhdGlvbnMgd2l0aG91dCBjYWxsaW5nIGJ1ZmZlckRhdGEgb3IgYnVmZmVyU3ViRGF0YQor
ICAgICAgICAgICAgLy8gbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdmFsaWRhdGlv
biByZXN1bHRzLgorICAgICAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIq
PihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXJyYXktPmRhdGEoKSkgKyBieXRlT2Zmc2V0LAorICAg
ICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGgpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiB0
cnVlOwotICAgIH0gZWxzZSBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZ
X0JVRkZFUikgewotICAgICAgICBtX2J5dGVMZW5ndGggPSBzaXplOworICAgIGNhc2UgR3JhcGhp
Y3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUjoKKyAgICAgICAgbV9ieXRlTGVuZ3RoID0gYnl0ZUxl
bmd0aDsKICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIH0KK30KIAotICAgIHJldHVybiBmYWxzZTsKK2Jvb2wgV2ViR0xCdWZmZXI6
OmFzc29jaWF0ZUJ1ZmZlckRhdGEoaW50IHNpemUpCit7CisgICAgaWYgKHNpemUgPCAwKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGFzc29jaWF0ZUJ1ZmZlckRhdGFJbXBsKDAs
IDAsIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplKSk7CiB9CiAKIGJvb2wgV2ViR0xCdWZmZXI6
OmFzc29jaWF0ZUJ1ZmZlckRhdGEoQXJyYXlCdWZmZXIqIGFycmF5KQogewotICAgIGlmICghbV90
YXJnZXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWFycmF5KQogICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVM
RU1FTlRfQVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwot
ICAgICAgICBtX2J5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxlbmd0aCgpOwotICAgICAgICAvLyBX
ZSBtdXN0IGFsd2F5cyBjbG9uZSB0aGUgaW5jb21pbmcgZGF0YSBiZWNhdXNlIGNsaWVudC1zaWRl
Ci0gICAgICAgIC8vIG1vZGlmaWNhdGlvbnMgd2l0aG91dCBjYWxsaW5nIGJ1ZmZlckRhdGEgb3Ig
YnVmZmVyU3ViRGF0YQotICAgICAgICAvLyBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY2hhbmdlIHRo
ZSB2YWxpZGF0aW9uIHJlc3VsdHMuCi0gICAgICAgIG1fZWxlbWVudEFycmF5QnVmZmVyID0gQXJy
YXlCdWZmZXI6OmNyZWF0ZShhcnJheSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZm
ZXIpIHsKLSAgICAgICAgICAgIG1fYnl0ZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYg
KG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIpIHsKLSAgICAgICAg
bV9ieXRlTGVuZ3RoID0gYXJyYXktPmJ5dGVMZW5ndGgoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhc3NvY2lhdGVCdWZmZXJE
YXRhSW1wbChhcnJheSwgMCwgYXJyYXktPmJ5dGVMZW5ndGgoKSk7CiB9CiAKIGJvb2wgV2ViR0xC
dWZmZXI6OmFzc29jaWF0ZUJ1ZmZlckRhdGEoQXJyYXlCdWZmZXJWaWV3KiBhcnJheSkKIHsKLSAg
ICBpZiAoIW1fdGFyZ2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFhcnJheSkK
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29u
dGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBjbGVhckNhY2hlZE1heElu
ZGljZXMoKTsKLSAgICAgICAgbV9ieXRlTGVuZ3RoID0gYXJyYXktPmJ5dGVMZW5ndGgoKTsKLSAg
ICAgICAgLy8gV2UgbXVzdCBhbHdheXMgY2xvbmUgdGhlIGluY29taW5nIGRhdGEgYmVjYXVzZSBj
bGllbnQtc2lkZQotICAgICAgICAvLyBtb2RpZmljYXRpb25zIHdpdGhvdXQgY2FsbGluZyBidWZm
ZXJEYXRhIG9yIGJ1ZmZlclN1YkRhdGEKLSAgICAgICAgLy8gbXVzdCBuZXZlciBiZSBhYmxlIHRv
IGNoYW5nZSB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotICAgICAgICBtX2VsZW1lbnRBcnJheUJ1
ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoYXJyYXktPmJ1ZmZlcigpLmdldCgpKTsKLSAgICAg
ICAgaWYgKCFtX2VsZW1lbnRBcnJheUJ1ZmZlcikgewotICAgICAgICAgICAgbV9ieXRlTGVuZ3Ro
ID0gMDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6
OkFSUkFZX0JVRkZFUikgewotICAgICAgICBtX2J5dGVMZW5ndGggPSBhcnJheS0+Ynl0ZUxlbmd0
aCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNl
OworICAgIHJldHVybiBhc3NvY2lhdGVCdWZmZXJEYXRhSW1wbChhcnJheS0+YnVmZmVyKCkuZ2V0
KCksIGFycmF5LT5ieXRlT2Zmc2V0KCksIGFycmF5LT5ieXRlTGVuZ3RoKCkpOwogfQogCi1ib29s
IFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhKGxvbmcgb2Zmc2V0LCBBcnJheUJ1
ZmZlciogYXJyYXkpCitib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1w
bChsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5LCB1bnNpZ25lZCBhcnJheUJ5dGVPZmZz
ZXQsIHVuc2lnbmVkIGFycmF5Qnl0ZUxlbmd0aCkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQorICAg
IGlmICghYXJyYXkgfHwgb2Zmc2V0IDwgMCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlm
ICghYXJyYXkpCisgICAgaWYgKGFycmF5Qnl0ZUxlbmd0aCAmJiAoYXJyYXlCeXRlT2Zmc2V0ID49
IGFycmF5LT5ieXRlTGVuZ3RoKCkgfHwgYXJyYXktPmJ5dGVMZW5ndGgoKSAtIGFycmF5Qnl0ZU9m
ZnNldCA8IGFycmF5Qnl0ZUxlbmd0aCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB1bnNp
Z25lZCBsb25nIHVvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXQpOwor
ICAgIGlmIChhcnJheUJ5dGVMZW5ndGggJiYgKHVvZmZzZXQgPj0gbV9ieXRlTGVuZ3RoIHx8IGFy
cmF5Qnl0ZUxlbmd0aCA+IG1fYnl0ZUxlbmd0aCAtIHVvZmZzZXQpKQogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAKLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRf
QVJSQVlfQlVGRkVSKSB7CisgICAgc3dpdGNoIChtX3RhcmdldCkgeworICAgIGNhc2UgR3JhcGhp
Y3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSOgogICAgICAgICBjbGVhckNhY2hlZE1h
eEluZGljZXMoKTsKLQotICAgICAgICAvLyBXZSBuZWVkIHRvIHByb3RlY3QgYWdhaW5zdCBpbnRl
Z2VyIG92ZXJmbG93IHdpdGggdGhlc2UgdGVzdHMKLSAgICAgICAgaWYgKG9mZnNldCA8IDApCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdW5zaWduZWQgbG9uZyB1b2Zmc2V0
ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ob2Zmc2V0KTsKLSAgICAgICAgaWYgKHVvZmZz
ZXQgPiBtX2J5dGVMZW5ndGggfHwgYXJyYXktPmJ5dGVMZW5ndGgoKSA+IG1fYnl0ZUxlbmd0aCAt
IHVvZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KICAgICAgICAgaWYgKCFtX2Vs
ZW1lbnRBcnJheUJ1ZmZlcikKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQogICAgICAgICBt
ZW1jcHkoc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KG1fZWxlbWVudEFycmF5QnVmZmVyLT5k
YXRhKCkpICsgb2Zmc2V0LAotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hh
cio+KGFycmF5LT5kYXRhKCkpLAotICAgICAgICAgICAgICAgYXJyYXktPmJ5dGVMZW5ndGgoKSk7
CisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXJyYXktPmRhdGEo
KSkgKyBhcnJheUJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICBhcnJheUJ5dGVMZW5ndGgpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9C
VUZGRVI6CiAgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVy
biBmYWxzZTsKICAgICB9Cit9CiAKLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0
M0Q6OkFSUkFZX0JVRkZFUikKLSAgICAgICAgcmV0dXJuIGFycmF5LT5ieXRlTGVuZ3RoKCkgKyBv
ZmZzZXQgPD0gbV9ieXRlTGVuZ3RoOwotCi0gICAgcmV0dXJuIGZhbHNlOworYm9vbCBXZWJHTEJ1
ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YShsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFy
cmF5KQoreworICAgIGlmICghYXJyYXkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwob2Zmc2V0LCBhcnJheSwgMCwgYXJyYXktPmJ5
dGVMZW5ndGgoKSk7CiB9CiAKIGJvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlclN1YkRh
dGEobG9uZyBvZmZzZXQsIEFycmF5QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3Rh
cmdldCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKLQotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxF
TUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0K
LSAgICAgICAgLy8gV2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgaW50ZWdlciBvdmVyZmxvdyB3
aXRoIHRoZXNlIHRlc3RzCi0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdW9mZnNldCA9
IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldCk7Ci0gICAgICAgIGlmICh1b2Zmc2V0
ID4gbV9ieXRlTGVuZ3RoIHx8IGFycmF5LT5ieXRlTGVuZ3RoKCkgPiBtX2J5dGVMZW5ndGggLSB1
b2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAg
IGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0K
LSAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJh
eUJ1ZmZlci0+ZGF0YSgpKSArIG9mZnNldCwgYXJyYXktPmJhc2VBZGRyZXNzKCksIGFycmF5LT5i
eXRlTGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobV90
YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUikKLSAgICAgICAgcmV0dXJu
IGFycmF5LT5ieXRlTGVuZ3RoKCkgKyBvZmZzZXQgPD0gbV9ieXRlTGVuZ3RoOwotCi0gICAgcmV0
dXJuIGZhbHNlOworICAgIHJldHVybiBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbChvZmZzZXQs
IGFycmF5LT5idWZmZXIoKS5nZXQoKSwgYXJyYXktPmJ5dGVPZmZzZXQoKSwgYXJyYXktPmJ5dGVM
ZW5ndGgoKSk7CiB9CiAKIHVuc2lnbmVkIFdlYkdMQnVmZmVyOjpieXRlTGVuZ3RoKCkgY29uc3QK
SW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmgJKHJldmlzaW9uIDY0NjYwKQorKysgV2Vi
Q29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5
MCwxMSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gQ2xlYXJzIGFsbCBvZiB0
aGUgY2FjaGVkIG1heCBpbmRpY2VzLgogICAgICAgICB2b2lkIGNsZWFyQ2FjaGVkTWF4SW5kaWNl
cygpOworCisgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRocmVlIGFz
c29jaWF0ZUJ1ZmZlckRhdGEoKS4KKyAgICAgICAgYm9vbCBhc3NvY2lhdGVCdWZmZXJEYXRhSW1w
bChBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVM
ZW5ndGgpOworICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSB0d28gYXNz
b2NpYXRlQnVmZmVyU3ViRGF0YSgpLgorICAgICAgICBib29sIGFzc29jaWF0ZUJ1ZmZlclN1YkRh
dGFJbXBsKGxvbmcgb2Zmc2V0LCBBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGFycmF5Qnl0
ZU9mZnNldCwgdW5zaWduZWQgYXJyYXlCeXRlTGVuZ3RoKTsKICAgICB9OwogICAgIAogfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNjQ2ODQpCisrKyBMYXlvdXRUZXN0
cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wOC0wNCAg
WmhlbnlhbyBNbyAgPHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKEFy
cmF5QnVmZmVyVmlldyogYXJyYXkpIGNvcGllcyBpbmNvcnJlY3QgZGF0YSBmb3Igc2xpY2VkIHZp
ZXdzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00MjEy
NAorCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvZHJhdy1lbGVtZW50cy1vdXQtb2YtYm91
bmRzLWV4cGVjdGVkLnR4dDogQWRkaW5nIHRlc3QgY2FzZSBmb3IgYnVmZmVyRGF0YSBhbmQgYnVm
ZmVyU3ViRGF0YSB3aXRoIEFycmF5QnVmZmVyVmlldyBpbnB1dC4KKyAgICAgICAgKiBmYXN0L2Nh
bnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbDogRGl0dG8uCisKIDIw
MTAtMDgtMDQgIERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBTaW1vbiBGcmFzZXIuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJn
bC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5k
cy1leHBlY3RlZC50eHQJKHJldmlzaW9uIDY0NjYwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52
YXMvd2ViZ2wvZHJhdy1lbGVtZW50cy1vdXQtb2YtYm91bmRzLWV4cGVjdGVkLnR4dAkod29ya2lu
ZyBjb3B5KQpAQCAtMjgsNiArMjgsMTIgQEAgUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250
ZXh0LlRSSUFORwogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywg
MHhmZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0ZWQgZXhwZWN0ZWQg
R0wgZXJyb3I6IElOVkFMSURfVkFMVUUuCiBQQVNTIGNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRl
eHQuVFJJQU5HTEVTLCAweDdmZmZmZmZmLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIGdlbmVy
YXRlZCBleHBlY3RlZCBHTCBlcnJvcjogSU5WQUxJRF9PUEVSQVRJT04uCiBQQVNTIGNvbnRleHQu
ZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAweDdmZmZmZmZmLCBjb250ZXh0LlVOU0lH
TkVEX0JZVEUsIDB4N2ZmZmZmZmYpIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogSU5WQUxJ
RF9PUEVSQVRJT04uCitQQVNTIGNvbnRleHQuYnVmZmVyRGF0YShjb250ZXh0LkVMRU1FTlRfQVJS
QVlfQlVGRkVSLCAobmV3IFVpbnQ4QXJyYXkoWyAzLCAwLCAxLCAyIF0pKS5zbGljZSgxKSwgY29u
dGV4dC5TVEFUSUNfRFJBVykgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBOT19FUlJPUi4K
K1BBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQu
VU5TSUdORURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBOT19FUlJPUi4K
K1BBU1MgY29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIs
IDAsIG5ldyBVaW50OEFycmF5KFsgMywgMCwgMV0pKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJy
b3I6IE5PX0VSUk9SLgorUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xF
UywgMywgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJy
b3I6IElOVkFMSURfT1BFUkFUSU9OLgorUEFTUyBjb250ZXh0LmJ1ZmZlclN1YkRhdGEoY29udGV4
dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgKG5ldyBVaW50OEFycmF5KFsgMywgMCwgMSwgMiBd
KSkuc2xpY2UoMSkpIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCitQQVNT
IGNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0LlVOU0lH
TkVEX0JZVEUsIDApIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCiAKIFRl
c3QgYnVmZmVyIHdpdGggaW50ZXJsZWF2ZWQgKDMrMikgZmxvYXQgdmVjdG9ycwogUEFTUyBjb250
ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgOSwgY29udGV4dC5VTlNJR05FRF9T
SE9SVCwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBOT19FUlJPUi4KSW5kZXg6IExh
eW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5kcy5o
dG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxl
bWVudHMtb3V0LW9mLWJvdW5kcy5odG1sCShyZXZpc2lvbiA2NDY2MCkKKysrIExheW91dFRlc3Rz
L2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5kcy5odG1sCSh3b3Jr
aW5nIGNvcHkpCkBAIC01NSw2ICs1NSwxMyBAQCBzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4
dCwgY29udGV4dC5JCiBzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5JTlZB
TElEX09QRVJBVElPTiwgImNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAw
eDdmZmZmZmZmLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIik7CiBzaG91bGRHZW5lcmF0ZUdM
RXJyb3IoY29udGV4dCwgY29udGV4dC5JTlZBTElEX09QRVJBVElPTiwgImNvbnRleHQuZHJhd0Vs
ZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAweDdmZmZmZmZmLCBjb250ZXh0LlVOU0lHTkVEX0JZ
VEUsIDB4N2ZmZmZmZmYpIik7CiAKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250
ZXh0Lk5PX0VSUk9SLCAiY29udGV4dC5idWZmZXJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9C
VUZGRVIsIChuZXcgVWludDhBcnJheShbIDMsIDAsIDEsIDIgXSkpLnNsaWNlKDEpLCBjb250ZXh0
LlNUQVRJQ19EUkFXKSIpOworc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQu
Tk9fRVJST1IsICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMywgY29u
dGV4dC5VTlNJR05FRF9CWVRFLCAwKSIpOworc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQs
IGNvbnRleHQuTk9fRVJST1IsICJjb250ZXh0LmJ1ZmZlclN1YkRhdGEoY29udGV4dC5FTEVNRU5U
X0FSUkFZX0JVRkZFUiwgMCwgbmV3IFVpbnQ4QXJyYXkoWyAzLCAwLCAxXSkpIik7CitzaG91bGRH
ZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5JTlZBTElEX09QRVJBVElPTiwgImNvbnRl
eHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZ
VEUsIDApIik7CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5OT19FUlJP
UiwgImNvbnRleHQuYnVmZmVyU3ViRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAw
LCAobmV3IFVpbnQ4QXJyYXkoWyAzLCAwLCAxLCAyIF0pKS5zbGljZSgxKSkiKTsKK3Nob3VsZEdl
bmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0Lk5PX0VSUk9SLCAiY29udGV4dC5kcmF3RWxl
bWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQuVU5TSUdORURfQllURSwgMCkiKTsK
KwogZGVidWcoIiIpCiBkZWJ1ZygiVGVzdCBidWZmZXIgd2l0aCBpbnRlcmxlYXZlZCAoMysyKSBm
bG9hdCB2ZWN0b3JzIikKIAo=
</data>
<flag name="commit-queue"
          id="51874"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63530</attachid>
            <date>2010-08-04 19:17:39 -0700</date>
            <delta_ts>2010-08-04 19:20:41 -0700</delta_ts>
            <desc>revised patch: responding to kbr&apos;s review</desc>
            <filename>bufferData.patch</filename>
            <type>text/plain</type>
            <size>13734</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDY4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWJHTEJ1
ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5KSBjb3BpZXMg
aW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dl
YkdMQnVmZmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhSW1wbCk6IEhlbHBlciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3Nv
Y2lhdGVCdWZmZXJEYXRhKCkuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2Np
YXRlQnVmZmVyRGF0YSk6IENhbGwgYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoKS4KKyAgICAgICAg
KFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbCk6IEhlbHBl
ciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhKCku
CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YSk6
IENhbGwgYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwoKS4KKyAgICAgICAgKiBodG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oOiBEZWNsYXJlIGhlbHBlciBmdW5jdGlvbnMuCisKIDIwMTAtMDgtMDQg
IERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXguCklu
ZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkocmV2aXNpb24gNjQ2NjApCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcs
NiArMjcsNyBAQAogCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKIAorI2luY2x1ZGUgIkNoZWNrZWRJ
bnQuaCIKICNpbmNsdWRlICJXZWJHTEJ1ZmZlci5oIgogI2luY2x1ZGUgIldlYkdMUmVuZGVyaW5n
Q29udGV4dC5oIgogCkBAIC01MiwxNDggKzUzLDEwOSBAQCB2b2lkIFdlYkdMQnVmZmVyOjpfZGVs
ZXRlT2JqZWN0KFBsYXRmb3JtCiAgICAgY29udGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpLT5k
ZWxldGVCdWZmZXIob2JqZWN0KTsKIH0KIAotYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVm
ZmVyRGF0YShpbnQgc2l6ZSkKK2Jvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlckRhdGFJ
bXBsKEFycmF5QnVmZmVyKiBhcnJheSwgdW5zaWduZWQgYnl0ZU9mZnNldCwgdW5zaWduZWQgYnl0
ZUxlbmd0aCkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQorICAgIENoZWNrZWRJbnQ8dWludDMyX3Q+
IGNoZWNrZWRPZmZzZXQoYnl0ZU9mZnNldCk7CisgICAgQ2hlY2tlZEludDx1aW50MzJfdD4gY2hl
Y2tlZExlbmd0aChieXRlTGVuZ3RoKTsKKyAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2Vk
TWF4ID0gY2hlY2tlZE9mZnNldCArIGNoZWNrZWRMZW5ndGg7CisgICAgaWYgKGFycmF5ICYmIGJ5
dGVMZW5ndGggJiYgKCFjaGVja2VkTWF4LnZhbGlkKCkgfHwgY2hlY2tlZE1heC52YWx1ZSgpID4g
YXJyYXktPmJ5dGVMZW5ndGgoKSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmICht
X3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAg
ICAgICAgbV9ieXRlTGVuZ3RoID0gc2l6ZTsKKyAgICBzd2l0Y2ggKG1fdGFyZ2V0KSB7CisgICAg
Y2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVI6CisgICAgICAgIG1f
Ynl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygp
OwotICAgICAgICBtX2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoc2l6
ZSwgMSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKLSAgICAgICAgICAg
IG1fYnl0ZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
KyAgICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAgIG1fZWxlbWVudEFycmF5QnVm
ZmVyID0gQXJyYXlCdWZmZXI6OmNyZWF0ZShieXRlTGVuZ3RoLCAxKTsKKyAgICAgICAgICAgIGlm
ICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtX2J5dGVMZW5ndGgg
PSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmIChhcnJheSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNs
b25lIHRoZSBpbmNvbWluZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKKyAgICAgICAgICAgICAg
ICAvLyBtb2RpZmljYXRpb25zIHdpdGhvdXQgY2FsbGluZyBidWZmZXJEYXRhIG9yIGJ1ZmZlclN1
YkRhdGEKKyAgICAgICAgICAgICAgICAvLyBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY2hhbmdlIHRo
ZSB2YWxpZGF0aW9uIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0
PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGFycmF5LT5kYXRhKCkp
ICsgYnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9lbGVtZW50QXJyYXlCdWZm
ZXIgPSAwOwogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdGFyZ2V0ID09
IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgbV9ieXRlTGVuZ3Ro
ID0gc2l6ZTsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVI6CisgICAg
ICAgIG1fYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgICAgIHJldHVybiB0cnVlOworICAg
IGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Cit9CiAKLSAgICByZXR1cm4g
ZmFsc2U7Citib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKGludCBzaXplKQor
eworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBh
c3NvY2lhdGVCdWZmZXJEYXRhSW1wbCgwLCAwLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZSkp
OwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKEFycmF5QnVmZmVy
KiBhcnJheSkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgaWYgKCFhcnJheSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fdGFyZ2V0
ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBj
bGVhckNhY2hlZE1heEluZGljZXMoKTsKLSAgICAgICAgbV9ieXRlTGVuZ3RoID0gYXJyYXktPmJ5
dGVMZW5ndGgoKTsKLSAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgY2xvbmUgdGhlIGluY29taW5n
IGRhdGEgYmVjYXVzZSBjbGllbnQtc2lkZQotICAgICAgICAvLyBtb2RpZmljYXRpb25zIHdpdGhv
dXQgY2FsbGluZyBidWZmZXJEYXRhIG9yIGJ1ZmZlclN1YkRhdGEKLSAgICAgICAgLy8gbXVzdCBu
ZXZlciBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotICAgICAgICBt
X2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoYXJyYXkpOwotICAgICAg
ICBpZiAoIW1fZWxlbWVudEFycmF5QnVmZmVyKSB7Ci0gICAgICAgICAgICBtX2J5dGVMZW5ndGgg
PSAwOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6
QVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3Ro
KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJyYXksIDAsIGFycmF5LT5ieXRlTGVu
Z3RoKCkpOwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKEFycmF5
QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3RhcmdldCkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJyYXktPmJ1ZmZlcigpLmdldCgpLCBhcnJheS0+
Ynl0ZU9mZnNldCgpLCBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsKK30KIAotICAgIGlmIChtX3Rhcmdl
dCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAg
Y2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5i
eXRlTGVuZ3RoKCk7Ci0gICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNsb25lIHRoZSBpbmNvbWlu
ZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKLSAgICAgICAgLy8gbW9kaWZpY2F0aW9ucyB3aXRo
b3V0IGNhbGxpbmcgYnVmZmVyRGF0YSBvciBidWZmZXJTdWJEYXRhCi0gICAgICAgIC8vIG11c3Qg
bmV2ZXIgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4KLSAgICAgICAg
bV9lbGVtZW50QXJyYXlCdWZmZXIgPSBBcnJheUJ1ZmZlcjo6Y3JlYXRlKGFycmF5LT5idWZmZXIo
KS5nZXQoKSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKLSAgICAgICAg
ICAgIG1fYnl0ZUxlbmd0aCA9IDA7Citib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJT
dWJEYXRhSW1wbChsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5LCB1bnNpZ25lZCBhcnJh
eUJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVMZW5ndGgpCit7CisgICAgaWYgKCFhcnJheSB8fCBv
ZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYnl0ZUxlbmd0aCkg
eworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkQnVmZmVyT2Zmc2V0KG9mZnNl
dCk7CisgICAgICAgIENoZWNrZWRJbnQ8dWludDMyX3Q+IGNoZWNrZWRBcnJheU9mZnNldChhcnJh
eUJ5dGVPZmZzZXQpOworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkTGVuZ3Ro
KGJ5dGVMZW5ndGgpOworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkQXJyYXlN
YXggPSBjaGVja2VkQXJyYXlPZmZzZXQgKyBjaGVja2VkTGVuZ3RoOworICAgICAgICBDaGVja2Vk
SW50PHVpbnQzMl90PiBjaGVja2VkQnVmZmVyTWF4ID0gY2hlY2tlZEJ1ZmZlck9mZnNldCArIGNo
ZWNrZWRMZW5ndGg7CisgICAgICAgIGlmICghY2hlY2tlZEFycmF5TWF4LnZhbGlkKCkgfHwgY2hl
Y2tlZEFycmF5TWF4LnZhbHVlKCkgPiBhcnJheS0+Ynl0ZUxlbmd0aCgpIHx8ICFjaGVja2VkQnVm
ZmVyTWF4LnZhbGlkKCkgfHwgY2hlY2tlZEJ1ZmZlck1heC52YWx1ZSgpID4gbV9ieXRlTGVuZ3Ro
KQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0
cnVlOwogICAgIH0KIAotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6QVJS
QVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7
CisgICAgc3dpdGNoIChtX3RhcmdldCkgeworICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkVM
RU1FTlRfQVJSQVlfQlVGRkVSOgorICAgICAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKKyAg
ICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlC
dWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbWVtY3B5
KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgp
KSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFy
Kj4oYXJyYXktPmRhdGEoKSkgKyBhcnJheUJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAg
Ynl0ZUxlbmd0aCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBH
cmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIHJldHVy
biBmYWxzZTsKIH0KIAogYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YShs
b25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5KQogewotICAgIGlmICghbV90YXJnZXQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWFycmF5KQogICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJS
QVlfQlVGRkVSKSB7Ci0gICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwotCi0gICAgICAg
IC8vIFdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVnZXIgb3ZlcmZsb3cgd2l0aCB0aGVz
ZSB0ZXN0cwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICB1bnNpZ25lZCBsb25nIHVvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZCBsb25nPihvZmZzZXQpOwotICAgICAgICBpZiAodW9mZnNldCA+IG1fYnl0ZUxlbmd0aCB8fCBh
cnJheS0+Ynl0ZUxlbmd0aCgpID4gbV9ieXRlTGVuZ3RoIC0gdW9mZnNldCkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIW1fZWxlbWVudEFycmF5QnVmZmVyKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIG1lbWNweShzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyKj4obV9lbGVtZW50QXJyYXlCdWZmZXItPmRhdGEoKSkgKyBvZmZzZXQsCi0gICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXJyYXktPmRhdGEoKSksCi0g
ICAgICAgICAgICAgICBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9C
VUZGRVIpCi0gICAgICAgIHJldHVybiBhcnJheS0+Ynl0ZUxlbmd0aCgpICsgb2Zmc2V0IDw9IG1f
Ynl0ZUxlbmd0aDsKLQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXNzb2NpYXRlQnVm
ZmVyU3ViRGF0YUltcGwob2Zmc2V0LCBhcnJheSwgMCwgYXJyYXktPmJ5dGVMZW5ndGgoKSk7CiB9
CiAKIGJvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlclN1YkRhdGEobG9uZyBvZmZzZXQs
IEFycmF5QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3RhcmdldCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZG
RVIpIHsKLSAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0KLSAgICAgICAgLy8gV2Ug
bmVlZCB0byBwcm90ZWN0IGFnYWluc3QgaW50ZWdlciBvdmVyZmxvdyB3aXRoIHRoZXNlIHRlc3Rz
Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdW9mZnNldCA9IHN0YXRpY19jYXN0PHVu
c2lnbmVkIGxvbmc+KG9mZnNldCk7Ci0gICAgICAgIGlmICh1b2Zmc2V0ID4gbV9ieXRlTGVuZ3Ro
IHx8IGFycmF5LT5ieXRlTGVuZ3RoKCkgPiBtX2J5dGVMZW5ndGggLSB1b2Zmc2V0KQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIGlmICghbV9lbGVtZW50
QXJyYXlCdWZmZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbWVtY3B5
KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgp
KSArIG9mZnNldCwgYXJyYXktPmJhc2VBZGRyZXNzKCksIGFycmF5LT5ieXRlTGVuZ3RoKCkpOwot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhp
Y3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUikKLSAgICAgICAgcmV0dXJuIGFycmF5LT5ieXRlTGVu
Z3RoKCkgKyBvZmZzZXQgPD0gbV9ieXRlTGVuZ3RoOwotCi0gICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbChvZmZzZXQsIGFycmF5LT5idWZmZXIo
KS5nZXQoKSwgYXJyYXktPmJ5dGVPZmZzZXQoKSwgYXJyYXktPmJ5dGVMZW5ndGgoKSk7CiB9CiAK
IHVuc2lnbmVkIFdlYkdMQnVmZmVyOjpieXRlTGVuZ3RoKCkgY29uc3QKSW5kZXg6IFdlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMQnVmZmVyLmgJKHJldmlzaW9uIDY0NjYwKQorKysgV2ViQ29yZS9odG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCwxMSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gQ2xlYXJzIGFsbCBvZiB0aGUgY2FjaGVkIG1heCBp
bmRpY2VzLgogICAgICAgICB2b2lkIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOworCisgICAgICAg
IC8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRocmVlIGFzc29jaWF0ZUJ1ZmZlckRh
dGEoKS4KKyAgICAgICAgYm9vbCBhc3NvY2lhdGVCdWZmZXJEYXRhSW1wbChBcnJheUJ1ZmZlciog
YXJyYXksIHVuc2lnbmVkIGJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVMZW5ndGgpOworICAgICAg
ICAvLyBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSB0d28gYXNzb2NpYXRlQnVmZmVyU3Vi
RGF0YSgpLgorICAgICAgICBib29sIGFzc29jaWF0ZUJ1ZmZlclN1YkRhdGFJbXBsKGxvbmcgb2Zm
c2V0LCBBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGFycmF5Qnl0ZU9mZnNldCwgdW5zaWdu
ZWQgYnl0ZUxlbmd0aCk7CiAgICAgfTsKICAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDY0Njg0KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29v
Z2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5
KSBjb3BpZXMgaW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGZhc3Qv
Y2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5kcy1leHBlY3RlZC50eHQ6IEFk
ZGluZyB0ZXN0IGNhc2UgZm9yIGJ1ZmZlckRhdGEgYW5kIGJ1ZmZlclN1YkRhdGEgd2l0aCBBcnJh
eUJ1ZmZlclZpZXcgaW5wdXQuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvZHJhdy1lbGVt
ZW50cy1vdXQtb2YtYm91bmRzLmh0bWw6IERpdHRvLgorCiAyMDEwLTA4LTA0ICBEYW4gQmVybnN0
ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2Vy
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZHJhdy1lbGVtZW50cy1vdXQt
b2YtYm91bmRzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2Nh
bnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMtZXhwZWN0ZWQudHh0CShyZXZp
c2lvbiA2NDY2MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVu
dHMtb3V0LW9mLWJvdW5kcy1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4
LDEyIEBAIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkcKIFBBU1MgY29u
dGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDB4ZmZmZmZmZmYsIGNvbnRleHQu
VU5TSUdORURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBJTlZBTElEX1ZB
TFVFLgogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZm
ZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJy
b3I6IElOVkFMSURfT1BFUkFUSU9OLgogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0
LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAweDdmZmZmZmZm
KSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IElOVkFMSURfT1BFUkFUSU9OLgorUEFTUyBj
b250ZXh0LmJ1ZmZlckRhdGEoY29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgKG5ldyBVaW50
OEFycmF5KFsgMywgMCwgMSwgMiBdKSkuc2xpY2UoMSksIGNvbnRleHQuU1RBVElDX0RSQVcpIGdl
bmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCitQQVNTIGNvbnRleHQuZHJhd0Vs
ZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIGdl
bmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCitQQVNTIGNvbnRleHQuYnVmZmVy
U3ViRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBuZXcgVWludDhBcnJheShb
IDMsIDAsIDFdKSkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBOT19FUlJPUi4KK1BBU1Mg
Y29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQuVU5TSUdO
RURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBJTlZBTElEX09QRVJBVElP
Ti4KK1BBU1MgY29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZG
RVIsIDAsIChuZXcgVWludDhBcnJheShbIDMsIDAsIDEsIDIgXSkpLnNsaWNlKDEpKSBnZW5lcmF0
ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgorUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50
cyhjb250ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0
ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgogCiBUZXN0IGJ1ZmZlciB3aXRoIGludGVy
bGVhdmVkICgzKzIpIGZsb2F0IHZlY3RvcnMKIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29u
dGV4dC5UUklBTkdMRVMsIDksIGNvbnRleHQuVU5TSUdORURfU0hPUlQsIDApIGdlbmVyYXRlZCBl
eHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMu
aHRtbAkocmV2aXNpb24gNjQ2NjApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9k
cmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtNTUsNiAr
NTUsMTMgQEAgc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSQogc2hvdWxk
R2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250
ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5V
TlNJR05FRF9CWVRFLCAwKSIpOwogc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRl
eHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFO
R0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAweDdmZmZmZmZmKSIpOwog
CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5OT19FUlJPUiwgImNvbnRl
eHQuYnVmZmVyRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAobmV3IFVpbnQ4QXJy
YXkoWyAzLCAwLCAxLCAyIF0pKS5zbGljZSgxKSwgY29udGV4dC5TVEFUSUNfRFJBVykiKTsKK3No
b3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0Lk5PX0VSUk9SLCAiY29udGV4dC5k
cmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQuVU5TSUdORURfQllURSwg
MCkiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0Lk5PX0VSUk9SLCAi
Y29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIG5l
dyBVaW50OEFycmF5KFsgMywgMCwgMV0pKSIpOworc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRl
eHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250
ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSIpOworc2hvdWxkR2Vu
ZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuTk9fRVJST1IsICJjb250ZXh0LmJ1ZmZlclN1
YkRhdGEoY29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgKG5ldyBVaW50OEFycmF5KFsg
MywgMCwgMSwgMiBdKSkuc2xpY2UoMSkpIik7CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4
dCwgY29udGV4dC5OT19FUlJPUiwgImNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5H
TEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIik7CisKIGRlYnVnKCIiKQogZGVidWco
IlRlc3QgYnVmZmVyIHdpdGggaW50ZXJsZWF2ZWQgKDMrMikgZmxvYXQgdmVjdG9ycyIpCiAK
</data>
<flag name="commit-queue"
          id="51910"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63532</attachid>
            <date>2010-08-04 19:20:41 -0700</date>
            <delta_ts>2010-08-04 19:22:24 -0700</delta_ts>
            <desc>revised patch: tiny modification</desc>
            <filename>bufferData.patch</filename>
            <type>text/plain</type>
            <size>13791</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDY4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWJHTEJ1
ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5KSBjb3BpZXMg
aW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dl
YkdMQnVmZmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhSW1wbCk6IEhlbHBlciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3Nv
Y2lhdGVCdWZmZXJEYXRhKCkuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2Np
YXRlQnVmZmVyRGF0YSk6IENhbGwgYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoKS4KKyAgICAgICAg
KFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbCk6IEhlbHBl
ciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhKCku
CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YSk6
IENhbGwgYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwoKS4KKyAgICAgICAgKiBodG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oOiBEZWNsYXJlIGhlbHBlciBmdW5jdGlvbnMuCisKIDIwMTAtMDgtMDQg
IERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXguCklu
ZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkocmV2aXNpb24gNjQ2NjApCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcs
NiArMjcsNyBAQAogCiAjaWYgRU5BQkxFKDNEX0NBTlZBUykKIAorI2luY2x1ZGUgIkNoZWNrZWRJ
bnQuaCIKICNpbmNsdWRlICJXZWJHTEJ1ZmZlci5oIgogI2luY2x1ZGUgIldlYkdMUmVuZGVyaW5n
Q29udGV4dC5oIgogCkBAIC01MiwxNDggKzUzLDExMSBAQCB2b2lkIFdlYkdMQnVmZmVyOjpfZGVs
ZXRlT2JqZWN0KFBsYXRmb3JtCiAgICAgY29udGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpLT5k
ZWxldGVCdWZmZXIob2JqZWN0KTsKIH0KIAotYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVm
ZmVyRGF0YShpbnQgc2l6ZSkKK2Jvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlckRhdGFJ
bXBsKEFycmF5QnVmZmVyKiBhcnJheSwgdW5zaWduZWQgYnl0ZU9mZnNldCwgdW5zaWduZWQgYnl0
ZUxlbmd0aCkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgaWYgKGFycmF5ICYmIGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgQ2hlY2tlZEludDx1aW50MzJf
dD4gY2hlY2tlZE9mZnNldChieXRlT2Zmc2V0KTsKKyAgICAgICAgQ2hlY2tlZEludDx1aW50MzJf
dD4gY2hlY2tlZExlbmd0aChieXRlTGVuZ3RoKTsKKyAgICAgICAgQ2hlY2tlZEludDx1aW50MzJf
dD4gY2hlY2tlZE1heCA9IGNoZWNrZWRPZmZzZXQgKyBjaGVja2VkTGVuZ3RoOworICAgICAgICBp
ZiAoIWNoZWNrZWRNYXgudmFsaWQoKSB8fCBjaGVja2VkTWF4LnZhbHVlKCkgPiBhcnJheS0+Ynl0
ZUxlbmd0aCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAotICAgIGlmICht
X3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAg
ICAgICAgbV9ieXRlTGVuZ3RoID0gc2l6ZTsKKyAgICBzd2l0Y2ggKG1fdGFyZ2V0KSB7CisgICAg
Y2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVI6CisgICAgICAgIG1f
Ynl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygp
OwotICAgICAgICBtX2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoc2l6
ZSwgMSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKLSAgICAgICAgICAg
IG1fYnl0ZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
KyAgICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAgIG1fZWxlbWVudEFycmF5QnVm
ZmVyID0gQXJyYXlCdWZmZXI6OmNyZWF0ZShieXRlTGVuZ3RoLCAxKTsKKyAgICAgICAgICAgIGlm
ICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtX2J5dGVMZW5ndGgg
PSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmIChhcnJheSkgeworICAgICAgICAgICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNs
b25lIHRoZSBpbmNvbWluZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKKyAgICAgICAgICAgICAg
ICAvLyBtb2RpZmljYXRpb25zIHdpdGhvdXQgY2FsbGluZyBidWZmZXJEYXRhIG9yIGJ1ZmZlclN1
YkRhdGEKKyAgICAgICAgICAgICAgICAvLyBtdXN0IG5ldmVyIGJlIGFibGUgdG8gY2hhbmdlIHRo
ZSB2YWxpZGF0aW9uIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0
PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcio+KGFycmF5LT5kYXRhKCkp
ICsgYnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9lbGVtZW50QXJyYXlCdWZm
ZXIgPSAwOwogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1fdGFyZ2V0ID09
IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgbV9ieXRlTGVuZ3Ro
ID0gc2l6ZTsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVI6CisgICAg
ICAgIG1fYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgICAgIHJldHVybiB0cnVlOworICAg
IGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Cit9CiAKLSAgICByZXR1cm4g
ZmFsc2U7Citib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKGludCBzaXplKQor
eworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBh
c3NvY2lhdGVCdWZmZXJEYXRhSW1wbCgwLCAwLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZSkp
OwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKEFycmF5QnVmZmVy
KiBhcnJheSkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQotICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgaWYgKCFhcnJheSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fdGFyZ2V0
ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZX0JVRkZFUikgewotICAgICAgICBj
bGVhckNhY2hlZE1heEluZGljZXMoKTsKLSAgICAgICAgbV9ieXRlTGVuZ3RoID0gYXJyYXktPmJ5
dGVMZW5ndGgoKTsKLSAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgY2xvbmUgdGhlIGluY29taW5n
IGRhdGEgYmVjYXVzZSBjbGllbnQtc2lkZQotICAgICAgICAvLyBtb2RpZmljYXRpb25zIHdpdGhv
dXQgY2FsbGluZyBidWZmZXJEYXRhIG9yIGJ1ZmZlclN1YkRhdGEKLSAgICAgICAgLy8gbXVzdCBu
ZXZlciBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdmFsaWRhdGlvbiByZXN1bHRzLgotICAgICAgICBt
X2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpjcmVhdGUoYXJyYXkpOwotICAgICAg
ICBpZiAoIW1fZWxlbWVudEFycmF5QnVmZmVyKSB7Ci0gICAgICAgICAgICBtX2J5dGVMZW5ndGgg
PSAwOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVy
biB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6
QVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3Ro
KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJyYXksIDAsIGFycmF5LT5ieXRlTGVu
Z3RoKCkpOwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJEYXRhKEFycmF5
QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3RhcmdldCkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1
cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJyYXktPmJ1ZmZlcigpLmdldCgpLCBhcnJheS0+
Ynl0ZU9mZnNldCgpLCBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsKK30KIAotICAgIGlmIChtX3Rhcmdl
dCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAg
Y2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5i
eXRlTGVuZ3RoKCk7Ci0gICAgICAgIC8vIFdlIG11c3QgYWx3YXlzIGNsb25lIHRoZSBpbmNvbWlu
ZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKLSAgICAgICAgLy8gbW9kaWZpY2F0aW9ucyB3aXRo
b3V0IGNhbGxpbmcgYnVmZmVyRGF0YSBvciBidWZmZXJTdWJEYXRhCi0gICAgICAgIC8vIG11c3Qg
bmV2ZXIgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4KLSAgICAgICAg
bV9lbGVtZW50QXJyYXlCdWZmZXIgPSBBcnJheUJ1ZmZlcjo6Y3JlYXRlKGFycmF5LT5idWZmZXIo
KS5nZXQoKSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKLSAgICAgICAg
ICAgIG1fYnl0ZUxlbmd0aCA9IDA7Citib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJT
dWJEYXRhSW1wbChsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5LCB1bnNpZ25lZCBhcnJh
eUJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVMZW5ndGgpCit7CisgICAgaWYgKCFhcnJheSB8fCBv
ZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoYnl0ZUxlbmd0aCkg
eworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkQnVmZmVyT2Zmc2V0KG9mZnNl
dCk7CisgICAgICAgIENoZWNrZWRJbnQ8dWludDMyX3Q+IGNoZWNrZWRBcnJheU9mZnNldChhcnJh
eUJ5dGVPZmZzZXQpOworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkTGVuZ3Ro
KGJ5dGVMZW5ndGgpOworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkQXJyYXlN
YXggPSBjaGVja2VkQXJyYXlPZmZzZXQgKyBjaGVja2VkTGVuZ3RoOworICAgICAgICBDaGVja2Vk
SW50PHVpbnQzMl90PiBjaGVja2VkQnVmZmVyTWF4ID0gY2hlY2tlZEJ1ZmZlck9mZnNldCArIGNo
ZWNrZWRMZW5ndGg7CisgICAgICAgIGlmICghY2hlY2tlZEFycmF5TWF4LnZhbGlkKCkgfHwgY2hl
Y2tlZEFycmF5TWF4LnZhbHVlKCkgPiBhcnJheS0+Ynl0ZUxlbmd0aCgpIHx8ICFjaGVja2VkQnVm
ZmVyTWF4LnZhbGlkKCkgfHwgY2hlY2tlZEJ1ZmZlck1heC52YWx1ZSgpID4gbV9ieXRlTGVuZ3Ro
KQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0
cnVlOwogICAgIH0KIAotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6QVJS
QVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7
CisgICAgc3dpdGNoIChtX3RhcmdldCkgeworICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkVM
RU1FTlRfQVJSQVlfQlVGRkVSOgorICAgICAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKKyAg
ICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlC
dWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbWVtY3B5
KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgp
KSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFy
Kj4oYXJyYXktPmRhdGEoKSkgKyBhcnJheUJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAg
Ynl0ZUxlbmd0aCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBH
cmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSOgogICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIHJldHVy
biBmYWxzZTsKIH0KIAogYm9vbCBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YShs
b25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5KQogewotICAgIGlmICghbV90YXJnZXQpCi0g
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWFycmF5KQogICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJS
QVlfQlVGRkVSKSB7Ci0gICAgICAgIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwotCi0gICAgICAg
IC8vIFdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVnZXIgb3ZlcmZsb3cgd2l0aCB0aGVz
ZSB0ZXN0cwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgICAgICB1bnNpZ25lZCBsb25nIHVvZmZzZXQgPSBzdGF0aWNfY2FzdDx1bnNpZ25l
ZCBsb25nPihvZmZzZXQpOwotICAgICAgICBpZiAodW9mZnNldCA+IG1fYnl0ZUxlbmd0aCB8fCBh
cnJheS0+Ynl0ZUxlbmd0aCgpID4gbV9ieXRlTGVuZ3RoIC0gdW9mZnNldCkKLSAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIW1fZWxlbWVudEFycmF5QnVmZmVyKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIG1lbWNweShzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyKj4obV9lbGVtZW50QXJyYXlCdWZmZXItPmRhdGEoKSkgKyBvZmZzZXQsCi0gICAg
ICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXJyYXktPmRhdGEoKSksCi0g
ICAgICAgICAgICAgICBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9C
VUZGRVIpCi0gICAgICAgIHJldHVybiBhcnJheS0+Ynl0ZUxlbmd0aCgpICsgb2Zmc2V0IDw9IG1f
Ynl0ZUxlbmd0aDsKLQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXNzb2NpYXRlQnVm
ZmVyU3ViRGF0YUltcGwob2Zmc2V0LCBhcnJheSwgMCwgYXJyYXktPmJ5dGVMZW5ndGgoKSk7CiB9
CiAKIGJvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZlclN1YkRhdGEobG9uZyBvZmZzZXQs
IEFycmF5QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3RhcmdldCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKLQot
ICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJBWV9CVUZG
RVIpIHsKLSAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0KLSAgICAgICAgLy8gV2Ug
bmVlZCB0byBwcm90ZWN0IGFnYWluc3QgaW50ZWdlciBvdmVyZmxvdyB3aXRoIHRoZXNlIHRlc3Rz
Ci0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdW9mZnNldCA9IHN0YXRpY19jYXN0PHVu
c2lnbmVkIGxvbmc+KG9mZnNldCk7Ci0gICAgICAgIGlmICh1b2Zmc2V0ID4gbV9ieXRlTGVuZ3Ro
IHx8IGFycmF5LT5ieXRlTGVuZ3RoKCkgPiBtX2J5dGVMZW5ndGggLSB1b2Zmc2V0KQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIGlmICghbV9lbGVtZW50
QXJyYXlCdWZmZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgbWVtY3B5
KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZlci0+ZGF0YSgp
KSArIG9mZnNldCwgYXJyYXktPmJhc2VBZGRyZXNzKCksIGFycmF5LT5ieXRlTGVuZ3RoKCkpOwot
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhp
Y3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUikKLSAgICAgICAgcmV0dXJuIGFycmF5LT5ieXRlTGVu
Z3RoKCkgKyBvZmZzZXQgPD0gbV9ieXRlTGVuZ3RoOwotCi0gICAgcmV0dXJuIGZhbHNlOworICAg
IHJldHVybiBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbChvZmZzZXQsIGFycmF5LT5idWZmZXIo
KS5nZXQoKSwgYXJyYXktPmJ5dGVPZmZzZXQoKSwgYXJyYXktPmJ5dGVMZW5ndGgoKSk7CiB9CiAK
IHVuc2lnbmVkIFdlYkdMQnVmZmVyOjpieXRlTGVuZ3RoKCkgY29uc3QKSW5kZXg6IFdlYkNvcmUv
aHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMQnVmZmVyLmgJKHJldmlzaW9uIDY0NjYwKQorKysgV2ViQ29yZS9odG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC05MCw2ICs5MCwxMSBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gQ2xlYXJzIGFsbCBvZiB0aGUgY2FjaGVkIG1heCBp
bmRpY2VzLgogICAgICAgICB2b2lkIGNsZWFyQ2FjaGVkTWF4SW5kaWNlcygpOworCisgICAgICAg
IC8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRocmVlIGFzc29jaWF0ZUJ1ZmZlckRh
dGEoKS4KKyAgICAgICAgYm9vbCBhc3NvY2lhdGVCdWZmZXJEYXRhSW1wbChBcnJheUJ1ZmZlciog
YXJyYXksIHVuc2lnbmVkIGJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVMZW5ndGgpOworICAgICAg
ICAvLyBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSB0d28gYXNzb2NpYXRlQnVmZmVyU3Vi
RGF0YSgpLgorICAgICAgICBib29sIGFzc29jaWF0ZUJ1ZmZlclN1YkRhdGFJbXBsKGxvbmcgb2Zm
c2V0LCBBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGFycmF5Qnl0ZU9mZnNldCwgdW5zaWdu
ZWQgYnl0ZUxlbmd0aCk7CiAgICAgfTsKICAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHJldmlzaW9uIDY0Njg0KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5n
IGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29v
Z2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAg
ICBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5
KSBjb3BpZXMgaW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGZhc3Qv
Y2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5kcy1leHBlY3RlZC50eHQ6IEFk
ZGluZyB0ZXN0IGNhc2UgZm9yIGJ1ZmZlckRhdGEgYW5kIGJ1ZmZlclN1YkRhdGEgd2l0aCBBcnJh
eUJ1ZmZlclZpZXcgaW5wdXQuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvZHJhdy1lbGVt
ZW50cy1vdXQtb2YtYm91bmRzLmh0bWw6IERpdHRvLgorCiAyMDEwLTA4LTA0ICBEYW4gQmVybnN0
ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgU2ltb24gRnJhc2Vy
LgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZHJhdy1lbGVtZW50cy1vdXQt
b2YtYm91bmRzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2Nh
bnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMtZXhwZWN0ZWQudHh0CShyZXZp
c2lvbiA2NDY2MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVu
dHMtb3V0LW9mLWJvdW5kcy1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTI4LDYgKzI4
LDEyIEBAIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkcKIFBBU1MgY29u
dGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDB4ZmZmZmZmZmYsIGNvbnRleHQu
VU5TSUdORURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBJTlZBTElEX1ZB
TFVFLgogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZm
ZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJy
b3I6IElOVkFMSURfT1BFUkFUSU9OLgogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0
LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAweDdmZmZmZmZm
KSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IElOVkFMSURfT1BFUkFUSU9OLgorUEFTUyBj
b250ZXh0LmJ1ZmZlckRhdGEoY29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgKG5ldyBVaW50
OEFycmF5KFsgMywgMCwgMSwgMiBdKSkuc2xpY2UoMSksIGNvbnRleHQuU1RBVElDX0RSQVcpIGdl
bmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCitQQVNTIGNvbnRleHQuZHJhd0Vs
ZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIGdl
bmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCitQQVNTIGNvbnRleHQuYnVmZmVy
U3ViRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAwLCBuZXcgVWludDhBcnJheShb
IDMsIDAsIDFdKSkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBOT19FUlJPUi4KK1BBU1Mg
Y29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQuVU5TSUdO
RURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVycm9yOiBJTlZBTElEX09QRVJBVElP
Ti4KK1BBU1MgY29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZG
RVIsIDAsIChuZXcgVWludDhBcnJheShbIDMsIDAsIDEsIDIgXSkpLnNsaWNlKDEpKSBnZW5lcmF0
ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgorUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50
cyhjb250ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5lcmF0
ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgogCiBUZXN0IGJ1ZmZlciB3aXRoIGludGVy
bGVhdmVkICgzKzIpIGZsb2F0IHZlY3RvcnMKIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29u
dGV4dC5UUklBTkdMRVMsIDksIGNvbnRleHQuVU5TSUdORURfU0hPUlQsIDApIGdlbmVyYXRlZCBl
eHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMu
aHRtbAkocmV2aXNpb24gNjQ2NjApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9k
cmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtNTUsNiAr
NTUsMTMgQEAgc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSQogc2hvdWxk
R2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250
ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5V
TlNJR05FRF9CWVRFLCAwKSIpOwogc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRl
eHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFO
R0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAweDdmZmZmZmZmKSIpOwog
CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5OT19FUlJPUiwgImNvbnRl
eHQuYnVmZmVyRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCAobmV3IFVpbnQ4QXJy
YXkoWyAzLCAwLCAxLCAyIF0pKS5zbGljZSgxKSwgY29udGV4dC5TVEFUSUNfRFJBVykiKTsKK3No
b3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0Lk5PX0VSUk9SLCAiY29udGV4dC5k
cmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNvbnRleHQuVU5TSUdORURfQllURSwg
MCkiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0Lk5PX0VSUk9SLCAi
Y29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIG5l
dyBVaW50OEFycmF5KFsgMywgMCwgMV0pKSIpOworc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRl
eHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250
ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSIpOworc2hvdWxkR2Vu
ZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuTk9fRVJST1IsICJjb250ZXh0LmJ1ZmZlclN1
YkRhdGEoY29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgMCwgKG5ldyBVaW50OEFycmF5KFsg
MywgMCwgMSwgMiBdKSkuc2xpY2UoMSkpIik7CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4
dCwgY29udGV4dC5OT19FUlJPUiwgImNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5H
TEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIik7CisKIGRlYnVnKCIiKQogZGVidWco
IlRlc3QgYnVmZmVyIHdpdGggaW50ZXJsZWF2ZWQgKDMrMikgZmxvYXQgdmVjdG9ycyIpCiAK
</data>
<flag name="commit-queue"
          id="51913"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>63533</attachid>
            <date>2010-08-04 19:22:24 -0700</date>
            <delta_ts>2010-08-05 14:43:34 -0700</delta_ts>
            <desc>revised patch: fix a style issue</desc>
            <filename>bufferData.patch</filename>
            <type>text/plain</type>
            <size>13812</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NDY4NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMTAtMDgtMDQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBXZWJHTEJ1
ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShBcnJheUJ1ZmZlclZpZXcqIGFycmF5KSBjb3BpZXMg
aW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2aWV3cworICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIxMjQKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dl
YkdMQnVmZmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhSW1wbCk6IEhlbHBlciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3Nv
Y2lhdGVCdWZmZXJEYXRhKCkuCisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2Np
YXRlQnVmZmVyRGF0YSk6IENhbGwgYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoKS4KKyAgICAgICAg
KFdlYkNvcmU6OldlYkdMQnVmZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbCk6IEhlbHBl
ciBmdW5jdGlvbiB0aGF0J3MgY2FsbGVkIGJ5IGFsbCBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhKCku
CisgICAgICAgIChXZWJDb3JlOjpXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyU3ViRGF0YSk6
IENhbGwgYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwoKS4KKyAgICAgICAgKiBodG1sL2NhbnZh
cy9XZWJHTEJ1ZmZlci5oOiBEZWNsYXJlIGhlbHBlciBmdW5jdGlvbnMuCisKIDIwMTAtMDgtMDQg
IERhbiBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXguCklu
ZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkocmV2aXNpb24gNjQ2NjApCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgs
NiArMjgsOCBAQAogI2lmIEVOQUJMRSgzRF9DQU5WQVMpCiAKICNpbmNsdWRlICJXZWJHTEJ1ZmZl
ci5oIgorCisjaW5jbHVkZSAiQ2hlY2tlZEludC5oIgogI2luY2x1ZGUgIldlYkdMUmVuZGVyaW5n
Q29udGV4dC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CkBAIC01MiwxNDggKzU0LDExMSBAQCB2
b2lkIFdlYkdMQnVmZmVyOjpfZGVsZXRlT2JqZWN0KFBsYXRmb3JtCiAgICAgY29udGV4dCgpLT5n
cmFwaGljc0NvbnRleHQzRCgpLT5kZWxldGVCdWZmZXIob2JqZWN0KTsKIH0KIAotYm9vbCBXZWJH
TEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShpbnQgc2l6ZSkKK2Jvb2wgV2ViR0xCdWZmZXI6
OmFzc29jaWF0ZUJ1ZmZlckRhdGFJbXBsKEFycmF5QnVmZmVyKiBhcnJheSwgdW5zaWduZWQgYnl0
ZU9mZnNldCwgdW5zaWduZWQgYnl0ZUxlbmd0aCkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQotICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGFycmF5ICYmIGJ5dGVMZW5ndGgpIHsKKyAgICAg
ICAgQ2hlY2tlZEludDx1aW50MzJfdD4gY2hlY2tlZE9mZnNldChieXRlT2Zmc2V0KTsKKyAgICAg
ICAgQ2hlY2tlZEludDx1aW50MzJfdD4gY2hlY2tlZExlbmd0aChieXRlTGVuZ3RoKTsKKyAgICAg
ICAgQ2hlY2tlZEludDx1aW50MzJfdD4gY2hlY2tlZE1heCA9IGNoZWNrZWRPZmZzZXQgKyBjaGVj
a2VkTGVuZ3RoOworICAgICAgICBpZiAoIWNoZWNrZWRNYXgudmFsaWQoKSB8fCBjaGVja2VkTWF4
LnZhbHVlKCkgPiBhcnJheS0+Ynl0ZUxlbmd0aCgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KIAotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVO
VF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgbV9ieXRlTGVuZ3RoID0gc2l6ZTsKKyAgICBzd2l0
Y2ggKG1fdGFyZ2V0KSB7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJB
WV9CVUZGRVI6CisgICAgICAgIG1fYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAgICAgIGNs
ZWFyQ2FjaGVkTWF4SW5kaWNlcygpOwotICAgICAgICBtX2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFy
cmF5QnVmZmVyOjpjcmVhdGUoc2l6ZSwgMSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlC
dWZmZXIpIHsKLSAgICAgICAgICAgIG1fYnl0ZUxlbmd0aCA9IDA7Ci0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAg
ICAgIG1fZWxlbWVudEFycmF5QnVmZmVyID0gQXJyYXlCdWZmZXI6OmNyZWF0ZShieXRlTGVuZ3Ro
LCAxKTsKKyAgICAgICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpIHsKKyAgICAgICAg
ICAgICAgICBtX2J5dGVMZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhcnJheSkgeworICAgICAgICAgICAgICAg
IC8vIFdlIG11c3QgYWx3YXlzIGNsb25lIHRoZSBpbmNvbWluZyBkYXRhIGJlY2F1c2UgY2xpZW50
LXNpZGUKKyAgICAgICAgICAgICAgICAvLyBtb2RpZmljYXRpb25zIHdpdGhvdXQgY2FsbGluZyBi
dWZmZXJEYXRhIG9yIGJ1ZmZlclN1YkRhdGEKKyAgICAgICAgICAgICAgICAvLyBtdXN0IG5ldmVy
IGJlIGFibGUgdG8gY2hhbmdlIHRoZSB2YWxpZGF0aW9uIHJlc3VsdHMuCisgICAgICAgICAgICAg
ICAgbWVtY3B5KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1lbnRBcnJheUJ1ZmZl
ci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQg
Y2hhcio+KGFycmF5LT5kYXRhKCkpICsgYnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAg
ICAgYnl0ZUxlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgbV9lbGVtZW50QXJyYXlCdWZmZXIgPSAwOwogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9
IGVsc2UgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIpIHsK
LSAgICAgICAgbV9ieXRlTGVuZ3RoID0gc2l6ZTsKKyAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNE
OjpBUlJBWV9CVUZGRVI6CisgICAgICAgIG1fYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGg7CiAgICAg
ICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKICAg
ICB9Cit9CiAKLSAgICByZXR1cm4gZmFsc2U7Citib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhKGludCBzaXplKQoreworICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIHJldHVybiBhc3NvY2lhdGVCdWZmZXJEYXRhSW1wbCgwLCAwLCBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4oc2l6ZSkpOwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3NvY2lhdGVC
dWZmZXJEYXRhKEFycmF5QnVmZmVyKiBhcnJheSkKIHsKLSAgICBpZiAoIW1fdGFyZ2V0KQotICAg
ICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFhcnJheSkKICAgICAgICAgcmV0dXJuIGZhbHNl
OwotCi0gICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBoaWNzQ29udGV4dDNEOjpFTEVNRU5UX0FSUkFZ
X0JVRkZFUikgewotICAgICAgICBjbGVhckNhY2hlZE1heEluZGljZXMoKTsKLSAgICAgICAgbV9i
eXRlTGVuZ3RoID0gYXJyYXktPmJ5dGVMZW5ndGgoKTsKLSAgICAgICAgLy8gV2UgbXVzdCBhbHdh
eXMgY2xvbmUgdGhlIGluY29taW5nIGRhdGEgYmVjYXVzZSBjbGllbnQtc2lkZQotICAgICAgICAv
LyBtb2RpZmljYXRpb25zIHdpdGhvdXQgY2FsbGluZyBidWZmZXJEYXRhIG9yIGJ1ZmZlclN1YkRh
dGEKLSAgICAgICAgLy8gbXVzdCBuZXZlciBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgdmFsaWRhdGlv
biByZXN1bHRzLgotICAgICAgICBtX2VsZW1lbnRBcnJheUJ1ZmZlciA9IEFycmF5QnVmZmVyOjpj
cmVhdGUoYXJyYXkpOwotICAgICAgICBpZiAoIW1fZWxlbWVudEFycmF5QnVmZmVyKSB7Ci0gICAg
ICAgICAgICBtX2J5dGVMZW5ndGggPSAwOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtX3RhcmdldCA9
PSBHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0
aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQot
ICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJy
YXksIDAsIGFycmF5LT5ieXRlTGVuZ3RoKCkpOwogfQogCiBib29sIFdlYkdMQnVmZmVyOjphc3Nv
Y2lhdGVCdWZmZXJEYXRhKEFycmF5QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYgKCFtX3Rh
cmdldCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXNzb2NpYXRlQnVmZmVyRGF0YUltcGwoYXJyYXktPmJ1
ZmZlcigpLmdldCgpLCBhcnJheS0+Ynl0ZU9mZnNldCgpLCBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsK
K30KIAotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQzRDo6RUxFTUVOVF9BUlJB
WV9CVUZGRVIpIHsKLSAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2VzKCk7Ci0gICAgICAgIG1f
Ynl0ZUxlbmd0aCA9IGFycmF5LT5ieXRlTGVuZ3RoKCk7Ci0gICAgICAgIC8vIFdlIG11c3QgYWx3
YXlzIGNsb25lIHRoZSBpbmNvbWluZyBkYXRhIGJlY2F1c2UgY2xpZW50LXNpZGUKLSAgICAgICAg
Ly8gbW9kaWZpY2F0aW9ucyB3aXRob3V0IGNhbGxpbmcgYnVmZmVyRGF0YSBvciBidWZmZXJTdWJE
YXRhCi0gICAgICAgIC8vIG11c3QgbmV2ZXIgYmUgYWJsZSB0byBjaGFuZ2UgdGhlIHZhbGlkYXRp
b24gcmVzdWx0cy4KLSAgICAgICAgbV9lbGVtZW50QXJyYXlCdWZmZXIgPSBBcnJheUJ1ZmZlcjo6
Y3JlYXRlKGFycmF5LT5idWZmZXIoKS5nZXQoKSk7Ci0gICAgICAgIGlmICghbV9lbGVtZW50QXJy
YXlCdWZmZXIpIHsKLSAgICAgICAgICAgIG1fYnl0ZUxlbmd0aCA9IDA7Citib29sIFdlYkdMQnVm
ZmVyOjphc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbChsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIq
IGFycmF5LCB1bnNpZ25lZCBhcnJheUJ5dGVPZmZzZXQsIHVuc2lnbmVkIGJ5dGVMZW5ndGgpCit7
CisgICAgaWYgKCFhcnJheSB8fCBvZmZzZXQgPCAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBpZiAoYnl0ZUxlbmd0aCkgeworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVj
a2VkQnVmZmVyT2Zmc2V0KG9mZnNldCk7CisgICAgICAgIENoZWNrZWRJbnQ8dWludDMyX3Q+IGNo
ZWNrZWRBcnJheU9mZnNldChhcnJheUJ5dGVPZmZzZXQpOworICAgICAgICBDaGVja2VkSW50PHVp
bnQzMl90PiBjaGVja2VkTGVuZ3RoKGJ5dGVMZW5ndGgpOworICAgICAgICBDaGVja2VkSW50PHVp
bnQzMl90PiBjaGVja2VkQXJyYXlNYXggPSBjaGVja2VkQXJyYXlPZmZzZXQgKyBjaGVja2VkTGVu
Z3RoOworICAgICAgICBDaGVja2VkSW50PHVpbnQzMl90PiBjaGVja2VkQnVmZmVyTWF4ID0gY2hl
Y2tlZEJ1ZmZlck9mZnNldCArIGNoZWNrZWRMZW5ndGg7CisgICAgICAgIGlmICghY2hlY2tlZEFy
cmF5TWF4LnZhbGlkKCkgfHwgY2hlY2tlZEFycmF5TWF4LnZhbHVlKCkgPiBhcnJheS0+Ynl0ZUxl
bmd0aCgpIHx8ICFjaGVja2VkQnVmZmVyTWF4LnZhbGlkKCkgfHwgY2hlY2tlZEJ1ZmZlck1heC52
YWx1ZSgpID4gbV9ieXRlTGVuZ3RoKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAg
ICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGlmIChtX3RhcmdldCA9PSBH
cmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIG1fYnl0ZUxlbmd0aCA9
IGFycmF5LT5ieXRlTGVuZ3RoKCk7CisgICAgc3dpdGNoIChtX3RhcmdldCkgeworICAgIGNhc2Ug
R3JhcGhpY3NDb250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSOgorICAgICAgICBjbGVhckNh
Y2hlZE1heEluZGljZXMoKTsKKyAgICAgICAgaWYgKGJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAg
IGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1l
bnRBcnJheUJ1ZmZlci0+ZGF0YSgpKSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBzdGF0
aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4oYXJyYXktPmRhdGEoKSkgKyBhcnJheUJ5dGVPZmZzZXQs
CisgICAgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCk7CisgICAgICAgIH0KICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6QVJSQVlfQlVGRkVSOgorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CiAg
ICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBXZWJHTEJ1ZmZlcjo6YXNz
b2NpYXRlQnVmZmVyU3ViRGF0YShsb25nIG9mZnNldCwgQXJyYXlCdWZmZXIqIGFycmF5KQogewot
ICAgIGlmICghbV90YXJnZXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWFycmF5
KQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAobV90YXJnZXQgPT0gR3JhcGhpY3ND
b250ZXh0M0Q6OkVMRU1FTlRfQVJSQVlfQlVGRkVSKSB7Ci0gICAgICAgIGNsZWFyQ2FjaGVkTWF4
SW5kaWNlcygpOwotCi0gICAgICAgIC8vIFdlIG5lZWQgdG8gcHJvdGVjdCBhZ2FpbnN0IGludGVn
ZXIgb3ZlcmZsb3cgd2l0aCB0aGVzZSB0ZXN0cwotICAgICAgICBpZiAob2Zmc2V0IDwgMCkKLSAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICB1bnNpZ25lZCBsb25nIHVvZmZzZXQg
PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihvZmZzZXQpOwotICAgICAgICBpZiAodW9mZnNl
dCA+IG1fYnl0ZUxlbmd0aCB8fCBhcnJheS0+Ynl0ZUxlbmd0aCgpID4gbV9ieXRlTGVuZ3RoIC0g
dW9mZnNldCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBpZiAoIW1fZWxl
bWVudEFycmF5QnVmZmVyKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIG1l
bWNweShzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4obV9lbGVtZW50QXJyYXlCdWZmZXItPmRh
dGEoKSkgKyBvZmZzZXQsCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFy
Kj4oYXJyYXktPmRhdGEoKSksCi0gICAgICAgICAgICAgICBhcnJheS0+Ynl0ZUxlbmd0aCgpKTsK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKG1fdGFyZ2V0ID09IEdyYXBo
aWNzQ29udGV4dDNEOjpBUlJBWV9CVUZGRVIpCi0gICAgICAgIHJldHVybiBhcnJheS0+Ynl0ZUxl
bmd0aCgpICsgb2Zmc2V0IDw9IG1fYnl0ZUxlbmd0aDsKLQotICAgIHJldHVybiBmYWxzZTsKKyAg
ICByZXR1cm4gYXNzb2NpYXRlQnVmZmVyU3ViRGF0YUltcGwob2Zmc2V0LCBhcnJheSwgMCwgYXJy
YXktPmJ5dGVMZW5ndGgoKSk7CiB9CiAKIGJvb2wgV2ViR0xCdWZmZXI6OmFzc29jaWF0ZUJ1ZmZl
clN1YkRhdGEobG9uZyBvZmZzZXQsIEFycmF5QnVmZmVyVmlldyogYXJyYXkpCiB7Ci0gICAgaWYg
KCFtX3RhcmdldCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGlmICghYXJyYXkpCiAgICAg
ICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChtX3RhcmdldCA9PSBHcmFwaGljc0NvbnRleHQz
RDo6RUxFTUVOVF9BUlJBWV9CVUZGRVIpIHsKLSAgICAgICAgY2xlYXJDYWNoZWRNYXhJbmRpY2Vz
KCk7Ci0KLSAgICAgICAgLy8gV2UgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgaW50ZWdlciBvdmVy
ZmxvdyB3aXRoIHRoZXNlIHRlc3RzCi0gICAgICAgIGlmIChvZmZzZXQgPCAwKQotICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdW9m
ZnNldCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KG9mZnNldCk7Ci0gICAgICAgIGlmICh1
b2Zmc2V0ID4gbV9ieXRlTGVuZ3RoIHx8IGFycmF5LT5ieXRlTGVuZ3RoKCkgPiBtX2J5dGVMZW5n
dGggLSB1b2Zmc2V0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgCi0g
ICAgICAgIGlmICghbV9lbGVtZW50QXJyYXlCdWZmZXIpCi0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICAgICAgbWVtY3B5KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXIqPihtX2VsZW1l
bnRBcnJheUJ1ZmZlci0+ZGF0YSgpKSArIG9mZnNldCwgYXJyYXktPmJhc2VBZGRyZXNzKCksIGFy
cmF5LT5ieXRlTGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAobV90YXJnZXQgPT0gR3JhcGhpY3NDb250ZXh0M0Q6OkFSUkFZX0JVRkZFUikKLSAgICAgICAg
cmV0dXJuIGFycmF5LT5ieXRlTGVuZ3RoKCkgKyBvZmZzZXQgPD0gbV9ieXRlTGVuZ3RoOwotCi0g
ICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhc3NvY2lhdGVCdWZmZXJTdWJEYXRhSW1wbChv
ZmZzZXQsIGFycmF5LT5idWZmZXIoKS5nZXQoKSwgYXJyYXktPmJ5dGVPZmZzZXQoKSwgYXJyYXkt
PmJ5dGVMZW5ndGgoKSk7CiB9CiAKIHVuc2lnbmVkIFdlYkdMQnVmZmVyOjpieXRlTGVuZ3RoKCkg
Y29uc3QKSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xCdWZmZXIuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMQnVmZmVyLmgJKHJldmlzaW9uIDY0NjYwKQor
KysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTEJ1ZmZlci5oCSh3b3JraW5nIGNvcHkpCkBAIC05
MCw2ICs5MCwxMSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gQ2xlYXJzIGFs
bCBvZiB0aGUgY2FjaGVkIG1heCBpbmRpY2VzLgogICAgICAgICB2b2lkIGNsZWFyQ2FjaGVkTWF4
SW5kaWNlcygpOworCisgICAgICAgIC8vIEhlbHBlciBmdW5jdGlvbiBjYWxsZWQgYnkgdGhlIHRo
cmVlIGFzc29jaWF0ZUJ1ZmZlckRhdGEoKS4KKyAgICAgICAgYm9vbCBhc3NvY2lhdGVCdWZmZXJE
YXRhSW1wbChBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGJ5dGVPZmZzZXQsIHVuc2lnbmVk
IGJ5dGVMZW5ndGgpOworICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoZSB0
d28gYXNzb2NpYXRlQnVmZmVyU3ViRGF0YSgpLgorICAgICAgICBib29sIGFzc29jaWF0ZUJ1ZmZl
clN1YkRhdGFJbXBsKGxvbmcgb2Zmc2V0LCBBcnJheUJ1ZmZlciogYXJyYXksIHVuc2lnbmVkIGFy
cmF5Qnl0ZU9mZnNldCwgdW5zaWduZWQgYnl0ZUxlbmd0aCk7CiAgICAgfTsKICAgICAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDY0Njg0KQorKysgTGF5b3V0VGVz
dHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDgtMDQg
IFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBXZWJHTEJ1ZmZlcjo6YXNzb2NpYXRlQnVmZmVyRGF0YShB
cnJheUJ1ZmZlclZpZXcqIGFycmF5KSBjb3BpZXMgaW5jb3JyZWN0IGRhdGEgZm9yIHNsaWNlZCB2
aWV3cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDIx
MjQKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJv
dW5kcy1leHBlY3RlZC50eHQ6IEFkZGluZyB0ZXN0IGNhc2UgZm9yIGJ1ZmZlckRhdGEgYW5kIGJ1
ZmZlclN1YkRhdGEgd2l0aCBBcnJheUJ1ZmZlclZpZXcgaW5wdXQuCisgICAgICAgICogZmFzdC9j
YW52YXMvd2ViZ2wvZHJhdy1lbGVtZW50cy1vdXQtb2YtYm91bmRzLmh0bWw6IERpdHRvLgorCiAy
MDEwLTA4LTA0ICBEYW4gQmVybnN0ZWluICA8bWl0ekBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2
aWV3ZWQgYnkgU2ltb24gRnJhc2VyLgpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2Vi
Z2wvZHJhdy1lbGVtZW50cy1vdXQtb2YtYm91bmRzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3Vu
ZHMtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA2NDY2MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2Fu
dmFzL3dlYmdsL2RyYXctZWxlbWVudHMtb3V0LW9mLWJvdW5kcy1leHBlY3RlZC50eHQJKHdvcmtp
bmcgY29weSkKQEAgLTI4LDYgKzI4LDEyIEBAIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29u
dGV4dC5UUklBTkcKIFBBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMs
IDB4ZmZmZmZmZmYsIGNvbnRleHQuVU5TSUdORURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVk
IEdMIGVycm9yOiBJTlZBTElEX1ZBTFVFLgogUEFTUyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250
ZXh0LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSBnZW5l
cmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IElOVkFMSURfT1BFUkFUSU9OLgogUEFTUyBjb250ZXh0
LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJ
R05FRF9CWVRFLCAweDdmZmZmZmZmKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IElOVkFM
SURfT1BFUkFUSU9OLgorUEFTUyBjb250ZXh0LmJ1ZmZlckRhdGEoY29udGV4dC5FTEVNRU5UX0FS
UkFZX0JVRkZFUiwgKG5ldyBVaW50OEFycmF5KFsgMywgMCwgMSwgMiBdKSkuc2xpY2UoMSksIGNv
bnRleHQuU1RBVElDX0RSQVcpIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1Iu
CitQQVNTIGNvbnRleHQuZHJhd0VsZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0
LlVOU0lHTkVEX0JZVEUsIDApIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1Iu
CitQQVNTIGNvbnRleHQuYnVmZmVyU3ViRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlfQlVGRkVS
LCAwLCBuZXcgVWludDhBcnJheShbIDMsIDAsIDFdKSkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVy
cm9yOiBOT19FUlJPUi4KK1BBU1MgY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdM
RVMsIDMsIGNvbnRleHQuVU5TSUdORURfQllURSwgMCkgZ2VuZXJhdGVkIGV4cGVjdGVkIEdMIGVy
cm9yOiBJTlZBTElEX09QRVJBVElPTi4KK1BBU1MgY29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRl
eHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIDAsIChuZXcgVWludDhBcnJheShbIDMsIDAsIDEsIDIg
XSkpLnNsaWNlKDEpKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgorUEFT
UyBjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJ
R05FRF9CWVRFLCAwKSBnZW5lcmF0ZWQgZXhwZWN0ZWQgR0wgZXJyb3I6IE5PX0VSUk9SLgogCiBU
ZXN0IGJ1ZmZlciB3aXRoIGludGVybGVhdmVkICgzKzIpIGZsb2F0IHZlY3RvcnMKIFBBU1MgY29u
dGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDksIGNvbnRleHQuVU5TSUdORURf
U0hPUlQsIDApIGdlbmVyYXRlZCBleHBlY3RlZCBHTCBlcnJvcjogTk9fRVJST1IuCkluZGV4OiBM
YXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMu
aHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVs
ZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAkocmV2aXNpb24gNjQ2NjApCisrKyBMYXlvdXRUZXN0
cy9mYXN0L2NhbnZhcy93ZWJnbC9kcmF3LWVsZW1lbnRzLW91dC1vZi1ib3VuZHMuaHRtbAkod29y
a2luZyBjb3B5KQpAQCAtNTUsNiArNTUsMTMgQEAgc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRl
eHQsIGNvbnRleHQuSQogc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSU5W
QUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywg
MHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9CWVRFLCAwKSIpOwogc2hvdWxkR2VuZXJhdGVH
TEVycm9yKGNvbnRleHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250ZXh0LmRyYXdF
bGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMHg3ZmZmZmZmZiwgY29udGV4dC5VTlNJR05FRF9C
WVRFLCAweDdmZmZmZmZmKSIpOwogCitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29u
dGV4dC5OT19FUlJPUiwgImNvbnRleHQuYnVmZmVyRGF0YShjb250ZXh0LkVMRU1FTlRfQVJSQVlf
QlVGRkVSLCAobmV3IFVpbnQ4QXJyYXkoWyAzLCAwLCAxLCAyIF0pKS5zbGljZSgxKSwgY29udGV4
dC5TVEFUSUNfRFJBVykiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0LCBjb250ZXh0
Lk5PX0VSUk9SLCAiY29udGV4dC5kcmF3RWxlbWVudHMoY29udGV4dC5UUklBTkdMRVMsIDMsIGNv
bnRleHQuVU5TSUdORURfQllURSwgMCkiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihjb250ZXh0
LCBjb250ZXh0Lk5PX0VSUk9SLCAiY29udGV4dC5idWZmZXJTdWJEYXRhKGNvbnRleHQuRUxFTUVO
VF9BUlJBWV9CVUZGRVIsIDAsIG5ldyBVaW50OEFycmF5KFsgMywgMCwgMV0pKSIpOworc2hvdWxk
R2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuSU5WQUxJRF9PUEVSQVRJT04sICJjb250
ZXh0LmRyYXdFbGVtZW50cyhjb250ZXh0LlRSSUFOR0xFUywgMywgY29udGV4dC5VTlNJR05FRF9C
WVRFLCAwKSIpOworc2hvdWxkR2VuZXJhdGVHTEVycm9yKGNvbnRleHQsIGNvbnRleHQuTk9fRVJS
T1IsICJjb250ZXh0LmJ1ZmZlclN1YkRhdGEoY29udGV4dC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwg
MCwgKG5ldyBVaW50OEFycmF5KFsgMywgMCwgMSwgMiBdKSkuc2xpY2UoMSkpIik7CitzaG91bGRH
ZW5lcmF0ZUdMRXJyb3IoY29udGV4dCwgY29udGV4dC5OT19FUlJPUiwgImNvbnRleHQuZHJhd0Vs
ZW1lbnRzKGNvbnRleHQuVFJJQU5HTEVTLCAzLCBjb250ZXh0LlVOU0lHTkVEX0JZVEUsIDApIik7
CisKIGRlYnVnKCIiKQogZGVidWcoIlRlc3QgYnVmZmVyIHdpdGggaW50ZXJsZWF2ZWQgKDMrMikg
ZmxvYXQgdmVjdG9ycyIpCiAK
</data>
<flag name="review"
          id="51914"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
    <flag name="commit-queue"
          id="51915"
          type_id="3"
          status="-"
          setter="zmo"
    />
          </attachment>
      

    </bug>

</bugzilla>