<?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>91306</bug_id>
          
          <creation_ts>2012-07-13 19:05:16 -0700</creation_ts>
          <short_desc>Iterating backwards over HTMLCollection is O(n^2)</short_desc>
          <delta_ts>2012-07-15 18:36:40 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>89919</blocked>
    
    <blocked>91320</blocked>
    
    <blocked>91334</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Ryosuke Niwa">rniwa</reporter>
          <assigned_to name="Ryosuke Niwa">rniwa</assigned_to>
          <cc>darin</cc>
    
    <cc>haraken</cc>
    
    <cc>kling</cc>
    
    <cc>koivisto</cc>
    
    <cc>ojan</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>669670</commentid>
    <comment_count>0</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 19:05:16 -0700</bug_when>
    <thetext>Code like this:

var children = container.children;
for (var i = children.length; i &gt; 0;i--)
    children[i - 1].class = &apos;hi&apos;;

exhibit O(n^2) behavior.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669691</commentid>
    <comment_count>1</comment_count>
      <attachid>152400</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 19:37:12 -0700</bug_when>
    <thetext>Created attachment 152400
Fixes the bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669692</commentid>
    <comment_count>2</comment_count>
      <attachid>152400</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 19:49:51 -0700</bug_when>
    <thetext>Comment on attachment 152400
Fixes the bug

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

&gt; Source/WebCore/html/HTMLCollection.cpp:245
&gt; +    return onlyIncludeDirectChildren ? previous-&gt;previousSibling() : previous-&gt;traverseNextNode(base);

Oops, this won&apos;t fly, will it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669695</commentid>
    <comment_count>3</comment_count>
      <attachid>152402</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 19:50:29 -0700</bug_when>
    <thetext>Created attachment 152402
Fixed a bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669696</commentid>
    <comment_count>4</comment_count>
      <attachid>152403</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 19:51:27 -0700</bug_when>
    <thetext>Created attachment 152403
demo

Open it on Safari/Chrome without my patch. It&apos;ll take 4s or so to run. With my patch, it takes 5ms.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669704</commentid>
    <comment_count>5</comment_count>
      <attachid>152402</attachid>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-13 21:01:49 -0700</bug_when>
    <thetext>Comment on attachment 152402
Fixed a bug

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

&gt; Source/WebCore/html/HTMLCollection.cpp:321
&gt; -    if (!isItemCacheValid() || cachedItemOffset() &gt; index) {
&gt; +    if (shouldSearchFromFirstItem(offset)) {

Now, there&apos;s one more optimization we can implement when the length cache is available
and the distance to the last item is less than the distance to the cached item but we can implement
that optimization in a follow up patch instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669731</commentid>
    <comment_count>6</comment_count>
      <attachid>152402</attachid>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-07-13 23:21:18 -0700</bug_when>
    <thetext>Comment on attachment 152402
Fixed a bug

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

&gt; Source/WebCore/html/HTMLCollection.cpp:240
&gt; +template&lt;bool forward&gt;

Why use templates here and below instead of just adding an extra argument to nextNode and to itemBeforeOrAfter?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669742</commentid>
    <comment_count>7</comment_count>
      <attachid>152402</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2012-07-14 00:01:22 -0700</bug_when>
    <thetext>Comment on attachment 152402
Fixed a bug

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

&gt; Source/WebCore/html/HTMLCollection.cpp:245
&gt; +    if (forward)
&gt; +        return onlyIncludeDirectChildren ? previous-&gt;nextSibling() : previous-&gt;traverseNextNode(base);
&gt; +    return onlyIncludeDirectChildren ? previous-&gt;previousSibling() : previous-&gt;traversePreviousNode(base);

This is one of the cases where i prefer

if (forward)
    return ...
else
    return ...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669745</commentid>
    <comment_count>8</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-14 00:09:02 -0700</bug_when>
    <thetext>Committed r122660: &lt;http://trac.webkit.org/changeset/122660&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669750</commentid>
    <comment_count>9</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-14 00:29:16 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 152402 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=152402&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/html/HTMLCollection.cpp:240
&gt; &gt; +template&lt;bool forward&gt;
&gt; 
&gt; Why use templates here and below instead of just adding an extra argument to nextNode and to itemBeforeOrAfter?

I was afraid that compilers are actually going to create nextNode and itemBeforeOrAfter instead of inlining them and constant-propagete the value of forward.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669837</commentid>
    <comment_count>10</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-07-14 09:11:17 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 152402 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=152402&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/html/HTMLCollection.cpp:240
&gt; &gt; &gt; +template&lt;bool forward&gt;
&gt; &gt; 
&gt; &gt; Why use templates here and below instead of just adding an extra argument to nextNode and to itemBeforeOrAfter?
&gt; 
&gt; I was afraid that compilers are actually going to create nextNode and itemBeforeOrAfter instead of inlining them and constant-propagete the value of forward.

This sounds like a premature optimization to me. Unless you actually see an improvement on a benchmark or real website, I don&apos;t think this is worth making the code more complicated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669851</commentid>
    <comment_count>11</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-14 11:31:20 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (In reply to comment #9)
&gt; &gt; I was afraid that compilers are actually going to create nextNode and itemBeforeOrAfter instead of inlining them and constant-propagete the value of forward.
&gt; 
&gt; This sounds like a premature optimization to me. Unless you actually see an improvement on a benchmark or real website, I don&apos;t think this is worth making the code more complicated.

The last time we profiled DynamicNodeList, the equivalent code was very performance critical so much so that that was one of very few places where inlining traverseNextNode and traversePreviousNode would have benefited us. While adding a function call here may not show up as a statistically significant slow own by itself, these tiny cost adds up and gradually slow us down.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669979</commentid>
    <comment_count>12</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-07-15 09:46:02 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; I was afraid that compilers are actually going to create nextNode and itemBeforeOrAfter instead of inlining them and constant-propagete the value of forward.
&gt; &gt; 
&gt; &gt; This sounds like a premature optimization to me. Unless you actually see an improvement on a benchmark or real website, I don&apos;t think this is worth making the code more complicated.
&gt; 
&gt; The last time we profiled DynamicNodeList, the equivalent code was very performance critical so much so that that was one of very few places where inlining traverseNextNode and traversePreviousNode would have benefited us. While adding a function call here may not show up as a statistically significant slow own by itself, these tiny cost adds up and gradually slow us down.

I don&apos;t understand this last sentence. If it slows us down enough to matter, it should show up in benchmarks or profiles. This is a different case than something like ref/deref where the cost is scattered throughout the entire codebase and thus would never show up in a profile (although, it does show up in benchmarks!). When the cost is all in a single loop (on the javascript side), you should be able to see something significant. I&apos;m pretty sure dromaeo benchmarks hammer this code pretty hard.

I believe you that this code is performance critical, I just don&apos;t think we should complicate the code in places where we haven&apos;t proven that it matters.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670032</commentid>
    <comment_count>13</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2012-07-15 18:36:40 -0700</bug_when>
    <thetext>(In reply to comment #12)
&gt; (In reply to comment #11)
&gt; &gt; (In reply to comment #10)
&gt; &gt; &gt; (In reply to comment #9)
&gt; &gt; &gt; &gt; I was afraid that compilers are actually going to create nextNode and itemBeforeOrAfter instead of inlining them and constant-propagete the value of forward.
&gt; &gt; &gt; 
&gt; &gt; &gt; This sounds like a premature optimization to me. Unless you actually see an improvement on a benchmark or real website, I don&apos;t think this is worth making the code more complicated.
&gt; &gt; 
&gt; &gt; The last time we profiled DynamicNodeList, the equivalent code was very performance critical so much so that that was one of very few places where inlining traverseNextNode and traversePreviousNode would have benefited us. While adding a function call here may not show up as a statistically significant slow own by itself, these tiny cost adds up and gradually slow us down.
&gt; 
&gt; I don&apos;t understand this last sentence. If it slows us down enough to matter, it should show up in benchmarks or profiles. 

The equivalent code in DynamicNodeList shows up in profile result on Dromaeo.

&gt; This is a different case than something like ref/deref where the cost is scattered throughout the entire codebase and thus would never show up in a profile (although, it does show up in benchmarks!).

It&apos;s exactly like that. Adding a single function call is usually cheap but if you keep adding lots of function calls, then it&apos;ll eventually slow us down.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152400</attachid>
            <date>2012-07-13 19:37:12 -0700</date>
            <delta_ts>2012-07-13 19:50:25 -0700</delta_ts>
            <desc>Fixes the bug</desc>
            <filename>bug-91306-20120713194038.patch</filename>
            <type>text/plain</type>
            <size>20869</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMjY1NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY1IEBACisyMDEyLTA3LTEzICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIEl0ZXJhdGluZyBiYWNrd2FyZHMg
b3ZlciBIVE1MQ29sbGVjdGlvbiBpcyBPKG5eMikKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTkxMzA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRml4ZWQgdGhlIGJ1ZyBieSBpbnRyb2R1Y2luZyBpdGVtQmVm
b3JlIHRoYXQgaXRlcmF0ZXMgbm9kZXMgYmFja3dhcmRzIHRvIGNvbXBsZW1lbnQgaXRlbUFmdGVy
LgorICAgICAgICBVbmZvcnR1bmF0ZWx5LCBzb21lIEhUTUwgY29sbGVjdGlvbnMgc3VjaCBhcyBI
VE1MRm9ybUNvbGxlY3Rpb24gYW5kIEhUTUxUYWJsZVJvd3NDb2xsZWN0aW9uIGhhdmUKKyAgICAg
ICAgaXRzIG93biBpdGVtQWZ0ZXIgZnVuY3Rpb24gYW5kIHdyaXRpbmcgYW4gZXF1aXZhbGVudCBp
dGVtQmVmb3JlIGlzIHNvbWV3aGF0IHRyaWNreS4gRm9yIG5vdywKKyAgICAgICAgYWRkZWQgYSBu
ZXcgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIEhUTUwgY29sbGVjdGlv
biBzdXBwb3J0cyBpdGVtQmVmb3JlIG9yIG5vdCwKKyAgICAgICAgYW5kIGxlZnQgdGhvc2UgSFRN
TCBjb2xsZWN0aW9ucyB0aGF0IG92ZXJyaWRlIGl0ZW1BZnRlciBhbG9uZS4KKworICAgICAgICBU
aGlzIGFsc28gcGF2ZXMgb3VyIHdheSB0byBzaGFyZSBtb3JlIGNvZGUgYmV0d2VlbiBEeW5hbWlj
Tm9kZUxpc3QgYW5kIEhUTUxDb2xsZWN0aW9uLgorCisgICAgICAgIFRlc3Q6IHBlcmYvaHRtbGNv
bGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJhdGlvbi5odG1sCisKKyAgICAgICAgKiBkb20vRHluYW1p
Y05vZGVMaXN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2U6
OkR5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSk6IFRha2VzIEl0ZW1CZWZvcmVTdXBwb3J0VHlwZS4K
KyAgICAgICAgKFdlYkNvcmU6OkR5bmFtaWNOb2RlTGlzdENhY2hlQmFzZTo6c3VwcG9ydHNJdGVt
QmVmb3JlKTogQWRkZWQuCisgICAgICAgIChEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6RHluYW1pY05vZGVMaXN0Q2FjaGVCYXNlOjpzZXRJdGVtQ2FjaGUpOiBS
ZXBsYWNlZCBhIEZJWE1FIGJ5IGFuIGFzc2VydGlvbiBub3cgdGhhdAorICAgICAgICB3ZSBjYW4u
CisgICAgICAgICogaHRtbC9IVE1MQWxsQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MQWxsQ29sbGVjdGlvbjo6SFRNTEFsbENvbGxlY3Rpb24pOiBTdXBwb3J0cyBpdGVtQmVm
b3JlIHNpbmNlIGl0IGRvZXNuJ3Qgb3ZlcnJpZGUKKyAgICAgICAgaXRlbUFmdGVyLgorICAgICAg
ICAqIGh0bWwvSFRNTENvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxl
Y3Rpb246OkhUTUxDb2xsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxDb2xsZWN0aW9u
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6aXNBY2NlcHRhYmxlRWxlbWVudCk6IE1hZGUg
aXQgYSBzdGF0aWMgbG9jYWwgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIHN0YXRpYyBtZW1iZXIuCisg
ICAgICAgIChXZWJDb3JlOjpuZXh0Tm9kZSk6IFRlbXBsYXRpemVkLgorICAgICAgICAoV2ViQ29y
ZTo6aXRlbUJlZm9yZU9yQWZ0ZXIpOiBFeHRyYWN0ZWQgZnJvbSBpdGVtQWZ0ZXIgYW5kIHRlbXBs
YXRpemVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Oml0ZW1CZWZvcmUpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxDb2xsZWN0aW9uOjppdGVtQWZ0ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246OnNob3VsZFNlYXJjaEZyb21GaXJzdEl0ZW0p
OiBBZGRlZC4gRGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHNob3VsZCByZXNldAorICAgICAgICB0aGUg
aXRlbSBjYWNoZSB0byB0aGUgZmlyc3QgaXRlbS4gV2Ugb2J2aW91c2x5IGRvIGlmIHRoZSBjYWNo
ZSBpcyBpbnZhbGlkLiBJZiB0aGUgdGFyZ2V0IG9mZnNldAorICAgICAgICBpcyBhZnRlciB0aGUg
Y2FjaGVkIG9mZnNldCwgdGhlbiB3ZSBzaG91bGRuJ3QgZ28gYmFjayByZWdhcmRsZXNzIG9mIGF2
YWlsYWJpbGl0eSBvZiBpdGVtQmVmb3JlLgorICAgICAgICBPdGhlcndpc2UsIHdlIGdvIGJhY2sg
dG8gdGhlIGZpcnN0IGl0ZW0gaWZmIGl0ZW1CZWZvcmUgaXMgbm90IGF2YWlsYWJsZSBvciB0aGUg
ZGlzdGFuY2UgZnJvbQorICAgICAgICB0aGUgY2FjaGVkIG9mZnNldCB0byB0aGUgdGFyZ2V0IG9m
ZnNldCBpcyBncmVhdGVyIHRoYW4gdGhlIHRhcmdldCBvZmZzZXQgaXRzZWxmLgorICAgICAgICAo
V2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
Q29sbGVjdGlvbjo6aXRlbSk6IFVzZSB0aGUgdGVybSAib2Zmc2V0IiB0byBtYXRjaCB0aGUgdGVy
bWlub2xvZ3kgZWxzZXdoZXJlLgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Oml0
ZW1CZWZvcmVPckFmdGVyQ2FjaGVkSXRlbSk6IERpdHRvLiBBbHNvIGFkZGVkIHRoZSBsb2dpYyB0
byBpdGVyYXRlCisgICAgICAgIG5vZGVzIGJhY2t3YXJkcyB1c2luZyBpdGVtQmVmb3JlLiBPbmNl
IHdlJ3JlIGluIHRoaXMgYnJhbmNoLCB3ZSBzaG91bGQgYWx3YXlzIGZpbmQgYSBtYXRjaGluZwor
ICAgICAgICBpdGVtIHNpbmNlIHRoZSB0YXJnZXQgb2Zmc2V0IHdhcyBsZXNzIHRoYW4gdGhlIGNh
Y2hlZCBvZmZzZXQsIGFuZCBvZmZzZXRzIGFyZSBub24tbmVnYXRpdmUuCisgICAgICAgIElmIHdl
IGhhZCBldmVyIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9vcCB3aXRob3V0IGZpbmRpbmcgYW4g
aXRlbSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhY2hlCisgICAgICAgIGhhcyBiZWVuIGludmFs
aWQgYW5kIHdlIGhhdmUgc29tZSBzZXJpb3VzIGJ1ZyBlbHNld2hlcmUuCisgICAgICAgICogaHRt
bC9IVE1MQ29sbGVjdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb25DYWNo
ZUJhc2U6OkhUTUxDb2xsZWN0aW9uQ2FjaGVCYXNlKToKKyAgICAgICAgKEhUTUxDb2xsZWN0aW9u
KToKKyAgICAgICAgKiBodG1sL0hUTUxPcHRpb25zQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MT3B0aW9uc0NvbGxlY3Rpb246OkhUTUxPcHRpb25zQ29sbGVjdGlvbik6IFN1
cHBvcnRzIGl0ZW1CZWZvcmUgc2luY2UgaXQgZG9lc24ndAorICAgICAgICBvdmVycmlkZSBpdGVt
QWZ0ZXIuCisgICAgICAgICogaHRtbC9IVE1MRm9ybUNvbGxlY3Rpb24uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTEZvcm1Db2xsZWN0aW9uOjpIVE1MRm9ybUNvbGxlY3Rpb24pOiBEb2Vzbid0
IHN1cHBvcnQgaXRlbUJlZm9yZSBhcyBpdCBvdmVycmlkZXMKKyAgICAgICAgaXRlbUFmdGVyLgor
ICAgICAgICAqIGh0bWwvSFRNTE5hbWVDb2xsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxOYW1lQ29sbGVjdGlvbjo6SFRNTE5hbWVDb2xsZWN0aW9uKTogRGl0dG8uCisgICAgICAg
ICogaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24pOgorICAg
ICAgICAqIGh0bWwvSFRNTFRhYmxlUm93c0NvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6SFRNTFRhYmxlUm93c0NvbGxlY3Rpb246OkhUTUxUYWJsZVJvd3NDb2xsZWN0aW9uKToKKwog
MjAxMi0wNy0xMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAg
SW50ZXJuYWxzOiBDbGVhbiB1cCB0aGUgbW9jayBQYWdlUG9wdXBEcml2ZXIgY29ycmVjdGx5LgpJ
bmRleDogU291cmNlL1dlYkNvcmUvZG9tL0R5bmFtaWNOb2RlTGlzdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2RvbS9EeW5hbWljTm9kZUxpc3QuaAkocmV2aXNpb24gMTIyNjQ5KQor
KysgU291cmNlL1dlYkNvcmUvZG9tL0R5bmFtaWNOb2RlTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC00Myw3ICs0MywxMyBAQCBlbnVtIE5vZGVMaXN0Um9vdFR5cGUgewogCiBjbGFzcyBEeW5hbWlj
Tm9kZUxpc3RDYWNoZUJhc2UgewogcHVibGljOgotICAgIER5bmFtaWNOb2RlTGlzdENhY2hlQmFz
ZShOb2RlTGlzdFJvb3RUeXBlIHJvb3RUeXBlLCBOb2RlTGlzdEludmFsaWRhdGlvblR5cGUgaW52
YWxpZGF0aW9uVHlwZSwgQ29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSBJbnZhbGlkQ29s
bGVjdGlvblR5cGUpCisgICAgZW51bSBJdGVtQmVmb3JlU3VwcG9ydFR5cGUgeworICAgICAgICBE
b05vdFN1cHBvcnRJdGVtQmVmb3JlLAorICAgICAgICBTdXBwb3J0SXRlbUJlZm9yZSwKKyAgICB9
OworCisgICAgRHluYW1pY05vZGVMaXN0Q2FjaGVCYXNlKE5vZGVMaXN0Um9vdFR5cGUgcm9vdFR5
cGUsIE5vZGVMaXN0SW52YWxpZGF0aW9uVHlwZSBpbnZhbGlkYXRpb25UeXBlLAorICAgICAgICBD
b2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IEludmFsaWRDb2xsZWN0aW9uVHlwZSwgSXRl
bUJlZm9yZVN1cHBvcnRUeXBlIGl0ZW1CZWZvcmVTdXBwb3J0VHlwZSA9IERvTm90U3VwcG9ydEl0
ZW1CZWZvcmUpCiAgICAgICAgIDogbV9jYWNoZWRJdGVtKDApCiAgICAgICAgICwgbV9pc0xlbmd0
aENhY2hlVmFsaWQoZmFsc2UpCiAgICAgICAgICwgbV9pc0l0ZW1DYWNoZVZhbGlkKGZhbHNlKQpA
QCAtNTEsNiArNTcsNyBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9pbnZhbGlkYXRpb25UeXBlKGlu
dmFsaWRhdGlvblR5cGUpCiAgICAgICAgICwgbV9pc05hbWVDYWNoZVZhbGlkKGZhbHNlKQogICAg
ICAgICAsIG1fY29sbGVjdGlvblR5cGUoY29sbGVjdGlvblR5cGUpCisgICAgICAgICwgbV9zdXBw
b3J0c0l0ZW1CZWZvcmUoaXRlbUJlZm9yZVN1cHBvcnRUeXBlID09IFN1cHBvcnRJdGVtQmVmb3Jl
KQogICAgIHsKICAgICAgICAgQVNTRVJUKG1faW52YWxpZGF0aW9uVHlwZSA9PSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oaW52YWxpZGF0aW9uVHlwZSkpOwogICAgICAgICBBU1NFUlQobV9jb2xsZWN0
aW9uVHlwZSA9PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29sbGVjdGlvblR5cGUpKTsKQEAgLTY2
LDYgKzczLDggQEAgcHVibGljOgogICAgIHN0YXRpYyBib29sIHNob3VsZEludmFsaWRhdGVUeXBl
T25BdHRyaWJ1dGVDaGFuZ2UoTm9kZUxpc3RJbnZhbGlkYXRpb25UeXBlLCBjb25zdCBRdWFsaWZp
ZWROYW1lJik7CiAKIHByb3RlY3RlZDoKKyAgICBib29sIHN1cHBvcnRzSXRlbUJlZm9yZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3VwcG9ydHNJdGVtQmVmb3JlOyB9CisKICAgICBBTFdBWVNfSU5MSU5F
IGJvb2wgaXNJdGVtQ2FjaGVWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJdGVtQ2FjaGVWYWxp
ZDsgfQogICAgIEFMV0FZU19JTkxJTkUgTm9kZSogY2FjaGVkSXRlbSgpIGNvbnN0IHsgcmV0dXJu
IG1fY2FjaGVkSXRlbTsgfQogICAgIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgY2FjaGVkSXRlbU9m
ZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkSXRlbU9mZnNldDsgfQpAQCAtNzksNyArODgs
NyBAQCBwcm90ZWN0ZWQ6CiAgICAgfQogICAgIEFMV0FZU19JTkxJTkUgdm9pZCBzZXRJdGVtQ2Fj
aGUoTm9kZSogaXRlbSwgdW5zaWduZWQgb2Zmc2V0KSBjb25zdAogICAgIHsKLSAgICAgICAgLy8g
RklYTUU6IEFzc2VydCB0aGF0IGl0ZW0gaXMgbm90IG51bGwgb25jZSB3ZSd2ZSB1cGRhdGVkIER5
bmFtaWNOb2RlTGlzdC4KKyAgICAgICAgQVNTRVJUKGl0ZW0pOwogICAgICAgICBtX2NhY2hlZEl0
ZW0gPSBpdGVtOwogICAgICAgICBtX2NhY2hlZEl0ZW1PZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAg
IG1faXNJdGVtQ2FjaGVWYWxpZCA9IHRydWU7CkBAIC0xMDAsNiArMTA5LDcgQEAgcHJpdmF0ZToK
ICAgICAvLyBGcm9tIEhUTUxDb2xsZWN0aW9uCiAgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2lzTmFt
ZUNhY2hlVmFsaWQgOiAxOwogICAgIGNvbnN0IHVuc2lnbmVkIG1fY29sbGVjdGlvblR5cGUgOiA1
OworICAgIGNvbnN0IHVuc2lnbmVkIG1fc3VwcG9ydHNJdGVtQmVmb3JlIDogMTsKIH07CiAKIEFM
V0FZU19JTkxJTkUgYm9vbCBEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2U6OnNob3VsZEludmFsaWRh
dGVUeXBlT25BdHRyaWJ1dGVDaGFuZ2UoTm9kZUxpc3RJbnZhbGlkYXRpb25UeXBlIHR5cGUsIGNv
bnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lKQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MQWxsQ29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MQWxsQ29sbGVjdGlvbi5jcHAJKHJldmlzaW9uIDEyMjY0OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTEFsbENvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3
IEBAIFBhc3NSZWZQdHI8SFRNTEFsbENvbGxlY3Rpb24+IEhUTUxBbGxDb2wKIH0KIAogSFRNTEFs
bENvbGxlY3Rpb246OkhUTUxBbGxDb2xsZWN0aW9uKERvY3VtZW50KiBkb2N1bWVudCkKLSAgICA6
IEhUTUxDb2xsZWN0aW9uKGRvY3VtZW50LCBEb2NBbGwpCisgICAgOiBIVE1MQ29sbGVjdGlvbihk
b2N1bWVudCwgRG9jQWxsLCBTdXBwb3J0SXRlbUJlZm9yZSkKIHsKIH0KIApJbmRleDogU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5jcHAJKHJldmlzaW9uIDEyMjY0OCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTENvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIs
OCArMTUyLDggQEAgc3RhdGljIE5vZGVMaXN0SW52YWxpZGF0aW9uVHlwZSBpbnZhbGlkYQogfQog
ICAgIAogCi1IVE1MQ29sbGVjdGlvbjo6SFRNTENvbGxlY3Rpb24oTm9kZSogYmFzZSwgQ29sbGVj
dGlvblR5cGUgdHlwZSkKLSAgICA6IEhUTUxDb2xsZWN0aW9uQ2FjaGVCYXNlKHJvb3RUeXBlRnJv
bUNvbGxlY3Rpb25UeXBlKHR5cGUpLCBpbnZhbGlkYXRpb25UeXBlRXhjbHVkaW5nSWRBbmROYW1l
QXR0cmlidXRlcyh0eXBlKSwgdHlwZSkKK0hUTUxDb2xsZWN0aW9uOjpIVE1MQ29sbGVjdGlvbihO
b2RlKiBiYXNlLCBDb2xsZWN0aW9uVHlwZSB0eXBlLCBJdGVtQmVmb3JlU3VwcG9ydFR5cGUgaXRl
bUJlZm9yZVN1cHBvcnRUeXBlKQorICAgIDogSFRNTENvbGxlY3Rpb25DYWNoZUJhc2Uocm9vdFR5
cGVGcm9tQ29sbGVjdGlvblR5cGUodHlwZSksIGludmFsaWRhdGlvblR5cGVFeGNsdWRpbmdJZEFu
ZE5hbWVBdHRyaWJ1dGVzKHR5cGUpLCB0eXBlLCBpdGVtQmVmb3JlU3VwcG9ydFR5cGUpCiAgICAg
LCBtX2Jhc2UoYmFzZSkKIHsKICAgICBBU1NFUlQobV9iYXNlKTsKQEAgLTE2Miw3ICsxNjIsNyBA
QCBIVE1MQ29sbGVjdGlvbjo6SFRNTENvbGxlY3Rpb24oTm9kZSogYmFzCiAKIFBhc3NSZWZQdHI8
SFRNTENvbGxlY3Rpb24+IEhUTUxDb2xsZWN0aW9uOjpjcmVhdGUoTm9kZSogYmFzZSwgQ29sbGVj
dGlvblR5cGUgdHlwZSkKIHsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IEhUTUxDb2xsZWN0aW9u
KGJhc2UsIHR5cGUpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IEhUTUxDb2xsZWN0aW9uKGJh
c2UsIHR5cGUsIFN1cHBvcnRJdGVtQmVmb3JlKSk7CiB9CiAKIEhUTUxDb2xsZWN0aW9uOjp+SFRN
TENvbGxlY3Rpb24oKQpAQCAtMTc5LDEyICsxNzksMTIgQEAgSFRNTENvbGxlY3Rpb246On5IVE1M
Q29sbGVjdGlvbigpCiAgICAgbV9iYXNlLT5kb2N1bWVudCgpLT51bnJlZ2lzdGVyTm9kZUxpc3RD
YWNoZSh0aGlzKTsKIH0KIAotaW5saW5lIGJvb2wgSFRNTENvbGxlY3Rpb246OmlzQWNjZXB0YWJs
ZUVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Fj
Y2VwdGFibGVFbGVtZW50KENvbGxlY3Rpb25UeXBlIHR5cGUsIEVsZW1lbnQqIGVsZW1lbnQpCiB7
Ci0gICAgaWYgKCFlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgISh0eXBlKCkgPT0gRG9jQWxs
IHx8IHR5cGUoKSA9PSBOb2RlQ2hpbGRyZW4pKQorICAgIGlmICghZWxlbWVudC0+aXNIVE1MRWxl
bWVudCgpICYmICEodHlwZSA9PSBEb2NBbGwgfHwgdHlwZSA9PSBOb2RlQ2hpbGRyZW4pKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBzd2l0Y2ggKHR5cGUoKSkgeworICAgIHN3aXRjaCAo
dHlwZSkgewogICAgIGNhc2UgRG9jSW1hZ2VzOgogICAgICAgICByZXR1cm4gZWxlbWVudC0+aGFz
TG9jYWxOYW1lKGltZ1RhZyk7CiAgICAgY2FzZSBEb2NTY3JpcHRzOgpAQCAtMjM3LDI2ICsyMzcs
NTMgQEAgaW5saW5lIGJvb2wgSFRNTENvbGxlY3Rpb246OmlzQWNjZXB0YWJsZQogICAgIHJldHVy
biBmYWxzZTsKIH0KIAotc3RhdGljIEFMV0FZU19JTkxJTkUgTm9kZSogbmV4dE5vZGUoTm9kZSog
YmFzZSwgTm9kZSogcHJldmlvdXMsIGJvb2wgb25seUluY2x1ZGVEaXJlY3RDaGlsZHJlbikKK3Rl
bXBsYXRlPGJvb2wgZm9yd2FyZD4KK3N0YXRpYyBOb2RlKiBuZXh0Tm9kZShOb2RlKiBiYXNlLCBO
b2RlKiBwcmV2aW91cywgYm9vbCBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKQogewotICAgIHJl
dHVybiBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuID8gcHJldmlvdXMtPnRyYXZlcnNlTmV4dFNp
YmxpbmcoYmFzZSkgOiBwcmV2aW91cy0+dHJhdmVyc2VOZXh0Tm9kZShiYXNlKTsKKyAgICBpZiAo
Zm9yd2FyZCkKKyAgICAgICAgcmV0dXJuIG9ubHlJbmNsdWRlRGlyZWN0Q2hpbGRyZW4gPyBwcmV2
aW91cy0+bmV4dFNpYmxpbmcoKSA6IHByZXZpb3VzLT50cmF2ZXJzZU5leHROb2RlKGJhc2UpOwor
ICAgIHJldHVybiBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuID8gcHJldmlvdXMtPnByZXZpb3Vz
U2libGluZygpIDogcHJldmlvdXMtPnRyYXZlcnNlTmV4dE5vZGUoYmFzZSk7CiB9CiAKLUVsZW1l
bnQqIEhUTUxDb2xsZWN0aW9uOjppdGVtQWZ0ZXIodW5zaWduZWQmIG9mZnNldEluQXJyYXksIEVs
ZW1lbnQqIHByZXZpb3VzKSBjb25zdAordGVtcGxhdGU8Ym9vbCBmb3J3YXJkPgorc3RhdGljIEVs
ZW1lbnQqIGl0ZW1CZWZvcmVPckFmdGVyKENvbGxlY3Rpb25UeXBlIHR5cGUsIE5vZGUqIGJhc2Us
IHVuc2lnbmVkJiBvZmZzZXRJbkFycmF5LCBOb2RlKiBwcmV2aW91cykKIHsKICAgICBBU1NFUlRf
VU5VU0VEKG9mZnNldEluQXJyYXksICFvZmZzZXRJbkFycmF5KTsKLSAgICBib29sIG9ubHlJbmNs
dWRlRGlyZWN0Q2hpbGRyZW4gPSBzaG91bGRPbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKHR5cGUo
KSk7Ci0gICAgTm9kZSogcm9vdE5vZGUgPSBiYXNlKCk7Ci0gICAgTm9kZSogY3VycmVudCA9IHBy
ZXZpb3VzID8gbmV4dE5vZGUocm9vdE5vZGUsIHByZXZpb3VzLCBvbmx5SW5jbHVkZURpcmVjdENo
aWxkcmVuKSA6IG1fYmFzZS0+Zmlyc3RDaGlsZCgpOworICAgIGJvb2wgb25seUluY2x1ZGVEaXJl
Y3RDaGlsZHJlbiA9IHNob3VsZE9ubHlJbmNsdWRlRGlyZWN0Q2hpbGRyZW4odHlwZSk7CisgICAg
Tm9kZSogcm9vdE5vZGUgPSBiYXNlOworICAgIE5vZGUqIGN1cnJlbnQgPSBwcmV2aW91cyA/IG5l
eHROb2RlPGZvcndhcmQ+KHJvb3ROb2RlLCBwcmV2aW91cywgb25seUluY2x1ZGVEaXJlY3RDaGls
ZHJlbikgOiAoZm9yd2FyZCA/IGJhc2UtPmZpcnN0Q2hpbGQoKSA6IGJhc2UtPmxhc3RDaGlsZCgp
KTsKIAotICAgIGZvciAoOyBjdXJyZW50OyBjdXJyZW50ID0gbmV4dE5vZGUocm9vdE5vZGUsIGN1
cnJlbnQsIG9ubHlJbmNsdWRlRGlyZWN0Q2hpbGRyZW4pKSB7Ci0gICAgICAgIGlmIChjdXJyZW50
LT5pc0VsZW1lbnROb2RlKCkgJiYgaXNBY2NlcHRhYmxlRWxlbWVudCh0b0VsZW1lbnQoY3VycmVu
dCkpKQorICAgIGZvciAoOyBjdXJyZW50OyBjdXJyZW50ID0gbmV4dE5vZGU8Zm9yd2FyZD4ocm9v
dE5vZGUsIGN1cnJlbnQsIG9ubHlJbmNsdWRlRGlyZWN0Q2hpbGRyZW4pKSB7CisgICAgICAgIGlm
IChjdXJyZW50LT5pc0VsZW1lbnROb2RlKCkgJiYgaXNBY2NlcHRhYmxlRWxlbWVudCh0eXBlLCB0
b0VsZW1lbnQoY3VycmVudCkpKQogICAgICAgICAgICAgcmV0dXJuIHRvRWxlbWVudChjdXJyZW50
KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAorRWxlbWVudCogSFRNTENvbGxlY3Rpb246
Oml0ZW1CZWZvcmUodW5zaWduZWQmIG9mZnNldEluQXJyYXksIEVsZW1lbnQqIHByZXZpb3VzKSBj
b25zdAoreworICAgIHJldHVybiBpdGVtQmVmb3JlT3JBZnRlcjxmYWxzZT4odHlwZSgpLCBiYXNl
KCksIG9mZnNldEluQXJyYXksIHByZXZpb3VzKTsKK30KKworRWxlbWVudCogSFRNTENvbGxlY3Rp
b246Oml0ZW1BZnRlcih1bnNpZ25lZCYgb2Zmc2V0SW5BcnJheSwgRWxlbWVudCogcHJldmlvdXMp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGl0ZW1CZWZvcmVPckFmdGVyPHRydWU+KHR5cGUoKSwgYmFz
ZSgpLCBvZmZzZXRJbkFycmF5LCBwcmV2aW91cyk7Cit9CisgICAgCitib29sIEFMV0FZU19JTkxJ
TkUgSFRNTENvbGxlY3Rpb246OnNob3VsZFNlYXJjaEZyb21GaXJzdEl0ZW0odW5zaWduZWQgb2Zm
c2V0KSBjb25zdAoreworICAgIGlmICghaXNJdGVtQ2FjaGVWYWxpZCgpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIEFTU0VSVChvZmZzZXQgIT0gY2FjaGVkSXRlbU9mZnNldCgpKTsKKyAg
ICBpZiAob2Zmc2V0ID4gY2FjaGVkSXRlbU9mZnNldCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICB1bnNpZ25lZCBkaXN0YW5jZUZyb21DYWNoZWRJdGVtID0gY2FjaGVkSXRlbU9mZnNl
dCgpIC0gb2Zmc2V0OworICAgIHJldHVybiAhc3VwcG9ydHNJdGVtQmVmb3JlKCkgfHwgb2Zmc2V0
IDwgZGlzdGFuY2VGcm9tQ2FjaGVkSXRlbTsKK30KKwogdW5zaWduZWQgSFRNTENvbGxlY3Rpb246
Omxlbmd0aCgpIGNvbnN0CiB7CiAgICAgaWYgKGlzTGVuZ3RoQ2FjaGVWYWxpZCgpKQpAQCAtMjcy
LDE4ICsyOTksMTggQEAgdW5zaWduZWQgSFRNTENvbGxlY3Rpb246Omxlbmd0aCgpIGNvbnN0CiAg
ICAgdW5zaWduZWQgb2Zmc2V0ID0gY2FjaGVkSXRlbU9mZnNldCgpOwogICAgIGRvIHsKICAgICAg
ICAgb2Zmc2V0Kys7Ci0gICAgfSB3aGlsZSAoaXRlbUFmdGVyQ2FjaGVkSXRlbShvZmZzZXQpKTsK
KyAgICB9IHdoaWxlIChpdGVtQmVmb3JlT3JBZnRlckNhY2hlZEl0ZW0ob2Zmc2V0KSk7CiAKICAg
ICBzZXRMZW5ndGhDYWNoZShvZmZzZXQpOwogICAgIHJldHVybiBvZmZzZXQ7CiB9CiAKLU5vZGUq
IEhUTUxDb2xsZWN0aW9uOjppdGVtKHVuc2lnbmVkIGluZGV4KSBjb25zdAorTm9kZSogSFRNTENv
bGxlY3Rpb246Oml0ZW0odW5zaWduZWQgb2Zmc2V0KSBjb25zdAogewotICAgIGlmIChpc0l0ZW1D
YWNoZVZhbGlkKCkgJiYgY2FjaGVkSXRlbU9mZnNldCgpID09IGluZGV4KQorICAgIGlmIChpc0l0
ZW1DYWNoZVZhbGlkKCkgJiYgY2FjaGVkSXRlbU9mZnNldCgpID09IG9mZnNldCkKICAgICAgICAg
cmV0dXJuIGNhY2hlZEl0ZW0oKTsKIAotICAgIGlmIChpc0xlbmd0aENhY2hlVmFsaWQoKSAmJiBj
YWNoZWRMZW5ndGgoKSA8PSBpbmRleCkKKyAgICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkKCkgJiYg
Y2FjaGVkTGVuZ3RoKCkgPD0gb2Zmc2V0KQogICAgICAgICByZXR1cm4gMDsKIAogI2lmIEVOQUJM
RShNSUNST0RBVEEpCkBAIC0yOTEsNyArMzE4LDcgQEAgTm9kZSogSFRNTENvbGxlY3Rpb246Oml0
ZW0odW5zaWduZWQgaW5kZQogICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBIVE1MUHJvcGVydGll
c0NvbGxlY3Rpb24qPih0aGlzKS0+dXBkYXRlUmVmRWxlbWVudHMoKTsKICNlbmRpZgogCi0gICAg
aWYgKCFpc0l0ZW1DYWNoZVZhbGlkKCkgfHwgY2FjaGVkSXRlbU9mZnNldCgpID4gaW5kZXgpIHsK
KyAgICBpZiAoc2hvdWxkU2VhcmNoRnJvbUZpcnN0SXRlbShvZmZzZXQpKSB7CiAgICAgICAgIHVu
c2lnbmVkIG9mZnNldEluQXJyYXkgPSAwOwogICAgICAgICBOb2RlKiBmaXJzdEl0ZW0gPSBpdGVt
QWZ0ZXIob2Zmc2V0SW5BcnJheSwgMCk7CiAgICAgICAgIGlmICghZmlyc3RJdGVtKSB7CkBAIC0z
MDAsMzAgKzMyNyw0NSBAQCBOb2RlKiBIVE1MQ29sbGVjdGlvbjo6aXRlbSh1bnNpZ25lZCBpbmRl
CiAgICAgICAgIH0KICAgICAgICAgc2V0SXRlbUNhY2hlKGZpcnN0SXRlbSwgMCwgb2Zmc2V0SW5B
cnJheSk7CiAgICAgICAgIEFTU0VSVCghY2FjaGVkSXRlbU9mZnNldCgpKTsKLSAgICAgICAgaWYg
KCFpbmRleCkKKyAgICAgICAgaWYgKCFvZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gY2FjaGVk
SXRlbSgpOwogICAgIH0KIAotICAgIHJldHVybiBpdGVtQWZ0ZXJDYWNoZWRJdGVtKGluZGV4KTsK
KyAgICByZXR1cm4gaXRlbUJlZm9yZU9yQWZ0ZXJDYWNoZWRJdGVtKG9mZnNldCk7CiB9CiAKLUVs
ZW1lbnQqIEhUTUxDb2xsZWN0aW9uOjppdGVtQWZ0ZXJDYWNoZWRJdGVtKHVuc2lnbmVkIGluZGV4
KSBjb25zdAorRWxlbWVudCogSFRNTENvbGxlY3Rpb246Oml0ZW1CZWZvcmVPckFmdGVyQ2FjaGVk
SXRlbSh1bnNpZ25lZCBvZmZzZXQpIGNvbnN0CiB7Ci0gICAgdW5zaWduZWQgY3VycmVudEluZGV4
ID0gY2FjaGVkSXRlbU9mZnNldCgpOworICAgIHVuc2lnbmVkIGN1cnJlbnRPZmZzZXQgPSBjYWNo
ZWRJdGVtT2Zmc2V0KCk7CiAgICAgQVNTRVJUKGNhY2hlZEl0ZW0oKS0+aXNFbGVtZW50Tm9kZSgp
KTsKICAgICBFbGVtZW50KiBjdXJyZW50SXRlbSA9IHRvRWxlbWVudChjYWNoZWRJdGVtKCkpOwot
ICAgIEFTU0VSVChjdXJyZW50SW5kZXggPCBpbmRleCk7CisgICAgQVNTRVJUKGN1cnJlbnRPZmZz
ZXQgIT0gb2Zmc2V0KTsKIAogICAgIHVuc2lnbmVkIG9mZnNldEluQXJyYXkgPSBjYWNoZWRFbGVt
ZW50c0FycmF5T2Zmc2V0KCk7CisKKyAgICBpZiAob2Zmc2V0IDwgY2FjaGVkSXRlbU9mZnNldCgp
KSB7CisgICAgICAgIEFTU0VSVChzdXBwb3J0c0l0ZW1CZWZvcmUoKSk7CisgICAgICAgIHdoaWxl
ICgoY3VycmVudEl0ZW0gPSBpdGVtQmVmb3JlKG9mZnNldEluQXJyYXksIGN1cnJlbnRJdGVtKSkp
IHsKKyAgICAgICAgICAgIEFTU0VSVChjdXJyZW50T2Zmc2V0KTsKKyAgICAgICAgICAgIGN1cnJl
bnRPZmZzZXQtLTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50T2Zmc2V0ID09IG9mZnNldCkgewor
ICAgICAgICAgICAgICAgIHNldEl0ZW1DYWNoZShjdXJyZW50SXRlbSwgY3VycmVudE9mZnNldCwg
b2Zmc2V0SW5BcnJheSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICB3aGlsZSAoKGN1cnJlbnRJdGVtID0gaXRlbUFm
dGVyKG9mZnNldEluQXJyYXksIGN1cnJlbnRJdGVtKSkpIHsKLSAgICAgICAgY3VycmVudEluZGV4
Kys7Ci0gICAgICAgIGlmIChjdXJyZW50SW5kZXggPT0gaW5kZXgpIHsKLSAgICAgICAgICAgIHNl
dEl0ZW1DYWNoZShjdXJyZW50SXRlbSwgY3VycmVudEluZGV4LCBvZmZzZXRJbkFycmF5KTsKKyAg
ICAgICAgY3VycmVudE9mZnNldCsrOworICAgICAgICBpZiAoY3VycmVudE9mZnNldCA9PSBvZmZz
ZXQpIHsKKyAgICAgICAgICAgIHNldEl0ZW1DYWNoZShjdXJyZW50SXRlbSwgY3VycmVudE9mZnNl
dCwgb2Zmc2V0SW5BcnJheSk7CiAgICAgICAgICAgICByZXR1cm4gY3VycmVudEl0ZW07CiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICBzZXRMZW5ndGhDYWNoZShjdXJyZW50SW5kZXgpOworICAgIHNl
dExlbmd0aENhY2hlKGN1cnJlbnRPZmZzZXQpOwogCiAgICAgcmV0dXJuIDA7CiB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxDb2xsZWN0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCShyZXZpc2lvbiAxMjI2NDgpCisrKyBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxDb2xsZWN0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDgg
KzM5LDggQEAgY2xhc3MgTm9kZUxpc3Q7CiAKIGNsYXNzIEhUTUxDb2xsZWN0aW9uQ2FjaGVCYXNl
IDogcHVibGljIER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSB7CiBwdWJsaWM6Ci0gICAgSFRNTENv
bGxlY3Rpb25DYWNoZUJhc2UoTm9kZUxpc3RSb290VHlwZSByb290VHlwZSwgTm9kZUxpc3RJbnZh
bGlkYXRpb25UeXBlIGludmFsaWRhdGlvblR5cGUsIENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25U
eXBlKQotICAgICAgICA6IER5bmFtaWNOb2RlTGlzdENhY2hlQmFzZShyb290VHlwZSwgaW52YWxp
ZGF0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUpCisgICAgSFRNTENvbGxlY3Rpb25DYWNoZUJhc2Uo
Tm9kZUxpc3RSb290VHlwZSByb290VHlwZSwgTm9kZUxpc3RJbnZhbGlkYXRpb25UeXBlIGludmFs
aWRhdGlvblR5cGUsIENvbGxlY3Rpb25UeXBlIGNvbGxlY3Rpb25UeXBlLCBJdGVtQmVmb3JlU3Vw
cG9ydFR5cGUgaXRlbUJlZm9yZVN1cHBvcnRUeXBlKQorICAgICAgICA6IER5bmFtaWNOb2RlTGlz
dENhY2hlQmFzZShyb290VHlwZSwgaW52YWxpZGF0aW9uVHlwZSwgY29sbGVjdGlvblR5cGUsIGl0
ZW1CZWZvcmVTdXBwb3J0VHlwZSkKICAgICAgICAgLCBtX2NhY2hlZEVsZW1lbnRzQXJyYXlPZmZz
ZXQoMCkKICAgICB7CiAgICAgfQpAQCAtMTA2LDcgKzEwNiw3IEBAIHB1YmxpYzoKICAgICBOb2Rl
KiBiYXNlKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlLmdldCgpOyB9CiAKIHByb3RlY3RlZDoKLSAg
ICBIVE1MQ29sbGVjdGlvbihOb2RlKiBiYXNlLCBDb2xsZWN0aW9uVHlwZSk7CisgICAgSFRNTENv
bGxlY3Rpb24oTm9kZSogYmFzZSwgQ29sbGVjdGlvblR5cGUsIEl0ZW1CZWZvcmVTdXBwb3J0VHlw
ZSk7CiAKICAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTmFtZUNhY2hlKCkgY29uc3Q7CiAgICAgdmly
dHVhbCBFbGVtZW50KiBpdGVtQWZ0ZXIodW5zaWduZWQmIG9mZnNldEluQXJyYXksIEVsZW1lbnQq
KSBjb25zdDsKQEAgLTExNCw4ICsxMTQsOSBAQCBwcm90ZWN0ZWQ6CiBwcml2YXRlOgogICAgIGJv
b2wgY2hlY2tGb3JOYW1lTWF0Y2goRWxlbWVudCosIGJvb2wgY2hlY2tOYW1lLCBjb25zdCBBdG9t
aWNTdHJpbmcmIG5hbWUpIGNvbnN0OwogCi0gICAgRWxlbWVudCogaXRlbUFmdGVyQ2FjaGVkSXRl
bSh1bnNpZ25lZCkgY29uc3Q7Ci0gICAgYm9vbCBpc0FjY2VwdGFibGVFbGVtZW50KEVsZW1lbnQq
KSBjb25zdDsKKyAgICBFbGVtZW50KiBpdGVtQmVmb3JlKHVuc2lnbmVkJiBvZmZzZXRJbkFycmF5
LCBFbGVtZW50KikgY29uc3Q7CisgICAgYm9vbCBzaG91bGRTZWFyY2hGcm9tRmlyc3RJdGVtKHVu
c2lnbmVkIG9mZnNldCkgY29uc3Q7CisgICAgRWxlbWVudCogaXRlbUJlZm9yZU9yQWZ0ZXJDYWNo
ZWRJdGVtKHVuc2lnbmVkIG9mZnNldCkgY29uc3Q7CiAKICAgICBSZWZQdHI8Tm9kZT4gbV9iYXNl
OwogfTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db2xsZWN0aW9uLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29sbGVjdGlvbi5jcHAJ
KHJldmlzaW9uIDEyMjY0OCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZvcm1Db2xsZWN0
aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzcsNyArMzcsNyBAQCB1c2luZyBuYW1lc3BhY2Ug
SFRNTE5hbWVzOwogLy8gY2FsY3VsYXRpb24gZXZlcnkgdGltZSBpZiBhbnl0aGluZyBoYXMgY2hh
bmdlZC4KIAogSFRNTEZvcm1Db2xsZWN0aW9uOjpIVE1MRm9ybUNvbGxlY3Rpb24oRWxlbWVudCog
YmFzZSkKLSAgICA6IEhUTUxDb2xsZWN0aW9uKGJhc2UsIEZvcm1Db250cm9scykKKyAgICA6IEhU
TUxDb2xsZWN0aW9uKGJhc2UsIEZvcm1Db250cm9scywgRG9Ob3RTdXBwb3J0SXRlbUJlZm9yZSkK
IHsKICAgICBBU1NFUlQoYmFzZS0+aGFzVGFnTmFtZShmb3JtVGFnKSB8fCBiYXNlLT5oYXNUYWdO
YW1lKGZpZWxkc2V0VGFnKSk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxOYW1l
Q29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTmFt
ZUNvbGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMjI2NDgpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxOYW1lQ29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMzLDcgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKIAogSFRNTE5h
bWVDb2xsZWN0aW9uOjpIVE1MTmFtZUNvbGxlY3Rpb24oRG9jdW1lbnQqIGRvY3VtZW50LCBDb2xs
ZWN0aW9uVHlwZSB0eXBlLCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi0gICAgOiBIVE1MQ29s
bGVjdGlvbihkb2N1bWVudCwgdHlwZSkKKyAgICA6IEhUTUxDb2xsZWN0aW9uKGRvY3VtZW50LCB0
eXBlLCBEb05vdFN1cHBvcnRJdGVtQmVmb3JlKQogICAgICwgbV9uYW1lKG5hbWUpCiB7CiB9Cklu
ZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxPcHRpb25zQ29sbGVjdGlvbi5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MT3B0aW9uc0NvbGxlY3Rpb24uY3BwCShy
ZXZpc2lvbiAxMjI2NDgpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxPcHRpb25zQ29sbGVj
dGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIAogSFRNTE9wdGlvbnNDb2xsZWN0aW9uOjpIVE1MT3B0aW9uc0NvbGxlY3Rpb24oRWxl
bWVudCogc2VsZWN0KQotICAgIDogSFRNTENvbGxlY3Rpb24oc2VsZWN0LCBTZWxlY3RPcHRpb25z
KQorICAgIDogSFRNTENvbGxlY3Rpb24oc2VsZWN0LCBTZWxlY3RPcHRpb25zLCBTdXBwb3J0SXRl
bUJlZm9yZSkKIHsKICAgICBBU1NFUlQoc2VsZWN0LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6c2Vs
ZWN0VGFnKSk7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxQcm9wZXJ0aWVzQ29s
bGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVy
dGllc0NvbGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMjI2NDgpCisrKyBTb3VyY2UvV2ViQ29yZS9o
dG1sL0hUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUxLDcg
KzUxLDcgQEAgUGFzc1JlZlB0cjxIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24+IEhUTQogfQogCiBI
VE1MUHJvcGVydGllc0NvbGxlY3Rpb246OkhUTUxQcm9wZXJ0aWVzQ29sbGVjdGlvbihOb2RlKiBp
dGVtTm9kZSkKLSAgICA6IEhUTUxDb2xsZWN0aW9uKGl0ZW1Ob2RlLCBJdGVtUHJvcGVydGllcykK
KyAgICA6IEhUTUxDb2xsZWN0aW9uKGl0ZW1Ob2RlLCBJdGVtUHJvcGVydGllcywgRG9Ob3RTdXBw
b3J0SXRlbUJlZm9yZSkKICAgICAsIG1faGFzUHJvcGVydHlOYW1lQ2FjaGUoZmFsc2UpCiAgICAg
LCBtX2hhc0l0ZW1SZWZFbGVtZW50cyhmYWxzZSkKIHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0
bWwvSFRNTFRhYmxlUm93c0NvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2h0bWwvSFRNTFRhYmxlUm93c0NvbGxlY3Rpb24uY3BwCShyZXZpc2lvbiAxMjI2NDgpCisr
KyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxUYWJsZVJvd3NDb2xsZWN0aW9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTUyLDcgKzE1Miw3IEBAIEhUTUxUYWJsZVJvd0VsZW1lbnQqIEhUTUxUYWJs
ZVJvd3NDb2xsZWMKIC8vIHRhYmxlIHRvIGdldCBhdCB0aGUgY29sbGVjdGlvbiBjYWNoZS4gT3Jk
ZXIgb2YgYXJndW1lbnQgZXZhbHVhdGlvbiBpcyB1bmRlZmluZWQgYW5kIGNhbgogLy8gZGlmZmVy
IGJldHdlZW4gY29tcGlsZXJzLgogSFRNTFRhYmxlUm93c0NvbGxlY3Rpb246OkhUTUxUYWJsZVJv
d3NDb2xsZWN0aW9uKEVsZW1lbnQqIHRhYmxlKQotICAgIDogSFRNTENvbGxlY3Rpb24odGFibGUs
IFRhYmxlUm93cykKKyAgICA6IEhUTUxDb2xsZWN0aW9uKHRhYmxlLCBUYWJsZVJvd3MsIERvTm90
U3VwcG9ydEl0ZW1CZWZvcmUpCiB7CiAgICAgQVNTRVJUKHRhYmxlLT5oYXNUYWdOYW1lKHRhYmxl
VGFnKSk7CiB9CkluZGV4OiBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAxMjI2NTcpCisrKyBMYXlvdXRUZXN0cy9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwxNSBAQAorMjAxMi0wNy0xMyAgUnlvc3Vr
ZSBOaXdhICA8cm5pd2FAd2Via2l0Lm9yZz4KKworICAgICAgICBJdGVyYXRpbmcgYmFja3dhcmRz
IG92ZXIgSFRNTENvbGxlY3Rpb24gaXMgTyhuXjIpCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD05MTMwNgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9E
WSAoT09QUyEpLgorCisgICAgICAgIEFkZCBhbiBhc3ltcHRvdGljIHRpbWUgY29tcGxleGl0eSB0
ZXN0LgorCisgICAgICAgICogcGVyZi9odG1sY29sbGVjdGlvbi1iYWNrd2FyZHMtaXRlcmF0aW9u
LWV4cGVjdGVkLnR4dDogQWRkZWQuCisgICAgICAgICogcGVyZi9odG1sY29sbGVjdGlvbi1iYWNr
d2FyZHMtaXRlcmF0aW9uLmh0bWw6IEFkZGVkLgorCiAyMDEyLTA3LTEzICBLZW50IFRhbXVyYSAg
PHRrZW50QGNocm9taXVtLm9yZz4KIAogICAgICAgICBJbnRlcm5hbHM6IENsZWFuIHVwIHRoZSBt
b2NrIFBhZ2VQb3B1cERyaXZlciBjb3JyZWN0bHkuCkluZGV4OiBMYXlvdXRUZXN0cy9wZXJmL2h0
bWxjb2xsZWN0aW9uLWJhY2t3YXJkcy1pdGVyYXRpb24tZXhwZWN0ZWQudHh0Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIExheW91dFRlc3RzL3BlcmYvaHRtbGNvbGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJhdGlvbi1l
eHBlY3RlZC50eHQJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9wZXJmL2h0bWxjb2xsZWN0
aW9uLWJhY2t3YXJkcy1pdGVyYXRpb24tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDMgQEAKK1Rlc3RzIHRoYXQgaXRlcmF0aW5nIG92ZXIgSFRNTENvbGxlY3Rpb24gYmFja3dh
cmRzIGlzIGxpbmVhci4KK1BBU1MKKwpJbmRleDogTGF5b3V0VGVzdHMvcGVyZi9odG1sY29sbGVj
dGlvbi1iYWNrd2FyZHMtaXRlcmF0aW9uLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
cGVyZi9odG1sY29sbGVjdGlvbi1iYWNrd2FyZHMtaXRlcmF0aW9uLmh0bWwJKHJldmlzaW9uIDAp
CisrKyBMYXlvdXRUZXN0cy9wZXJmL2h0bWxjb2xsZWN0aW9uLWJhY2t3YXJkcy1pdGVyYXRpb24u
aHRtbAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOCBAQAorPCFET0NUWVBFIGh0bWw+Cis8Ym9k
eT4KKzxkaXYgaWQ9ImNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48L2Rpdj4KKzxz
Y3JpcHQgc3JjPSIuLi9yZXNvdXJjZXMvbWFnbml0dWRlLXBlcmYuanMiPjwvc2NyaXB0PgorPHNj
cmlwdD4KKwordmFyIGNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWlu
ZXInKTsKKworZnVuY3Rpb24gc2V0dXBGdW5jdGlvbihtYWduaXR1ZGUpCit7CisgICAgY29udGFp
bmVyLmlubmVySFRNTCA9ICcnOworICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFnbml0dWRlOyBp
KyspCisgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50
KCdkaXYnKSk7Cit9CisKK2Z1bmN0aW9uIHRlc3QobWFnbml0dWRlKQoreworICAgIHZhciBjaGls
ZHJlbiA9IGNvbnRhaW5lci5jaGlsZHJlbjsKKyAgICBmb3IgKHZhciBpID0gY2hpbGRyZW4ubGVu
Z3RoOyBpID4gMDtpLS0pCisgICAgICAgIGNoaWxkcmVuW2kgLSAxXS5jbGFzcyA9ICdoaSc7Cit9
CisKK01hZ25pdHVkZS5kZXNjcmlwdGlvbigiVGVzdHMgdGhhdCBpdGVyYXRpbmcgb3ZlciBIVE1M
Q29sbGVjdGlvbiBiYWNrd2FyZHMgaXMgbGluZWFyLiIpOworTWFnbml0dWRlLnJ1bihzZXR1cEZ1
bmN0aW9uLCB0ZXN0LCBNYWduaXR1ZGUuTElORUFSKTsKKworPC9zY3JpcHQ+Cis8L2JvZHk+Cis8
L2h0bWw+Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>152402</attachid>
            <date>2012-07-13 19:50:29 -0700</date>
            <delta_ts>2012-07-14 00:01:21 -0700</delta_ts>
            <desc>Fixed a bug</desc>
            <filename>bug-91306-20120713195354.patch</filename>
            <type>text/plain</type>
            <size>20873</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEyMjY1NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY1IEBACisyMDEyLTA3LTEzICBSeW9zdWtl
IE5pd2EgIDxybml3YUB3ZWJraXQub3JnPgorCisgICAgICAgIEl0ZXJhdGluZyBiYWNrd2FyZHMg
b3ZlciBIVE1MQ29sbGVjdGlvbiBpcyBPKG5eMikKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtp
dC5vcmcvc2hvd19idWcuY2dpP2lkPTkxMzA2CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZ
IChPT1BTISkuCisKKyAgICAgICAgRml4ZWQgdGhlIGJ1ZyBieSBpbnRyb2R1Y2luZyBpdGVtQmVm
b3JlIHRoYXQgaXRlcmF0ZXMgbm9kZXMgYmFja3dhcmRzIHRvIGNvbXBsZW1lbnQgaXRlbUFmdGVy
LgorICAgICAgICBVbmZvcnR1bmF0ZWx5LCBzb21lIEhUTUwgY29sbGVjdGlvbnMgc3VjaCBhcyBI
VE1MRm9ybUNvbGxlY3Rpb24gYW5kIEhUTUxUYWJsZVJvd3NDb2xsZWN0aW9uIGhhdmUKKyAgICAg
ICAgaXRzIG93biBpdGVtQWZ0ZXIgZnVuY3Rpb24gYW5kIHdyaXRpbmcgYW4gZXF1aXZhbGVudCBp
dGVtQmVmb3JlIGlzIHNvbWV3aGF0IHRyaWNreS4gRm9yIG5vdywKKyAgICAgICAgYWRkZWQgYSBu
ZXcgYm9vbGVhbiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBhIGdpdmVuIEhUTUwgY29sbGVjdGlv
biBzdXBwb3J0cyBpdGVtQmVmb3JlIG9yIG5vdCwKKyAgICAgICAgYW5kIGxlZnQgdGhvc2UgSFRN
TCBjb2xsZWN0aW9ucyB0aGF0IG92ZXJyaWRlIGl0ZW1BZnRlciBhbG9uZS4KKworICAgICAgICBU
aGlzIGFsc28gcGF2ZXMgb3VyIHdheSB0byBzaGFyZSBtb3JlIGNvZGUgYmV0d2VlbiBEeW5hbWlj
Tm9kZUxpc3QgYW5kIEhUTUxDb2xsZWN0aW9uLgorCisgICAgICAgIFRlc3Q6IHBlcmYvaHRtbGNv
bGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJhdGlvbi5odG1sCisKKyAgICAgICAgKiBkb20vRHluYW1p
Y05vZGVMaXN0Lmg6CisgICAgICAgIChXZWJDb3JlOjpEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2U6
OkR5bmFtaWNOb2RlTGlzdENhY2hlQmFzZSk6IFRha2VzIEl0ZW1CZWZvcmVTdXBwb3J0VHlwZS4K
KyAgICAgICAgKFdlYkNvcmU6OkR5bmFtaWNOb2RlTGlzdENhY2hlQmFzZTo6c3VwcG9ydHNJdGVt
QmVmb3JlKTogQWRkZWQuCisgICAgICAgIChEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2UpOgorICAg
ICAgICAoV2ViQ29yZTo6RHluYW1pY05vZGVMaXN0Q2FjaGVCYXNlOjpzZXRJdGVtQ2FjaGUpOiBS
ZXBsYWNlZCBhIEZJWE1FIGJ5IGFuIGFzc2VydGlvbiBub3cgdGhhdAorICAgICAgICB3ZSBjYW4u
CisgICAgICAgICogaHRtbC9IVE1MQWxsQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3Jl
OjpIVE1MQWxsQ29sbGVjdGlvbjo6SFRNTEFsbENvbGxlY3Rpb24pOiBTdXBwb3J0cyBpdGVtQmVm
b3JlIHNpbmNlIGl0IGRvZXNuJ3Qgb3ZlcnJpZGUKKyAgICAgICAgaXRlbUFmdGVyLgorICAgICAg
ICAqIGh0bWwvSFRNTENvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxl
Y3Rpb246OkhUTUxDb2xsZWN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkhUTUxDb2xsZWN0aW9u
OjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6aXNBY2NlcHRhYmxlRWxlbWVudCk6IE1hZGUg
aXQgYSBzdGF0aWMgbG9jYWwgZnVuY3Rpb24gaW5zdGVhZCBvZiBhIHN0YXRpYyBtZW1iZXIuCisg
ICAgICAgIChXZWJDb3JlOjpuZXh0Tm9kZSk6IFRlbXBsYXRpemVkLgorICAgICAgICAoV2ViQ29y
ZTo6aXRlbUJlZm9yZU9yQWZ0ZXIpOiBFeHRyYWN0ZWQgZnJvbSBpdGVtQWZ0ZXIgYW5kIHRlbXBs
YXRpemVkLgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Oml0ZW1CZWZvcmUpOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OkhUTUxDb2xsZWN0aW9uOjppdGVtQWZ0ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246OnNob3VsZFNlYXJjaEZyb21GaXJzdEl0ZW0p
OiBBZGRlZC4gRGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHNob3VsZCByZXNldAorICAgICAgICB0aGUg
aXRlbSBjYWNoZSB0byB0aGUgZmlyc3QgaXRlbS4gV2Ugb2J2aW91c2x5IGRvIGlmIHRoZSBjYWNo
ZSBpcyBpbnZhbGlkLiBJZiB0aGUgdGFyZ2V0IG9mZnNldAorICAgICAgICBpcyBhZnRlciB0aGUg
Y2FjaGVkIG9mZnNldCwgdGhlbiB3ZSBzaG91bGRuJ3QgZ28gYmFjayByZWdhcmRsZXNzIG9mIGF2
YWlsYWJpbGl0eSBvZiBpdGVtQmVmb3JlLgorICAgICAgICBPdGhlcndpc2UsIHdlIGdvIGJhY2sg
dG8gdGhlIGZpcnN0IGl0ZW0gaWZmIGl0ZW1CZWZvcmUgaXMgbm90IGF2YWlsYWJsZSBvciB0aGUg
ZGlzdGFuY2UgZnJvbQorICAgICAgICB0aGUgY2FjaGVkIG9mZnNldCB0byB0aGUgdGFyZ2V0IG9m
ZnNldCBpcyBncmVhdGVyIHRoYW4gdGhlIHRhcmdldCBvZmZzZXQgaXRzZWxmLgorICAgICAgICAo
V2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Omxlbmd0aCk6CisgICAgICAgIChXZWJDb3JlOjpIVE1M
Q29sbGVjdGlvbjo6aXRlbSk6IFVzZSB0aGUgdGVybSAib2Zmc2V0IiB0byBtYXRjaCB0aGUgdGVy
bWlub2xvZ3kgZWxzZXdoZXJlLgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb246Oml0
ZW1CZWZvcmVPckFmdGVyQ2FjaGVkSXRlbSk6IERpdHRvLiBBbHNvIGFkZGVkIHRoZSBsb2dpYyB0
byBpdGVyYXRlCisgICAgICAgIG5vZGVzIGJhY2t3YXJkcyB1c2luZyBpdGVtQmVmb3JlLiBPbmNl
IHdlJ3JlIGluIHRoaXMgYnJhbmNoLCB3ZSBzaG91bGQgYWx3YXlzIGZpbmQgYSBtYXRjaGluZwor
ICAgICAgICBpdGVtIHNpbmNlIHRoZSB0YXJnZXQgb2Zmc2V0IHdhcyBsZXNzIHRoYW4gdGhlIGNh
Y2hlZCBvZmZzZXQsIGFuZCBvZmZzZXRzIGFyZSBub24tbmVnYXRpdmUuCisgICAgICAgIElmIHdl
IGhhZCBldmVyIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbG9vcCB3aXRob3V0IGZpbmRpbmcgYW4g
aXRlbSwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhY2hlCisgICAgICAgIGhhcyBiZWVuIGludmFs
aWQgYW5kIHdlIGhhdmUgc29tZSBzZXJpb3VzIGJ1ZyBlbHNld2hlcmUuCisgICAgICAgICogaHRt
bC9IVE1MQ29sbGVjdGlvbi5oOgorICAgICAgICAoV2ViQ29yZTo6SFRNTENvbGxlY3Rpb25DYWNo
ZUJhc2U6OkhUTUxDb2xsZWN0aW9uQ2FjaGVCYXNlKToKKyAgICAgICAgKEhUTUxDb2xsZWN0aW9u
KToKKyAgICAgICAgKiBodG1sL0hUTUxPcHRpb25zQ29sbGVjdGlvbi5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpIVE1MT3B0aW9uc0NvbGxlY3Rpb246OkhUTUxPcHRpb25zQ29sbGVjdGlvbik6IFN1
cHBvcnRzIGl0ZW1CZWZvcmUgc2luY2UgaXQgZG9lc24ndAorICAgICAgICBvdmVycmlkZSBpdGVt
QWZ0ZXIuCisgICAgICAgICogaHRtbC9IVE1MRm9ybUNvbGxlY3Rpb24uY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SFRNTEZvcm1Db2xsZWN0aW9uOjpIVE1MRm9ybUNvbGxlY3Rpb24pOiBEb2Vzbid0
IHN1cHBvcnQgaXRlbUJlZm9yZSBhcyBpdCBvdmVycmlkZXMKKyAgICAgICAgaXRlbUFmdGVyLgor
ICAgICAgICAqIGh0bWwvSFRNTE5hbWVDb2xsZWN0aW9uLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkhUTUxOYW1lQ29sbGVjdGlvbjo6SFRNTE5hbWVDb2xsZWN0aW9uKTogRGl0dG8uCisgICAgICAg
ICogaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24pOgorICAg
ICAgICAqIGh0bWwvSFRNTFRhYmxlUm93c0NvbGxlY3Rpb24uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6SFRNTFRhYmxlUm93c0NvbGxlY3Rpb246OkhUTUxUYWJsZVJvd3NDb2xsZWN0aW9uKToKKwog
MjAxMi0wNy0xMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAg
SW50ZXJuYWxzOiBDbGVhbiB1cCB0aGUgbW9jayBQYWdlUG9wdXBEcml2ZXIgY29ycmVjdGx5LgpJ
bmRleDogU291cmNlL1dlYkNvcmUvZG9tL0R5bmFtaWNOb2RlTGlzdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2RvbS9EeW5hbWljTm9kZUxpc3QuaAkocmV2aXNpb24gMTIyNjQ5KQor
KysgU291cmNlL1dlYkNvcmUvZG9tL0R5bmFtaWNOb2RlTGlzdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC00Myw3ICs0MywxMyBAQCBlbnVtIE5vZGVMaXN0Um9vdFR5cGUgewogCiBjbGFzcyBEeW5hbWlj
Tm9kZUxpc3RDYWNoZUJhc2UgewogcHVibGljOgotICAgIER5bmFtaWNOb2RlTGlzdENhY2hlQmFz
ZShOb2RlTGlzdFJvb3RUeXBlIHJvb3RUeXBlLCBOb2RlTGlzdEludmFsaWRhdGlvblR5cGUgaW52
YWxpZGF0aW9uVHlwZSwgQ29sbGVjdGlvblR5cGUgY29sbGVjdGlvblR5cGUgPSBJbnZhbGlkQ29s
bGVjdGlvblR5cGUpCisgICAgZW51bSBJdGVtQmVmb3JlU3VwcG9ydFR5cGUgeworICAgICAgICBE
b05vdFN1cHBvcnRJdGVtQmVmb3JlLAorICAgICAgICBTdXBwb3J0SXRlbUJlZm9yZSwKKyAgICB9
OworCisgICAgRHluYW1pY05vZGVMaXN0Q2FjaGVCYXNlKE5vZGVMaXN0Um9vdFR5cGUgcm9vdFR5
cGUsIE5vZGVMaXN0SW52YWxpZGF0aW9uVHlwZSBpbnZhbGlkYXRpb25UeXBlLAorICAgICAgICBD
b2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSA9IEludmFsaWRDb2xsZWN0aW9uVHlwZSwgSXRl
bUJlZm9yZVN1cHBvcnRUeXBlIGl0ZW1CZWZvcmVTdXBwb3J0VHlwZSA9IERvTm90U3VwcG9ydEl0
ZW1CZWZvcmUpCiAgICAgICAgIDogbV9jYWNoZWRJdGVtKDApCiAgICAgICAgICwgbV9pc0xlbmd0
aENhY2hlVmFsaWQoZmFsc2UpCiAgICAgICAgICwgbV9pc0l0ZW1DYWNoZVZhbGlkKGZhbHNlKQpA
QCAtNTEsNiArNTcsNyBAQCBwdWJsaWM6CiAgICAgICAgICwgbV9pbnZhbGlkYXRpb25UeXBlKGlu
dmFsaWRhdGlvblR5cGUpCiAgICAgICAgICwgbV9pc05hbWVDYWNoZVZhbGlkKGZhbHNlKQogICAg
ICAgICAsIG1fY29sbGVjdGlvblR5cGUoY29sbGVjdGlvblR5cGUpCisgICAgICAgICwgbV9zdXBw
b3J0c0l0ZW1CZWZvcmUoaXRlbUJlZm9yZVN1cHBvcnRUeXBlID09IFN1cHBvcnRJdGVtQmVmb3Jl
KQogICAgIHsKICAgICAgICAgQVNTRVJUKG1faW52YWxpZGF0aW9uVHlwZSA9PSBzdGF0aWNfY2Fz
dDx1bnNpZ25lZD4oaW52YWxpZGF0aW9uVHlwZSkpOwogICAgICAgICBBU1NFUlQobV9jb2xsZWN0
aW9uVHlwZSA9PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oY29sbGVjdGlvblR5cGUpKTsKQEAgLTY2
LDYgKzczLDggQEAgcHVibGljOgogICAgIHN0YXRpYyBib29sIHNob3VsZEludmFsaWRhdGVUeXBl
T25BdHRyaWJ1dGVDaGFuZ2UoTm9kZUxpc3RJbnZhbGlkYXRpb25UeXBlLCBjb25zdCBRdWFsaWZp
ZWROYW1lJik7CiAKIHByb3RlY3RlZDoKKyAgICBib29sIHN1cHBvcnRzSXRlbUJlZm9yZSgpIGNv
bnN0IHsgcmV0dXJuIG1fc3VwcG9ydHNJdGVtQmVmb3JlOyB9CisKICAgICBBTFdBWVNfSU5MSU5F
IGJvb2wgaXNJdGVtQ2FjaGVWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNJdGVtQ2FjaGVWYWxp
ZDsgfQogICAgIEFMV0FZU19JTkxJTkUgTm9kZSogY2FjaGVkSXRlbSgpIGNvbnN0IHsgcmV0dXJu
IG1fY2FjaGVkSXRlbTsgfQogICAgIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgY2FjaGVkSXRlbU9m
ZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fY2FjaGVkSXRlbU9mZnNldDsgfQpAQCAtNzksNyArODgs
NyBAQCBwcm90ZWN0ZWQ6CiAgICAgfQogICAgIEFMV0FZU19JTkxJTkUgdm9pZCBzZXRJdGVtQ2Fj
aGUoTm9kZSogaXRlbSwgdW5zaWduZWQgb2Zmc2V0KSBjb25zdAogICAgIHsKLSAgICAgICAgLy8g
RklYTUU6IEFzc2VydCB0aGF0IGl0ZW0gaXMgbm90IG51bGwgb25jZSB3ZSd2ZSB1cGRhdGVkIER5
bmFtaWNOb2RlTGlzdC4KKyAgICAgICAgQVNTRVJUKGl0ZW0pOwogICAgICAgICBtX2NhY2hlZEl0
ZW0gPSBpdGVtOwogICAgICAgICBtX2NhY2hlZEl0ZW1PZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAg
IG1faXNJdGVtQ2FjaGVWYWxpZCA9IHRydWU7CkBAIC0xMDAsNiArMTA5LDcgQEAgcHJpdmF0ZToK
ICAgICAvLyBGcm9tIEhUTUxDb2xsZWN0aW9uCiAgICAgbXV0YWJsZSB1bnNpZ25lZCBtX2lzTmFt
ZUNhY2hlVmFsaWQgOiAxOwogICAgIGNvbnN0IHVuc2lnbmVkIG1fY29sbGVjdGlvblR5cGUgOiA1
OworICAgIGNvbnN0IHVuc2lnbmVkIG1fc3VwcG9ydHNJdGVtQmVmb3JlIDogMTsKIH07CiAKIEFM
V0FZU19JTkxJTkUgYm9vbCBEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2U6OnNob3VsZEludmFsaWRh
dGVUeXBlT25BdHRyaWJ1dGVDaGFuZ2UoTm9kZUxpc3RJbnZhbGlkYXRpb25UeXBlIHR5cGUsIGNv
bnN0IFF1YWxpZmllZE5hbWUmIGF0dHJOYW1lKQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MQWxsQ29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9I
VE1MQWxsQ29sbGVjdGlvbi5jcHAJKHJldmlzaW9uIDEyMjY0OCkKKysrIFNvdXJjZS9XZWJDb3Jl
L2h0bWwvSFRNTEFsbENvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3
IEBAIFBhc3NSZWZQdHI8SFRNTEFsbENvbGxlY3Rpb24+IEhUTUxBbGxDb2wKIH0KIAogSFRNTEFs
bENvbGxlY3Rpb246OkhUTUxBbGxDb2xsZWN0aW9uKERvY3VtZW50KiBkb2N1bWVudCkKLSAgICA6
IEhUTUxDb2xsZWN0aW9uKGRvY3VtZW50LCBEb2NBbGwpCisgICAgOiBIVE1MQ29sbGVjdGlvbihk
b2N1bWVudCwgRG9jQWxsLCBTdXBwb3J0SXRlbUJlZm9yZSkKIHsKIH0KIApJbmRleDogU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5jcHAJKHJldmlzaW9uIDEyMjY0OCkKKysrIFNvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTENvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTIs
OCArMTUyLDggQEAgc3RhdGljIE5vZGVMaXN0SW52YWxpZGF0aW9uVHlwZSBpbnZhbGlkYQogfQog
ICAgIAogCi1IVE1MQ29sbGVjdGlvbjo6SFRNTENvbGxlY3Rpb24oTm9kZSogYmFzZSwgQ29sbGVj
dGlvblR5cGUgdHlwZSkKLSAgICA6IEhUTUxDb2xsZWN0aW9uQ2FjaGVCYXNlKHJvb3RUeXBlRnJv
bUNvbGxlY3Rpb25UeXBlKHR5cGUpLCBpbnZhbGlkYXRpb25UeXBlRXhjbHVkaW5nSWRBbmROYW1l
QXR0cmlidXRlcyh0eXBlKSwgdHlwZSkKK0hUTUxDb2xsZWN0aW9uOjpIVE1MQ29sbGVjdGlvbihO
b2RlKiBiYXNlLCBDb2xsZWN0aW9uVHlwZSB0eXBlLCBJdGVtQmVmb3JlU3VwcG9ydFR5cGUgaXRl
bUJlZm9yZVN1cHBvcnRUeXBlKQorICAgIDogSFRNTENvbGxlY3Rpb25DYWNoZUJhc2Uocm9vdFR5
cGVGcm9tQ29sbGVjdGlvblR5cGUodHlwZSksIGludmFsaWRhdGlvblR5cGVFeGNsdWRpbmdJZEFu
ZE5hbWVBdHRyaWJ1dGVzKHR5cGUpLCB0eXBlLCBpdGVtQmVmb3JlU3VwcG9ydFR5cGUpCiAgICAg
LCBtX2Jhc2UoYmFzZSkKIHsKICAgICBBU1NFUlQobV9iYXNlKTsKQEAgLTE2Miw3ICsxNjIsNyBA
QCBIVE1MQ29sbGVjdGlvbjo6SFRNTENvbGxlY3Rpb24oTm9kZSogYmFzCiAKIFBhc3NSZWZQdHI8
SFRNTENvbGxlY3Rpb24+IEhUTUxDb2xsZWN0aW9uOjpjcmVhdGUoTm9kZSogYmFzZSwgQ29sbGVj
dGlvblR5cGUgdHlwZSkKIHsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IEhUTUxDb2xsZWN0aW9u
KGJhc2UsIHR5cGUpKTsKKyAgICByZXR1cm4gYWRvcHRSZWYobmV3IEhUTUxDb2xsZWN0aW9uKGJh
c2UsIHR5cGUsIFN1cHBvcnRJdGVtQmVmb3JlKSk7CiB9CiAKIEhUTUxDb2xsZWN0aW9uOjp+SFRN
TENvbGxlY3Rpb24oKQpAQCAtMTc5LDEyICsxNzksMTIgQEAgSFRNTENvbGxlY3Rpb246On5IVE1M
Q29sbGVjdGlvbigpCiAgICAgbV9iYXNlLT5kb2N1bWVudCgpLT51bnJlZ2lzdGVyTm9kZUxpc3RD
YWNoZSh0aGlzKTsKIH0KIAotaW5saW5lIGJvb2wgSFRNTENvbGxlY3Rpb246OmlzQWNjZXB0YWJs
ZUVsZW1lbnQoRWxlbWVudCogZWxlbWVudCkgY29uc3QKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0Fj
Y2VwdGFibGVFbGVtZW50KENvbGxlY3Rpb25UeXBlIHR5cGUsIEVsZW1lbnQqIGVsZW1lbnQpCiB7
Ci0gICAgaWYgKCFlbGVtZW50LT5pc0hUTUxFbGVtZW50KCkgJiYgISh0eXBlKCkgPT0gRG9jQWxs
IHx8IHR5cGUoKSA9PSBOb2RlQ2hpbGRyZW4pKQorICAgIGlmICghZWxlbWVudC0+aXNIVE1MRWxl
bWVudCgpICYmICEodHlwZSA9PSBEb2NBbGwgfHwgdHlwZSA9PSBOb2RlQ2hpbGRyZW4pKQogICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBzd2l0Y2ggKHR5cGUoKSkgeworICAgIHN3aXRjaCAo
dHlwZSkgewogICAgIGNhc2UgRG9jSW1hZ2VzOgogICAgICAgICByZXR1cm4gZWxlbWVudC0+aGFz
TG9jYWxOYW1lKGltZ1RhZyk7CiAgICAgY2FzZSBEb2NTY3JpcHRzOgpAQCAtMjM3LDI2ICsyMzcs
NTMgQEAgaW5saW5lIGJvb2wgSFRNTENvbGxlY3Rpb246OmlzQWNjZXB0YWJsZQogICAgIHJldHVy
biBmYWxzZTsKIH0KIAotc3RhdGljIEFMV0FZU19JTkxJTkUgTm9kZSogbmV4dE5vZGUoTm9kZSog
YmFzZSwgTm9kZSogcHJldmlvdXMsIGJvb2wgb25seUluY2x1ZGVEaXJlY3RDaGlsZHJlbikKK3Rl
bXBsYXRlPGJvb2wgZm9yd2FyZD4KK3N0YXRpYyBOb2RlKiBuZXh0Tm9kZShOb2RlKiBiYXNlLCBO
b2RlKiBwcmV2aW91cywgYm9vbCBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKQogewotICAgIHJl
dHVybiBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuID8gcHJldmlvdXMtPnRyYXZlcnNlTmV4dFNp
YmxpbmcoYmFzZSkgOiBwcmV2aW91cy0+dHJhdmVyc2VOZXh0Tm9kZShiYXNlKTsKKyAgICBpZiAo
Zm9yd2FyZCkKKyAgICAgICAgcmV0dXJuIG9ubHlJbmNsdWRlRGlyZWN0Q2hpbGRyZW4gPyBwcmV2
aW91cy0+bmV4dFNpYmxpbmcoKSA6IHByZXZpb3VzLT50cmF2ZXJzZU5leHROb2RlKGJhc2UpOwor
ICAgIHJldHVybiBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuID8gcHJldmlvdXMtPnByZXZpb3Vz
U2libGluZygpIDogcHJldmlvdXMtPnRyYXZlcnNlUHJldmlvdXNOb2RlKGJhc2UpOwogfQogCi1F
bGVtZW50KiBIVE1MQ29sbGVjdGlvbjo6aXRlbUFmdGVyKHVuc2lnbmVkJiBvZmZzZXRJbkFycmF5
LCBFbGVtZW50KiBwcmV2aW91cykgY29uc3QKK3RlbXBsYXRlPGJvb2wgZm9yd2FyZD4KK3N0YXRp
YyBFbGVtZW50KiBpdGVtQmVmb3JlT3JBZnRlcihDb2xsZWN0aW9uVHlwZSB0eXBlLCBOb2RlKiBi
YXNlLCB1bnNpZ25lZCYgb2Zmc2V0SW5BcnJheSwgTm9kZSogcHJldmlvdXMpCiB7CiAgICAgQVNT
RVJUX1VOVVNFRChvZmZzZXRJbkFycmF5LCAhb2Zmc2V0SW5BcnJheSk7Ci0gICAgYm9vbCBvbmx5
SW5jbHVkZURpcmVjdENoaWxkcmVuID0gc2hvdWxkT25seUluY2x1ZGVEaXJlY3RDaGlsZHJlbih0
eXBlKCkpOwotICAgIE5vZGUqIHJvb3ROb2RlID0gYmFzZSgpOwotICAgIE5vZGUqIGN1cnJlbnQg
PSBwcmV2aW91cyA/IG5leHROb2RlKHJvb3ROb2RlLCBwcmV2aW91cywgb25seUluY2x1ZGVEaXJl
Y3RDaGlsZHJlbikgOiBtX2Jhc2UtPmZpcnN0Q2hpbGQoKTsKKyAgICBib29sIG9ubHlJbmNsdWRl
RGlyZWN0Q2hpbGRyZW4gPSBzaG91bGRPbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKHR5cGUpOwor
ICAgIE5vZGUqIHJvb3ROb2RlID0gYmFzZTsKKyAgICBOb2RlKiBjdXJyZW50ID0gcHJldmlvdXMg
PyBuZXh0Tm9kZTxmb3J3YXJkPihyb290Tm9kZSwgcHJldmlvdXMsIG9ubHlJbmNsdWRlRGlyZWN0
Q2hpbGRyZW4pIDogKGZvcndhcmQgPyBiYXNlLT5maXJzdENoaWxkKCkgOiBiYXNlLT5sYXN0Q2hp
bGQoKSk7CiAKLSAgICBmb3IgKDsgY3VycmVudDsgY3VycmVudCA9IG5leHROb2RlKHJvb3ROb2Rl
LCBjdXJyZW50LCBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKSkgewotICAgICAgICBpZiAoY3Vy
cmVudC0+aXNFbGVtZW50Tm9kZSgpICYmIGlzQWNjZXB0YWJsZUVsZW1lbnQodG9FbGVtZW50KGN1
cnJlbnQpKSkKKyAgICBmb3IgKDsgY3VycmVudDsgY3VycmVudCA9IG5leHROb2RlPGZvcndhcmQ+
KHJvb3ROb2RlLCBjdXJyZW50LCBvbmx5SW5jbHVkZURpcmVjdENoaWxkcmVuKSkgeworICAgICAg
ICBpZiAoY3VycmVudC0+aXNFbGVtZW50Tm9kZSgpICYmIGlzQWNjZXB0YWJsZUVsZW1lbnQodHlw
ZSwgdG9FbGVtZW50KGN1cnJlbnQpKSkKICAgICAgICAgICAgIHJldHVybiB0b0VsZW1lbnQoY3Vy
cmVudCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKK0VsZW1lbnQqIEhUTUxDb2xsZWN0
aW9uOjppdGVtQmVmb3JlKHVuc2lnbmVkJiBvZmZzZXRJbkFycmF5LCBFbGVtZW50KiBwcmV2aW91
cykgY29uc3QKK3sKKyAgICByZXR1cm4gaXRlbUJlZm9yZU9yQWZ0ZXI8ZmFsc2U+KHR5cGUoKSwg
YmFzZSgpLCBvZmZzZXRJbkFycmF5LCBwcmV2aW91cyk7Cit9CisKK0VsZW1lbnQqIEhUTUxDb2xs
ZWN0aW9uOjppdGVtQWZ0ZXIodW5zaWduZWQmIG9mZnNldEluQXJyYXksIEVsZW1lbnQqIHByZXZp
b3VzKSBjb25zdAoreworICAgIHJldHVybiBpdGVtQmVmb3JlT3JBZnRlcjx0cnVlPih0eXBlKCks
IGJhc2UoKSwgb2Zmc2V0SW5BcnJheSwgcHJldmlvdXMpOworfQorICAgIAorYm9vbCBBTFdBWVNf
SU5MSU5FIEhUTUxDb2xsZWN0aW9uOjpzaG91bGRTZWFyY2hGcm9tRmlyc3RJdGVtKHVuc2lnbmVk
IG9mZnNldCkgY29uc3QKK3sKKyAgICBpZiAoIWlzSXRlbUNhY2hlVmFsaWQoKSkKKyAgICAgICAg
cmV0dXJuIHRydWU7CisKKyAgICBBU1NFUlQob2Zmc2V0ICE9IGNhY2hlZEl0ZW1PZmZzZXQoKSk7
CisgICAgaWYgKG9mZnNldCA+IGNhY2hlZEl0ZW1PZmZzZXQoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgdW5zaWduZWQgZGlzdGFuY2VGcm9tQ2FjaGVkSXRlbSA9IGNhY2hlZEl0ZW1P
ZmZzZXQoKSAtIG9mZnNldDsKKyAgICByZXR1cm4gIXN1cHBvcnRzSXRlbUJlZm9yZSgpIHx8IG9m
ZnNldCA8IGRpc3RhbmNlRnJvbUNhY2hlZEl0ZW07Cit9CisKIHVuc2lnbmVkIEhUTUxDb2xsZWN0
aW9uOjpsZW5ndGgoKSBjb25zdAogewogICAgIGlmIChpc0xlbmd0aENhY2hlVmFsaWQoKSkKQEAg
LTI3MiwxOCArMjk5LDE4IEBAIHVuc2lnbmVkIEhUTUxDb2xsZWN0aW9uOjpsZW5ndGgoKSBjb25z
dAogICAgIHVuc2lnbmVkIG9mZnNldCA9IGNhY2hlZEl0ZW1PZmZzZXQoKTsKICAgICBkbyB7CiAg
ICAgICAgIG9mZnNldCsrOwotICAgIH0gd2hpbGUgKGl0ZW1BZnRlckNhY2hlZEl0ZW0ob2Zmc2V0
KSk7CisgICAgfSB3aGlsZSAoaXRlbUJlZm9yZU9yQWZ0ZXJDYWNoZWRJdGVtKG9mZnNldCkpOwog
CiAgICAgc2V0TGVuZ3RoQ2FjaGUob2Zmc2V0KTsKICAgICByZXR1cm4gb2Zmc2V0OwogfQogCi1O
b2RlKiBIVE1MQ29sbGVjdGlvbjo6aXRlbSh1bnNpZ25lZCBpbmRleCkgY29uc3QKK05vZGUqIEhU
TUxDb2xsZWN0aW9uOjppdGVtKHVuc2lnbmVkIG9mZnNldCkgY29uc3QKIHsKLSAgICBpZiAoaXNJ
dGVtQ2FjaGVWYWxpZCgpICYmIGNhY2hlZEl0ZW1PZmZzZXQoKSA9PSBpbmRleCkKKyAgICBpZiAo
aXNJdGVtQ2FjaGVWYWxpZCgpICYmIGNhY2hlZEl0ZW1PZmZzZXQoKSA9PSBvZmZzZXQpCiAgICAg
ICAgIHJldHVybiBjYWNoZWRJdGVtKCk7CiAKLSAgICBpZiAoaXNMZW5ndGhDYWNoZVZhbGlkKCkg
JiYgY2FjaGVkTGVuZ3RoKCkgPD0gaW5kZXgpCisgICAgaWYgKGlzTGVuZ3RoQ2FjaGVWYWxpZCgp
ICYmIGNhY2hlZExlbmd0aCgpIDw9IG9mZnNldCkKICAgICAgICAgcmV0dXJuIDA7CiAKICNpZiBF
TkFCTEUoTUlDUk9EQVRBKQpAQCAtMjkxLDcgKzMxOCw3IEBAIE5vZGUqIEhUTUxDb2xsZWN0aW9u
OjppdGVtKHVuc2lnbmVkIGluZGUKICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTFByb3Bl
cnRpZXNDb2xsZWN0aW9uKj4odGhpcyktPnVwZGF0ZVJlZkVsZW1lbnRzKCk7CiAjZW5kaWYKIAot
ICAgIGlmICghaXNJdGVtQ2FjaGVWYWxpZCgpIHx8IGNhY2hlZEl0ZW1PZmZzZXQoKSA+IGluZGV4
KSB7CisgICAgaWYgKHNob3VsZFNlYXJjaEZyb21GaXJzdEl0ZW0ob2Zmc2V0KSkgewogICAgICAg
ICB1bnNpZ25lZCBvZmZzZXRJbkFycmF5ID0gMDsKICAgICAgICAgTm9kZSogZmlyc3RJdGVtID0g
aXRlbUFmdGVyKG9mZnNldEluQXJyYXksIDApOwogICAgICAgICBpZiAoIWZpcnN0SXRlbSkgewpA
QCAtMzAwLDMwICszMjcsNDUgQEAgTm9kZSogSFRNTENvbGxlY3Rpb246Oml0ZW0odW5zaWduZWQg
aW5kZQogICAgICAgICB9CiAgICAgICAgIHNldEl0ZW1DYWNoZShmaXJzdEl0ZW0sIDAsIG9mZnNl
dEluQXJyYXkpOwogICAgICAgICBBU1NFUlQoIWNhY2hlZEl0ZW1PZmZzZXQoKSk7Ci0gICAgICAg
IGlmICghaW5kZXgpCisgICAgICAgIGlmICghb2Zmc2V0KQogICAgICAgICAgICAgcmV0dXJuIGNh
Y2hlZEl0ZW0oKTsKICAgICB9CiAKLSAgICByZXR1cm4gaXRlbUFmdGVyQ2FjaGVkSXRlbShpbmRl
eCk7CisgICAgcmV0dXJuIGl0ZW1CZWZvcmVPckFmdGVyQ2FjaGVkSXRlbShvZmZzZXQpOwogfQog
Ci1FbGVtZW50KiBIVE1MQ29sbGVjdGlvbjo6aXRlbUFmdGVyQ2FjaGVkSXRlbSh1bnNpZ25lZCBp
bmRleCkgY29uc3QKK0VsZW1lbnQqIEhUTUxDb2xsZWN0aW9uOjppdGVtQmVmb3JlT3JBZnRlckNh
Y2hlZEl0ZW0odW5zaWduZWQgb2Zmc2V0KSBjb25zdAogewotICAgIHVuc2lnbmVkIGN1cnJlbnRJ
bmRleCA9IGNhY2hlZEl0ZW1PZmZzZXQoKTsKKyAgICB1bnNpZ25lZCBjdXJyZW50T2Zmc2V0ID0g
Y2FjaGVkSXRlbU9mZnNldCgpOwogICAgIEFTU0VSVChjYWNoZWRJdGVtKCktPmlzRWxlbWVudE5v
ZGUoKSk7CiAgICAgRWxlbWVudCogY3VycmVudEl0ZW0gPSB0b0VsZW1lbnQoY2FjaGVkSXRlbSgp
KTsKLSAgICBBU1NFUlQoY3VycmVudEluZGV4IDwgaW5kZXgpOworICAgIEFTU0VSVChjdXJyZW50
T2Zmc2V0ICE9IG9mZnNldCk7CiAKICAgICB1bnNpZ25lZCBvZmZzZXRJbkFycmF5ID0gY2FjaGVk
RWxlbWVudHNBcnJheU9mZnNldCgpOworCisgICAgaWYgKG9mZnNldCA8IGNhY2hlZEl0ZW1PZmZz
ZXQoKSkgeworICAgICAgICBBU1NFUlQoc3VwcG9ydHNJdGVtQmVmb3JlKCkpOworICAgICAgICB3
aGlsZSAoKGN1cnJlbnRJdGVtID0gaXRlbUJlZm9yZShvZmZzZXRJbkFycmF5LCBjdXJyZW50SXRl
bSkpKSB7CisgICAgICAgICAgICBBU1NFUlQoY3VycmVudE9mZnNldCk7CisgICAgICAgICAgICBj
dXJyZW50T2Zmc2V0LS07CisgICAgICAgICAgICBpZiAoY3VycmVudE9mZnNldCA9PSBvZmZzZXQp
IHsKKyAgICAgICAgICAgICAgICBzZXRJdGVtQ2FjaGUoY3VycmVudEl0ZW0sIGN1cnJlbnRPZmZz
ZXQsIG9mZnNldEluQXJyYXkpOworICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50SXRlbTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgd2hpbGUgKChjdXJyZW50SXRlbSA9IGl0
ZW1BZnRlcihvZmZzZXRJbkFycmF5LCBjdXJyZW50SXRlbSkpKSB7Ci0gICAgICAgIGN1cnJlbnRJ
bmRleCsrOwotICAgICAgICBpZiAoY3VycmVudEluZGV4ID09IGluZGV4KSB7Ci0gICAgICAgICAg
ICBzZXRJdGVtQ2FjaGUoY3VycmVudEl0ZW0sIGN1cnJlbnRJbmRleCwgb2Zmc2V0SW5BcnJheSk7
CisgICAgICAgIGN1cnJlbnRPZmZzZXQrKzsKKyAgICAgICAgaWYgKGN1cnJlbnRPZmZzZXQgPT0g
b2Zmc2V0KSB7CisgICAgICAgICAgICBzZXRJdGVtQ2FjaGUoY3VycmVudEl0ZW0sIGN1cnJlbnRP
ZmZzZXQsIG9mZnNldEluQXJyYXkpOwogICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtOwog
ICAgICAgICB9CiAgICAgfQogCi0gICAgc2V0TGVuZ3RoQ2FjaGUoY3VycmVudEluZGV4KTsKKyAg
ICBzZXRMZW5ndGhDYWNoZShjdXJyZW50T2Zmc2V0KTsKIAogICAgIHJldHVybiAwOwogfQpJbmRl
eDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTENvbGxlY3Rpb24uaAkocmV2aXNpb24gMTIyNjQ4KQorKysg
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MQ29sbGVjdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0z
OSw4ICszOSw4IEBAIGNsYXNzIE5vZGVMaXN0OwogCiBjbGFzcyBIVE1MQ29sbGVjdGlvbkNhY2hl
QmFzZSA6IHB1YmxpYyBEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2UgewogcHVibGljOgotICAgIEhU
TUxDb2xsZWN0aW9uQ2FjaGVCYXNlKE5vZGVMaXN0Um9vdFR5cGUgcm9vdFR5cGUsIE5vZGVMaXN0
SW52YWxpZGF0aW9uVHlwZSBpbnZhbGlkYXRpb25UeXBlLCBDb2xsZWN0aW9uVHlwZSBjb2xsZWN0
aW9uVHlwZSkKLSAgICAgICAgOiBEeW5hbWljTm9kZUxpc3RDYWNoZUJhc2Uocm9vdFR5cGUsIGlu
dmFsaWRhdGlvblR5cGUsIGNvbGxlY3Rpb25UeXBlKQorICAgIEhUTUxDb2xsZWN0aW9uQ2FjaGVC
YXNlKE5vZGVMaXN0Um9vdFR5cGUgcm9vdFR5cGUsIE5vZGVMaXN0SW52YWxpZGF0aW9uVHlwZSBp
bnZhbGlkYXRpb25UeXBlLCBDb2xsZWN0aW9uVHlwZSBjb2xsZWN0aW9uVHlwZSwgSXRlbUJlZm9y
ZVN1cHBvcnRUeXBlIGl0ZW1CZWZvcmVTdXBwb3J0VHlwZSkKKyAgICAgICAgOiBEeW5hbWljTm9k
ZUxpc3RDYWNoZUJhc2Uocm9vdFR5cGUsIGludmFsaWRhdGlvblR5cGUsIGNvbGxlY3Rpb25UeXBl
LCBpdGVtQmVmb3JlU3VwcG9ydFR5cGUpCiAgICAgICAgICwgbV9jYWNoZWRFbGVtZW50c0FycmF5
T2Zmc2V0KDApCiAgICAgewogICAgIH0KQEAgLTEwNiw3ICsxMDYsNyBAQCBwdWJsaWM6CiAgICAg
Tm9kZSogYmFzZSgpIGNvbnN0IHsgcmV0dXJuIG1fYmFzZS5nZXQoKTsgfQogCiBwcm90ZWN0ZWQ6
Ci0gICAgSFRNTENvbGxlY3Rpb24oTm9kZSogYmFzZSwgQ29sbGVjdGlvblR5cGUpOworICAgIEhU
TUxDb2xsZWN0aW9uKE5vZGUqIGJhc2UsIENvbGxlY3Rpb25UeXBlLCBJdGVtQmVmb3JlU3VwcG9y
dFR5cGUpOwogCiAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZU5hbWVDYWNoZSgpIGNvbnN0OwogICAg
IHZpcnR1YWwgRWxlbWVudCogaXRlbUFmdGVyKHVuc2lnbmVkJiBvZmZzZXRJbkFycmF5LCBFbGVt
ZW50KikgY29uc3Q7CkBAIC0xMTQsOCArMTE0LDkgQEAgcHJvdGVjdGVkOgogcHJpdmF0ZToKICAg
ICBib29sIGNoZWNrRm9yTmFtZU1hdGNoKEVsZW1lbnQqLCBib29sIGNoZWNrTmFtZSwgY29uc3Qg
QXRvbWljU3RyaW5nJiBuYW1lKSBjb25zdDsKIAotICAgIEVsZW1lbnQqIGl0ZW1BZnRlckNhY2hl
ZEl0ZW0odW5zaWduZWQpIGNvbnN0OwotICAgIGJvb2wgaXNBY2NlcHRhYmxlRWxlbWVudChFbGVt
ZW50KikgY29uc3Q7CisgICAgRWxlbWVudCogaXRlbUJlZm9yZSh1bnNpZ25lZCYgb2Zmc2V0SW5B
cnJheSwgRWxlbWVudCopIGNvbnN0OworICAgIGJvb2wgc2hvdWxkU2VhcmNoRnJvbUZpcnN0SXRl
bSh1bnNpZ25lZCBvZmZzZXQpIGNvbnN0OworICAgIEVsZW1lbnQqIGl0ZW1CZWZvcmVPckFmdGVy
Q2FjaGVkSXRlbSh1bnNpZ25lZCBvZmZzZXQpIGNvbnN0OwogCiAgICAgUmVmUHRyPE5vZGU+IG1f
YmFzZTsKIH07CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29sbGVjdGlvbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRm9ybUNvbGxlY3Rpb24u
Y3BwCShyZXZpc2lvbiAxMjI2NDgpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGb3JtQ29s
bGVjdGlvbi5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDcgKzM3LDcgQEAgdXNpbmcgbmFtZXNw
YWNlIEhUTUxOYW1lczsKIC8vIGNhbGN1bGF0aW9uIGV2ZXJ5IHRpbWUgaWYgYW55dGhpbmcgaGFz
IGNoYW5nZWQuCiAKIEhUTUxGb3JtQ29sbGVjdGlvbjo6SFRNTEZvcm1Db2xsZWN0aW9uKEVsZW1l
bnQqIGJhc2UpCi0gICAgOiBIVE1MQ29sbGVjdGlvbihiYXNlLCBGb3JtQ29udHJvbHMpCisgICAg
OiBIVE1MQ29sbGVjdGlvbihiYXNlLCBGb3JtQ29udHJvbHMsIERvTm90U3VwcG9ydEl0ZW1CZWZv
cmUpCiB7CiAgICAgQVNTRVJUKGJhc2UtPmhhc1RhZ05hbWUoZm9ybVRhZykgfHwgYmFzZS0+aGFz
VGFnTmFtZShmaWVsZHNldFRhZykpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1M
TmFtZUNvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRN
TE5hbWVDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMTIyNjQ4KQorKysgU291cmNlL1dlYkNvcmUv
aHRtbC9IVE1MTmFtZUNvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3ICszMyw3
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIHVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7CiAKIEhU
TUxOYW1lQ29sbGVjdGlvbjo6SFRNTE5hbWVDb2xsZWN0aW9uKERvY3VtZW50KiBkb2N1bWVudCwg
Q29sbGVjdGlvblR5cGUgdHlwZSwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lKQotICAgIDogSFRN
TENvbGxlY3Rpb24oZG9jdW1lbnQsIHR5cGUpCisgICAgOiBIVE1MQ29sbGVjdGlvbihkb2N1bWVu
dCwgdHlwZSwgRG9Ob3RTdXBwb3J0SXRlbUJlZm9yZSkKICAgICAsIG1fbmFtZShuYW1lKQogewog
fQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MT3B0aW9uc0NvbGxlY3Rpb24uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE9wdGlvbnNDb2xsZWN0aW9uLmNw
cAkocmV2aXNpb24gMTIyNjQ4KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MT3B0aW9uc0Nv
bGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw3IEBACiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKIEhUTUxPcHRpb25zQ29sbGVjdGlvbjo6SFRNTE9wdGlvbnNDb2xsZWN0aW9u
KEVsZW1lbnQqIHNlbGVjdCkKLSAgICA6IEhUTUxDb2xsZWN0aW9uKHNlbGVjdCwgU2VsZWN0T3B0
aW9ucykKKyAgICA6IEhUTUxDb2xsZWN0aW9uKHNlbGVjdCwgU2VsZWN0T3B0aW9ucywgU3VwcG9y
dEl0ZW1CZWZvcmUpCiB7CiAgICAgQVNTRVJUKHNlbGVjdC0+aGFzVGFnTmFtZShIVE1MTmFtZXM6
OnNlbGVjdFRhZykpOwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MUHJvcGVydGll
c0NvbGxlY3Rpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTFBy
b3BlcnRpZXNDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMTIyNjQ4KQorKysgU291cmNlL1dlYkNv
cmUvaHRtbC9IVE1MUHJvcGVydGllc0NvbGxlY3Rpb24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01
MSw3ICs1MSw3IEBAIFBhc3NSZWZQdHI8SFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uPiBIVE0KIH0K
IAogSFRNTFByb3BlcnRpZXNDb2xsZWN0aW9uOjpIVE1MUHJvcGVydGllc0NvbGxlY3Rpb24oTm9k
ZSogaXRlbU5vZGUpCi0gICAgOiBIVE1MQ29sbGVjdGlvbihpdGVtTm9kZSwgSXRlbVByb3BlcnRp
ZXMpCisgICAgOiBIVE1MQ29sbGVjdGlvbihpdGVtTm9kZSwgSXRlbVByb3BlcnRpZXMsIERvTm90
U3VwcG9ydEl0ZW1CZWZvcmUpCiAgICAgLCBtX2hhc1Byb3BlcnR5TmFtZUNhY2hlKGZhbHNlKQog
ICAgICwgbV9oYXNJdGVtUmVmRWxlbWVudHMoZmFsc2UpCiB7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxUYWJsZVJvd3NDb2xsZWN0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
V2ViQ29yZS9odG1sL0hUTUxUYWJsZVJvd3NDb2xsZWN0aW9uLmNwcAkocmV2aXNpb24gMTIyNjQ4
KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MVGFibGVSb3dzQ29sbGVjdGlvbi5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTE1Miw3ICsxNTIsNyBAQCBIVE1MVGFibGVSb3dFbGVtZW50KiBIVE1M
VGFibGVSb3dzQ29sbGVjCiAvLyB0YWJsZSB0byBnZXQgYXQgdGhlIGNvbGxlY3Rpb24gY2FjaGUu
IE9yZGVyIG9mIGFyZ3VtZW50IGV2YWx1YXRpb24gaXMgdW5kZWZpbmVkIGFuZCBjYW4KIC8vIGRp
ZmZlciBiZXR3ZWVuIGNvbXBpbGVycy4KIEhUTUxUYWJsZVJvd3NDb2xsZWN0aW9uOjpIVE1MVGFi
bGVSb3dzQ29sbGVjdGlvbihFbGVtZW50KiB0YWJsZSkKLSAgICA6IEhUTUxDb2xsZWN0aW9uKHRh
YmxlLCBUYWJsZVJvd3MpCisgICAgOiBIVE1MQ29sbGVjdGlvbih0YWJsZSwgVGFibGVSb3dzLCBE
b05vdFN1cHBvcnRJdGVtQmVmb3JlKQogewogICAgIEFTU0VSVCh0YWJsZS0+aGFzVGFnTmFtZSh0
YWJsZVRhZykpOwogfQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTIyNjU3KQorKysgTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTItMDctMTMgIFJ5
b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CisKKyAgICAgICAgSXRlcmF0aW5nIGJhY2t3
YXJkcyBvdmVyIEhUTUxDb2xsZWN0aW9uIGlzIE8obl4yKQorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTEzMDYKKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgYW4gYXN5bXB0b3RpYyB0aW1lIGNvbXBsZXhp
dHkgdGVzdC4KKworICAgICAgICAqIHBlcmYvaHRtbGNvbGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJh
dGlvbi1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIHBlcmYvaHRtbGNvbGxlY3Rpb24t
YmFja3dhcmRzLWl0ZXJhdGlvbi5odG1sOiBBZGRlZC4KKwogMjAxMi0wNy0xMyAgS2VudCBUYW11
cmEgIDx0a2VudEBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgSW50ZXJuYWxzOiBDbGVhbiB1cCB0
aGUgbW9jayBQYWdlUG9wdXBEcml2ZXIgY29ycmVjdGx5LgpJbmRleDogTGF5b3V0VGVzdHMvcGVy
Zi9odG1sY29sbGVjdGlvbi1iYWNrd2FyZHMtaXRlcmF0aW9uLWV4cGVjdGVkLnR4dAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9wZXJmL2h0bWxjb2xsZWN0aW9uLWJhY2t3YXJkcy1pdGVyYXRp
b24tZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvcGVyZi9odG1sY29s
bGVjdGlvbi1iYWNrd2FyZHMtaXRlcmF0aW9uLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwzIEBACitUZXN0cyB0aGF0IGl0ZXJhdGluZyBvdmVyIEhUTUxDb2xsZWN0aW9uIGJh
Y2t3YXJkcyBpcyBsaW5lYXIuCitQQVNTCisKSW5kZXg6IExheW91dFRlc3RzL3BlcmYvaHRtbGNv
bGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJhdGlvbi5odG1sCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRl
c3RzL3BlcmYvaHRtbGNvbGxlY3Rpb24tYmFja3dhcmRzLWl0ZXJhdGlvbi5odG1sCShyZXZpc2lv
biAwKQorKysgTGF5b3V0VGVzdHMvcGVyZi9odG1sY29sbGVjdGlvbi1iYWNrd2FyZHMtaXRlcmF0
aW9uLmh0bWwJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sPgor
PGJvZHk+Cis8ZGl2IGlkPSJjb250YWluZXIiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+PC9kaXY+
Cis8c2NyaXB0IHNyYz0iLi4vcmVzb3VyY2VzL21hZ25pdHVkZS1wZXJmLmpzIj48L3NjcmlwdD4K
KzxzY3JpcHQ+CisKK3ZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29u
dGFpbmVyJyk7CisKK2Z1bmN0aW9uIHNldHVwRnVuY3Rpb24obWFnbml0dWRlKQoreworICAgIGNv
bnRhaW5lci5pbm5lckhUTUwgPSAnJzsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hZ25pdHVk
ZTsgaSsrKQorICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgnZGl2JykpOworfQorCitmdW5jdGlvbiB0ZXN0KG1hZ25pdHVkZSkKK3sKKyAgICB2YXIg
Y2hpbGRyZW4gPSBjb250YWluZXIuY2hpbGRyZW47CisgICAgZm9yICh2YXIgaSA9IGNoaWxkcmVu
Lmxlbmd0aDsgaSA+IDA7aS0tKQorICAgICAgICBjaGlsZHJlbltpIC0gMV0uY2xhc3MgPSAnaGkn
OworfQorCitNYWduaXR1ZGUuZGVzY3JpcHRpb24oIlRlc3RzIHRoYXQgaXRlcmF0aW5nIG92ZXIg
SFRNTENvbGxlY3Rpb24gYmFja3dhcmRzIGlzIGxpbmVhci4iKTsKK01hZ25pdHVkZS5ydW4oc2V0
dXBGdW5jdGlvbiwgdGVzdCwgTWFnbml0dWRlLkxJTkVBUik7CisKKzwvc2NyaXB0PgorPC9ib2R5
PgorPC9odG1sPgo=
</data>
<flag name="review"
          id="161085"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>152403</attachid>
            <date>2012-07-13 19:51:27 -0700</date>
            <delta_ts>2012-07-13 19:51:27 -0700</delta_ts>
            <desc>demo</desc>
            <filename>htmlcollection-backward-traversal.html</filename>
            <type>text/html</type>
            <size>540</size>
            <attacher name="Ryosuke Niwa">rniwa</attacher>
            
              <data encoding="base64">PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8Ym9keT4KPHA+VGhpcyB0ZXN0cyB0cmF2ZXJzaW5nIEhU
TUwgY29sbGVjdGlvbiB3aXRoIDIwLDAwMCBpdGVtcyBiYWNrd2FyZHMuIFRoZSB0ZXN0IHNob3Vs
ZCBub3QgdGltZW91dC48L3A+CjxkaXYgaWQ9ImNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6IG5v
bmU7Ij48L2Rpdj4KPHNjcmlwdD4KCnZhciBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50
QnlJZCgnY29udGFpbmVyJyk7Cgpmb3IgKHZhciBpID0gMDsgaSA8IDIwMDAwOyBpKyspCiAgICBj
b250YWluZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwoKdmFy
IHN0YXJ0ID0gRGF0ZS5ub3coKTsKCnZhciBjaGlsZHJlbiA9IGNvbnRhaW5lci5jaGlsZHJlbjsK
Zm9yICh2YXIgaSA9IGNoaWxkcmVuLmxlbmd0aDsgaSA+IDA7aS0tKQogICAgY2hpbGRyZW5baSAt
IDFdLmNsYXNzID0gJ2hpJzsKCmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTsK
Cjwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K
</data>

          </attachment>
      

    </bug>

</bugzilla>