<?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>31892</bug_id>
          
          <creation_ts>2009-11-25 16:24:25 -0800</creation_ts>
          <short_desc>Index validation code validates too many vertex attributes</short_desc>
          <delta_ts>2010-04-15 19:01:51 -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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Kenneth Russell">kbr</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>brettw</cc>
    
    <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>fishd</cc>
    
    <cc>kbr</cc>
    
    <cc>oliver</cc>
    
    <cc>petersont</cc>
    
    <cc>rlp</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>166572</commentid>
    <comment_count>0</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2009-11-25 16:24:25 -0800</bug_when>
    <thetext>The index validation code added in https://bugs.webkit.org/show_bug.cgi?id=31239 validates too many vertex attributes. It currently validates all enabled vertex attribute slots, but should only validate those consumed by the currently bound program.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209896</commentid>
    <comment_count>1</comment_count>
      <attachid>52797</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 16:19:49 -0700</bug_when>
    <thetext>Created attachment 52797
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209897</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-07 16:24:43 -0700</bug_when>
    <thetext>Attachment 52797 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/html/canvas/WebGLProgram.cpp:53:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 1 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209898</commentid>
    <comment_count>3</comment_count>
      <attachid>52798</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 16:25:17 -0700</bug_when>
    <thetext>Created attachment 52798
revised patch: fix a typo</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209900</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-07 16:30:29 -0700</bug_when>
    <thetext>Attachment 52798 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
WebCore/html/canvas/WebGLProgram.cpp:53:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 1 in 7 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209902</commentid>
    <comment_count>5</comment_count>
      <attachid>52800</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 16:31:37 -0700</bug_when>
    <thetext>Created attachment 52800
revised patch: fix a style issue</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>209929</commentid>
    <comment_count>6</comment_count>
      <attachid>52800</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-07 17:22:17 -0700</bug_when>
    <thetext>Comment on attachment 52800
revised patch: fix a style issue

&gt; Index: WebCore/html/canvas/WebGLProgram.cpp
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLProgram.cpp	(revision 57235)
&gt; +++ WebCore/html/canvas/WebGLProgram.cpp	(working copy)
&gt; @@ -48,6 +48,34 @@ void WebGLProgram::_deleteObject(Platfor
&gt;      context()-&gt;graphicsContext3D()-&gt;deleteProgram(object);
&gt;  }
&gt;  
&gt; +bool WebGLProgram::cacheActiveAttribLocations()
&gt; +{
&gt; +    if (!object())
&gt; +        return false;
&gt; +    GraphicsContext3D* context3d = context()-&gt;graphicsContext3D();
&gt; +    int linkStatus;
&gt; +    context3d-&gt;getProgramiv(this, GraphicsContext3D::LINK_STATUS, &amp;linkStatus);
&gt; +    if (!linkStatus)

Should call m_activeAttribLocations.clear() in this case.

&gt; Index: WebCore/html/canvas/WebGLProgram.h
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLProgram.h	(revision 57235)
&gt; +++ WebCore/html/canvas/WebGLProgram.h	(working copy)
&gt; @@ -30,6 +30,7 @@
&gt;  
&gt;  #include &lt;wtf/PassRefPtr.h&gt;
&gt;  #include &lt;wtf/RefCounted.h&gt;
&gt; +#include &lt;wtf/Vector.h&gt;
&gt;  
&gt;  namespace WebCore {
&gt;      
&gt; @@ -38,11 +39,22 @@ namespace WebCore {
&gt;          virtual ~WebGLProgram() { deleteObject(); }
&gt;          
&gt;          static PassRefPtr&lt;WebGLProgram&gt; create(WebGLRenderingContext*);
&gt; +
&gt; +        // cacheActiveAttribLocation() is only called once after linkProgram()
&gt; +        // succeeds.
&gt; +        bool cacheActiveAttribLocations();
&gt; +        // doesAttribLocationBelongToProgram only returns true when
&gt; +        // cacheActiveAttribLocations() already succeeded and attrib location
&gt; +        // actually belongs to the program.
&gt; +        bool doesAttribLocationBelongToProgram(unsigned location);

Instead of doesAttribLocationBelongToProgram, please add two APIs, int numActiveAttribLocations() and int getActiveAttribLocation(int).

&gt; Index: WebCore/html/canvas/WebGLRenderingContext.cpp
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLRenderingContext.cpp	(revision 57235)
&gt; +++ WebCore/html/canvas/WebGLRenderingContext.cpp	(working copy)
&gt; @@ -688,11 +688,14 @@ bool WebGLRenderingContext::validateInde
&gt;  
&gt;  bool WebGLRenderingContext::validateRenderingState(long numElementsRequired)
&gt;  {
&gt; +    if (!m_currentProgram)
&gt; +        return false;
&gt; +
&gt;      // Look in each enabled vertex attrib and find the smallest buffer size
&gt;      long smallestNumElements = LONG_MAX;
&gt;      for (unsigned i = 0; i &lt; m_vertexAttribState.size(); ++i) {
&gt;          const VertexAttribState&amp; state = m_vertexAttribState[i];
&gt; -        if (state.enabled &amp;&amp; state.numElements &lt; smallestNumElements)
&gt; +        if (state.enabled &amp;&amp; m_currentProgram-&gt;doesAttribLocationBelongToProgram(i) &amp;&amp; state.numElements &lt; smallestNumElements)
&gt;              smallestNumElements = state.numElements;
&gt;      }

Please rewrite this loop to iterate from 0..m_currentProgram-&gt;numActiveAttribLocations(). Even though the number of active attributes is likely to be small, this loop is O(n*m) where it should be O(m).

&gt; Index: LayoutTests/ChangeLog
&gt; ===================================================================
&gt; --- LayoutTests/ChangeLog	(revision 57240)
&gt; +++ LayoutTests/ChangeLog	(working copy)
&gt; @@ -1,3 +1,13 @@
&gt; +2010-04-07  Zhenyao Mo  &lt;zmo@google.com&gt;
&gt; +
&gt; +        Reviewed by NOBODY (OOPS!).
&gt; +
&gt; +        Index validation code validates too many vertex attributes
&gt; +        https://bugs.webkit.org/show_bug.cgi?id=31892
&gt; +
&gt; +        * fast/canvas/webgl/index-validation-expected.txt: Add new test cases for index validations.
&gt; +        * fast/canvas/webgl/script-tests/index-validation.js: Ditto.
&gt; +
&gt;  2010-04-07  Erik Arvidsson  &lt;arv@chromium.org&gt;
&gt;  
&gt;          Reviewed by Adam Barth.
&gt; Index: LayoutTests/fast/canvas/webgl/index-validation-expected.txt
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/index-validation-expected.txt	(revision 57235)
&gt; +++ LayoutTests/fast/canvas/webgl/index-validation-expected.txt	(working copy)
&gt; @@ -1,11 +1,30 @@
&gt; -Test of get calls against GL objects like getBufferParameter, etc.
&gt; +Test of validating indices for drawElements().
&gt;  
&gt;  On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
&gt;  
&gt; +Testing with valid indices
&gt;  PASS gl.checkFramebufferStatus(gl.FRAMEBUFFER) is gl.FRAMEBUFFER_COMPLETE
&gt;  PASS gl.getError() is 0
&gt;  PASS gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0) is undefined.
&gt;  PASS gl.getError() is 0
&gt; +Testing with out-of-range indices
&gt; +Enable vertices, valid
&gt; +PASS gl.getError() is 0
&gt; +PASS gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0) is undefined.
&gt; +PASS gl.getError() is 0
&gt; +Enable normals, out-of-range
&gt; +PASS gl.getError() is 0
&gt; +PASS gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0) is undefined.
&gt; +PASS gl.getError() is gl.INVALID_OPERATION
&gt; +Test with enabled attribute that does not belong to current program
&gt; +Enable an extra attribute with null
&gt; +PASS gl.getError() is 0
&gt; +PASS gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0) is undefined.
&gt; +PASS gl.getError() is 0
&gt; +Enable an extra attribute with inefficient data buffer
&gt; +PASS gl.getError() is 0
&gt; +PASS gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0) is undefined.
&gt; +PASS gl.getError() is 0
&gt;  PASS successfullyParsed is true
&gt;  
&gt;  TEST COMPLETE
&gt; Index: LayoutTests/fast/canvas/webgl/script-tests/index-validation.js
&gt; ===================================================================
&gt; --- LayoutTests/fast/canvas/webgl/script-tests/index-validation.js	(revision 57235)
&gt; +++ LayoutTests/fast/canvas/webgl/script-tests/index-validation.js	(working copy)
&gt; @@ -1,20 +1,27 @@
&gt; -description(&quot;Test of get calls against GL objects like getBufferParameter, etc.&quot;);
&gt; +description(&quot;Test of validating indices for drawElements().&quot;);
&gt;  
&gt;  var gl = create3DContext();
&gt;  var program = loadStandardProgram(gl);
&gt;  
&gt;  // 3 vertices =&gt; 1 triangle, interleaved data
&gt; -var data = new WebGLFloatArray([0, 0, 0, 1,
&gt; -                                0, 0, 1,
&gt; -                                1, 0, 0, 1,
&gt; -                                0, 0, 1,
&gt; -                                1, 1, 1, 1,
&gt; -                                0, 0, 1]);
&gt; +var dataComplete = new WebGLFloatArray([0, 0, 0, 1,
&gt; +                                        0, 0, 1,
&gt; +                                        1, 0, 0, 1,
&gt; +                                        0, 0, 1,
&gt; +                                        1, 1, 1, 1,
&gt; +                                        0, 0, 1]);
&gt; +var dataIncomplete = new WebGLFloatArray([0, 0, 0, 1,
&gt; +                                          0, 0, 1,
&gt; +                                          1, 0, 0, 1,
&gt; +                                          0, 0, 1,
&gt; +                                          1, 1, 1, 1]);
&gt;  var indices = new WebGLUnsignedShortArray([0, 1, 2]);
&gt;  
&gt; -var buffer = gl.createBuffer();
&gt; -gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
&gt; -gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW);
&gt; +debug(&quot;Testing with valid indices&quot;);
&gt; +
&gt; +var bufferComplete = gl.createBuffer();
&gt; +gl.bindBuffer(gl.ARRAY_BUFFER, bufferComplete);
&gt; +gl.bufferData(gl.ARRAY_BUFFER, dataComplete, gl.STATIC_DRAW);
&gt;  var elements = gl.createBuffer();
&gt;  gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elements);
&gt;  gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);
&gt; @@ -23,11 +30,45 @@ var vertexLoc = gl.getAttribLocation(pro
&gt;  var normalLoc = gl.getAttribLocation(program, &quot;a_normal&quot;);
&gt;  gl.vertexAttribPointer(vertexLoc, 4, gl.FLOAT, false, 7 * gl.sizeInBytes(gl.FLOAT), 0);
&gt;  gl.enableVertexAttribArray(vertexLoc);
&gt; -gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * gl.sizeInBytes(gl.FLOAT), 3 * gl.sizeInBytes(gl.FLOAT));
&gt; +gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * gl.sizeInBytes(gl.FLOAT), 4 * gl.sizeInBytes(gl.FLOAT));
&gt;  gl.enableVertexAttribArray(normalLoc);
&gt;  shouldBe(&apos;gl.checkFramebufferStatus(gl.FRAMEBUFFER)&apos;, &apos;gl.FRAMEBUFFER_COMPLETE&apos;);
&gt;  shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt;  shouldBeUndefined(&apos;gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)&apos;);
&gt;  shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt;  
&gt; +debug(&quot;Testing with out-of-range indices&quot;);
&gt; +
&gt; +var bufferIncomplete = gl.createBuffer();
&gt; +gl.bindBuffer(gl.ARRAY_BUFFER, bufferIncomplete);
&gt; +gl.bufferData(gl.ARRAY_BUFFER, dataIncomplete, gl.STATIC_DRAW);
&gt; +gl.vertexAttribPointer(vertexLoc, 4, gl.FLOAT, false, 7 * gl.sizeInBytes(gl.FLOAT), 0);
&gt; +gl.enableVertexAttribArray(vertexLoc);
&gt; +gl.disableVertexAttribArray(normalLoc);
&gt; +debug(&quot;Enable vertices, valid&quot;);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt; +shouldBeUndefined(&apos;gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)&apos;);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt; +debug(&quot;Enable normals, out-of-range&quot;);
&gt; +gl.vertexAttribPointer(normalLoc, 3, gl.FLOAT, false, 7 * gl.sizeInBytes(gl.FLOAT), 4 * gl.sizeInBytes(gl.FLOAT));
&gt; +gl.enableVertexAttribArray(normalLoc);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt; +shouldBeUndefined(&apos;gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)&apos;);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;gl.INVALID_OPERATION&apos;);
&gt; +
&gt; +debug(&quot;Test with enabled attribute that does not belong to current program&quot;);
&gt; +
&gt; +gl.disableVertexAttribArray(normalLoc);
&gt; +var extraLoc = Math.max(vertexLoc, normalLoc) + 1;
&gt; +gl.enableVertexAttribArray(extraLoc);
&gt; +debug(&quot;Enable an extra attribute with null&quot;);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt; +shouldBeUndefined(&apos;gl.drawElements(gl.TRIANGLES, 3, gl.UNSIGNED_SHORT, 0)&apos;);
&gt; +shouldBe(&apos;gl.getError()&apos;, &apos;0&apos;);
&gt; +debug(&quot;Enable an extra attribute with inefficient data buffer&quot;);

inefficient -&gt; insufficient.

New tests look good otherwise. Thanks for fixing the bug in the preexisting test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210011</commentid>
    <comment_count>7</comment_count>
      <attachid>52830</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 23:13:05 -0700</bug_when>
    <thetext>Created attachment 52830
revised patch : responding to Ken Russell&apos;s review</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210012</commentid>
    <comment_count>8</comment_count>
      <attachid>52831</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-07 23:16:13 -0700</bug_when>
    <thetext>Created attachment 52831
revised patch: fix the change log</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210292</commentid>
    <comment_count>9</comment_count>
      <attachid>52831</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-08 11:34:10 -0700</bug_when>
    <thetext>Comment on attachment 52831
revised patch: fix the change log

Looks good. One comment.

&gt; Index: WebCore/html/canvas/WebGLProgram.cpp
&gt; ===================================================================
&gt; --- WebCore/html/canvas/WebGLProgram.cpp	(revision 57240)
&gt; +++ WebCore/html/canvas/WebGLProgram.cpp	(working copy)
&gt; @@ -48,6 +48,41 @@ void WebGLProgram::_deleteObject(Platfor
&gt;      context()-&gt;graphicsContext3D()-&gt;deleteProgram(object);
&gt;  }
&gt;  
&gt; +bool WebGLProgram::cacheActiveAttribLocations()
&gt; +{
&gt; +    m_activeAttribLocations.clear();
&gt; +    if (!object())
&gt; +        return false;
&gt; +    GraphicsContext3D* context3d = context()-&gt;graphicsContext3D();
&gt; +    int linkStatus;
&gt; +    context3d-&gt;getProgramiv(this, GraphicsContext3D::LINK_STATUS, &amp;linkStatus);
&gt; +    if (!linkStatus)
&gt; +        return false;
&gt; +
&gt; +    int numAttribs = 0;
&gt; +    context3d-&gt;getProgramiv(this, GraphicsContext3D::ACTIVE_ATTRIBUTES, &amp;numAttribs);
&gt; +    m_activeAttribLocations.resize(static_cast&lt;size_t&gt;(numAttribs));
&gt; +    for (int i = 0; i &lt; numAttribs; ++i) {
&gt; +        ActiveInfo info;
&gt; +        context3d-&gt;getActiveAttrib(this, i, info);
&gt; +        m_activeAttribLocations[i] = context3d-&gt;getAttribLocation(this, info.name.charactersWithNullTermination());
&gt; +    }
&gt; +
&gt; +    return true;
&gt; +}
&gt; +
&gt; +int WebGLProgram::numActiveAttribLocations()
&gt; +{
&gt; +    return static_cast&lt;int&gt;(m_activeAttribLocations.size());
&gt; +}
&gt; +
&gt; +int WebGLProgram::getActiveAttribLocation(int index)
&gt; +{
&gt; +    if (index &lt; 0 || index &gt;= static_cast&lt;int&gt;(m_activeAttribLocations.size()))

This would be better written as
  if (index &lt; 0 || index &gt;= numActiveAttribLocations())</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210374</commentid>
    <comment_count>10</comment_count>
      <attachid>52895</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2010-04-08 14:08:48 -0700</bug_when>
    <thetext>Created attachment 52895
revised patch: minor modification as Ken Russell suggested</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>210379</commentid>
    <comment_count>11</comment_count>
      <attachid>52895</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-04-08 14:20:45 -0700</bug_when>
    <thetext>Comment on attachment 52895
revised patch: minor modification as Ken Russell suggested

Looks good to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>212978</commentid>
    <comment_count>12</comment_count>
      <attachid>52895</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-04-15 12:33:59 -0700</bug_when>
    <thetext>Comment on attachment 52895
revised patch: minor modification as Ken Russell suggested

rs=me given kbr approves.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213169</commentid>
    <comment_count>13</comment_count>
      <attachid>52895</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-15 19:01:44 -0700</bug_when>
    <thetext>Comment on attachment 52895
revised patch: minor modification as Ken Russell suggested

Clearing flags on attachment: 52895

Committed r57709: &lt;http://trac.webkit.org/changeset/57709&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>213170</commentid>
    <comment_count>14</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-04-15 19:01:51 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52797</attachid>
            <date>2010-04-07 16:19:49 -0700</date>
            <delta_ts>2010-04-07 16:25:17 -0700</delta_ts>
            <desc>patch</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>11484</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSk6IEEgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgbG9jYXRpb24g
YmVsb25nIHRvIGEgcHJvZ3JhbS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dyYW0u
aDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2FudmFz
L1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRvIHZh
bGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50
IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQ
cm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0LTA3
ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBB
ZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dl
YkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFBy
b2dyYW0uY3BwCShyZXZpc2lvbiA1NzIzNSkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQ
cm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsMzQgQEAgdm9pZCBXZWJHTFBy
b2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3JhbTo6
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIGlmIChvYmplY3QoKSA9PSAwKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQzZCA9
IGNvbnRleHQoKS0+Z3JhcGhpY3NDb250ZXh0M0QoKTsKKyAgICBpbnQgbGlua1N0YXR1czsKKyAg
ICBjb250ZXh0M2QtPmdldFByb2dyYW1pdih0aGlzLCBHcmFwaGljc0NvbnRleHQzRDo6TElOS19T
VEFUVVMsICZsaW5rU3RhdHVzKTsKKyAgICBpZiAoIWxpbmtTdGF0dXMpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGludCBudW1BdHRyaWJzID0gMDsKKyAgICBjb250ZXh0M2QtPmdldFBy
b2dyYW1pdih0aGlzLCBHcmFwaGljc0NvbnRleHQzRDo6QUNUSVZFX0FUVFJJQlVURVMsICZudW1B
dHRyaWJzKTsKKyAgICBtX2FjdGl2ZUF0dHJpYkxvY2F0aW9ucy5yZXNpemUoc3RhdGljX2Nhc3Q8
c2l6ZV90PihudW1BdHRyaWJzKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BdHRyaWJz
OyArK2kpIHsKKyAgICAgICAgQWN0aXZlSW5mbyBpbmZvOworICAgICAgICBjb250ZXh0M2QtPmdl
dEFjdGl2ZUF0dHJpYih0aGlzLCBpLCBpbmZvKTsKKyAgICAgICAgbV9hY3RpdmVBdHRyaWJMb2Nh
dGlvbnNbaV0gPSBjb250ZXh0M2QtPmdldEF0dHJpYkxvY2F0aW9uKHRoaXMsIGluZm8ubmFtZS5j
aGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSh1bnNpZ25lZCBsb2NhdGlvbikKK3sKKyAgICBpbnQgbG9jID0gc3RhdGljX2Nhc3Q8aW50
Pihsb2NhdGlvbik7CisgICAgcmV0dXJuIChtX2FjdGl2ZUF0dHJpYkxvY2F0aW9ucy5maW5kKGxv
YykgIT0gV1RGOjpub3RGb3VuZCk7Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRSgzRF9DQU5W
QVMpCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmgJKHJldmlzaW9uIDU3MjM1KQor
KysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0uaAkod29ya2luZyBjb3B5KQpAQCAt
MzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgIApAQCAtMzgsMTEgKzM5LDIyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgdmlydHVhbCB+V2ViR0xQcm9ncmFtKCkgeyBkZWxldGVPYmplY3QoKTsgfQogICAgICAg
ICAKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8V2ViR0xQcm9ncmFtPiBjcmVhdGUoV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Kik7CisKKyAgICAgICAgLy8gY2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlv
bigpIGlzIG9ubHkgY2FsbGVkIG9uY2UgYWZ0ZXIgbGlua1Byb2dyYW0oKQorICAgICAgICAvLyBz
dWNjZWVkcy4KKyAgICAgICAgYm9vbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOworICAg
ICAgICAvLyBkb2VzQXR0cmliTG9jYXRpb25CZWxvbmdUb1Byb2dyYW0gb25seSByZXR1cm5zIHRy
dWUgd2hlbgorICAgICAgICAvLyBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpIGFscmVhZHkg
c3VjY2VlZGVkIGFuZCBhdHRyaWIgbG9jYXRpb24KKyAgICAgICAgLy8gYWN0dWFsbHkgYmVsb25n
cyB0byB0aGUgcHJvZ3JhbS4KKyAgICAgICAgYm9vbCBkb2VzQXR0cmliTG9jYXRpb25CZWxvbmdU
b1Byb2dyYW0odW5zaWduZWQgbG9jYXRpb24pOwogICAgICAgICAKICAgICBwcm90ZWN0ZWQ6CiAg
ICAgICAgIFdlYkdMUHJvZ3JhbShXZWJHTFJlbmRlcmluZ0NvbnRleHQqKTsKICAgICAgICAgCiAg
ICAgICAgIHZpcnR1YWwgdm9pZCBfZGVsZXRlT2JqZWN0KFBsYXRmb3JtM0RPYmplY3QpOworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPGludD4gbV9hY3RpdmVBdHRyaWJMb2NhdGlvbnM7
CiAgICAgfTsKICAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvaHRt
bC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDU3MjM1KQor
KysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC02ODgsMTEgKzY4OCwxNCBAQCBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6
dmFsaWRhdGVJbmRlCiAKIGJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRl
cmluZ1N0YXRlKGxvbmcgbnVtRWxlbWVudHNSZXF1aXJlZCkKIHsKKyAgICBpZiAoIW1fY3VycmVu
dFByb2dyYW0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIC8vIExvb2sgaW4gZWFjaCBl
bmFibGVkIHZlcnRleCBhdHRyaWIgYW5kIGZpbmQgdGhlIHNtYWxsZXN0IGJ1ZmZlciBzaXplCiAg
ICAgbG9uZyBzbWFsbGVzdE51bUVsZW1lbnRzID0gTE9OR19NQVg7CiAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fdmVydGV4QXR0cmliU3RhdGUuc2l6ZSgpOyArK2kpIHsKICAgICAgICAg
Y29uc3QgVmVydGV4QXR0cmliU3RhdGUmIHN0YXRlID0gbV92ZXJ0ZXhBdHRyaWJTdGF0ZVtpXTsK
LSAgICAgICAgaWYgKHN0YXRlLmVuYWJsZWQgJiYgc3RhdGUubnVtRWxlbWVudHMgPCBzbWFsbGVz
dE51bUVsZW1lbnRzKQorICAgICAgICBpZiAoc3RhdGUuZW5hYmxlZCAmJiBtX2N1cnJlbnRQcm9n
cmFtLT5kb2VzQXR0cmliTG9jYXRpb25CZWxvbmdUb1Byb2dyYW0oaSkgJiYgc3RhdGUubnVtRWxl
bWVudHMgPCBzbWFsbGVzdE51bUVsZW1lbnRzKQogICAgICAgICAgICAgc21hbGxlc3ROdW1FbGVt
ZW50cyA9IHN0YXRlLm51bUVsZW1lbnRzOwogICAgIH0KICAgICAKQEAgLTE1NjgsNiArMTU3MSw3
IEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpsaW5rUHJvZ3JhbSgKICAgICB9CiAgICAg
ICAgIAogICAgIG1fY29udGV4dC0+bGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgcHJvZ3JhbS0+
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKTsKICAgICBjbGVhbnVwQWZ0ZXJHcmFwaGljc0Nh
bGwoZmFsc2UpOwogfQogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NzI0MCkKKysrIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDEwLTA0LTA3ICBa
aGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgSW5kZXggdmFsaWRhdGlvbiBjb2RlIHZhbGlkYXRlcyB0b28g
bWFueSB2ZXJ0ZXggYXR0cmlidXRlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MzE4OTIKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2luZGV4
LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0OiBBZGQgbmV3IHRlc3QgY2FzZXMgZm9yIGluZGV4IHZh
bGlkYXRpb25zLgorICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRl
eC12YWxpZGF0aW9uLmpzOiBEaXR0by4KKwogMjAxMC0wNC0wNyAgRXJpayBBcnZpZHNzb24gIDxh
cnZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4
OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9pbmRleC12YWxpZGF0aW9uLWV4cGVjdGVk
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9pbmRleC12
YWxpZGF0aW9uLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gNTcyMzUpCisrKyBMYXlvdXRUZXN0cy9m
YXN0L2NhbnZhcy93ZWJnbC9pbmRleC12YWxpZGF0aW9uLWV4cGVjdGVkLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtMSwxMSArMSwzMCBAQAotVGVzdCBvZiBnZXQgY2FsbHMgYWdhaW5zdCBHTCBvYmpl
Y3RzIGxpa2UgZ2V0QnVmZmVyUGFyYW1ldGVyLCBldGMuCitUZXN0IG9mIGludmFsaWRhdGluZyBp
bmRpY2VzIGZvciBkcmF3RWxlbWVudHMoKS4KIAogT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEg
c2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgog
CitUZXN0aW5nIHdpdGggdmFsaWQgaW5kaWNlcwogUEFTUyBnbC5jaGVja0ZyYW1lYnVmZmVyU3Rh
dHVzKGdsLkZSQU1FQlVGRkVSKSBpcyBnbC5GUkFNRUJVRkZFUl9DT01QTEVURQogUEFTUyBnbC5n
ZXRFcnJvcigpIGlzIDAKIFBBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wu
VU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KIFBBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAw
CitUZXN0aW5nIHdpdGggb3V0LW9mLXJhbmdlIGluZGljZXMKK0VuYWJsZSB2ZXJ0aWNlcywgdmFs
aWQKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRyYXdFbGVtZW50cyhnbC5UUklB
TkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCitQQVNTIGdsLmdl
dEVycm9yKCkgaXMgMAorRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1yYW5nZQorUEFTUyBnbC5nZXRF
cnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5T
SUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyBnbC5J
TlZBTElEX09QRVJBVElPTgorVGVzdCB3aXRoIGVuYWJsZWQgYXR0cmlidXRlIHRoYXQgZG9lcyBu
b3QgYmVsb25nIHRvIGN1cnJlbnQgcHJvZ3JhbQorRW5hYmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3
aXRoIG51bGwKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRyYXdFbGVtZW50cyhn
bC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCitQQVNT
IGdsLmdldEVycm9yKCkgaXMgMAorRW5hYmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIGluZWZm
aWNpZW50IGRhdGEgYnVmZmVyCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorUEFTUyBnbC5kcmF3
RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCkgaXMgdW5kZWZp
bmVkLgorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlz
IHRydWUKIAogVEVTVCBDT01QTEVURQpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2Vi
Z2wvc2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0
VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMJ
KHJldmlzaW9uIDU3MjM1KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0
LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTEsMjAgKzEsMjcg
QEAKLWRlc2NyaXB0aW9uKCJUZXN0IG9mIGdldCBjYWxscyBhZ2FpbnN0IEdMIG9iamVjdHMgbGlr
ZSBnZXRCdWZmZXJQYXJhbWV0ZXIsIGV0Yy4iKTsKK2Rlc2NyaXB0aW9uKCJUZXN0IG9mIGludmFs
aWRhdGluZyBpbmRpY2VzIGZvciBkcmF3RWxlbWVudHMoKS4iKTsKIAogdmFyIGdsID0gY3JlYXRl
M0RDb250ZXh0KCk7CiB2YXIgcHJvZ3JhbSA9IGxvYWRTdGFuZGFyZFByb2dyYW0oZ2wpOwogCiAv
LyAzIHZlcnRpY2VzID0+IDEgdHJpYW5nbGUsIGludGVybGVhdmVkIGRhdGEKLXZhciBkYXRhID0g
bmV3IFdlYkdMRmxvYXRBcnJheShbMCwgMCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgMCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwg
MCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgMCwgMCwgMV0pOwordmFyIGRhdGFDb21wbGV0ZSA9IG5ldyBXZWJHTEZsb2F0
QXJyYXkoWzAsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAw
LCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEs
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxXSk7Cit2YXIgZGF0
YUluY29tcGxldGUgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFswLCAwLCAwLCAxLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMV0pOwogdmFyIGluZGljZXMgPSBuZXcgV2Vi
R0xVbnNpZ25lZFNob3J0QXJyYXkoWzAsIDEsIDJdKTsKIAotdmFyIGJ1ZmZlciA9IGdsLmNyZWF0
ZUJ1ZmZlcigpOwotZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcik7Ci1nbC5i
dWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpOworZGVidWco
IlRlc3Rpbmcgd2l0aCB2YWxpZCBpbmRpY2VzIik7CisKK3ZhciBidWZmZXJDb21wbGV0ZSA9IGds
LmNyZWF0ZUJ1ZmZlcigpOworZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlckNv
bXBsZXRlKTsKK2dsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhQ29tcGxldGUsIGds
LlNUQVRJQ19EUkFXKTsKIHZhciBlbGVtZW50cyA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwogZ2wuYmlu
ZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZWxlbWVudHMpOwogZ2wuYnVmZmVyRGF0
YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgaW5kaWNlcywgZ2wuU1RBVElDX0RSQVcpOwpAQCAt
MjMsMTEgKzMwLDQ1IEBAIHZhciB2ZXJ0ZXhMb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm8K
IHZhciBub3JtYWxMb2MgPSBnbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCAiYV9ub3JtYWwi
KTsKIGdsLnZlcnRleEF0dHJpYlBvaW50ZXIodmVydGV4TG9jLCA0LCBnbC5GTE9BVCwgZmFsc2Us
IDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDApOwogZ2wuZW5hYmxlVmVydGV4QXR0cmli
QXJyYXkodmVydGV4TG9jKTsKLWdsLnZlcnRleEF0dHJpYlBvaW50ZXIobm9ybWFsTG9jLCAzLCBn
bC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDMgKiBnbC5zaXpl
SW5CeXRlcyhnbC5GTE9BVCkpOworZ2wudmVydGV4QXR0cmliUG9pbnRlcihub3JtYWxMb2MsIDMs
IGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgNCAqIGdsLnNp
emVJbkJ5dGVzKGdsLkZMT0FUKSk7CiBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShub3JtYWxM
b2MpOwogc2hvdWxkQmUoJ2dsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIp
JywgJ2dsLkZSQU1FQlVGRkVSX0NPTVBMRVRFJyk7CiBzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScs
ICcwJyk7CiBzaG91bGRCZVVuZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywg
MywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7CiBzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcw
Jyk7CiAKK2RlYnVnKCJUZXN0aW5nIHdpdGggb3V0LW9mLXJhbmdlIGluZGljZXMiKTsKKwordmFy
IGJ1ZmZlckluY29tcGxldGUgPSBnbC5jcmVhdGVCdWZmZXIoKTsKK2dsLmJpbmRCdWZmZXIoZ2wu
QVJSQVlfQlVGRkVSLCBidWZmZXJJbmNvbXBsZXRlKTsKK2dsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlf
QlVGRkVSLCBkYXRhSW5jb21wbGV0ZSwgZ2wuU1RBVElDX0RSQVcpOworZ2wudmVydGV4QXR0cmli
UG9pbnRlcih2ZXJ0ZXhMb2MsIDQsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVz
KGdsLkZMT0FUKSwgMCk7CitnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh2ZXJ0ZXhMb2MpOwor
Z2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KG5vcm1hbExvYyk7CitkZWJ1ZygiRW5hYmxlIHZl
cnRpY2VzLCB2YWxpZCIpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworc2hvdWxk
QmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVE
X1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworZGVidWcoIkVu
YWJsZSBub3JtYWxzLCBvdXQtb2YtcmFuZ2UiKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50ZXIobm9y
bWFsTG9jLCAzLCBnbC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCks
IDQgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCkpOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJy
YXkobm9ybWFsTG9jKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKK3Nob3VsZEJl
VW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9T
SE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJ2dsLklOVkFMSURfT1BFUkFU
SU9OJyk7CisKK2RlYnVnKCJUZXN0IHdpdGggZW5hYmxlZCBhdHRyaWJ1dGUgdGhhdCBkb2VzIG5v
dCBiZWxvbmcgdG8gY3VycmVudCBwcm9ncmFtIik7CisKK2dsLmRpc2FibGVWZXJ0ZXhBdHRyaWJB
cnJheShub3JtYWxMb2MpOwordmFyIGV4dHJhTG9jID0gTWF0aC5tYXgodmVydGV4TG9jLCBub3Jt
YWxMb2MpICsgMTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGV4dHJhTG9jKTsKK2RlYnVn
KCJFbmFibGUgYW4gZXh0cmEgYXR0cmlidXRlIHdpdGggbnVsbCIpOworc2hvdWxkQmUoJ2dsLmdl
dEVycm9yKCknLCAnMCcpOworc2hvdWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5U
UklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVy
cm9yKCknLCAnMCcpOworZGVidWcoIkVuYWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0aCBpbmVm
ZmljaWVudCBkYXRhIGJ1ZmZlciIpOworZ2wudmVydGV4QXR0cmliUG9pbnRlcihleHRyYUxvYywg
MywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCA0ICogZ2wu
c2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsK
K3Nob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5V
TlNJR05FRF9TSE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKKwog
c3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52798</attachid>
            <date>2010-04-07 16:25:17 -0700</date>
            <delta_ts>2010-04-07 16:31:37 -0700</delta_ts>
            <desc>revised patch: fix a typo</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>11480</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSk6IEEgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgbG9jYXRpb24g
YmVsb25nIHRvIGEgcHJvZ3JhbS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dyYW0u
aDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2FudmFz
L1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRvIHZh
bGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50
IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQ
cm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0LTA3
ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBB
ZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dl
YkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFBy
b2dyYW0uY3BwCShyZXZpc2lvbiA1NzIzNSkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQ
cm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsMzQgQEAgdm9pZCBXZWJHTFBy
b2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3JhbTo6
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIGlmIChvYmplY3QoKSA9PSAwKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQzZCA9
IGNvbnRleHQoKS0+Z3JhcGhpY3NDb250ZXh0M0QoKTsKKyAgICBpbnQgbGlua1N0YXR1czsKKyAg
ICBjb250ZXh0M2QtPmdldFByb2dyYW1pdih0aGlzLCBHcmFwaGljc0NvbnRleHQzRDo6TElOS19T
VEFUVVMsICZsaW5rU3RhdHVzKTsKKyAgICBpZiAoIWxpbmtTdGF0dXMpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIGludCBudW1BdHRyaWJzID0gMDsKKyAgICBjb250ZXh0M2QtPmdldFBy
b2dyYW1pdih0aGlzLCBHcmFwaGljc0NvbnRleHQzRDo6QUNUSVZFX0FUVFJJQlVURVMsICZudW1B
dHRyaWJzKTsKKyAgICBtX2FjdGl2ZUF0dHJpYkxvY2F0aW9ucy5yZXNpemUoc3RhdGljX2Nhc3Q8
c2l6ZV90PihudW1BdHRyaWJzKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1BdHRyaWJz
OyArK2kpIHsKKyAgICAgICAgQWN0aXZlSW5mbyBpbmZvOworICAgICAgICBjb250ZXh0M2QtPmdl
dEFjdGl2ZUF0dHJpYih0aGlzLCBpLCBpbmZvKTsKKyAgICAgICAgbV9hY3RpdmVBdHRyaWJMb2Nh
dGlvbnNbaV0gPSBjb250ZXh0M2QtPmdldEF0dHJpYkxvY2F0aW9uKHRoaXMsIGluZm8ubmFtZS5j
aGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworYm9vbCBXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSh1bnNpZ25lZCBsb2NhdGlvbikKK3sKKyAgICBpbnQgbG9jID0gc3RhdGljX2Nhc3Q8aW50
Pihsb2NhdGlvbik7CisgICAgcmV0dXJuIChtX2FjdGl2ZUF0dHJpYkxvY2F0aW9ucy5maW5kKGxv
YykgIT0gV1RGOjpub3RGb3VuZCk7Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRSgzRF9DQU5W
QVMpCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmgJKHJldmlzaW9uIDU3MjM1KQor
KysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0uaAkod29ya2luZyBjb3B5KQpAQCAt
MzAsNiArMzAsNyBAQAogCiAjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KICNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KIAogbmFtZXNwYWNlIFdl
YkNvcmUgewogICAgIApAQCAtMzgsMTEgKzM5LDIyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgdmlydHVhbCB+V2ViR0xQcm9ncmFtKCkgeyBkZWxldGVPYmplY3QoKTsgfQogICAgICAg
ICAKICAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8V2ViR0xQcm9ncmFtPiBjcmVhdGUoV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Kik7CisKKyAgICAgICAgLy8gY2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlv
bigpIGlzIG9ubHkgY2FsbGVkIG9uY2UgYWZ0ZXIgbGlua1Byb2dyYW0oKQorICAgICAgICAvLyBz
dWNjZWVkcy4KKyAgICAgICAgYm9vbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOworICAg
ICAgICAvLyBkb2VzQXR0cmliTG9jYXRpb25CZWxvbmdUb1Byb2dyYW0gb25seSByZXR1cm5zIHRy
dWUgd2hlbgorICAgICAgICAvLyBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpIGFscmVhZHkg
c3VjY2VlZGVkIGFuZCBhdHRyaWIgbG9jYXRpb24KKyAgICAgICAgLy8gYWN0dWFsbHkgYmVsb25n
cyB0byB0aGUgcHJvZ3JhbS4KKyAgICAgICAgYm9vbCBkb2VzQXR0cmliTG9jYXRpb25CZWxvbmdU
b1Byb2dyYW0odW5zaWduZWQgbG9jYXRpb24pOwogICAgICAgICAKICAgICBwcm90ZWN0ZWQ6CiAg
ICAgICAgIFdlYkdMUHJvZ3JhbShXZWJHTFJlbmRlcmluZ0NvbnRleHQqKTsKICAgICAgICAgCiAg
ICAgICAgIHZpcnR1YWwgdm9pZCBfZGVsZXRlT2JqZWN0KFBsYXRmb3JtM0RPYmplY3QpOworCisg
ICAgcHJpdmF0ZToKKyAgICAgICAgVmVjdG9yPGludD4gbV9hY3RpdmVBdHRyaWJMb2NhdGlvbnM7
CiAgICAgfTsKICAgICAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvaHRt
bC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDU3MjM1KQor
KysgV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC02ODgsMTEgKzY4OCwxNCBAQCBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6
dmFsaWRhdGVJbmRlCiAKIGJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZVJlbmRl
cmluZ1N0YXRlKGxvbmcgbnVtRWxlbWVudHNSZXF1aXJlZCkKIHsKKyAgICBpZiAoIW1fY3VycmVu
dFByb2dyYW0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIC8vIExvb2sgaW4gZWFjaCBl
bmFibGVkIHZlcnRleCBhdHRyaWIgYW5kIGZpbmQgdGhlIHNtYWxsZXN0IGJ1ZmZlciBzaXplCiAg
ICAgbG9uZyBzbWFsbGVzdE51bUVsZW1lbnRzID0gTE9OR19NQVg7CiAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1fdmVydGV4QXR0cmliU3RhdGUuc2l6ZSgpOyArK2kpIHsKICAgICAgICAg
Y29uc3QgVmVydGV4QXR0cmliU3RhdGUmIHN0YXRlID0gbV92ZXJ0ZXhBdHRyaWJTdGF0ZVtpXTsK
LSAgICAgICAgaWYgKHN0YXRlLmVuYWJsZWQgJiYgc3RhdGUubnVtRWxlbWVudHMgPCBzbWFsbGVz
dE51bUVsZW1lbnRzKQorICAgICAgICBpZiAoc3RhdGUuZW5hYmxlZCAmJiBtX2N1cnJlbnRQcm9n
cmFtLT5kb2VzQXR0cmliTG9jYXRpb25CZWxvbmdUb1Byb2dyYW0oaSkgJiYgc3RhdGUubnVtRWxl
bWVudHMgPCBzbWFsbGVzdE51bUVsZW1lbnRzKQogICAgICAgICAgICAgc21hbGxlc3ROdW1FbGVt
ZW50cyA9IHN0YXRlLm51bUVsZW1lbnRzOwogICAgIH0KICAgICAKQEAgLTE1NjgsNiArMTU3MSw3
IEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpsaW5rUHJvZ3JhbSgKICAgICB9CiAgICAg
ICAgIAogICAgIG1fY29udGV4dC0+bGlua1Byb2dyYW0ocHJvZ3JhbSk7CisgICAgcHJvZ3JhbS0+
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKTsKICAgICBjbGVhbnVwQWZ0ZXJHcmFwaGljc0Nh
bGwoZmFsc2UpOwogfQogCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiA1NzI0MCkKKysrIExheW91dFRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEzIEBACisyMDEwLTA0LTA3ICBa
aGVueWFvIE1vICA8em1vQGdvb2dsZS5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgSW5kZXggdmFsaWRhdGlvbiBjb2RlIHZhbGlkYXRlcyB0b28g
bWFueSB2ZXJ0ZXggYXR0cmlidXRlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MzE4OTIKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2luZGV4
LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0OiBBZGQgbmV3IHRlc3QgY2FzZXMgZm9yIGluZGV4IHZh
bGlkYXRpb25zLgorICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRl
eC12YWxpZGF0aW9uLmpzOiBEaXR0by4KKwogMjAxMC0wNC0wNyAgRXJpayBBcnZpZHNzb24gIDxh
cnZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCkluZGV4
OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9pbmRleC12YWxpZGF0aW9uLWV4cGVjdGVk
LnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9pbmRleC12
YWxpZGF0aW9uLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gNTcyMzUpCisrKyBMYXlvdXRUZXN0cy9m
YXN0L2NhbnZhcy93ZWJnbC9pbmRleC12YWxpZGF0aW9uLWV4cGVjdGVkLnR4dAkod29ya2luZyBj
b3B5KQpAQCAtMSwxMSArMSwzMCBAQAotVGVzdCBvZiBnZXQgY2FsbHMgYWdhaW5zdCBHTCBvYmpl
Y3RzIGxpa2UgZ2V0QnVmZmVyUGFyYW1ldGVyLCBldGMuCitUZXN0IG9mIHZhbGlkYXRpbmcgaW5k
aWNlcyBmb3IgZHJhd0VsZW1lbnRzKCkuCiAKIE9uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNl
cmllcyBvZiAiUEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KIAor
VGVzdGluZyB3aXRoIHZhbGlkIGluZGljZXMKIFBBU1MgZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1
cyhnbC5GUkFNRUJVRkZFUikgaXMgZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUKIFBBU1MgZ2wuZ2V0
RXJyb3IoKSBpcyAwCiBQQVNTIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVO
U0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCiBQQVNTIGdsLmdldEVycm9yKCkgaXMgMAor
VGVzdGluZyB3aXRoIG91dC1vZi1yYW5nZSBpbmRpY2VzCitFbmFibGUgdmVydGljZXMsIHZhbGlk
CitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorUEFTUyBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5H
TEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVkLgorUEFTUyBnbC5nZXRF
cnJvcigpIGlzIDAKK0VuYWJsZSBub3JtYWxzLCBvdXQtb2YtcmFuZ2UKK1BBU1MgZ2wuZ2V0RXJy
b3IoKSBpcyAwCitQQVNTIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lH
TkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCitQQVNTIGdsLmdldEVycm9yKCkgaXMgZ2wuSU5W
QUxJRF9PUEVSQVRJT04KK1Rlc3Qgd2l0aCBlbmFibGVkIGF0dHJpYnV0ZSB0aGF0IGRvZXMgbm90
IGJlbG9uZyB0byBjdXJyZW50IHByb2dyYW0KK0VuYWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0
aCBudWxsCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorUEFTUyBnbC5kcmF3RWxlbWVudHMoZ2wu
VFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVkLgorUEFTUyBn
bC5nZXRFcnJvcigpIGlzIDAKK0VuYWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0aCBpbmVmZmlj
aWVudCBkYXRhIGJ1ZmZlcgorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0Vs
ZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5l
ZC4KK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCiBQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0
cnVlCiAKIFRFU1QgQ09NUExFVEUKSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmds
L3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCShy
ZXZpc2lvbiA1NzIzNSkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10
ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0xLDIwICsxLDI3IEBA
Ci1kZXNjcmlwdGlvbigiVGVzdCBvZiBnZXQgY2FsbHMgYWdhaW5zdCBHTCBvYmplY3RzIGxpa2Ug
Z2V0QnVmZmVyUGFyYW1ldGVyLCBldGMuIik7CitkZXNjcmlwdGlvbigiVGVzdCBvZiB2YWxpZGF0
aW5nIGluZGljZXMgZm9yIGRyYXdFbGVtZW50cygpLiIpOwogCiB2YXIgZ2wgPSBjcmVhdGUzRENv
bnRleHQoKTsKIHZhciBwcm9ncmFtID0gbG9hZFN0YW5kYXJkUHJvZ3JhbShnbCk7CiAKIC8vIDMg
dmVydGljZXMgPT4gMSB0cmlhbmdsZSwgaW50ZXJsZWF2ZWQgZGF0YQotdmFyIGRhdGEgPSBuZXcg
V2ViR0xGbG9hdEFycmF5KFswLCAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwLCAx
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAwLCAwLCAxXSk7Cit2YXIgZGF0YUNvbXBsZXRlID0gbmV3IFdlYkdMRmxvYXRBcnJh
eShbMCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw
LCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDAs
IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDFdKTsKK3ZhciBkYXRhSW5j
b21wbGV0ZSA9IG5ldyBXZWJHTEZsb2F0QXJyYXkoWzAsIDAsIDAsIDEsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxXSk7CiB2YXIgaW5kaWNlcyA9IG5ldyBXZWJHTFVu
c2lnbmVkU2hvcnRBcnJheShbMCwgMSwgMl0pOwogCi12YXIgYnVmZmVyID0gZ2wuY3JlYXRlQnVm
ZmVyKCk7Ci1nbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyKTsKLWdsLmJ1ZmZl
ckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNfRFJBVyk7CitkZWJ1ZygiVGVz
dGluZyB3aXRoIHZhbGlkIGluZGljZXMiKTsKKwordmFyIGJ1ZmZlckNvbXBsZXRlID0gZ2wuY3Jl
YXRlQnVmZmVyKCk7CitnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmZmVyQ29tcGxl
dGUpOworZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGRhdGFDb21wbGV0ZSwgZ2wuU1RB
VElDX0RSQVcpOwogdmFyIGVsZW1lbnRzID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiBnbC5iaW5kQnVm
ZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50cyk7CiBnbC5idWZmZXJEYXRhKGds
LkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzLCBnbC5TVEFUSUNfRFJBVyk7CkBAIC0yMywx
MSArMzAsNDUgQEAgdmFyIHZlcnRleExvYyA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHBybwogdmFy
IG5vcm1hbExvYyA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sICJhX25vcm1hbCIpOwog
Z2wudmVydGV4QXR0cmliUG9pbnRlcih2ZXJ0ZXhMb2MsIDQsIGdsLkZMT0FULCBmYWxzZSwgNyAq
IGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgMCk7CiBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJh
eSh2ZXJ0ZXhMb2MpOwotZ2wudmVydGV4QXR0cmliUG9pbnRlcihub3JtYWxMb2MsIDMsIGdsLkZM
T0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgMyAqIGdsLnNpemVJbkJ5
dGVzKGdsLkZMT0FUKSk7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG5vcm1hbExvYywgMywgZ2wu
RkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCA0ICogZ2wuc2l6ZUlu
Qnl0ZXMoZ2wuRkxPQVQpKTsKIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG5vcm1hbExvYyk7
CiBzaG91bGRCZSgnZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUiknLCAn
Z2wuRlJBTUVCVUZGRVJfQ09NUExFVEUnKTsKIHNob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAn
KTsKIHNob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBn
bC5VTlNJR05FRF9TSE9SVCwgMCknKTsKIHNob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsK
IAorZGVidWcoIlRlc3Rpbmcgd2l0aCBvdXQtb2YtcmFuZ2UgaW5kaWNlcyIpOworCit2YXIgYnVm
ZmVySW5jb21wbGV0ZSA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworZ2wuYmluZEJ1ZmZlcihnbC5BUlJB
WV9CVUZGRVIsIGJ1ZmZlckluY29tcGxldGUpOworZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZG
RVIsIGRhdGFJbmNvbXBsZXRlLCBnbC5TVEFUSUNfRFJBVyk7CitnbC52ZXJ0ZXhBdHRyaWJQb2lu
dGVyKHZlcnRleExvYywgNCwgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wu
RkxPQVQpLCAwKTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHZlcnRleExvYyk7CitnbC5k
aXNhYmxlVmVydGV4QXR0cmliQXJyYXkobm9ybWFsTG9jKTsKK2RlYnVnKCJFbmFibGUgdmVydGlj
ZXMsIHZhbGlkIik7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRCZVVu
ZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hP
UlQsIDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitkZWJ1ZygiRW5hYmxl
IG5vcm1hbHMsIG91dC1vZi1yYW5nZSIpOworZ2wudmVydGV4QXR0cmliUG9pbnRlcihub3JtYWxM
b2MsIDMsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgNCAq
IGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSk7CitnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShu
b3JtYWxMb2MpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworc2hvdWxkQmVVbmRl
ZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JU
LCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnZ2wuSU5WQUxJRF9PUEVSQVRJT04n
KTsKKworZGVidWcoIlRlc3Qgd2l0aCBlbmFibGVkIGF0dHJpYnV0ZSB0aGF0IGRvZXMgbm90IGJl
bG9uZyB0byBjdXJyZW50IHByb2dyYW0iKTsKKworZ2wuZGlzYWJsZVZlcnRleEF0dHJpYkFycmF5
KG5vcm1hbExvYyk7Cit2YXIgZXh0cmFMb2MgPSBNYXRoLm1heCh2ZXJ0ZXhMb2MsIG5vcm1hbExv
YykgKyAxOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZXh0cmFMb2MpOworZGVidWcoIkVu
YWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0aCBudWxsIik7CitzaG91bGRCZSgnZ2wuZ2V0RXJy
b3IoKScsICcwJyk7CitzaG91bGRCZVVuZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFO
R0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3Io
KScsICcwJyk7CitkZWJ1ZygiRW5hYmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIGluZWZmaWNp
ZW50IGRhdGEgYnVmZmVyIik7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGV4dHJhTG9jLCAzLCBn
bC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDQgKiBnbC5zaXpl
SW5CeXRlcyhnbC5GTE9BVCkpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworc2hv
dWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lH
TkVEX1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworCiBzdWNj
ZXNzZnVsbHlQYXJzZWQgPSB0cnVlOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52800</attachid>
            <date>2010-04-07 16:31:37 -0700</date>
            <delta_ts>2010-04-07 23:13:05 -0700</delta_ts>
            <desc>revised patch: fix a style issue</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>11476</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSk6IEEgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgbG9jYXRpb24g
YmVsb25nIHRvIGEgcHJvZ3JhbS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dyYW0u
aDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2FudmFz
L1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRvIHZh
bGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50
IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQ
cm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0LTA3
ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBB
ZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dl
YkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFBy
b2dyYW0uY3BwCShyZXZpc2lvbiA1NzIzNSkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQ
cm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsMzQgQEAgdm9pZCBXZWJHTFBy
b2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3JhbTo6
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIGlmICghb2JqZWN0KCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICBHcmFwaGljc0NvbnRleHQzRCogY29udGV4dDNkID0gY29u
dGV4dCgpLT5ncmFwaGljc0NvbnRleHQzRCgpOworICAgIGludCBsaW5rU3RhdHVzOworICAgIGNv
bnRleHQzZC0+Z2V0UHJvZ3JhbWl2KHRoaXMsIEdyYXBoaWNzQ29udGV4dDNEOjpMSU5LX1NUQVRV
UywgJmxpbmtTdGF0dXMpOworICAgIGlmICghbGlua1N0YXR1cykKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaW50IG51bUF0dHJpYnMgPSAwOworICAgIGNvbnRleHQzZC0+Z2V0UHJvZ3Jh
bWl2KHRoaXMsIEdyYXBoaWNzQ29udGV4dDNEOjpBQ1RJVkVfQVRUUklCVVRFUywgJm51bUF0dHJp
YnMpOworICAgIG1fYWN0aXZlQXR0cmliTG9jYXRpb25zLnJlc2l6ZShzdGF0aWNfY2FzdDxzaXpl
X3Q+KG51bUF0dHJpYnMpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUF0dHJpYnM7ICsr
aSkgeworICAgICAgICBBY3RpdmVJbmZvIGluZm87CisgICAgICAgIGNvbnRleHQzZC0+Z2V0QWN0
aXZlQXR0cmliKHRoaXMsIGksIGluZm8pOworICAgICAgICBtX2FjdGl2ZUF0dHJpYkxvY2F0aW9u
c1tpXSA9IGNvbnRleHQzZC0+Z2V0QXR0cmliTG9jYXRpb24odGhpcywgaW5mby5uYW1lLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOwor
fQorCitib29sIFdlYkdMUHJvZ3JhbTo6ZG9lc0F0dHJpYkxvY2F0aW9uQmVsb25nVG9Qcm9ncmFt
KHVuc2lnbmVkIGxvY2F0aW9uKQoreworICAgIGludCBsb2MgPSBzdGF0aWNfY2FzdDxpbnQ+KGxv
Y2F0aW9uKTsKKyAgICByZXR1cm4gKG1fYWN0aXZlQXR0cmliTG9jYXRpb25zLmZpbmQobG9jKSAh
PSBXVEY6Om5vdEZvdW5kKTsKK30KKwogfQogCiAjZW5kaWYgLy8gRU5BQkxFKDNEX0NBTlZBUykK
SW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0uaAkocmV2aXNpb24gNTcyMzUpCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2
ICszMCw3IEBACiAKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9S
ZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgogCiBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAgICAgCkBAIC0zOCwxMSArMzksMjIgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAg
ICB2aXJ0dWFsIH5XZWJHTFByb2dyYW0oKSB7IGRlbGV0ZU9iamVjdCgpOyB9CiAgICAgICAgIAog
ICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxXZWJHTFByb2dyYW0+IGNyZWF0ZShXZWJHTFJlbmRl
cmluZ0NvbnRleHQqKTsKKworICAgICAgICAvLyBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9uKCkg
aXMgb25seSBjYWxsZWQgb25jZSBhZnRlciBsaW5rUHJvZ3JhbSgpCisgICAgICAgIC8vIHN1Y2Nl
ZWRzLgorICAgICAgICBib29sIGNhY2hlQWN0aXZlQXR0cmliTG9jYXRpb25zKCk7CisgICAgICAg
IC8vIGRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJvZ3JhbSBvbmx5IHJldHVybnMgdHJ1ZSB3
aGVuCisgICAgICAgIC8vIGNhY2hlQWN0aXZlQXR0cmliTG9jYXRpb25zKCkgYWxyZWFkeSBzdWNj
ZWVkZWQgYW5kIGF0dHJpYiBsb2NhdGlvbgorICAgICAgICAvLyBhY3R1YWxseSBiZWxvbmdzIHRv
IHRoZSBwcm9ncmFtLgorICAgICAgICBib29sIGRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSh1bnNpZ25lZCBsb2NhdGlvbik7CiAgICAgICAgIAogICAgIHByb3RlY3RlZDoKICAgICAg
ICAgV2ViR0xQcm9ncmFtKFdlYkdMUmVuZGVyaW5nQ29udGV4dCopOwogICAgICAgICAKICAgICAg
ICAgdmlydHVhbCB2b2lkIF9kZWxldGVPYmplY3QoUGxhdGZvcm0zRE9iamVjdCk7CisKKyAgICBw
cml2YXRlOgorICAgICAgICBWZWN0b3I8aW50PiBtX2FjdGl2ZUF0dHJpYkxvY2F0aW9uczsKICAg
ICB9OwogICAgIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9odG1sL2Nh
bnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvaHRt
bC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAkocmV2aXNpb24gNTcyMzUpCisrKyBX
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTY4OCwxMSArNjg4LDE0IEBAIGJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxp
ZGF0ZUluZGUKIAogYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5n
U3RhdGUobG9uZyBudW1FbGVtZW50c1JlcXVpcmVkKQogeworICAgIGlmICghbV9jdXJyZW50UHJv
Z3JhbSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCiAgICAgLy8gTG9vayBpbiBlYWNoIGVuYWJs
ZWQgdmVydGV4IGF0dHJpYiBhbmQgZmluZCB0aGUgc21hbGxlc3QgYnVmZmVyIHNpemUKICAgICBs
b25nIHNtYWxsZXN0TnVtRWxlbWVudHMgPSBMT05HX01BWDsKICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbV92ZXJ0ZXhBdHRyaWJTdGF0ZS5zaXplKCk7ICsraSkgewogICAgICAgICBjb25z
dCBWZXJ0ZXhBdHRyaWJTdGF0ZSYgc3RhdGUgPSBtX3ZlcnRleEF0dHJpYlN0YXRlW2ldOwotICAg
ICAgICBpZiAoc3RhdGUuZW5hYmxlZCAmJiBzdGF0ZS5udW1FbGVtZW50cyA8IHNtYWxsZXN0TnVt
RWxlbWVudHMpCisgICAgICAgIGlmIChzdGF0ZS5lbmFibGVkICYmIG1fY3VycmVudFByb2dyYW0t
PmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJvZ3JhbShpKSAmJiBzdGF0ZS5udW1FbGVtZW50
cyA8IHNtYWxsZXN0TnVtRWxlbWVudHMpCiAgICAgICAgICAgICBzbWFsbGVzdE51bUVsZW1lbnRz
ID0gc3RhdGUubnVtRWxlbWVudHM7CiAgICAgfQogICAgIApAQCAtMTU2OCw2ICsxNTcxLDcgQEAg
dm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQcm9ncmFtKAogICAgIH0KICAgICAgICAg
CiAgICAgbV9jb250ZXh0LT5saW5rUHJvZ3JhbShwcm9ncmFtKTsKKyAgICBwcm9ncmFtLT5jYWNo
ZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOwogICAgIGNsZWFudXBBZnRlckdyYXBoaWNzQ2FsbChm
YWxzZSk7CiB9CiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBM
YXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3MjQwKQorKysgTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMgQEAKKzIwMTAtMDQtMDcgIFpoZW55
YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBJbmRleCB2YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55
IHZlcnRleCBhdHRyaWJ1dGVzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zMTg5MgorCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvaW5kZXgtdmFs
aWRhdGlvbi1leHBlY3RlZC50eHQ6IEFkZCBuZXcgdGVzdCBjYXNlcyBmb3IgaW5kZXggdmFsaWRh
dGlvbnMuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRlc3RzL2luZGV4LXZh
bGlkYXRpb24uanM6IERpdHRvLgorCiAyMDEwLTA0LTA3ICBFcmlrIEFydmlkc3NvbiAgPGFydkBj
aHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KSW5kZXg6IExh
eW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4LXZhbGlk
YXRpb24tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA1NzIzNSkKKysrIExheW91dFRlc3RzL2Zhc3Qv
Y2FudmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkp
CkBAIC0xLDExICsxLDMwIEBACi1UZXN0IG9mIGdldCBjYWxscyBhZ2FpbnN0IEdMIG9iamVjdHMg
bGlrZSBnZXRCdWZmZXJQYXJhbWV0ZXIsIGV0Yy4KK1Rlc3Qgb2YgdmFsaWRhdGluZyBpbmRpY2Vz
IGZvciBkcmF3RWxlbWVudHMoKS4KIAogT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVz
IG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgogCitUZXN0
aW5nIHdpdGggdmFsaWQgaW5kaWNlcwogUEFTUyBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGds
LkZSQU1FQlVGRkVSKSBpcyBnbC5GUkFNRUJVRkZFUl9DT01QTEVURQogUEFTUyBnbC5nZXRFcnJv
cigpIGlzIDAKIFBBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdO
RURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KIFBBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitUZXN0
aW5nIHdpdGggb3V0LW9mLXJhbmdlIGluZGljZXMKK0VuYWJsZSB2ZXJ0aWNlcywgdmFsaWQKK1BB
U1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMs
IDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCitQQVNTIGdsLmdldEVycm9y
KCkgaXMgMAorRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1yYW5nZQorUEFTUyBnbC5nZXRFcnJvcigp
IGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURf
U0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyBnbC5JTlZBTElE
X09QRVJBVElPTgorVGVzdCB3aXRoIGVuYWJsZWQgYXR0cmlidXRlIHRoYXQgZG9lcyBub3QgYmVs
b25nIHRvIGN1cnJlbnQgcHJvZ3JhbQorRW5hYmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIG51
bGwKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRyYXdFbGVtZW50cyhnbC5UUklB
TkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmluZWQuCitQQVNTIGdsLmdl
dEVycm9yKCkgaXMgMAorRW5hYmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIGluZWZmaWNpZW50
IGRhdGEgYnVmZmVyCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorUEFTUyBnbC5kcmF3RWxlbWVu
dHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVkLgor
UEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUK
IAogVEVTVCBDT01QTEVURQpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvc2Ny
aXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMJKHJldmlz
aW9uIDU3MjM1KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRlc3Rz
L2luZGV4LXZhbGlkYXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTEsMjAgKzEsMjcgQEAKLWRl
c2NyaXB0aW9uKCJUZXN0IG9mIGdldCBjYWxscyBhZ2FpbnN0IEdMIG9iamVjdHMgbGlrZSBnZXRC
dWZmZXJQYXJhbWV0ZXIsIGV0Yy4iKTsKK2Rlc2NyaXB0aW9uKCJUZXN0IG9mIHZhbGlkYXRpbmcg
aW5kaWNlcyBmb3IgZHJhd0VsZW1lbnRzKCkuIik7CiAKIHZhciBnbCA9IGNyZWF0ZTNEQ29udGV4
dCgpOwogdmFyIHByb2dyYW0gPSBsb2FkU3RhbmRhcmRQcm9ncmFtKGdsKTsKIAogLy8gMyB2ZXJ0
aWNlcyA9PiAxIHRyaWFuZ2xlLCBpbnRlcmxlYXZlZCBkYXRhCi12YXIgZGF0YSA9IG5ldyBXZWJH
TEZsb2F0QXJyYXkoWzAsIDAsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IDAsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDAsIDEsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAsIDAsIDFdKTsKK3ZhciBkYXRhQ29tcGxldGUgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFsw
LCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAs
IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCwgMSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMV0pOwordmFyIGRhdGFJbmNvbXBs
ZXRlID0gbmV3IFdlYkdMRmxvYXRBcnJheShbMCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAxLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDEsIDEsIDEsIDFdKTsKIHZhciBpbmRpY2VzID0gbmV3IFdlYkdMVW5zaWdu
ZWRTaG9ydEFycmF5KFswLCAxLCAyXSk7CiAKLXZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZmZXIo
KTsKLWdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpOwotZ2wuYnVmZmVyRGF0
YShnbC5BUlJBWV9CVUZGRVIsIGRhdGEsIGdsLlNUQVRJQ19EUkFXKTsKK2RlYnVnKCJUZXN0aW5n
IHdpdGggdmFsaWQgaW5kaWNlcyIpOworCit2YXIgYnVmZmVyQ29tcGxldGUgPSBnbC5jcmVhdGVC
dWZmZXIoKTsKK2dsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJDb21wbGV0ZSk7
CitnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YUNvbXBsZXRlLCBnbC5TVEFUSUNf
RFJBVyk7CiB2YXIgZWxlbWVudHMgPSBnbC5jcmVhdGVCdWZmZXIoKTsKIGdsLmJpbmRCdWZmZXIo
Z2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRzKTsKIGdsLmJ1ZmZlckRhdGEoZ2wuRUxF
TUVOVF9BUlJBWV9CVUZGRVIsIGluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTsKQEAgLTIzLDExICsz
MCw0NSBAQCB2YXIgdmVydGV4TG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvCiB2YXIgbm9y
bWFsTG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgImFfbm9ybWFsIik7CiBnbC52
ZXJ0ZXhBdHRyaWJQb2ludGVyKHZlcnRleExvYywgNCwgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wu
c2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAwKTsKIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KHZl
cnRleExvYyk7Ci1nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG5vcm1hbExvYywgMywgZ2wuRkxPQVQs
IGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAzICogZ2wuc2l6ZUluQnl0ZXMo
Z2wuRkxPQVQpKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50ZXIobm9ybWFsTG9jLCAzLCBnbC5GTE9B
VCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDQgKiBnbC5zaXplSW5CeXRl
cyhnbC5GTE9BVCkpOwogZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobm9ybWFsTG9jKTsKIHNo
b3VsZEJlKCdnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKScsICdnbC5G
UkFNRUJVRkZFUl9DT01QTEVURScpOwogc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOwog
c2hvdWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVO
U0lHTkVEX1NIT1JULCAwKScpOwogc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOwogCitk
ZWJ1ZygiVGVzdGluZyB3aXRoIG91dC1vZi1yYW5nZSBpbmRpY2VzIik7CisKK3ZhciBidWZmZXJJ
bmNvbXBsZXRlID0gZ2wuY3JlYXRlQnVmZmVyKCk7CitnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JV
RkZFUiwgYnVmZmVySW5jb21wbGV0ZSk7CitnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwg
ZGF0YUluY29tcGxldGUsIGdsLlNUQVRJQ19EUkFXKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50ZXIo
dmVydGV4TG9jLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9B
VCksIDApOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodmVydGV4TG9jKTsKK2dsLmRpc2Fi
bGVWZXJ0ZXhBdHRyaWJBcnJheShub3JtYWxMb2MpOworZGVidWcoIkVuYWJsZSB2ZXJ0aWNlcywg
dmFsaWQiKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKK3Nob3VsZEJlVW5kZWZp
bmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwg
MCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKK2RlYnVnKCJFbmFibGUgbm9y
bWFscywgb3V0LW9mLXJhbmdlIik7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG5vcm1hbExvYywg
MywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCA0ICogZ2wu
c2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG5vcm1h
bExvYyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRCZVVuZGVmaW5l
ZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDAp
Jyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICdnbC5JTlZBTElEX09QRVJBVElPTicpOwor
CitkZWJ1ZygiVGVzdCB3aXRoIGVuYWJsZWQgYXR0cmlidXRlIHRoYXQgZG9lcyBub3QgYmVsb25n
IHRvIGN1cnJlbnQgcHJvZ3JhbSIpOworCitnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobm9y
bWFsTG9jKTsKK3ZhciBleHRyYUxvYyA9IE1hdGgubWF4KHZlcnRleExvYywgbm9ybWFsTG9jKSAr
IDE7CitnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShleHRyYUxvYyk7CitkZWJ1ZygiRW5hYmxl
IGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIG51bGwiKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigp
JywgJzAnKTsKK3Nob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVT
LCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywg
JzAnKTsKK2RlYnVnKCJFbmFibGUgYW4gZXh0cmEgYXR0cmlidXRlIHdpdGggaW5lZmZpY2llbnQg
ZGF0YSBidWZmZXIiKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoZXh0cmFMb2MsIDMsIGdsLkZM
T0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgNCAqIGdsLnNpemVJbkJ5
dGVzKGdsLkZMT0FUKSk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRC
ZVVuZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURf
U0hPUlQsIDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CisKIHN1Y2Nlc3Nm
dWxseVBhcnNlZCA9IHRydWU7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52830</attachid>
            <date>2010-04-07 23:13:05 -0700</date>
            <delta_ts>2010-04-07 23:16:13 -0700</delta_ts>
            <desc>revised patch : responding to Ken Russell&apos;s review</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>11955</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmRvZXNBdHRyaWJMb2NhdGlvbkJlbG9uZ1RvUHJv
Z3JhbSk6IEEgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBhbiBhdHRyaWJ1dGUgbG9jYXRpb24g
YmVsb25nIHRvIGEgcHJvZ3JhbS4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dyYW0u
aDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2FudmFz
L1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRl
cmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRvIHZh
bGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJyZW50
IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQ
cm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0LTA3
ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBB
ZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFzL1dl
YkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFBy
b2dyYW0uY3BwCShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQ
cm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsNDEgQEAgdm9pZCBXZWJHTFBy
b2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3NDb250
ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3JhbTo6
Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIG1fYWN0aXZlQXR0cmliTG9jYXRp
b25zLmNsZWFyKCk7CisgICAgaWYgKCFvYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgIEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0M2QgPSBjb250ZXh0KCktPmdyYXBoaWNzQ29u
dGV4dDNEKCk7CisgICAgaW50IGxpbmtTdGF0dXM7CisgICAgY29udGV4dDNkLT5nZXRQcm9ncmFt
aXYodGhpcywgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7Cisg
ICAgaWYgKCFsaW5rU3RhdHVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQgbnVt
QXR0cmlicyA9IDA7CisgICAgY29udGV4dDNkLT5nZXRQcm9ncmFtaXYodGhpcywgR3JhcGhpY3ND
b250ZXh0M0Q6OkFDVElWRV9BVFRSSUJVVEVTLCAmbnVtQXR0cmlicyk7CisgICAgbV9hY3RpdmVB
dHRyaWJMb2NhdGlvbnMucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQXR0cmlicykpOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0cmliczsgKytpKSB7CisgICAgICAgIEFjdGl2
ZUluZm8gaW5mbzsKKyAgICAgICAgY29udGV4dDNkLT5nZXRBY3RpdmVBdHRyaWIodGhpcywgaSwg
aW5mbyk7CisgICAgICAgIG1fYWN0aXZlQXR0cmliTG9jYXRpb25zW2ldID0gY29udGV4dDNkLT5n
ZXRBdHRyaWJMb2NhdGlvbih0aGlzLCBpbmZvLm5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWlu
YXRpb24oKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBXZWJHTFByb2dy
YW06Om51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PGludD4obV9hY3RpdmVBdHRyaWJMb2NhdGlvbnMuc2l6ZSgpKTsKK30KKworaW50IFdlYkdMUHJv
Z3JhbTo6Z2V0QWN0aXZlQXR0cmliTG9jYXRpb24oaW50IGluZGV4KQoreworICAgIGlmIChpbmRl
eCA8IDAgfHwgaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihtX2FjdGl2ZUF0dHJpYkxvY2F0aW9u
cy5zaXplKCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIG1fYWN0aXZlQXR0cmli
TG9jYXRpb25zW3N0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpXTsKK30KKwogfQogCiAjZW5kaWYg
Ly8gRU5BQkxFKDNEX0NBTlZBUykKSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQcm9n
cmFtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0uaAko
cmV2aXNpb24gNTcyNDApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0
ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5o
PgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgCkBAIC0zOCwxMSArMzksMjAgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0dWFsIH5XZWJHTFByb2dyYW0oKSB7IGRlbGV0ZU9i
amVjdCgpOyB9CiAgICAgICAgIAogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxXZWJHTFByb2dy
YW0+IGNyZWF0ZShXZWJHTFJlbmRlcmluZ0NvbnRleHQqKTsKKworICAgICAgICAvLyBjYWNoZUFj
dGl2ZUF0dHJpYkxvY2F0aW9uKCkgaXMgb25seSBjYWxsZWQgb25jZSBhZnRlciBsaW5rUHJvZ3Jh
bSgpCisgICAgICAgIC8vIHN1Y2NlZWRzLgorICAgICAgICBib29sIGNhY2hlQWN0aXZlQXR0cmli
TG9jYXRpb25zKCk7CisgICAgICAgIGludCBudW1BY3RpdmVBdHRyaWJMb2NhdGlvbnMoKTsKKyAg
ICAgICAgaW50IGdldEFjdGl2ZUF0dHJpYkxvY2F0aW9uKGludCBpbmRleCk7CiAgICAgICAgIAog
ICAgIHByb3RlY3RlZDoKICAgICAgICAgV2ViR0xQcm9ncmFtKFdlYkdMUmVuZGVyaW5nQ29udGV4
dCopOwogICAgICAgICAKICAgICAgICAgdmlydHVhbCB2b2lkIF9kZWxldGVPYmplY3QoUGxhdGZv
cm0zRE9iamVjdCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBWZWN0b3I8aW50PiBtX2FjdGl2
ZUF0dHJpYkxvY2F0aW9uczsKICAgICB9OwogICAgIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJ
bmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAko
cmV2aXNpb24gNTcyNDApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29u
dGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY4OCwxMiArNjg4LDIwIEBAIGJvb2wgV2ViR0xS
ZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGUKIAogYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUobG9uZyBudW1FbGVtZW50c1JlcXVpcmVkKQogewor
ICAgIGlmICghbV9jdXJyZW50UHJvZ3JhbSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCiAgICAg
Ly8gTG9vayBpbiBlYWNoIGVuYWJsZWQgdmVydGV4IGF0dHJpYiBhbmQgZmluZCB0aGUgc21hbGxl
c3QgYnVmZmVyIHNpemUKICAgICBsb25nIHNtYWxsZXN0TnVtRWxlbWVudHMgPSBMT05HX01BWDsK
LSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV92ZXJ0ZXhBdHRyaWJTdGF0ZS5zaXplKCk7
ICsraSkgewotICAgICAgICBjb25zdCBWZXJ0ZXhBdHRyaWJTdGF0ZSYgc3RhdGUgPSBtX3ZlcnRl
eEF0dHJpYlN0YXRlW2ldOwotICAgICAgICBpZiAoc3RhdGUuZW5hYmxlZCAmJiBzdGF0ZS5udW1F
bGVtZW50cyA8IHNtYWxsZXN0TnVtRWxlbWVudHMpCi0gICAgICAgICAgICBzbWFsbGVzdE51bUVs
ZW1lbnRzID0gc3RhdGUubnVtRWxlbWVudHM7CisgICAgaW50IG51bUFjdGl2ZUF0dHJpYkxvY2F0
aW9ucyA9IG1fY3VycmVudFByb2dyYW0tPm51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOworICAg
IGludCBudW1BdHRyaWJTdGF0ZXMgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fdmVydGV4QXR0cmliU3Rh
dGUuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZUF0dHJpYkxvY2F0
aW9uczsgKytpKSB7CisgICAgICAgIGludCBsb2MgPSBtX2N1cnJlbnRQcm9ncmFtLT5nZXRBY3Rp
dmVBdHRyaWJMb2NhdGlvbihpKTsKKyAgICAgICAgaWYgKGxvYyA+PTAgJiYgbG9jIDwgbnVtQXR0
cmliU3RhdGVzKSB7CisgICAgICAgICAgICBjb25zdCBWZXJ0ZXhBdHRyaWJTdGF0ZSYgc3RhdGUg
PSBtX3ZlcnRleEF0dHJpYlN0YXRlW2xvY107CisgICAgICAgICAgICBpZiAoc3RhdGUuZW5hYmxl
ZCAmJiBzdGF0ZS5udW1FbGVtZW50cyA8IHNtYWxsZXN0TnVtRWxlbWVudHMpCisgICAgICAgICAg
ICAgICAgc21hbGxlc3ROdW1FbGVtZW50cyA9IHN0YXRlLm51bUVsZW1lbnRzOworICAgICAgICB9
CiAgICAgfQogICAgIAogICAgIGlmIChzbWFsbGVzdE51bUVsZW1lbnRzID09IExPTkdfTUFYKQpA
QCAtMTU2OCw2ICsxNTc2LDcgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQcm9n
cmFtKAogICAgIH0KICAgICAgICAgCiAgICAgbV9jb250ZXh0LT5saW5rUHJvZ3JhbShwcm9ncmFt
KTsKKyAgICBwcm9ncmFtLT5jYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOwogICAgIGNsZWFu
dXBBZnRlckdyYXBoaWNzQ2FsbChmYWxzZSk7CiB9CiAKSW5kZXg6IExheW91dFRlc3RzL0NoYW5n
ZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3MjQw
KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTMg
QEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2YWxpZGF0aW9uIGNv
ZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAgICAgICogZmFzdC9j
YW52YXMvd2ViZ2wvaW5kZXgtdmFsaWRhdGlvbi1leHBlY3RlZC50eHQ6IEFkZCBuZXcgdGVzdCBj
YXNlcyBmb3IgaW5kZXggdmFsaWRhdGlvbnMuCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wv
c2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanM6IERpdHRvLgorCiAyMDEwLTA0LTA3ICBF
cmlrIEFydmlkc3NvbiAgPGFydkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkg
QWRhbSBCYXJ0aC4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4LXZh
bGlkYXRpb24tZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2Fu
dmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA1NzI0MCkK
KysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhwZWN0
ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDExICsxLDMwIEBACi1UZXN0IG9mIGdldCBjYWxs
cyBhZ2FpbnN0IEdMIG9iamVjdHMgbGlrZSBnZXRCdWZmZXJQYXJhbWV0ZXIsIGV0Yy4KK1Rlc3Qg
b2YgdmFsaWRhdGluZyBpbmRpY2VzIGZvciBkcmF3RWxlbWVudHMoKS4KIAogT24gc3VjY2Vzcywg
eW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRF
U1QgQ09NUExFVEUiLgogCitUZXN0aW5nIHdpdGggdmFsaWQgaW5kaWNlcwogUEFTUyBnbC5jaGVj
a0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSBpcyBnbC5GUkFNRUJVRkZFUl9DT01Q
TEVURQogUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKIFBBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRS
SUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KIFBBU1MgZ2wu
Z2V0RXJyb3IoKSBpcyAwCitUZXN0aW5nIHdpdGggb3V0LW9mLXJhbmdlIGluZGljZXMKK0VuYWJs
ZSB2ZXJ0aWNlcywgdmFsaWQKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRyYXdF
bGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRlZmlu
ZWQuCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1yYW5n
ZQorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFO
R0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0
RXJyb3IoKSBpcyBnbC5JTlZBTElEX09QRVJBVElPTgorVGVzdCB3aXRoIGVuYWJsZWQgYXR0cmli
dXRlIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGN1cnJlbnQgcHJvZ3JhbQorRW5hYmxlIGFuIGV4
dHJhIGF0dHJpYnV0ZSB3aXRoIG51bGwKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGds
LmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1
bmRlZmluZWQuCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorRW5hYmxlIGFuIGV4dHJhIGF0dHJp
YnV0ZSB3aXRoIGluc3VmZmljaWVudCBkYXRhIGJ1ZmZlcgorUEFTUyBnbC5nZXRFcnJvcigpIGlz
IDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hP
UlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCiBQQVNTIHN1Y2Nl
c3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1QgQ09NUExFVEUKSW5kZXg6IExheW91dFRlc3Rz
L2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRl
eC12YWxpZGF0aW9uLmpzCShyZXZpc2lvbiA1NzI0MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2Fu
dmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0xLDIwICsxLDI3IEBACi1kZXNjcmlwdGlvbigiVGVzdCBvZiBnZXQgY2FsbHMgYWdhaW5z
dCBHTCBvYmplY3RzIGxpa2UgZ2V0QnVmZmVyUGFyYW1ldGVyLCBldGMuIik7CitkZXNjcmlwdGlv
bigiVGVzdCBvZiB2YWxpZGF0aW5nIGluZGljZXMgZm9yIGRyYXdFbGVtZW50cygpLiIpOwogCiB2
YXIgZ2wgPSBjcmVhdGUzRENvbnRleHQoKTsKIHZhciBwcm9ncmFtID0gbG9hZFN0YW5kYXJkUHJv
Z3JhbShnbCk7CiAKIC8vIDMgdmVydGljZXMgPT4gMSB0cmlhbmdsZSwgaW50ZXJsZWF2ZWQgZGF0
YQotdmFyIGRhdGEgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFswLCAwLCAwLCAxLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAxLCAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAw
LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxXSk7Cit2YXIgZGF0YUNvbXBsZXRlID0g
bmV3IFdlYkdMRmxvYXRBcnJheShbMCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIDEsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAx
LCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAs
IDFdKTsKK3ZhciBkYXRhSW5jb21wbGV0ZSA9IG5ldyBXZWJHTEZsb2F0QXJyYXkoWzAsIDAsIDAs
IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCwgMSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxXSk7CiB2YXIgaW5k
aWNlcyA9IG5ldyBXZWJHTFVuc2lnbmVkU2hvcnRBcnJheShbMCwgMSwgMl0pOwogCi12YXIgYnVm
ZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7Ci1nbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwg
YnVmZmVyKTsKLWdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFUSUNf
RFJBVyk7CitkZWJ1ZygiVGVzdGluZyB3aXRoIHZhbGlkIGluZGljZXMiKTsKKwordmFyIGJ1ZmZl
ckNvbXBsZXRlID0gZ2wuY3JlYXRlQnVmZmVyKCk7CitnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JV
RkZFUiwgYnVmZmVyQ29tcGxldGUpOworZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGRh
dGFDb21wbGV0ZSwgZ2wuU1RBVElDX0RSQVcpOwogdmFyIGVsZW1lbnRzID0gZ2wuY3JlYXRlQnVm
ZmVyKCk7CiBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50cyk7
CiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzLCBnbC5TVEFU
SUNfRFJBVyk7CkBAIC0yMywxMSArMzAsNDUgQEAgdmFyIHZlcnRleExvYyA9IGdsLmdldEF0dHJp
YkxvY2F0aW9uKHBybwogdmFyIG5vcm1hbExvYyA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHByb2dy
YW0sICJhX25vcm1hbCIpOwogZ2wudmVydGV4QXR0cmliUG9pbnRlcih2ZXJ0ZXhMb2MsIDQsIGds
LkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgMCk7CiBnbC5lbmFi
bGVWZXJ0ZXhBdHRyaWJBcnJheSh2ZXJ0ZXhMb2MpOwotZ2wudmVydGV4QXR0cmliUG9pbnRlcihu
b3JtYWxMb2MsIDMsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FU
KSwgMyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSk7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVy
KG5vcm1hbExvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxP
QVQpLCA0ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKIGdsLmVuYWJsZVZlcnRleEF0dHJp
YkFycmF5KG5vcm1hbExvYyk7CiBzaG91bGRCZSgnZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhn
bC5GUkFNRUJVRkZFUiknLCAnZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUnKTsKIHNob3VsZEJlKCdn
bC5nZXRFcnJvcigpJywgJzAnKTsKIHNob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMo
Z2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKIHNob3VsZEJlKCdnbC5n
ZXRFcnJvcigpJywgJzAnKTsKIAorZGVidWcoIlRlc3Rpbmcgd2l0aCBvdXQtb2YtcmFuZ2UgaW5k
aWNlcyIpOworCit2YXIgYnVmZmVySW5jb21wbGV0ZSA9IGdsLmNyZWF0ZUJ1ZmZlcigpOworZ2wu
YmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlckluY29tcGxldGUpOworZ2wuYnVmZmVy
RGF0YShnbC5BUlJBWV9CVUZGRVIsIGRhdGFJbmNvbXBsZXRlLCBnbC5TVEFUSUNfRFJBVyk7Citn
bC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHZlcnRleExvYywgNCwgZ2wuRkxPQVQsIGZhbHNlLCA3ICog
Z2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAwKTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5
KHZlcnRleExvYyk7CitnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobm9ybWFsTG9jKTsKK2Rl
YnVnKCJFbmFibGUgdmVydGljZXMsIHZhbGlkIik7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScs
ICcwJyk7CitzaG91bGRCZVVuZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywg
MywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcw
Jyk7CitkZWJ1ZygiRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1yYW5nZSIpOworZ2wudmVydGV4QXR0
cmliUG9pbnRlcihub3JtYWxMb2MsIDMsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5
dGVzKGdsLkZMT0FUKSwgNCAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSk7CitnbC5lbmFibGVW
ZXJ0ZXhBdHRyaWJBcnJheShub3JtYWxMb2MpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAn
MCcpOworc2hvdWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMs
IGdsLlVOU0lHTkVEX1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnZ2wu
SU5WQUxJRF9PUEVSQVRJT04nKTsKKworZGVidWcoIlRlc3Qgd2l0aCBlbmFibGVkIGF0dHJpYnV0
ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBjdXJyZW50IHByb2dyYW0iKTsKKworZ2wuZGlzYWJs
ZVZlcnRleEF0dHJpYkFycmF5KG5vcm1hbExvYyk7Cit2YXIgZXh0cmFMb2MgPSBNYXRoLm1heCh2
ZXJ0ZXhMb2MsIG5vcm1hbExvYykgKyAxOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkoZXh0
cmFMb2MpOworZGVidWcoIkVuYWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0aCBudWxsIik7Citz
aG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRCZVVuZGVmaW5lZCgnZ2wuZHJh
d0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7CitzaG91
bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitkZWJ1ZygiRW5hYmxlIGFuIGV4dHJhIGF0dHJp
YnV0ZSB3aXRoIGluc3VmZmljaWVudCBkYXRhIGJ1ZmZlciIpOworZ2wudmVydGV4QXR0cmliUG9p
bnRlcihleHRyYUxvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wu
RkxPQVQpLCA0ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKK3Nob3VsZEJlKCdnbC5nZXRF
cnJvcigpJywgJzAnKTsKK3Nob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJ
QU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJv
cigpJywgJzAnKTsKKwogc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52831</attachid>
            <date>2010-04-07 23:16:13 -0700</date>
            <delta_ts>2010-04-08 14:08:48 -0700</delta_ts>
            <desc>revised patch: fix the change log</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>12015</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmdldEFjdGl2ZUF0dHJpYkxvY2F0aW9uKTogR2V0
IHRoZSBjYWNoZWQgYXR0cmlidXRlIGxvY2F0aW9uLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xQ
cm9ncmFtOjpudW1BY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBHZXQgdGhlIG51bWJlciBvZiBjYWNo
ZWQgYXR0cmlidXRlIGxvY2F0aW9ucy4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dy
YW0uaDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJl
bmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRv
IHZhbGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJy
ZW50IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6Omxp
bmtQcm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0
LTA3ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBBZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFz
L1dlYkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJH
TFByb2dyYW0uY3BwCShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2Vi
R0xQcm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsNDEgQEAgdm9pZCBXZWJH
TFByb2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3ND
b250ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3Jh
bTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIG1fYWN0aXZlQXR0cmliTG9j
YXRpb25zLmNsZWFyKCk7CisgICAgaWYgKCFvYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0M2QgPSBjb250ZXh0KCktPmdyYXBoaWNz
Q29udGV4dDNEKCk7CisgICAgaW50IGxpbmtTdGF0dXM7CisgICAgY29udGV4dDNkLT5nZXRQcm9n
cmFtaXYodGhpcywgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7
CisgICAgaWYgKCFsaW5rU3RhdHVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQg
bnVtQXR0cmlicyA9IDA7CisgICAgY29udGV4dDNkLT5nZXRQcm9ncmFtaXYodGhpcywgR3JhcGhp
Y3NDb250ZXh0M0Q6OkFDVElWRV9BVFRSSUJVVEVTLCAmbnVtQXR0cmlicyk7CisgICAgbV9hY3Rp
dmVBdHRyaWJMb2NhdGlvbnMucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQXR0cmlicykp
OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0cmliczsgKytpKSB7CisgICAgICAgIEFj
dGl2ZUluZm8gaW5mbzsKKyAgICAgICAgY29udGV4dDNkLT5nZXRBY3RpdmVBdHRyaWIodGhpcywg
aSwgaW5mbyk7CisgICAgICAgIG1fYWN0aXZlQXR0cmliTG9jYXRpb25zW2ldID0gY29udGV4dDNk
LT5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLCBpbmZvLm5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBXZWJHTFBy
b2dyYW06Om51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpCit7CisgICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4obV9hY3RpdmVBdHRyaWJMb2NhdGlvbnMuc2l6ZSgpKTsKK30KKworaW50IFdlYkdM
UHJvZ3JhbTo6Z2V0QWN0aXZlQXR0cmliTG9jYXRpb24oaW50IGluZGV4KQoreworICAgIGlmIChp
bmRleCA8IDAgfHwgaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihtX2FjdGl2ZUF0dHJpYkxvY2F0
aW9ucy5zaXplKCkpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIG1fYWN0aXZlQXR0
cmliTG9jYXRpb25zW3N0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpXTsKK30KKwogfQogCiAjZW5k
aWYgLy8gRU5BQkxFKDNEX0NBTlZBUykKSW5kZXg6IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQ
cm9ncmFtLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0u
aAkocmV2aXNpb24gNTcyNDApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5o
CSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAKICNpbmNsdWRlIDx3dGYvUGFzc1Jl
ZlB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rv
ci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgCkBAIC0zOCwxMSArMzksMjAgQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgICAgICB2aXJ0dWFsIH5XZWJHTFByb2dyYW0oKSB7IGRlbGV0
ZU9iamVjdCgpOyB9CiAgICAgICAgIAogICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxXZWJHTFBy
b2dyYW0+IGNyZWF0ZShXZWJHTFJlbmRlcmluZ0NvbnRleHQqKTsKKworICAgICAgICAvLyBjYWNo
ZUFjdGl2ZUF0dHJpYkxvY2F0aW9uKCkgaXMgb25seSBjYWxsZWQgb25jZSBhZnRlciBsaW5rUHJv
Z3JhbSgpCisgICAgICAgIC8vIHN1Y2NlZWRzLgorICAgICAgICBib29sIGNhY2hlQWN0aXZlQXR0
cmliTG9jYXRpb25zKCk7CisgICAgICAgIGludCBudW1BY3RpdmVBdHRyaWJMb2NhdGlvbnMoKTsK
KyAgICAgICAgaW50IGdldEFjdGl2ZUF0dHJpYkxvY2F0aW9uKGludCBpbmRleCk7CiAgICAgICAg
IAogICAgIHByb3RlY3RlZDoKICAgICAgICAgV2ViR0xQcm9ncmFtKFdlYkdMUmVuZGVyaW5nQ29u
dGV4dCopOwogICAgICAgICAKICAgICAgICAgdmlydHVhbCB2b2lkIF9kZWxldGVPYmplY3QoUGxh
dGZvcm0zRE9iamVjdCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBWZWN0b3I8aW50PiBtX2Fj
dGl2ZUF0dHJpYkxvY2F0aW9uczsKICAgICB9OwogICAgIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNw
cAkocmV2aXNpb24gNTcyNDApCisrKyBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5n
Q29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY4OCwxMiArNjg4LDIwIEBAIGJvb2wgV2Vi
R0xSZW5kZXJpbmdDb250ZXh0Ojp2YWxpZGF0ZUluZGUKIAogYm9vbCBXZWJHTFJlbmRlcmluZ0Nv
bnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUobG9uZyBudW1FbGVtZW50c1JlcXVpcmVkKQog
eworICAgIGlmICghbV9jdXJyZW50UHJvZ3JhbSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCiAg
ICAgLy8gTG9vayBpbiBlYWNoIGVuYWJsZWQgdmVydGV4IGF0dHJpYiBhbmQgZmluZCB0aGUgc21h
bGxlc3QgYnVmZmVyIHNpemUKICAgICBsb25nIHNtYWxsZXN0TnVtRWxlbWVudHMgPSBMT05HX01B
WDsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV92ZXJ0ZXhBdHRyaWJTdGF0ZS5zaXpl
KCk7ICsraSkgewotICAgICAgICBjb25zdCBWZXJ0ZXhBdHRyaWJTdGF0ZSYgc3RhdGUgPSBtX3Zl
cnRleEF0dHJpYlN0YXRlW2ldOwotICAgICAgICBpZiAoc3RhdGUuZW5hYmxlZCAmJiBzdGF0ZS5u
dW1FbGVtZW50cyA8IHNtYWxsZXN0TnVtRWxlbWVudHMpCi0gICAgICAgICAgICBzbWFsbGVzdE51
bUVsZW1lbnRzID0gc3RhdGUubnVtRWxlbWVudHM7CisgICAgaW50IG51bUFjdGl2ZUF0dHJpYkxv
Y2F0aW9ucyA9IG1fY3VycmVudFByb2dyYW0tPm51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOwor
ICAgIGludCBudW1BdHRyaWJTdGF0ZXMgPSBzdGF0aWNfY2FzdDxpbnQ+KG1fdmVydGV4QXR0cmli
U3RhdGUuc2l6ZSgpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUFjdGl2ZUF0dHJpYkxv
Y2F0aW9uczsgKytpKSB7CisgICAgICAgIGludCBsb2MgPSBtX2N1cnJlbnRQcm9ncmFtLT5nZXRB
Y3RpdmVBdHRyaWJMb2NhdGlvbihpKTsKKyAgICAgICAgaWYgKGxvYyA+PTAgJiYgbG9jIDwgbnVt
QXR0cmliU3RhdGVzKSB7CisgICAgICAgICAgICBjb25zdCBWZXJ0ZXhBdHRyaWJTdGF0ZSYgc3Rh
dGUgPSBtX3ZlcnRleEF0dHJpYlN0YXRlW2xvY107CisgICAgICAgICAgICBpZiAoc3RhdGUuZW5h
YmxlZCAmJiBzdGF0ZS5udW1FbGVtZW50cyA8IHNtYWxsZXN0TnVtRWxlbWVudHMpCisgICAgICAg
ICAgICAgICAgc21hbGxlc3ROdW1FbGVtZW50cyA9IHN0YXRlLm51bUVsZW1lbnRzOworICAgICAg
ICB9CiAgICAgfQogICAgIAogICAgIGlmIChzbWFsbGVzdE51bUVsZW1lbnRzID09IExPTkdfTUFY
KQpAQCAtMTU2OCw2ICsxNTc2LDcgQEAgdm9pZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmxpbmtQ
cm9ncmFtKAogICAgIH0KICAgICAgICAgCiAgICAgbV9jb250ZXh0LT5saW5rUHJvZ3JhbShwcm9n
cmFtKTsKKyAgICBwcm9ncmFtLT5jYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOwogICAgIGNs
ZWFudXBBZnRlckdyYXBoaWNzQ2FsbChmYWxzZSk7CiB9CiAKSW5kZXg6IExheW91dFRlc3RzL0No
YW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDU3
MjQwKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEs
MTMgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2YWxpZGF0aW9u
IGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAgICAgICogZmFz
dC9jYW52YXMvd2ViZ2wvaW5kZXgtdmFsaWRhdGlvbi1leHBlY3RlZC50eHQ6IEFkZCBuZXcgdGVz
dCBjYXNlcyBmb3IgaW5kZXggdmFsaWRhdGlvbnMuCisgICAgICAgICogZmFzdC9jYW52YXMvd2Vi
Z2wvc2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanM6IERpdHRvLgorCiAyMDEwLTA0LTA3
ICBFcmlrIEFydmlkc3NvbiAgPGFydkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgQWRhbSBCYXJ0aC4KSW5kZXg6IExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4
LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3Qv
Y2FudmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiA1NzI0
MCkKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL2luZGV4LXZhbGlkYXRpb24tZXhw
ZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDExICsxLDMwIEBACi1UZXN0IG9mIGdldCBj
YWxscyBhZ2FpbnN0IEdMIG9iamVjdHMgbGlrZSBnZXRCdWZmZXJQYXJhbWV0ZXIsIGV0Yy4KK1Rl
c3Qgb2YgdmFsaWRhdGluZyBpbmRpY2VzIGZvciBkcmF3RWxlbWVudHMoKS4KIAogT24gc3VjY2Vz
cywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQQVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkg
IlRFU1QgQ09NUExFVEUiLgogCitUZXN0aW5nIHdpdGggdmFsaWQgaW5kaWNlcwogUEFTUyBnbC5j
aGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSBpcyBnbC5GUkFNRUJVRkZFUl9D
T01QTEVURQogUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKIFBBU1MgZ2wuZHJhd0VsZW1lbnRzKGds
LlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KIFBBU1Mg
Z2wuZ2V0RXJyb3IoKSBpcyAwCitUZXN0aW5nIHdpdGggb3V0LW9mLXJhbmdlIGluZGljZXMKK0Vu
YWJsZSB2ZXJ0aWNlcywgdmFsaWQKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNTIGdsLmRy
YXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBpcyB1bmRl
ZmluZWQuCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1y
YW5nZQorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRS
SUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wu
Z2V0RXJyb3IoKSBpcyBnbC5JTlZBTElEX09QRVJBVElPTgorVGVzdCB3aXRoIGVuYWJsZWQgYXR0
cmlidXRlIHRoYXQgZG9lcyBub3QgYmVsb25nIHRvIGN1cnJlbnQgcHJvZ3JhbQorRW5hYmxlIGFu
IGV4dHJhIGF0dHJpYnV0ZSB3aXRoIG51bGwKK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCitQQVNT
IGdsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKSBp
cyB1bmRlZmluZWQuCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorRW5hYmxlIGFuIGV4dHJhIGF0
dHJpYnV0ZSB3aXRoIGluc3VmZmljaWVudCBkYXRhIGJ1ZmZlcgorUEFTUyBnbC5nZXRFcnJvcigp
IGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURf
U0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0RXJyb3IoKSBpcyAwCiBQQVNTIHN1
Y2Nlc3NmdWxseVBhcnNlZCBpcyB0cnVlCiAKIFRFU1QgQ09NUExFVEUKSW5kZXg6IExheW91dFRl
c3RzL2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9p
bmRleC12YWxpZGF0aW9uLmpzCShyZXZpc2lvbiA1NzI0MCkKKysrIExheW91dFRlc3RzL2Zhc3Qv
Y2FudmFzL3dlYmdsL3NjcmlwdC10ZXN0cy9pbmRleC12YWxpZGF0aW9uLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0xLDIwICsxLDI3IEBACi1kZXNjcmlwdGlvbigiVGVzdCBvZiBnZXQgY2FsbHMgYWdh
aW5zdCBHTCBvYmplY3RzIGxpa2UgZ2V0QnVmZmVyUGFyYW1ldGVyLCBldGMuIik7CitkZXNjcmlw
dGlvbigiVGVzdCBvZiB2YWxpZGF0aW5nIGluZGljZXMgZm9yIGRyYXdFbGVtZW50cygpLiIpOwog
CiB2YXIgZ2wgPSBjcmVhdGUzRENvbnRleHQoKTsKIHZhciBwcm9ncmFtID0gbG9hZFN0YW5kYXJk
UHJvZ3JhbShnbCk7CiAKIC8vIDMgdmVydGljZXMgPT4gMSB0cmlhbmdsZSwgaW50ZXJsZWF2ZWQg
ZGF0YQotdmFyIGRhdGEgPSBuZXcgV2ViR0xGbG9hdEFycmF5KFswLCAwLCAwLCAxLAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAxLCAwLCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAw
LCAwLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxXSk7Cit2YXIgZGF0YUNvbXBsZXRl
ID0gbmV3IFdlYkdMRmxvYXRBcnJheShbMCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIDEsIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAxLCAxLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAs
IDAsIDFdKTsKK3ZhciBkYXRhSW5jb21wbGV0ZSA9IG5ldyBXZWJHTEZsb2F0QXJyYXkoWzAsIDAs
IDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAx
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCwgMSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxXSk7CiB2YXIg
aW5kaWNlcyA9IG5ldyBXZWJHTFVuc2lnbmVkU2hvcnRBcnJheShbMCwgMSwgMl0pOwogCi12YXIg
YnVmZmVyID0gZ2wuY3JlYXRlQnVmZmVyKCk7Ci1nbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZF
UiwgYnVmZmVyKTsKLWdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBkYXRhLCBnbC5TVEFU
SUNfRFJBVyk7CitkZWJ1ZygiVGVzdGluZyB3aXRoIHZhbGlkIGluZGljZXMiKTsKKwordmFyIGJ1
ZmZlckNvbXBsZXRlID0gZ2wuY3JlYXRlQnVmZmVyKCk7CitnbC5iaW5kQnVmZmVyKGdsLkFSUkFZ
X0JVRkZFUiwgYnVmZmVyQ29tcGxldGUpOworZ2wuYnVmZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIs
IGRhdGFDb21wbGV0ZSwgZ2wuU1RBVElDX0RSQVcpOwogdmFyIGVsZW1lbnRzID0gZ2wuY3JlYXRl
QnVmZmVyKCk7CiBnbC5iaW5kQnVmZmVyKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBlbGVtZW50
cyk7CiBnbC5idWZmZXJEYXRhKGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCBpbmRpY2VzLCBnbC5T
VEFUSUNfRFJBVyk7CkBAIC0yMywxMSArMzAsNDUgQEAgdmFyIHZlcnRleExvYyA9IGdsLmdldEF0
dHJpYkxvY2F0aW9uKHBybwogdmFyIG5vcm1hbExvYyA9IGdsLmdldEF0dHJpYkxvY2F0aW9uKHBy
b2dyYW0sICJhX25vcm1hbCIpOwogZ2wudmVydGV4QXR0cmliUG9pbnRlcih2ZXJ0ZXhMb2MsIDQs
IGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSwgMCk7CiBnbC5l
bmFibGVWZXJ0ZXhBdHRyaWJBcnJheSh2ZXJ0ZXhMb2MpOwotZ2wudmVydGV4QXR0cmliUG9pbnRl
cihub3JtYWxMb2MsIDMsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZM
T0FUKSwgMyAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSk7CitnbC52ZXJ0ZXhBdHRyaWJQb2lu
dGVyKG5vcm1hbExvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wu
RkxPQVQpLCA0ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKIGdsLmVuYWJsZVZlcnRleEF0
dHJpYkFycmF5KG5vcm1hbExvYyk7CiBzaG91bGRCZSgnZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1
cyhnbC5GUkFNRUJVRkZFUiknLCAnZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEUnKTsKIHNob3VsZEJl
KCdnbC5nZXRFcnJvcigpJywgJzAnKTsKIHNob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVu
dHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKIHNob3VsZEJlKCdn
bC5nZXRFcnJvcigpJywgJzAnKTsKIAorZGVidWcoIlRlc3Rpbmcgd2l0aCBvdXQtb2YtcmFuZ2Ug
aW5kaWNlcyIpOworCit2YXIgYnVmZmVySW5jb21wbGV0ZSA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwor
Z2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlckluY29tcGxldGUpOworZ2wuYnVm
ZmVyRGF0YShnbC5BUlJBWV9CVUZGRVIsIGRhdGFJbmNvbXBsZXRlLCBnbC5TVEFUSUNfRFJBVyk7
CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHZlcnRleExvYywgNCwgZ2wuRkxPQVQsIGZhbHNlLCA3
ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAwKTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFy
cmF5KHZlcnRleExvYyk7CitnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkobm9ybWFsTG9jKTsK
K2RlYnVnKCJFbmFibGUgdmVydGljZXMsIHZhbGlkIik7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3Io
KScsICcwJyk7CitzaG91bGRCZVVuZGVmaW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xF
UywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScs
ICcwJyk7CitkZWJ1ZygiRW5hYmxlIG5vcm1hbHMsIG91dC1vZi1yYW5nZSIpOworZ2wudmVydGV4
QXR0cmliUG9pbnRlcihub3JtYWxMb2MsIDMsIGdsLkZMT0FULCBmYWxzZSwgNyAqIGdsLnNpemVJ
bkJ5dGVzKGdsLkZMT0FUKSwgNCAqIGdsLnNpemVJbkJ5dGVzKGdsLkZMT0FUKSk7CitnbC5lbmFi
bGVWZXJ0ZXhBdHRyaWJBcnJheShub3JtYWxMb2MpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCkn
LCAnMCcpOworc2hvdWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMs
IDMsIGdsLlVOU0lHTkVEX1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAn
Z2wuSU5WQUxJRF9PUEVSQVRJT04nKTsKKworZGVidWcoIlRlc3Qgd2l0aCBlbmFibGVkIGF0dHJp
YnV0ZSB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBjdXJyZW50IHByb2dyYW0iKTsKKworZ2wuZGlz
YWJsZVZlcnRleEF0dHJpYkFycmF5KG5vcm1hbExvYyk7Cit2YXIgZXh0cmFMb2MgPSBNYXRoLm1h
eCh2ZXJ0ZXhMb2MsIG5vcm1hbExvYykgKyAxOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXko
ZXh0cmFMb2MpOworZGVidWcoIkVuYWJsZSBhbiBleHRyYSBhdHRyaWJ1dGUgd2l0aCBudWxsIik7
CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRCZVVuZGVmaW5lZCgnZ2wu
ZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApJyk7Citz
aG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitkZWJ1ZygiRW5hYmxlIGFuIGV4dHJhIGF0
dHJpYnV0ZSB3aXRoIGluc3VmZmljaWVudCBkYXRhIGJ1ZmZlciIpOworZ2wudmVydGV4QXR0cmli
UG9pbnRlcihleHRyYUxvYywgMywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMo
Z2wuRkxPQVQpLCA0ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKK3Nob3VsZEJlKCdnbC5n
ZXRFcnJvcigpJywgJzAnKTsKK3Nob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wu
VFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRF
cnJvcigpJywgJzAnKTsKKwogc3VjY2Vzc2Z1bGx5UGFyc2VkID0gdHJ1ZTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>52895</attachid>
            <date>2010-04-08 14:08:48 -0700</date>
            <delta_ts>2010-04-15 19:01:44 -0700</delta_ts>
            <desc>revised patch: minor modification as Ken Russell suggested</desc>
            <filename>validation.patch</filename>
            <type>text/plain</type>
            <size>11993</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTkgQEAKKzIwMTAtMDQtMDcgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4K
KworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleCB2
YWxpZGF0aW9uIGNvZGUgdmFsaWRhdGVzIHRvbyBtYW55IHZlcnRleCBhdHRyaWJ1dGVzCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTg5MgorCisgICAg
ICAgICogaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6Oldl
YkdMUHJvZ3JhbTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBDYWNoZSBhY3RpdmUgYXR0
cmlidXRlIGxvY2F0aW9ucyBmb3IgYSBwcm9ncmFtIGF0IGxpbmtQcm9ncmFtIHRpbWUuCisgICAg
ICAgIChXZWJDb3JlOjpXZWJHTFByb2dyYW06OmdldEFjdGl2ZUF0dHJpYkxvY2F0aW9uKTogR2V0
IHRoZSBjYWNoZWQgYXR0cmlidXRlIGxvY2F0aW9uLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xQ
cm9ncmFtOjpudW1BY3RpdmVBdHRyaWJMb2NhdGlvbnMpOiBHZXQgdGhlIG51bWJlciBvZiBjYWNo
ZWQgYXR0cmlidXRlIGxvY2F0aW9ucy4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9XZWJHTFByb2dy
YW0uaDogQWRkIGF0dHJpYnV0ZSBsb2NhdGlvbnMgbWVtYmVyLgorICAgICAgICAqIGh0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJl
bmRlcmluZ0NvbnRleHQ6OnZhbGlkYXRlUmVuZGVyaW5nU3RhdGUpOiBBZGQgbG9naWMgbm90IHRv
IHZhbGlkYXRlIHRob3NlIGF0dHJpYnV0ZXMgdGhhdCBkbyBub3QgYmVsb25nIHRvIHRoZSBjdXJy
ZW50IHByb2dyYW0uCisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6Omxp
bmtQcm9ncmFtKTogQ2FsbCBjYWNoZUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpLgorCiAyMDEwLTA0
LTA3ICBKaWFuIExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBi
eSBBZGFtIEJhcnRoIGFuZCBEbWl0cnkgVGl0b3YuCkluZGV4OiBXZWJDb3JlL2h0bWwvY2FudmFz
L1dlYkdMUHJvZ3JhbS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJH
TFByb2dyYW0uY3BwCShyZXZpc2lvbiA1NzI0MCkKKysrIFdlYkNvcmUvaHRtbC9jYW52YXMvV2Vi
R0xQcm9ncmFtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDgsNiArNDgsNDEgQEAgdm9pZCBXZWJH
TFByb2dyYW06Ol9kZWxldGVPYmplY3QoUGxhdGZvcgogICAgIGNvbnRleHQoKS0+Z3JhcGhpY3ND
b250ZXh0M0QoKS0+ZGVsZXRlUHJvZ3JhbShvYmplY3QpOwogfQogCitib29sIFdlYkdMUHJvZ3Jh
bTo6Y2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKQoreworICAgIG1fYWN0aXZlQXR0cmliTG9j
YXRpb25zLmNsZWFyKCk7CisgICAgaWYgKCFvYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIEdyYXBoaWNzQ29udGV4dDNEKiBjb250ZXh0M2QgPSBjb250ZXh0KCktPmdyYXBoaWNz
Q29udGV4dDNEKCk7CisgICAgaW50IGxpbmtTdGF0dXM7CisgICAgY29udGV4dDNkLT5nZXRQcm9n
cmFtaXYodGhpcywgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTktfU1RBVFVTLCAmbGlua1N0YXR1cyk7
CisgICAgaWYgKCFsaW5rU3RhdHVzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQg
bnVtQXR0cmlicyA9IDA7CisgICAgY29udGV4dDNkLT5nZXRQcm9ncmFtaXYodGhpcywgR3JhcGhp
Y3NDb250ZXh0M0Q6OkFDVElWRV9BVFRSSUJVVEVTLCAmbnVtQXR0cmlicyk7CisgICAgbV9hY3Rp
dmVBdHRyaWJMb2NhdGlvbnMucmVzaXplKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQXR0cmlicykp
OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXR0cmliczsgKytpKSB7CisgICAgICAgIEFj
dGl2ZUluZm8gaW5mbzsKKyAgICAgICAgY29udGV4dDNkLT5nZXRBY3RpdmVBdHRyaWIodGhpcywg
aSwgaW5mbyk7CisgICAgICAgIG1fYWN0aXZlQXR0cmliTG9jYXRpb25zW2ldID0gY29udGV4dDNk
LT5nZXRBdHRyaWJMb2NhdGlvbih0aGlzLCBpbmZvLm5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBXZWJHTFBy
b2dyYW06Om51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpCit7CisgICAgcmV0dXJuIHN0YXRpY19j
YXN0PGludD4obV9hY3RpdmVBdHRyaWJMb2NhdGlvbnMuc2l6ZSgpKTsKK30KKworaW50IFdlYkdM
UHJvZ3JhbTo6Z2V0QWN0aXZlQXR0cmliTG9jYXRpb24oaW50IGluZGV4KQoreworICAgIGlmIChp
bmRleCA8IDAgfHwgaW5kZXggPj0gbnVtQWN0aXZlQXR0cmliTG9jYXRpb25zKCkpCisgICAgICAg
IHJldHVybiAtMTsKKyAgICByZXR1cm4gbV9hY3RpdmVBdHRyaWJMb2NhdGlvbnNbc3RhdGljX2Nh
c3Q8c2l6ZV90PihpbmRleCldOworfQorCiB9CiAKICNlbmRpZiAvLyBFTkFCTEUoM0RfQ0FOVkFT
KQpJbmRleDogV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFByb2dyYW0uaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUHJvZ3JhbS5oCShyZXZpc2lvbiA1NzI0MCkKKysr
IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xQcm9ncmFtLmgJKHdvcmtpbmcgY29weSkKQEAgLTMw
LDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CiAjaW5jbHVkZSA8d3Rm
L1JlZkNvdW50ZWQuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9yLmg+CiAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICAKQEAgLTM4LDExICszOSwyMCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAg
ICAgIHZpcnR1YWwgfldlYkdMUHJvZ3JhbSgpIHsgZGVsZXRlT2JqZWN0KCk7IH0KICAgICAgICAg
CiAgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdlYkdMUHJvZ3JhbT4gY3JlYXRlKFdlYkdMUmVu
ZGVyaW5nQ29udGV4dCopOworCisgICAgICAgIC8vIGNhY2hlQWN0aXZlQXR0cmliTG9jYXRpb24o
KSBpcyBvbmx5IGNhbGxlZCBvbmNlIGFmdGVyIGxpbmtQcm9ncmFtKCkKKyAgICAgICAgLy8gc3Vj
Y2VlZHMuCisgICAgICAgIGJvb2wgY2FjaGVBY3RpdmVBdHRyaWJMb2NhdGlvbnMoKTsKKyAgICAg
ICAgaW50IG51bUFjdGl2ZUF0dHJpYkxvY2F0aW9ucygpOworICAgICAgICBpbnQgZ2V0QWN0aXZl
QXR0cmliTG9jYXRpb24oaW50IGluZGV4KTsKICAgICAgICAgCiAgICAgcHJvdGVjdGVkOgogICAg
ICAgICBXZWJHTFByb2dyYW0oV2ViR0xSZW5kZXJpbmdDb250ZXh0Kik7CiAgICAgICAgIAogICAg
ICAgICB2aXJ0dWFsIHZvaWQgX2RlbGV0ZU9iamVjdChQbGF0Zm9ybTNET2JqZWN0KTsKKworICAg
IHByaXZhdGU6CisgICAgICAgIFZlY3RvcjxpbnQ+IG1fYWN0aXZlQXR0cmliTG9jYXRpb25zOwog
ICAgIH07CiAgICAgCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL2h0bWwv
Y2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9o
dG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCShyZXZpc2lvbiA1NzI0MCkKKysr
IFdlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjg4LDEyICs2ODgsMjAgQEAgYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OnZh
bGlkYXRlSW5kZQogCiBib29sIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6dmFsaWRhdGVSZW5kZXJp
bmdTdGF0ZShsb25nIG51bUVsZW1lbnRzUmVxdWlyZWQpCiB7CisgICAgaWYgKCFtX2N1cnJlbnRQ
cm9ncmFtKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKICAgICAvLyBMb29rIGluIGVhY2ggZW5h
YmxlZCB2ZXJ0ZXggYXR0cmliIGFuZCBmaW5kIHRoZSBzbWFsbGVzdCBidWZmZXIgc2l6ZQogICAg
IGxvbmcgc21hbGxlc3ROdW1FbGVtZW50cyA9IExPTkdfTUFYOwotICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBtX3ZlcnRleEF0dHJpYlN0YXRlLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNv
bnN0IFZlcnRleEF0dHJpYlN0YXRlJiBzdGF0ZSA9IG1fdmVydGV4QXR0cmliU3RhdGVbaV07Ci0g
ICAgICAgIGlmIChzdGF0ZS5lbmFibGVkICYmIHN0YXRlLm51bUVsZW1lbnRzIDwgc21hbGxlc3RO
dW1FbGVtZW50cykKLSAgICAgICAgICAgIHNtYWxsZXN0TnVtRWxlbWVudHMgPSBzdGF0ZS5udW1F
bGVtZW50czsKKyAgICBpbnQgbnVtQWN0aXZlQXR0cmliTG9jYXRpb25zID0gbV9jdXJyZW50UHJv
Z3JhbS0+bnVtQWN0aXZlQXR0cmliTG9jYXRpb25zKCk7CisgICAgaW50IG51bUF0dHJpYlN0YXRl
cyA9IHN0YXRpY19jYXN0PGludD4obV92ZXJ0ZXhBdHRyaWJTdGF0ZS5zaXplKCkpOworICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgbnVtQWN0aXZlQXR0cmliTG9jYXRpb25zOyArK2kpIHsKKyAgICAg
ICAgaW50IGxvYyA9IG1fY3VycmVudFByb2dyYW0tPmdldEFjdGl2ZUF0dHJpYkxvY2F0aW9uKGkp
OworICAgICAgICBpZiAobG9jID49MCAmJiBsb2MgPCBudW1BdHRyaWJTdGF0ZXMpIHsKKyAgICAg
ICAgICAgIGNvbnN0IFZlcnRleEF0dHJpYlN0YXRlJiBzdGF0ZSA9IG1fdmVydGV4QXR0cmliU3Rh
dGVbbG9jXTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5lbmFibGVkICYmIHN0YXRlLm51bUVsZW1l
bnRzIDwgc21hbGxlc3ROdW1FbGVtZW50cykKKyAgICAgICAgICAgICAgICBzbWFsbGVzdE51bUVs
ZW1lbnRzID0gc3RhdGUubnVtRWxlbWVudHM7CisgICAgICAgIH0KICAgICB9CiAgICAgCiAgICAg
aWYgKHNtYWxsZXN0TnVtRWxlbWVudHMgPT0gTE9OR19NQVgpCkBAIC0xNTY4LDYgKzE1NzYsNyBA
QCB2b2lkIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6bGlua1Byb2dyYW0oCiAgICAgfQogICAgICAg
ICAKICAgICBtX2NvbnRleHQtPmxpbmtQcm9ncmFtKHByb2dyYW0pOworICAgIHByb2dyYW0tPmNh
Y2hlQWN0aXZlQXR0cmliTG9jYXRpb25zKCk7CiAgICAgY2xlYW51cEFmdGVyR3JhcGhpY3NDYWxs
KGZhbHNlKTsKIH0KIApJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gNTcyNDApCisrKyBMYXlvdXRUZXN0cy9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxMyBAQAorMjAxMC0wNC0wNyAgWmhl
bnlhbyBNbyAgPHptb0Bnb29nbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIEluZGV4IHZhbGlkYXRpb24gY29kZSB2YWxpZGF0ZXMgdG9vIG1h
bnkgdmVydGV4IGF0dHJpYnV0ZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTMxODkyCisKKyAgICAgICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9pbmRleC12
YWxpZGF0aW9uLWV4cGVjdGVkLnR4dDogQWRkIG5ldyB0ZXN0IGNhc2VzIGZvciBpbmRleCB2YWxp
ZGF0aW9ucy4KKyAgICAgICAgKiBmYXN0L2NhbnZhcy93ZWJnbC9zY3JpcHQtdGVzdHMvaW5kZXgt
dmFsaWRhdGlvbi5qczogRGl0dG8uCisKIDIwMTAtMDQtMDcgIEVyaWsgQXJ2aWRzc29uICA8YXJ2
QGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIEJhcnRoLgpJbmRleDog
TGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvaW5kZXgtdmFsaWRhdGlvbi1leHBlY3RlZC50
eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvaW5kZXgtdmFs
aWRhdGlvbi1leHBlY3RlZC50eHQJKHJldmlzaW9uIDU3MjQwKQorKysgTGF5b3V0VGVzdHMvZmFz
dC9jYW52YXMvd2ViZ2wvaW5kZXgtdmFsaWRhdGlvbi1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29w
eSkKQEAgLTEsMTEgKzEsMzAgQEAKLVRlc3Qgb2YgZ2V0IGNhbGxzIGFnYWluc3QgR0wgb2JqZWN0
cyBsaWtlIGdldEJ1ZmZlclBhcmFtZXRlciwgZXRjLgorVGVzdCBvZiB2YWxpZGF0aW5nIGluZGlj
ZXMgZm9yIGRyYXdFbGVtZW50cygpLgogCiBPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBzZXJp
ZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCiAKK1Rl
c3Rpbmcgd2l0aCB2YWxpZCBpbmRpY2VzCiBQQVNTIGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMo
Z2wuRlJBTUVCVUZGRVIpIGlzIGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFCiBQQVNTIGdsLmdldEVy
cm9yKCkgaXMgMAogUEFTUyBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJ
R05FRF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVkLgogUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1Rl
c3Rpbmcgd2l0aCBvdXQtb2YtcmFuZ2UgaW5kaWNlcworRW5hYmxlIHZlcnRpY2VzLCB2YWxpZAor
UEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xF
UywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wuZ2V0RXJy
b3IoKSBpcyAwCitFbmFibGUgbm9ybWFscywgb3V0LW9mLXJhbmdlCitQQVNTIGdsLmdldEVycm9y
KCkgaXMgMAorUEFTUyBnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05F
RF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVkLgorUEFTUyBnbC5nZXRFcnJvcigpIGlzIGdsLklOVkFM
SURfT1BFUkFUSU9OCitUZXN0IHdpdGggZW5hYmxlZCBhdHRyaWJ1dGUgdGhhdCBkb2VzIG5vdCBi
ZWxvbmcgdG8gY3VycmVudCBwcm9ncmFtCitFbmFibGUgYW4gZXh0cmEgYXR0cmlidXRlIHdpdGgg
bnVsbAorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKK1BBU1MgZ2wuZHJhd0VsZW1lbnRzKGdsLlRS
SUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQsIDApIGlzIHVuZGVmaW5lZC4KK1BBU1MgZ2wu
Z2V0RXJyb3IoKSBpcyAwCitFbmFibGUgYW4gZXh0cmEgYXR0cmlidXRlIHdpdGggaW5zdWZmaWNp
ZW50IGRhdGEgYnVmZmVyCitQQVNTIGdsLmdldEVycm9yKCkgaXMgMAorUEFTUyBnbC5kcmF3RWxl
bWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCkgaXMgdW5kZWZpbmVk
LgorUEFTUyBnbC5nZXRFcnJvcigpIGlzIDAKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRy
dWUKIAogVEVTVCBDT01QTEVURQpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wv
c2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVz
dHMvZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRlc3RzL2luZGV4LXZhbGlkYXRpb24uanMJKHJl
dmlzaW9uIDU3MjQwKQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvc2NyaXB0LXRl
c3RzL2luZGV4LXZhbGlkYXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTEsMjAgKzEsMjcgQEAK
LWRlc2NyaXB0aW9uKCJUZXN0IG9mIGdldCBjYWxscyBhZ2FpbnN0IEdMIG9iamVjdHMgbGlrZSBn
ZXRCdWZmZXJQYXJhbWV0ZXIsIGV0Yy4iKTsKK2Rlc2NyaXB0aW9uKCJUZXN0IG9mIHZhbGlkYXRp
bmcgaW5kaWNlcyBmb3IgZHJhd0VsZW1lbnRzKCkuIik7CiAKIHZhciBnbCA9IGNyZWF0ZTNEQ29u
dGV4dCgpOwogdmFyIHByb2dyYW0gPSBsb2FkU3RhbmRhcmRQcm9ncmFtKGdsKTsKIAogLy8gMyB2
ZXJ0aWNlcyA9PiAxIHRyaWFuZ2xlLCBpbnRlcmxlYXZlZCBkYXRhCi12YXIgZGF0YSA9IG5ldyBX
ZWJHTEZsb2F0QXJyYXkoWzAsIDAsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIDAsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDAsIDEs
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIDAsIDAsIDFdKTsKK3ZhciBkYXRhQ29tcGxldGUgPSBuZXcgV2ViR0xGbG9hdEFycmF5
KFswLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAs
IDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMCwg
MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAxLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMV0pOwordmFyIGRhdGFJbmNv
bXBsZXRlID0gbmV3IFdlYkdMRmxvYXRBcnJheShbMCwgMCwgMCwgMSwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDEsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIDEsIDEsIDEsIDFdKTsKIHZhciBpbmRpY2VzID0gbmV3IFdlYkdMVW5z
aWduZWRTaG9ydEFycmF5KFswLCAxLCAyXSk7CiAKLXZhciBidWZmZXIgPSBnbC5jcmVhdGVCdWZm
ZXIoKTsKLWdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpOwotZ2wuYnVmZmVy
RGF0YShnbC5BUlJBWV9CVUZGRVIsIGRhdGEsIGdsLlNUQVRJQ19EUkFXKTsKK2RlYnVnKCJUZXN0
aW5nIHdpdGggdmFsaWQgaW5kaWNlcyIpOworCit2YXIgYnVmZmVyQ29tcGxldGUgPSBnbC5jcmVh
dGVCdWZmZXIoKTsKK2dsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXJDb21wbGV0
ZSk7CitnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YUNvbXBsZXRlLCBnbC5TVEFU
SUNfRFJBVyk7CiB2YXIgZWxlbWVudHMgPSBnbC5jcmVhdGVCdWZmZXIoKTsKIGdsLmJpbmRCdWZm
ZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGVsZW1lbnRzKTsKIGdsLmJ1ZmZlckRhdGEoZ2wu
RUxFTUVOVF9BUlJBWV9CVUZGRVIsIGluZGljZXMsIGdsLlNUQVRJQ19EUkFXKTsKQEAgLTIzLDEx
ICszMCw0NSBAQCB2YXIgdmVydGV4TG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvCiB2YXIg
bm9ybWFsTG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgImFfbm9ybWFsIik7CiBn
bC52ZXJ0ZXhBdHRyaWJQb2ludGVyKHZlcnRleExvYywgNCwgZ2wuRkxPQVQsIGZhbHNlLCA3ICog
Z2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAwKTsKIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5
KHZlcnRleExvYyk7Ci1nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG5vcm1hbExvYywgMywgZ2wuRkxP
QVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCAzICogZ2wuc2l6ZUluQnl0
ZXMoZ2wuRkxPQVQpKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50ZXIobm9ybWFsTG9jLCAzLCBnbC5G
TE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDQgKiBnbC5zaXplSW5C
eXRlcyhnbC5GTE9BVCkpOwogZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobm9ybWFsTG9jKTsK
IHNob3VsZEJlKCdnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKScsICdn
bC5GUkFNRUJVRkZFUl9DT01QTEVURScpOwogc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcp
Owogc2hvdWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGds
LlVOU0lHTkVEX1NIT1JULCAwKScpOwogc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOwog
CitkZWJ1ZygiVGVzdGluZyB3aXRoIG91dC1vZi1yYW5nZSBpbmRpY2VzIik7CisKK3ZhciBidWZm
ZXJJbmNvbXBsZXRlID0gZ2wuY3JlYXRlQnVmZmVyKCk7CitnbC5iaW5kQnVmZmVyKGdsLkFSUkFZ
X0JVRkZFUiwgYnVmZmVySW5jb21wbGV0ZSk7CitnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZF
UiwgZGF0YUluY29tcGxldGUsIGdsLlNUQVRJQ19EUkFXKTsKK2dsLnZlcnRleEF0dHJpYlBvaW50
ZXIodmVydGV4TG9jLCA0LCBnbC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5G
TE9BVCksIDApOworZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkodmVydGV4TG9jKTsKK2dsLmRp
c2FibGVWZXJ0ZXhBdHRyaWJBcnJheShub3JtYWxMb2MpOworZGVidWcoIkVuYWJsZSB2ZXJ0aWNl
cywgdmFsaWQiKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKK3Nob3VsZEJlVW5k
ZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5HTEVTLCAzLCBnbC5VTlNJR05FRF9TSE9S
VCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigpJywgJzAnKTsKK2RlYnVnKCJFbmFibGUg
bm9ybWFscywgb3V0LW9mLXJhbmdlIik7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKG5vcm1hbExv
YywgMywgZ2wuRkxPQVQsIGZhbHNlLCA3ICogZ2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpLCA0ICog
Z2wuc2l6ZUluQnl0ZXMoZ2wuRkxPQVQpKTsKK2dsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KG5v
cm1hbExvYyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICcwJyk7CitzaG91bGRCZVVuZGVm
aW5lZCgnZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgMywgZ2wuVU5TSUdORURfU0hPUlQs
IDApJyk7CitzaG91bGRCZSgnZ2wuZ2V0RXJyb3IoKScsICdnbC5JTlZBTElEX09QRVJBVElPTicp
OworCitkZWJ1ZygiVGVzdCB3aXRoIGVuYWJsZWQgYXR0cmlidXRlIHRoYXQgZG9lcyBub3QgYmVs
b25nIHRvIGN1cnJlbnQgcHJvZ3JhbSIpOworCitnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXko
bm9ybWFsTG9jKTsKK3ZhciBleHRyYUxvYyA9IE1hdGgubWF4KHZlcnRleExvYywgbm9ybWFsTG9j
KSArIDE7CitnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShleHRyYUxvYyk7CitkZWJ1ZygiRW5h
YmxlIGFuIGV4dHJhIGF0dHJpYnV0ZSB3aXRoIG51bGwiKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJv
cigpJywgJzAnKTsKK3Nob3VsZEJlVW5kZWZpbmVkKCdnbC5kcmF3RWxlbWVudHMoZ2wuVFJJQU5H
TEVTLCAzLCBnbC5VTlNJR05FRF9TSE9SVCwgMCknKTsKK3Nob3VsZEJlKCdnbC5nZXRFcnJvcigp
JywgJzAnKTsKK2RlYnVnKCJFbmFibGUgYW4gZXh0cmEgYXR0cmlidXRlIHdpdGggaW5zdWZmaWNp
ZW50IGRhdGEgYnVmZmVyIik7CitnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGV4dHJhTG9jLCAzLCBn
bC5GTE9BVCwgZmFsc2UsIDcgKiBnbC5zaXplSW5CeXRlcyhnbC5GTE9BVCksIDQgKiBnbC5zaXpl
SW5CeXRlcyhnbC5GTE9BVCkpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworc2hv
dWxkQmVVbmRlZmluZWQoJ2dsLmRyYXdFbGVtZW50cyhnbC5UUklBTkdMRVMsIDMsIGdsLlVOU0lH
TkVEX1NIT1JULCAwKScpOworc2hvdWxkQmUoJ2dsLmdldEVycm9yKCknLCAnMCcpOworCiBzdWNj
ZXNzZnVsbHlQYXJzZWQgPSB0cnVlOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>