<?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>178169</bug_id>
          
          <creation_ts>2017-10-11 07:38:37 -0700</creation_ts>
          <short_desc>It should be possible to iterate just the values (and not the counts) of a HashCountedSet</short_desc>
          <delta_ts>2017-10-12 05:47:07 -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>Web Template Framework</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>buildbot</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>dbates</cc>
    
    <cc>thorton</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1359175</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-10-11 07:38:37 -0700</bug_when>
    <thetext>It should be possible to iterate just the values (and not the counts) of a HashCountedSet</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359176</commentid>
    <comment_count>1</comment_count>
      <attachid>323415</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-10-11 07:49:24 -0700</bug_when>
    <thetext>Created attachment 323415
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359177</commentid>
    <comment_count>2</comment_count>
    <who name="Build Bot">buildbot</who>
    <bug_when>2017-10-11 07:50:47 -0700</bug_when>
    <thetext>Attachment 323415 did not pass style-queue:


ERROR: Source/WTF/wtf/HashCountedSet.h:135:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
ERROR: Source/WTF/wtf/HashCountedSet.h:170:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/HashCountedSet.h:279:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/HashCountedSet.h:286:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/HashCountedSet.h:293:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/HashCountedSet.h:300:  This { should be at the end of the previous line  [whitespace/braces] [4]
ERROR: Source/WTF/wtf/HashCountedSet.h:307:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 7 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359540</commentid>
    <comment_count>3</comment_count>
      <attachid>323415</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-10-11 23:32:30 -0700</bug_when>
    <thetext>Comment on attachment 323415
Patch

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

&gt; Source/WTF/wtf/HashCountedSet.h:43
&gt; +    HashCountedSet()

HashCountedSet() = default;

&gt; Source/WTF/wtf/HashCountedSet.h:103
&gt; +    template&lt;typename V = ValueType&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, iterator&gt;::type find(typename GetPtrHelper&lt;V&gt;::PtrType);

We should use enable_if_t&lt;&gt; to simplify this.

&gt; Source/WTF/wtf/HashCountedSet.h:104
&gt; +    template&lt;typename V = ValueType&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, const_iterator&gt;::type find(typename GetPtrHelper&lt;V&gt;::PtrType) const;

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:105
&gt; +    template&lt;typename V = ValueType&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, bool&gt;::type contains(typename GetPtrHelper&lt;V&gt;::PtrType) const;

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:106
&gt; +    template&lt;typename V = ValueType&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, unsigned&gt;::type count(typename GetPtrHelper&lt;V&gt;::PtrType) const;

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:107
&gt; +    template&lt;typename V = ValueType&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, bool&gt;::type remove(typename GetPtrHelper&lt;V&gt;::PtrType);

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:242
&gt; +    unsigned oldVal = it-&gt;value;

oldVal =&gt; oldValue

&gt; Source/WTF/wtf/HashCountedSet.h:244
&gt; +    unsigned newVal = oldVal - 1;

newVal =&gt; newValue

&gt; Source/WTF/wtf/HashCountedSet.h:278
&gt; +inline auto HashCountedSet&lt;Value, HashFunctions, Traits&gt;::find(typename GetPtrHelper&lt;V&gt;::PtrType value) -&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, iterator&gt;::type

We should use enable_if_t&lt;&gt; to simply this.

&gt; Source/WTF/wtf/HashCountedSet.h:285
&gt; +inline auto HashCountedSet&lt;Value, HashFunctions, Traits&gt;::find(typename GetPtrHelper&lt;V&gt;::PtrType value) const -&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, const_iterator&gt;::type

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:292
&gt; +inline auto HashCountedSet&lt;Value, HashFunctions, Traits&gt;::contains(typename GetPtrHelper&lt;V&gt;::PtrType value) const -&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, bool&gt;::type

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:299
&gt; +inline auto HashCountedSet&lt;Value, HashFunctions, Traits&gt;::count(typename GetPtrHelper&lt;V&gt;::PtrType value) const -&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, unsigned&gt;::type

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:306
&gt; +inline auto HashCountedSet&lt;Value, HashFunctions, Traits&gt;::remove(typename GetPtrHelper&lt;V&gt;::PtrType value) -&gt; typename std::enable_if&lt;IsSmartPtr&lt;V&gt;::value, bool&gt;::type

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:314
&gt; +    typedef typename HashCountedSet&lt;Value, HashFunctions, Traits&gt;::const_iterator iterator;

using ... = ...;

&gt; Source/WTF/wtf/HashCountedSet.h:327
&gt; +    typedef typename HashCountedSet&lt;Value, HashFunctions, Traits&gt;::const_iterator iterator;

Ditto.

&gt; Source/WTF/wtf/HashCountedSet.h:333
&gt; +    for (unsigned i = 0; it != end; ++it, ++i)

size_t

&gt; Tools/TestWebKitAPI/Tests/WTF/HashCountedSet.cpp:474
&gt; +    HashCountedSet&lt;int&gt; set { 1, 1, 2, 3, 3 };

You might want to consider adding more test coverage. Say, test the empty set, a set with exactly one value, a set with exactly two repeated values. Having said that the implementation of values() is just to turn around and call keys() and I would hope we have existing test coverage for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359541</commentid>
    <comment_count>4</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2017-10-11 23:36:21 -0700</bug_when>
    <thetext>(In reply to Daniel Bates from comment #3)
&gt; &gt; Source/WTF/wtf/HashCountedSet.h:333
&gt; &gt; +    for (unsigned i = 0; it != end; ++it, ++i)
&gt; 
&gt; size_t
&gt; 

I know unsigned is good enough for all practical purposes. I still prefer size_t because it avoids an implicit conversion when calling operator[] and that makes me feel warm and fuzzy.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359580</commentid>
    <comment_count>5</comment_count>
      <attachid>323415</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-10-12 05:18:12 -0700</bug_when>
    <thetext>Comment on attachment 323415
Patch

Thanks for the review Dan! I&apos;ll address the comments in a follow up that cleans up additional Hash related files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359584</commentid>
    <comment_count>6</comment_count>
      <attachid>323415</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-12 05:46:00 -0700</bug_when>
    <thetext>Comment on attachment 323415
Patch

Clearing flags on attachment: 323415

Committed r223236: &lt;https://trac.webkit.org/changeset/223236&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359585</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2017-10-12 05:46:02 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1359586</commentid>
    <comment_count>8</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-10-12 05:47:07 -0700</bug_when>
    <thetext>&lt;rdar://problem/34954222&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>323415</attachid>
            <date>2017-10-11 07:49:24 -0700</date>
            <delta_ts>2017-10-12 05:46:00 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-178169-20171011074905.patch</filename>
            <type>text/plain</type>
            <size>25655</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAyMjMxNDkpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDE2IEBACisyMDE3LTEwLTExICBTYW0gV2VpbmlnICA8c2FtQHdl
YmtpdC5vcmc+CisKKyAgICAgICAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGl0ZXJhdGUganVz
dCB0aGUgdmFsdWVzIChhbmQgbm90IHRoZSBjb3VudHMpIG9mIGEgSGFzaENvdW50ZWRTZXQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODE2OQorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIENsZWFudXAgKGZp
eCBpbmRlbnRhdGlvbiwgc2ltcGxpZnkgdHlwZSBuYW1lcywgYWRvcHQgdXNpbmcpLCBhbmQgYWRk
IGEgdmFsdWVzKCkgcmFuZ2UgdG8KKyAgICAgICAgSGFzaENvdW50ZWRTZXQuIFRoaXMgd2lsbCBh
bGxvdyBnZXR0aW5nIGEgVmVjdG9yIG9mIGFsbCB0aGUgdmFsdWVzIChhbmQgbm90IHRoZSBjb3Vu
dHMpCisgICAgICAgIHVzaW5nIHRoZSBuZXcgY29weVRvVmVjdG9yLiAKKworICAgICAgICAqIHd0
Zi9IYXNoQ291bnRlZFNldC5oOgorCiAyMDE3LTEwLTEwICBTYW0gV2VpbmlnICA8c2FtQHdlYmtp
dC5vcmc+CiAKICAgICAgICAgUmVwbGFjZSBjb3B5S2V5c1RvVmVjdG9yL2NvcHlWYWx1ZXNUb1Zl
Y3RvciB3aXRoIGNvcHlUb1ZlY3RvcihtYXAua2V5cygpKS9jb3B5VG9WZWN0b3IobWFwLnZhbHVl
cygpKQpJbmRleDogU291cmNlL1dURi93dGYvSGFzaENvdW50ZWRTZXQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV1RGL3d0Zi9IYXNoQ291bnRlZFNldC5oCShyZXZpc2lvbiAyMjMxNDkpCisrKyBT
b3VyY2UvV1RGL3d0Zi9IYXNoQ291bnRlZFNldC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOCw4ICsx
OCw3IEBACiAgKgogICovCiAKLSNpZm5kZWYgV1RGX0hhc2hDb3VudGVkU2V0X2gKLSNkZWZpbmUg
V1RGX0hhc2hDb3VudGVkU2V0X2gKKyNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8aW5pdGlhbGl6
ZXJfbGlzdD4KICNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgpAQCAtMjgsMjk4ICsyNywzMTUg
QEAKIAogbmFtZXNwYWNlIFdURiB7CiAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlw
ZW5hbWUgSGFzaEZ1bmN0aW9ucyA9IHR5cGVuYW1lIERlZmF1bHRIYXNoPFZhbHVlPjo6SGFzaCwg
dHlwZW5hbWUgVHJhaXRzID0gSGFzaFRyYWl0czxWYWx1ZT4+Ci0gICAgY2xhc3MgSGFzaENvdW50
ZWRTZXQgZmluYWwgewotICAgICAgICBXVEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKLSAgICBwcml2
YXRlOgotICAgICAgICB0eXBlZGVmIEhhc2hNYXA8VmFsdWUsIHVuc2lnbmVkLCBIYXNoRnVuY3Rp
b25zLCBUcmFpdHM+IEltcGxUeXBlOwotICAgIHB1YmxpYzoKLSAgICAgICAgdHlwZWRlZiBWYWx1
ZSBWYWx1ZVR5cGU7Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgSW1wbFR5cGU6Oml0ZXJhdG9y
IGl0ZXJhdG9yOwotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEltcGxUeXBlOjpjb25zdF9pdGVy
YXRvciBjb25zdF9pdGVyYXRvcjsKLSAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBJbXBsVHlwZTo6
QWRkUmVzdWx0IEFkZFJlc3VsdDsKLQotICAgICAgICBIYXNoQ291bnRlZFNldCgpCi0gICAgICAg
IHsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hDb3VudGVkU2V0KHN0ZDo6aW5pdGlhbGl6ZXJf
bGlzdDx0eXBlbmFtZSBJbXBsVHlwZTo6S2V5VmFsdWVQYWlyVHlwZT4gaW5pdGlhbGl6ZXJMaXN0
KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGtleVZhbHVlUGFpciA6
IGluaXRpYWxpemVyTGlzdCkKLSAgICAgICAgICAgICAgICBhZGQoa2V5VmFsdWVQYWlyLmtleSwg
a2V5VmFsdWVQYWlyLnZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhc2hDb3VudGVkU2V0
KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx0eXBlbmFtZSBJbXBsVHlwZTo6S2V5VHlwZT4gaW5pdGlh
bGl6ZXJMaXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVl
IDogaW5pdGlhbGl6ZXJMaXN0KQotICAgICAgICAgICAgICAgIGFkZCh2YWx1ZSk7Ci0gICAgICAg
IH0KLSAgICAgICAgCi0gICAgICAgIHZvaWQgc3dhcChIYXNoQ291bnRlZFNldCYpOwotICAgICAg
ICAKLSAgICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0OwotICAgICAgICB1bnNpZ25lZCBjYXBh
Y2l0eSgpIGNvbnN0OwotICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdDsKLSAgICAgICAgCi0g
ICAgICAgIC8vIEl0ZXJhdG9ycyBpdGVyYXRlIG92ZXIgcGFpcnMgb2YgdmFsdWVzIGFuZCBjb3Vu
dHMuCi0gICAgICAgIGl0ZXJhdG9yIGJlZ2luKCk7Ci0gICAgICAgIGl0ZXJhdG9yIGVuZCgpOwot
ICAgICAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OwotICAgICAgICBjb25zdF9pdGVy
YXRvciBlbmQoKSBjb25zdDsKLSAgICAgICAgCi0gICAgICAgIGl0ZXJhdG9yIGZpbmQoY29uc3Qg
VmFsdWVUeXBlJik7Ci0gICAgICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgVmFsdWVUeXBl
JikgY29uc3Q7Ci0gICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgVmFsdWVUeXBlJikgY29uc3Q7
Ci0gICAgICAgIHVuc2lnbmVkIGNvdW50KGNvbnN0IFZhbHVlVHlwZSYpIGNvbnN0OwotCi0gICAg
ICAgIC8vIEluY3JlbWVudHMgdGhlIGNvdW50IGlmIGFuIGVxdWFsIHZhbHVlIGlzIGFscmVhZHkg
cHJlc2VudC4KLSAgICAgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpbmNsdWRlcyBib3RoIGFuIGl0
ZXJhdG9yIHRvIHRoZSB2YWx1ZSdzIGxvY2F0aW9uLAotICAgICAgICAvLyBhbmQgYW4gaXNOZXdF
bnRyeSBib29sIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgaXQgaXMgYSBuZXcgb3IgZXhpc3Rpbmcg
ZW50cnkuCi0gICAgICAgIEFkZFJlc3VsdCBhZGQoY29uc3QgVmFsdWVUeXBlJik7Ci0gICAgICAg
IEFkZFJlc3VsdCBhZGQoVmFsdWVUeXBlJiYpOwotCi0gICAgICAgIC8vIEluY3JlbWVudHMgdGhl
IGNvdW50IG9mIGEgdmFsdWUgYnkgdGhlIHBhc3NlZCBhbW91bnQuCi0gICAgICAgIEFkZFJlc3Vs
dCBhZGQoY29uc3QgVmFsdWVUeXBlJiwgdW5zaWduZWQpOwotICAgICAgICBBZGRSZXN1bHQgYWRk
KFZhbHVlVHlwZSYmLCB1bnNpZ25lZCk7Ci0KLSAgICAgICAgLy8gRGVjcmVtZW50cyB0aGUgY291
bnQgb2YgdGhlIHZhbHVlLCBhbmQgcmVtb3ZlcyBpdCBpZiBjb3VudCBnb2VzIGRvd24gdG8gemVy
by4KLSAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyByZW1vdmVkLgotICAg
ICAgICBib29sIHJlbW92ZShjb25zdCBWYWx1ZVR5cGUmKTsKLSAgICAgICAgYm9vbCByZW1vdmUo
aXRlcmF0b3IpOwotIAotICAgICAgICAvLyBSZW1vdmVzIHRoZSB2YWx1ZSwgcmVnYXJkbGVzcyBv
ZiBpdHMgY291bnQuCi0gICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIHdhcyByZW1v
dmVkLgotICAgICAgICBib29sIHJlbW92ZUFsbChpdGVyYXRvcik7Ci0gICAgICAgIGJvb2wgcmVt
b3ZlQWxsKGNvbnN0IFZhbHVlVHlwZSYpOwotCi0gICAgICAgIC8vIENsZWFycyB0aGUgd2hvbGUg
c2V0LgotICAgICAgICB2b2lkIGNsZWFyKCk7Ci0KLSAgICAgICAgLy8gT3ZlcmxvYWRzIGZvciBz
bWFydCBwb2ludGVyIGtleXMgdGhhdCB0YWtlIHRoZSByYXcgcG9pbnRlciB0eXBlIGFzIHRoZSBw
YXJhbWV0ZXIuCi0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFYgPSBWYWx1ZVR5cGU+IHR5cGVu
YW1lIHN0ZDo6ZW5hYmxlX2lmPElzU21hcnRQdHI8Vj46OnZhbHVlLCBpdGVyYXRvcj46OnR5cGUg
ZmluZCh0eXBlbmFtZSBHZXRQdHJIZWxwZXI8Vj46OlB0clR5cGUpOwotICAgICAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBWID0gVmFsdWVUeXBlPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0
UHRyPFY+Ojp2YWx1ZSwgY29uc3RfaXRlcmF0b3I+Ojp0eXBlIGZpbmQodHlwZW5hbWUgR2V0UHRy
SGVscGVyPFY+OjpQdHJUeXBlKSBjb25zdDsKLSAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgViA9
IFZhbHVlVHlwZT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNTbWFydFB0cjxWPjo6dmFsdWUs
IGJvb2w+Ojp0eXBlIGNvbnRhaW5zKHR5cGVuYW1lIEdldFB0ckhlbHBlcjxWPjo6UHRyVHlwZSkg
Y29uc3Q7Ci0gICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFYgPSBWYWx1ZVR5cGU+IHR5cGVuYW1l
IHN0ZDo6ZW5hYmxlX2lmPElzU21hcnRQdHI8Vj46OnZhbHVlLCB1bnNpZ25lZD46OnR5cGUgY291
bnQodHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlKSBjb25zdDsKLSAgICAgICAgdGVt
cGxhdGU8dHlwZW5hbWUgViA9IFZhbHVlVHlwZT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNT
bWFydFB0cjxWPjo6dmFsdWUsIGJvb2w+Ojp0eXBlIHJlbW92ZSh0eXBlbmFtZSBHZXRQdHJIZWxw
ZXI8Vj46OlB0clR5cGUpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgSW1wbFR5cGUgbV9pbXBs
OwotICAgIH07Ci0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNo
RnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+Ci0gICAgaW5saW5lIHZvaWQgSGFzaENvdW50ZWRT
ZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OnN3YXAoSGFzaENvdW50ZWRTZXQmIG90
aGVyKQotICAgIHsKLSAgICAgICAgbV9pbXBsLnN3YXAob3RoZXIubV9pbXBsKTsKLSAgICB9Ci0g
ICAgCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMs
IHR5cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgdW5zaWduZWQgSGFzaENvdW50ZWRTZXQ8VmFs
dWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OnNpemUoKSBjb25zdAotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1faW1wbC5zaXplKCk7IAotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgotICAgIGlu
bGluZSB1bnNpZ25lZCBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRz
Pjo6Y2FwYWNpdHkoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW1wbC5jYXBhY2l0
eSgpOyAKLSAgICB9Ci0gICAgCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1l
IEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgYm9vbCBIYXNoQ291
bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6aXNFbXB0eSgpIGNvbnN0Ci0g
ICAgewotICAgICAgICByZXR1cm4gc2l6ZSgpID09IDA7IAotICAgIH0KLSAgICAKLSAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJh
aXRzPgotICAgIGlubGluZSB0eXBlbmFtZSBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0
aW9ucywgVHJhaXRzPjo6aXRlcmF0b3IgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlv
bnMsIFRyYWl0cz46OmJlZ2luKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ltcGwuYmVnaW4o
KTsgCi0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hG
dW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgdHlwZW5hbWUgSGFzaENvdW50
ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46Oml0ZXJhdG9yIEhhc2hDb3VudGVk
U2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+OjplbmQoKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1faW1wbC5lbmQoKTsgCi0gICAgfQotICAgIAotICAgIHRlbXBsYXRlPHR5cGVuYW1l
IFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+Ci0gICAgaW5s
aW5lIHR5cGVuYW1lIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+
Ojpjb25zdF9pdGVyYXRvciBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJh
aXRzPjo6YmVnaW4oKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW1wbC5iZWdpbigp
OyAKLSAgICB9Ci0gICAgCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhh
c2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgdHlwZW5hbWUgSGFzaENv
dW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmNvbnN0X2l0ZXJhdG9yIEhh
c2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+OjplbmQoKSBjb25zdAot
ICAgIHsKLSAgICAgICAgcmV0dXJuIG1faW1wbC5lbmQoKTsgCi0gICAgfQotICAgIAotICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBU
cmFpdHM+Ci0gICAgaW5saW5lIHR5cGVuYW1lIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVu
Y3Rpb25zLCBUcmFpdHM+OjppdGVyYXRvciBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0
aW9ucywgVHJhaXRzPjo6ZmluZChjb25zdCBWYWx1ZVR5cGUmIHZhbHVlKQotICAgIHsKLSAgICAg
ICAgcmV0dXJuIG1faW1wbC5maW5kKHZhbHVlKTsgCi0gICAgfQotICAgIAotICAgIHRlbXBsYXRl
PHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+
Ci0gICAgaW5saW5lIHR5cGVuYW1lIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25z
LCBUcmFpdHM+Ojpjb25zdF9pdGVyYXRvciBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0
aW9ucywgVHJhaXRzPjo6ZmluZChjb25zdCBWYWx1ZVR5cGUmIHZhbHVlKSBjb25zdAotICAgIHsK
LSAgICAgICAgcmV0dXJuIG1faW1wbC5maW5kKHZhbHVlKTsgCi0gICAgfQotICAgIAotICAgIHRl
bXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBU
cmFpdHM+Ci0gICAgaW5saW5lIGJvb2wgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlv
bnMsIFRyYWl0cz46OmNvbnRhaW5zKGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0Ci0gICAg
ewotICAgICAgICByZXR1cm4gbV9pbXBsLmNvbnRhaW5zKHZhbHVlKTsgCi0gICAgfQotCi0gICAg
dGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1l
IFRyYWl0cz4KLSAgICBpbmxpbmUgdW5zaWduZWQgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hG
dW5jdGlvbnMsIFRyYWl0cz46OmNvdW50KGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0Ci0g
ICAgewotICAgICAgICByZXR1cm4gbV9pbXBsLmdldCh2YWx1ZSk7Ci0gICAgfQotICAgIAotICAg
IHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFt
ZSBUcmFpdHM+Ci0gICAgaW5saW5lIHR5cGVuYW1lIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNo
RnVuY3Rpb25zLCBUcmFpdHM+OjpBZGRSZXN1bHQgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hG
dW5jdGlvbnMsIFRyYWl0cz46OmFkZChjb25zdCBWYWx1ZVR5cGUgJnZhbHVlKQotICAgIHsKLSAg
ICAgICAgQWRkUmVzdWx0IHJlc3VsdCA9IG1faW1wbC5hZGQodmFsdWUsIDApOwotICAgICAgICAr
K3Jlc3VsdC5pdGVyYXRvci0+dmFsdWU7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQot
Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5
cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgdHlwZW5hbWUgSGFzaENvdW50ZWRTZXQ8VmFsdWUs
IEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OkFkZFJlc3VsdCBIYXNoQ291bnRlZFNldDxWYWx1ZSwg
SGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6YWRkKFZhbHVlVHlwZSYmIHZhbHVlKQotICAgIHsKLSAg
ICAgICAgQWRkUmVzdWx0IHJlc3VsdCA9IG1faW1wbC5hZGQoc3RkOjpmb3J3YXJkPFZhbHVlPih2
YWx1ZSksIDApOwotICAgICAgICArK3Jlc3VsdC5pdGVyYXRvci0+dmFsdWU7Ci0gICAgICAgIHJl
dHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVu
YW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KLSAgICBpbmxpbmUgdHlwZW5hbWUg
SGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OkFkZFJlc3VsdCBI
YXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6YWRkKGNvbnN0IFZh
bHVlVHlwZSYgdmFsdWUsIHVuc2lnbmVkIGNvdW50KQotICAgIHsKLSAgICAgICAgQWRkUmVzdWx0
IHJlc3VsdCA9IG1faW1wbC5hZGQodmFsdWUsIDApOwotICAgICAgICByZXN1bHQuaXRlcmF0b3It
PnZhbHVlICs9IGNvdW50OwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5h
bWUgVHJhaXRzPgotICAgIGlubGluZSB0eXBlbmFtZSBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFz
aEZ1bmN0aW9ucywgVHJhaXRzPjo6QWRkUmVzdWx0IEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNo
RnVuY3Rpb25zLCBUcmFpdHM+OjphZGQoVmFsdWVUeXBlJiYgdmFsdWUsIHVuc2lnbmVkIGNvdW50
KQotICAgIHsKLSAgICAgICAgQWRkUmVzdWx0IHJlc3VsdCA9IG1faW1wbC5hZGQoc3RkOjpmb3J3
YXJkPFZhbHVlPih2YWx1ZSksIDApOwotICAgICAgICByZXN1bHQuaXRlcmF0b3ItPnZhbHVlICs9
IGNvdW50OwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRz
PgotICAgIGlubGluZSBib29sIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBU
cmFpdHM+OjpyZW1vdmUoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkKLSAgICB7Ci0gICAgICAgIHJl
dHVybiByZW1vdmUoZmluZCh2YWx1ZSkpOwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0ZTx0eXBl
bmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgotICAg
IGlubGluZSBib29sIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+
OjpyZW1vdmUoaXRlcmF0b3IgaXQpCi0gICAgewotICAgICAgICBpZiAoaXQgPT0gZW5kKCkpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdW5zaWduZWQgb2xkVmFsID0gaXQt
PnZhbHVlOwotICAgICAgICBBU1NFUlQob2xkVmFsKTsKLSAgICAgICAgdW5zaWduZWQgbmV3VmFs
ID0gb2xkVmFsIC0gMTsKLSAgICAgICAgaWYgKG5ld1ZhbCkgewotICAgICAgICAgICAgaXQtPnZh
bHVlID0gbmV3VmFsOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAg
ICAgICAgbV9pbXBsLnJlbW92ZShpdCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAg
ICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywg
dHlwZW5hbWUgVHJhaXRzPgotICAgIGlubGluZSBib29sIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBI
YXNoRnVuY3Rpb25zLCBUcmFpdHM+OjpyZW1vdmVBbGwoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkK
LSAgICB7Ci0gICAgICAgIHJldHVybiByZW1vdmVBbGwoZmluZCh2YWx1ZSkpOwotICAgIH0KLSAg
ICAKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywg
dHlwZW5hbWUgVHJhaXRzPgotICAgIGlubGluZSBib29sIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBI
YXNoRnVuY3Rpb25zLCBUcmFpdHM+OjpyZW1vdmVBbGwoaXRlcmF0b3IgaXQpCi0gICAgewotICAg
ICAgICBpZiAoaXQgPT0gZW5kKCkpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAg
ICAgbV9pbXBsLnJlbW92ZShpdCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAK
LSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlw
ZW5hbWUgVHJhaXRzPgotICAgIGlubGluZSB2b2lkIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNo
RnVuY3Rpb25zLCBUcmFpdHM+OjpjbGVhcigpCi0gICAgewotICAgICAgICBtX2ltcGwuY2xlYXIo
KTsgCi0gICAgfQotICAgIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBI
YXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHMsIHR5cGVuYW1lIFZlY3RvclR5cGU+Ci0gICAg
aW5saW5lIHZvaWQgY29weVRvVmVjdG9yKGNvbnN0IEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNo
RnVuY3Rpb25zLCBUcmFpdHM+JiBjb2xsZWN0aW9uLCBWZWN0b3JUeXBlJiB2ZWN0b3IpCi0gICAg
ewotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVu
Y3Rpb25zLCBUcmFpdHM+Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRvcjsKLSAgICAgICAgCi0gICAg
ICAgIHZlY3Rvci5yZXNpemUoY29sbGVjdGlvbi5zaXplKCkpOwotICAgICAgICAKLSAgICAgICAg
aXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmJlZ2luKCk7Ci0gICAgICAgIGl0ZXJhdG9yIGVuZCA9
IGNvbGxlY3Rpb24uZW5kKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGl0ICE9IGVu
ZDsgKytpdCwgKytpKQotICAgICAgICAgICAgdmVjdG9yW2ldID0gKml0OwotICAgIH0KLQotICAg
IHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFt
ZSBUcmFpdHM+Ci0gICAgaW5saW5lIHZvaWQgY29weVRvVmVjdG9yKGNvbnN0IEhhc2hDb3VudGVk
U2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+JiBjb2xsZWN0aW9uLCBWZWN0b3I8VmFs
dWU+JiB2ZWN0b3IpCi0gICAgewotICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIEhhc2hDb3VudGVk
U2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+Ojpjb25zdF9pdGVyYXRvciBpdGVyYXRv
cjsKLSAgICAgICAgCi0gICAgICAgIHZlY3Rvci5yZXNpemUoY29sbGVjdGlvbi5zaXplKCkpOwot
ICAgICAgICAKLSAgICAgICAgaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmJlZ2luKCk7Ci0gICAg
ICAgIGl0ZXJhdG9yIGVuZCA9IGNvbGxlY3Rpb24uZW5kKCk7Ci0gICAgICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGl0ICE9IGVuZDsgKytpdCwgKytpKQotICAgICAgICAgICAgdmVjdG9yW2ldID0g
KCppdCkua2V5OwotICAgIH0KLQotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFt
ZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUg
Vj4KLSAgICBpbmxpbmUgYXV0byBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywg
VHJhaXRzPjo6ZmluZCh0eXBlbmFtZSBHZXRQdHJIZWxwZXI8Vj46OlB0clR5cGUgdmFsdWUpIC0+
IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPElzU21hcnRQdHI8Vj46OnZhbHVlLCBpdGVyYXRvcj46
OnR5cGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ltcGwuZmluZCh2YWx1ZSk7Ci0gICAgfQot
ICAgIAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25z
LCB0eXBlbmFtZSBUcmFpdHM+Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVj4KLSAgICBpbmxpbmUg
YXV0byBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6ZmluZCh0
eXBlbmFtZSBHZXRQdHJIZWxwZXI8Vj46OlB0clR5cGUgdmFsdWUpIGNvbnN0IC0+IHR5cGVuYW1l
IHN0ZDo6ZW5hYmxlX2lmPElzU21hcnRQdHI8Vj46OnZhbHVlLCBjb25zdF9pdGVyYXRvcj46OnR5
cGUKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX2ltcGwuZmluZCh2YWx1ZSk7Ci0gICAgfQotICAg
IAotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0
eXBlbmFtZSBUcmFpdHM+Ci0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVj4KLSAgICBpbmxpbmUgYXV0
byBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6Y29udGFpbnMo
dHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlIHZhbHVlKSBjb25zdCAtPiB0eXBlbmFt
ZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKLSAgICB7
Ci0gICAgICAgIHJldHVybiBtX2ltcGwuY29udGFpbnModmFsdWUpOwotICAgIH0KLSAgICAKLSAg
ICB0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5h
bWUgVHJhaXRzPgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+Ci0gICAgaW5saW5lIGF1dG8gSGFz
aENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmNvdW50KHR5cGVuYW1l
IEdldFB0ckhlbHBlcjxWPjo6UHRyVHlwZSB2YWx1ZSkgY29uc3QgLT4gdHlwZW5hbWUgc3RkOjpl
bmFibGVfaWY8SXNTbWFydFB0cjxWPjo6dmFsdWUsIHVuc2lnbmVkPjo6dHlwZQotICAgIHsKLSAg
ICAgICAgcmV0dXJuIG1faW1wbC5nZXQodmFsdWUpOwotICAgIH0KLSAgICAKLSAgICB0ZW1wbGF0
ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRz
PgotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFY+Ci0gICAgaW5saW5lIGF1dG8gSGFzaENvdW50ZWRT
ZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OnJlbW92ZSh0eXBlbmFtZSBHZXRQdHJI
ZWxwZXI8Vj46OlB0clR5cGUgdmFsdWUpIC0+IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPElzU21h
cnRQdHI8Vj46OnZhbHVlLCBib29sPjo6dHlwZQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlbW92
ZShmaW5kKHZhbHVlKSk7Ci0gICAgfQordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1l
IEhhc2hGdW5jdGlvbnMgPSB0eXBlbmFtZSBEZWZhdWx0SGFzaDxWYWx1ZT46Okhhc2gsIHR5cGVu
YW1lIFRyYWl0cyA9IEhhc2hUcmFpdHM8VmFsdWU+PgorY2xhc3MgSGFzaENvdW50ZWRTZXQgZmlu
YWwgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHJpdmF0ZToKKyAgICB1c2luZyBJ
bXBsVHlwZSA9IEhhc2hNYXA8VmFsdWUsIHVuc2lnbmVkLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+
OworcHVibGljOgorICAgIHVzaW5nIFZhbHVlVHlwZSA9IFZhbHVlOworICAgIHVzaW5nIGl0ZXJh
dG9yID0gdHlwZW5hbWUgSW1wbFR5cGU6Oml0ZXJhdG9yOworICAgIHVzaW5nIGNvbnN0X2l0ZXJh
dG9yID0gdHlwZW5hbWUgSW1wbFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworICAgIHVzaW5nIFZhbHVl
c0l0ZXJhdG9yUmFuZ2UgPSB0eXBlbmFtZSBJbXBsVHlwZTo6S2V5c0l0ZXJhdG9yUmFuZ2U7Cisg
ICAgdXNpbmcgVmFsdWVzQ29uc3RJdGVyYXRvclJhbmdlID0gdHlwZW5hbWUgSW1wbFR5cGU6Oktl
eXNDb25zdEl0ZXJhdG9yUmFuZ2U7CisgICAgdXNpbmcgQWRkUmVzdWx0ID0gdHlwZW5hbWUgSW1w
bFR5cGU6OkFkZFJlc3VsdDsKKworICAgIEhhc2hDb3VudGVkU2V0KCkKKyAgICB7CisgICAgfQor
CisgICAgSGFzaENvdW50ZWRTZXQoc3RkOjppbml0aWFsaXplcl9saXN0PHR5cGVuYW1lIEltcGxU
eXBlOjpLZXlWYWx1ZVBhaXJUeXBlPiBpbml0aWFsaXplckxpc3QpCisgICAgeworICAgICAgICBm
b3IgKGNvbnN0IGF1dG8mIGtleVZhbHVlUGFpciA6IGluaXRpYWxpemVyTGlzdCkKKyAgICAgICAg
ICAgIGFkZChrZXlWYWx1ZVBhaXIua2V5LCBrZXlWYWx1ZVBhaXIudmFsdWUpOworICAgIH0KKwor
ICAgIEhhc2hDb3VudGVkU2V0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx0eXBlbmFtZSBJbXBsVHlw
ZTo6S2V5VHlwZT4gaW5pdGlhbGl6ZXJMaXN0KQorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBh
dXRvJiB2YWx1ZSA6IGluaXRpYWxpemVyTGlzdCkKKyAgICAgICAgICAgIGFkZCh2YWx1ZSk7Cisg
ICAgfQorICAgIAorICAgIHZvaWQgc3dhcChIYXNoQ291bnRlZFNldCYpOworICAgIAorICAgIHVu
c2lnbmVkIHNpemUoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBjYXBhY2l0eSgpIGNvbnN0OworICAg
IGJvb2wgaXNFbXB0eSgpIGNvbnN0OworICAgIAorICAgIC8vIEl0ZXJhdG9ycyBpdGVyYXRlIG92
ZXIgcGFpcnMgb2YgdmFsdWVzIGFuZCBjb3VudHMuCisgICAgaXRlcmF0b3IgYmVnaW4oKTsKKyAg
ICBpdGVyYXRvciBlbmQoKTsKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0OworICAg
IGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworCisgICAgVmFsdWVzSXRlcmF0b3JSYW5nZSB2
YWx1ZXMoKTsKKyAgICBjb25zdCBWYWx1ZXNDb25zdEl0ZXJhdG9yUmFuZ2UgdmFsdWVzKCkgY29u
c3Q7CisKKyAgICBpdGVyYXRvciBmaW5kKGNvbnN0IFZhbHVlVHlwZSYpOworICAgIGNvbnN0X2l0
ZXJhdG9yIGZpbmQoY29uc3QgVmFsdWVUeXBlJikgY29uc3Q7CisgICAgYm9vbCBjb250YWlucyhj
b25zdCBWYWx1ZVR5cGUmKSBjb25zdDsKKyAgICB1bnNpZ25lZCBjb3VudChjb25zdCBWYWx1ZVR5
cGUmKSBjb25zdDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGNvdW50IGlmIGFuIGVxdWFsIHZh
bHVlIGlzIGFscmVhZHkgcHJlc2VudC4KKyAgICAvLyBUaGUgcmV0dXJuIHZhbHVlIGluY2x1ZGVz
IGJvdGggYW4gaXRlcmF0b3IgdG8gdGhlIHZhbHVlJ3MgbG9jYXRpb24sCisgICAgLy8gYW5kIGFu
IGlzTmV3RW50cnkgYm9vbCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIGl0IGlzIGEgbmV3IG9yIGV4
aXN0aW5nIGVudHJ5LgorICAgIEFkZFJlc3VsdCBhZGQoY29uc3QgVmFsdWVUeXBlJik7CisgICAg
QWRkUmVzdWx0IGFkZChWYWx1ZVR5cGUmJik7CisKKyAgICAvLyBJbmNyZW1lbnRzIHRoZSBjb3Vu
dCBvZiBhIHZhbHVlIGJ5IHRoZSBwYXNzZWQgYW1vdW50LgorICAgIEFkZFJlc3VsdCBhZGQoY29u
c3QgVmFsdWVUeXBlJiwgdW5zaWduZWQpOworICAgIEFkZFJlc3VsdCBhZGQoVmFsdWVUeXBlJiYs
IHVuc2lnbmVkKTsKKworICAgIC8vIERlY3JlbWVudHMgdGhlIGNvdW50IG9mIHRoZSB2YWx1ZSwg
YW5kIHJlbW92ZXMgaXQgaWYgY291bnQgZ29lcyBkb3duIHRvIHplcm8uCisgICAgLy8gUmV0dXJu
cyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyByZW1vdmVkLgorICAgIGJvb2wgcmVtb3ZlKGNvbnN0IFZh
bHVlVHlwZSYpOworICAgIGJvb2wgcmVtb3ZlKGl0ZXJhdG9yKTsKKworICAgIC8vIFJlbW92ZXMg
dGhlIHZhbHVlLCByZWdhcmRsZXNzIG9mIGl0cyBjb3VudC4KKyAgICAvLyBSZXR1cm5zIHRydWUg
aWYgYSB2YWx1ZSB3YXMgcmVtb3ZlZC4KKyAgICBib29sIHJlbW92ZUFsbChpdGVyYXRvcik7Cisg
ICAgYm9vbCByZW1vdmVBbGwoY29uc3QgVmFsdWVUeXBlJik7CisKKyAgICAvLyBDbGVhcnMgdGhl
IHdob2xlIHNldC4KKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLyBPdmVybG9hZHMgZm9yIHNt
YXJ0IHBvaW50ZXIga2V5cyB0aGF0IHRha2UgdGhlIHJhdyBwb2ludGVyIHR5cGUgYXMgdGhlIHBh
cmFtZXRlci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWID0gVmFsdWVUeXBlPiB0eXBlbmFtZSBz
dGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgaXRlcmF0b3I+Ojp0eXBlIGZpbmQo
dHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlKTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFt
ZSBWID0gVmFsdWVUeXBlPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2
YWx1ZSwgY29uc3RfaXRlcmF0b3I+Ojp0eXBlIGZpbmQodHlwZW5hbWUgR2V0UHRySGVscGVyPFY+
OjpQdHJUeXBlKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBWID0gVmFsdWVUeXBlPiB0
eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgYm9vbD46OnR5cGUg
Y29udGFpbnModHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlKSBjb25zdDsKKyAgICB0
ZW1wbGF0ZTx0eXBlbmFtZSBWID0gVmFsdWVUeXBlPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJ
c1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgdW5zaWduZWQ+Ojp0eXBlIGNvdW50KHR5cGVuYW1lIEdldFB0
ckhlbHBlcjxWPjo6UHRyVHlwZSkgY29uc3Q7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgViA9IFZh
bHVlVHlwZT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNTbWFydFB0cjxWPjo6dmFsdWUsIGJv
b2w+Ojp0eXBlIHJlbW92ZSh0eXBlbmFtZSBHZXRQdHJIZWxwZXI8Vj46OlB0clR5cGUpOworCitw
cml2YXRlOgorICAgIEltcGxUeXBlIG1faW1wbDsKK307CisKKwordGVtcGxhdGU8dHlwZW5hbWUg
VmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KK2lubGluZSB2
b2lkIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+Ojpzd2FwKEhh
c2hDb3VudGVkU2V0JiBvdGhlcikKK3sKKyAgICBtX2ltcGwuc3dhcChvdGhlci5tX2ltcGwpOwor
fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlw
ZW5hbWUgVHJhaXRzPgoraW5saW5lIHVuc2lnbmVkIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNo
RnVuY3Rpb25zLCBUcmFpdHM+OjpzaXplKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsLnNp
emUoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlv
bnMsIHR5cGVuYW1lIFRyYWl0cz4KK2lubGluZSB1bnNpZ25lZCBIYXNoQ291bnRlZFNldDxWYWx1
ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6Y2FwYWNpdHkoKSBjb25zdAoreworICAgIHJldHVy
biBtX2ltcGwuY2FwYWNpdHkoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVu
YW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KK2lubGluZSBib29sIEhhc2hDb3Vu
dGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+Ojppc0VtcHR5KCkgY29uc3QKK3sK
KyAgICByZXR1cm4gc2l6ZSgpID09IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0
eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+CitpbmxpbmUgYXV0byBIYXNo
Q291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6YmVnaW4oKSAtPiBpdGVy
YXRvcgoreworICAgIHJldHVybiBtX2ltcGwuYmVnaW4oKTsKK30KKwordGVtcGxhdGU8dHlwZW5h
bWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KK2lubGlu
ZSBhdXRvIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+OjplbmQo
KSAtPiBpdGVyYXRvcgoreworICAgIHJldHVybiBtX2ltcGwuZW5kKCk7Cit9CisKK3RlbXBsYXRl
PHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+
CitpbmxpbmUgYXV0byBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRz
Pjo6YmVnaW4oKSBjb25zdCAtPiBjb25zdF9pdGVyYXRvcgoreworICAgIHJldHVybiBtX2ltcGwu
YmVnaW4oKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5j
dGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KK2lubGluZSBhdXRvIEhhc2hDb3VudGVkU2V0PFZhbHVl
LCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+OjplbmQoKSBjb25zdCAtPiBjb25zdF9pdGVyYXRvcgor
eworICAgIHJldHVybiBtX2ltcGwuZW5kKCk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVl
LCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+CitpbmxpbmUgYXV0byBI
YXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6dmFsdWVzKCkgLT4g
VmFsdWVzSXRlcmF0b3JSYW5nZQoreworICAgIHJldHVybiBtX2ltcGwua2V5cygpOworfQorCit0
ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUg
VHJhaXRzPgoraW5saW5lIGF1dG8gSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMs
IFRyYWl0cz46OnZhbHVlcygpIGNvbnN0IC0+IGNvbnN0IFZhbHVlc0NvbnN0SXRlcmF0b3JSYW5n
ZQoreworICAgIHJldHVybiBtX2ltcGwua2V5cygpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBW
YWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGF1
dG8gSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmZpbmQoY29u
c3QgVmFsdWVUeXBlJiB2YWx1ZSkgLT4gaXRlcmF0b3IKK3sKKyAgICByZXR1cm4gbV9pbXBsLmZp
bmQodmFsdWUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1
bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGF1dG8gSGFzaENvdW50ZWRTZXQ8VmFs
dWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmZpbmQoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSkg
Y29uc3QgLT4gY29uc3RfaXRlcmF0b3IKK3sKKyAgICByZXR1cm4gbV9pbXBsLmZpbmQodmFsdWUp
OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywg
dHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGJvb2wgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hG
dW5jdGlvbnMsIFRyYWl0cz46OmNvbnRhaW5zKGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1faW1wbC5jb250YWlucyh2YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+Citp
bmxpbmUgdW5zaWduZWQgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0
cz46OmNvdW50KGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
aW1wbC5nZXQodmFsdWUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUg
SGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGF1dG8gSGFzaENvdW50ZWRT
ZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmFkZChjb25zdCBWYWx1ZVR5cGUgJnZh
bHVlKSAtPiBBZGRSZXN1bHQKK3sKKyAgICBhdXRvIHJlc3VsdCA9IG1faW1wbC5hZGQodmFsdWUs
IDApOworICAgICsrcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlw
ZW5hbWUgVHJhaXRzPgoraW5saW5lIGF1dG8gSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5j
dGlvbnMsIFRyYWl0cz46OmFkZChWYWx1ZVR5cGUmJiB2YWx1ZSkgLT4gQWRkUmVzdWx0Cit7Cisg
ICAgYXV0byByZXN1bHQgPSBtX2ltcGwuYWRkKHN0ZDo6Zm9yd2FyZDxWYWx1ZT4odmFsdWUpLCAw
KTsKKyAgICArK3Jlc3VsdC5pdGVyYXRvci0+dmFsdWU7CisgICAgcmV0dXJuIHJlc3VsdDsKK30K
KwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVu
YW1lIFRyYWl0cz4KK2lubGluZSBhdXRvIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rp
b25zLCBUcmFpdHM+OjphZGQoY29uc3QgVmFsdWVUeXBlJiB2YWx1ZSwgdW5zaWduZWQgY291bnQp
IC0+IEFkZFJlc3VsdAoreworICAgIGF1dG8gcmVzdWx0ID0gbV9pbXBsLmFkZCh2YWx1ZSwgMCk7
CisgICAgcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZSArPSBjb3VudDsKKyAgICByZXR1cm4gcmVzdWx0
OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywg
dHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGF1dG8gSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hG
dW5jdGlvbnMsIFRyYWl0cz46OmFkZChWYWx1ZVR5cGUmJiB2YWx1ZSwgdW5zaWduZWQgY291bnQp
IC0+IEFkZFJlc3VsdAoreworICAgIGF1dG8gcmVzdWx0ID0gbV9pbXBsLmFkZChzdGQ6OmZvcndh
cmQ8VmFsdWU+KHZhbHVlKSwgMCk7CisgICAgcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZSArPSBjb3Vu
dDsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlw
ZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgoraW5saW5lIGJvb2wgSGFzaENv
dW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OnJlbW92ZShjb25zdCBWYWx1
ZVR5cGUmIHZhbHVlKQoreworICAgIHJldHVybiByZW1vdmUoZmluZCh2YWx1ZSkpOworfQorCit0
ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUg
VHJhaXRzPgoraW5saW5lIGJvb2wgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMs
IFRyYWl0cz46OnJlbW92ZShpdGVyYXRvciBpdCkKK3sKKyAgICBpZiAoaXQgPT0gZW5kKCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIG9sZFZhbCA9IGl0LT52YWx1ZTsK
KyAgICBBU1NFUlQob2xkVmFsKTsKKyAgICB1bnNpZ25lZCBuZXdWYWwgPSBvbGRWYWwgLSAxOwor
ICAgIGlmIChuZXdWYWwpIHsKKyAgICAgICAgaXQtPnZhbHVlID0gbmV3VmFsOworICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9pbXBsLnJlbW92ZShpdCk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rp
b25zLCB0eXBlbmFtZSBUcmFpdHM+CitpbmxpbmUgYm9vbCBIYXNoQ291bnRlZFNldDxWYWx1ZSwg
SGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6cmVtb3ZlQWxsKGNvbnN0IFZhbHVlVHlwZSYgdmFsdWUp
Cit7CisgICAgcmV0dXJuIHJlbW92ZUFsbChmaW5kKHZhbHVlKSk7Cit9CisKK3RlbXBsYXRlPHR5
cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+Citp
bmxpbmUgYm9vbCBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6
cmVtb3ZlQWxsKGl0ZXJhdG9yIGl0KQoreworICAgIGlmIChpdCA9PSBlbmQoKSkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgbV9pbXBsLnJlbW92ZShpdCk7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rpb25zLCB0
eXBlbmFtZSBUcmFpdHM+CitpbmxpbmUgdm9pZCBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1
bmN0aW9ucywgVHJhaXRzPjo6Y2xlYXIoKQoreworICAgIG1faW1wbC5jbGVhcigpOworfQorCit0
ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5hbWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUg
VHJhaXRzPgordGVtcGxhdGU8dHlwZW5hbWUgVj4KK2lubGluZSBhdXRvIEhhc2hDb3VudGVkU2V0
PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+OjpmaW5kKHR5cGVuYW1lIEdldFB0ckhlbHBl
cjxWPjo6UHRyVHlwZSB2YWx1ZSkgLT4gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8SXNTbWFydFB0
cjxWPjo6dmFsdWUsIGl0ZXJhdG9yPjo6dHlwZQoreworICAgIHJldHVybiBtX2ltcGwuZmluZCh2
YWx1ZSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNoRnVuY3Rp
b25zLCB0eXBlbmFtZSBUcmFpdHM+Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWPgoraW5saW5lIGF1dG8g
SGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz46OmZpbmQodHlwZW5h
bWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlIHZhbHVlKSBjb25zdCAtPiB0eXBlbmFtZSBzdGQ6
OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgY29uc3RfaXRlcmF0b3I+Ojp0eXBlCit7
CisgICAgcmV0dXJuIG1faW1wbC5maW5kKHZhbHVlKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUg
VmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cz4KK3RlbXBsYXRl
PHR5cGVuYW1lIFY+CitpbmxpbmUgYXV0byBIYXNoQ291bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0
aW9ucywgVHJhaXRzPjo6Y29udGFpbnModHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBl
IHZhbHVlKSBjb25zdCAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2
YWx1ZSwgYm9vbD46OnR5cGUKK3sKKyAgICByZXR1cm4gbV9pbXBsLmNvbnRhaW5zKHZhbHVlKTsK
K30KKwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5
cGVuYW1lIFRyYWl0cz4KK3RlbXBsYXRlPHR5cGVuYW1lIFY+CitpbmxpbmUgYXV0byBIYXNoQ291
bnRlZFNldDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPjo6Y291bnQodHlwZW5hbWUgR2V0
UHRySGVscGVyPFY+OjpQdHJUeXBlIHZhbHVlKSBjb25zdCAtPiB0eXBlbmFtZSBzdGQ6OmVuYWJs
ZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgdW5zaWduZWQ+Ojp0eXBlCit7CisgICAgcmV0dXJu
IG1faW1wbC5nZXQodmFsdWUpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZSwgdHlwZW5h
bWUgSGFzaEZ1bmN0aW9ucywgdHlwZW5hbWUgVHJhaXRzPgordGVtcGxhdGU8dHlwZW5hbWUgVj4K
K2lubGluZSBhdXRvIEhhc2hDb3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+
OjpyZW1vdmUodHlwZW5hbWUgR2V0UHRySGVscGVyPFY+OjpQdHJUeXBlIHZhbHVlKSAtPiB0eXBl
bmFtZSBzdGQ6OmVuYWJsZV9pZjxJc1NtYXJ0UHRyPFY+Ojp2YWx1ZSwgYm9vbD46OnR5cGUKK3sK
KyAgICByZXR1cm4gcmVtb3ZlKGZpbmQodmFsdWUpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUg
VmFsdWUsIHR5cGVuYW1lIEhhc2hGdW5jdGlvbnMsIHR5cGVuYW1lIFRyYWl0cywgdHlwZW5hbWUg
VmVjdG9yVHlwZT4KK2lubGluZSB2b2lkIGNvcHlUb1ZlY3Rvcihjb25zdCBIYXNoQ291bnRlZFNl
dDxWYWx1ZSwgSGFzaEZ1bmN0aW9ucywgVHJhaXRzPiYgY29sbGVjdGlvbiwgVmVjdG9yVHlwZSYg
dmVjdG9yKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhh
c2hGdW5jdGlvbnMsIFRyYWl0cz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworCisgICAgdmVj
dG9yLnJlc2l6ZShjb2xsZWN0aW9uLnNpemUoKSk7CisKKyAgICBpdGVyYXRvciBpdCA9IGNvbGxl
Y3Rpb24uYmVnaW4oKTsKKyAgICBpdGVyYXRvciBlbmQgPSBjb2xsZWN0aW9uLmVuZCgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGl0ICE9IGVuZDsgKytpdCwgKytpKQorICAgICAgICB2ZWN0
b3JbaV0gPSAqaXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlLCB0eXBlbmFtZSBIYXNo
RnVuY3Rpb25zLCB0eXBlbmFtZSBUcmFpdHM+CitpbmxpbmUgdm9pZCBjb3B5VG9WZWN0b3IoY29u
c3QgSGFzaENvdW50ZWRTZXQ8VmFsdWUsIEhhc2hGdW5jdGlvbnMsIFRyYWl0cz4mIGNvbGxlY3Rp
b24sIFZlY3RvcjxWYWx1ZT4mIHZlY3RvcikKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEhhc2hD
b3VudGVkU2V0PFZhbHVlLCBIYXNoRnVuY3Rpb25zLCBUcmFpdHM+Ojpjb25zdF9pdGVyYXRvciBp
dGVyYXRvcjsKKworICAgIHZlY3Rvci5yZXNpemUoY29sbGVjdGlvbi5zaXplKCkpOworCisgICAg
aXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmJlZ2luKCk7CisgICAgaXRlcmF0b3IgZW5kID0gY29s
bGVjdGlvbi5lbmQoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpdCAhPSBlbmQ7ICsraXQs
ICsraSkKKyAgICAgICAgdmVjdG9yW2ldID0gKCppdCkua2V5OworfQogCiB9IC8vIG5hbWVzcGFj
ZSBXVEYKIAogdXNpbmcgV1RGOjpIYXNoQ291bnRlZFNldDsKIAotI2VuZGlmIC8qIFdURl9IYXNo
Q291bnRlZFNldF9oICovCisKSW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIyMzE3NykKKysrIFRvb2xzL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDE0IEBACisyMDE3LTEwLTExICBTYW0gV2VpbmlnICA8c2Ft
QHdlYmtpdC5vcmc+CisKKyAgICAgICAgSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIGl0ZXJhdGUg
anVzdCB0aGUgdmFsdWVzIChhbmQgbm90IHRoZSBjb3VudHMpIG9mIGEgSGFzaENvdW50ZWRTZXQK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3ODE2OQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogVGVzdFdl
YktpdEFQSS9UZXN0cy9XVEYvSGFzaENvdW50ZWRTZXQuY3BwOgorICAgICAgICAoVGVzdFdlYktp
dEFQSTo6VEVTVCk6CisgICAgICAgIEFkZCB0ZXN0IGZvciBIYXNoQ291bnRlZFNldCdzIG5ldyB2
YWx1ZXMoKSByYW5nZS4KKwogMjAxNy0xMC0xMSAgVG9tYXMgUG9wZWxhICA8dHBvcGVsYUByZWRo
YXQuY29tPgogCiAgICAgICAgIFVzZSBodHRwcyBmb3IgdHJhYyBjaGFuZ2VzZXQgYW5kIGJyb3dz
ZXIgbGlua3MKSW5kZXg6IFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV1RGL0hhc2hDb3VudGVk
U2V0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dURi9IYXNo
Q291bnRlZFNldC5jcHAJKHJldmlzaW9uIDIyMzE0OSkKKysrIFRvb2xzL1Rlc3RXZWJLaXRBUEkv
VGVzdHMvV1RGL0hhc2hDb3VudGVkU2V0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDY5LDQgKzQ2
OSwxNyBAQCBURVNUKFdURl9IYXNoQ291bnRlZFNldCwgUmVmUHRyS2V5X0FkZFVzCiAgICAgRVhQ
RUNUX1NUUkVRKCJyZWYoYSkgZGVyZWYoYSkgIiwgdGFrZUxvZ1N0cigpLmNfc3RyKCkpOwogfQog
CitURVNUKFdURl9IYXNoQ291bnRlZFNldCwgVmFsdWVzKQoreworICAgIEhhc2hDb3VudGVkU2V0
PGludD4gc2V0IHsgMSwgMSwgMiwgMywgMyB9OworICAgIAorICAgIGF1dG8gdmVjdG9yID0gY29w
eVRvVmVjdG9yKHNldC52YWx1ZXMoKSk7CisgICAgRVhQRUNUX0VRKDNVLCB2ZWN0b3Iuc2l6ZSgp
KTsKKworICAgIHN0ZDo6c29ydCh2ZWN0b3IuYmVnaW4oKSwgdmVjdG9yLmVuZCgpKTsKKyAgICBF
WFBFQ1RfRVEoMSwgdmVjdG9yWzBdKTsKKyAgICBFWFBFQ1RfRVEoMiwgdmVjdG9yWzFdKTsKKyAg
ICBFWFBFQ1RfRVEoMywgdmVjdG9yWzJdKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgVGVzdFdlYktp
dEFQSQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>