<?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>23232</bug_id>
          
          <creation_ts>2009-01-10 17:22:40 -0800</creation_ts>
          <short_desc>Problems with Selection::appendTrailingWhitespace()</short_desc>
          <delta_ts>2009-01-12 13:08:54 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</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="Eric Roman">eroman</reporter>
          <assigned_to name="Eric Roman">eroman</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>105167</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Roman">eroman</who>
    <bug_when>2009-01-10 17:22:40 -0800</bug_when>
    <thetext>There are some problems with Selection::appendTrailingWhitespace():

1. May set endpoint to null node, causing crash in WebCore::Selection::toRange.

(This is because VisiblePosition::next() doesn&apos;t necessarily advance to same place as VisiblePosition::characterAfter(), especially if it is a non-visible character.).

2. Should match NBSP as whitespace.

3. Should search for whitepsace in sibling nodes too.
For example:
  &lt;div&gt;&lt;span&gt;doubleclickme&lt;/span&gt; &lt;/div&gt;
Should grow selection to include the whitespace outside of the span element (to be consistent with IE/FF).

&lt;background&gt;
Selection::appendTrailingWhitespace() is a codepath used only by Chromium, see http://trac.webkit.org/changeset/38735 which introduced it.
&lt;/background&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105168</commentid>
    <comment_count>1</comment_count>
      <attachid>26594</attachid>
    <who name="Eric Roman">eroman</who>
    <bug_when>2009-01-10 17:36:16 -0800</bug_when>
    <thetext>Created attachment 26594
Rewrite appendTrailingWhitespace() using CharacterIterator.

* Modified LayoutTests/editing/selection/doubleclick-whitespace.html to include additional test cases.
* Added a separate layout test for the crasher.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105219</commentid>
    <comment_count>2</comment_count>
      <attachid>26594</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-11 08:39:05 -0800</bug_when>
    <thetext>Comment on attachment 26594
Rewrite appendTrailingWhitespace() using CharacterIterator.

&gt; +    Node *n = pos.node();

WebKit coding style requires that you do Node* n rather than Node *n.

&gt; +    Document *d = n-&gt;document();
&gt; +    Node *de = d-&gt;documentElement();

Same here.

&gt; +    Node *boundary = n-&gt;enclosingBlockFlowElement();

And here.

&gt; +    if (!searchRange.get())

There&apos;s no need for .get() here. You can use the ! operator with a RefPtr without calling it.

&gt; +    for (; !charIt.atEnd() &amp;&amp; charIt.length() &gt; 0; charIt.advance(1)) {

There&apos;s no need to check atEnd() here. Once you&apos;re at the end, length is guaranteed to return 0. In WebKit style we&apos;d normally code this without the &quot;&gt; 0&quot; also.

&gt; +        if (isSpaceOrNewline(c) || c == noBreakSpace)
&gt; +            m_end = charIt.range()-&gt;endPosition();
&gt; +        else
&gt; +            break;

Maybe the should be written the other way around, with the break first, and the m_end part outside the if statement, to make the looping logic easier to understand?

Is there a reason the tab character isn&apos;t included here? As you can see in RenderStyle::isCollapsibleWhiteSpace, it&apos;s considered a form of space.

Do you need to handle newlines that actually render as hard line breaks differently from newlines that are treated as general whitespace? I guess your test 4 is supposed to be implementing that.

Patch looks good and it&apos;s *almost* a review+, but I&apos;d like you to resolve the issues I mention above and post a new patch if you don&apos;t mind.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105314</commentid>
    <comment_count>3</comment_count>
      <attachid>26627</attachid>
    <who name="Eric Roman">eroman</who>
    <bug_when>2009-01-12 02:01:33 -0800</bug_when>
    <thetext>Created attachment 26627
Rewrite appendTrailingWhitespace() using CharacterIterator.

Thanks for the review comments!


&gt; WebKit coding style requires that you do Node* n rather than Node *n.

Fixed.
Sorry about that.
I lifted this code from visible_units.cpp (nextBoundary), which must be using an older style.

&gt; There&apos;s no need for .get() here. You can use the ! operator with a RefPtr
&gt; without calling it.

Done.

&gt; There&apos;s no need to check atEnd() here. Once you&apos;re at the end, length is
&gt; guaranteed to return 0. In WebKit style we&apos;d normally code this without the &quot;&gt;
&gt; 0&quot; also.

Done.
Changed to:

  for (; charIt.length(); charIt.advance(1)) {

&gt; Maybe the should be written the other way around, with the break first, and the
&gt; m_end part outside the if statement, to make the looping logic easier to
&gt; understand?

Done.
Moved the break case to be first, so no &quot;else&quot; is needed.
Much cleaner, thanks for the suggestion.

As for moving the m_end outside of the loop, I have not done that since it hurts readability some, for the case where there is no whitespace (and m_end is not to be changed).

&gt; Is there a reason the tab character isn&apos;t included here? As you can see in
&gt; RenderStyle::isCollapsibleWhiteSpace, it&apos;s considered a form of space.

The tab character is in fact included -- it is matched by &quot;isSpaceOrNewline(c)&quot;.

Added &quot;test6&quot; to &quot;doubleclick-whitespace.html&quot;,
to ensure that tabs (0x9) are included in the selection.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105335</commentid>
    <comment_count>4</comment_count>
      <attachid>26627</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-01-12 09:03:34 -0800</bug_when>
    <thetext>Comment on attachment 26627
Rewrite appendTrailingWhitespace() using CharacterIterator.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105338</commentid>
    <comment_count>5</comment_count>
      <attachid>26635</attachid>
    <who name="Eric Roman">eroman</who>
    <bug_when>2009-01-12 10:44:30 -0800</bug_when>
    <thetext>Created attachment 26635
Rewrite appendTrailingWhitespace() using CharacterIterator.

Updated the patch to fix some indentation in doubleclick-whitespace.html.

There were two javascript functions where I had 2 space indentation instead of 4 space indentation.

This is the only change over the previous (reviewed) patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>105376</commentid>
    <comment_count>6</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-01-12 13:08:54 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/39831</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26594</attachid>
            <date>2009-01-10 17:36:16 -0800</date>
            <delta_ts>2009-01-12 02:01:33 -0800</delta_ts>
            <desc>Rewrite appendTrailingWhitespace() using CharacterIterator.</desc>
            <filename>trailing-whitespace-v1.txt</filename>
            <type>text/plain</type>
            <size>9464</size>
            <attacher name="Eric Roman">eroman</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTc4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMDEtMTAgIEVyaWMgUm9tYW4gIDxlcm9tYW5AY2hyb21pdW0u
b3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eCBzb21lIGJ1Z3Mgd2l0aCBTZWxlY3Rpb246OmFwcGVuZFRyYWlsaW5nV2hpdGVzcGFjZSgpLgor
CisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzI+
CisKKyAgICAgICAgVGVzdDogZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFj
ZS1jcmFzaC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL1NlbGVjdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlOjptYWtlU2VhcmNoUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0aW9u
OjphcHBlbmRUcmFpbGluZ1doaXRlc3BhY2UpOgorCiAyMDA5LTAxLTA5ICBIb2xnZXIgSGFucyBQ
ZXRlciBGcmV5dGhlciAgPHplY2tlQHNlbGZpc2gub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAJKHJldmlzaW9uIDM5Nzc3
KQorKysgV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2
LDEwICsyNiwxMiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlNlbGVjdGlvbi5o
IgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyTmFtZXMuaCIKICNpbmNsdWRlICJDU3RyaW5nLmgiCiAj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiaHRt
bGVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJWaXNpYmxl
UG9zaXRpb24uaCIKICNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiAjaW5jbHVkZSAiUmFuZ2Uu
aCIKQEAgLTE5MywxMiArMTk1LDQ4IEBAIGJvb2wgU2VsZWN0aW9uOjpleHBhbmRVc2luZ0dyYW51
bGFyaXR5KFQKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIFBhc3NSZWZQdHI8UmFuZ2U+
IG1ha2VTZWFyY2hSYW5nZShjb25zdCBQb3NpdGlvbiYgcG9zKQoreworICAgIE5vZGUgKm4gPSBw
b3Mubm9kZSgpOworICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRG9jdW1lbnQg
KmQgPSBuLT5kb2N1bWVudCgpOworICAgIE5vZGUgKmRlID0gZC0+ZG9jdW1lbnRFbGVtZW50KCk7
CisgICAgaWYgKCFkZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTm9kZSAqYm91bmRhcnkgPSBu
LT5lbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCk7CisgICAgaWYgKCFib3VuZGFyeSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHNlYXJjaFJhbmdlKFJhbmdlOjpjcmVh
dGUoZCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworCisgICAgUG9zaXRpb24gc3RhcnQo
cmFuZ2VDb21wbGlhbnRFcXVpdmFsZW50KHBvcykpOworICAgIHNlYXJjaFJhbmdlLT5zZWxlY3RO
b2RlQ29udGVudHMoYm91bmRhcnksIGVjKTsKKyAgICBzZWFyY2hSYW5nZS0+c2V0U3RhcnQoc3Rh
cnQubm9kZSgpLCBzdGFydC5vZmZzZXQoKSwgZWMpOworCisgICAgQVNTRVJUKCFlYyk7CisgICAg
aWYgKGVjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzZWFyY2hSYW5nZS5yZWxl
YXNlKCk7Cit9CisKIHZvaWQgU2VsZWN0aW9uOjphcHBlbmRUcmFpbGluZ1doaXRlc3BhY2UoKQog
ewotICAgIFZpc2libGVQb3NpdGlvbiBlbmQgPSBWaXNpYmxlUG9zaXRpb24obV9lbmQsIG1fYWZm
aW5pdHkpOwotICAgIHdoaWxlIChlbmQuaXNOb3ROdWxsKCkgJiYgaXNTcGFjZU9yTmV3bGluZShl
bmQuY2hhcmFjdGVyQWZ0ZXIoKSkpCi0gICAgICAgIGVuZCA9IGVuZC5uZXh0KCk7Ci0gICAgbV9l
bmQgPSBlbmQuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICBSZWZQdHI8UmFuZ2U+IHNlYXJjaFJhbmdl
ID0gbWFrZVNlYXJjaFJhbmdlKG1fZW5kKTsKKyAgICBpZiAoIXNlYXJjaFJhbmdlLmdldCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBDaGFyYWN0ZXJJdGVyYXRvciBjaGFySXQoc2VhcmNoUmFu
Z2UuZ2V0KCksIHRydWUpOworCisgICAgZm9yICg7ICFjaGFySXQuYXRFbmQoKSAmJiBjaGFySXQu
bGVuZ3RoKCkgPiAwOyBjaGFySXQuYWR2YW5jZSgxKSkgeworICAgICAgICBVQ2hhciBjID0gY2hh
ckl0LmNoYXJhY3RlcnMoKVswXTsKKyAgICAgICAgaWYgKGlzU3BhY2VPck5ld2xpbmUoYykgfHwg
YyA9PSBub0JyZWFrU3BhY2UpCisgICAgICAgICAgICBtX2VuZCA9IGNoYXJJdC5yYW5nZSgpLT5l
bmRQb3NpdGlvbigpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CiB9
CiAKIHZvaWQgU2VsZWN0aW9uOjp2YWxpZGF0ZSgpCkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAzOTc4MCkK
KysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBA
CisyMDA5LTAxLTEwICBFcmljIFJvbWFuICA8ZXJvbWFuQGNocm9taXVtLm9yZz4KKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICA8aHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzMjMyPgorCisgICAgICAgICogZWRpdGluZy9zZWxl
Y3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFjZS1jcmFzaC1leHBlY3RlZC50eHQ6IEFkZGVkLgor
ICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2gu
aHRtbDogQWRkZWQuCisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hp
dGVzcGFjZS1leHBlY3RlZC50eHQ6CisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vZG91Ymxl
Y2xpY2std2hpdGVzcGFjZS5odG1sOgorCiAyMDA5LTAxLTA5ICBTYW0gV2VpbmlnICA8c2FtQHdl
YmtpdC5vcmc+CiAKICAgICAgICAgQ2hlY2sgaW4gY29ycmVjdCByZXN1bHRzIGZvciBmYWlsaW5n
IHRlc3QuCkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13
aGl0ZXNwYWNlLWNyYXNoLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9l
ZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLWV4cGVjdGVkLnR4
dAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNs
aWNrLXdoaXRlc3BhY2UtY3Jhc2gtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCwwICsx
LDMgQEAKK0RvdWJsZS1jbGljayBpbiB0aGUgd2hpdGUgc3BhY2UgYmVsb3cgdGhpcyB0ZXh0IGJs
b2NrIC0tIHNob3VsZCBub3QgY3Jhc2guCitCVUcgMjMyMzIuCitQQVNTCkluZGV4OiBMYXlvdXRU
ZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2st
d2hpdGVzcGFjZS1jcmFzaC5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGlu
Zy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFjZS1jcmFzaC5odG1sCShyZXZpc2lvbiAw
KQpAQCAtMCwwICsxLDMwIEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK2lmICh3aW5kb3cu
bGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVtcEFz
VGV4dCgpOworICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5zZXRTbWFydEluc2VydERlbGV0ZUVu
YWJsZWQoZmFsc2UpOworICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5zZXRTZWxlY3RUcmFpbGlu
Z1doaXRlc3BhY2VFbmFibGVkKHRydWUpOworfQorPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4K
KzxwcmU+CitEb3VibGUtY2xpY2sgaW4gdGhlIHdoaXRlIHNwYWNlIGJlbG93IHRoaXMgdGV4dCBi
bG9jayAtLSBzaG91bGQgbm90IGNyYXNoLgorPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtpdC5v
cmcvc2hvd19idWcuY2dpP2lkPTIzMjMyIj5CVUcgMjMyMzI8L2E+LgorPC9wcmU+IAorPHNjcmlw
dCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRy
b2xsZXIpIHsKKyAgICAgICAgLy8gRG91YmxlIGNsaWNrIGF0IHRoZSBlbmQgb2YgdGhlIGJvZHku
CisgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlTW92ZVRvKDEwLCAxMDApOworICAgICAgICBldmVu
dFNlbmRlci5tb3VzZURvd24oKTsKKyAgICAgICAgZXZlbnRTZW5kZXIubW91c2VVcCgpOworICAg
ICAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKyAgICAgICAgZXZlbnRTZW5kZXIubW91c2VV
cCgpOworCisgICAgICAgIC8vIEFzIGxvbmcgYXMgZGlkbid0IGNyYXNoLCB3ZSBwYXNzZWQuCisg
ICAgICAgIGRvY3VtZW50LndyaXRlKCJQQVNTIik7CisgICAgfQorPC9zY3JpcHQ+Cis8L2JvZHk+
Cis8L2h0bWw+CkluZGV4OiBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGlj
ay13aGl0ZXNwYWNlLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0
aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWV4cGVjdGVkLnR4dAkocmV2aXNp
b24gMzk3NzcpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13
aGl0ZXNwYWNlLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDE1IEBACi1U
aGlzIHRlc3RzIHRoYXQgZG91YmxlLWNsaWNraW5nIGEgd29yZCBvbiB0aGUgV2luZG93cyBwbGF0
Zm9ybSBzZWxlY3RzIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB3b3JkLiAgWW91IHNob3VsZCBz
ZWUgdGhlIHdvcmQgIlBBU1MiIGJlbG93LgotCi1QQVNTCitUaGlzIHRlc3RzIHRoYXQgZG91Ymxl
LWNsaWNraW5nIGEgd29yZCBvbiB0aGUgV2luZG93cyBwbGF0Zm9ybSBzZWxlY3RzIHRoZSB3aGl0
ZXNwYWNlIGFmdGVyIHRoZSB3b3JkLgogCitEb3VibGVjbGlja21lIMKgwqDCoCB8RU5EfAorRG91
YmxlY2xpY2ttZXxFTkR8CitEb3VibGVjbGlja21lIMKgwqAgfEVORHwKK0RvdWJsZWNsaWNrbWUK
K8KgwqDCoHwoU2hvdWxkIG5vdCBoYXZlIGJlZW4gZXh0ZW5kZWQgaW50byB0aGlzIGxpbmUpfAor
RG91YmxlY2xpY2ttZSDCoMKgwqAgwqAKIAorUGFzc2VkIHRlc3QxCitQYXNzZWQgdGVzdDIKK1Bh
c3NlZCB0ZXN0MworUGFzc2VkIHRlc3Q0CitQYXNzZWQgdGVzdDUKIApJbmRleDogTGF5b3V0VGVz
dHMvZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFjZS5odG1sCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3Bh
Y2UuaHRtbAkocmV2aXNpb24gMzk3NzcpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlv
bi9kb3VibGVjbGljay13aGl0ZXNwYWNlLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTYsMzMgKzYs
MTA0IEBAIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKICAgICAgbGF5b3V0VGVz
dENvbnRyb2xsZXIuc2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGZhbHNlKTsKICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIuc2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCh0cnVl
KTsKIH0KKworZnVuY3Rpb24gZ2V0UG9zaXRpb25PZk5vZGUoaWQpCit7CisgIHZhciBuID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOworICB2YXIgcG9zID0ge3g6IDAsIHk6IDB9OworCisg
IHdoaWxlIChuKSB7CisgICAgICBwb3MueCArPSBuLm9mZnNldExlZnQgKyBuLmNsaWVudExlZnQ7
CisgICAgICBwb3MueSArPSBuLm9mZnNldFRvcCArIG4uY2xpZW50VG9wOworICAgICAgbiA9IG4u
b2Zmc2V0UGFyZW50OworICB9CisgIHJldHVybiBwb3M7Cit9CisKK2Z1bmN0aW9uIGRvdWJsZUNs
aWNrTm9kZShpZCkKK3sKKyAgICB2YXIgcG9zID0gZ2V0UG9zaXRpb25PZk5vZGUoaWQpOworICAg
IGV2ZW50U2VuZGVyLm1vdXNlTW92ZVRvKHBvcy54ICsgMiwgcG9zLnkgKyAyKTsKKyAgICBldmVu
dFNlbmRlci5tb3VzZURvd24oKTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgxKTsKKyAg
ICBldmVudFNlbmRlci5tb3VzZVVwKCk7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAw
KTsKKyAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9y
d2FyZCgxKTsKKyAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Cit9CisKK2Z1bmN0aW9uIGRvVGVz
dCh0ZXN0SWQsIGV4cGVjdGVkVGV4dCkKK3sKKyAgICAvLyBTaW11bGF0ZSBhIGRvdWJsZSBjbGlj
ay4KKyAgICBkb3VibGVDbGlja05vZGUodGVzdElkKTsKKworICAgIC8vIEdldCB0aGUgdGV4dCBv
ZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rp
b24oKTsKKyAgICB2YXIgYWN0dWFsVGV4dCA9IHNlbC5nZXRSYW5nZUF0KDApLnRvU3RyaW5nKCk7
CisKKyAgICBpZiAoZXhwZWN0ZWRUZXh0ID09IGFjdHVhbFRleHQpIHsKKyAgICAgICAgbG9nKCJQ
YXNzZWQgIiArIHRlc3RJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nKCJGYWlsZWQgIiAr
IHRlc3RJZCk7CisgICAgICAgIGxvZygiICBFeHBlY3RlZDogIiArIGV4cGVjdGVkVGV4dCk7Cisg
ICAgICAgIGxvZygiICBBY3R1YWw6ICIgKyBhY3R1YWxUZXh0KTsKKyAgICB9CisKK30KKworZnVu
Y3Rpb24gcnVuVGVzdHMoKQoreworICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7
CisgICAgICBkb1Rlc3QoInRlc3QxIiwgIkRvdWJsZWNsaWNrbWUgXHUwMGEwXHUwMGEwXHUwMGEw
ICIpOworICAgICAgZG9UZXN0KCJ0ZXN0MiIsICJEb3VibGVjbGlja21lIik7CisgICAgICBkb1Rl
c3QoInRlc3QzIiwgIkRvdWJsZWNsaWNrbWUgXHUwMGEwXHUwMGEwICIpOworICAgICAgZG9UZXN0
KCJ0ZXN0NCIsICJEb3VibGVjbGlja21lIik7CisgICAgICBkb1Rlc3QoInRlc3Q1IiwgIkRvdWJs
ZWNsaWNrbWUgIFx1MDBhMFx1MDBhMCIpOworICB9Cit9CisKK2Z1bmN0aW9uIGxvZyhtc2cpCit7
CisgICAgdmFyIGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJyk7CisgICAgbC5hcHBl
bmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtc2cpKTsKKyAgICBsLmFwcGVuZENoaWxk
KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOworfQorCiA8L3NjcmlwdD4KLTxzdHlsZT4K
LWJvZHkgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDAgfQotPC9zdHlsZT4KIDwvaGVhZD4KLTxib2R5
PgotPHByZT4KLVRoaXMgdGVzdHMgdGhhdCBkb3VibGUtY2xpY2tpbmcgYSB3b3JkIG9uIHRoZSBX
aW5kb3dzIHBsYXRmb3JtIHNlbGVjdHMgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHdvcmQuICBZ
b3Ugc2hvdWxkIHNlZSB0aGUgd29yZCAiUEFTUyIgYmVsb3cuCis8Ym9keSBvbmxvYWQ9InJ1blRl
c3RzKCkiPgogPHA+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ci0gICAgaWYgKHdp
bmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewotICAgICAgICBldmVudFNlbmRlci5tb3VzZU1v
dmVUbygyMCwgMTApOwotICAgICAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKLSAgICAgICAg
ZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMSk7Ci0gICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlVXAo
KTsKLSAgICAgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAwKTsKLSAgICAgICAgZXZlbnRT
ZW5kZXIubW91c2VEb3duKCk7Ci0gICAgICAgIGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDEpOwot
ICAgICAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Ci0gICAgICAgIHZhciBzZWwgPSB3aW5kb3cu
Z2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHZhciByYW5nZSA9IHNlbC5nZXRSYW5nZUF0KDApOwot
ICAgICAgICBpZiAocmFuZ2UudG9TdHJpbmcoKSAhPSAiVGhpcyAiKQotICAgICAgICAgICAgZG9j
dW1lbnQud3JpdGUoIkZBSUwiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZG9jdW1lbnQu
d3JpdGUoIlBBU1MiKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZG9jdW1lbnQud3JpdGUoIlRoaXMg
dGVzdCBpcyBvbmx5IGV4cGVjdGVkIHRvIHBhc3Mgd2hlbiBydW4gaW4gYXV0b21hdGVkIG1vZGUs
IHdpdGggYWNjZXNzIHRvIExheW91dFRlc3RDb250cm9sbGVyLiIpOwotPC9zY3JpcHQ+CitUaGlz
IHRlc3RzIHRoYXQgZG91YmxlLWNsaWNraW5nIGEgd29yZCBvbiB0aGUgV2luZG93cyBwbGF0Zm9y
bSBzZWxlY3RzIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB3b3JkLgorPC9wPgorCis8ZGl2Pgor
PHNwYW4gaWQ9dGVzdDE+RG91YmxlY2xpY2ttZSAmbmJzcDsmbmJzcDsmbmJzcDsgfEVORHw8L3Nw
YW4+Cis8L2Rpdj4KKworPGRpdj4KKzxzcGFuIGlkPXRlc3QyPkRvdWJsZWNsaWNrbWV8RU5EfDwv
c3Bhbj4KKzwvZGl2PgorCis8ZGl2PgorPHNwYW4gaWQ9dGVzdDM+RG91YmxlY2xpY2ttZTwvc3Bh
bj4gJm5ic3A7Jm5ic3A7IAorfEVORHw8L3NwYW4+Cis8L2Rpdj4KKworPGRpdj4KKzxkaXY+Cis8
c3BhbiBpZD0idGVzdDQiPkRvdWJsZWNsaWNrbWU8L3NwYW4+Cis8L2Rpdj4KKyZuYnNwOyZuYnNw
OyZuYnNwO3woU2hvdWxkIG5vdCBoYXZlIGJlZW4gZXh0ZW5kZWQgaW50byB0aGlzIGxpbmUpfAor
PC9kaXY+CisKKzxkaXY+Cis8c3BhbiBpZD0idGVzdDUiPkRvdWJsZWNsaWNrbWUgPC9zcGFuPiAm
bmJzcDsmbmJzcDs8aW1nIHNyYz0iZG9lcy1ub3QtZXhpc3QucG5nIiAvPiZuYnNwOyAmbmJzcDsK
KzwvZGl2PgorCis8YnIvPgorPHByZSBpZD1sb2c+Cis8L3ByZT4KKwogPC9ib2R5PgogPC9odG1s
Pgo=
</data>
<flag name="review"
          id="12641"
          type_id="1"
          status="-"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26627</attachid>
            <date>2009-01-12 02:01:33 -0800</date>
            <delta_ts>2009-01-12 10:44:30 -0800</delta_ts>
            <desc>Rewrite appendTrailingWhitespace() using CharacterIterator.</desc>
            <filename>trailing-whitespace-v2.txt</filename>
            <type>text/plain</type>
            <size>9600</size>
            <attacher name="Eric Roman">eroman</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTc4MCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMDEtMTAgIEVyaWMgUm9tYW4gIDxlcm9tYW5AY2hyb21pdW0u
b3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eCBzb21lIGJ1Z3Mgd2l0aCBTZWxlY3Rpb246OmFwcGVuZFRyYWlsaW5nV2hpdGVzcGFjZSgpLgor
CisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzI+
CisKKyAgICAgICAgVGVzdDogZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFj
ZS1jcmFzaC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL1NlbGVjdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlOjptYWtlU2VhcmNoUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0aW9u
OjphcHBlbmRUcmFpbGluZ1doaXRlc3BhY2UpOgorCiAyMDA5LTAxLTA5ICBIb2xnZXIgSGFucyBQ
ZXRlciBGcmV5dGhlciAgPHplY2tlQHNlbGZpc2gub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5
IFNpbW9uIEhhdXNtYW5uLgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAJKHJldmlzaW9uIDM5Nzc3
KQorKysgV2ViQ29yZS9lZGl0aW5nL1NlbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2
LDEwICsyNiwxMiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlNlbGVjdGlvbi5o
IgogCisjaW5jbHVkZSAiQ2hhcmFjdGVyTmFtZXMuaCIKICNpbmNsdWRlICJDU3RyaW5nLmgiCiAj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKICNpbmNsdWRlICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiaHRt
bGVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKICNpbmNsdWRlICJWaXNpYmxl
UG9zaXRpb24uaCIKICNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCiAjaW5jbHVkZSAiUmFuZ2Uu
aCIKQEAgLTE5MywxMiArMTk1LDQ3IEBAIGJvb2wgU2VsZWN0aW9uOjpleHBhbmRVc2luZ0dyYW51
bGFyaXR5KFQKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIFBhc3NSZWZQdHI8UmFuZ2U+
IG1ha2VTZWFyY2hSYW5nZShjb25zdCBQb3NpdGlvbiYgcG9zKQoreworICAgIE5vZGUqIG4gPSBw
b3Mubm9kZSgpOworICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRG9jdW1lbnQq
IGQgPSBuLT5kb2N1bWVudCgpOworICAgIE5vZGUqIGRlID0gZC0+ZG9jdW1lbnRFbGVtZW50KCk7
CisgICAgaWYgKCFkZSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgTm9kZSogYm91bmRhcnkgPSBu
LT5lbmNsb3NpbmdCbG9ja0Zsb3dFbGVtZW50KCk7CisgICAgaWYgKCFib3VuZGFyeSkKKyAgICAg
ICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8UmFuZ2U+IHNlYXJjaFJhbmdlKFJhbmdlOjpjcmVh
dGUoZCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworCisgICAgUG9zaXRpb24gc3RhcnQo
cmFuZ2VDb21wbGlhbnRFcXVpdmFsZW50KHBvcykpOworICAgIHNlYXJjaFJhbmdlLT5zZWxlY3RO
b2RlQ29udGVudHMoYm91bmRhcnksIGVjKTsKKyAgICBzZWFyY2hSYW5nZS0+c2V0U3RhcnQoc3Rh
cnQubm9kZSgpLCBzdGFydC5vZmZzZXQoKSwgZWMpOworCisgICAgQVNTRVJUKCFlYyk7CisgICAg
aWYgKGVjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBzZWFyY2hSYW5nZS5yZWxl
YXNlKCk7Cit9CisKIHZvaWQgU2VsZWN0aW9uOjphcHBlbmRUcmFpbGluZ1doaXRlc3BhY2UoKQog
ewotICAgIFZpc2libGVQb3NpdGlvbiBlbmQgPSBWaXNpYmxlUG9zaXRpb24obV9lbmQsIG1fYWZm
aW5pdHkpOwotICAgIHdoaWxlIChlbmQuaXNOb3ROdWxsKCkgJiYgaXNTcGFjZU9yTmV3bGluZShl
bmQuY2hhcmFjdGVyQWZ0ZXIoKSkpCi0gICAgICAgIGVuZCA9IGVuZC5uZXh0KCk7Ci0gICAgbV9l
bmQgPSBlbmQuZGVlcEVxdWl2YWxlbnQoKTsKKyAgICBSZWZQdHI8UmFuZ2U+IHNlYXJjaFJhbmdl
ID0gbWFrZVNlYXJjaFJhbmdlKG1fZW5kKTsKKyAgICBpZiAoIXNlYXJjaFJhbmdlKQorICAgICAg
ICByZXR1cm47CisKKyAgICBDaGFyYWN0ZXJJdGVyYXRvciBjaGFySXQoc2VhcmNoUmFuZ2UuZ2V0
KCksIHRydWUpOworCisgICAgZm9yICg7IGNoYXJJdC5sZW5ndGgoKTsgY2hhckl0LmFkdmFuY2Uo
MSkpIHsKKyAgICAgICAgVUNoYXIgYyA9IGNoYXJJdC5jaGFyYWN0ZXJzKClbMF07CisgICAgICAg
IGlmICghaXNTcGFjZU9yTmV3bGluZShjKSAmJiBjICE9IG5vQnJlYWtTcGFjZSkKKyAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICBtX2VuZCA9IGNoYXJJdC5yYW5nZSgpLT5lbmRQb3NpdGlvbigp
OworICAgIH0KIH0KIAogdm9pZCBTZWxlY3Rpb246OnZhbGlkYXRlKCkKSW5kZXg6IExheW91dFRl
c3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlz
aW9uIDM5NzgwKQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDMgKzEsMTQgQEAKKzIwMDktMDEtMTAgIEVyaWMgUm9tYW4gIDxlcm9tYW5AY2hyb21pdW0ub3Jn
PgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIDxodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzI+CisKKyAgICAgICAgKiBl
ZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLWV4cGVjdGVkLnR4
dDogQWRkZWQuCisgICAgICAgICogZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVz
cGFjZS1jcmFzaC5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBlZGl0aW5nL3NlbGVjdGlvbi9kb3Vi
bGVjbGljay13aGl0ZXNwYWNlLWV4cGVjdGVkLnR4dDoKKyAgICAgICAgKiBlZGl0aW5nL3NlbGVj
dGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLmh0bWw6CisKIDIwMDktMDEtMDkgIFNhbSBXZWlu
aWcgIDxzYW1Ad2Via2l0Lm9yZz4KIAogICAgICAgICBDaGVjayBpbiBjb3JyZWN0IHJlc3VsdHMg
Zm9yIGZhaWxpbmcgdGVzdC4KSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2Rv
dWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2gtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2gt
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rp
b24vZG91YmxlY2xpY2std2hpdGVzcGFjZS1jcmFzaC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMyBAQAorRG91YmxlLWNsaWNrIGluIHRoZSB3aGl0ZSBzcGFjZSBiZWxvdyB0
aGlzIHRleHQgYmxvY2sgLS0gc2hvdWxkIG5vdCBjcmFzaC4KK0JVRyAyMzIzMi4KK1BBU1MKSW5k
ZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2Ut
Y3Jhc2guaHRtbAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9k
b3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRU
ZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLmh0bWwJ
KHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMzAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0Pgor
aWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgeworICAgICBsYXlvdXRUZXN0Q29udHJv
bGxlci5kdW1wQXNUZXh0KCk7CisgICAgIGxheW91dFRlc3RDb250cm9sbGVyLnNldFNtYXJ0SW5z
ZXJ0RGVsZXRlRW5hYmxlZChmYWxzZSk7CisgICAgIGxheW91dFRlc3RDb250cm9sbGVyLnNldFNl
bGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQodHJ1ZSk7Cit9Cis8L3NjcmlwdD4KKzwvaGVh
ZD4KKzxib2R5PgorPHByZT4KK0RvdWJsZS1jbGljayBpbiB0aGUgd2hpdGUgc3BhY2UgYmVsb3cg
dGhpcyB0ZXh0IGJsb2NrIC0tIHNob3VsZCBub3QgY3Jhc2guCis8YSBocmVmPSJodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzIiPkJVRyAyMzIzMjwvYT4uCis8L3By
ZT4gCis8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgaWYgKHdpbmRvdy5sYXlv
dXRUZXN0Q29udHJvbGxlcikgeworICAgICAgICAvLyBEb3VibGUgY2xpY2sgYXQgdGhlIGVuZCBv
ZiB0aGUgYm9keS4KKyAgICAgICAgZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oMTAsIDEwMCk7Cisg
ICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpOworICAgICAgICBldmVudFNlbmRlci5tb3Vz
ZVVwKCk7CisgICAgICAgIGV2ZW50U2VuZGVyLm1vdXNlRG93bigpOworICAgICAgICBldmVudFNl
bmRlci5tb3VzZVVwKCk7CisKKyAgICAgICAgLy8gQXMgbG9uZyBhcyBkaWRuJ3QgY3Jhc2gsIHdl
IHBhc3NlZC4KKyAgICAgICAgZG9jdW1lbnQud3JpdGUoIlBBU1MiKTsKKyAgICB9Cis8L3Njcmlw
dD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9u
L2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtZXhwZWN0ZWQu
dHh0CShyZXZpc2lvbiAzOTc3NykKKysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2Rv
dWJsZWNsaWNrLXdoaXRlc3BhY2UtZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDYg
KzEsMTcgQEAKLVRoaXMgdGVzdHMgdGhhdCBkb3VibGUtY2xpY2tpbmcgYSB3b3JkIG9uIHRoZSBX
aW5kb3dzIHBsYXRmb3JtIHNlbGVjdHMgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHdvcmQuICBZ
b3Ugc2hvdWxkIHNlZSB0aGUgd29yZCAiUEFTUyIgYmVsb3cuCi0KLVBBU1MKK1RoaXMgdGVzdHMg
dGhhdCBkb3VibGUtY2xpY2tpbmcgYSB3b3JkIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtIHNlbGVj
dHMgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHdvcmQuCiAKK0RvdWJsZWNsaWNrbWUgwqDCoMKg
IHxFTkR8CitEb3VibGVjbGlja21lfEVORHwKK0RvdWJsZWNsaWNrbWUgwqDCoCB8RU5EfAorRG91
YmxlY2xpY2ttZQorwqDCoMKgfChTaG91bGQgbm90IGhhdmUgYmVlbiBleHRlbmRlZCBpbnRvIHRo
aXMgbGluZSl8CitEb3VibGVjbGlja21lIMKgwqDCoCDCoAorRG91YmxlY2xpY2ttZSAgwqAJCQnC
oHxFTkR8CiAKK1Bhc3NlZCB0ZXN0MQorUGFzc2VkIHRlc3QyCitQYXNzZWQgdGVzdDMKK1Bhc3Nl
ZCB0ZXN0NAorUGFzc2VkIHRlc3Q1CitQYXNzZWQgdGVzdDYKIApJbmRleDogTGF5b3V0VGVzdHMv
ZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFjZS5odG1sCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2Uu
aHRtbAkocmV2aXNpb24gMzk3NzcpCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9k
b3VibGVjbGljay13aGl0ZXNwYWNlLmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTYsMzMgKzYsMTA5
IEBAIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKICAgICAgbGF5b3V0VGVzdENv
bnRyb2xsZXIuc2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGZhbHNlKTsKICAgICAgbGF5b3V0
VGVzdENvbnRyb2xsZXIuc2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCh0cnVlKTsK
IH0KKworZnVuY3Rpb24gZ2V0UG9zaXRpb25PZk5vZGUoaWQpCit7CisgIHZhciBuID0gZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoaWQpOworICB2YXIgcG9zID0ge3g6IDAsIHk6IDB9OworCisgIHdo
aWxlIChuKSB7CisgICAgICBwb3MueCArPSBuLm9mZnNldExlZnQgKyBuLmNsaWVudExlZnQ7Cisg
ICAgICBwb3MueSArPSBuLm9mZnNldFRvcCArIG4uY2xpZW50VG9wOworICAgICAgbiA9IG4ub2Zm
c2V0UGFyZW50OworICB9CisgIHJldHVybiBwb3M7Cit9CisKK2Z1bmN0aW9uIGRvdWJsZUNsaWNr
Tm9kZShpZCkKK3sKKyAgICB2YXIgcG9zID0gZ2V0UG9zaXRpb25PZk5vZGUoaWQpOworICAgIGV2
ZW50U2VuZGVyLm1vdXNlTW92ZVRvKHBvcy54ICsgMiwgcG9zLnkgKyAyKTsKKyAgICBldmVudFNl
bmRlci5tb3VzZURvd24oKTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgxKTsKKyAgICBl
dmVudFNlbmRlci5tb3VzZVVwKCk7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAwKTsK
KyAgICBldmVudFNlbmRlci5tb3VzZURvd24oKTsKKyAgICBldmVudFNlbmRlci5sZWFwRm9yd2Fy
ZCgxKTsKKyAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Cit9CisKK2Z1bmN0aW9uIGRvVGVzdCh0
ZXN0SWQsIGV4cGVjdGVkVGV4dCkKK3sKKyAgICAvLyBTaW11bGF0ZSBhIGRvdWJsZSBjbGljay4K
KyAgICBkb3VibGVDbGlja05vZGUodGVzdElkKTsKKworICAgIC8vIEdldCB0aGUgdGV4dCBvZiB0
aGUgY3VycmVudCBzZWxlY3Rpb24uCisgICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24o
KTsKKyAgICB2YXIgYWN0dWFsVGV4dCA9IHNlbC5nZXRSYW5nZUF0KDApLnRvU3RyaW5nKCk7CisK
KyAgICBpZiAoZXhwZWN0ZWRUZXh0ID09IGFjdHVhbFRleHQpIHsKKyAgICAgICAgbG9nKCJQYXNz
ZWQgIiArIHRlc3RJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nKCJGYWlsZWQgIiArIHRl
c3RJZCk7CisgICAgICAgIGxvZygiICBFeHBlY3RlZDogIiArIGV4cGVjdGVkVGV4dCk7CisgICAg
ICAgIGxvZygiICBBY3R1YWw6ICIgKyBhY3R1YWxUZXh0KTsKKyAgICB9CisKK30KKworZnVuY3Rp
b24gcnVuVGVzdHMoKQoreworICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7Cisg
ICAgICBkb1Rlc3QoInRlc3QxIiwgIkRvdWJsZWNsaWNrbWUgXHUwMGEwXHUwMGEwXHUwMGEwICIp
OworICAgICAgZG9UZXN0KCJ0ZXN0MiIsICJEb3VibGVjbGlja21lIik7CisgICAgICBkb1Rlc3Qo
InRlc3QzIiwgIkRvdWJsZWNsaWNrbWUgXHUwMGEwXHUwMGEwICIpOworICAgICAgZG9UZXN0KCJ0
ZXN0NCIsICJEb3VibGVjbGlja21lIik7CisgICAgICBkb1Rlc3QoInRlc3Q1IiwgIkRvdWJsZWNs
aWNrbWUgIFx1MDBhMFx1MDBhMCIpOworICAgICAgZG9UZXN0KCJ0ZXN0NiIsICJEb3VibGVjbGlj
a21lICBcdTAwYTBcdFx0XHRcdTAwYTAiKTsKKyAgfQorfQorCitmdW5jdGlvbiBsb2cobXNnKQor
eworICAgIHZhciBsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZycpOworICAgIGwuYXBw
ZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobXNnKSk7CisgICAgbC5hcHBlbmRDaGls
ZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdicicpKTsKK30KKwogPC9zY3JpcHQ+Ci08c3R5bGU+
Ci1ib2R5IHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwIH0KLTwvc3R5bGU+CiA8L2hlYWQ+Ci08Ym9k
eT4KLTxwcmU+Ci1UaGlzIHRlc3RzIHRoYXQgZG91YmxlLWNsaWNraW5nIGEgd29yZCBvbiB0aGUg
V2luZG93cyBwbGF0Zm9ybSBzZWxlY3RzIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB3b3JkLiAg
WW91IHNob3VsZCBzZWUgdGhlIHdvcmQgIlBBU1MiIGJlbG93LgorPGJvZHkgb25sb2FkPSJydW5U
ZXN0cygpIj4KIDxwPgotPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgotICAgIGlmICh3
aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKLSAgICAgICAgZXZlbnRTZW5kZXIubW91c2VN
b3ZlVG8oMjAsIDEwKTsKLSAgICAgICAgZXZlbnRTZW5kZXIubW91c2VEb3duKCk7Ci0gICAgICAg
IGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDEpOwotICAgICAgICBldmVudFNlbmRlci5tb3VzZVVw
KCk7Ci0gICAgICAgIGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDEwMCk7Ci0gICAgICAgIGV2ZW50
U2VuZGVyLm1vdXNlRG93bigpOwotICAgICAgICBldmVudFNlbmRlci5sZWFwRm9yd2FyZCgxKTsK
LSAgICAgICAgZXZlbnRTZW5kZXIubW91c2VVcCgpOwotICAgICAgICB2YXIgc2VsID0gd2luZG93
LmdldFNlbGVjdGlvbigpOwotICAgICAgICB2YXIgcmFuZ2UgPSBzZWwuZ2V0UmFuZ2VBdCgwKTsK
LSAgICAgICAgaWYgKHJhbmdlLnRvU3RyaW5nKCkgIT0gIlRoaXMgIikKLSAgICAgICAgICAgIGRv
Y3VtZW50LndyaXRlKCJGQUlMIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRvY3VtZW50
LndyaXRlKCJQQVNTIik7Ci0gICAgfSBlbHNlCi0gICAgICAgIGRvY3VtZW50LndyaXRlKCJUaGlz
IHRlc3QgaXMgb25seSBleHBlY3RlZCB0byBwYXNzIHdoZW4gcnVuIGluIGF1dG9tYXRlZCBtb2Rl
LCB3aXRoIGFjY2VzcyB0byBMYXlvdXRUZXN0Q29udHJvbGxlci4iKTsKLTwvc2NyaXB0PgorVGhp
cyB0ZXN0cyB0aGF0IGRvdWJsZS1jbGlja2luZyBhIHdvcmQgb24gdGhlIFdpbmRvd3MgcGxhdGZv
cm0gc2VsZWN0cyB0aGUgd2hpdGVzcGFjZSBhZnRlciB0aGUgd29yZC4KKzwvcD4KKworPGRpdj4K
KzxzcGFuIGlkPXRlc3QxPkRvdWJsZWNsaWNrbWUgJm5ic3A7Jm5ic3A7Jm5ic3A7IHxFTkR8PC9z
cGFuPgorPC9kaXY+CisKKzxkaXY+Cis8c3BhbiBpZD10ZXN0Mj5Eb3VibGVjbGlja21lfEVORHw8
L3NwYW4+Cis8L2Rpdj4KKworPGRpdj4KKzxzcGFuIGlkPXRlc3QzPkRvdWJsZWNsaWNrbWU8L3Nw
YW4+ICZuYnNwOyZuYnNwOyAKK3xFTkR8PC9zcGFuPgorPC9kaXY+CisKKzxkaXY+Cis8ZGl2Pgor
PHNwYW4gaWQ9InRlc3Q0Ij5Eb3VibGVjbGlja21lPC9zcGFuPgorPC9kaXY+CismbmJzcDsmbmJz
cDsmbmJzcDt8KFNob3VsZCBub3QgaGF2ZSBiZWVuIGV4dGVuZGVkIGludG8gdGhpcyBsaW5lKXwK
KzwvZGl2PgorCis8ZGl2PgorPHNwYW4gaWQ9InRlc3Q1Ij5Eb3VibGVjbGlja21lIDwvc3Bhbj4g
Jm5ic3A7Jm5ic3A7PGltZyBzcmM9ImRvZXMtbm90LWV4aXN0LnBuZyIgLz4mbmJzcDsgJm5ic3A7
Cis8L2Rpdj4KKworPHByZT4KKzxzcGFuIGlkPSJ0ZXN0NiI+RG91YmxlY2xpY2ttZSA8L3NwYW4+
ICZuYnNwOwkJCSZuYnNwO3xFTkR8Cis8L3ByZT4KKworPGJyLz4KKzxwcmUgaWQ9bG9nPgorPC9w
cmU+CisKIDwvYm9keT4KIDwvaHRtbD4K
</data>
<flag name="review"
          id="12665"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26635</attachid>
            <date>2009-01-12 10:44:30 -0800</date>
            <delta_ts>2009-01-12 10:44:30 -0800</delta_ts>
            <desc>Rewrite appendTrailingWhitespace() using CharacterIterator.</desc>
            <filename>trailing-whitespace-v3.txt</filename>
            <type>text/plain</type>
            <size>9611</size>
            <attacher name="Eric Roman">eroman</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTgyNykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcgQEAKKzIwMDktMDEtMTAgIEVyaWMgUm9tYW4gIDxlcm9tYW5AY2hyb21pdW0u
b3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZp
eCBzb21lIGJ1Z3Mgd2l0aCBTZWxlY3Rpb246OmFwcGVuZFRyYWlsaW5nV2hpdGVzcGFjZSgpLgor
CisgICAgICAgIDxodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjMyMzI+
CisKKyAgICAgICAgVGVzdDogZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVzcGFj
ZS1jcmFzaC5odG1sCisKKyAgICAgICAgKiBlZGl0aW5nL1NlbGVjdGlvbi5jcHA6CisgICAgICAg
IChXZWJDb3JlOjptYWtlU2VhcmNoUmFuZ2UpOgorICAgICAgICAoV2ViQ29yZTo6U2VsZWN0aW9u
OjphcHBlbmRUcmFpbGluZ1doaXRlc3BhY2UpOgorCiAyMDA5LTAxLTEyICBBZGFtIFRyZWF0ICA8
YWRhbS50cmVhdEB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgR2Vvcmdl
IFN0YWlrb3MuCkluZGV4OiBXZWJDb3JlL2VkaXRpbmcvU2VsZWN0aW9uLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2VkaXRpbmcvU2VsZWN0aW9uLmNwcAkocmV2aXNpb24gMzk4MjcpCisrKyBX
ZWJDb3JlL2VkaXRpbmcvU2VsZWN0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsMTAgKzI2
LDEyIEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiU2VsZWN0aW9uLmgiCiAKKyNp
bmNsdWRlICJDaGFyYWN0ZXJOYW1lcy5oIgogI2luY2x1ZGUgIkNTdHJpbmcuaCIKICNpbmNsdWRl
ICJEb2N1bWVudC5oIgogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJodG1sZWRpdGlu
Zy5oIgorI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgogI2luY2x1ZGUgIlZpc2libGVQb3NpdGlv
bi5oIgogI2luY2x1ZGUgInZpc2libGVfdW5pdHMuaCIKICNpbmNsdWRlICJSYW5nZS5oIgpAQCAt
MTkzLDEyICsxOTUsNDcgQEAgYm9vbCBTZWxlY3Rpb246OmV4cGFuZFVzaW5nR3JhbnVsYXJpdHko
VAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgUGFzc1JlZlB0cjxSYW5nZT4gbWFrZVNl
YXJjaFJhbmdlKGNvbnN0IFBvc2l0aW9uJiBwb3MpCit7CisgICAgTm9kZSogbiA9IHBvcy5ub2Rl
KCk7CisgICAgaWYgKCFuKQorICAgICAgICByZXR1cm4gMDsKKyAgICBEb2N1bWVudCogZCA9IG4t
PmRvY3VtZW50KCk7CisgICAgTm9kZSogZGUgPSBkLT5kb2N1bWVudEVsZW1lbnQoKTsKKyAgICBp
ZiAoIWRlKQorICAgICAgICByZXR1cm4gMDsKKyAgICBOb2RlKiBib3VuZGFyeSA9IG4tPmVuY2xv
c2luZ0Jsb2NrRmxvd0VsZW1lbnQoKTsKKyAgICBpZiAoIWJvdW5kYXJ5KQorICAgICAgICByZXR1
cm4gMDsKKworICAgIFJlZlB0cjxSYW5nZT4gc2VhcmNoUmFuZ2UoUmFuZ2U6OmNyZWF0ZShkKSk7
CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisKKyAgICBQb3NpdGlvbiBzdGFydChyYW5nZUNv
bXBsaWFudEVxdWl2YWxlbnQocG9zKSk7CisgICAgc2VhcmNoUmFuZ2UtPnNlbGVjdE5vZGVDb250
ZW50cyhib3VuZGFyeSwgZWMpOworICAgIHNlYXJjaFJhbmdlLT5zZXRTdGFydChzdGFydC5ub2Rl
KCksIHN0YXJ0Lm9mZnNldCgpLCBlYyk7CisKKyAgICBBU1NFUlQoIWVjKTsKKyAgICBpZiAoZWMp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNlYXJjaFJhbmdlLnJlbGVhc2UoKTsK
K30KKwogdm9pZCBTZWxlY3Rpb246OmFwcGVuZFRyYWlsaW5nV2hpdGVzcGFjZSgpCiB7Ci0gICAg
VmlzaWJsZVBvc2l0aW9uIGVuZCA9IFZpc2libGVQb3NpdGlvbihtX2VuZCwgbV9hZmZpbml0eSk7
Ci0gICAgd2hpbGUgKGVuZC5pc05vdE51bGwoKSAmJiBpc1NwYWNlT3JOZXdsaW5lKGVuZC5jaGFy
YWN0ZXJBZnRlcigpKSkKLSAgICAgICAgZW5kID0gZW5kLm5leHQoKTsKLSAgICBtX2VuZCA9IGVu
ZC5kZWVwRXF1aXZhbGVudCgpOworICAgIFJlZlB0cjxSYW5nZT4gc2VhcmNoUmFuZ2UgPSBtYWtl
U2VhcmNoUmFuZ2UobV9lbmQpOworICAgIGlmICghc2VhcmNoUmFuZ2UpCisgICAgICAgIHJldHVy
bjsKKworICAgIENoYXJhY3Rlckl0ZXJhdG9yIGNoYXJJdChzZWFyY2hSYW5nZS5nZXQoKSwgdHJ1
ZSk7CisKKyAgICBmb3IgKDsgY2hhckl0Lmxlbmd0aCgpOyBjaGFySXQuYWR2YW5jZSgxKSkgewor
ICAgICAgICBVQ2hhciBjID0gY2hhckl0LmNoYXJhY3RlcnMoKVswXTsKKyAgICAgICAgaWYgKCFp
c1NwYWNlT3JOZXdsaW5lKGMpICYmIGMgIT0gbm9CcmVha1NwYWNlKQorICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIG1fZW5kID0gY2hhckl0LnJhbmdlKCktPmVuZFBvc2l0aW9uKCk7CisgICAg
fQogfQogCiB2b2lkIFNlbGVjdGlvbjo6dmFsaWRhdGUoKQpJbmRleDogTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMzk4
MjcpCisrKyBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwx
NCBAQAorMjAwOS0wMS0xMCAgRXJpYyBSb21hbiAgPGVyb21hbkBjaHJvbWl1bS5vcmc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgPGh0dHBzOi8vYnVn
cy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzIzMj4KKworICAgICAgICAqIGVkaXRpbmcv
c2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2gtZXhwZWN0ZWQudHh0OiBBZGRl
ZC4KKyAgICAgICAgKiBlZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNy
YXNoLmh0bWw6IEFkZGVkLgorICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNr
LXdoaXRlc3BhY2UtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGVkaXRpbmcvc2VsZWN0aW9uL2Rv
dWJsZWNsaWNrLXdoaXRlc3BhY2UuaHRtbDoKKwogMjAwOS0wMS0xMiAgQWxleGV5IFByb3NrdXJ5
YWtvdiAgPGFwQHdlYmtpdC5vcmc+CiAKICAgICAgICAgVXBkYXRlIHRlc3QgcmVzdWx0cy4KSW5k
ZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2Ut
Y3Jhc2gtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2Vs
ZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2gtZXhwZWN0ZWQudHh0CShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vZG91YmxlY2xpY2std2hpdGVz
cGFjZS1jcmFzaC1leHBlY3RlZC50eHQJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMyBAQAorRG91
YmxlLWNsaWNrIGluIHRoZSB3aGl0ZSBzcGFjZSBiZWxvdyB0aGlzIHRleHQgYmxvY2sgLS0gc2hv
dWxkIG5vdCBjcmFzaC4KK0JVRyAyMzIzMi4KK1BBU1MKSW5kZXg6IExheW91dFRlc3RzL2VkaXRp
bmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtY3Jhc2guaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNl
LWNyYXNoLmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlv
bi9kb3VibGVjbGljay13aGl0ZXNwYWNlLWNyYXNoLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAg
KzEsMzAgQEAKKzxodG1sPgorPGhlYWQ+Cis8c2NyaXB0PgoraWYgKHdpbmRvdy5sYXlvdXRUZXN0
Q29udHJvbGxlcikgeworICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7Cisg
ICAgIGxheW91dFRlc3RDb250cm9sbGVyLnNldFNtYXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZChmYWxz
ZSk7CisgICAgIGxheW91dFRlc3RDb250cm9sbGVyLnNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFj
ZUVuYWJsZWQodHJ1ZSk7Cit9Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHByZT4KK0Rv
dWJsZS1jbGljayBpbiB0aGUgd2hpdGUgc3BhY2UgYmVsb3cgdGhpcyB0ZXh0IGJsb2NrIC0tIHNo
b3VsZCBub3QgY3Jhc2guCis8YSBocmVmPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9MjMyMzIiPkJVRyAyMzIzMjwvYT4uCis8L3ByZT4gCis8c2NyaXB0IHR5cGU9InRl
eHQvamF2YXNjcmlwdCI+CisgICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewor
ICAgICAgICAvLyBEb3VibGUgY2xpY2sgYXQgdGhlIGVuZCBvZiB0aGUgYm9keS4KKyAgICAgICAg
ZXZlbnRTZW5kZXIubW91c2VNb3ZlVG8oMTAsIDEwMCk7CisgICAgICAgIGV2ZW50U2VuZGVyLm1v
dXNlRG93bigpOworICAgICAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7CisgICAgICAgIGV2ZW50
U2VuZGVyLm1vdXNlRG93bigpOworICAgICAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7CisKKyAg
ICAgICAgLy8gQXMgbG9uZyBhcyBkaWRuJ3QgY3Jhc2gsIHdlIHBhc3NlZC4KKyAgICAgICAgZG9j
dW1lbnQud3JpdGUoIlBBU1MiKTsKKyAgICB9Cis8L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
SW5kZXg6IExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3Bh
Y2UtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0
aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAzOTgyNykK
KysrIExheW91dFRlc3RzL2VkaXRpbmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2Ut
ZXhwZWN0ZWQudHh0CSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsMTcgQEAKLVRoaXMgdGVzdHMg
dGhhdCBkb3VibGUtY2xpY2tpbmcgYSB3b3JkIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtIHNlbGVj
dHMgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHdvcmQuICBZb3Ugc2hvdWxkIHNlZSB0aGUgd29y
ZCAiUEFTUyIgYmVsb3cuCi0KLVBBU1MKK1RoaXMgdGVzdHMgdGhhdCBkb3VibGUtY2xpY2tpbmcg
YSB3b3JkIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtIHNlbGVjdHMgdGhlIHdoaXRlc3BhY2UgYWZ0
ZXIgdGhlIHdvcmQuCiAKK0RvdWJsZWNsaWNrbWUgwqDCoMKgIHxFTkR8CitEb3VibGVjbGlja21l
fEVORHwKK0RvdWJsZWNsaWNrbWUgwqDCoCB8RU5EfAorRG91YmxlY2xpY2ttZQorwqDCoMKgfChT
aG91bGQgbm90IGhhdmUgYmVlbiBleHRlbmRlZCBpbnRvIHRoaXMgbGluZSl8CitEb3VibGVjbGlj
a21lIMKgwqDCoCDCoAorRG91YmxlY2xpY2ttZSAgwqAJCQnCoHxFTkR8CiAKK1Bhc3NlZCB0ZXN0
MQorUGFzc2VkIHRlc3QyCitQYXNzZWQgdGVzdDMKK1Bhc3NlZCB0ZXN0NAorUGFzc2VkIHRlc3Q1
CitQYXNzZWQgdGVzdDYKIApJbmRleDogTGF5b3V0VGVzdHMvZWRpdGluZy9zZWxlY3Rpb24vZG91
YmxlY2xpY2std2hpdGVzcGFjZS5odG1sCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2VkaXRp
bmcvc2VsZWN0aW9uL2RvdWJsZWNsaWNrLXdoaXRlc3BhY2UuaHRtbAkocmV2aXNpb24gMzk4Mjcp
CisrKyBMYXlvdXRUZXN0cy9lZGl0aW5nL3NlbGVjdGlvbi9kb3VibGVjbGljay13aGl0ZXNwYWNl
Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTYsMzMgKzYsMTA5IEBAIGlmICh3aW5kb3cubGF5b3V0
VGVzdENvbnRyb2xsZXIpIHsKICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0U21hcnRJbnNl
cnREZWxldGVFbmFibGVkKGZhbHNlKTsKICAgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuc2V0U2Vs
ZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCh0cnVlKTsKIH0KKworZnVuY3Rpb24gZ2V0UG9z
aXRpb25PZk5vZGUoaWQpCit7CisgICAgdmFyIG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChp
ZCk7CisgICAgdmFyIHBvcyA9IHt4OiAwLCB5OiAwfTsKKworICAgIHdoaWxlIChuKSB7CisgICAg
ICAgIHBvcy54ICs9IG4ub2Zmc2V0TGVmdCArIG4uY2xpZW50TGVmdDsKKyAgICAgICAgcG9zLnkg
Kz0gbi5vZmZzZXRUb3AgKyBuLmNsaWVudFRvcDsKKyAgICAgICAgbiA9IG4ub2Zmc2V0UGFyZW50
OworICAgIH0KKyAgICByZXR1cm4gcG9zOworfQorCitmdW5jdGlvbiBkb3VibGVDbGlja05vZGUo
aWQpCit7CisgICAgdmFyIHBvcyA9IGdldFBvc2l0aW9uT2ZOb2RlKGlkKTsKKyAgICBldmVudFNl
bmRlci5tb3VzZU1vdmVUbyhwb3MueCArIDIsIHBvcy55ICsgMik7CisgICAgZXZlbnRTZW5kZXIu
bW91c2VEb3duKCk7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMSk7CisgICAgZXZlbnRT
ZW5kZXIubW91c2VVcCgpOworICAgIGV2ZW50U2VuZGVyLmxlYXBGb3J3YXJkKDEwMCk7CisgICAg
ZXZlbnRTZW5kZXIubW91c2VEb3duKCk7CisgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMSk7
CisgICAgZXZlbnRTZW5kZXIubW91c2VVcCgpOworfQorCitmdW5jdGlvbiBkb1Rlc3QodGVzdElk
LCBleHBlY3RlZFRleHQpCit7CisgICAgLy8gU2ltdWxhdGUgYSBkb3VibGUgY2xpY2suCisgICAg
ZG91YmxlQ2xpY2tOb2RlKHRlc3RJZCk7CisKKyAgICAvLyBHZXQgdGhlIHRleHQgb2YgdGhlIGN1
cnJlbnQgc2VsZWN0aW9uLgorICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7Cisg
ICAgdmFyIGFjdHVhbFRleHQgPSBzZWwuZ2V0UmFuZ2VBdCgwKS50b1N0cmluZygpOworCisgICAg
aWYgKGV4cGVjdGVkVGV4dCA9PSBhY3R1YWxUZXh0KSB7CisgICAgICAgIGxvZygiUGFzc2VkICIg
KyB0ZXN0SWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvZygiRmFpbGVkICIgKyB0ZXN0SWQp
OworICAgICAgICBsb2coIiAgRXhwZWN0ZWQ6ICIgKyBleHBlY3RlZFRleHQpOworICAgICAgICBs
b2coIiAgQWN0dWFsOiAiICsgYWN0dWFsVGV4dCk7CisgICAgfQorCit9CisKK2Z1bmN0aW9uIHJ1
blRlc3RzKCkKK3sKKyAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAg
ICAgIGRvVGVzdCgidGVzdDEiLCAiRG91YmxlY2xpY2ttZSBcdTAwYTBcdTAwYTBcdTAwYTAgIik7
CisgICAgICAgIGRvVGVzdCgidGVzdDIiLCAiRG91YmxlY2xpY2ttZSIpOworICAgICAgICBkb1Rl
c3QoInRlc3QzIiwgIkRvdWJsZWNsaWNrbWUgXHUwMGEwXHUwMGEwICIpOworICAgICAgICBkb1Rl
c3QoInRlc3Q0IiwgIkRvdWJsZWNsaWNrbWUiKTsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0NSIsICJE
b3VibGVjbGlja21lICBcdTAwYTBcdTAwYTAiKTsKKyAgICAgICAgZG9UZXN0KCJ0ZXN0NiIsICJE
b3VibGVjbGlja21lICBcdTAwYTBcdFx0XHRcdTAwYTAiKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9u
IGxvZyhtc2cpCit7CisgICAgdmFyIGwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nJyk7
CisgICAgbC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtc2cpKTsKKyAgICBs
LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JyJykpOworfQorCiA8L3Njcmlw
dD4KLTxzdHlsZT4KLWJvZHkgeyBtYXJnaW46IDA7IHBhZGRpbmc6IDAgfQotPC9zdHlsZT4KIDwv
aGVhZD4KLTxib2R5PgotPHByZT4KLVRoaXMgdGVzdHMgdGhhdCBkb3VibGUtY2xpY2tpbmcgYSB3
b3JkIG9uIHRoZSBXaW5kb3dzIHBsYXRmb3JtIHNlbGVjdHMgdGhlIHdoaXRlc3BhY2UgYWZ0ZXIg
dGhlIHdvcmQuICBZb3Ugc2hvdWxkIHNlZSB0aGUgd29yZCAiUEFTUyIgYmVsb3cuCis8Ym9keSBv
bmxvYWQ9InJ1blRlc3RzKCkiPgogPHA+Ci08c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+
Ci0gICAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewotICAgICAgICBldmVudFNl
bmRlci5tb3VzZU1vdmVUbygyMCwgMTApOwotICAgICAgICBldmVudFNlbmRlci5tb3VzZURvd24o
KTsKLSAgICAgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMSk7Ci0gICAgICAgIGV2ZW50U2Vu
ZGVyLm1vdXNlVXAoKTsKLSAgICAgICAgZXZlbnRTZW5kZXIubGVhcEZvcndhcmQoMTAwKTsKLSAg
ICAgICAgZXZlbnRTZW5kZXIubW91c2VEb3duKCk7Ci0gICAgICAgIGV2ZW50U2VuZGVyLmxlYXBG
b3J3YXJkKDEpOwotICAgICAgICBldmVudFNlbmRlci5tb3VzZVVwKCk7Ci0gICAgICAgIHZhciBz
ZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgICAgIHZhciByYW5nZSA9IHNlbC5nZXRS
YW5nZUF0KDApOwotICAgICAgICBpZiAocmFuZ2UudG9TdHJpbmcoKSAhPSAiVGhpcyAiKQotICAg
ICAgICAgICAgZG9jdW1lbnQud3JpdGUoIkZBSUwiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAg
ICAgZG9jdW1lbnQud3JpdGUoIlBBU1MiKTsKLSAgICB9IGVsc2UKLSAgICAgICAgZG9jdW1lbnQu
d3JpdGUoIlRoaXMgdGVzdCBpcyBvbmx5IGV4cGVjdGVkIHRvIHBhc3Mgd2hlbiBydW4gaW4gYXV0
b21hdGVkIG1vZGUsIHdpdGggYWNjZXNzIHRvIExheW91dFRlc3RDb250cm9sbGVyLiIpOwotPC9z
Y3JpcHQ+CitUaGlzIHRlc3RzIHRoYXQgZG91YmxlLWNsaWNraW5nIGEgd29yZCBvbiB0aGUgV2lu
ZG93cyBwbGF0Zm9ybSBzZWxlY3RzIHRoZSB3aGl0ZXNwYWNlIGFmdGVyIHRoZSB3b3JkLgorPC9w
PgorCis8ZGl2PgorPHNwYW4gaWQ9dGVzdDE+RG91YmxlY2xpY2ttZSAmbmJzcDsmbmJzcDsmbmJz
cDsgfEVORHw8L3NwYW4+Cis8L2Rpdj4KKworPGRpdj4KKzxzcGFuIGlkPXRlc3QyPkRvdWJsZWNs
aWNrbWV8RU5EfDwvc3Bhbj4KKzwvZGl2PgorCis8ZGl2PgorPHNwYW4gaWQ9dGVzdDM+RG91Ymxl
Y2xpY2ttZTwvc3Bhbj4gJm5ic3A7Jm5ic3A7IAorfEVORHw8L3NwYW4+Cis8L2Rpdj4KKworPGRp
dj4KKzxkaXY+Cis8c3BhbiBpZD0idGVzdDQiPkRvdWJsZWNsaWNrbWU8L3NwYW4+Cis8L2Rpdj4K
KyZuYnNwOyZuYnNwOyZuYnNwO3woU2hvdWxkIG5vdCBoYXZlIGJlZW4gZXh0ZW5kZWQgaW50byB0
aGlzIGxpbmUpfAorPC9kaXY+CisKKzxkaXY+Cis8c3BhbiBpZD0idGVzdDUiPkRvdWJsZWNsaWNr
bWUgPC9zcGFuPiAmbmJzcDsmbmJzcDs8aW1nIHNyYz0iZG9lcy1ub3QtZXhpc3QucG5nIiAvPiZu
YnNwOyAmbmJzcDsKKzwvZGl2PgorCis8cHJlPgorPHNwYW4gaWQ9InRlc3Q2Ij5Eb3VibGVjbGlj
a21lIDwvc3Bhbj4gJm5ic3A7CQkJJm5ic3A7fEVORHwKKzwvcHJlPgorCis8YnIvPgorPHByZSBp
ZD1sb2c+Cis8L3ByZT4KKwogPC9ib2R5PgogPC9odG1sPgo=
</data>

          </attachment>
      

    </bug>

</bugzilla>