<?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>44831</bug_id>
          
          <creation_ts>2010-08-28 14:47:35 -0700</creation_ts>
          <short_desc>The logic to escape entities in appendEscapedContent and appendAttributeValue should be merged</short_desc>
          <delta_ts>2010-08-28 22:11:56 -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>HTML Editing</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>44288</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>abarth</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>ojan</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>271063</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 14:47:35 -0700</bug_when>
    <thetext>Currently appendEscapedContent and appendAttributeValue separately implements entity escape mechanism.  But this is a duplication of code and should be merged.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271065</commentid>
    <comment_count>1</comment_count>
      <attachid>65841</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 15:07:45 -0700</bug_when>
    <thetext>Created attachment 65841
cleanup</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271068</commentid>
    <comment_count>2</comment_count>
      <attachid>65841</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-28 15:34:47 -0700</bug_when>
    <thetext>Comment on attachment 65841
cleanup

The uses of the word &quot;escape&quot; here don&apos;t make that much sense to me. I don&apos;t think we normally talk about entities as &quot;escaped&quot;.

&gt; +enum EntityEscapeFlag {
&gt; +    EscapeNone  = 0x0000,
&gt; +    EscapeAmp   = 0x0001,
&gt; +    EscapeLt    = 0x0002,
&gt; +    EscapeGt    = 0x0004,
&gt; +    EscapeQuot  = 0x0008,
&gt; +    EscapeNbsp  = 0x0010,
&gt; +};

We normally avoid lining things up like this because if you change names it ends up unaligned later.

&gt; +static void escapeEntities(Vector&lt;UChar&gt;&amp; out, const UChar* content, size_t length, int entitiesToEscape)

The variable name &quot;entitiesToEscape&quot; here should have the word &quot;mask&quot; or something like that in it, because otherwise it seems it could be a count.

I think that escapeEntities is not a great name for a function that appends to a vector while turning certain characters into entity sequences. I would call this appendCharactersAndEntities or something like that. The key is that it&apos;s an append function, not an escape function, since it appends characters.

&gt; +    size_t positionAfterLastEntity = 0;
&gt; +    for (size_t i = 0; i &lt; length; i++) {
&gt; +        // This loop should be unfolded by compiler

What does that comment mean? Do you mean the compiler should unroll the loop? Do our compilers unroll the loop or not? I don&apos;t understand the purpose of the comment.

&gt; +        // HashMap is an overkill here because there are only 4 entities.

This seems a bit too specific a comment. I would just leave it out.

&gt; +        for (size_t m = 0; m &lt; sizeof(entityMaps) / sizeof(EntityMap); m++) {

I don&apos;t think EntityMap is a good name for a single entry in this array. I would call that single one an EntityDescription or something. The overall structure is what I&apos;d call a map, not a single entry.

&gt; +                out.append(&apos;&amp;&apos;);
&gt; +                append(out, entityMaps[m].name);
&gt; +                out.append(&apos;;&apos;);

I suggest just including the &quot;&amp;&quot; and the &quot;;&quot; in the string inside the map. The cost would be low and we&apos;d end up with easier to understand code and faster logic since we would not have three separate append calls:

&gt; +    escapeEntities(result, attribute.characters(), attribute.length(),
&gt; +                   EscapeAmp | EscapeLt | EscapeGt | EscapeQuot | (escapeNBSP ? EscapeNbsp : 0));

Normally we don&apos;t line up second lines like this. Instead we just indent four spaces. If the escapeEntities function was renamed the alignment would be screwed up. We don&apos;t like that kind of high-maintenance formatting.

&gt; +        appendNodeValue(out, text, m_range, EscapeAmp | EscapeLt | EscapeGt
&gt; +                        | (text-&gt;document()-&gt;isHTMLDocument() ? EscapeNbsp : 0));

Same comment about lining things up.

&gt; +    String content = useRenderedText ? renderedText(text, m_range) : stringValueForRange(text, m_range);
&gt; +    Vector&lt;UChar&gt; buffer;
&gt; +    escapeEntities(buffer, content.characters(), content.length(), EscapeAmp | EscapeLt | EscapeGt);
&gt; +    String markup = convertHTMLTextToInterchangeFormat(String::adopt(buffer), text);
&gt;      append(out, markup);

I think this would read better if you eliminated the local variable named markup.

We might want constants for the combinations of entities. Those could help document why they are the right set of characters to encode. For example, the minimal set for text outside of an tag is &amp;amp; and &amp;lt; but then we include &amp;gt; just because we think it&apos;s inelegant to escape one and not the other. Then we escape quote marks to make things safe for inside an attribute value. Not sure why we escape non-breaking spaces at all.

Using constants for the masks can help document all of this.

I&apos;m going to say r=me on this patch but I think you may want to do quite a bit more refinement on this before landing it, so you may want to post a new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271079</commentid>
    <comment_count>3</comment_count>
      <attachid>65842</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 17:30:44 -0700</bug_when>
    <thetext>Created attachment 65842
fixed per Darin&apos;s comment</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271084</commentid>
    <comment_count>4</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 17:40:08 -0700</bug_when>
    <thetext>Thanks for the review, Darin.

(In reply to comment #2)
&gt; (From update of attachment 65841 [details])
&gt; The uses of the word &quot;escape&quot; here don&apos;t make that much sense to me. I don&apos;t think we normally talk about entities as &quot;escaped&quot;.

I guess. Renamed Escape* to Entity*, and added EntityMaskInCDATA, EntityMaskInPCDATA, EntityMaskInHTMLPCDATA, EntityMaskInAttributeValue, and EntityMaskInHTMLAttributeValue to define masks.

&gt; &gt; +enum EntityEscapeFlag {
&gt; &gt; +    EscapeNone  = 0x0000,
&gt; &gt; +    EscapeAmp   = 0x0001,
&gt; &gt; +    EscapeLt    = 0x0002,
&gt; &gt; +    EscapeGt    = 0x0004,
&gt; &gt; +    EscapeQuot  = 0x0008,
&gt; &gt; +    EscapeNbsp  = 0x0010,
&gt; &gt; +};
&gt; 
&gt; We normally avoid lining things up like this because if you change names it ends up unaligned later.

Fixed.

&gt; &gt; +static void escapeEntities(Vector&lt;UChar&gt;&amp; out, const UChar* content, size_t length, int entitiesToEscape)
&gt; 
&gt; The variable name &quot;entitiesToEscape&quot; here should have the word &quot;mask&quot; or something like that in it, because otherwise it seems it could be a count.

Renamed to entityMask.

&gt; I think that escapeEntities is not a great name for a function that appends to a vector while turning certain characters into entity sequences. I would call this appendCharactersAndEntities or something like that. The key is that it&apos;s an append function, not an escape function, since it appends characters.

I agree. Renamed to appendCharactersReplacingEntities.

&gt; &gt; +    size_t positionAfterLastEntity = 0;
&gt; &gt; +    for (size_t i = 0; i &lt; length; i++) {
&gt; &gt; +        // This loop should be unfolded by compiler
&gt; 
&gt; What does that comment mean? Do you mean the compiler should unroll the loop? Do our compilers unroll the loop or not? I don&apos;t understand the purpose of the comment.

Removed the comment since it seemed rather redundant.

&gt; &gt; +        // HashMap is an overkill here because there are only 4 entities.
&gt; 
&gt; This seems a bit too specific a comment. I would just leave it out.

Sure, removed.

&gt; &gt; +        for (size_t m = 0; m &lt; sizeof(entityMaps) / sizeof(EntityMap); m++) {
&gt; 
&gt; I don&apos;t think EntityMap is a good name for a single entry in this array. I would call that single one an EntityDescription or something. The overall structure is what I&apos;d call a map, not a single entry.

Good point, renamed to EntityDescription.

&gt; &gt; +                out.append(&apos;&amp;&apos;);
&gt; &gt; +                append(out, entityMaps[m].name);
&gt; &gt; +                out.append(&apos;;&apos;);
&gt; 
&gt; I suggest just including the &quot;&amp;&quot; and the &quot;;&quot; in the string inside the map. The cost would be low and we&apos;d end up with easier to understand code and faster logic since we would not have three separate append calls:

Yeah, I was considering that as well but I thought having to put &amp; and ; at the beginning and at the end of each name is error prone.  But changed to the one you suggested since there are exactly four entities after all.  We can change back to the other way if we decide to add a lot more entities later.

&gt; &gt; +    escapeEntities(result, attribute.characters(), attribute.length(),
&gt; &gt; +                   EscapeAmp | EscapeLt | EscapeGt | EscapeQuot | (escapeNBSP ? EscapeNbsp : 0));
&gt; 
&gt; Normally we don&apos;t line up second lines like this. Instead we just indent four spaces. If the escapeEntities function was renamed the alignment would be screwed up. We don&apos;t like that kind of high-maintenance formatting.

Ah, XCode screwed me up on this when I copy &amp; pasted.  Fixed.

&gt; &gt; +    String content = useRenderedText ? renderedText(text, m_range) : stringValueForRange(text, m_range);
&gt; &gt; +    Vector&lt;UChar&gt; buffer;
&gt; &gt; +    escapeEntities(buffer, content.characters(), content.length(), EscapeAmp | EscapeLt | EscapeGt);
&gt; &gt; +    String markup = convertHTMLTextToInterchangeFormat(String::adopt(buffer), text);
&gt; &gt;      append(out, markup);
&gt; 
&gt; I think this would read better if you eliminated the local variable named markup.

Very good point.  Fixed.

&gt; We might want constants for the combinations of entities. Those could help document why they are the right set of characters to encode. For example, the minimal set for text outside of an tag is &amp;amp; and &amp;lt; but then we include &amp;gt; just because we think it&apos;s inelegant to escape one and not the other. Then we escape quote marks to make things safe for inside an attribute value. Not sure why we escape non-breaking spaces at all.

Yeah, I was considering this as well but since we only have 4 entities, it&apos;s okay to have them directly.  Let me know if you like my new approach.

&gt; I&apos;m going to say r=me on this patch but I think you may want to do quite a bit more refinement on this before landing it, so you may want to post a new patch.

Re-submitted.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271093</commentid>
    <comment_count>5</comment_count>
      <attachid>65842</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-28 19:28:22 -0700</bug_when>
    <thetext>Comment on attachment 65842
fixed per Darin&apos;s comment

&gt; +    EntityMaskInCDATA = EntityNone,
&gt; +    EntityMaskInPCDATA = EntityAmp | EntityLt | EntityGt,
&gt; +    EntityMaskInHTMLPCDATA = EntityMaskInPCDATA | EntityNbsp,
&gt; +    EntityMaskInAttributeValue = EntityAmp | EntityLt | EntityGt | EntityQuot,
&gt; +    EntityMaskInHTMLAttributeValue = EntityMaskInAttributeValue | EntityNbsp,

At some point I’d like to see comments on the above explaining why we escape what we do in each context. Here where we define the constants seems to be the perfect place.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271094</commentid>
    <comment_count>6</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2010-08-28 19:32:40 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Yeah, I was considering that as well but I thought having to put &amp; and ; at the beginning and at the end of each name is error prone.  But changed to the one you suggested since there are exactly four entities after all.  We can change back to the other way if we decide to add a lot more entities later.

A side thought on this: To mitigate this &quot;error prone&quot; aspect all we need to do is to add an assertion that the first character is &amp; and the last character is ; somewhere, but even better make sure we cover each case with a test and then we&apos;re fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271116</commentid>
    <comment_count>7</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 22:06:05 -0700</bug_when>
    <thetext>Thanks for reviewing all of my patches.  I really appreciate it.

(In reply to comment #5)
&gt; (From update of attachment 65842 [details])
&gt; &gt; +    EntityMaskInCDATA = EntityNone,
&gt; &gt; +    EntityMaskInPCDATA = EntityAmp | EntityLt | EntityGt,
&gt; &gt; +    EntityMaskInHTMLPCDATA = EntityMaskInPCDATA | EntityNbsp,
&gt; &gt; +    EntityMaskInAttributeValue = EntityAmp | EntityLt | EntityGt | EntityQuot,
&gt; &gt; +    EntityMaskInHTMLAttributeValue = EntityMaskInAttributeValue | EntityNbsp,
&gt; 
&gt; At some point I’d like to see comments on the above explaining why we escape what we do in each context. Here where we define the constants seems to be the perfect place.

Yes, that&apos;ll be great.  I might file a bug for that because I&apos;d like to hear reasons from original authors as well.

(In reply to comment #6)
&gt; A side thought on this: To mitigate this &quot;error prone&quot; aspect all we need to do is to add an assertion that the first character is &amp; and the last character is ; somewhere, but even better make sure we cover each case with a test and then we&apos;re fine.

Ah! assertion seems to be a good idea but I&apos;m pretty sure all the entities that are currently present (amp, lt, gt, &amp; quot, nbsp) are tested.  So I&apos;m not going to add assertion this time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>271117</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2010-08-28 22:11:56 -0700</bug_when>
    <thetext>Committed r66326: &lt;http://trac.webkit.org/changeset/66326&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65841</attachid>
            <date>2010-08-28 15:07:45 -0700</date>
            <delta_ts>2010-08-28 17:30:39 -0700</delta_ts>
            <desc>cleanup</desc>
            <filename>bug-44831-20100828150744.patch</filename>
            <type>text/plain</type>
            <size>10596</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjMxMykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjQgQEAKKzIwMTAtMDgtMjggIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhl
IGxvZ2ljIHRvIGVzY2FwZSBlbnRpdGllcyBpbiBhcHBlbmRFc2NhcGVkQ29udGVudCBhbmQgYXBw
ZW5kQXR0cmlidXRlVmFsdWUgc2hvdWxkIGJlIG1lcmdlZAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ4MzEKKworICAgICAgICBBZGRlZCBlc2NhcGVF
bnRpdGllcyB0byBlc2NhcGUgJiwgPCwgPiwgIiwgYW5kIG5ic3AgYmFzZWQgb24gdGhlIGZsYWcu
CisgICAgICAgIFJlbW92ZWQgZXNjYXBlQ29udGVudFRleHQgYmVjYXVzZSBpdCB3YXMgb25seSB1
c2VkIGluIGFwcGVuZFRleHQsIHdoaWNoIG5vdyBkaXJlY3RseSBjYWxscyBlc2NhcGVFbnRpdGll
cy4KKyAgICAgICAgUmVwbGFjZWQgYXBwZW5kRXNjYXBlZENvbnRlbnQsIHVjaGFyUmFuZ2UsIGFu
ZCBhcHBlbmRVQ2hhclJhbmdlIGJ5IGFwcGVuZE5vZGVWYWx1ZS4KKworICAgICAgICBObyBuZXcg
dGVzdHMgYXJlIGFkZGVkIHNpbmNlIHRoaXMgaXMgYSBjbGVhbnVwLgorCisgICAgICAgICogZWRp
dGluZy9tYXJrdXAuY3BwOgorICAgICAgICAoV2ViQ29yZTo6KToKKyAgICAgICAgKFdlYkNvcmU6
OmVzY2FwZUVudGl0aWVzKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVs
YXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUpOiBDYWxscyBlc2NhcGVFbnRpdGllcy4KKyAgICAg
ICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmROb2RlVmFsdWUpOiBBZGRlZC4K
KyAgICAgICAgKFdlYkNvcmU6Ok1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRUZXh0KTogQ2FsbHMg
YXBwZW5kTm9kZVZhbHVlIGFuZCBlc2NhcGVFbnRpdGllcy4KKyAgICAgICAgKFdlYkNvcmU6OnVy
bFRvTWFya3VwKTogQ2FsbHMgZXNjYXBlRW50aXRpZXMuCisKIDIwMTAtMDgtMjggIEVyaWMgQ2Fy
bHNvbiAgPGVyaWMuY2FybHNvbkBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGFu
IEJlcm5zdGVpbi4KSW5kZXg6IFdlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCShyZXZpc2lvbiA2NjI5OCkKKysrIFdlYkNv
cmUvZWRpdGluZy9tYXJrdXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05MSw2ICs5MSw1NSBAQCBw
cml2YXRlOgogICAgIFF1YWxpZmllZE5hbWUgbV9uYW1lOwogICAgIFN0cmluZyBtX3ZhbHVlOwog
fTsKKyAgICAKK2VudW0gRW50aXR5RXNjYXBlRmxhZyB7CisgICAgRXNjYXBlTm9uZSAgPSAweDAw
MDAsCisgICAgRXNjYXBlQW1wICAgPSAweDAwMDEsCisgICAgRXNjYXBlTHQgICAgPSAweDAwMDIs
CisgICAgRXNjYXBlR3QgICAgPSAweDAwMDQsCisgICAgRXNjYXBlUXVvdCAgPSAweDAwMDgsCisg
ICAgRXNjYXBlTmJzcCAgPSAweDAwMTAsCit9OworCitzdHJ1Y3QgRW50aXR5TWFwIHsKKyAgICBV
Q2hhciBlbnRpdHk7CisgICAgY29uc3QgU3RyaW5nJiBuYW1lOworICAgIEVudGl0eUVzY2FwZUZs
YWcgZmxhZzsKK307CisKK3N0YXRpYyB2b2lkIGVzY2FwZUVudGl0aWVzKFZlY3RvcjxVQ2hhcj4m
IG91dCwgY29uc3QgVUNoYXIqIGNvbnRlbnQsIHNpemVfdCBsZW5ndGgsIGludCBlbnRpdGllc1Rv
RXNjYXBlKQoreworICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBhbXBTdHJp
bmcsICgiYW1wIikpOworICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBsdFN0
cmluZywgKCJsdCIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgZ3RT
dHJpbmcsICgiZ3QiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIHF1
b3RTdHJpbmcsICgicXVvdCIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmlu
ZywgbmJzcFN0cmluZywgKCJuYnNwIikpOworCisgICAgc3RhdGljIGNvbnN0IEVudGl0eU1hcCBl
bnRpdHlNYXBzW10gPSB7CisgICAgICAgIHsgJyYnLCBhbXBTdHJpbmcsIEVzY2FwZUFtcCB9LAor
ICAgICAgICB7ICc8JywgbHRTdHJpbmcsIEVzY2FwZUx0IH0sCisgICAgICAgIHsgJz4nLCBndFN0
cmluZywgRXNjYXBlR3QgfSwKKyAgICAgICAgeyAnIicsIHF1b3RTdHJpbmcsIEVzY2FwZVF1b3Qg
fSwKKyAgICAgICAgeyBub0JyZWFrU3BhY2UsIG5ic3BTdHJpbmcsIEVzY2FwZU5ic3AgfSwKKyAg
ICB9OworCisgICAgc2l6ZV90IHBvc2l0aW9uQWZ0ZXJMYXN0RW50aXR5ID0gMDsKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIC8vIFRoaXMgbG9vcCBz
aG91bGQgYmUgdW5mb2xkZWQgYnkgY29tcGlsZXIKKyAgICAgICAgLy8gSGFzaE1hcCBpcyBhbiBv
dmVya2lsbCBoZXJlIGJlY2F1c2UgdGhlcmUgYXJlIG9ubHkgNCBlbnRpdGllcy4KKyAgICAgICAg
Zm9yIChzaXplX3QgbSA9IDA7IG0gPCBzaXplb2YoZW50aXR5TWFwcykgLyBzaXplb2YoRW50aXR5
TWFwKTsgbSsrKSB7CisgICAgICAgICAgICBpZiAoY29udGVudFtpXSA9PSBlbnRpdHlNYXBzW21d
LmVudGl0eSAmJiBlbnRpdHlNYXBzW21dLmZsYWcgJiBlbnRpdGllc1RvRXNjYXBlKSB7CisgICAg
ICAgICAgICAgICAgb3V0LmFwcGVuZChjb250ZW50ICsgcG9zaXRpb25BZnRlckxhc3RFbnRpdHks
IGkgLSBwb3NpdGlvbkFmdGVyTGFzdEVudGl0eSk7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVu
ZCgnJicpOworICAgICAgICAgICAgICAgIGFwcGVuZChvdXQsIGVudGl0eU1hcHNbbV0ubmFtZSk7
CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnOycpOworICAgICAgICAgICAgICAgIHBvc2l0
aW9uQWZ0ZXJMYXN0RW50aXR5ID0gaSArIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0LmFwcGVuZChjb250ZW50ICsgcG9z
aXRpb25BZnRlckxhc3RFbnRpdHksIGxlbmd0aCAtIHBvc2l0aW9uQWZ0ZXJMYXN0RW50aXR5KTsK
K30KIAogdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmluZ0ltcGwqLCBBdG9taWNTdHJpbmdJbXBs
Kj4gTmFtZXNwYWNlczsKIApAQCAtMTE0LDExICsxNjMsOSBAQCBwdWJsaWM6CiAKIHByaXZhdGU6
CiAgICAgdm9pZCBhcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNv
bnN0IFN0cmluZyYgYXR0cmlidXRlLCBib29sIGVzY2FwZU5CU1ApOwotICAgIFN0cmluZyBlc2Nh
cGVDb250ZW50VGV4dChjb25zdCBTdHJpbmcmLCBib29sIGVzY2FwZU5CU1ApOwogICAgIHZvaWQg
YXBwZW5kUXVvdGVkVVJMQXR0cmlidXRlVmFsdWUoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25z
dCBTdHJpbmcmIHVybFN0cmluZyk7CiAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlRm9yUmFuZ2UoY29u
c3QgTm9kZSosIGNvbnN0IFJhbmdlKik7Ci0gICAgcGFpcjxjb25zdCBVQ2hhciosIHNpemVfdD4g
dWNoYXJSYW5nZShjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UgKik7Ci0gICAgdm9pZCBhcHBlbmRV
Q2hhclJhbmdlKFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgcGFpcjxjb25zdCBVQ2hhcios
IHNpemVfdD4mIHJhbmdlKTsKKyAgICB2b2lkIGFwcGVuZE5vZGVWYWx1ZShWZWN0b3I8VUNoYXI+
JiBvdXQsIGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgaW50IGVudGl0aWVz
VG9Fc2NhcGUpOwogICAgIFN0cmluZyByZW5kZXJlZFRleHQoY29uc3QgTm9kZSosIGNvbnN0IFJh
bmdlKik7CiAgICAgYm9vbCBzaG91bGRBZGROYW1lc3BhY2VFbGVtZW50KGNvbnN0IEVsZW1lbnQq
KTsKICAgICBib29sIHNob3VsZEFkZE5hbWVzcGFjZUF0dHJpYnV0ZShjb25zdCBBdHRyaWJ1dGUq
LCBOYW1lc3BhY2VzJik7CkBAIC0yMjMsOTggKzI3MCw4IEBAIFN0cmluZyBNYXJrdXBBY2N1bXVs
YXRvcjo6dGFrZVJlc3VsdHMoKQogCiB2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRBdHRy
aWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0cmlidXRl
LCBib29sIGVzY2FwZU5CU1ApCiB7Ci0gICAgY29uc3QgVUNoYXIqIHVjaGFycyA9IGF0dHJpYnV0
ZS5jaGFyYWN0ZXJzKCk7Ci0gICAgdW5zaWduZWQgbGVuID0gYXR0cmlidXRlLmxlbmd0aCgpOwot
ICAgIHVuc2lnbmVkIGxhc3RDb3BpZWRGcm9tID0gMDsKLQotICAgIERFRklORV9TVEFUSUNfTE9D
QUwoY29uc3QgU3RyaW5nLCBhbXBFbnRpdHksICgiJmFtcDsiKSk7Ci0gICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChjb25zdCBTdHJpbmcsIGd0RW50aXR5LCAoIiZndDsiKSk7Ci0gICAgREVGSU5FX1NU
QVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGx0RW50aXR5LCAoIiZsdDsiKSk7Ci0gICAgREVGSU5F
X1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIHF1b3RFbnRpdHksICgiJnF1b3Q7IikpOwotICAg
IERFRklORV9TVEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBuYnNwRW50aXR5LCAoIiZuYnNwOyIp
KTsKLSAgICAKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICAg
ICAgVUNoYXIgYyA9IHVjaGFyc1tpXTsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgIGNh
c2UgJyYnOgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1Y2hhcnMgKyBsYXN0Q29waWVkRnJv
bSwgaSAtIGxhc3RDb3BpZWRGcm9tKTsKLSAgICAgICAgICAgIGFwcGVuZChyZXN1bHQsIGFtcEVu
dGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9IGkgKyAxOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIGNhc2UgJzwnOgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1Y2hh
cnMgKyBsYXN0Q29waWVkRnJvbSwgaSAtIGxhc3RDb3BpZWRGcm9tKTsKLSAgICAgICAgICAgIGFw
cGVuZChyZXN1bHQsIGx0RW50aXR5KTsKLSAgICAgICAgICAgIGxhc3RDb3BpZWRGcm9tID0gaSAr
IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnPic6Ci0gICAgICAgICAgICBy
ZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRGcm9tLCBpIC0gbGFzdENvcGllZEZyb20p
OwotICAgICAgICAgICAgYXBwZW5kKHJlc3VsdCwgZ3RFbnRpdHkpOwotICAgICAgICAgICAgbGFz
dENvcGllZEZyb20gPSBpICsgMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICci
JzoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGllZEZyb20sIGkg
LSBsYXN0Q29waWVkRnJvbSk7Ci0gICAgICAgICAgICBhcHBlbmQocmVzdWx0LCBxdW90RW50aXR5
KTsKLSAgICAgICAgICAgIGxhc3RDb3BpZWRGcm9tID0gaSArIDE7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgY2FzZSBub0JyZWFrU3BhY2U6Ci0gICAgICAgICAgICBpZiAoIWVzY2FwZU5C
U1ApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVj
aGFycyArIGxhc3RDb3BpZWRGcm9tLCBpIC0gbGFzdENvcGllZEZyb20pOwotICAgICAgICAgICAg
YXBwZW5kKHJlc3VsdCwgbmJzcEVudGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9
IGkgKyAxOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJlc3VsdC5hcHBlbmQodWNoYXJz
ICsgbGFzdENvcGllZEZyb20sIGxlbiAtIGxhc3RDb3BpZWRGcm9tKTsKLX0KLQotc3RhdGljIHZv
aWQgYXBwZW5kRXNjYXBlZENvbnRlbnQoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBwYWlyPGNvbnN0
IFVDaGFyKiwgc2l6ZV90PiByYW5nZSwgYm9vbCBlc2NhcGVOQlNQKQotewotICAgIGNvbnN0IFVD
aGFyKiB1Y2hhcnMgPSByYW5nZS5maXJzdDsKLSAgICB1bnNpZ25lZCBsZW4gPSByYW5nZS5zZWNv
bmQ7Ci0gICAgdW5zaWduZWQgbGFzdENvcGllZEZyb20gPSAwOwotICAgIAotICAgIERFRklORV9T
VEFUSUNfTE9DQUwoY29uc3QgU3RyaW5nLCBhbXBFbnRpdHksICgiJmFtcDsiKSk7Ci0gICAgREVG
SU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGd0RW50aXR5LCAoIiZndDsiKSk7Ci0gICAg
REVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGx0RW50aXR5LCAoIiZsdDsiKSk7Ci0g
ICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIG5ic3BFbnRpdHksICgiJm5ic3A7
IikpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAg
IFVDaGFyIGMgPSB1Y2hhcnNbaV07Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNl
ICcmJzoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGllZEZyb20s
IGkgLSBsYXN0Q29waWVkRnJvbSk7Ci0gICAgICAgICAgICBhcHBlbmQocmVzdWx0LCBhbXBFbnRp
dHkpOwotICAgICAgICAgICAgbGFzdENvcGllZEZyb20gPSBpICsgMTsKLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlICc8JzoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWNoYXJz
ICsgbGFzdENvcGllZEZyb20sIGkgLSBsYXN0Q29waWVkRnJvbSk7Ci0gICAgICAgICAgICBhcHBl
bmQocmVzdWx0LCBsdEVudGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9IGkgKyAx
OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgcmVz
dWx0LmFwcGVuZCh1Y2hhcnMgKyBsYXN0Q29waWVkRnJvbSwgaSAtIGxhc3RDb3BpZWRGcm9tKTsK
LSAgICAgICAgICAgIGFwcGVuZChyZXN1bHQsIGd0RW50aXR5KTsKLSAgICAgICAgICAgIGxhc3RD
b3BpZWRGcm9tID0gaSArIDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBub0Jy
ZWFrU3BhY2U6Ci0gICAgICAgICAgICBpZiAoIWVzY2FwZU5CU1ApCi0gICAgICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRGcm9t
LCBpIC0gbGFzdENvcGllZEZyb20pOwotICAgICAgICAgICAgYXBwZW5kKHJlc3VsdCwgbmJzcEVu
dGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9IGkgKyAxOwotICAgICAgICAgICAg
YnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmVzdWx0LmFwcGVuZCh1Y2hhcnMg
KyBsYXN0Q29waWVkRnJvbSwgbGVuIC0gbGFzdENvcGllZEZyb20pOwotfSAgICAKLQotU3RyaW5n
IE1hcmt1cEFjY3VtdWxhdG9yOjplc2NhcGVDb250ZW50VGV4dChjb25zdCBTdHJpbmcmIGluLCBi
b29sIGVzY2FwZU5CU1ApCi17Ci0gICAgVmVjdG9yPFVDaGFyPiBidWZmZXI7Ci0gICAgYXBwZW5k
RXNjYXBlZENvbnRlbnQoYnVmZmVyLCBtYWtlX3BhaXIoaW4uY2hhcmFjdGVycygpLCBpbi5sZW5n
dGgoKSksIGVzY2FwZU5CU1ApOwotICAgIHJldHVybiBTdHJpbmc6OmFkb3B0KGJ1ZmZlcik7Cisg
ICAgZXNjYXBlRW50aXRpZXMocmVzdWx0LCBhdHRyaWJ1dGUuY2hhcmFjdGVycygpLCBhdHRyaWJ1
dGUubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgRXNjYXBlQW1wIHwgRXNjYXBlTHQgfCBF
c2NhcGVHdCB8IEVzY2FwZVF1b3QgfCAoZXNjYXBlTkJTUCA/IEVzY2FwZU5ic3AgOiAwKSk7CiB9
CiAKIHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHVl
KFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCkBAIC0zNTUs
NyArMzEyLDcgQEAgU3RyaW5nIE1hcmt1cEFjY3VtdWxhdG9yOjpzdHJpbmdWYWx1ZUZvcgogICAg
IHJldHVybiBzdHI7CiB9CiAKLXBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IE1hcmt1cEFjY3Vt
dWxhdG9yOjp1Y2hhclJhbmdlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkK
K3ZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZE5vZGVWYWx1ZShWZWN0b3I8VUNoYXI+JiBv
dXQsIGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgaW50IGVudGl0aWVzVG9F
c2NhcGUpCiB7CiAgICAgU3RyaW5nIHN0ciA9IG5vZGUtPm5vZGVWYWx1ZSgpOwogICAgIGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzID0gc3RyLmNoYXJhY3RlcnMoKTsKQEAgLTM3MiwxMiArMzI5LDcg
QEAgcGFpcjxjb25zdCBVQ2hhciosIHNpemVfdD4gTWFya3VwQWNjdW11bAogICAgICAgICB9CiAg
ICAgfQogICAgIAotICAgIHJldHVybiBtYWtlX3BhaXIoY2hhcmFjdGVycywgbGVuZ3RoKTsKLX0K
LQotdm9pZCBNYXJrdXBBY2N1bXVsYXRvcjo6YXBwZW5kVUNoYXJSYW5nZShWZWN0b3I8VUNoYXI+
JiByZXN1bHQsIGNvbnN0IHBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+JiByYW5nZSkKLXsKLSAg
ICByZXN1bHQuYXBwZW5kKHJhbmdlLmZpcnN0LCByYW5nZS5zZWNvbmQpOworICAgIGVzY2FwZUVu
dGl0aWVzKG91dCwgY2hhcmFjdGVycywgbGVuZ3RoLCBlbnRpdGllc1RvRXNjYXBlKTsKIH0KIAog
U3RyaW5nIE1hcmt1cEFjY3VtdWxhdG9yOjpyZW5kZXJlZFRleHQoY29uc3QgTm9kZSogbm9kZSwg
Y29uc3QgUmFuZ2UqIHJhbmdlKQpAQCAtNDkyLDE4ICs0NDQsMjEgQEAgdm9pZCBNYXJrdXBBY2N1
bXVsYXRvcjo6YXBwZW5kVGV4dChWZWN0bwogICAgICAgICBwYXJlbnROYW1lID0gJnN0YXRpY19j
YXN0PEVsZW1lbnQqPih0ZXh0LT5wYXJlbnRFbGVtZW50KCkpLT50YWdRTmFtZSgpOwogCiAgICAg
aWYgKHBhcmVudE5hbWUgJiYgKCpwYXJlbnROYW1lID09IHNjcmlwdFRhZyB8fCAqcGFyZW50TmFt
ZSA9PSBzdHlsZVRhZyB8fCAqcGFyZW50TmFtZSA9PSB4bXBUYWcpKSB7Ci0gICAgICAgIGFwcGVu
ZFVDaGFyUmFuZ2Uob3V0LCB1Y2hhclJhbmdlKHRleHQsIG1fcmFuZ2UpKTsKKyAgICAgICAgYXBw
ZW5kTm9kZVZhbHVlKG91dCwgdGV4dCwgbV9yYW5nZSwgRXNjYXBlTm9uZSk7CiAgICAgICAgIHJl
dHVybjsKICAgICB9CiAKICAgICBpZiAoIXNob3VsZEFubm90YXRlKCkgfHwgKHBhcmVudE5hbWUg
JiYgKnBhcmVudE5hbWUgPT0gdGV4dGFyZWFUYWcpKSB7Ci0gICAgICAgIGFwcGVuZEVzY2FwZWRD
b250ZW50KG91dCwgdWNoYXJSYW5nZSh0ZXh0LCBtX3JhbmdlKSwgdGV4dC0+ZG9jdW1lbnQoKS0+
aXNIVE1MRG9jdW1lbnQoKSk7CisgICAgICAgIGFwcGVuZE5vZGVWYWx1ZShvdXQsIHRleHQsIG1f
cmFuZ2UsIEVzY2FwZUFtcCB8IEVzY2FwZUx0IHwgRXNjYXBlR3QKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHwgKHRleHQtPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkgPyBFc2NhcGVOYnNw
IDogMCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgYm9vbCB1c2VSZW5kZXJlZFRl
eHQgPSAhZW5jbG9zaW5nTm9kZVdpdGhUYWcoUG9zaXRpb24odGV4dCwgMCksIHNlbGVjdFRhZyk7
Ci0gICAgU3RyaW5nIG1hcmt1cCA9IGVzY2FwZUNvbnRlbnRUZXh0KHVzZVJlbmRlcmVkVGV4dCA/
IHJlbmRlcmVkVGV4dCh0ZXh0LCBtX3JhbmdlKSA6IHN0cmluZ1ZhbHVlRm9yUmFuZ2UodGV4dCwg
bV9yYW5nZSksIGZhbHNlKTsKLSAgICBtYXJrdXAgPSBjb252ZXJ0SFRNTFRleHRUb0ludGVyY2hh
bmdlRm9ybWF0KG1hcmt1cCwgdGV4dCk7CisgICAgU3RyaW5nIGNvbnRlbnQgPSB1c2VSZW5kZXJl
ZFRleHQgPyByZW5kZXJlZFRleHQodGV4dCwgbV9yYW5nZSkgOiBzdHJpbmdWYWx1ZUZvclJhbmdl
KHRleHQsIG1fcmFuZ2UpOworICAgIFZlY3RvcjxVQ2hhcj4gYnVmZmVyOworICAgIGVzY2FwZUVu
dGl0aWVzKGJ1ZmZlciwgY29udGVudC5jaGFyYWN0ZXJzKCksIGNvbnRlbnQubGVuZ3RoKCksIEVz
Y2FwZUFtcCB8IEVzY2FwZUx0IHwgRXNjYXBlR3QpOworICAgIFN0cmluZyBtYXJrdXAgPSBjb252
ZXJ0SFRNTFRleHRUb0ludGVyY2hhbmdlRm9ybWF0KFN0cmluZzo6YWRvcHQoYnVmZmVyKSwgdGV4
dCk7CiAgICAgYXBwZW5kKG91dCwgbWFya3VwKTsKIH0KIApAQCAtMTM1NSw3ICsxMzEwLDcgQEAg
U3RyaW5nIHVybFRvTWFya3VwKGNvbnN0IEtVUkwmIHVybCwgY29ucwogICAgIGFwcGVuZChtYXJr
dXAsICI8YSBocmVmPVwiIik7CiAgICAgYXBwZW5kKG1hcmt1cCwgdXJsLnN0cmluZygpKTsKICAg
ICBhcHBlbmQobWFya3VwLCAiXCI+Iik7Ci0gICAgYXBwZW5kRXNjYXBlZENvbnRlbnQobWFya3Vw
LCBtYWtlX3BhaXIodGl0bGUuY2hhcmFjdGVycygpLCB0aXRsZS5sZW5ndGgoKSksIGZhbHNlKTsK
KyAgICBlc2NhcGVFbnRpdGllcyhtYXJrdXAsIHRpdGxlLmNoYXJhY3RlcnMoKSwgdGl0bGUubGVu
Z3RoKCksIEVzY2FwZUFtcCB8IEVzY2FwZUx0IHwgRXNjYXBlR3QpOwogICAgIGFwcGVuZChtYXJr
dXAsICI8L2E+Iik7CiAgICAgcmV0dXJuIFN0cmluZzo6YWRvcHQobWFya3VwKTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>65842</attachid>
            <date>2010-08-28 17:30:44 -0700</date>
            <delta_ts>2010-08-28 19:28:22 -0700</delta_ts>
            <desc>fixed per Darin&apos;s comment</desc>
            <filename>bug-44831-20100828173042.patch</filename>
            <type>text/plain</type>
            <size>11240</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2NjMxMykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjUgQEAKKzIwMTAtMDgtMjggIFJ5b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVGhl
IGxvZ2ljIHRvIGVzY2FwZSBlbnRpdGllcyBpbiBhcHBlbmRFc2NhcGVkQ29udGVudCBhbmQgYXBw
ZW5kQXR0cmlidXRlVmFsdWUgc2hvdWxkIGJlIG1lcmdlZAorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ4MzEKKworICAgICAgICBBZGRlZCBhcHBlbmRD
aGFyYWN0ZXJzUmVwbGFjaW5nRW50aXRpZXMgdG8gZXNjYXBlICYsIDwsID4sICIsIGFuZCBuYnNw
IGJhc2VkIG9uIHRoZSBtYXNrLgorICAgICAgICBSZW1vdmVkIGVzY2FwZUNvbnRlbnRUZXh0IGJl
Y2F1c2UgaXQgd2FzIG9ubHkgdXNlZCBpbiBhcHBlbmRUZXh0LCB3aGljaCBub3cgZGlyZWN0bHkg
Y2FsbHMKKyAgICAgICAgYXBwZW5kQ2hhcmFjdGVyc1JlcGxhY2luZ0VudGl0aWVzLiBSZXBsYWNl
ZCBhcHBlbmRFc2NhcGVkQ29udGVudCwgdWNoYXJSYW5nZSwgYW5kIGFwcGVuZFVDaGFyUmFuZ2UK
KyAgICAgICAgYnkgYXBwZW5kTm9kZVZhbHVlLgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBhcmUg
YWRkZWQgc2luY2UgdGhpcyBpcyBhIGNsZWFudXAuCisKKyAgICAgICAgKiBlZGl0aW5nL21hcmt1
cC5jcHA6CisgICAgICAgIChXZWJDb3JlOjopOgorICAgICAgICAoV2ViQ29yZTo6YXBwZW5kQ2hh
cmFjdGVyc1JlcGxhY2luZ0VudGl0aWVzKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXJr
dXBBY2N1bXVsYXRvcjo6YXBwZW5kQXR0cmlidXRlVmFsdWUpOiBDYWxscyBhcHBlbmRDaGFyYWN0
ZXJzUmVwbGFjaW5nRW50aXRpZXMuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1bXVsYXRv
cjo6YXBwZW5kTm9kZVZhbHVlKTogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpNYXJrdXBBY2N1
bXVsYXRvcjo6YXBwZW5kVGV4dCk6IENhbGxzIGFwcGVuZE5vZGVWYWx1ZSBhbmQgYXBwZW5kQ2hh
cmFjdGVyc1JlcGxhY2luZ0VudGl0aWVzLgorICAgICAgICAoV2ViQ29yZTo6dXJsVG9NYXJrdXAp
OiBDYWxscyBlc2NhcGVFbnRpdGllcy4KKwogMjAxMC0wOC0yOCAgRXJpYyBDYXJsc29uICA8ZXJp
Yy5jYXJsc29uQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBEYW4gQmVybnN0ZWlu
LgpJbmRleDogV2ViQ29yZS9lZGl0aW5nL21hcmt1cC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9lZGl0aW5nL21hcmt1cC5jcHAJKHJldmlzaW9uIDY2Mjk4KQorKysgV2ViQ29yZS9lZGl0aW5n
L21hcmt1cC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTkxLDYgKzkxLDU3IEBAIHByaXZhdGU6CiAg
ICAgUXVhbGlmaWVkTmFtZSBtX25hbWU7CiAgICAgU3RyaW5nIG1fdmFsdWU7CiB9OworICAgIAor
ZW51bSBFbnRpdHlNYXNrIHsKKyAgICBFbnRpdHlOb25lID0gMHgwMDAwLAorICAgIEVudGl0eUFt
cCA9IDB4MDAwMSwKKyAgICBFbnRpdHlMdCA9IDB4MDAwMiwKKyAgICBFbnRpdHlHdCA9IDB4MDAw
NCwKKyAgICBFbnRpdHlRdW90ID0gMHgwMDA4LAorICAgIEVudGl0eU5ic3AgPSAweDAwMTAsCisK
KyAgICBFbnRpdHlNYXNrSW5DREFUQSA9IEVudGl0eU5vbmUsCisgICAgRW50aXR5TWFza0luUENE
QVRBID0gRW50aXR5QW1wIHwgRW50aXR5THQgfCBFbnRpdHlHdCwKKyAgICBFbnRpdHlNYXNrSW5I
VE1MUENEQVRBID0gRW50aXR5TWFza0luUENEQVRBIHwgRW50aXR5TmJzcCwKKyAgICBFbnRpdHlN
YXNrSW5BdHRyaWJ1dGVWYWx1ZSA9IEVudGl0eUFtcCB8IEVudGl0eUx0IHwgRW50aXR5R3QgfCBF
bnRpdHlRdW90LAorICAgIEVudGl0eU1hc2tJbkhUTUxBdHRyaWJ1dGVWYWx1ZSA9IEVudGl0eU1h
c2tJbkF0dHJpYnV0ZVZhbHVlIHwgRW50aXR5TmJzcCwKK307CisKK3N0cnVjdCBFbnRpdHlEZXNj
cmlwdGlvbiB7CisgICAgVUNoYXIgZW50aXR5OworICAgIGNvbnN0IFN0cmluZyYgcmVmZXJlbmNl
OworICAgIEVudGl0eU1hc2sgbWFzazsKK307CisKK3N0YXRpYyB2b2lkIGFwcGVuZENoYXJhY3Rl
cnNSZXBsYWNpbmdFbnRpdGllcyhWZWN0b3I8VUNoYXI+JiBvdXQsIGNvbnN0IFVDaGFyKiBjb250
ZW50LCBzaXplX3QgbGVuZ3RoLCBFbnRpdHlNYXNrIGVudGl0eU1hc2spCit7CisgICAgREVGSU5F
X1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcsIGFtcFJlZmVyZW5jZSwgKCImYW1wOyIpKTsKKyAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgbHRSZWZlcmVuY2UsICgiJmx0OyIp
KTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgZ3RSZWZlcmVuY2UsICgi
Jmd0OyIpKTsKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmluZywgcXVvdFJlZmVy
ZW5jZSwgKCImcXVvdDsiKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChjb25zdCBTdHJpbmcs
IG5ic3BSZWZlcmVuY2UsICgiJm5ic3A7IikpOworCisgICAgc3RhdGljIGNvbnN0IEVudGl0eURl
c2NyaXB0aW9uIGVudGl0eU1hcHNbXSA9IHsKKyAgICAgICAgeyAnJicsIGFtcFJlZmVyZW5jZSwg
RW50aXR5QW1wIH0sCisgICAgICAgIHsgJzwnLCBsdFJlZmVyZW5jZSwgRW50aXR5THQgfSwKKyAg
ICAgICAgeyAnPicsIGd0UmVmZXJlbmNlLCBFbnRpdHlHdCB9LAorICAgICAgICB7ICciJywgcXVv
dFJlZmVyZW5jZSwgRW50aXR5UXVvdCB9LAorICAgICAgICB7IG5vQnJlYWtTcGFjZSwgbmJzcFJl
ZmVyZW5jZSwgRW50aXR5TmJzcCB9LAorICAgIH07CisKKyAgICBzaXplX3QgcG9zaXRpb25BZnRl
ckxhc3RFbnRpdHkgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysp
IHsKKyAgICAgICAgZm9yIChzaXplX3QgbSA9IDA7IG0gPCBzaXplb2YoZW50aXR5TWFwcykgLyBz
aXplb2YoRW50aXR5RGVzY3JpcHRpb24pOyBtKyspIHsKKyAgICAgICAgICAgIGlmIChjb250ZW50
W2ldID09IGVudGl0eU1hcHNbbV0uZW50aXR5ICYmIGVudGl0eU1hcHNbbV0ubWFzayAmIGVudGl0
eU1hc2spIHsKKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKGNvbnRlbnQgKyBwb3NpdGlvbkFm
dGVyTGFzdEVudGl0eSwgaSAtIHBvc2l0aW9uQWZ0ZXJMYXN0RW50aXR5KTsKKyAgICAgICAgICAg
ICAgICBhcHBlbmQob3V0LCBlbnRpdHlNYXBzW21dLnJlZmVyZW5jZSk7CisgICAgICAgICAgICAg
ICAgcG9zaXRpb25BZnRlckxhc3RFbnRpdHkgPSBpICsgMTsKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvdXQuYXBwZW5kKGNvbnRl
bnQgKyBwb3NpdGlvbkFmdGVyTGFzdEVudGl0eSwgbGVuZ3RoIC0gcG9zaXRpb25BZnRlckxhc3RF
bnRpdHkpOworfQogCiB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEF0b21pY1N0
cmluZ0ltcGwqPiBOYW1lc3BhY2VzOwogCkBAIC0xMTMsMTIgKzE2NCwxMCBAQCBwdWJsaWM6CiAg
ICAgU3RyaW5nIHRha2VSZXN1bHRzKCk7CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBhcHBlbmRBdHRy
aWJ1dGVWYWx1ZShWZWN0b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0cmlidXRl
LCBib29sIGVzY2FwZU5CU1ApOwotICAgIFN0cmluZyBlc2NhcGVDb250ZW50VGV4dChjb25zdCBT
dHJpbmcmLCBib29sIGVzY2FwZU5CU1ApOworICAgIHZvaWQgYXBwZW5kQXR0cmlidXRlVmFsdWUo
VmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBjb25zdCBTdHJpbmcmIGF0dHJpYnV0ZSwgYm9vbCBkb2N1
bWVudElzSFRNTCk7CiAgICAgdm9pZCBhcHBlbmRRdW90ZWRVUkxBdHRyaWJ1dGVWYWx1ZShWZWN0
b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgdXJsU3RyaW5nKTsKICAgICBTdHJpbmcg
c3RyaW5nVmFsdWVGb3JSYW5nZShjb25zdCBOb2RlKiwgY29uc3QgUmFuZ2UqKTsKLSAgICBwYWly
PGNvbnN0IFVDaGFyKiwgc2l6ZV90PiB1Y2hhclJhbmdlKGNvbnN0IE5vZGUqLCBjb25zdCBSYW5n
ZSAqKTsKLSAgICB2b2lkIGFwcGVuZFVDaGFyUmFuZ2UoVmVjdG9yPFVDaGFyPiYgcmVzdWx0LCBj
b25zdCBwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PiYgcmFuZ2UpOworICAgIHZvaWQgYXBwZW5k
Tm9kZVZhbHVlKFZlY3RvcjxVQ2hhcj4mIG91dCwgY29uc3QgTm9kZSosIGNvbnN0IFJhbmdlKiwg
RW50aXR5TWFzayk7CiAgICAgU3RyaW5nIHJlbmRlcmVkVGV4dChjb25zdCBOb2RlKiwgY29uc3Qg
UmFuZ2UqKTsKICAgICBib29sIHNob3VsZEFkZE5hbWVzcGFjZUVsZW1lbnQoY29uc3QgRWxlbWVu
dCopOwogICAgIGJvb2wgc2hvdWxkQWRkTmFtZXNwYWNlQXR0cmlidXRlKGNvbnN0IEF0dHJpYnV0
ZSosIE5hbWVzcGFjZXMmKTsKQEAgLTIyMSwxMDAgKzI3MCwxMCBAQCBTdHJpbmcgTWFya3VwQWNj
dW11bGF0b3I6OnRha2VSZXN1bHRzKCkKICAgICByZXR1cm4gU3RyaW5nOjphZG9wdChyZXN1bHQp
OwogfQogCi12b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0
b3I8VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0cmlidXRlLCBib29sIGVzY2FwZU5C
U1ApCit2b2lkIE1hcmt1cEFjY3VtdWxhdG9yOjphcHBlbmRBdHRyaWJ1dGVWYWx1ZShWZWN0b3I8
VUNoYXI+JiByZXN1bHQsIGNvbnN0IFN0cmluZyYgYXR0cmlidXRlLCBib29sIGRvY3VtZW50SXNI
VE1MKQogewotICAgIGNvbnN0IFVDaGFyKiB1Y2hhcnMgPSBhdHRyaWJ1dGUuY2hhcmFjdGVycygp
OwotICAgIHVuc2lnbmVkIGxlbiA9IGF0dHJpYnV0ZS5sZW5ndGgoKTsKLSAgICB1bnNpZ25lZCBs
YXN0Q29waWVkRnJvbSA9IDA7Ci0KLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNvbnN0IFN0cmlu
ZywgYW1wRW50aXR5LCAoIiZhbXA7IikpOwotICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29uc3Qg
U3RyaW5nLCBndEVudGl0eSwgKCImZ3Q7IikpOwotICAgIERFRklORV9TVEFUSUNfTE9DQUwoY29u
c3QgU3RyaW5nLCBsdEVudGl0eSwgKCImbHQ7IikpOwotICAgIERFRklORV9TVEFUSUNfTE9DQUwo
Y29uc3QgU3RyaW5nLCBxdW90RW50aXR5LCAoIiZxdW90OyIpKTsKLSAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKGNvbnN0IFN0cmluZywgbmJzcEVudGl0eSwgKCImbmJzcDsiKSk7Ci0gICAgCi0gICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytpKSB7Ci0gICAgICAgIFVDaGFyIGMgPSB1
Y2hhcnNbaV07Ci0gICAgICAgIHN3aXRjaCAoYykgewotICAgICAgICBjYXNlICcmJzoKLSAgICAg
ICAgICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGllZEZyb20sIGkgLSBsYXN0Q29w
aWVkRnJvbSk7Ci0gICAgICAgICAgICBhcHBlbmQocmVzdWx0LCBhbXBFbnRpdHkpOwotICAgICAg
ICAgICAgbGFzdENvcGllZEZyb20gPSBpICsgMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICBjYXNlICc8JzoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGll
ZEZyb20sIGkgLSBsYXN0Q29waWVkRnJvbSk7Ci0gICAgICAgICAgICBhcHBlbmQocmVzdWx0LCBs
dEVudGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9IGkgKyAxOwotICAgICAgICAg
ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJz4nOgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1
Y2hhcnMgKyBsYXN0Q29waWVkRnJvbSwgaSAtIGxhc3RDb3BpZWRGcm9tKTsKLSAgICAgICAgICAg
IGFwcGVuZChyZXN1bHQsIGd0RW50aXR5KTsKLSAgICAgICAgICAgIGxhc3RDb3BpZWRGcm9tID0g
aSArIDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAg
ICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRGcm9tLCBpIC0gbGFzdENvcGllZEZy
b20pOwotICAgICAgICAgICAgYXBwZW5kKHJlc3VsdCwgcXVvdEVudGl0eSk7Ci0gICAgICAgICAg
ICBsYXN0Q29waWVkRnJvbSA9IGkgKyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2Ugbm9CcmVha1NwYWNlOgotICAgICAgICAgICAgaWYgKCFlc2NhcGVOQlNQKQotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh1Y2hhcnMgKyBsYXN0Q29w
aWVkRnJvbSwgaSAtIGxhc3RDb3BpZWRGcm9tKTsKLSAgICAgICAgICAgIGFwcGVuZChyZXN1bHQs
IG5ic3BFbnRpdHkpOwotICAgICAgICAgICAgbGFzdENvcGllZEZyb20gPSBpICsgMTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRG
cm9tLCBsZW4gLSBsYXN0Q29waWVkRnJvbSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFwcGVuZEVzY2Fw
ZWRDb250ZW50KFZlY3RvcjxVQ2hhcj4mIHJlc3VsdCwgcGFpcjxjb25zdCBVQ2hhciosIHNpemVf
dD4gcmFuZ2UsIGJvb2wgZXNjYXBlTkJTUCkKLXsKLSAgICBjb25zdCBVQ2hhciogdWNoYXJzID0g
cmFuZ2UuZmlyc3Q7Ci0gICAgdW5zaWduZWQgbGVuID0gcmFuZ2Uuc2Vjb25kOwotICAgIHVuc2ln
bmVkIGxhc3RDb3BpZWRGcm9tID0gMDsKLSAgICAKLSAgICBERUZJTkVfU1RBVElDX0xPQ0FMKGNv
bnN0IFN0cmluZywgYW1wRW50aXR5LCAoIiZhbXA7IikpOwotICAgIERFRklORV9TVEFUSUNfTE9D
QUwoY29uc3QgU3RyaW5nLCBndEVudGl0eSwgKCImZ3Q7IikpOwotICAgIERFRklORV9TVEFUSUNf
TE9DQUwoY29uc3QgU3RyaW5nLCBsdEVudGl0eSwgKCImbHQ7IikpOwotICAgIERFRklORV9TVEFU
SUNfTE9DQUwoY29uc3QgU3RyaW5nLCBuYnNwRW50aXR5LCAoIiZuYnNwOyIpKTsKLQotICAgIGZv
ciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgewotICAgICAgICBVQ2hhciBjID0gdWNo
YXJzW2ldOwotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSAnJic6Ci0gICAgICAg
ICAgICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRGcm9tLCBpIC0gbGFzdENvcGll
ZEZyb20pOwotICAgICAgICAgICAgYXBwZW5kKHJlc3VsdCwgYW1wRW50aXR5KTsKLSAgICAgICAg
ICAgIGxhc3RDb3BpZWRGcm9tID0gaSArIDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAg
Y2FzZSAnPCc6Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHVjaGFycyArIGxhc3RDb3BpZWRG
cm9tLCBpIC0gbGFzdENvcGllZEZyb20pOwotICAgICAgICAgICAgYXBwZW5kKHJlc3VsdCwgbHRF
bnRpdHkpOwotICAgICAgICAgICAgbGFzdENvcGllZEZyb20gPSBpICsgMTsKLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlICc+JzoKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodWNo
YXJzICsgbGFzdENvcGllZEZyb20sIGkgLSBsYXN0Q29waWVkRnJvbSk7Ci0gICAgICAgICAgICBh
cHBlbmQocmVzdWx0LCBndEVudGl0eSk7Ci0gICAgICAgICAgICBsYXN0Q29waWVkRnJvbSA9IGkg
KyAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ugbm9CcmVha1NwYWNlOgotICAg
ICAgICAgICAgaWYgKCFlc2NhcGVOQlNQKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICAgICAgcmVzdWx0LmFwcGVuZCh1Y2hhcnMgKyBsYXN0Q29waWVkRnJvbSwgaSAtIGxhc3RDb3Bp
ZWRGcm9tKTsKLSAgICAgICAgICAgIGFwcGVuZChyZXN1bHQsIG5ic3BFbnRpdHkpOwotICAgICAg
ICAgICAgbGFzdENvcGllZEZyb20gPSBpICsgMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIHJlc3VsdC5hcHBlbmQodWNoYXJzICsgbGFzdENvcGllZEZy
b20sIGxlbiAtIGxhc3RDb3BpZWRGcm9tKTsKLX0gICAgCi0KLVN0cmluZyBNYXJrdXBBY2N1bXVs
YXRvcjo6ZXNjYXBlQ29udGVudFRleHQoY29uc3QgU3RyaW5nJiBpbiwgYm9vbCBlc2NhcGVOQlNQ
KQotewotICAgIFZlY3RvcjxVQ2hhcj4gYnVmZmVyOwotICAgIGFwcGVuZEVzY2FwZWRDb250ZW50
KGJ1ZmZlciwgbWFrZV9wYWlyKGluLmNoYXJhY3RlcnMoKSwgaW4ubGVuZ3RoKCkpLCBlc2NhcGVO
QlNQKTsKLSAgICByZXR1cm4gU3RyaW5nOjphZG9wdChidWZmZXIpOworICAgIGFwcGVuZENoYXJh
Y3RlcnNSZXBsYWNpbmdFbnRpdGllcyhyZXN1bHQsIGF0dHJpYnV0ZS5jaGFyYWN0ZXJzKCksIGF0
dHJpYnV0ZS5sZW5ndGgoKSwKKyAgICAgICAgZG9jdW1lbnRJc0hUTUwgPyBFbnRpdHlNYXNrSW5I
VE1MQXR0cmlidXRlVmFsdWUgOiBFbnRpdHlNYXNrSW5BdHRyaWJ1dGVWYWx1ZSk7CiB9CiAKIHZv
aWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFF1b3RlZFVSTEF0dHJpYnV0ZVZhbHVlKFZlY3Rv
cjxVQ2hhcj4mIHJlc3VsdCwgY29uc3QgU3RyaW5nJiB1cmxTdHJpbmcpCkBAIC0zNTUsNyArMzE0
LDcgQEAgU3RyaW5nIE1hcmt1cEFjY3VtdWxhdG9yOjpzdHJpbmdWYWx1ZUZvcgogICAgIHJldHVy
biBzdHI7CiB9CiAKLXBhaXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IE1hcmt1cEFjY3VtdWxhdG9y
Ojp1Y2hhclJhbmdlKGNvbnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSkKK3ZvaWQg
TWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZE5vZGVWYWx1ZShWZWN0b3I8VUNoYXI+JiBvdXQsIGNv
bnN0IE5vZGUqIG5vZGUsIGNvbnN0IFJhbmdlKiByYW5nZSwgRW50aXR5TWFzayBlbnRpdHlNYXNr
KQogewogICAgIFN0cmluZyBzdHIgPSBub2RlLT5ub2RlVmFsdWUoKTsKICAgICBjb25zdCBVQ2hh
ciogY2hhcmFjdGVycyA9IHN0ci5jaGFyYWN0ZXJzKCk7CkBAIC0zNzIsMTIgKzMzMSw3IEBAIHBh
aXI8Y29uc3QgVUNoYXIqLCBzaXplX3Q+IE1hcmt1cEFjY3VtdWwKICAgICAgICAgfQogICAgIH0K
ICAgICAKLSAgICByZXR1cm4gbWFrZV9wYWlyKGNoYXJhY3RlcnMsIGxlbmd0aCk7Ci19Ci0KLXZv
aWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZFVDaGFyUmFuZ2UoVmVjdG9yPFVDaGFyPiYgcmVz
dWx0LCBjb25zdCBwYWlyPGNvbnN0IFVDaGFyKiwgc2l6ZV90PiYgcmFuZ2UpCi17Ci0gICAgcmVz
dWx0LmFwcGVuZChyYW5nZS5maXJzdCwgcmFuZ2Uuc2Vjb25kKTsKKyAgICBhcHBlbmRDaGFyYWN0
ZXJzUmVwbGFjaW5nRW50aXRpZXMob3V0LCBjaGFyYWN0ZXJzLCBsZW5ndGgsIGVudGl0eU1hc2sp
OwogfQogCiBTdHJpbmcgTWFya3VwQWNjdW11bGF0b3I6OnJlbmRlcmVkVGV4dChjb25zdCBOb2Rl
KiBub2RlLCBjb25zdCBSYW5nZSogcmFuZ2UpCkBAIC00OTIsMTkgKzQ0NiwyMCBAQCB2b2lkIE1h
cmt1cEFjY3VtdWxhdG9yOjphcHBlbmRUZXh0KFZlY3RvCiAgICAgICAgIHBhcmVudE5hbWUgPSAm
c3RhdGljX2Nhc3Q8RWxlbWVudCo+KHRleHQtPnBhcmVudEVsZW1lbnQoKSktPnRhZ1FOYW1lKCk7
CiAKICAgICBpZiAocGFyZW50TmFtZSAmJiAoKnBhcmVudE5hbWUgPT0gc2NyaXB0VGFnIHx8ICpw
YXJlbnROYW1lID09IHN0eWxlVGFnIHx8ICpwYXJlbnROYW1lID09IHhtcFRhZykpIHsKLSAgICAg
ICAgYXBwZW5kVUNoYXJSYW5nZShvdXQsIHVjaGFyUmFuZ2UodGV4dCwgbV9yYW5nZSkpOworICAg
ICAgICBhcHBlbmROb2RlVmFsdWUob3V0LCB0ZXh0LCBtX3JhbmdlLCBFbnRpdHlNYXNrSW5DREFU
QSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpZiAoIXNob3VsZEFubm90YXRlKCkg
fHwgKHBhcmVudE5hbWUgJiYgKnBhcmVudE5hbWUgPT0gdGV4dGFyZWFUYWcpKSB7Ci0gICAgICAg
IGFwcGVuZEVzY2FwZWRDb250ZW50KG91dCwgdWNoYXJSYW5nZSh0ZXh0LCBtX3JhbmdlKSwgdGV4
dC0+ZG9jdW1lbnQoKS0+aXNIVE1MRG9jdW1lbnQoKSk7CisgICAgICAgIGFwcGVuZE5vZGVWYWx1
ZShvdXQsIHRleHQsIG1fcmFuZ2UsIHRleHQtPmRvY3VtZW50KCktPmlzSFRNTERvY3VtZW50KCkg
PyBFbnRpdHlNYXNrSW5IVE1MUENEQVRBIDogRW50aXR5TWFza0luUENEQVRBKTsKICAgICAgICAg
cmV0dXJuOwogICAgIH0KIAogICAgIGJvb2wgdXNlUmVuZGVyZWRUZXh0ID0gIWVuY2xvc2luZ05v
ZGVXaXRoVGFnKFBvc2l0aW9uKHRleHQsIDApLCBzZWxlY3RUYWcpOwotICAgIFN0cmluZyBtYXJr
dXAgPSBlc2NhcGVDb250ZW50VGV4dCh1c2VSZW5kZXJlZFRleHQgPyByZW5kZXJlZFRleHQodGV4
dCwgbV9yYW5nZSkgOiBzdHJpbmdWYWx1ZUZvclJhbmdlKHRleHQsIG1fcmFuZ2UpLCBmYWxzZSk7
Ci0gICAgbWFya3VwID0gY29udmVydEhUTUxUZXh0VG9JbnRlcmNoYW5nZUZvcm1hdChtYXJrdXAs
IHRleHQpOwotICAgIGFwcGVuZChvdXQsIG1hcmt1cCk7CisgICAgU3RyaW5nIGNvbnRlbnQgPSB1
c2VSZW5kZXJlZFRleHQgPyByZW5kZXJlZFRleHQodGV4dCwgbV9yYW5nZSkgOiBzdHJpbmdWYWx1
ZUZvclJhbmdlKHRleHQsIG1fcmFuZ2UpOworICAgIFZlY3RvcjxVQ2hhcj4gYnVmZmVyOworICAg
IGFwcGVuZENoYXJhY3RlcnNSZXBsYWNpbmdFbnRpdGllcyhidWZmZXIsIGNvbnRlbnQuY2hhcmFj
dGVycygpLCBjb250ZW50Lmxlbmd0aCgpLCBFbnRpdHlNYXNrSW5QQ0RBVEEpOworICAgIGFwcGVu
ZChvdXQsIGNvbnZlcnRIVE1MVGV4dFRvSW50ZXJjaGFuZ2VGb3JtYXQoU3RyaW5nOjphZG9wdChi
dWZmZXIpLCB0ZXh0KSk7CiB9CiAKIHZvaWQgTWFya3VwQWNjdW11bGF0b3I6OmFwcGVuZENvbW1l
bnQoVmVjdG9yPFVDaGFyPiYgb3V0LCBjb25zdCBTdHJpbmcmIGNvbW1lbnQpCkBAIC0xMzU1LDcg
KzEzMTAsNyBAQCBTdHJpbmcgdXJsVG9NYXJrdXAoY29uc3QgS1VSTCYgdXJsLCBjb25zCiAgICAg
YXBwZW5kKG1hcmt1cCwgIjxhIGhyZWY9XCIiKTsKICAgICBhcHBlbmQobWFya3VwLCB1cmwuc3Ry
aW5nKCkpOwogICAgIGFwcGVuZChtYXJrdXAsICJcIj4iKTsKLSAgICBhcHBlbmRFc2NhcGVkQ29u
dGVudChtYXJrdXAsIG1ha2VfcGFpcih0aXRsZS5jaGFyYWN0ZXJzKCksIHRpdGxlLmxlbmd0aCgp
KSwgZmFsc2UpOworICAgIGFwcGVuZENoYXJhY3RlcnNSZXBsYWNpbmdFbnRpdGllcyhtYXJrdXAs
IHRpdGxlLmNoYXJhY3RlcnMoKSwgdGl0bGUubGVuZ3RoKCksIEVudGl0eU1hc2tJblBDREFUQSk7
CiAgICAgYXBwZW5kKG1hcmt1cCwgIjwvYT4iKTsKICAgICByZXR1cm4gU3RyaW5nOjphZG9wdCht
YXJrdXApOwogfQo=
</data>
<flag name="review"
          id="54722"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>