<?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>24739</bug_id>
          
          <creation_ts>2009-03-21 03:29:56 -0700</creation_ts>
          <short_desc>Combine StringImpl struct and data allocations</short_desc>
          <delta_ts>2009-03-23 13:28:11 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</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="Mike Belshe">mbelshe</reporter>
          <assigned_to name="Mike Belshe">mbelshe</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>114639</commentid>
    <comment_count>0</comment_count>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 03:29:56 -0700</bug_when>
    <thetext>Often when we create a StringImpl(), we know what data it is going to contain.  Currently, this results in two heap allocations - one for the StringImpl class, and a second for the data.  These can be combined into a single allocation.

I measured small performance increases, but it is hard to be certain that these are not in the noise.  Nonetheless, it is more efficient.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114640</commentid>
    <comment_count>1</comment_count>
      <attachid>28821</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 03:35:02 -0700</bug_when>
    <thetext>Created attachment 28821
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114641</commentid>
    <comment_count>2</comment_count>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 03:45:34 -0700</bug_when>
    <thetext>Requesting review from Maciej - I suspect he will know if there is some reason this doesn&apos;t work well. 

Tests I ran:  passes all layout tests, sunspider benchmark, independent tests.

This does add a flag into the StringImpl, but doesn&apos;t increase the size of the StringImpl because of padding.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114647</commentid>
    <comment_count>3</comment_count>
      <attachid>28821</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-21 07:40:13 -0700</bug_when>
    <thetext>Comment on attachment 28821
patch

&gt; +        Rework StringImpl::create methods to try to allocate
&gt; +        a single buffer rahter than allocating both the StringImpl class
&gt; +        and a separate data buffer.

I like this idea! Seems like a good approach that will save us quite a bit of memory.

&gt; +    // Allocate a single buffer large enough to contain the StringImpl
&gt; +    // struct as well as the data which it contains.  This removes one 
&gt; +    // heap allocation from this call.
&gt; +    int size = sizeof(StringImpl) + (length * sizeof(UChar));
&gt; +    char* buffer = static_cast&lt;char*&gt;(fastMalloc(size));
&gt; +    UChar* data = reinterpret_cast&lt;UChar*&gt;(buffer + sizeof(StringImpl));
&gt; +    memcpy(data, characters, length * sizeof(UChar));
&gt; +    StringImpl* rv = new (buffer) StringImpl(data, length, AdoptBuffer());
&gt; +    rv-&gt;m_internalBuffer = true;
&gt; +    return adoptRef(rv);

If we’ve created a StringImpl this way, then we can’t just delete it with a “delete” call. Instead we need to separately call the destructor and then call fastFree. As you can see in https://bugs.webkit.org/show_bug.cgi?id=22834 and http://trac.webkit.org/changeset/41877 if we mismatch fastMalloc and delete we will end up causing trouble for valgrind.

But it’s relatively easy to fix. We can always use fastMalloc and placement new to allocate StringImpl, even when the buffer is not internal, and then we can implement our own deletion that uses fastFree instead of delete. The way to implement our own deletion is to inherit from RefCountedBase instead of from RefCounted&lt;StringImpl&gt; and then write our own deref function:

    void deref() {
        if (derefBase()) {
            this-&gt;~StringImpl();
            fastFree(this);
        }
    }

Also, WebKit code would normally use a name like &quot;string&quot; rather than &quot;rv&quot; for the newly created StringImpl.

&gt; +    // In some cases, we allocate the StringImpl struct and its data
&gt; +    // within a single heap buffer.  In this case, the m_data pointer
&gt; +    // is an &quot;internal buffer&quot;, and does not need to be deallocated.
&gt; +    bool m_internalBuffer;

m_internalBuffer is a good name for a buffer, but not a good name for a boolean telling you the type of buffer. m_bufferIsInternal or m_isInternalBuffer would be a better name for a boolean. But I don&apos;t think we need the boolean. You can write it like this:

    if (m_data != reinterpret_cast&lt;UChar*&gt;(this + 1))
        deleteUCharVector(m_data);

I think it’s better for the future to not have a boolean for this, even though at the moment we can afford it. Not having to set that boolean will streamline the creation code a bit too.

I’m going to say review- because of the easily-fixable fastMalloc/delete mismatch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114655</commentid>
    <comment_count>4</comment_count>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 11:01:27 -0700</bug_when>
    <thetext>Thanks for the comments Darin - those all sound fine.  I&apos;ll get those things cleaned up and push up a new patch after testing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114659</commentid>
    <comment_count>5</comment_count>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 11:17:43 -0700</bug_when>
    <thetext>I think we should still use the flag.  Although it is highly unlikely (and perhaps impossible in most cases), there is no guarantee that just because the data points to the space immediately following the StringImpl that the buffer is part of a single buffer.

e.g.
   StringImpl = new....   could return 0x00001000
   char* data = new...    could return 0x00001010

The flag is the only way to know that we need two deletes for this case.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114675</commentid>
    <comment_count>6</comment_count>
      <attachid>28828</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-21 19:42:14 -0700</bug_when>
    <thetext>Created attachment 28828
updated patch to address comments.

Addressed the naming issues.
Did not remove the boolean because of previous comment; the fact that the address of the buffer starts immediately after the StringImpl is not a guarantee that it was allocated in one chunk.
Took a different approach to solving the valgrind mis-matched free problem.  Since we really want this class to control how the StringImpl is allocated, overriding new &amp; delete works well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114776</commentid>
    <comment_count>7</comment_count>
      <attachid>28828</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-23 08:53:42 -0700</bug_when>
    <thetext>Comment on attachment 28828
updated patch to address comments.

&gt; +// Some of the factory methods create buffers using fastMalloc.
&gt; +// We must ensure that all allocations of StringImpl are allocated using
&gt; +// fastMalloc so that we don&apos;t have mis-matched frees.   We accomplish 
&gt; +// this by overriding the new and delete operators.

We use one space after a period, not three.

&gt; +void *StringImpl::operator new(size_t bytes, void *mem)

We use void*, not void *.

The name &quot;bytes&quot; seems wrong for the argument, since the argument is a number of bytes, not actual &quot;bytes&quot;. Perhaps the name &quot;size&quot; or &quot;sizeInBytes&quot;.

I&apos;m not sure why you chose to abbreviate &quot;memory&quot; to &quot;mem&quot;, but please don&apos;t.

&gt; +void *StringImpl::operator new(size_t bytes)

Again, void*.

&gt; +    // Allocate a single buffer large enough to contain the StringImpl
&gt; +    // struct as well as the data which it contains.  This removes one 
&gt; +    // heap allocation from this call.

One space, not two, after a period.

&gt; +    int size = sizeof(StringImpl) + (length * sizeof(UChar));

size_t, not int. Also, I don&apos;t think the parentheses make things clearer and I would omit them.

&gt; +    // Allocate a single buffer large enough to contain the StringImpl
&gt; +    // struct as well as the data which it contains.  This removes one 
&gt; +    // heap allocation from this call.

One space, not two.

&gt; +    int size = sizeof(StringImpl) + (length * sizeof(UChar));

size_t, not int. Also, I don&apos;t think the parentheses make things clearer and I would omit them.

&gt; +    void *operator new(size_t bytes);

void*, not void *. Same comment as above about the argument name &quot;bytes&quot;.

&gt; +    // Allocation from a custom buffer is only allowed internally to avoid
&gt; +    // mismatched allocators.
&gt; +    void *operator new(size_t bytes, void *mem);

This comment seems a little strange. All allocation is only allowed internally. Can&apos;t you make all the operator new declarations private?

void*, not void *. Same comment as above about the argument name &quot;bytes&quot;.

&gt; +    // In some cases, we allocate the StringImpl struct and its data
&gt; +    // within a single heap buffer.  In this case, the m_data pointer
&gt; +    // is an &quot;internal buffer&quot;, and does not need to be deallocated.

One space, not two, after a period.

r=me as is -- the comments above are all minor nitpicks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114828</commentid>
    <comment_count>8</comment_count>
      <attachid>28862</attachid>
    <who name="Mike Belshe">mbelshe</who>
    <bug_when>2009-03-23 12:38:49 -0700</bug_when>
    <thetext>Created attachment 28862
patch with Darin&apos;s comments

Thanks for the comments; sorry about the stupid nits.

I moved both operator new() calls to be private; I hadn&apos;t done this before to be conservative.  But after re-testing, all callers are using the create() methods (which is good!), so I was able to make this private.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114830</commentid>
    <comment_count>9</comment_count>
      <attachid>28862</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-03-23 12:44:22 -0700</bug_when>
    <thetext>Comment on attachment 28862
patch with Darin&apos;s comments

carrying forward Darin Adler&apos;s r+.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114832</commentid>
    <comment_count>10</comment_count>
      <attachid>28862</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-03-23 12:51:31 -0700</bug_when>
    <thetext>Comment on attachment 28862
patch with Darin&apos;s comments

Still great.

&gt; +        Rework StringImpl::create methods to try to allocate
&gt; +        a single buffer rahter than allocating both the StringImpl class
&gt; +        and a separate data buffer.

Typo here: &quot;rahter&quot;.

&gt; +    // Allocation from a custom buffer is only allowed internally to avoid
&gt; +    // mismatched allocators.  Callers should use create().

Still two spaces after the period here.

&gt; +    void* operator new(size_t size);
&gt; +    void* operator new(size_t size, void* mem);

Still &quot;mem&quot; here, instead of a word. Same in one other place.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114838</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-03-23 13:28:11 -0700</bug_when>
    <thetext>Landed as:  http://trac.webkit.org/changeset/41917

mem -&gt; address</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28821</attachid>
            <date>2009-03-21 03:35:02 -0700</date>
            <delta_ts>2009-03-21 07:40:13 -0700</delta_ts>
            <desc>patch</desc>
            <filename>bug24739.patch</filename>
            <type>text/plain</type>
            <size>5793</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTg4OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMDktMDMtMjEgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBSZXdvcmsg
U3RyaW5nSW1wbDo6Y3JlYXRlIG1ldGhvZHMgdG8gdHJ5IHRvIGFsbG9jYXRlCisgICAgICAgIGEg
c2luZ2xlIGJ1ZmZlciByYWh0ZXIgdGhhbiBhbGxvY2F0aW5nIGJvdGggdGhlIFN0cmluZ0ltcGwg
Y2xhc3MKKyAgICAgICAgYW5kIGEgc2VwYXJhdGUgZGF0YSBidWZmZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDczOQorCisgICAgICAgICogcGxh
dGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmlu
Z0ltcGwuaDoKKwogMjAwOS0wMy0yMCAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE1hcmsgUm93ZS4KSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
dGV4dC9TdHJpbmdJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3RleHQv
U3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDQxODg4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0
L1N0cmluZ0ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MSw2ICs2MSw3IEBAIFN0cmluZ0lt
cGw6OlN0cmluZ0ltcGwoKQogICAgICwgbV9oYXNoKDApCiAgICAgLCBtX2luVGFibGUoZmFsc2Up
CiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxzZSkKKyAgICAsIG1faW50
ZXJuYWxCdWZmZXIoZmFsc2UpCiB7CiAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGhhc2ggaXMgY29t
cHV0ZWQgc28gdGhhdCBBdG9taWNTdHJpbmdIYXNoIGNhbiBjYWxsIGV4aXN0aW5nSGFzaCgpCiAg
ICAgLy8gd2l0aCBpbXB1bml0eS4gVGhlIGVtcHR5IHN0cmluZyBpcyBzcGVjaWFsIGJlY2F1c2Ug
aXQgaXMgbmV2ZXIgZW50ZXJlZCBpbnRvCkBAIC03Niw2ICs3Nyw3IEBAIGlubGluZSBTdHJpbmdJ
bXBsOjpTdHJpbmdJbXBsKGNvbnN0IFVDaGEKICAgICAsIG1faGFzaCgwKQogICAgICwgbV9pblRh
YmxlKGZhbHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFsc2UpCisg
ICAgLCBtX2ludGVybmFsQnVmZmVyKGZhbHNlKQogewogICAgIFVDaGFyKiBkYXRhID0gbmV3VUNo
YXJWZWN0b3IobGVuZ3RoKTsKICAgICBtZW1jcHkoZGF0YSwgY2hhcmFjdGVycywgbGVuZ3RoICog
c2l6ZW9mKFVDaGFyKSk7CkBAIC04Nyw2ICs4OSw3IEBAIGlubGluZSBTdHJpbmdJbXBsOjpTdHJp
bmdJbXBsKGNvbnN0IFN0cmkKICAgICAsIG1faGFzaChzdHIubV9oYXNoKQogICAgICwgbV9pblRh
YmxlKGZhbHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIodHJ1ZSkKKyAg
ICAsIG1faW50ZXJuYWxCdWZmZXIoZmFsc2UpCiB7CiAgICAgVUNoYXIqIGRhdGEgPSBuZXdVQ2hh
clZlY3RvcihzdHIubV9sZW5ndGggKyAxKTsKICAgICBtZW1jcHkoZGF0YSwgc3RyLm1fZGF0YSwg
c3RyLm1fbGVuZ3RoICogc2l6ZW9mKFVDaGFyKSk7CkBAIC05OSw2ICsxMDIsNyBAQCBpbmxpbmUg
U3RyaW5nSW1wbDo6U3RyaW5nSW1wbChjb25zdCBjaGFyCiAgICAgLCBtX2hhc2goMCkKICAgICAs
IG1faW5UYWJsZShmYWxzZSkKICAgICAsIG1faGFzVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGZh
bHNlKQorICAgICwgbV9pbnRlcm5hbEJ1ZmZlcihmYWxzZSkKIHsKICAgICBBU1NFUlQoY2hhcmFj
dGVycyk7CiAgICAgQVNTRVJUKGxlbmd0aCk7CkBAIC0xMTcsNiArMTIxLDcgQEAgaW5saW5lIFN0
cmluZ0ltcGw6OlN0cmluZ0ltcGwoVUNoYXIqIGNoYQogICAgICwgbV9oYXNoKDApCiAgICAgLCBt
X2luVGFibGUoZmFsc2UpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxz
ZSkKKyAgICAsIG1faW50ZXJuYWxCdWZmZXIoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGNoYXJhY3Rl
cnMpOwogICAgIEFTU0VSVChsZW5ndGgpOwpAQCAtMTI4LDYgKzEzMyw3IEBAIFN0cmluZ0ltcGw6
OlN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGNoYXIKICAgICAsIG1faGFzaChoYXNoKQogICAgICwg
bV9pblRhYmxlKHRydWUpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxz
ZSkKKyAgICAsIG1faW50ZXJuYWxCdWZmZXIoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGhhc2gpOwog
ICAgIEFTU0VSVChjaGFyYWN0ZXJzKTsKQEAgLTE0NCw2ICsxNTAsNyBAQCBTdHJpbmdJbXBsOjpT
dHJpbmdJbXBsKGNvbnN0IGNoYXIqIGNoYXJhCiAgICAgLCBtX2hhc2goaGFzaCkKICAgICAsIG1f
aW5UYWJsZSh0cnVlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFsc2Up
CisgICAgLCBtX2ludGVybmFsQnVmZmVyKGZhbHNlKQogewogICAgIEFTU0VSVChoYXNoKTsKICAg
ICBBU1NFUlQoY2hhcmFjdGVycyk7CkBAIC0xNjEsNyArMTY4LDggQEAgU3RyaW5nSW1wbDo6flN0
cmluZ0ltcGwoKQogewogICAgIGlmIChtX2luVGFibGUpCiAgICAgICAgIEF0b21pY1N0cmluZzo6
cmVtb3ZlKHRoaXMpOwotICAgIGRlbGV0ZVVDaGFyVmVjdG9yKG1fZGF0YSk7CisgICAgaWYgKCFt
X2ludGVybmFsQnVmZmVyKQorICAgICAgICBkZWxldGVVQ2hhclZlY3RvcihtX2RhdGEpOwogfQog
CiBTdHJpbmdJbXBsKiBTdHJpbmdJbXBsOjplbXB0eSgpCkBAIC05NDAsMjQgKzk0OCw0NCBAQCBQ
YXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0CiB7CiAgICAgaWYgKCFjaGFy
YWN0ZXJzIHx8ICFsZW5ndGgpCiAgICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJldHVybiBh
ZG9wdFJlZihuZXcgU3RyaW5nSW1wbChjaGFyYWN0ZXJzLCBsZW5ndGgpKTsKKworICAgIC8vIEFs
bG9jYXRlIGEgc2luZ2xlIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUgU3RyaW5n
SW1wbAorICAgIC8vIHN0cnVjdCBhcyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0IGNvbnRhaW5z
LiAgVGhpcyByZW1vdmVzIG9uZSAKKyAgICAvLyBoZWFwIGFsbG9jYXRpb24gZnJvbSB0aGlzIGNh
bGwuCisgICAgaW50IHNpemUgPSBzaXplb2YoU3RyaW5nSW1wbCkgKyAobGVuZ3RoICogc2l6ZW9m
KFVDaGFyKSk7CisgICAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGZhc3RNYWxs
b2Moc2l6ZSkpOworICAgIFVDaGFyKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hhcio+KGJ1
ZmZlciArIHNpemVvZihTdHJpbmdJbXBsKSk7CisgICAgbWVtY3B5KGRhdGEsIGNoYXJhY3RlcnMs
IGxlbmd0aCAqIHNpemVvZihVQ2hhcikpOworICAgIFN0cmluZ0ltcGwqIHJ2ID0gbmV3IChidWZm
ZXIpIFN0cmluZ0ltcGwoZGF0YSwgbGVuZ3RoLCBBZG9wdEJ1ZmZlcigpKTsKKyAgICBydi0+bV9p
bnRlcm5hbEJ1ZmZlciA9IHRydWU7CisgICAgcmV0dXJuIGFkb3B0UmVmKHJ2KTsKIH0KIAogUGFz
c1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogY2hhcmFj
dGVycywgdW5zaWduZWQgbGVuZ3RoKQogewogICAgIGlmICghY2hhcmFjdGVycyB8fCAhbGVuZ3Ro
KQogICAgICAgICByZXR1cm4gZW1wdHkoKTsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmlu
Z0ltcGwoY2hhcmFjdGVycywgbGVuZ3RoKSk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIHNpbmdsZSBi
dWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gdGhlIFN0cmluZ0ltcGwKKyAgICAvLyBzdHJ1
Y3QgYXMgd2VsbCBhcyB0aGUgZGF0YSB3aGljaCBpdCBjb250YWlucy4gIFRoaXMgcmVtb3ZlcyBv
bmUgCisgICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhpcyBjYWxsLgorICAgIGludCBzaXpl
ID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgKGxlbmd0aCAqIHNpemVvZihVQ2hhcikpOworICAgIGNo
YXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihmYXN0TWFsbG9jKHNpemUpKTsKKyAgICBV
Q2hhciogZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VUNoYXIqPihidWZmZXIgKyBzaXplb2YoU3Ry
aW5nSW1wbCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsK
KyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gY2hhcmFjdGVyc1tpXTsKKyAgICAgICAgZGF0YVtp
XSA9IGM7CisgICAgfQorICAgIFN0cmluZ0ltcGwqIHJ2ID0gbmV3IChidWZmZXIpIFN0cmluZ0lt
cGwoZGF0YSwgbGVuZ3RoLCBBZG9wdEJ1ZmZlcigpKTsKKyAgICBydi0+bV9pbnRlcm5hbEJ1ZmZl
ciA9IHRydWU7CisgICAgcmV0dXJuIGFkb3B0UmVmKHJ2KTsKIH0KIAogUGFzc1JlZlB0cjxTdHJp
bmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUoY29uc3QgY2hhciogc3RyaW5nKQogewogICAgIGlm
ICghc3RyaW5nKQogICAgICAgICByZXR1cm4gZW1wdHkoKTsKLSAgICB1bnNpZ25lZCBsZW5ndGgg
PSBzdHJsZW4oc3RyaW5nKTsKLSAgICBpZiAoIWxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGVtcHR5
KCk7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdHJpbmdJbXBsKHN0cmluZywgbGVuZ3RoKSk7
CisgICAgcmV0dXJuIGNyZWF0ZShzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKIH0KIAogUGFzc1Jl
ZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGVXaXRoVGVybWluYXRpbmdOdWxsQ2hh
cmFjdGVyKGNvbnN0IFN0cmluZ0ltcGwmIHN0cmluZykKQEAgLTk2Nyw3ICs5OTUsNyBAQCBQYXNz
UmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0CiAKIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gU3RyaW5nSW1wbDo6Y29weSgpCiB7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBTdHJp
bmdJbXBsKG1fZGF0YSwgbV9sZW5ndGgpKTsKKyAgICByZXR1cm4gY3JlYXRlKG1fZGF0YSwgbV9s
ZW5ndGgpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRm
b3JtL3RleHQvU3RyaW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vdGV4
dC9TdHJpbmdJbXBsLmgJKHJldmlzaW9uIDQxODg4KQorKysgV2ViQ29yZS9wbGF0Zm9ybS90ZXh0
L1N0cmluZ0ltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMTc0LDYgKzE3NCwxMCBAQCBwcml2YXRl
OgogICAgIG11dGFibGUgdW5zaWduZWQgbV9oYXNoOwogICAgIGJvb2wgbV9pblRhYmxlOwogICAg
IGJvb2wgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXI7CisgICAgLy8gSW4gc29tZSBjYXNl
cywgd2UgYWxsb2NhdGUgdGhlIFN0cmluZ0ltcGwgc3RydWN0IGFuZCBpdHMgZGF0YQorICAgIC8v
IHdpdGhpbiBhIHNpbmdsZSBoZWFwIGJ1ZmZlci4gIEluIHRoaXMgY2FzZSwgdGhlIG1fZGF0YSBw
b2ludGVyCisgICAgLy8gaXMgYW4gImludGVybmFsIGJ1ZmZlciIsIGFuZCBkb2VzIG5vdCBuZWVk
IHRvIGJlIGRlYWxsb2NhdGVkLgorICAgIGJvb2wgbV9pbnRlcm5hbEJ1ZmZlcjsKIH07CiAKIGJv
b2wgZXF1YWwoU3RyaW5nSW1wbCosIFN0cmluZ0ltcGwqKTsK
</data>
<flag name="review"
          id="14227"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28828</attachid>
            <date>2009-03-21 19:42:14 -0700</date>
            <delta_ts>2009-03-23 08:53:42 -0700</delta_ts>
            <desc>updated patch to address comments.</desc>
            <filename>bug24739.patch</filename>
            <type>text/plain</type>
            <size>7642</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTg4OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMDktMDMtMjEgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBSZXdvcmsg
U3RyaW5nSW1wbDo6Y3JlYXRlIG1ldGhvZHMgdG8gdHJ5IHRvIGFsbG9jYXRlCisgICAgICAgIGEg
c2luZ2xlIGJ1ZmZlciByYWh0ZXIgdGhhbiBhbGxvY2F0aW5nIGJvdGggdGhlIFN0cmluZ0ltcGwg
Y2xhc3MKKyAgICAgICAgYW5kIGEgc2VwYXJhdGUgZGF0YSBidWZmZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDczOQorCisgICAgICAgICogcGxh
dGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmlu
Z0ltcGwuaDoKKwogMjAwOS0wMy0yMCAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE1hcmsgUm93ZS4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5i
YXNlLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuYmFzZS5leHAJKHJldmlzaW9u
IDQxODg4KQorKysgV2ViQ29yZS9XZWJDb3JlLmJhc2UuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MzIsNiArMTMyLDcgQEAgX19aTjdXZWJDb3JlMTBTdHJpbmdJbXBsN3JlcGxhY2VFdHQKIF9fWk43
V2ViQ29yZTEwU3RyaW5nSW1wbDhlbmRzV2l0aEVQUzBfYgogX19aTjdXZWJDb3JlMTBTdHJpbmdJ
bXBsRDFFdgogX19aTjdXZWJDb3JlMTBTdHJpbmdJbXBsY3ZQOE5TU3RyaW5nRXYKK19fWk43V2Vi
Q29yZTEwU3RyaW5nSW1wbGRsRVB2CiBfX1pON1dlYkNvcmUxMGhhbmRDdXJzb3JFdgogX19aTjdX
ZWJDb3JlMTFDYWNoZWRGcmFtZTIzY2FjaGVkRnJhbWVQbGF0Zm9ybURhdGFFdgogX19aTjdXZWJD
b3JlMTFDYWNoZWRGcmFtZTI2c2V0Q2FjaGVkRnJhbWVQbGF0Zm9ybURhdGFFUE5TXzIzQ2FjaGVk
RnJhbWVQbGF0Zm9ybURhdGFFCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3Bw
CShyZXZpc2lvbiA0MTg4OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsMjcgQEAgc3RhdGljIGlubGluZSB2b2lkIGRl
bGV0ZVVDaGFyVmVjdG9yKGNvbgogICAgIGZhc3RGcmVlKGNvbnN0X2Nhc3Q8VUNoYXIqPihwKSk7
CiB9CiAKKy8vIFNvbWUgb2YgdGhlIGZhY3RvcnkgbWV0aG9kcyBjcmVhdGUgYnVmZmVycyB1c2lu
ZyBmYXN0TWFsbG9jLgorLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCBhbGwgYWxsb2NhdGlvbnMgb2Yg
U3RyaW5nSW1wbCBhcmUgYWxsb2NhdGVkIHVzaW5nCisvLyBmYXN0TWFsbG9jIHNvIHRoYXQgd2Ug
ZG9uJ3QgaGF2ZSBtaXMtbWF0Y2hlZCBmcmVlcy4gICBXZSBhY2NvbXBsaXNoIAorLy8gdGhpcyBi
eSBvdmVycmlkaW5nIHRoZSBuZXcgYW5kIGRlbGV0ZSBvcGVyYXRvcnMuCit2b2lkICpTdHJpbmdJ
bXBsOjpvcGVyYXRvciBuZXcoc2l6ZV90IGJ5dGVzLCB2b2lkICptZW0pCit7CisgICAgaWYgKG1l
bSkKKyAgICAgICAgcmV0dXJuIG1lbTsgIC8vIEFsbG9jYXRpbmcgdXNpbmcgYW4gaW50ZXJuYWwg
YnVmZmVyCisgICAgcmV0dXJuIGZhc3RNYWxsb2MoYnl0ZXMpOworfQorCit2b2lkICpTdHJpbmdJ
bXBsOjpvcGVyYXRvciBuZXcoc2l6ZV90IGJ5dGVzKQoreworICAgIHJldHVybiBmYXN0TWFsbG9j
KGJ5dGVzKTsKK30KKwordm9pZCBTdHJpbmdJbXBsOjpvcGVyYXRvciBkZWxldGUodm9pZCogbWVt
KQoreworICAgIGZhc3RGcmVlKG1lbSk7Cit9CisKIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNl
ZCBvbmx5IHRvIGNyZWF0ZSB0aGUgZW1wdHkgc3RyaW5nLgogU3RyaW5nSW1wbDo6U3RyaW5nSW1w
bCgpCiAgICAgOiBtX2xlbmd0aCgwKQpAQCAtNjEsNiArODIsNyBAQCBTdHJpbmdJbXBsOjpTdHJp
bmdJbXBsKCkKICAgICAsIG1faGFzaCgwKQogICAgICwgbV9pblRhYmxlKGZhbHNlKQogICAgICwg
bV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFsc2UpCisgICAgLCBtX2J1ZmZlcklzSW50
ZXJuYWwoZmFsc2UpCiB7CiAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIGhhc2ggaXMgY29tcHV0ZWQg
c28gdGhhdCBBdG9taWNTdHJpbmdIYXNoIGNhbiBjYWxsIGV4aXN0aW5nSGFzaCgpCiAgICAgLy8g
d2l0aCBpbXB1bml0eS4gVGhlIGVtcHR5IHN0cmluZyBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgaXMg
bmV2ZXIgZW50ZXJlZCBpbnRvCkBAIC03Niw2ICs5OCw3IEBAIGlubGluZSBTdHJpbmdJbXBsOjpT
dHJpbmdJbXBsKGNvbnN0IFVDaGEKICAgICAsIG1faGFzaCgwKQogICAgICwgbV9pblRhYmxlKGZh
bHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFsc2UpCisgICAgLCBt
X2J1ZmZlcklzSW50ZXJuYWwoZmFsc2UpCiB7CiAgICAgVUNoYXIqIGRhdGEgPSBuZXdVQ2hhclZl
Y3RvcihsZW5ndGgpOwogICAgIG1lbWNweShkYXRhLCBjaGFyYWN0ZXJzLCBsZW5ndGggKiBzaXpl
b2YoVUNoYXIpKTsKQEAgLTg3LDYgKzExMCw3IEBAIGlubGluZSBTdHJpbmdJbXBsOjpTdHJpbmdJ
bXBsKGNvbnN0IFN0cmkKICAgICAsIG1faGFzaChzdHIubV9oYXNoKQogICAgICwgbV9pblRhYmxl
KGZhbHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIodHJ1ZSkKKyAgICAs
IG1fYnVmZmVySXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBVQ2hhciogZGF0YSA9IG5ld1VDaGFy
VmVjdG9yKHN0ci5tX2xlbmd0aCArIDEpOwogICAgIG1lbWNweShkYXRhLCBzdHIubV9kYXRhLCBz
dHIubV9sZW5ndGggKiBzaXplb2YoVUNoYXIpKTsKQEAgLTk5LDYgKzEyMyw3IEBAIGlubGluZSBT
dHJpbmdJbXBsOjpTdHJpbmdJbXBsKGNvbnN0IGNoYXIKICAgICAsIG1faGFzaCgwKQogICAgICwg
bV9pblRhYmxlKGZhbHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFs
c2UpCisgICAgLCBtX2J1ZmZlcklzSW50ZXJuYWwoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGNoYXJh
Y3RlcnMpOwogICAgIEFTU0VSVChsZW5ndGgpOwpAQCAtMTE3LDYgKzE0Miw3IEBAIGlubGluZSBT
dHJpbmdJbXBsOjpTdHJpbmdJbXBsKFVDaGFyKiBjaGEKICAgICAsIG1faGFzaCgwKQogICAgICwg
bV9pblRhYmxlKGZhbHNlKQogICAgICwgbV9oYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoZmFs
c2UpCisgICAgLCBtX2J1ZmZlcklzSW50ZXJuYWwoZmFsc2UpCiB7CiAgICAgQVNTRVJUKGNoYXJh
Y3RlcnMpOwogICAgIEFTU0VSVChsZW5ndGgpOwpAQCAtMTI4LDYgKzE1NCw3IEBAIFN0cmluZ0lt
cGw6OlN0cmluZ0ltcGwoY29uc3QgVUNoYXIqIGNoYXIKICAgICAsIG1faGFzaChoYXNoKQogICAg
ICwgbV9pblRhYmxlKHRydWUpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3Rlcihm
YWxzZSkKKyAgICAsIG1fYnVmZmVySXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBBU1NFUlQoaGFz
aCk7CiAgICAgQVNTRVJUKGNoYXJhY3RlcnMpOwpAQCAtMTQ0LDYgKzE3MSw3IEBAIFN0cmluZ0lt
cGw6OlN0cmluZ0ltcGwoY29uc3QgY2hhciogY2hhcmEKICAgICAsIG1faGFzaChoYXNoKQogICAg
ICwgbV9pblRhYmxlKHRydWUpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3Rlcihm
YWxzZSkKKyAgICAsIG1fYnVmZmVySXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBBU1NFUlQoaGFz
aCk7CiAgICAgQVNTRVJUKGNoYXJhY3RlcnMpOwpAQCAtMTYxLDcgKzE4OSw4IEBAIFN0cmluZ0lt
cGw6On5TdHJpbmdJbXBsKCkKIHsKICAgICBpZiAobV9pblRhYmxlKQogICAgICAgICBBdG9taWNT
dHJpbmc6OnJlbW92ZSh0aGlzKTsKLSAgICBkZWxldGVVQ2hhclZlY3RvcihtX2RhdGEpOworICAg
IGlmICghbV9idWZmZXJJc0ludGVybmFsKQorICAgICAgICBkZWxldGVVQ2hhclZlY3RvcihtX2Rh
dGEpOwogfQogCiBTdHJpbmdJbXBsKiBTdHJpbmdJbXBsOjplbXB0eSgpCkBAIC05NDAsMjQgKzk2
OSw0NCBAQCBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0CiB7CiAgICAg
aWYgKCFjaGFyYWN0ZXJzIHx8ICFsZW5ndGgpCiAgICAgICAgIHJldHVybiBlbXB0eSgpOwotICAg
IHJldHVybiBhZG9wdFJlZihuZXcgU3RyaW5nSW1wbChjaGFyYWN0ZXJzLCBsZW5ndGgpKTsKKwor
ICAgIC8vIEFsbG9jYXRlIGEgc2luZ2xlIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0
aGUgU3RyaW5nSW1wbAorICAgIC8vIHN0cnVjdCBhcyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0
IGNvbnRhaW5zLiAgVGhpcyByZW1vdmVzIG9uZSAKKyAgICAvLyBoZWFwIGFsbG9jYXRpb24gZnJv
bSB0aGlzIGNhbGwuCisgICAgaW50IHNpemUgPSBzaXplb2YoU3RyaW5nSW1wbCkgKyAobGVuZ3Ro
ICogc2l6ZW9mKFVDaGFyKSk7CisgICAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+
KGZhc3RNYWxsb2Moc2l6ZSkpOworICAgIFVDaGFyKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxV
Q2hhcio+KGJ1ZmZlciArIHNpemVvZihTdHJpbmdJbXBsKSk7CisgICAgbWVtY3B5KGRhdGEsIGNo
YXJhY3RlcnMsIGxlbmd0aCAqIHNpemVvZihVQ2hhcikpOworICAgIFN0cmluZ0ltcGwqIHN0cmlu
ZyA9IG5ldyAoYnVmZmVyKSBTdHJpbmdJbXBsKGRhdGEsIGxlbmd0aCwgQWRvcHRCdWZmZXIoKSk7
CisgICAgc3RyaW5nLT5tX2J1ZmZlcklzSW50ZXJuYWwgPSB0cnVlOworICAgIHJldHVybiBhZG9w
dFJlZihzdHJpbmcpOwogfQogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNy
ZWF0ZShjb25zdCBjaGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCiB7CiAgICAgaWYg
KCFjaGFyYWN0ZXJzIHx8ICFsZW5ndGgpCiAgICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJl
dHVybiBhZG9wdFJlZihuZXcgU3RyaW5nSW1wbChjaGFyYWN0ZXJzLCBsZW5ndGgpKTsKKworICAg
IC8vIEFsbG9jYXRlIGEgc2luZ2xlIGJ1ZmZlciBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiB0aGUg
U3RyaW5nSW1wbAorICAgIC8vIHN0cnVjdCBhcyB3ZWxsIGFzIHRoZSBkYXRhIHdoaWNoIGl0IGNv
bnRhaW5zLiAgVGhpcyByZW1vdmVzIG9uZSAKKyAgICAvLyBoZWFwIGFsbG9jYXRpb24gZnJvbSB0
aGlzIGNhbGwuCisgICAgaW50IHNpemUgPSBzaXplb2YoU3RyaW5nSW1wbCkgKyAobGVuZ3RoICog
c2l6ZW9mKFVDaGFyKSk7CisgICAgY2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGZh
c3RNYWxsb2Moc2l6ZSkpOworICAgIFVDaGFyKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxVQ2hh
cio+KGJ1ZmZlciArIHNpemVvZihTdHJpbmdJbXBsKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSAhPSBsZW5ndGg7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBjaGFyYWN0
ZXJzW2ldOworICAgICAgICBkYXRhW2ldID0gYzsKKyAgICB9CisgICAgU3RyaW5nSW1wbCogc3Ry
aW5nID0gbmV3IChidWZmZXIpIFN0cmluZ0ltcGwoZGF0YSwgbGVuZ3RoLCBBZG9wdEJ1ZmZlcigp
KTsKKyAgICBzdHJpbmctPm1fYnVmZmVySXNJbnRlcm5hbCA9IHRydWU7CisgICAgcmV0dXJuIGFk
b3B0UmVmKHN0cmluZyk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6
Y3JlYXRlKGNvbnN0IGNoYXIqIHN0cmluZykKIHsKICAgICBpZiAoIXN0cmluZykKICAgICAgICAg
cmV0dXJuIGVtcHR5KCk7Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gc3RybGVuKHN0cmluZyk7Ci0g
ICAgaWYgKCFsZW5ndGgpCi0gICAgICAgIHJldHVybiBlbXB0eSgpOwotICAgIHJldHVybiBhZG9w
dFJlZihuZXcgU3RyaW5nSW1wbChzdHJpbmcsIGxlbmd0aCkpOworICAgIHJldHVybiBjcmVhdGUo
c3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3Ry
aW5nSW1wbDo6Y3JlYXRlV2l0aFRlcm1pbmF0aW5nTnVsbENoYXJhY3Rlcihjb25zdCBTdHJpbmdJ
bXBsJiBzdHJpbmcpCkBAIC05NjcsNyArMTAxNiw3IEBAIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4g
U3RyaW5nSW1wbDo6Y3JlYXQKIAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpj
b3B5KCkKIHsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFN0cmluZ0ltcGwobV9kYXRhLCBtX2xl
bmd0aCkpOworICAgIHJldHVybiBjcmVhdGUobV9kYXRhLCBtX2xlbmd0aCk7CiB9CiAKIH0gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBs
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAkocmV2
aXNpb24gNDE4ODgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xNjYsNyArMTY2LDE0IEBAIHB1YmxpYzoKICAgICBvcGVyYXRvciBOU1N0
cmluZyooKTsKICNlbmRpZgogCisgICAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBieXRlcyk7
CisgICAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopOworCiBwcml2YXRlOgorICAgIC8vIEFs
bG9jYXRpb24gZnJvbSBhIGN1c3RvbSBidWZmZXIgaXMgb25seSBhbGxvd2VkIGludGVybmFsbHkg
dG8gYXZvaWQKKyAgICAvLyBtaXNtYXRjaGVkIGFsbG9jYXRvcnMuCisgICAgdm9pZCAqb3BlcmF0
b3IgbmV3KHNpemVfdCBieXRlcywgdm9pZCAqbWVtKTsKKwogICAgIHN0YXRpYyBQYXNzUmVmUHRy
PFN0cmluZ0ltcGw+IGNyZWF0ZVN0cmlwcGluZ051bGxDaGFyYWN0ZXJzU2xvd0Nhc2UoY29uc3Qg
VUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwogCiAgICAgdW5zaWduZWQgbV9sZW5ndGg7CkBAIC0x
NzQsNiArMTgxLDEwIEBAIHByaXZhdGU6CiAgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2hhc2g7CiAg
ICAgYm9vbCBtX2luVGFibGU7CiAgICAgYm9vbCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3Rl
cjsKKyAgICAvLyBJbiBzb21lIGNhc2VzLCB3ZSBhbGxvY2F0ZSB0aGUgU3RyaW5nSW1wbCBzdHJ1
Y3QgYW5kIGl0cyBkYXRhCisgICAgLy8gd2l0aGluIGEgc2luZ2xlIGhlYXAgYnVmZmVyLiAgSW4g
dGhpcyBjYXNlLCB0aGUgbV9kYXRhIHBvaW50ZXIKKyAgICAvLyBpcyBhbiAiaW50ZXJuYWwgYnVm
ZmVyIiwgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgZGVhbGxvY2F0ZWQuCisgICAgYm9vbCBtX2J1
ZmZlcklzSW50ZXJuYWw7CiB9OwogCiBib29sIGVxdWFsKFN0cmluZ0ltcGwqLCBTdHJpbmdJbXBs
Kik7Cg==
</data>
<flag name="review"
          id="14232"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28862</attachid>
            <date>2009-03-23 12:38:49 -0700</date>
            <delta_ts>2009-03-23 12:44:22 -0700</delta_ts>
            <desc>patch with Darin&apos;s comments</desc>
            <filename>bug24739.patch</filename>
            <type>text/plain</type>
            <size>7662</size>
            <attacher name="Mike Belshe">mbelshe</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA0MTg4OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMDktMDMtMjEgIE1pa2UgQmVsc2hlICA8bWlrZUBiZWxzaGUuY29t
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICBSZXdvcmsg
U3RyaW5nSW1wbDo6Y3JlYXRlIG1ldGhvZHMgdG8gdHJ5IHRvIGFsbG9jYXRlCisgICAgICAgIGEg
c2luZ2xlIGJ1ZmZlciByYWh0ZXIgdGhhbiBhbGxvY2F0aW5nIGJvdGggdGhlIFN0cmluZ0ltcGwg
Y2xhc3MKKyAgICAgICAgYW5kIGEgc2VwYXJhdGUgZGF0YSBidWZmZXIuCisgICAgICAgIGh0dHBz
Oi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNDczOQorCisgICAgICAgICogcGxh
dGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNwcDoKKyAgICAgICAgKiBwbGF0Zm9ybS90ZXh0L1N0cmlu
Z0ltcGwuaDoKKwogMjAwOS0wMy0yMCAgRGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IE1hcmsgUm93ZS4KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5i
YXNlLmV4cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUuYmFzZS5leHAJKHJldmlzaW9u
IDQxODg4KQorKysgV2ViQ29yZS9XZWJDb3JlLmJhc2UuZXhwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MzIsNiArMTMyLDcgQEAgX19aTjdXZWJDb3JlMTBTdHJpbmdJbXBsN3JlcGxhY2VFdHQKIF9fWk43
V2ViQ29yZTEwU3RyaW5nSW1wbDhlbmRzV2l0aEVQUzBfYgogX19aTjdXZWJDb3JlMTBTdHJpbmdJ
bXBsRDFFdgogX19aTjdXZWJDb3JlMTBTdHJpbmdJbXBsY3ZQOE5TU3RyaW5nRXYKK19fWk43V2Vi
Q29yZTEwU3RyaW5nSW1wbGRsRVB2CiBfX1pON1dlYkNvcmUxMGhhbmRDdXJzb3JFdgogX19aTjdX
ZWJDb3JlMTFDYWNoZWRGcmFtZTIzY2FjaGVkRnJhbWVQbGF0Zm9ybURhdGFFdgogX19aTjdXZWJD
b3JlMTFDYWNoZWRGcmFtZTI2c2V0Q2FjaGVkRnJhbWVQbGF0Zm9ybURhdGFFUE5TXzIzQ2FjaGVk
RnJhbWVQbGF0Zm9ybURhdGFFCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1w
bC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuY3Bw
CShyZXZpc2lvbiA0MTg4OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNTQsNiArNTQsMjcgQEAgc3RhdGljIGlubGluZSB2b2lkIGRl
bGV0ZVVDaGFyVmVjdG9yKGNvbgogICAgIGZhc3RGcmVlKGNvbnN0X2Nhc3Q8VUNoYXIqPihwKSk7
CiB9CiAKKy8vIFNvbWUgb2YgdGhlIGZhY3RvcnkgbWV0aG9kcyBjcmVhdGUgYnVmZmVycyB1c2lu
ZyBmYXN0TWFsbG9jLgorLy8gV2UgbXVzdCBlbnN1cmUgdGhhdCBsbCBhbGxvY2F0aW9ucyBvZiBT
dHJpbmdJbXBsIGFyZSBhbGxvY2F0ZWQgdXNpbmcKKy8vIGZhc3RNYWxsb2Mgc28gdGhhdCB3ZSBk
b24ndCBoYXZlIG1pcy1tYXRjaGVkIGZyZWVzLiBXZSBhY2NvbXBsaXNoIAorLy8gdGhpcyBieSBv
dmVycmlkaW5nIHRoZSBuZXcgYW5kIGRlbGV0ZSBvcGVyYXRvcnMuCit2b2lkKiBTdHJpbmdJbXBs
OjpvcGVyYXRvciBuZXcoc2l6ZV90IHNpemUsIHZvaWQqIG1lbSkKK3sKKyAgICBpZiAobWVtKQor
ICAgICAgICByZXR1cm4gbWVtOyAgLy8gQWxsb2NhdGluZyB1c2luZyBhbiBpbnRlcm5hbCBidWZm
ZXIKKyAgICByZXR1cm4gZmFzdE1hbGxvYyhzaXplKTsKK30KKwordm9pZCogU3RyaW5nSW1wbDo6
b3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKQoreworICAgIHJldHVybiBmYXN0TWFsbG9jKHNpemUp
OworfQorCit2b2lkIFN0cmluZ0ltcGw6Om9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBtZW0pCit7Cisg
ICAgZmFzdEZyZWUobWVtKTsKK30KKwogLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIG9ubHkg
dG8gY3JlYXRlIHRoZSBlbXB0eSBzdHJpbmcuCiBTdHJpbmdJbXBsOjpTdHJpbmdJbXBsKCkKICAg
ICA6IG1fbGVuZ3RoKDApCkBAIC02MSw2ICs4Miw3IEBAIFN0cmluZ0ltcGw6OlN0cmluZ0ltcGwo
KQogICAgICwgbV9oYXNoKDApCiAgICAgLCBtX2luVGFibGUoZmFsc2UpCiAgICAgLCBtX2hhc1Rl
cm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxzZSkKKyAgICAsIG1fYnVmZmVySXNJbnRlcm5hbChm
YWxzZSkKIHsKICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgaGFzaCBpcyBjb21wdXRlZCBzbyB0aGF0
IEF0b21pY1N0cmluZ0hhc2ggY2FuIGNhbGwgZXhpc3RpbmdIYXNoKCkKICAgICAvLyB3aXRoIGlt
cHVuaXR5LiBUaGUgZW1wdHkgc3RyaW5nIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBpcyBuZXZlciBl
bnRlcmVkIGludG8KQEAgLTc2LDYgKzk4LDcgQEAgaW5saW5lIFN0cmluZ0ltcGw6OlN0cmluZ0lt
cGwoY29uc3QgVUNoYQogICAgICwgbV9oYXNoKDApCiAgICAgLCBtX2luVGFibGUoZmFsc2UpCiAg
ICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxzZSkKKyAgICAsIG1fYnVmZmVy
SXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBVQ2hhciogZGF0YSA9IG5ld1VDaGFyVmVjdG9yKGxl
bmd0aCk7CiAgICAgbWVtY3B5KGRhdGEsIGNoYXJhY3RlcnMsIGxlbmd0aCAqIHNpemVvZihVQ2hh
cikpOwpAQCAtODcsNiArMTEwLDcgQEAgaW5saW5lIFN0cmluZ0ltcGw6OlN0cmluZ0ltcGwoY29u
c3QgU3RyaQogICAgICwgbV9oYXNoKHN0ci5tX2hhc2gpCiAgICAgLCBtX2luVGFibGUoZmFsc2Up
CiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3Rlcih0cnVlKQorICAgICwgbV9idWZm
ZXJJc0ludGVybmFsKGZhbHNlKQogewogICAgIFVDaGFyKiBkYXRhID0gbmV3VUNoYXJWZWN0b3Io
c3RyLm1fbGVuZ3RoICsgMSk7CiAgICAgbWVtY3B5KGRhdGEsIHN0ci5tX2RhdGEsIHN0ci5tX2xl
bmd0aCAqIHNpemVvZihVQ2hhcikpOwpAQCAtOTksNiArMTIzLDcgQEAgaW5saW5lIFN0cmluZ0lt
cGw6OlN0cmluZ0ltcGwoY29uc3QgY2hhcgogICAgICwgbV9oYXNoKDApCiAgICAgLCBtX2luVGFi
bGUoZmFsc2UpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxzZSkKKyAg
ICAsIG1fYnVmZmVySXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBBU1NFUlQoY2hhcmFjdGVycyk7
CiAgICAgQVNTRVJUKGxlbmd0aCk7CkBAIC0xMTcsNiArMTQyLDcgQEAgaW5saW5lIFN0cmluZ0lt
cGw6OlN0cmluZ0ltcGwoVUNoYXIqIGNoYQogICAgICwgbV9oYXNoKDApCiAgICAgLCBtX2luVGFi
bGUoZmFsc2UpCiAgICAgLCBtX2hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlcihmYWxzZSkKKyAg
ICAsIG1fYnVmZmVySXNJbnRlcm5hbChmYWxzZSkKIHsKICAgICBBU1NFUlQoY2hhcmFjdGVycyk7
CiAgICAgQVNTRVJUKGxlbmd0aCk7CkBAIC0xMjgsNiArMTU0LDcgQEAgU3RyaW5nSW1wbDo6U3Ry
aW5nSW1wbChjb25zdCBVQ2hhciogY2hhcgogICAgICwgbV9oYXNoKGhhc2gpCiAgICAgLCBtX2lu
VGFibGUodHJ1ZSkKICAgICAsIG1faGFzVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGZhbHNlKQor
ICAgICwgbV9idWZmZXJJc0ludGVybmFsKGZhbHNlKQogewogICAgIEFTU0VSVChoYXNoKTsKICAg
ICBBU1NFUlQoY2hhcmFjdGVycyk7CkBAIC0xNDQsNiArMTcxLDcgQEAgU3RyaW5nSW1wbDo6U3Ry
aW5nSW1wbChjb25zdCBjaGFyKiBjaGFyYQogICAgICwgbV9oYXNoKGhhc2gpCiAgICAgLCBtX2lu
VGFibGUodHJ1ZSkKICAgICAsIG1faGFzVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGZhbHNlKQor
ICAgICwgbV9idWZmZXJJc0ludGVybmFsKGZhbHNlKQogewogICAgIEFTU0VSVChoYXNoKTsKICAg
ICBBU1NFUlQoY2hhcmFjdGVycyk7CkBAIC0xNjEsNyArMTg5LDggQEAgU3RyaW5nSW1wbDo6flN0
cmluZ0ltcGwoKQogewogICAgIGlmIChtX2luVGFibGUpCiAgICAgICAgIEF0b21pY1N0cmluZzo6
cmVtb3ZlKHRoaXMpOwotICAgIGRlbGV0ZVVDaGFyVmVjdG9yKG1fZGF0YSk7CisgICAgaWYgKCFt
X2J1ZmZlcklzSW50ZXJuYWwpCisgICAgICAgIGRlbGV0ZVVDaGFyVmVjdG9yKG1fZGF0YSk7CiB9
CiAKIFN0cmluZ0ltcGwqIFN0cmluZ0ltcGw6OmVtcHR5KCkKQEAgLTk0MCwyNCArOTY5LDQ0IEBA
IFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXQKIHsKICAgICBpZiAoIWNo
YXJhY3RlcnMgfHwgIWxlbmd0aCkKICAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBTdHJpbmdJbXBsKGNoYXJhY3RlcnMsIGxlbmd0aCkpOworCisgICAgLy8g
QWxsb2NhdGUgYSBzaW5nbGUgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBTdHJp
bmdJbXBsCisgICAgLy8gc3RydWN0IGFzIHdlbGwgYXMgdGhlIGRhdGEgd2hpY2ggaXQgY29udGFp
bnMuIFRoaXMgcmVtb3ZlcyBvbmUgCisgICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhpcyBj
YWxsLgorICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICogc2l6
ZW9mKFVDaGFyKTsKKyAgICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oZmFzdE1h
bGxvYyhzaXplKSk7CisgICAgVUNoYXIqIGRhdGEgPSByZWludGVycHJldF9jYXN0PFVDaGFyKj4o
YnVmZmVyICsgc2l6ZW9mKFN0cmluZ0ltcGwpKTsKKyAgICBtZW1jcHkoZGF0YSwgY2hhcmFjdGVy
cywgbGVuZ3RoICogc2l6ZW9mKFVDaGFyKSk7CisgICAgU3RyaW5nSW1wbCogc3RyaW5nID0gbmV3
IChidWZmZXIpIFN0cmluZ0ltcGwoZGF0YSwgbGVuZ3RoLCBBZG9wdEJ1ZmZlcigpKTsKKyAgICBz
dHJpbmctPm1fYnVmZmVySXNJbnRlcm5hbCA9IHRydWU7CisgICAgcmV0dXJuIGFkb3B0UmVmKHN0
cmluZyk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlKGNv
bnN0IGNoYXIqIGNoYXJhY3RlcnMsIHVuc2lnbmVkIGxlbmd0aCkKIHsKICAgICBpZiAoIWNoYXJh
Y3RlcnMgfHwgIWxlbmd0aCkKICAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJuIGFk
b3B0UmVmKG5ldyBTdHJpbmdJbXBsKGNoYXJhY3RlcnMsIGxlbmd0aCkpOworCisgICAgLy8gQWxs
b2NhdGUgYSBzaW5nbGUgYnVmZmVyIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBTdHJpbmdJ
bXBsCisgICAgLy8gc3RydWN0IGFzIHdlbGwgYXMgdGhlIGRhdGEgd2hpY2ggaXQgY29udGFpbnMu
IFRoaXMgcmVtb3ZlcyBvbmUgCisgICAgLy8gaGVhcCBhbGxvY2F0aW9uIGZyb20gdGhpcyBjYWxs
LgorICAgIHNpemVfdCBzaXplID0gc2l6ZW9mKFN0cmluZ0ltcGwpICsgbGVuZ3RoICogc2l6ZW9m
KFVDaGFyKTsKKyAgICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oZmFzdE1hbGxv
YyhzaXplKSk7CisgICAgVUNoYXIqIGRhdGEgPSByZWludGVycHJldF9jYXN0PFVDaGFyKj4oYnVm
ZmVyICsgc2l6ZW9mKFN0cmluZ0ltcGwpKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9
IGxlbmd0aDsgKytpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IGNoYXJhY3RlcnNbaV07
CisgICAgICAgIGRhdGFbaV0gPSBjOworICAgIH0KKyAgICBTdHJpbmdJbXBsKiBzdHJpbmcgPSBu
ZXcgKGJ1ZmZlcikgU3RyaW5nSW1wbChkYXRhLCBsZW5ndGgsIEFkb3B0QnVmZmVyKCkpOworICAg
IHN0cmluZy0+bV9idWZmZXJJc0ludGVybmFsID0gdHJ1ZTsKKyAgICByZXR1cm4gYWRvcHRSZWYo
c3RyaW5nKTsKIH0KIAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBsOjpjcmVhdGUo
Y29uc3QgY2hhciogc3RyaW5nKQogewogICAgIGlmICghc3RyaW5nKQogICAgICAgICByZXR1cm4g
ZW1wdHkoKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKLSAgICBpZiAo
IWxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGVtcHR5KCk7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKG5l
dyBTdHJpbmdJbXBsKHN0cmluZywgbGVuZ3RoKSk7CisgICAgcmV0dXJuIGNyZWF0ZShzdHJpbmcs
IHN0cmxlbihzdHJpbmcpKTsKIH0KIAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJbXBs
OjpjcmVhdGVXaXRoVGVybWluYXRpbmdOdWxsQ2hhcmFjdGVyKGNvbnN0IFN0cmluZ0ltcGwmIHN0
cmluZykKQEAgLTk2Nyw3ICsxMDE2LDcgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBTdHJpbmdJ
bXBsOjpjcmVhdAogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNvcHkoKQog
ewotICAgIHJldHVybiBhZG9wdFJlZihuZXcgU3RyaW5nSW1wbChtX2RhdGEsIG1fbGVuZ3RoKSk7
CisgICAgcmV0dXJuIGNyZWF0ZShtX2RhdGEsIG1fbGVuZ3RoKTsKIH0KIAogfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS90ZXh0L1N0cmluZ0ltcGwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL3RleHQvU3RyaW5nSW1wbC5oCShyZXZpc2lvbiA0
MTg4OCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vdGV4dC9TdHJpbmdJbXBsLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTE2Niw3ICsxNjYsMTQgQEAgcHVibGljOgogICAgIG9wZXJhdG9yIE5TU3RyaW5nKigp
OwogI2VuZGlmCiAKKyAgICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKik7CisKIHByaXZhdGU6
CisgICAgLy8gQWxsb2NhdGlvbiBmcm9tIGEgY3VzdG9tIGJ1ZmZlciBpcyBvbmx5IGFsbG93ZWQg
aW50ZXJuYWxseSB0byBhdm9pZAorICAgIC8vIG1pc21hdGNoZWQgYWxsb2NhdG9ycy4gIENhbGxl
cnMgc2hvdWxkIHVzZSBjcmVhdGUoKS4KKyAgICB2b2lkKiBvcGVyYXRvciBuZXcoc2l6ZV90IHNp
emUpOworICAgIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgdm9pZCogbWVtKTsKKwog
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGNyZWF0ZVN0cmlwcGluZ051bGxDaGFy
YWN0ZXJzU2xvd0Nhc2UoY29uc3QgVUNoYXIqLCB1bnNpZ25lZCBsZW5ndGgpOwogCiAgICAgdW5z
aWduZWQgbV9sZW5ndGg7CkBAIC0xNzQsNiArMTgxLDEwIEBAIHByaXZhdGU6CiAgICAgbXV0YWJs
ZSB1bnNpZ25lZCBtX2hhc2g7CiAgICAgYm9vbCBtX2luVGFibGU7CiAgICAgYm9vbCBtX2hhc1Rl
cm1pbmF0aW5nTnVsbENoYXJhY3RlcjsKKyAgICAvLyBJbiBzb21lIGNhc2VzLCB3ZSBhbGxvY2F0
ZSB0aGUgU3RyaW5nSW1wbCBzdHJ1Y3QgYW5kIGl0cyBkYXRhCisgICAgLy8gd2l0aGluIGEgc2lu
Z2xlIGhlYXAgYnVmZmVyLiBJbiB0aGlzIGNhc2UsIHRoZSBtX2RhdGEgcG9pbnRlcgorICAgIC8v
IGlzIGFuICJpbnRlcm5hbCBidWZmZXIiLCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBkZWFsbG9j
YXRlZC4KKyAgICBib29sIG1fYnVmZmVySXNJbnRlcm5hbDsKIH07CiAKIGJvb2wgZXF1YWwoU3Ry
aW5nSW1wbCosIFN0cmluZ0ltcGwqKTsK
</data>
<flag name="review"
          id="14253"
          type_id="1"
          status="+"
          setter="fishd"
    />
          </attachment>
      

    </bug>

</bugzilla>