<?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>188539</bug_id>
          
          <creation_ts>2018-08-13 15:32:48 -0700</creation_ts>
          <short_desc>Make CSSSelectorList a little more sane</short_desc>
          <delta_ts>2018-08-14 11:17:30 -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>New Bugs</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex Christensen">achristensen</reporter>
          <assigned_to name="Alex Christensen">achristensen</assigned_to>
          <cc>darin</cc>
    
    <cc>koivisto</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1449815</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-13 15:32:48 -0700</bug_when>
    <thetext>Make CSSSelectorList a little more sane</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449819</commentid>
    <comment_count>1</comment_count>
      <attachid>347051</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-13 15:40:21 -0700</bug_when>
    <thetext>Created attachment 347051
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449833</commentid>
    <comment_count>2</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-13 16:36:25 -0700</bug_when>
    <thetext>http://trac.webkit.org/r234825</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449834</commentid>
    <comment_count>3</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2018-08-13 16:37:17 -0700</bug_when>
    <thetext>&lt;rdar://problem/43258896&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449850</commentid>
    <comment_count>4</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-08-13 17:14:04 -0700</bug_when>
    <thetext>How is UniqueArray&lt;T&gt; different from std::unique_ptr&lt;T[]&gt;? I’m surprised we added our own template for this instead of using the standard library.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449851</commentid>
    <comment_count>5</comment_count>
      <attachid>347051</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-08-13 17:18:39 -0700</bug_when>
    <thetext>Comment on attachment 347051
Patch

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

&gt; Source/WebCore/css/CSSSelectorList.cpp:48
&gt;  CSSSelectorList::CSSSelectorList(CSSSelectorList&amp;&amp; other)
&gt; -    : m_selectorArray(other.m_selectorArray)
&gt; +    : m_selectorArray(WTFMove(other.m_selectorArray))
&gt;  {
&gt; -    other.m_selectorArray = nullptr;
&gt;  }

This now seems to be doing what the default move constructor would do. Can we change this so we don’t write it out explicitly?

&gt; Source/WebCore/css/CSSSelectorList.cpp:113
&gt;  CSSSelectorList&amp; CSSSelectorList::operator=(CSSSelectorList&amp;&amp; other)
&gt;  {
&gt; -    deleteSelectors();
&gt; -    m_selectorArray = other.m_selectorArray;
&gt; -    other.m_selectorArray = nullptr;
&gt; -
&gt; +    m_selectorArray = WTFMove(other.m_selectorArray);
&gt;      return *this;
&gt;  }

This now seems to be doing what the default move assignment operator would do. Can we change this so we don’t write it out explicitly?

&gt; Source/WebCore/css/CSSSelectorList.cpp:-131
&gt; -    bool isLastSelector = false;
&gt; -    for (CSSSelector* s = selectorArray; !isLastSelector; ++s) {
&gt; -        isLastSelector = s-&gt;isLastInSelectorList();
&gt; -        s-&gt;~CSSSelector();
&gt; -    }

Does the UniqueArray have this same optimization? Why isn’t this check for isLastInSelectorList needed any more?

&gt; Source/WebCore/css/CSSSelectorList.h:42
&gt;      CSSSelectorList(Vector&lt;std::unique_ptr&lt;CSSParserSelector&gt;&gt;&amp;&amp;);

I think this maybe this should be marked &quot;explicit&quot;.

&gt; Source/WebCore/css/CSSSelectorList.h:44
&gt; +    CSSSelectorList(UniqueArray&lt;CSSSelector&gt;&amp;&amp; array)
&gt; +        : m_selectorArray(WTFMove(array)) { }

I think this maybe this should be marked &quot;explicit&quot;.

&gt; Source/WebCore/css/CSSSelectorList.h:75
&gt;      // End of the array is indicated by m_isLastInSelectorList bit in the last item.

This comment is now confusing to me. Apparently that’s not how the end of the array works any more? Or is it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449957</commentid>
    <comment_count>6</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-14 09:39:38 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #5)
&gt; &gt; Source/WebCore/css/CSSSelectorList.cpp:-131
&gt; &gt; -    bool isLastSelector = false;
&gt; &gt; -    for (CSSSelector* s = selectorArray; !isLastSelector; ++s) {
&gt; &gt; -        isLastSelector = s-&gt;isLastInSelectorList();
&gt; &gt; -        s-&gt;~CSSSelector();
&gt; &gt; -    }
&gt; 
&gt; Does the UniqueArray have this same optimization? Why isn’t this check for
&gt; isLastInSelectorList needed any more?
UniqueArray, like std::unique_ptr&lt;CSSSelector[]&gt;, uses malloc information to know how many destructors to call.

&gt; &gt; Source/WebCore/css/CSSSelectorList.h:75
&gt; &gt;      // End of the array is indicated by m_isLastInSelectorList bit in the last item.
&gt; 
&gt; This comment is now confusing to me. Apparently that’s not how the end of
&gt; the array works any more? Or is it?
It&apos;s still how the end of the array works for iterating because we don&apos;t have std::dynarray.  I was considering making it a Vector, but that would use extra bits and I didn&apos;t want to change behavior or performance in this patch.  Do you think it would be good to make it a Vector instead of a UniqueArray?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449958</commentid>
    <comment_count>7</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-14 09:40:33 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #4)
&gt; How is UniqueArray&lt;T&gt; different from std::unique_ptr&lt;T[]&gt;? I’m surprised we
&gt; added our own template for this instead of using the standard library.

UniqueArray uses fastMalloc and fastFree.  It&apos;s nicer than adding a bunch of template parameters everywhere.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449991</commentid>
    <comment_count>8</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-08-14 10:29:18 -0700</bug_when>
    <thetext>(In reply to Alex Christensen from comment #6

&gt; Do you think it would be good to make it a Vector instead of a
&gt; UniqueArray?

No.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449992</commentid>
    <comment_count>9</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-08-14 10:30:02 -0700</bug_when>
    <thetext>(In reply to Alex Christensen from comment #7)
&gt; (In reply to Darin Adler from comment #4)
&gt; &gt; How is UniqueArray&lt;T&gt; different from std::unique_ptr&lt;T[]&gt;? I’m surprised we
&gt; &gt; added our own template for this instead of using the standard library.
&gt; 
&gt; UniqueArray uses fastMalloc and fastFree.  It&apos;s nicer than adding a bunch of
&gt; template parameters everywhere.

Why doesn’t this happen for std::unique_ptr?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449993</commentid>
    <comment_count>10</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-14 10:32:18 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #9)
&gt; (In reply to Alex Christensen from comment #7)
&gt; &gt; (In reply to Darin Adler from comment #4)
&gt; &gt; &gt; How is UniqueArray&lt;T&gt; different from std::unique_ptr&lt;T[]&gt;? I’m surprised we
&gt; &gt; &gt; added our own template for this instead of using the standard library.
&gt; &gt; 
&gt; &gt; UniqueArray uses fastMalloc and fastFree.  It&apos;s nicer than adding a bunch of
&gt; &gt; template parameters everywhere.
&gt; 
&gt; Why doesn’t this happen for std::unique_ptr?

It can, but it requires a second template parameter.  That&apos;s how we implemented UniqueArray.  make_unique also can&apos;t be used with fastMalloc, so we made makeUniqueArray.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1449994</commentid>
    <comment_count>11</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2018-08-14 10:34:47 -0700</bug_when>
    <thetext>Why aren’t we using a WTF::UniquePtr too for the same reason?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1450004</commentid>
    <comment_count>12</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-14 10:46:04 -0700</bug_when>
    <thetext>We actually could&apos;ve for this case because WTF_MAKE_FAST_ALLOCATED makes operator new[] and operator delete[], but if we use types with no such operators (such as char) we need something like UniqueArray.  I&apos;m using UniqueArray for consistency with those cases.  See https://bugs.webkit.org/show_bug.cgi?id=182975</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1450033</commentid>
    <comment_count>13</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2018-08-14 11:17:30 -0700</bug_when>
    <thetext>Responding to the remaining feedback in https://bugs.webkit.org/show_bug.cgi?id=188566</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>347051</attachid>
            <date>2018-08-13 15:40:21 -0700</date>
            <delta_ts>2018-08-13 16:28:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-188539-20180813154019.patch</filename>
            <type>text/plain</type>
            <size>18157</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDIzNDgyMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE4LTA4LTEzICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgTWFrZSBDU1NT
ZWxlY3Rvckxpc3QgYSBsaXR0bGUgbW9yZSBzYW5lCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xODg1MzkKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIGRvZXMgZm91ciB0aGluZ3M6CisgICAg
ICAgIDEuIFVzZSBhIFVuaXF1ZUFycmF5PENTU1NlbGVjdG9yPiBpbnN0ZWFkIG9mIGEgcmF3IHBv
aW50ZXIgYW5kIG1hbnVhbGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMuCisgICAgICAgIDIuIFVzZSBt
b3ZlIHNlbWFudGljcyBhIGxpdHRsZSBiaXQgYmV0dGVyLgorICAgICAgICAzLiBBZGQgYSBDU1NT
ZWxlY3Rvckxpc3QmJiB0byB0aGUgU3R5bGVSdWxlIGFuZCBTdHlsZVJ1bGVQYWdlIGJlY2F1c2Ug
ZXZlcnkgdGltZSB3ZSBjcmVhdGUgZWl0aGVyCisgICAgICAgIG9uZSBvZiB0aG9zZSBvYmplY3Rz
IHdlIGNhbGwgYSBzZXR0ZXIgdG8gZ2l2ZSBpdCBhIENTU1NlbGVjdG9yTGlzdC4gIFRoYXQncyB3
aGF0IGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhcmUgZm9yLgorICAgICAgICA0LiBEb24ndCB1c2Ug
Q1NTU2VsZWN0b3JMaXN0LmNvbXBvbmVudENvdW50KCksIHdoaWNoIGl0ZXJhdGVzIGFsbCBjb21w
b25lbnRzLCB0byBkZXRlcm1pbmUgaWYgaXQncyBlbXB0eS4KKyAgICAgICAgVXNlIGZpcnN0KCkg
aW5zdGVhZC4KKworICAgICAgICAqIGNzcy9DU1NQYWdlUnVsZS5jcHA6CisgICAgICAgIChXZWJD
b3JlOjpDU1NQYWdlUnVsZTo6c2V0U2VsZWN0b3JUZXh0KToKKyAgICAgICAgKiBjc3MvQ1NTU2Vs
ZWN0b3JMaXN0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yTGlzdDo6Q1NTU2Vs
ZWN0b3JMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OkNTU1NlbGVjdG9yTGlzdDo6Y29tcG9uZW50
Q291bnQgY29uc3QpOgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JMaXN0OjpsaXN0U2l6
ZSBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvckxpc3Q6Om9wZXJhdG9yPSk6
CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxlY3Rvckxpc3Q6OmRlbGV0ZVNlbGVjdG9ycyk6IERl
bGV0ZWQuCisgICAgICAgICogY3NzL0NTU1NlbGVjdG9yTGlzdC5oOgorICAgICAgICAoV2ViQ29y
ZTo6Q1NTU2VsZWN0b3JMaXN0OjpDU1NTZWxlY3Rvckxpc3QpOgorICAgICAgICAoV2ViQ29yZTo6
Q1NTU2VsZWN0b3JMaXN0OjpmaXJzdCBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpDU1NTZWxl
Y3Rvckxpc3Q6OmluZGV4T2ZOZXh0U2VsZWN0b3JBZnRlciBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpDU1NTZWxlY3Rvckxpc3Q6On5DU1NTZWxlY3Rvckxpc3QpOiBEZWxldGVkLgorICAgICAg
ICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JMaXN0OjphZG9wdFNlbGVjdG9yQXJyYXkpOiBEZWxldGVk
LgorICAgICAgICAoV2ViQ29yZTo6Q1NTU2VsZWN0b3JMaXN0OjpoYXNPbmVTZWxlY3RvciBjb25z
dCk6IERlbGV0ZWQuCisgICAgICAgICogY3NzL0NTU1N0eWxlUnVsZS5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpDU1NTdHlsZVJ1bGU6OnNldFNlbGVjdG9yVGV4dCk6CisgICAgICAgICogY3NzL1N0
eWxlUnVsZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZVJ1bGU6OlN0eWxlUnVsZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdHlsZVJ1bGU6OmNyZWF0ZUZvclNwbGl0dGluZyk6CisgICAgICAg
IChXZWJDb3JlOjpTdHlsZVJ1bGVQYWdlOjpTdHlsZVJ1bGVQYWdlKToKKyAgICAgICAgKiBjc3Mv
U3R5bGVSdWxlLmg6CisgICAgICAgICogY3NzL3BhcnNlci9DU1NQYXJzZXJJbXBsLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkNTU1BhcnNlckltcGw6OmNvbnN1bWVQYWdlUnVsZSk6CisgICAgICAg
IChXZWJDb3JlOjpDU1NQYXJzZXJJbXBsOjpjb25zdW1lU3R5bGVSdWxlKToKKyAgICAgICAgKiBj
c3MvcGFyc2VyL0NTU1NlbGVjdG9yUGFyc2VyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNTU1Nl
bGVjdG9yUGFyc2VyOjpjb25zdW1lUHNldWRvKToKKwogMjAxOC0wOC0xMyAgQWxpIEp1bWEgIDxh
anVtYUBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgW0ludGVyc2VjdGlvbk9ic2VydmVyXSBWYWxp
ZGF0ZSB0aHJlc2hvbGQgdmFsdWVzCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvQ1NTUGFnZVJ1
bGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYWdlUnVsZS5jcHAJ
KHJldmlzaW9uIDIzNDgxMykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NQYWdlUnVsZS5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTc3LDcgKzc3LDcgQEAgdm9pZCBDU1NQYWdlUnVsZTo6c2V0U2Vs
ZWN0b3JUZXh0KGNvbnN0IAogCiAgICAgQ1NTU3R5bGVTaGVldDo6UnVsZU11dGF0aW9uU2NvcGUg
bXV0YXRpb25TY29wZSh0aGlzKTsKIAotICAgIG1fcGFnZVJ1bGUtPndyYXBwZXJBZG9wdFNlbGVj
dG9yTGlzdChzZWxlY3Rvckxpc3QpOworICAgIG1fcGFnZVJ1bGUtPndyYXBwZXJBZG9wdFNlbGVj
dG9yTGlzdChXVEZNb3ZlKHNlbGVjdG9yTGlzdCkpOwogfQogCiBTdHJpbmcgQ1NTUGFnZVJ1bGU6
OmNzc1RleHQoKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlz
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5j
cHAJKHJldmlzaW9uIDIzNDgxNCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTZWxlY3Rvckxp
c3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNywxNSArMzcsMTQgQEAgQ1NTU2VsZWN0b3JMaXN0
OjpDU1NTZWxlY3Rvckxpc3QoY29uc3QgQwogICAgIHVuc2lnbmVkIG90aGVyQ29tcG9uZW50Q291
bnQgPSBvdGhlci5jb21wb25lbnRDb3VudCgpOwogICAgIEFTU0VSVF9XSVRIX1NFQ1VSSVRZX0lN
UExJQ0FUSU9OKG90aGVyQ29tcG9uZW50Q291bnQpOwogCi0gICAgbV9zZWxlY3RvckFycmF5ID0g
cmVpbnRlcnByZXRfY2FzdDxDU1NTZWxlY3Rvcio+KGZhc3RNYWxsb2Moc2l6ZW9mKENTU1NlbGVj
dG9yKSAqIG90aGVyQ29tcG9uZW50Q291bnQpKTsKKyAgICBtX3NlbGVjdG9yQXJyYXkgPSBtYWtl
VW5pcXVlQXJyYXk8Q1NTU2VsZWN0b3I+KG90aGVyQ29tcG9uZW50Q291bnQpOwogICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBvdGhlckNvbXBvbmVudENvdW50OyArK2kpCiAgICAgICAgIG5l
dyAoTm90TnVsbCwgJm1fc2VsZWN0b3JBcnJheVtpXSkgQ1NTU2VsZWN0b3Iob3RoZXIubV9zZWxl
Y3RvckFycmF5W2ldKTsKIH0KIAogQ1NTU2VsZWN0b3JMaXN0OjpDU1NTZWxlY3Rvckxpc3QoQ1NT
U2VsZWN0b3JMaXN0JiYgb3RoZXIpCi0gICAgOiBtX3NlbGVjdG9yQXJyYXkob3RoZXIubV9zZWxl
Y3RvckFycmF5KQorICAgIDogbV9zZWxlY3RvckFycmF5KFdURk1vdmUob3RoZXIubV9zZWxlY3Rv
ckFycmF5KSkKIHsKLSAgICBvdGhlci5tX3NlbGVjdG9yQXJyYXkgPSBudWxscHRyOwogfQogCiBD
U1NTZWxlY3Rvckxpc3Q6OkNTU1NlbGVjdG9yTGlzdChWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENT
U1BhcnNlclNlbGVjdG9yPj4mJiBzZWxlY3RvclZlY3RvcikKQEAgLTU4LDcgKzU3LDcgQEAgQ1NT
U2VsZWN0b3JMaXN0OjpDU1NTZWxlY3Rvckxpc3QoVmVjdG9yPAogICAgICAgICAgICAgKytmbGF0
dGVuZWRTaXplOwogICAgIH0KICAgICBBU1NFUlQoZmxhdHRlbmVkU2l6ZSk7Ci0gICAgbV9zZWxl
Y3RvckFycmF5ID0gcmVpbnRlcnByZXRfY2FzdDxDU1NTZWxlY3Rvcio+KGZhc3RNYWxsb2Moc2l6
ZW9mKENTU1NlbGVjdG9yKSAqIGZsYXR0ZW5lZFNpemUpKTsKKyAgICBtX3NlbGVjdG9yQXJyYXkg
PSBtYWtlVW5pcXVlQXJyYXk8Q1NTU2VsZWN0b3I+KGZsYXR0ZW5lZFNpemUpOwogICAgIHNpemVf
dCBhcnJheUluZGV4ID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlbGVjdG9yVmVj
dG9yLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENTU1BhcnNlclNlbGVjdG9yKiBjdXJyZW50ID0g
c2VsZWN0b3JWZWN0b3JbaV0uZ2V0KCk7CkBAIC04NywxMCArODYsMTAgQEAgdW5zaWduZWQgQ1NT
U2VsZWN0b3JMaXN0Ojpjb21wb25lbnRDb3VudAogewogICAgIGlmICghbV9zZWxlY3RvckFycmF5
KQogICAgICAgICByZXR1cm4gMDsKLSAgICBDU1NTZWxlY3RvciogY3VycmVudCA9IG1fc2VsZWN0
b3JBcnJheTsKKyAgICBDU1NTZWxlY3RvciogY3VycmVudCA9IG1fc2VsZWN0b3JBcnJheS5nZXQo
KTsKICAgICB3aGlsZSAoIWN1cnJlbnQtPmlzTGFzdEluU2VsZWN0b3JMaXN0KCkpCiAgICAgICAg
ICsrY3VycmVudDsKLSAgICByZXR1cm4gKGN1cnJlbnQgLSBtX3NlbGVjdG9yQXJyYXkpICsgMTsK
KyAgICByZXR1cm4gKGN1cnJlbnQgLSBtX3NlbGVjdG9yQXJyYXkuZ2V0KCkpICsgMTsKIH0KIAog
dW5zaWduZWQgQ1NTU2VsZWN0b3JMaXN0OjpsaXN0U2l6ZSgpIGNvbnN0CkBAIC05OCw3ICs5Nyw3
IEBAIHVuc2lnbmVkIENTU1NlbGVjdG9yTGlzdDo6bGlzdFNpemUoKSBjb24KICAgICBpZiAoIW1f
c2VsZWN0b3JBcnJheSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgdW5zaWduZWQgc2l6ZSA9IDE7
Ci0gICAgQ1NTU2VsZWN0b3IqIGN1cnJlbnQgPSBtX3NlbGVjdG9yQXJyYXk7CisgICAgQ1NTU2Vs
ZWN0b3IqIGN1cnJlbnQgPSBtX3NlbGVjdG9yQXJyYXkuZ2V0KCk7CiAgICAgd2hpbGUgKCFjdXJy
ZW50LT5pc0xhc3RJblNlbGVjdG9yTGlzdCgpKSB7CiAgICAgICAgIGlmIChjdXJyZW50LT5pc0xh
c3RJblRhZ0hpc3RvcnkoKSkKICAgICAgICAgICAgICsrc2l6ZTsKQEAgLTEwOSwyOSArMTA4LDEw
IEBAIHVuc2lnbmVkIENTU1NlbGVjdG9yTGlzdDo6bGlzdFNpemUoKSBjb24KIAogQ1NTU2VsZWN0
b3JMaXN0JiBDU1NTZWxlY3Rvckxpc3Q6Om9wZXJhdG9yPShDU1NTZWxlY3Rvckxpc3QmJiBvdGhl
cikKIHsKLSAgICBkZWxldGVTZWxlY3RvcnMoKTsKLSAgICBtX3NlbGVjdG9yQXJyYXkgPSBvdGhl
ci5tX3NlbGVjdG9yQXJyYXk7Ci0gICAgb3RoZXIubV9zZWxlY3RvckFycmF5ID0gbnVsbHB0cjsK
LQorICAgIG1fc2VsZWN0b3JBcnJheSA9IFdURk1vdmUob3RoZXIubV9zZWxlY3RvckFycmF5KTsK
ICAgICByZXR1cm4gKnRoaXM7CiB9CiAKLXZvaWQgQ1NTU2VsZWN0b3JMaXN0OjpkZWxldGVTZWxl
Y3RvcnMoKQotewotICAgIGlmICghbV9zZWxlY3RvckFycmF5KQotICAgICAgICByZXR1cm47Ci0K
LSAgICBDU1NTZWxlY3Rvciogc2VsZWN0b3JBcnJheSA9IG1fc2VsZWN0b3JBcnJheTsKLSAgICBt
X3NlbGVjdG9yQXJyYXkgPSBudWxscHRyOwotCi0gICAgYm9vbCBpc0xhc3RTZWxlY3RvciA9IGZh
bHNlOwotICAgIGZvciAoQ1NTU2VsZWN0b3IqIHMgPSBzZWxlY3RvckFycmF5OyAhaXNMYXN0U2Vs
ZWN0b3I7ICsrcykgewotICAgICAgICBpc0xhc3RTZWxlY3RvciA9IHMtPmlzTGFzdEluU2VsZWN0
b3JMaXN0KCk7Ci0gICAgICAgIHMtPn5DU1NTZWxlY3RvcigpOwotICAgIH0KLSAgICBmYXN0RnJl
ZShzZWxlY3RvckFycmF5KTsKLX0KLQogU3RyaW5nIENTU1NlbGVjdG9yTGlzdDo6c2VsZWN0b3Jz
VGV4dCgpIGNvbnN0CiB7CiAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQ7CkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9jc3MvQ1NTU2VsZWN0b3JMaXN0LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvY3NzL0NTU1NlbGVjdG9yTGlzdC5oCShyZXZpc2lvbiAyMzQ4MTQpCisrKyBTb3VyY2UvV2Vi
Q29yZS9jc3MvQ1NTU2VsZWN0b3JMaXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcg
QEAKIAogI2luY2x1ZGUgIkNTU1NlbGVjdG9yLmgiCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1
ZGUgPHd0Zi9VbmlxdWVBcnJheS5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKQEAgLTM1LDE5
ICszNiwxNiBAQCBjbGFzcyBDU1NQYXJzZXJTZWxlY3RvcjsKIGNsYXNzIENTU1NlbGVjdG9yTGlz
dCB7CiAgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CiBwdWJsaWM6Ci0gICAgQ1NTU2VsZWN0
b3JMaXN0KCkgOiBtX3NlbGVjdG9yQXJyYXkoMCkgeyB9CisgICAgQ1NTU2VsZWN0b3JMaXN0KCkg
PSBkZWZhdWx0OwogICAgIENTU1NlbGVjdG9yTGlzdChjb25zdCBDU1NTZWxlY3Rvckxpc3QmKTsK
ICAgICBDU1NTZWxlY3Rvckxpc3QoQ1NTU2VsZWN0b3JMaXN0JiYpOwogICAgIENTU1NlbGVjdG9y
TGlzdChWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENTU1BhcnNlclNlbGVjdG9yPj4mJik7Ci0KLSAg
ICB+Q1NTU2VsZWN0b3JMaXN0KCkgeyBkZWxldGVTZWxlY3RvcnMoKTsgfQotCi0gICAgdm9pZCBh
ZG9wdFNlbGVjdG9yQXJyYXkoQ1NTU2VsZWN0b3IqIHNlbGVjdG9ycykgeyBBU1NFUlQoIW1fc2Vs
ZWN0b3JBcnJheSk7IG1fc2VsZWN0b3JBcnJheSA9IHNlbGVjdG9yczsgfQorICAgIENTU1NlbGVj
dG9yTGlzdChVbmlxdWVBcnJheTxDU1NTZWxlY3Rvcj4mJiBhcnJheSkKKyAgICAgICAgOiBtX3Nl
bGVjdG9yQXJyYXkoV1RGTW92ZShhcnJheSkpIHsgfQogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29u
c3QgeyByZXR1cm4gISFtX3NlbGVjdG9yQXJyYXk7IH0KLSAgICBjb25zdCBDU1NTZWxlY3Rvciog
Zmlyc3QoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yQXJyYXk7IH0KKyAgICBjb25zdCBDU1NT
ZWxlY3RvciogZmlyc3QoKSBjb25zdCB7IHJldHVybiBtX3NlbGVjdG9yQXJyYXkuZ2V0KCk7IH0K
ICAgICBzdGF0aWMgY29uc3QgQ1NTU2VsZWN0b3IqIG5leHQoY29uc3QgQ1NTU2VsZWN0b3IqKTsK
LSAgICBib29sIGhhc09uZVNlbGVjdG9yKCkgY29uc3QgeyByZXR1cm4gbV9zZWxlY3RvckFycmF5
ICYmICFuZXh0KG1fc2VsZWN0b3JBcnJheSk7IH0KICAgICBjb25zdCBDU1NTZWxlY3Rvciogc2Vs
ZWN0b3JBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuICZtX3NlbGVjdG9yQXJyYXlbaW5k
ZXhdOyB9CiAKICAgICBzaXplX3QgaW5kZXhPZk5leHRTZWxlY3RvckFmdGVyKHNpemVfdCBpbmRl
eCkgY29uc3QKQEAgLTU2LDcgKzU0LDcgQEAgcHVibGljOgogICAgICAgICBjdXJyZW50ID0gbmV4
dChjdXJyZW50KTsKICAgICAgICAgaWYgKCFjdXJyZW50KQogICAgICAgICAgICAgcmV0dXJuIG5v
dEZvdW5kOwotICAgICAgICByZXR1cm4gY3VycmVudCAtIG1fc2VsZWN0b3JBcnJheTsKKyAgICAg
ICAgcmV0dXJuIGN1cnJlbnQgLSBtX3NlbGVjdG9yQXJyYXkuZ2V0KCk7CiAgICAgfQogCiAgICAg
Ym9vbCBzZWxlY3RvcnNOZWVkTmFtZXNwYWNlUmVzb2x1dGlvbigpOwpAQCAtNzUsNyArNzMsNyBA
QCBwcml2YXRlOgogCiAgICAgLy8gRW5kIG9mIGEgbXVsdGlwYXJ0IHNlbGVjdG9yIGlzIGluZGlj
YXRlZCBieSBtX2lzTGFzdEluVGFnSGlzdG9yeSBiaXQgaW4gdGhlIGxhc3QgaXRlbS4KICAgICAv
LyBFbmQgb2YgdGhlIGFycmF5IGlzIGluZGljYXRlZCBieSBtX2lzTGFzdEluU2VsZWN0b3JMaXN0
IGJpdCBpbiB0aGUgbGFzdCBpdGVtLgotICAgIENTU1NlbGVjdG9yKiBtX3NlbGVjdG9yQXJyYXk7
CisgICAgVW5pcXVlQXJyYXk8Q1NTU2VsZWN0b3I+IG1fc2VsZWN0b3JBcnJheTsKIH07CiAKIGlu
bGluZSBjb25zdCBDU1NTZWxlY3RvciogQ1NTU2VsZWN0b3JMaXN0OjpuZXh0KGNvbnN0IENTU1Nl
bGVjdG9yKiBjdXJyZW50KQpJbmRleDogU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxlUnVsZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL0NTU1N0eWxlUnVsZS5jcHAJKHJl
dmlzaW9uIDIzNDgxMykKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9DU1NTdHlsZVJ1bGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMDIsNyArMTAyLDcgQEAgdm9pZCBDU1NTdHlsZVJ1bGU6OnNldFNl
bGVjdG9yVGV4dChjb25zdAogCiAgICAgQ1NTU3R5bGVTaGVldDo6UnVsZU11dGF0aW9uU2NvcGUg
bXV0YXRpb25TY29wZSh0aGlzKTsKIAotICAgIG1fc3R5bGVSdWxlLT53cmFwcGVyQWRvcHRTZWxl
Y3Rvckxpc3Qoc2VsZWN0b3JMaXN0KTsKKyAgICBtX3N0eWxlUnVsZS0+d3JhcHBlckFkb3B0U2Vs
ZWN0b3JMaXN0KFdURk1vdmUoc2VsZWN0b3JMaXN0KSk7CiAKICAgICBpZiAoaGFzQ2FjaGVkU2Vs
ZWN0b3JUZXh0KCkpIHsKICAgICAgICAgc2VsZWN0b3JUZXh0Q2FjaGUoKS5yZW1vdmUodGhpcyk7
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSdWxlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSdWxlLmNwcAkocmV2aXNpb24gMjM0ODEzKQorKysgU291
cmNlL1dlYkNvcmUvY3NzL1N0eWxlUnVsZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE4MSw5ICsx
ODEsMTAgQEAgdW5zaWduZWQgU3R5bGVSdWxlOjphdmVyYWdlU2l6ZUluQnl0ZXMoKQogICAgIHJl
dHVybiBzaXplb2YoU3R5bGVSdWxlKSArIHNpemVvZihDU1NTZWxlY3RvcikgKyBTdHlsZVByb3Bl
cnRpZXM6OmF2ZXJhZ2VTaXplSW5CeXRlcygpOwogfQogCi1TdHlsZVJ1bGU6OlN0eWxlUnVsZShS
ZWY8U3R5bGVQcm9wZXJ0aWVzQmFzZT4mJiBwcm9wZXJ0aWVzLCBib29sIGhhc0RvY3VtZW50U2Vj
dXJpdHlPcmlnaW4pCitTdHlsZVJ1bGU6OlN0eWxlUnVsZShSZWY8U3R5bGVQcm9wZXJ0aWVzQmFz
ZT4mJiBwcm9wZXJ0aWVzLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4sIENTU1NlbGVj
dG9yTGlzdCYmIHNlbGVjdG9ycykKICAgICA6IFN0eWxlUnVsZUJhc2UoU3R5bGUsIGhhc0RvY3Vt
ZW50U2VjdXJpdHlPcmlnaW4pCiAgICAgLCBtX3Byb3BlcnRpZXMoV1RGTW92ZShwcm9wZXJ0aWVz
KSkKKyAgICAsIG1fc2VsZWN0b3JMaXN0KFdURk1vdmUoc2VsZWN0b3JzKSkKIHsKIH0KIApAQCAt
MjEzLDEzICsyMTQsMTEgQEAgTXV0YWJsZVN0eWxlUHJvcGVydGllcyYgU3R5bGVSdWxlOjptdXRh
YgogUmVmPFN0eWxlUnVsZT4gU3R5bGVSdWxlOjpjcmVhdGVGb3JTcGxpdHRpbmcoY29uc3QgVmVj
dG9yPGNvbnN0IENTU1NlbGVjdG9yKj4mIHNlbGVjdG9ycywgUmVmPFN0eWxlUHJvcGVydGllcz4m
JiBwcm9wZXJ0aWVzLCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4pCiB7CiAgICAgQVNT
RVJUX1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04oIXNlbGVjdG9ycy5pc0VtcHR5KCkpOwotICAg
IENTU1NlbGVjdG9yKiBzZWxlY3Rvckxpc3RBcnJheSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1NTU2Vs
ZWN0b3IqPihmYXN0TWFsbG9jKHNpemVvZihDU1NTZWxlY3RvcikgKiBzZWxlY3RvcnMuc2l6ZSgp
KSk7CisgICAgYXV0byBzZWxlY3Rvckxpc3RBcnJheSA9IG1ha2VVbmlxdWVBcnJheTxDU1NTZWxl
Y3Rvcj4oc2VsZWN0b3JzLnNpemUoKSk7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNl
bGVjdG9ycy5zaXplKCk7ICsraSkKICAgICAgICAgbmV3IChOb3ROdWxsLCAmc2VsZWN0b3JMaXN0
QXJyYXlbaV0pIENTU1NlbGVjdG9yKCpzZWxlY3RvcnMuYXQoaSkpOwogICAgIHNlbGVjdG9yTGlz
dEFycmF5W3NlbGVjdG9ycy5zaXplKCkgLSAxXS5zZXRMYXN0SW5TZWxlY3Rvckxpc3QoKTsKLSAg
ICBhdXRvIHJ1bGUgPSBTdHlsZVJ1bGU6OmNyZWF0ZShXVEZNb3ZlKHByb3BlcnRpZXMpLCBoYXNE
b2N1bWVudFNlY3VyaXR5T3JpZ2luKTsKLSAgICBydWxlLmdldCgpLnBhcnNlckFkb3B0U2VsZWN0
b3JBcnJheShzZWxlY3Rvckxpc3RBcnJheSk7Ci0gICAgcmV0dXJuIHJ1bGU7CisgICAgcmV0dXJu
IFN0eWxlUnVsZTo6Y3JlYXRlKFdURk1vdmUocHJvcGVydGllcyksIGhhc0RvY3VtZW50U2VjdXJp
dHlPcmlnaW4sIFdURk1vdmUoc2VsZWN0b3JMaXN0QXJyYXkpKTsKIH0KIAogVmVjdG9yPFJlZlB0
cjxTdHlsZVJ1bGU+PiBTdHlsZVJ1bGU6OnNwbGl0SW50b011bHRpcGxlUnVsZXNXaXRoTWF4aW11
bVNlbGVjdG9yQ29tcG9uZW50Q291bnQodW5zaWduZWQgbWF4Q291bnQpIGNvbnN0CkBAIC0yNDgs
OSArMjQ3LDEwIEBAIFZlY3RvcjxSZWZQdHI8U3R5bGVSdWxlPj4gU3R5bGVSdWxlOjpzcGwKICAg
ICByZXR1cm4gcnVsZXM7CiB9CiAKLVN0eWxlUnVsZVBhZ2U6OlN0eWxlUnVsZVBhZ2UoUmVmPFN0
eWxlUHJvcGVydGllcz4mJiBwcm9wZXJ0aWVzKQorU3R5bGVSdWxlUGFnZTo6U3R5bGVSdWxlUGFn
ZShSZWY8U3R5bGVQcm9wZXJ0aWVzPiYmIHByb3BlcnRpZXMsIENTU1NlbGVjdG9yTGlzdCYmIHNl
bGVjdG9ycykKICAgICA6IFN0eWxlUnVsZUJhc2UoUGFnZSkKICAgICAsIG1fcHJvcGVydGllcyhX
VEZNb3ZlKHByb3BlcnRpZXMpKQorICAgICwgbV9zZWxlY3Rvckxpc3QoV1RGTW92ZShzZWxlY3Rv
cnMpKQogewogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSdWxlLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL1dlYkNvcmUvY3NzL1N0eWxlUnVsZS5oCShyZXZpc2lvbiAyMzQ4MTQp
CisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvU3R5bGVSdWxlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEx
OCw5ICsxMTgsOSBAQCBwcml2YXRlOgogY2xhc3MgU3R5bGVSdWxlIGZpbmFsIDogcHVibGljIFN0
eWxlUnVsZUJhc2UgewogICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOwogcHVibGljOgotICAg
IHN0YXRpYyBSZWY8U3R5bGVSdWxlPiBjcmVhdGUoUmVmPFN0eWxlUHJvcGVydGllc0Jhc2U+JiYg
cHJvcGVydGllcywgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luKQorICAgIHN0YXRpYyBS
ZWY8U3R5bGVSdWxlPiBjcmVhdGUoUmVmPFN0eWxlUHJvcGVydGllc0Jhc2U+JiYgcHJvcGVydGll
cywgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBDU1NTZWxlY3Rvckxpc3QmJiBzZWxl
Y3RvcnMpCiAgICAgewotICAgICAgICByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdHlsZVJ1bGUoV1RG
TW92ZShwcm9wZXJ0aWVzKSwgaGFzRG9jdW1lbnRTZWN1cml0eU9yaWdpbikpOworICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYoKm5ldyBTdHlsZVJ1bGUoV1RGTW92ZShwcm9wZXJ0aWVzKSwgaGFzRG9j
dW1lbnRTZWN1cml0eU9yaWdpbiwgV1RGTW92ZShzZWxlY3RvcnMpKSk7CiAgICAgfQogICAgIAog
ICAgIH5TdHlsZVJ1bGUoKTsKQEAgLTEzMywxNCArMTMzLDEzIEBAIHB1YmxpYzoKIAogICAgIHVz
aW5nIFN0eWxlUnVsZUJhc2U6Omhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW47CiAKLSAgICB2b2lk
IHdyYXBwZXJBZG9wdFNlbGVjdG9yTGlzdChDU1NTZWxlY3Rvckxpc3QmIHNlbGVjdG9ycykKKyAg
ICB2b2lkIHdyYXBwZXJBZG9wdFNlbGVjdG9yTGlzdChDU1NTZWxlY3Rvckxpc3QmJiBzZWxlY3Rv
cnMpCiAgICAgewogICAgICAgICBtX3NlbGVjdG9yTGlzdCA9IFdURk1vdmUoc2VsZWN0b3JzKTsK
ICNpZiBFTkFCTEUoQ1NTX1NFTEVDVE9SX0pJVCkKICAgICAgICAgbV9jb21waWxlZFNlbGVjdG9y
cyA9IG51bGxwdHI7CiAjZW5kaWYKICAgICB9Ci0gICAgdm9pZCBwYXJzZXJBZG9wdFNlbGVjdG9y
QXJyYXkoQ1NTU2VsZWN0b3IqIHNlbGVjdG9ycykgeyBtX3NlbGVjdG9yTGlzdC5hZG9wdFNlbGVj
dG9yQXJyYXkoc2VsZWN0b3JzKTsgfQogCiAgICAgUmVmPFN0eWxlUnVsZT4gY29weSgpIGNvbnN0
IHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3R5bGVSdWxlKCp0aGlzKSk7IH0KIApAQCAtMTYyLDcg
KzE2MSw3IEBAIHB1YmxpYzoKICAgICBzdGF0aWMgdW5zaWduZWQgYXZlcmFnZVNpemVJbkJ5dGVz
KCk7CiAKIHByaXZhdGU6Ci0gICAgU3R5bGVSdWxlKFJlZjxTdHlsZVByb3BlcnRpZXNCYXNlPiYm
LCBib29sIGhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4pOworICAgIFN0eWxlUnVsZShSZWY8U3R5
bGVQcm9wZXJ0aWVzQmFzZT4mJiwgYm9vbCBoYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2luLCBDU1NT
ZWxlY3Rvckxpc3QmJik7CiAgICAgU3R5bGVSdWxlKGNvbnN0IFN0eWxlUnVsZSYpOwogCiAgICAg
c3RhdGljIFJlZjxTdHlsZVJ1bGU+IGNyZWF0ZUZvclNwbGl0dGluZyhjb25zdCBWZWN0b3I8Y29u
c3QgQ1NTU2VsZWN0b3IqPiYsIFJlZjxTdHlsZVByb3BlcnRpZXM+JiYsIGJvb2wgaGFzRG9jdW1l
bnRTZWN1cml0eU9yaWdpbik7CkBAIC0yMDAsNyArMTk5LDcgQEAgcHJpdmF0ZToKIAogY2xhc3Mg
U3R5bGVSdWxlUGFnZSBmaW5hbCA6IHB1YmxpYyBTdHlsZVJ1bGVCYXNlIHsKIHB1YmxpYzoKLSAg
ICBzdGF0aWMgUmVmPFN0eWxlUnVsZVBhZ2U+IGNyZWF0ZShSZWY8U3R5bGVQcm9wZXJ0aWVzPiYm
IHByb3BlcnRpZXMpIHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3R5bGVSdWxlUGFnZShXVEZNb3Zl
KHByb3BlcnRpZXMpKSk7IH0KKyAgICBzdGF0aWMgUmVmPFN0eWxlUnVsZVBhZ2U+IGNyZWF0ZShS
ZWY8U3R5bGVQcm9wZXJ0aWVzPiYmIHByb3BlcnRpZXMsIENTU1NlbGVjdG9yTGlzdCYmIHNlbGVj
dG9ycykgeyByZXR1cm4gYWRvcHRSZWYoKm5ldyBTdHlsZVJ1bGVQYWdlKFdURk1vdmUocHJvcGVy
dGllcyksIFdURk1vdmUoc2VsZWN0b3JzKSkpOyB9CiAKICAgICB+U3R5bGVSdWxlUGFnZSgpOwog
CkBAIC0yMDgsMTIgKzIwNywxMiBAQCBwdWJsaWM6CiAgICAgY29uc3QgU3R5bGVQcm9wZXJ0aWVz
JiBwcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gbV9wcm9wZXJ0aWVzOyB9CiAgICAgTXV0YWJs
ZVN0eWxlUHJvcGVydGllcyYgbXV0YWJsZVByb3BlcnRpZXMoKTsKIAotICAgIHZvaWQgd3JhcHBl
ckFkb3B0U2VsZWN0b3JMaXN0KENTU1NlbGVjdG9yTGlzdCYgc2VsZWN0b3JzKSB7IG1fc2VsZWN0
b3JMaXN0ID0gV1RGTW92ZShzZWxlY3RvcnMpOyB9CisgICAgdm9pZCB3cmFwcGVyQWRvcHRTZWxl
Y3Rvckxpc3QoQ1NTU2VsZWN0b3JMaXN0JiYgc2VsZWN0b3JzKSB7IG1fc2VsZWN0b3JMaXN0ID0g
V1RGTW92ZShzZWxlY3RvcnMpOyB9CiAKICAgICBSZWY8U3R5bGVSdWxlUGFnZT4gY29weSgpIGNv
bnN0IHsgcmV0dXJuIGFkb3B0UmVmKCpuZXcgU3R5bGVSdWxlUGFnZSgqdGhpcykpOyB9CiAKIHBy
aXZhdGU6Ci0gICAgZXhwbGljaXQgU3R5bGVSdWxlUGFnZShSZWY8U3R5bGVQcm9wZXJ0aWVzPiYm
KTsKKyAgICBleHBsaWNpdCBTdHlsZVJ1bGVQYWdlKFJlZjxTdHlsZVByb3BlcnRpZXM+JiYsIENT
U1NlbGVjdG9yTGlzdCYmKTsKICAgICBTdHlsZVJ1bGVQYWdlKGNvbnN0IFN0eWxlUnVsZVBhZ2Um
KTsKICAgICAKICAgICBSZWY8U3R5bGVQcm9wZXJ0aWVzPiBtX3Byb3BlcnRpZXM7CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9jc3MvcGFyc2VyL0NTU1BhcnNlckltcGwuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUGFyc2VySW1wbC5jcHAJKHJldmlzaW9uIDIz
NDgxNCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTUGFyc2VySW1wbC5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTY2OCw5ICs2NjgsNyBAQCBSZWZQdHI8U3R5bGVSdWxlUGFnZT4gQ1NT
UGFyc2VySW1wbDo6Y29uCiAKICAgICBjb25zdW1lRGVjbGFyYXRpb25MaXN0KGJsb2NrLCBTdHls
ZVJ1bGU6OlN0eWxlKTsKICAgICAKLSAgICBSZWZQdHI8U3R5bGVSdWxlUGFnZT4gcGFnZSA9IFN0
eWxlUnVsZVBhZ2U6OmNyZWF0ZShjcmVhdGVTdHlsZVByb3BlcnRpZXMobV9wYXJzZWRQcm9wZXJ0
aWVzLCBtX2NvbnRleHQubW9kZSkpOwotICAgIHBhZ2UtPndyYXBwZXJBZG9wdFNlbGVjdG9yTGlz
dChzZWxlY3Rvckxpc3QpOwotICAgIHJldHVybiBwYWdlOworICAgIHJldHVybiBTdHlsZVJ1bGVQ
YWdlOjpjcmVhdGUoY3JlYXRlU3R5bGVQcm9wZXJ0aWVzKG1fcGFyc2VkUHJvcGVydGllcywgbV9j
b250ZXh0Lm1vZGUpLCBXVEZNb3ZlKHNlbGVjdG9yTGlzdCkpOwogfQogCiAvLyBGSVhNRS1ORVdQ
QVJTRVI6IFN1cHBvcnQgImFwcGx5IgpAQCAtNzI2LDcgKzcyNCw2IEBAIFJlZlB0cjxTdHlsZVJ1
bGU+IENTU1BhcnNlckltcGw6OmNvbnN1bWUKICAgICBpZiAoIXNlbGVjdG9yTGlzdC5pc1ZhbGlk
KCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOyAvLyBQYXJzZSBlcnJvciwgaW52YWxpZCBzZWxl
Y3RvciBsaXN0CiAKLSAgICBSZWZQdHI8U3R5bGVSdWxlPiBydWxlOwogICAgIGlmIChtX29ic2Vy
dmVyV3JhcHBlcikKICAgICAgICAgb2JzZXJ2ZVNlbGVjdG9ycygqbV9vYnNlcnZlcldyYXBwZXIs
IHByZWx1ZGUpOwogICAgIApAQCAtNzM4LDE2ICs3MzUsMTIgQEAgUmVmUHRyPFN0eWxlUnVsZT4g
Q1NTUGFyc2VySW1wbDo6Y29uc3VtZQogICAgICAgICBDU1NQYXJzZXJUb2tlblJhbmdlIGJsb2Nr
Q29weSA9IGJsb2NrOwogICAgICAgICBibG9ja0NvcHkuY29uc3VtZVdoaXRlc3BhY2UoKTsKICAg
ICAgICAgaWYgKCFibG9ja0NvcHkuYXRFbmQoKSkgewotICAgICAgICAgICAgcnVsZSA9IFN0eWxl
UnVsZTo6Y3JlYXRlKGNyZWF0ZURlZmVycmVkU3R5bGVQcm9wZXJ0aWVzKGJsb2NrKSwgbV9jb250
ZXh0Lmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4pOwotICAgICAgICAgICAgcnVsZS0+d3JhcHBl
ckFkb3B0U2VsZWN0b3JMaXN0KHNlbGVjdG9yTGlzdCk7Ci0gICAgICAgICAgICByZXR1cm4gcnVs
ZTsKKyAgICAgICAgICAgIHJldHVybiBTdHlsZVJ1bGU6OmNyZWF0ZShjcmVhdGVEZWZlcnJlZFN0
eWxlUHJvcGVydGllcyhibG9jayksIG1fY29udGV4dC5oYXNEb2N1bWVudFNlY3VyaXR5T3JpZ2lu
LCBXVEZNb3ZlKHNlbGVjdG9yTGlzdCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY29uc3Vt
ZURlY2xhcmF0aW9uTGlzdChibG9jaywgU3R5bGVSdWxlOjpTdHlsZSk7Ci0gICAgcnVsZSA9IFN0
eWxlUnVsZTo6Y3JlYXRlKGNyZWF0ZVN0eWxlUHJvcGVydGllcyhtX3BhcnNlZFByb3BlcnRpZXMs
IG1fY29udGV4dC5tb2RlKSwgbV9jb250ZXh0Lmhhc0RvY3VtZW50U2VjdXJpdHlPcmlnaW4pOwot
ICAgIHJ1bGUtPndyYXBwZXJBZG9wdFNlbGVjdG9yTGlzdChzZWxlY3Rvckxpc3QpOwotICAgIHJl
dHVybiBydWxlOworICAgIHJldHVybiBTdHlsZVJ1bGU6OmNyZWF0ZShjcmVhdGVTdHlsZVByb3Bl
cnRpZXMobV9wYXJzZWRQcm9wZXJ0aWVzLCBtX2NvbnRleHQubW9kZSksIG1fY29udGV4dC5oYXNE
b2N1bWVudFNlY3VyaXR5T3JpZ2luLCBXVEZNb3ZlKHNlbGVjdG9yTGlzdCkpOwogfQogCiB2b2lk
IENTU1BhcnNlckltcGw6OmNvbnN1bWVEZWNsYXJhdGlvbkxpc3QoQ1NTUGFyc2VyVG9rZW5SYW5n
ZSByYW5nZSwgU3R5bGVSdWxlOjpUeXBlIHJ1bGVUeXBlKQpJbmRleDogU291cmNlL1dlYkNvcmUv
Y3NzL3BhcnNlci9DU1NTZWxlY3RvclBhcnNlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvY3NzL3BhcnNlci9DU1NTZWxlY3RvclBhcnNlci5jcHAJKHJldmlzaW9uIDIzNDgxNCkK
KysrIFNvdXJjZS9XZWJDb3JlL2Nzcy9wYXJzZXIvQ1NTU2VsZWN0b3JQYXJzZXIuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC01MzAsNyArNTMwLDcgQEAgc3RkOjp1bmlxdWVfcHRyPENTU1BhcnNlclNl
bGVjdG9yPiBDU1NTZQogICAgICAgICAgICAgRGlzYWxsb3dQc2V1ZG9FbGVtZW50c1Njb3BlIHNj
b3BlKHRoaXMpOwogICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENTU1NlbGVjdG9yTGlzdD4g
c2VsZWN0b3JMaXN0ID0gc3RkOjp1bmlxdWVfcHRyPENTU1NlbGVjdG9yTGlzdD4obmV3IENTU1Nl
bGVjdG9yTGlzdCgpKTsKICAgICAgICAgICAgICpzZWxlY3Rvckxpc3QgPSBjb25zdW1lQ29tcGxl
eFNlbGVjdG9yTGlzdChibG9jayk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yTGlzdC0+Y29t
cG9uZW50Q291bnQoKSB8fCAhYmxvY2suYXRFbmQoKSkKKyAgICAgICAgICAgIGlmICghc2VsZWN0
b3JMaXN0LT5maXJzdCgpIHx8ICFibG9jay5hdEVuZCgpKQogICAgICAgICAgICAgICAgIHJldHVy
biBudWxscHRyOwogICAgICAgICAgICAgc2VsZWN0b3ItPnNldFNlbGVjdG9yTGlzdChXVEZNb3Zl
KHNlbGVjdG9yTGlzdCkpOwogICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yOwpAQCAtNTU5LDcg
KzU1OSw3IEBAIHN0ZDo6dW5pcXVlX3B0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gQ1NTU2UKICAgICAg
ICAgICAgICAgICBibG9jay5jb25zdW1lV2hpdGVzcGFjZSgpOwogICAgICAgICAgICAgICAgIHN0
ZDo6dW5pcXVlX3B0cjxDU1NTZWxlY3Rvckxpc3Q+IHNlbGVjdG9yTGlzdCA9IHN0ZDo6dW5pcXVl
X3B0cjxDU1NTZWxlY3Rvckxpc3Q+KG5ldyBDU1NTZWxlY3Rvckxpc3QoKSk7CiAgICAgICAgICAg
ICAgICAgKnNlbGVjdG9yTGlzdCA9IGNvbnN1bWVDb21wbGV4U2VsZWN0b3JMaXN0KGJsb2NrKTsK
LSAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yTGlzdC0+Y29tcG9uZW50Q291bnQoKSB8fCAh
YmxvY2suYXRFbmQoKSkKKyAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdG9yTGlzdC0+Zmlyc3Qo
KSB8fCAhYmxvY2suYXRFbmQoKSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7
CiAgICAgICAgICAgICAgICAgc2VsZWN0b3ItPnNldFNlbGVjdG9yTGlzdChXVEZNb3ZlKHNlbGVj
dG9yTGlzdCkpOwogICAgICAgICAgICAgfQpAQCAtNTc3LDcgKzU3Nyw3IEBAIHN0ZDo6dW5pcXVl
X3B0cjxDU1NQYXJzZXJTZWxlY3Rvcj4gQ1NTU2UKICAgICAgICAgY2FzZSBDU1NTZWxlY3Rvcjo6
UHNldWRvQ2xhc3NNYXRjaGVzOiB7CiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1NTU2Vs
ZWN0b3JMaXN0PiBzZWxlY3Rvckxpc3QgPSBzdGQ6OnVuaXF1ZV9wdHI8Q1NTU2VsZWN0b3JMaXN0
PihuZXcgQ1NTU2VsZWN0b3JMaXN0KCkpOwogICAgICAgICAgICAgKnNlbGVjdG9yTGlzdCA9IGNv
bnN1bWVDb21wbGV4U2VsZWN0b3JMaXN0KGJsb2NrKTsKLSAgICAgICAgICAgIGlmICghc2VsZWN0
b3JMaXN0LT5jb21wb25lbnRDb3VudCgpIHx8ICFibG9jay5hdEVuZCgpKQorICAgICAgICAgICAg
aWYgKCFzZWxlY3Rvckxpc3QtPmZpcnN0KCkgfHwgIWJsb2NrLmF0RW5kKCkpCiAgICAgICAgICAg
ICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgICAgICBzZWxlY3Rvci0+c2V0U2VsZWN0b3JM
aXN0KFdURk1vdmUoc2VsZWN0b3JMaXN0KSk7CiAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3I7
CkBAIC01ODYsNyArNTg2LDcgQEAgc3RkOjp1bmlxdWVfcHRyPENTU1BhcnNlclNlbGVjdG9yPiBD
U1NTZQogICAgICAgICBjYXNlIENTU1NlbGVjdG9yOjpQc2V1ZG9DbGFzc0hvc3Q6IHsKICAgICAg
ICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDU1NTZWxlY3Rvckxpc3Q+IHNlbGVjdG9yTGlzdCA9IHN0
ZDo6dW5pcXVlX3B0cjxDU1NTZWxlY3Rvckxpc3Q+KG5ldyBDU1NTZWxlY3Rvckxpc3QoKSk7CiAg
ICAgICAgICAgICAqc2VsZWN0b3JMaXN0ID0gY29uc3VtZUNvbXBvdW5kU2VsZWN0b3JMaXN0KGJs
b2NrKTsKLSAgICAgICAgICAgIGlmICghc2VsZWN0b3JMaXN0LT5jb21wb25lbnRDb3VudCgpIHx8
ICFibG9jay5hdEVuZCgpKQorICAgICAgICAgICAgaWYgKCFzZWxlY3Rvckxpc3QtPmZpcnN0KCkg
fHwgIWJsb2NrLmF0RW5kKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAg
ICAgICAgICBzZWxlY3Rvci0+c2V0U2VsZWN0b3JMaXN0KFdURk1vdmUoc2VsZWN0b3JMaXN0KSk7
CiAgICAgICAgICAgICByZXR1cm4gc2VsZWN0b3I7Cg==
</data>
<flag name="review"
          id="364858"
          type_id="1"
          status="+"
          setter="simon.fraser"
    />
          </attachment>
      

    </bug>

</bugzilla>