<?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>69913</bug_id>
          
          <creation_ts>2011-10-12 01:26:39 -0700</creation_ts>
          <short_desc>Use realloc() to expand/shrink StringBuilder buffer</short_desc>
          <delta_ts>2012-01-30 13:36:40 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Xianzhu Wang">wangxianzhu</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>kpiascik</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yong.li.webkit</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>482291</commentid>
    <comment_count>0</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2011-10-12 01:26:39 -0700</bug_when>
    <thetext>For now StringBuilder uses malloc(StringImpl::createUninitialized()) and memcpy to expand and shrink buffers. I found that replace them with realloc() can reduce many unnecessary actual allocations and copies. Experiments showed that where realloc() is applicable, 45.3% of realloc()s return the same pointer as the input i.e. no actual copies.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>482306</commentid>
    <comment_count>1</comment_count>
      <attachid>110654</attachid>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2011-10-12 02:09:52 -0700</bug_when>
    <thetext>Created attachment 110654
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>482309</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-12 02:11:58 -0700</bug_when>
    <thetext>Attachment 110654 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/JavaScriptCore/ChangeLog&apos;, u&apos;Source...&quot; exit_code: 1

Source/JavaScriptCore/wtf/text/StringImpl.h:187:  The parameter name &quot;impl&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/JavaScriptCore/wtf/text/StringImpl.cpp:111:  Local variables should never be PassRefPtr (see http://webkit.org/coding/RefPtr.html).  [readability/pass_ptr] [5]
Total errors found: 2 in 5 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>482331</commentid>
    <comment_count>3</comment_count>
      <attachid>110654</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2011-10-12 03:35:39 -0700</bug_when>
    <thetext>Comment on attachment 110654
patch

Attachment 110654 did not pass qt-ews (qt):
Output: http://queues.webkit.org/results/10026841</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>482471</commentid>
    <comment_count>4</comment_count>
      <attachid>110654</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-10-12 09:50:23 -0700</bug_when>
    <thetext>Comment on attachment 110654
patch

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

review- because of the EWS build failures

&gt; Source/JavaScriptCore/wtf/text/StringBuilder.cpp:110
&gt; +    // otherwise fallback to &quot;allocate and copy&quot; method.

The verb is “fall back”. The word “fallback” is a noun. This should say “fall back”.

&gt; Source/JavaScriptCore/wtf/text/StringImpl.cpp:93
&gt; +PassRefPtr&lt;StringImpl&gt; StringImpl::reallocate(PassRefPtr&lt;StringImpl&gt; impl, unsigned length, UChar*&amp; data)

I think “impl” is a strange name for this argument. You could just as easily call it “string”. I’d probably call it oldString or existingString or originalString.

&gt; Source/JavaScriptCore/wtf/text/StringImpl.cpp:112
&gt; +    PassRefPtr&lt;StringImpl&gt; result = adoptRef(new (string) StringImpl(length));
&gt; +    return result;

The style bot is right to complain about the use of PassRefPtr. The best way to fix it here is to just call it right in the return statement.

&gt;&gt; Source/JavaScriptCore/wtf/text/StringImpl.h:187
&gt;&gt; +    static PassRefPtr&lt;StringImpl&gt; reallocate(PassRefPtr&lt;StringImpl&gt; impl, unsigned length, UChar*&amp; data);
&gt; 
&gt; The parameter name &quot;impl&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]

I agree with the style bot on this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>482959</commentid>
    <comment_count>5</comment_count>
      <attachid>110654</attachid>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2011-10-12 19:06:00 -0700</bug_when>
    <thetext>Comment on attachment 110654
patch

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

Thanks Darin for review. I shouldn&apos;t have been that hurry going home without running check-webkit-style and checking carefully :)

&gt;&gt; Source/JavaScriptCore/wtf/text/StringBuilder.cpp:110
&gt;&gt; +    // otherwise fallback to &quot;allocate and copy&quot; method.
&gt; 
&gt; The verb is “fall back”. The word “fallback” is a noun. This should say “fall back”.

Done.

&gt;&gt; Source/JavaScriptCore/wtf/text/StringImpl.cpp:93
&gt;&gt; +PassRefPtr&lt;StringImpl&gt; StringImpl::reallocate(PassRefPtr&lt;StringImpl&gt; impl, unsigned length, UChar*&amp; data)
&gt; 
&gt; I think “impl” is a strange name for this argument. You could just as easily call it “string”. I’d probably call it oldString or existingString or originalString.

Changed to originalString.

&gt;&gt; Source/JavaScriptCore/wtf/text/StringImpl.cpp:112
&gt;&gt; +    return result;
&gt; 
&gt; The style bot is right to complain about the use of PassRefPtr. The best way to fix it here is to just call it right in the return statement.

Done. This was caused by incomplete debug code cleanup.

&gt;&gt;&gt; Source/JavaScriptCore/wtf/text/StringImpl.h:187
&gt;&gt;&gt; +    static PassRefPtr&lt;StringImpl&gt; reallocate(PassRefPtr&lt;StringImpl&gt; impl, unsigned length, UChar*&amp; data);
&gt;&gt; 
&gt;&gt; The parameter name &quot;impl&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
&gt; 
&gt; I agree with the style bot on this.

Changed to originalString and use that name in the comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>482960</commentid>
    <comment_count>6</comment_count>
      <attachid>110792</attachid>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2011-10-12 19:08:46 -0700</bug_when>
    <thetext>Created attachment 110792
patch v2</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>483257</commentid>
    <comment_count>7</comment_count>
      <attachid>110792</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-13 10:00:05 -0700</bug_when>
    <thetext>Comment on attachment 110792
patch v2

Clearing flags on attachment: 110792

Committed r97371: &lt;http://trac.webkit.org/changeset/97371&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>483258</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-13 10:00:09 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545213</commentid>
    <comment_count>9</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2012-01-30 10:54:31 -0800</bug_when>
    <thetext>While it boosts performance, it also costs memory usage. Are we sure we really want it? Especially in shrinkToFit. In that function we check the length and see if we should shrink memory. When we decide to shrink memory, we are sure we want to create a new copy. But with your patch, it depends on how realloc is implemented. The more frequently you see realloc returns the same pointer, the more memory waste is happening. The buffer will not be destroyed when StringBuilder destructs in most cases, instead, it will be held by WTF::String object returned by toString, and can live with some JS object. So I suggest to revert this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545291</commentid>
    <comment_count>10</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-01-30 12:14:28 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; The more frequently you see realloc returns the same pointer, the more memory waste is happening.

Could you explain more about the above sentence?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545300</commentid>
    <comment_count>11</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2012-01-30 12:25:28 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; The more frequently you see realloc returns the same pointer, the more memory waste is happening.
&gt; 
&gt; Could you explain more about the above sentence?

When realloc returns same pointer, it means the new size is smaller than the old or original size, and the memory allocator can reuse the original memory block. Usually (there are specials), the memory allocator doesn&apos;t free the rest of the memory block that is not used any more. For eample, the original buffer in StringBuilder is 2K, but the length is 512 bytes. When the string build job finishes, StringBuilder::toString() calls shrinkToFit(), which is supposed to allocate a new 512-byte buffer and free the 2K buffer. But with the patch, realloc can still use the 2K buffer which leaves 1.5K waste.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545312</commentid>
    <comment_count>12</comment_count>
    <who name="Xianzhu Wang">wangxianzhu</who>
    <bug_when>2012-01-30 12:35:10 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; The more frequently you see realloc returns the same pointer, the more memory waste is happening.
&gt; &gt; 
&gt; &gt; Could you explain more about the above sentence?
&gt; 
&gt; When realloc returns same pointer, it means the new size is smaller than the old or original size, and the memory allocator can reuse the original memory block. Usually (there are specials), the memory allocator doesn&apos;t free the rest of the memory block that is not used any more. For eample, the original buffer in StringBuilder is 2K, but the length is 512 bytes. When the string build job finishes, StringBuilder::toString() calls shrinkToFit(), which is supposed to allocate a new 512-byte buffer and free the 2K buffer. But with the patch, realloc can still use the 2K buffer which leaves 1.5K waste.

Could you provide link of memory allocator which works like this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>545370</commentid>
    <comment_count>13</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2012-01-30 13:36:40 -0800</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; (In reply to comment #10)
&gt; &gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; &gt; The more frequently you see realloc returns the same pointer, the more memory waste is happening.
&gt; &gt; &gt; 
&gt; &gt; &gt; Could you explain more about the above sentence?
&gt; &gt; 
&gt; &gt; When realloc returns same pointer, it means the new size is smaller than the old or original size, and the memory allocator can reuse the original memory block. Usually (there are specials), the memory allocator doesn&apos;t free the rest of the memory block that is not used any more. For eample, the original buffer in StringBuilder is 2K, but the length is 512 bytes. When the string build job finishes, StringBuilder::toString() calls shrinkToFit(), which is supposed to allocate a new 512-byte buffer and free the 2K buffer. But with the patch, realloc can still use the 2K buffer which leaves 1.5K waste.
&gt; 
&gt; Could you provide link of memory allocator which works like this?

Never mind. It seems it is the memory allocator&apos;s responsibility to reuse the new free space if the new free space is significant. If it cannot, it should try to allocate a new block. Sorry for this</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>110654</attachid>
            <date>2011-10-12 02:09:52 -0700</date>
            <delta_ts>2011-10-12 19:08:46 -0700</delta_ts>
            <desc>patch</desc>
            <filename>69913</filename>
            <type>text/plain</type>
            <size>6550</size>
            <attacher name="Xianzhu Wang">wangxianzhu</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTcyNDMpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTEtMTAtMTIgIFhpYW56aHUgV2FuZyAgPHdhbmd4aWFuemh1QGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBVc2UgcmVhbGxvYygpIHRvIGV4cGFuZC9zaHJpbmsgU3RyaW5nQnVpbGRlciBidWZm
ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTEz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB3dGYv
dGV4dC9TdHJpbmdCdWlsZGVyLmNwcDoKKyAgICAgICAgKFdURjo6U3RyaW5nQnVpbGRlcjo6cmVz
ZXJ2ZUNhcGFjaXR5KToKKyAgICAgICAgKFdURjo6U3RyaW5nQnVpbGRlcjo6cmVhbGxvY2F0ZUJ1
ZmZlcik6CisgICAgICAgIChXVEY6OlN0cmluZ0J1aWxkZXI6OmFwcGVuZFVuaW5pdGlhbGl6ZWQp
OgorICAgICAgICAoV1RGOjpTdHJpbmdCdWlsZGVyOjpzaHJpbmtUb0ZpdCk6CisgICAgICAgICog
d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oOgorICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwu
Y3BwOgorICAgICAgICAoV1RGOjpTdHJpbmdJbXBsOjpyZWFsbG9jYXRlKTogQWRkZWQgdG8gYWxs
b3cgU3RyaW5nQnVpbGRlciB0byByZWFsbG9jYXRlIHRoZSBidWZmZXIuCisgICAgICAgICogd3Rm
L3RleHQvU3RyaW5nSW1wbC5oOgorCiAyMDExLTEwLTEyICBGaWxpcCBQaXpsbyAgPGZwaXpsb0Bh
cHBsZS5jb20+CiAKICAgICAgICAgTGF5b3V0IHRlc3RzIGNyYXNoaW5nIGluIERGRyBKSVQgY29k
ZQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdCdWls
ZGVyLmNwcAkocmV2aXNpb24gOTcxNTkpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3Rl
eHQvU3RyaW5nQnVpbGRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgzLDcgKzgzLDcgQEAgdm9p
ZCBTdHJpbmdCdWlsZGVyOjpyZXNlcnZlQ2FwYWNpdHkodW5zaQogICAgIGlmIChtX2J1ZmZlcikg
ewogICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgYnVmZmVyLCB0aGVuIGdyb3cgaWYg
bmVjZXNzYXJ5LgogICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPiBtX2J1ZmZlci0+bGVuZ3RoKCkp
Ci0gICAgICAgICAgICBhbGxvY2F0ZUJ1ZmZlcihtX2J1ZmZlci0+Y2hhcmFjdGVycygpLCBuZXdD
YXBhY2l0eSk7CisgICAgICAgICAgICByZWFsbG9jYXRlQnVmZmVyKG5ld0NhcGFjaXR5KTsKICAg
ICB9IGVsc2UgewogICAgICAgICAvLyBHcm93IHRoZSBzdHJpbmcsIGlmIG5lY2Vzc2FyeS4KICAg
ICAgICAgaWYgKG5ld0NhcGFjaXR5ID4gbV9sZW5ndGgpCkBAIC0xMDQsMTMgKzEwNCwyNCBAQCB2
b2lkIFN0cmluZ0J1aWxkZXI6OmFsbG9jYXRlQnVmZmVyKGNvbnN0CiAgICAgbV9zdHJpbmcgPSBT
dHJpbmcoKTsKIH0KIAordm9pZCBTdHJpbmdCdWlsZGVyOjpyZWFsbG9jYXRlQnVmZmVyKHVuc2ln
bmVkIHJlcXVpcmVkTGVuZ3RoKQoreworICAgIC8vIElmIHRoZSBidWZmZXIgaGFzIG9ubHkgb25l
IHJlZiAoYnkgdGhpcyBTdHJpbmdCdWlsZGVyKSwgcmVhbGxvY2F0ZSBpdCwKKyAgICAvLyBvdGhl
cndpc2UgZmFsbGJhY2sgdG8gImFsbG9jYXRlIGFuZCBjb3B5IiBtZXRob2QuCisgICAgbV9zdHJp
bmcgPSBTdHJpbmcoKTsKKyAgICBpZiAobV9idWZmZXItPmhhc09uZVJlZigpKQorICAgICAgICBt
X2J1ZmZlciA9IFN0cmluZ0ltcGw6OnJlYWxsb2NhdGUobV9idWZmZXIucmVsZWFzZSgpLCByZXF1
aXJlZExlbmd0aCwgbV9idWZmZXJDaGFyYWN0ZXJzKTsKKyAgICBlbHNlCisgICAgICAgIGFsbG9j
YXRlQnVmZmVyKG1fYnVmZmVyLT5jaGFyYWN0ZXJzKCksIHJlcXVpcmVkTGVuZ3RoKTsKK30KKwog
Ly8gTWFrZSAnbGVuZ3RoJyBhZGRpdGlvbmFsIGNhcGFjaXR5IGJlIGF2YWlsYWJsZSBpbiBtX2J1
ZmZlciwgdXBkYXRlIG1fc3RyaW5nICYgbV9sZW5ndGgsCiAvLyByZXR1cm4gYSBwb2ludGVyIHRv
IHRoZSBuZXdseSBhbGxvY2F0ZWQgc3RvcmFnZS4KIFVDaGFyKiBTdHJpbmdCdWlsZGVyOjphcHBl
bmRVbmluaXRpYWxpemVkKHVuc2lnbmVkIGxlbmd0aCkKIHsKICAgICBBU1NFUlQobGVuZ3RoKTsK
IAotICAgIC8vIENhbGN1YXRlIHRoZSBuZXcgc2l6ZSBvZiB0aGUgYnVpbGRlciBhZnRlciBhcHBl
bmRpbmcuCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgc2l6ZSBvZiB0aGUgYnVpbGRlciBhZnRl
ciBhcHBlbmRpbmcuCiAgICAgdW5zaWduZWQgcmVxdWlyZWRMZW5ndGggPSBsZW5ndGggKyBtX2xl
bmd0aDsKICAgICBpZiAocmVxdWlyZWRMZW5ndGggPCBsZW5ndGgpCiAgICAgICAgIENSQVNIKCk7
CkBAIC0xMjcsOCArMTM4LDcgQEAgVUNoYXIqIFN0cmluZ0J1aWxkZXI6OmFwcGVuZFVuaW5pdGlh
bGl6ZQogICAgICAgICAgICAgcmV0dXJuIG1fYnVmZmVyQ2hhcmFjdGVycyArIGN1cnJlbnRMZW5n
dGg7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBXZSBuZWVkIHRvIHJlYWxsb2MgdGhlIGJ1ZmZl
ci4KLSAgICAgICAgYWxsb2NhdGVCdWZmZXIobV9idWZmZXItPmNoYXJhY3RlcnMoKSwgc3RkOjpt
YXgocmVxdWlyZWRMZW5ndGgsIHN0ZDo6bWF4KG1pbmltdW1DYXBhY2l0eSwgbV9idWZmZXItPmxl
bmd0aCgpICogMikpKTsKKyAgICAgICAgcmVhbGxvY2F0ZUJ1ZmZlcihzdGQ6Om1heChyZXF1aXJl
ZExlbmd0aCwgc3RkOjptYXgobWluaW11bUNhcGFjaXR5LCBtX2J1ZmZlci0+bGVuZ3RoKCkgKiAy
KSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFTU0VSVChtX3N0cmluZy5sZW5ndGgoKSA9PSBt
X2xlbmd0aCk7CiAgICAgICAgIGFsbG9jYXRlQnVmZmVyKG1fc3RyaW5nLmNoYXJhY3RlcnMoKSwg
c3RkOjptYXgocmVxdWlyZWRMZW5ndGgsIHN0ZDo6bWF4KG1pbmltdW1DYXBhY2l0eSwgbV9sZW5n
dGggKiAyKSkpOwpAQCAtMTY1LDggKzE3NSw4IEBAIHZvaWQgU3RyaW5nQnVpbGRlcjo6c2hyaW5r
VG9GaXQoKQogICAgIC8vIElmIHRoZSBidWZmZXIgaXMgYXQgbGVhc3QgODAlIGZ1bGwsIGRvbid0
IGJvdGhlciBjb3B5aW5nLiBOZWVkIHRvIHR1bmUgdGhpcyBoZXVyaXN0aWMhCiAgICAgaWYgKG1f
YnVmZmVyICYmIG1fYnVmZmVyLT5sZW5ndGgoKSA+IChtX2xlbmd0aCArIChtX2xlbmd0aCA+PiAy
KSkpIHsKICAgICAgICAgVUNoYXIqIHJlc3VsdDsKLSAgICAgICAgbV9zdHJpbmcgPSBTdHJpbmdJ
bXBsOjpjcmVhdGVVbmluaXRpYWxpemVkKG1fbGVuZ3RoLCByZXN1bHQpOwotICAgICAgICBtZW1j
cHkocmVzdWx0LCBtX2J1ZmZlci0+Y2hhcmFjdGVycygpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1f
bGVuZ3RoKSAqIDIpOyAvLyBUaGlzIGNhbid0IG92ZXJmbG93LgorICAgICAgICByZWFsbG9jYXRl
QnVmZmVyKG1fbGVuZ3RoKTsKKyAgICAgICAgbV9zdHJpbmcgPSBtX2J1ZmZlcjsKICAgICAgICAg
bV9idWZmZXIgPSAwOwogICAgIH0KIH0KSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYv
dGV4dC9TdHJpbmdCdWlsZGVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3Jl
L3d0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaAkocmV2aXNpb24gOTcxNTkpCisrKyBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nQnVpbGRlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0x
MzAsNiArMTMwLDcgQEAgcHVibGljOgogCiBwcml2YXRlOgogICAgIHZvaWQgYWxsb2NhdGVCdWZm
ZXIoY29uc3QgVUNoYXIqIGN1cnJlbnRDaGFyYWN0ZXJzLCB1bnNpZ25lZCByZXF1aXJlZExlbmd0
aCk7CisgICAgdm9pZCByZWFsbG9jYXRlQnVmZmVyKHVuc2lnbmVkIHJlcXVpcmVkTGVuZ3RoKTsK
ICAgICBVQ2hhciogYXBwZW5kVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgpOwogICAgIHZv
aWQgcmVpZnlTdHJpbmcoKTsKIApJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0
L1N0cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYv
dGV4dC9TdHJpbmdJbXBsLmNwcAkocmV2aXNpb24gOTcxNTkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkwLDYgKzkw
LDI4IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXQKICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IChzdHJpbmcpIFN0cmluZ0ltcGwobGVuZ3RoKSk7CiB9CiAKK1Bhc3NS
ZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6cmVhbGxvY2F0ZShQYXNzUmVmUHRyPFN0cmlu
Z0ltcGw+IGltcGwsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqJiBkYXRhKQoreworICAgIEFTU0VS
VChpbXBsLT5oYXNPbmVSZWYoKSAmJiBpbXBsLT5idWZmZXJPd25lcnNoaXAoKSA9PSBCdWZmZXJJ
bnRlcm5hbCk7CisKKyAgICBpZiAoIWxlbmd0aCkgeworICAgICAgICBkYXRhID0gMDsKKyAgICAg
ICAgcmV0dXJuIGVtcHR5KCk7CisgICAgfQorCisgICAgLy8gU2FtZSBhcyBjcmVhdGVVbmluaXRp
YWxpemVkKCkgZXhjZXB0IGhlcmUgd2UgdXNlIGZhc3RSZWFsbG9jLgorICAgIGlmIChsZW5ndGgg
PiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSAtIHNpemVvZihTdHJpbmdJ
bXBsKSkgLyBzaXplb2YoVUNoYXIpKSkKKyAgICAgICAgQ1JBU0goKTsKKyAgICBzaXplX3Qgc2l6
ZSA9IHNpemVvZihTdHJpbmdJbXBsKSArIGxlbmd0aCAqIHNpemVvZihVQ2hhcik7CisgICAgU3Ry
aW5nSW1wbCogb3JpZ2luYWxTdHJpbmcgPSBpbXBsLmxlYWtSZWYoKTsKKyAgICBvcmlnaW5hbFN0
cmluZy0+flN0cmluZ0ltcGwoKTsKKyAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBzdGF0aWNfY2Fz
dDxTdHJpbmdJbXBsKj4oZmFzdFJlYWxsb2Mob3JpZ2luYWxTdHJpbmcsIHNpemUpKTsKKworICAg
IGRhdGEgPSByZWludGVycHJldF9jYXN0PFVDaGFyKj4oc3RyaW5nICsgMSk7CisgICAgUGFzc1Jl
ZlB0cjxTdHJpbmdJbXBsPiByZXN1bHQgPSBhZG9wdFJlZihuZXcgKHN0cmluZykgU3RyaW5nSW1w
bChsZW5ndGgpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCiBQYXNzUmVmUHRyPFN0cmluZ0lt
cGw+IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQg
bGVuZ3RoKQogewogICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3RoKQpJbmRleDogU291cmNl
L0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5oCShyZXZpc2lvbiA5NzE1OSkK
KysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTE4MSw2ICsxODEsMTEgQEAgcHVibGljOgogICAgICAgICByZXR1cm4gYWRvcHRS
ZWYobmV3KHJlc3VsdEltcGwpIFN0cmluZ0ltcGwobGVuZ3RoKSk7CiAgICAgfQogCisgICAgLy8g
UmVhbGxvY2F0ZSB0aGUgU3RyaW5nSW1wbC4gVGhpcyBTdHJpbmdJbXBsIG11c3QgYmUgb25seSBv
d25lZCBieSB0aGUgUGFzc1JlZlB0ciwKKyAgICAvLyBhbmQgdGhlIGJ1ZmZlciBvd25lcnNoaXAg
bXVzdCBiZSBCdWZmZXJJbnRlcm5hbC4gSnVzdCBsaWtlIHRoZSBpbnB1dCBwb2ludGVyIG9mIHJl
YWxsb2MoKSwKKyAgICAvLyB0aGUgaW5wdXQgU3RyaW5nSW1wbCBjYW4ndCBiZSB1c2VkIGFmdGVy
IHRoaXMgZnVuY3Rpb24uCisgICAgc3RhdGljIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gcmVhbGxv
Y2F0ZShQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGltcGwsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIq
JiBkYXRhKTsKKwogICAgIHN0YXRpYyB1bnNpZ25lZCBkYXRhT2Zmc2V0KCkgeyByZXR1cm4gT0JK
RUNUX09GRlNFVE9GKFN0cmluZ0ltcGwsIG1fZGF0YSk7IH0KICAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTdHJpbmdJbXBsPiBjcmVhdGVXaXRoVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGNvbnN0IFN0
cmluZ0ltcGwmKTsKICAgICBzdGF0aWMgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBjcmVhdGVTdHJp
cHBpbmdOdWxsQ2hhcmFjdGVycyhjb25zdCBVQ2hhciosIHVuc2lnbmVkIGxlbmd0aCk7Cg==
</data>
<flag name="review"
          id="108220"
          type_id="1"
          status="-"
          setter="darin"
    />
    <flag name="commit-queue"
          id="108227"
          type_id="3"
          status="-"
          setter="webkit-ews"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>110792</attachid>
            <date>2011-10-12 19:08:46 -0700</date>
            <delta_ts>2011-10-13 10:00:05 -0700</delta_ts>
            <desc>patch v2</desc>
            <filename>69913a</filename>
            <type>text/plain</type>
            <size>6522</size>
            <attacher name="Xianzhu Wang">wangxianzhu</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTcyNjkpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAK
KzIwMTEtMTAtMTIgIFhpYW56aHUgV2FuZyAgPHdhbmd4aWFuemh1QGNocm9taXVtLm9yZz4KKwor
ICAgICAgICBVc2UgcmVhbGxvYygpIHRvIGV4cGFuZC9zaHJpbmsgU3RyaW5nQnVpbGRlciBidWZm
ZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTY5OTEz
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiB3dGYv
dGV4dC9TdHJpbmdCdWlsZGVyLmNwcDoKKyAgICAgICAgKFdURjo6U3RyaW5nQnVpbGRlcjo6cmVz
ZXJ2ZUNhcGFjaXR5KToKKyAgICAgICAgKFdURjo6U3RyaW5nQnVpbGRlcjo6cmVhbGxvY2F0ZUJ1
ZmZlcik6CisgICAgICAgIChXVEY6OlN0cmluZ0J1aWxkZXI6OmFwcGVuZFVuaW5pdGlhbGl6ZWQp
OgorICAgICAgICAoV1RGOjpTdHJpbmdCdWlsZGVyOjpzaHJpbmtUb0ZpdCk6CisgICAgICAgICog
d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oOgorICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwu
Y3BwOgorICAgICAgICAoV1RGOjpTdHJpbmdJbXBsOjpyZWFsbG9jYXRlKTogQWRkZWQgdG8gYWxs
b3cgU3RyaW5nQnVpbGRlciB0byByZWFsbG9jYXRlIHRoZSBidWZmZXIuCisgICAgICAgICogd3Rm
L3RleHQvU3RyaW5nSW1wbC5oOgorCiAyMDExLTEwLTEyICBHdXN0YXZvIE5vcm9uaGEgU2lsdmEg
IDxndXN0YXZvLm5vcm9uaGFAY29sbGFib3JhLmNvLnVrPgogCiAgICAgICAgIEZpeCBidWlsZCB3
aXRoIEdMaWIgMi4zMQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmlu
Z0J1aWxkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4
dC9TdHJpbmdCdWlsZGVyLmNwcAkocmV2aXNpb24gOTcyNjkpCisrKyBTb3VyY2UvSmF2YVNjcmlw
dENvcmUvd3RmL3RleHQvU3RyaW5nQnVpbGRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgzLDcg
KzgzLDcgQEAgdm9pZCBTdHJpbmdCdWlsZGVyOjpyZXNlcnZlQ2FwYWNpdHkodW5zaQogICAgIGlm
IChtX2J1ZmZlcikgewogICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgYnVmZmVyLCB0
aGVuIGdyb3cgaWYgbmVjZXNzYXJ5LgogICAgICAgICBpZiAobmV3Q2FwYWNpdHkgPiBtX2J1ZmZl
ci0+bGVuZ3RoKCkpCi0gICAgICAgICAgICBhbGxvY2F0ZUJ1ZmZlcihtX2J1ZmZlci0+Y2hhcmFj
dGVycygpLCBuZXdDYXBhY2l0eSk7CisgICAgICAgICAgICByZWFsbG9jYXRlQnVmZmVyKG5ld0Nh
cGFjaXR5KTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBHcm93IHRoZSBzdHJpbmcsIGlmIG5l
Y2Vzc2FyeS4KICAgICAgICAgaWYgKG5ld0NhcGFjaXR5ID4gbV9sZW5ndGgpCkBAIC0xMDQsMTMg
KzEwNCwyNCBAQCB2b2lkIFN0cmluZ0J1aWxkZXI6OmFsbG9jYXRlQnVmZmVyKGNvbnN0CiAgICAg
bV9zdHJpbmcgPSBTdHJpbmcoKTsKIH0KIAordm9pZCBTdHJpbmdCdWlsZGVyOjpyZWFsbG9jYXRl
QnVmZmVyKHVuc2lnbmVkIHJlcXVpcmVkTGVuZ3RoKQoreworICAgIC8vIElmIHRoZSBidWZmZXIg
aGFzIG9ubHkgb25lIHJlZiAoYnkgdGhpcyBTdHJpbmdCdWlsZGVyKSwgcmVhbGxvY2F0ZSBpdCwK
KyAgICAvLyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvICJhbGxvY2F0ZSBhbmQgY29weSIgbWV0aG9k
LgorICAgIG1fc3RyaW5nID0gU3RyaW5nKCk7CisgICAgaWYgKG1fYnVmZmVyLT5oYXNPbmVSZWYo
KSkKKyAgICAgICAgbV9idWZmZXIgPSBTdHJpbmdJbXBsOjpyZWFsbG9jYXRlKG1fYnVmZmVyLnJl
bGVhc2UoKSwgcmVxdWlyZWRMZW5ndGgsIG1fYnVmZmVyQ2hhcmFjdGVycyk7CisgICAgZWxzZQor
ICAgICAgICBhbGxvY2F0ZUJ1ZmZlcihtX2J1ZmZlci0+Y2hhcmFjdGVycygpLCByZXF1aXJlZExl
bmd0aCk7Cit9CisKIC8vIE1ha2UgJ2xlbmd0aCcgYWRkaXRpb25hbCBjYXBhY2l0eSBiZSBhdmFp
bGFibGUgaW4gbV9idWZmZXIsIHVwZGF0ZSBtX3N0cmluZyAmIG1fbGVuZ3RoLAogLy8gcmV0dXJu
IGEgcG9pbnRlciB0byB0aGUgbmV3bHkgYWxsb2NhdGVkIHN0b3JhZ2UuCiBVQ2hhciogU3RyaW5n
QnVpbGRlcjo6YXBwZW5kVW5pbml0aWFsaXplZCh1bnNpZ25lZCBsZW5ndGgpCiB7CiAgICAgQVNT
RVJUKGxlbmd0aCk7CiAKLSAgICAvLyBDYWxjdWF0ZSB0aGUgbmV3IHNpemUgb2YgdGhlIGJ1aWxk
ZXIgYWZ0ZXIgYXBwZW5kaW5nLgorICAgIC8vIENhbGN1bGF0ZSB0aGUgbmV3IHNpemUgb2YgdGhl
IGJ1aWxkZXIgYWZ0ZXIgYXBwZW5kaW5nLgogICAgIHVuc2lnbmVkIHJlcXVpcmVkTGVuZ3RoID0g
bGVuZ3RoICsgbV9sZW5ndGg7CiAgICAgaWYgKHJlcXVpcmVkTGVuZ3RoIDwgbGVuZ3RoKQogICAg
ICAgICBDUkFTSCgpOwpAQCAtMTI3LDggKzEzOCw3IEBAIFVDaGFyKiBTdHJpbmdCdWlsZGVyOjph
cHBlbmRVbmluaXRpYWxpemUKICAgICAgICAgICAgIHJldHVybiBtX2J1ZmZlckNoYXJhY3RlcnMg
KyBjdXJyZW50TGVuZ3RoOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gV2UgbmVlZCB0byByZWFs
bG9jIHRoZSBidWZmZXIuCi0gICAgICAgIGFsbG9jYXRlQnVmZmVyKG1fYnVmZmVyLT5jaGFyYWN0
ZXJzKCksIHN0ZDo6bWF4KHJlcXVpcmVkTGVuZ3RoLCBzdGQ6Om1heChtaW5pbXVtQ2FwYWNpdHks
IG1fYnVmZmVyLT5sZW5ndGgoKSAqIDIpKSk7CisgICAgICAgIHJlYWxsb2NhdGVCdWZmZXIoc3Rk
OjptYXgocmVxdWlyZWRMZW5ndGgsIHN0ZDo6bWF4KG1pbmltdW1DYXBhY2l0eSwgbV9idWZmZXIt
Pmxlbmd0aCgpICogMikpKTsKICAgICB9IGVsc2UgewogICAgICAgICBBU1NFUlQobV9zdHJpbmcu
bGVuZ3RoKCkgPT0gbV9sZW5ndGgpOwogICAgICAgICBhbGxvY2F0ZUJ1ZmZlcihtX3N0cmluZy5j
aGFyYWN0ZXJzKCksIHN0ZDo6bWF4KHJlcXVpcmVkTGVuZ3RoLCBzdGQ6Om1heChtaW5pbXVtQ2Fw
YWNpdHksIG1fbGVuZ3RoICogMikpKTsKQEAgLTE2NCw5ICsxNzQsOCBAQCB2b2lkIFN0cmluZ0J1
aWxkZXI6OnNocmlua1RvRml0KCkKIHsKICAgICAvLyBJZiB0aGUgYnVmZmVyIGlzIGF0IGxlYXN0
IDgwJSBmdWxsLCBkb24ndCBib3RoZXIgY29weWluZy4gTmVlZCB0byB0dW5lIHRoaXMgaGV1cmlz
dGljIQogICAgIGlmIChtX2J1ZmZlciAmJiBtX2J1ZmZlci0+bGVuZ3RoKCkgPiAobV9sZW5ndGgg
KyAobV9sZW5ndGggPj4gMikpKSB7Ci0gICAgICAgIFVDaGFyKiByZXN1bHQ7Ci0gICAgICAgIG1f
c3RyaW5nID0gU3RyaW5nSW1wbDo6Y3JlYXRlVW5pbml0aWFsaXplZChtX2xlbmd0aCwgcmVzdWx0
KTsKLSAgICAgICAgbWVtY3B5KHJlc3VsdCwgbV9idWZmZXItPmNoYXJhY3RlcnMoKSwgc3RhdGlj
X2Nhc3Q8c2l6ZV90PihtX2xlbmd0aCkgKiAyKTsgLy8gVGhpcyBjYW4ndCBvdmVyZmxvdy4KKyAg
ICAgICAgcmVhbGxvY2F0ZUJ1ZmZlcihtX2xlbmd0aCk7CisgICAgICAgIG1fc3RyaW5nID0gbV9i
dWZmZXI7CiAgICAgICAgIG1fYnVmZmVyID0gMDsKICAgICB9CiB9CkluZGV4OiBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nQnVpbGRlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdCdWlsZGVyLmgJKHJldmlzaW9uIDk3MjY5
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0J1aWxkZXIuaAkod29y
a2luZyBjb3B5KQpAQCAtMTMwLDYgKzEzMCw3IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB2
b2lkIGFsbG9jYXRlQnVmZmVyKGNvbnN0IFVDaGFyKiBjdXJyZW50Q2hhcmFjdGVycywgdW5zaWdu
ZWQgcmVxdWlyZWRMZW5ndGgpOworICAgIHZvaWQgcmVhbGxvY2F0ZUJ1ZmZlcih1bnNpZ25lZCBy
ZXF1aXJlZExlbmd0aCk7CiAgICAgVUNoYXIqIGFwcGVuZFVuaW5pdGlhbGl6ZWQodW5zaWduZWQg
bGVuZ3RoKTsKICAgICB2b2lkIHJlaWZ5U3RyaW5nKCk7CiAKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDk3MjY5KQorKysg
U291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC05MCw2ICs5MCwyNiBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6
OmNyZWF0CiAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyAoc3RyaW5nKSBTdHJpbmdJbXBsKGxlbmd0
aCkpOwogfQogCitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OnJlYWxsb2NhdGUo
UGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBvcmlnaW5hbFN0cmluZywgdW5zaWduZWQgbGVuZ3RoLCBV
Q2hhciomIGRhdGEpCit7CisgICAgQVNTRVJUKG9yaWdpbmFsU3RyaW5nLT5oYXNPbmVSZWYoKSAm
JiBvcmlnaW5hbFN0cmluZy0+YnVmZmVyT3duZXJzaGlwKCkgPT0gQnVmZmVySW50ZXJuYWwpOwor
CisgICAgaWYgKCFsZW5ndGgpIHsKKyAgICAgICAgZGF0YSA9IDA7CisgICAgICAgIHJldHVybiBl
bXB0eSgpOworICAgIH0KKworICAgIC8vIFNhbWUgYXMgY3JlYXRlVW5pbml0aWFsaXplZCgpIGV4
Y2VwdCBoZXJlIHdlIHVzZSBmYXN0UmVhbGxvYy4KKyAgICBpZiAobGVuZ3RoID4gKChzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgLSBzaXplb2YoU3RyaW5nSW1wbCkpIC8gc2l6
ZW9mKFVDaGFyKSkpCisgICAgICAgIENSQVNIKCk7CisgICAgc2l6ZV90IHNpemUgPSBzaXplb2Yo
U3RyaW5nSW1wbCkgKyBsZW5ndGggKiBzaXplb2YoVUNoYXIpOworICAgIG9yaWdpbmFsU3RyaW5n
LT5+U3RyaW5nSW1wbCgpOworICAgIFN0cmluZ0ltcGwqIHN0cmluZyA9IHN0YXRpY19jYXN0PFN0
cmluZ0ltcGwqPihmYXN0UmVhbGxvYyhvcmlnaW5hbFN0cmluZy5sZWFrUmVmKCksIHNpemUpKTsK
KworICAgIGRhdGEgPSByZWludGVycHJldF9jYXN0PFVDaGFyKj4oc3RyaW5nICsgMSk7CisgICAg
cmV0dXJuIGFkb3B0UmVmKG5ldyAoc3RyaW5nKSBTdHJpbmdJbXBsKGxlbmd0aCkpOworfQorCiBQ
YXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdCBVQ2hhciogY2hh
cmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQogewogICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVu
Z3RoKQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5o
CShyZXZpc2lvbiA5NzI2OSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJp
bmdJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAgLTE4MSw2ICsxODEsMTEgQEAgcHVibGljOgogICAg
ICAgICByZXR1cm4gYWRvcHRSZWYobmV3KHJlc3VsdEltcGwpIFN0cmluZ0ltcGwobGVuZ3RoKSk7
CiAgICAgfQogCisgICAgLy8gUmVhbGxvY2F0ZSB0aGUgU3RyaW5nSW1wbC4gVGhlIG9yaWdpbmFs
U3RyaW5nIG11c3QgYmUgb25seSBvd25lZCBieSB0aGUgUGFzc1JlZlB0ciwKKyAgICAvLyBhbmQg
dGhlIGJ1ZmZlciBvd25lcnNoaXAgbXVzdCBiZSBCdWZmZXJJbnRlcm5hbC4gSnVzdCBsaWtlIHRo
ZSBpbnB1dCBwb2ludGVyIG9mIHJlYWxsb2MoKSwKKyAgICAvLyB0aGUgb3JpZ2luYWxTdHJpbmcg
Y2FuJ3QgYmUgdXNlZCBhZnRlciB0aGlzIGZ1bmN0aW9uLgorICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFN0cmluZ0ltcGw+IHJlYWxsb2NhdGUoUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBvcmlnaW5hbFN0
cmluZywgdW5zaWduZWQgbGVuZ3RoLCBVQ2hhciomIGRhdGEpOworCiAgICAgc3RhdGljIHVuc2ln
bmVkIGRhdGFPZmZzZXQoKSB7IHJldHVybiBPQkpFQ1RfT0ZGU0VUT0YoU3RyaW5nSW1wbCwgbV9k
YXRhKTsgfQogICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZVdpdGhUZXJt
aW5hdGluZ051bGxDaGFyYWN0ZXIoY29uc3QgU3RyaW5nSW1wbCYpOwogICAgIHN0YXRpYyBQYXNz
UmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZVN0cmlwcGluZ051bGxDaGFyYWN0ZXJzKGNvbnN0IFVD
aGFyKiwgdW5zaWduZWQgbGVuZ3RoKTsK
</data>

          </attachment>
      

    </bug>

</bugzilla>