<?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>121772</bug_id>
          
          <creation_ts>2013-09-22 18:16:11 -0700</creation_ts>
          <short_desc>CTTE: Use references more in ContainerNode, ContainerNodeAlgorithms and related classes</short_desc>
          <delta_ts>2013-09-22 20:39:34 -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>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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sam Weinig">sam</reporter>
          <assigned_to name="Sam Weinig">sam</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>webkit-ews</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>931964</commentid>
    <comment_count>0</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2013-09-22 18:16:11 -0700</bug_when>
    <thetext>CTTE: Use references more in ContainerNode, ContainerNodeAlgorithms and related classes</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>931970</commentid>
    <comment_count>1</comment_count>
      <attachid>212314</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2013-09-22 18:23:30 -0700</bug_when>
    <thetext>Created attachment 212314
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>931972</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-09-22 18:27:11 -0700</bug_when>
    <thetext>Attachment 212314 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/css/PropertySetCSSStyleDeclaration.cpp&apos;, u&apos;Source/WebCore/dom/CharacterData.cpp&apos;, u&apos;Source/WebCore/dom/ChildListMutationScope.cpp&apos;, u&apos;Source/WebCore/dom/ChildListMutationScope.h&apos;, u&apos;Source/WebCore/dom/ContainerNode.cpp&apos;, u&apos;Source/WebCore/dom/ContainerNode.h&apos;, u&apos;Source/WebCore/dom/ContainerNodeAlgorithms.cpp&apos;, u&apos;Source/WebCore/dom/ContainerNodeAlgorithms.h&apos;, u&apos;Source/WebCore/dom/Document.cpp&apos;, u&apos;Source/WebCore/dom/Document.h&apos;, u&apos;Source/WebCore/dom/Element.cpp&apos;, u&apos;Source/WebCore/dom/MutationObserverInterestGroup.cpp&apos;, u&apos;Source/WebCore/dom/MutationObserverInterestGroup.h&apos;, u&apos;Source/WebCore/dom/MutationRecord.cpp&apos;, u&apos;Source/WebCore/dom/MutationRecord.h&apos;, u&apos;Source/WebCore/dom/Node.cpp&apos;, u&apos;Source/WebCore/dom/Range.cpp&apos;, u&apos;Source/WebCore/dom/Range.h&apos;, u&apos;Source/WebCore/dom/StaticNodeList.cpp&apos;, u&apos;Source/WebCore/dom/StaticNodeList.h&apos;, u&apos;Source/WebCore/editing/ApplyStyleCommand.cpp&apos;, u&apos;Source/WebCore/editing/CompositeEditCommand.cpp&apos;, u&apos;Source/WebCore/editing/ReplaceNodeWithSpanCommand.cpp&apos;, u&apos;Source/WebCore/editing/markup.cpp&apos;, u&apos;Source/WebCore/html/HTMLFrameElementBase.cpp&apos;, u&apos;Source/WebCore/html/HTMLFrameOwnerElement.cpp&apos;, u&apos;Source/WebCore/html/HTMLFrameOwnerElement.h&apos;, u&apos;Source/WebCore/html/HTMLMediaElement.cpp&apos;, u&apos;Source/WebCore/html/HTMLObjectElement.cpp&apos;, u&apos;Source/WebCore/html/parser/HTMLTreeBuilder.cpp&apos;, u&apos;Source/WebCore/svg/SVGElementInstance.cpp&apos;, u&apos;Source/WebCore/svg/SVGElementInstance.h&apos;, u&apos;Source/WebCore/testing/Internals.cpp&apos;, u&apos;Source/WebCore/xml/XMLErrors.cpp&apos;]&quot; exit_code: 1
Source/WebCore/dom/StaticNodeList.h:42:  Missing spaces around &gt;&gt;  [whitespace/operators] [3]
Source/WebCore/svg/SVGElementInstance.h:32:  The parameter name &quot;container&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/svg/SVGElementInstance.h:162:  The parameter name &quot;container&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/svg/SVGElementInstance.h:168:  The parameter name &quot;container&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/dom/ContainerNodeAlgorithms.h:164:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 5 in 35 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>931975</commentid>
    <comment_count>3</comment_count>
      <attachid>212314</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2013-09-22 18:36:09 -0700</bug_when>
    <thetext>Comment on attachment 212314
Patch

Attachment 212314 did not pass qt-ews (qt):
Output: http://webkit-queues.appspot.com/results/2030109</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>931976</commentid>
    <comment_count>4</comment_count>
      <attachid>212314</attachid>
    <who name="Early Warning System Bot">webkit-ews</who>
    <bug_when>2013-09-22 18:38:36 -0700</bug_when>
    <thetext>Comment on attachment 212314
Patch

Attachment 212314 did not pass qt-wk2-ews (qt-wk2):
Output: http://webkit-queues.appspot.com/results/1907566</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>931978</commentid>
    <comment_count>5</comment_count>
      <attachid>212314</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-09-22 18:42:47 -0700</bug_when>
    <thetext>Comment on attachment 212314
Patch

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

Awesome! r=me

&gt; Source/WebCore/dom/ContainerNodeAlgorithms.h:53
&gt; +    Vector&lt;RefPtr&lt;Node&gt;&gt; m_postInsertionNotificationTargets;

Could this be a Vector of Refs?

&gt; Source/WebCore/dom/ContainerNodeAlgorithms.h:283
&gt;      Vector&lt;RefPtr&lt;HTMLFrameOwnerElement&gt;, 10&gt; m_frameOwners;

Could probably be a Vector of Refs too!

&gt; Source/WebCore/editing/markup.cpp:1070
&gt;  void replaceChildrenWithFragment(ContainerNode* container, PassRefPtr&lt;DocumentFragment&gt; fragment, ExceptionCode&amp; ec)
&gt;  {
&gt; -    RefPtr&lt;ContainerNode&gt; containerNode(container);
&gt; -
&gt; +    Ref&lt;ContainerNode&gt; containerNode(*container);

&apos;container&apos; should be a ContainerNode&amp;, then we wouldn&apos;t have the sketchy-looking dereference.
All call sites just pass &quot;this&quot; anyway.

&gt; Source/WebCore/editing/markup.cpp:1094
&gt;  void replaceChildrenWithText(ContainerNode* container, const String&amp; text, ExceptionCode&amp; ec)
&gt;  {
&gt; -    RefPtr&lt;ContainerNode&gt; containerNode(container);
&gt; -
&gt; +    Ref&lt;ContainerNode&gt; containerNode(*container);

&apos;container&apos; should be a ContainerNode&amp;, then we wouldn&apos;t have the sketchy-looking dereference.
All call sites just pass &quot;this&quot; anyway.

&gt; Source/WebCore/html/HTMLFrameOwnerElement.cpp:131
&gt; +    for (Node* node = &amp;owner; node; node = node-&gt;parentOrShadowHostNode()) {

Node -&gt; ContainerNode

&gt; Source/WebCore/html/HTMLFrameOwnerElement.h:108
&gt; +    Node&amp; m_root;

This should be a ContainerNode&amp;.

&gt; Source/WebCore/testing/Internals.cpp:-1261
&gt; -        copyToVector(result.rectBasedTestResult(), matches);

It would be better to make copyToVector() work for Vector&lt;Ref&lt;T&gt;&gt;.
copyToVector() is pretty stupid; instead of doing a resize() and then operator=&apos;ing all the values into place, it should do reserveInitialCapacity/uncheckedAppend.

&gt; Source/WebCore/testing/Internals.cpp:1263
&gt; +        matches.reserveCapacity(nodeSet.size());

reserveInitialCapacity

&gt; Source/WebCore/testing/Internals.cpp:1265
&gt; +            matches.append(*it-&gt;get());

uncheckedAppend

&gt; Source/WebCore/xml/XMLErrors.cpp:140
&gt; -        documentElement-&gt;parentNode()-&gt;parserRemoveChild(documentElement.get());
&gt; +        documentElement-&gt;parentNode()-&gt;parserRemoveChild(*documentElement.get());

*documentElement</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>932002</commentid>
    <comment_count>6</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2013-09-22 20:39:34 -0700</bug_when>
    <thetext>Committed r156256: &lt;http://trac.webkit.org/changeset/156256&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>212314</attachid>
            <date>2013-09-22 18:23:30 -0700</date>
            <delta_ts>2013-09-22 18:42:47 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-121772-20130922182329.patch</filename>
            <type>text/plain</type>
            <size>98765</size>
            <attacher name="Sam Weinig">sam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1NjI1MikKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEyIEBACisyMDEzLTA5LTIyICBTYW0gV2Vp
bmlnICA8c2FtQHdlYmtpdC5vcmc+CisKKyAgICAgICAgQ1RURTogVXNlIHJlZmVyZW5jZXMgbW9y
ZSBpbiBDb250YWluZXJOb2RlLCBDb250YWluZXJOb2RlQWxnb3JpdGhtcyBhbmQgcmVsYXRlZCBj
bGFzc2VzCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
MjE3NzIKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBV
c2UgcmVmZXJlbmNlcyBmb3IgbmV2ZXIgbnVsbCBOb2RlcyBpbiBDb250YWluZXJOb2RlIGFuZCBy
ZWxhdGVkIGNsYXNzZXMuCisKIDIwMTMtMDktMjIgIEFydW5wcmFzYWQgUmFqa3VtYXIgIDxhcmFy
dW5wcmFzYWRAZ21haWwuY29tPgogCiAgICAgICAgIEhpZGluZyBhIGZvY3VzZWQgZWxlbWVudCBz
aG91bGQgdW5mb2N1cyBpdCBhbmQgZmlyZSBhIGJsdXIgZXZlbnQKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2Nzcy9Qcm9wZXJ0eVNldENTU1N0eWxlRGVjbGFyYXRpb24uY3BwCShy
ZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9jc3MvUHJvcGVydHlTZXRDU1NTdHls
ZURlY2xhcmF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTcsNyArNTcsNyBAQCBwdWJsaWM6
CiAKICAgICAgICAgYm9vbCBzaG91bGRSZWFkT2xkVmFsdWUgPSBmYWxzZTsKIAotICAgICAgICBt
X211dGF0aW9uUmVjaXBpZW50cyA9IE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwOjpjcmVh
dGVGb3JBdHRyaWJ1dGVzTXV0YXRpb24oc19jdXJyZW50RGVjbC0+cGFyZW50RWxlbWVudCgpLCBI
VE1MTmFtZXM6OnN0eWxlQXR0cik7CisgICAgICAgIG1fbXV0YXRpb25SZWNpcGllbnRzID0gTXV0
YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXA6OmNyZWF0ZUZvckF0dHJpYnV0ZXNNdXRhdGlvbigq
c19jdXJyZW50RGVjbC0+cGFyZW50RWxlbWVudCgpLCBIVE1MTmFtZXM6OnN0eWxlQXR0cik7CiAg
ICAgICAgIGlmIChtX211dGF0aW9uUmVjaXBpZW50cyAmJiBtX211dGF0aW9uUmVjaXBpZW50cy0+
aXNPbGRWYWx1ZVJlcXVlc3RlZCgpKQogICAgICAgICAgICAgc2hvdWxkUmVhZE9sZFZhbHVlID0g
dHJ1ZTsKIApAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWM6CiAKICAgICAgICAgaWYgKG1fbXV0YXRp
b25SZWNpcGllbnRzKSB7CiAgICAgICAgICAgICBBdG9taWNTdHJpbmcgcmVxdWVzdGVkT2xkVmFs
dWUgPSBtX211dGF0aW9uUmVjaXBpZW50cy0+aXNPbGRWYWx1ZVJlcXVlc3RlZCgpID8gb2xkVmFs
dWUgOiBudWxsQXRvbTsKLSAgICAgICAgICAgIG1fbXV0YXRpb24gPSBNdXRhdGlvblJlY29yZDo6
Y3JlYXRlQXR0cmlidXRlcyhzX2N1cnJlbnREZWNsLT5wYXJlbnRFbGVtZW50KCksIEhUTUxOYW1l
czo6c3R5bGVBdHRyLCByZXF1ZXN0ZWRPbGRWYWx1ZSk7CisgICAgICAgICAgICBtX211dGF0aW9u
ID0gTXV0YXRpb25SZWNvcmQ6OmNyZWF0ZUF0dHJpYnV0ZXMoKnNfY3VycmVudERlY2wtPnBhcmVu
dEVsZW1lbnQoKSwgSFRNTE5hbWVzOjpzdHlsZUF0dHIsIHJlcXVlc3RlZE9sZFZhbHVlKTsKICAg
ICAgICAgfQogICAgIH0KIApJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAko
cmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC0yMTUsOCArMjE1LDkgQEAgdm9pZCBDaGFyYWN0ZXJEYXRhOjpz
ZXREYXRhQW5kVXBkYXRlKGNvbgogCiB2b2lkIENoYXJhY3RlckRhdGE6OmRpc3BhdGNoTW9kaWZp
ZWRFdmVudChjb25zdCBTdHJpbmcmIG9sZERhdGEpCiB7Ci0gICAgaWYgKE93blB0cjxNdXRhdGlv
bk9ic2VydmVySW50ZXJlc3RHcm91cD4gbXV0YXRpb25SZWNpcGllbnRzID0gTXV0YXRpb25PYnNl
cnZlckludGVyZXN0R3JvdXA6OmNyZWF0ZUZvckNoYXJhY3RlckRhdGFNdXRhdGlvbih0aGlzKSkK
LSAgICAgICAgbXV0YXRpb25SZWNpcGllbnRzLT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQoTXV0YXRp
b25SZWNvcmQ6OmNyZWF0ZUNoYXJhY3RlckRhdGEodGhpcywgb2xkRGF0YSkpOworICAgIGlmIChP
d25QdHI8TXV0YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXA+IG11dGF0aW9uUmVjaXBpZW50cyA9
IE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwOjpjcmVhdGVGb3JDaGFyYWN0ZXJEYXRhTXV0
YXRpb24oKnRoaXMpKQorICAgICAgICBtdXRhdGlvblJlY2lwaWVudHMtPmVucXVldWVNdXRhdGlv
blJlY29yZChNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hhcmFjdGVyRGF0YSgqdGhpcywgb2xkRGF0
YSkpOworCiAgICAgaWYgKCFpc0luU2hhZG93VHJlZSgpKSB7CiAgICAgICAgIGlmIChwYXJlbnRO
b2RlKCkpIHsKICAgICAgICAgICAgIENvbnRhaW5lck5vZGU6OkNoaWxkQ2hhbmdlIGNoYW5nZSA9
IHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29wZS5j
cHAJKHJldmlzaW9uIDE1NjI1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRh
dGlvblNjb3BlLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDQsMTQgKzQ0LDE0IEBACiAKIG5hbWVz
cGFjZSBXZWJDb3JlIHsKIAotdHlwZWRlZiBIYXNoTWFwPE5vZGUqLCBDaGlsZExpc3RNdXRhdGlv
bkFjY3VtdWxhdG9yKj4gQWNjdW11bGF0b3JNYXA7Cit0eXBlZGVmIEhhc2hNYXA8Q29udGFpbmVy
Tm9kZSosIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IqPiBBY2N1bXVsYXRvck1hcDsKIHN0
YXRpYyBBY2N1bXVsYXRvck1hcCYgYWNjdW11bGF0b3JNYXAoKQogewogICAgIERFRklORV9TVEFU
SUNfTE9DQUwoQWNjdW11bGF0b3JNYXAsIG1hcCwgKCkpOwogICAgIHJldHVybiBtYXA7CiB9CiAK
LUNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0
b3IoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIFBhc3NPd25QdHI8TXV0YXRpb25PYnNlcnZlcklu
dGVyZXN0R3JvdXA+IG9ic2VydmVycykKK0NoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OkNo
aWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IoQ29udGFpbmVyTm9kZSYgdGFyZ2V0LCBQYXNzT3du
UHRyPE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwPiBvYnNlcnZlcnMpCiAgICAgOiBtX3Rh
cmdldCh0YXJnZXQpCiAgICAgLCBtX2xhc3RBZGRlZCgwKQogICAgICwgbV9vYnNlcnZlcnMob2Jz
ZXJ2ZXJzKQpAQCAtNjIsMTIgKzYyLDEyIEBAIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6
On5DaGlsZExpc3QKIHsKICAgICBpZiAoIWlzRW1wdHkoKSkKICAgICAgICAgZW5xdWV1ZU11dGF0
aW9uUmVjb3JkKCk7Ci0gICAgYWNjdW11bGF0b3JNYXAoKS5yZW1vdmUobV90YXJnZXQuZ2V0KCkp
OworICAgIGFjY3VtdWxhdG9yTWFwKCkucmVtb3ZlKCZtX3RhcmdldC5nZXQoKSk7CiB9CiAKLVBh
c3NSZWZQdHI8Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcj4gQ2hpbGRMaXN0TXV0YXRpb25B
Y2N1bXVsYXRvcjo6Z2V0T3JDcmVhdGUoTm9kZSogdGFyZ2V0KQorUGFzc1JlZlB0cjxDaGlsZExp
c3RNdXRhdGlvbkFjY3VtdWxhdG9yPiBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjpnZXRP
ckNyZWF0ZShDb250YWluZXJOb2RlJiB0YXJnZXQpCiB7Ci0gICAgQWNjdW11bGF0b3JNYXA6OkFk
ZFJlc3VsdCByZXN1bHQgPSBhY2N1bXVsYXRvck1hcCgpLmFkZCh0YXJnZXQsIG51bGxwdHIpOwor
ICAgIEFjY3VtdWxhdG9yTWFwOjpBZGRSZXN1bHQgcmVzdWx0ID0gYWNjdW11bGF0b3JNYXAoKS5h
ZGQoJnRhcmdldCwgbnVsbHB0cik7CiAgICAgUmVmUHRyPENoaWxkTGlzdE11dGF0aW9uQWNjdW11
bGF0b3I+IGFjY3VtdWxhdG9yOwogICAgIGlmICghcmVzdWx0LmlzTmV3RW50cnkpCiAgICAgICAg
IGFjY3VtdWxhdG9yID0gcmVzdWx0Lml0ZXJhdG9yLT52YWx1ZTsKQEAgLTc4LDE2ICs3OCwxNiBA
QCBQYXNzUmVmUHRyPENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I+CiAgICAgcmV0dXJuIGFj
Y3VtdWxhdG9yLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIGJvb2wgQ2hpbGRMaXN0TXV0YXRpb25B
Y2N1bXVsYXRvcjo6aXNBZGRlZE5vZGVJbk9yZGVyKE5vZGUqIGNoaWxkKQoraW5saW5lIGJvb2wg
Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6aXNBZGRlZE5vZGVJbk9yZGVyKE5vZGUmIGNo
aWxkKQogewotICAgIHJldHVybiBpc0VtcHR5KCkgfHwgKG1fbGFzdEFkZGVkID09IGNoaWxkLT5w
cmV2aW91c1NpYmxpbmcoKSAmJiBtX25leHRTaWJsaW5nID09IGNoaWxkLT5uZXh0U2libGluZygp
KTsKKyAgICByZXR1cm4gaXNFbXB0eSgpIHx8IChtX2xhc3RBZGRlZCA9PSBjaGlsZC5wcmV2aW91
c1NpYmxpbmcoKSAmJiBtX25leHRTaWJsaW5nID09IGNoaWxkLm5leHRTaWJsaW5nKCkpOwogfQog
Ci12b2lkIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OmNoaWxkQWRkZWQoUGFzc1JlZlB0
cjxOb2RlPiBwcnBDaGlsZCkKK3ZvaWQgQ2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6Y2hp
bGRBZGRlZChOb2RlJiBjaGlsZFJlZikKIHsKICAgICBBU1NFUlQoaGFzT2JzZXJ2ZXJzKCkpOwog
Ci0gICAgUmVmUHRyPE5vZGU+IGNoaWxkID0gcHJwQ2hpbGQ7CisgICAgUmVmPE5vZGU+IGNoaWxk
KGNoaWxkUmVmKTsKIAogICAgIGlmICghaXNBZGRlZE5vZGVJbk9yZGVyKGNoaWxkLmdldCgpKSkK
ICAgICAgICAgZW5xdWV1ZU11dGF0aW9uUmVjb3JkKCk7CkBAIC05NywyMCArOTcsMjAgQEAgdm9p
ZCBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yOjpjaGlsZAogICAgICAgICBtX25leHRTaWJs
aW5nID0gY2hpbGQtPm5leHRTaWJsaW5nKCk7CiAgICAgfQogCi0gICAgbV9sYXN0QWRkZWQgPSBj
aGlsZC5nZXQoKTsKLSAgICBtX2FkZGVkTm9kZXMuYXBwZW5kKGNoaWxkLnJlbGVhc2UoKSk7Cisg
ICAgbV9sYXN0QWRkZWQgPSAmY2hpbGQuZ2V0KCk7CisgICAgbV9hZGRlZE5vZGVzLmFwcGVuZChj
aGlsZC5nZXQoKSk7CiB9CiAKLWlubGluZSBib29sIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0
b3I6OmlzUmVtb3ZlZE5vZGVJbk9yZGVyKE5vZGUqIGNoaWxkKQoraW5saW5lIGJvb2wgQ2hpbGRM
aXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6aXNSZW1vdmVkTm9kZUluT3JkZXIoTm9kZSYgY2hpbGQp
CiB7Ci0gICAgcmV0dXJuIGlzRW1wdHkoKSB8fCBtX25leHRTaWJsaW5nID09IGNoaWxkOworICAg
IHJldHVybiBpc0VtcHR5KCkgfHwgbV9uZXh0U2libGluZyA9PSAmY2hpbGQ7CiB9CiAKLXZvaWQg
Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6d2lsbFJlbW92ZUNoaWxkKFBhc3NSZWZQdHI8
Tm9kZT4gcHJwQ2hpbGQpCit2b2lkIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OndpbGxS
ZW1vdmVDaGlsZChOb2RlJiBjaGlsZFJlZikKIHsKICAgICBBU1NFUlQoaGFzT2JzZXJ2ZXJzKCkp
OwogCi0gICAgUmVmUHRyPE5vZGU+IGNoaWxkID0gcHJwQ2hpbGQ7CisgICAgUmVmPE5vZGU+IGNo
aWxkKGNoaWxkUmVmKTsKIAogICAgIGlmICghbV9hZGRlZE5vZGVzLmlzRW1wdHkoKSB8fCAhaXNS
ZW1vdmVkTm9kZUluT3JkZXIoY2hpbGQuZ2V0KCkpKQogICAgICAgICBlbnF1ZXVlTXV0YXRpb25S
ZWNvcmQoKTsKQEAgLTEyMiw3ICsxMjIsNyBAQCB2b2lkIENoaWxkTGlzdE11dGF0aW9uQWNjdW11
bGF0b3I6OndpbGxSCiAgICAgfSBlbHNlCiAgICAgICAgIG1fbmV4dFNpYmxpbmcgPSBjaGlsZC0+
bmV4dFNpYmxpbmcoKTsKIAotICAgIG1fcmVtb3ZlZE5vZGVzLmFwcGVuZChjaGlsZC5yZWxlYXNl
KCkpOworICAgIG1fcmVtb3ZlZE5vZGVzLmFwcGVuZChjaGlsZC5nZXQoKSk7CiB9CiAKIHZvaWQg
Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcjo6ZW5xdWV1ZU11dGF0aW9uUmVjb3JkKCkKQEAg
LTEzMiw3ICsxMzIsNyBAQCB2b2lkIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I6OmVucXVl
CiAKICAgICBSZWZQdHI8Tm9kZUxpc3Q+IGFkZGVkTm9kZXMgPSBTdGF0aWNOb2RlTGlzdDo6YWRv
cHQobV9hZGRlZE5vZGVzKTsKICAgICBSZWZQdHI8Tm9kZUxpc3Q+IHJlbW92ZWROb2RlcyA9IFN0
YXRpY05vZGVMaXN0OjphZG9wdChtX3JlbW92ZWROb2Rlcyk7Ci0gICAgUmVmUHRyPE11dGF0aW9u
UmVjb3JkPiByZWNvcmQgPSBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hpbGRMaXN0KG1fdGFyZ2V0
LCBhZGRlZE5vZGVzLnJlbGVhc2UoKSwgcmVtb3ZlZE5vZGVzLnJlbGVhc2UoKSwgbV9wcmV2aW91
c1NpYmxpbmcucmVsZWFzZSgpLCBtX25leHRTaWJsaW5nLnJlbGVhc2UoKSk7CisgICAgUmVmUHRy
PE11dGF0aW9uUmVjb3JkPiByZWNvcmQgPSBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hpbGRMaXN0
KG1fdGFyZ2V0LmdldCgpLCBhZGRlZE5vZGVzLnJlbGVhc2UoKSwgcmVtb3ZlZE5vZGVzLnJlbGVh
c2UoKSwgbV9wcmV2aW91c1NpYmxpbmcucmVsZWFzZSgpLCBtX25leHRTaWJsaW5nLnJlbGVhc2Uo
KSk7CiAgICAgbV9vYnNlcnZlcnMtPmVucXVldWVNdXRhdGlvblJlY29yZChyZWNvcmQucmVsZWFz
ZSgpKTsKICAgICBtX2xhc3RBZGRlZCA9IDA7CiAgICAgQVNTRVJUKGlzRW1wdHkoKSk7CkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9kb20vQ2hpbGRMaXN0TXV0YXRpb25TY29wZS5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmgJKHJldmlzaW9u
IDE1NjI1MCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9DaGlsZExpc3RNdXRhdGlvblNjb3BlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTQ2LDI2ICs0NiwyNiBAQCBjbGFzcyBNdXRhdGlvbk9ic2VydmVy
SW50ZXJlc3RHcm91cDsKIC8vIENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3IgaXMgbm90IG1l
YW50IHRvIGJlIHVzZWQgZGlyZWN0bHk7IENoaWxkTGlzdE11dGF0aW9uU2NvcGUgaXMgdGhlIHB1
YmxpYyBpbnRlcmZhY2UuCiBjbGFzcyBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yIDogcHVi
bGljIFJlZkNvdW50ZWQ8Q2hpbGRMaXN0TXV0YXRpb25BY2N1bXVsYXRvcj4gewogcHVibGljOgot
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPENoaWxkTGlzdE11dGF0aW9uQWNjdW11bGF0b3I+IGdldE9y
Q3JlYXRlKE5vZGUqKTsKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxDaGlsZExpc3RNdXRhdGlvbkFj
Y3VtdWxhdG9yPiBnZXRPckNyZWF0ZShDb250YWluZXJOb2RlJik7CiAgICAgfkNoaWxkTGlzdE11
dGF0aW9uQWNjdW11bGF0b3IoKTsKIAotICAgIHZvaWQgY2hpbGRBZGRlZChQYXNzUmVmUHRyPE5v
ZGU+KTsKLSAgICB2b2lkIHdpbGxSZW1vdmVDaGlsZChQYXNzUmVmUHRyPE5vZGU+KTsKKyAgICB2
b2lkIGNoaWxkQWRkZWQoTm9kZSYpOworICAgIHZvaWQgd2lsbFJlbW92ZUNoaWxkKE5vZGUmKTsK
IAogICAgIGJvb2wgaGFzT2JzZXJ2ZXJzKCkgY29uc3QgeyByZXR1cm4gbV9vYnNlcnZlcnM7IH0K
IAogcHJpdmF0ZToKLSAgICBDaGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKFBhc3NSZWZQdHI8
Tm9kZT4sIFBhc3NPd25QdHI8TXV0YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXA+KTsKKyAgICBD
aGlsZExpc3RNdXRhdGlvbkFjY3VtdWxhdG9yKENvbnRhaW5lck5vZGUmLCBQYXNzT3duUHRyPE11
dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwPik7CiAKICAgICB2b2lkIGVucXVldWVNdXRhdGlv
blJlY29yZCgpOwogICAgIGJvb2wgaXNFbXB0eSgpOwotICAgIGJvb2wgaXNBZGRlZE5vZGVJbk9y
ZGVyKE5vZGUqKTsKLSAgICBib29sIGlzUmVtb3ZlZE5vZGVJbk9yZGVyKE5vZGUqKTsKKyAgICBi
b29sIGlzQWRkZWROb2RlSW5PcmRlcihOb2RlJik7CisgICAgYm9vbCBpc1JlbW92ZWROb2RlSW5P
cmRlcihOb2RlJik7CiAKLSAgICBSZWZQdHI8Tm9kZT4gbV90YXJnZXQ7CisgICAgUmVmPENvbnRh
aW5lck5vZGU+IG1fdGFyZ2V0OwogCi0gICAgVmVjdG9yPFJlZlB0cjxOb2RlPiA+IG1fcmVtb3Zl
ZE5vZGVzOwotICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiBtX2FkZGVkTm9kZXM7CisgICAgVmVj
dG9yPFJlZjxOb2RlPj4gbV9yZW1vdmVkTm9kZXM7CisgICAgVmVjdG9yPFJlZjxOb2RlPj4gbV9h
ZGRlZE5vZGVzOwogICAgIFJlZlB0cjxOb2RlPiBtX3ByZXZpb3VzU2libGluZzsKICAgICBSZWZQ
dHI8Tm9kZT4gbV9uZXh0U2libGluZzsKICAgICBOb2RlKiBtX2xhc3RBZGRlZDsKQEAgLTc2LDE5
ICs3NiwxOSBAQCBwcml2YXRlOgogY2xhc3MgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSB7CiAgICAg
V1RGX01BS0VfTk9OQ09QWUFCTEUoQ2hpbGRMaXN0TXV0YXRpb25TY29wZSk7CiBwdWJsaWM6Ci0g
ICAgZXhwbGljaXQgQ2hpbGRMaXN0TXV0YXRpb25TY29wZShOb2RlKiB0YXJnZXQpCisgICAgZXhw
bGljaXQgQ2hpbGRMaXN0TXV0YXRpb25TY29wZShDb250YWluZXJOb2RlJiB0YXJnZXQpCiAgICAg
ewotICAgICAgICBpZiAodGFyZ2V0LT5kb2N1bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZU
eXBlKE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCkpCisgICAgICAgIGlmICh0YXJnZXQuZG9j
dW1lbnQoKS5oYXNNdXRhdGlvbk9ic2VydmVyc09mVHlwZShNdXRhdGlvbk9ic2VydmVyOjpDaGls
ZExpc3QpKQogICAgICAgICAgICAgbV9hY2N1bXVsYXRvciA9IENoaWxkTGlzdE11dGF0aW9uQWNj
dW11bGF0b3I6OmdldE9yQ3JlYXRlKHRhcmdldCk7CiAgICAgfQogCi0gICAgdm9pZCBjaGlsZEFk
ZGVkKE5vZGUqIGNoaWxkKQorICAgIHZvaWQgY2hpbGRBZGRlZChOb2RlJiBjaGlsZCkKICAgICB7
CiAgICAgICAgIGlmIChtX2FjY3VtdWxhdG9yICYmIG1fYWNjdW11bGF0b3ItPmhhc09ic2VydmVy
cygpKQogICAgICAgICAgICAgbV9hY2N1bXVsYXRvci0+Y2hpbGRBZGRlZChjaGlsZCk7CiAgICAg
fQogCi0gICAgdm9pZCB3aWxsUmVtb3ZlQ2hpbGQoTm9kZSogY2hpbGQpCisgICAgdm9pZCB3aWxs
UmVtb3ZlQ2hpbGQoTm9kZSYgY2hpbGQpCiAgICAgewogICAgICAgICBpZiAobV9hY2N1bXVsYXRv
ciAmJiBtX2FjY3VtdWxhdG9yLT5oYXNPYnNlcnZlcnMoKSkKICAgICAgICAgICAgIG1fYWNjdW11
bGF0b3ItPndpbGxSZW1vdmVDaGlsZChjaGlsZCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20v
Q29udGFpbmVyTm9kZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0NvbnRh
aW5lck5vZGUuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vQ29u
dGFpbmVyTm9kZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTY3LDggKzY3LDggQEAgdXNpbmcgbmFt
ZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgdm9pZCBkaXNwYXRj
aENoaWxkSW5zZXJ0aW9uRXZlbnRzKE5vZGUqKTsKLXN0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRS
ZW1vdmFsRXZlbnRzKE5vZGUqKTsKK3N0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRJbnNlcnRpb25F
dmVudHMoTm9kZSYpOworc3RhdGljIHZvaWQgZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoTm9k
ZSYpOwogCiB0eXBlZGVmIHBhaXI8UmVmUHRyPE5vZGU+LCB1bnNpZ25lZD4gQ2FsbGJhY2tQYXJh
bWV0ZXJzOwogdHlwZWRlZiBwYWlyPE5vZGVDYWxsYmFjaywgQ2FsbGJhY2tQYXJhbWV0ZXJzPiBD
YWxsYmFja0luZm87CkBAIC04NSwxNiArODUsMTcgQEAgQ2hpbGROb2Rlc0xhenlTbmFwc2hvdCog
Q2hpbGROb2Rlc0xhenlTbgogdW5zaWduZWQgTm9FdmVudERpc3BhdGNoQXNzZXJ0aW9uOjpzX2Nv
dW50ID0gMDsKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBjb2xsZWN0Q2hpbGRyZW5BbmRSZW1vdmVG
cm9tT2xkUGFyZW50KE5vZGUqIG5vZGUsIE5vZGVWZWN0b3ImIG5vZGVzLCBFeGNlcHRpb25Db2Rl
JiBlYykKK3N0YXRpYyB2b2lkIGNvbGxlY3RDaGlsZHJlbkFuZFJlbW92ZUZyb21PbGRQYXJlbnQo
Tm9kZSYgbm9kZSwgTm9kZVZlY3RvciYgbm9kZXMsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAg
IGlmIChub2RlLT5ub2RlVHlwZSgpICE9IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsK
KyAgICBpZiAobm9kZS5ub2RlVHlwZSgpICE9IE5vZGU6OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUp
IHsKICAgICAgICAgbm9kZXMuYXBwZW5kKG5vZGUpOwotICAgICAgICBpZiAoQ29udGFpbmVyTm9k
ZSogb2xkUGFyZW50ID0gbm9kZS0+cGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgb2xkUGFyZW50
LT5yZW1vdmVDaGlsZChub2RlLCBlYyk7CisgICAgICAgIGlmIChDb250YWluZXJOb2RlKiBvbGRQ
YXJlbnQgPSBub2RlLnBhcmVudE5vZGUoKSkKKyAgICAgICAgICAgIG9sZFBhcmVudC0+cmVtb3Zl
Q2hpbGQoJm5vZGUsIGVjKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIGdldENoaWxk
Tm9kZXMobm9kZSwgbm9kZXMpOwotICAgIHRvQ29udGFpbmVyTm9kZShub2RlKS0+cmVtb3ZlQ2hp
bGRyZW4oKTsKKyAgICB0b0NvbnRhaW5lck5vZGUobm9kZSkucmVtb3ZlQ2hpbGRyZW4oKTsKIH0K
IAogLy8gRklYTUU6IFRoaXMgZnVuY3Rpb24gbXVzdCBnZXQgYSBuZXcgbmFtZS4KQEAgLTEwNywz
MiArMTA4LDM0IEBAIHZvaWQgQ29udGFpbmVyTm9kZTo6cmVtb3ZlRGV0YWNoZWRDaGlsZHIKICAg
ICAgICAgICAgIGNoaWxkLT51cGRhdGVBbmNlc3RvckNvbm5lY3RlZFN1YmZyYW1lQ291bnRGb3JS
ZW1vdmFsKCk7CiAgICAgfQogICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBBU1NF
UlQoIWF0dGFjaGVkKCkpIGhlcmU6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0xMDc4MDEKLSAgICByZW1vdmVEZXRhY2hlZENoaWxkcmVuSW5Db250YWluZXI8Tm9kZSwg
Q29udGFpbmVyTm9kZT4odGhpcyk7CisgICAgcmVtb3ZlRGV0YWNoZWRDaGlsZHJlbkluQ29udGFp
bmVyPE5vZGUsIENvbnRhaW5lck5vZGU+KCp0aGlzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lk
IGF0dGFjaENoaWxkKE5vZGUqIGNoaWxkKQorc3RhdGljIGlubGluZSB2b2lkIGF0dGFjaENoaWxk
KE5vZGUmIGNoaWxkKQogewotICAgIGlmIChjaGlsZC0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAg
ICBTdHlsZTo6YXR0YWNoUmVuZGVyVHJlZSgqdG9FbGVtZW50KGNoaWxkKSk7Ci0gICAgZWxzZSBp
ZiAoY2hpbGQtPmlzVGV4dE5vZGUoKSkKLSAgICAgICAgU3R5bGU6OmF0dGFjaFRleHRSZW5kZXJl
cigqdG9UZXh0KGNoaWxkKSk7CisgICAgaWYgKGNoaWxkLmlzRWxlbWVudE5vZGUoKSkKKyAgICAg
ICAgU3R5bGU6OmF0dGFjaFJlbmRlclRyZWUodG9FbGVtZW50KGNoaWxkKSk7CisgICAgZWxzZSBp
ZiAoY2hpbGQuaXNUZXh0Tm9kZSgpKQorICAgICAgICBTdHlsZTo6YXR0YWNoVGV4dFJlbmRlcmVy
KHRvVGV4dChjaGlsZCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGV0YWNoQ2hpbGQoTm9k
ZSogY2hpbGQpCitzdGF0aWMgaW5saW5lIHZvaWQgZGV0YWNoQ2hpbGQoTm9kZSYgY2hpbGQpCiB7
Ci0gICAgaWYgKGNoaWxkLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgIFN0eWxlOjpkZXRhY2hS
ZW5kZXJUcmVlKCp0b0VsZW1lbnQoY2hpbGQpKTsKLSAgICBlbHNlIGlmIChjaGlsZC0+aXNUZXh0
Tm9kZSgpKQotICAgICAgICBTdHlsZTo6ZGV0YWNoVGV4dFJlbmRlcmVyKCp0b1RleHQoY2hpbGQp
KTsKKyAgICBpZiAoY2hpbGQuaXNFbGVtZW50Tm9kZSgpKQorICAgICAgICBTdHlsZTo6ZGV0YWNo
UmVuZGVyVHJlZSh0b0VsZW1lbnQoY2hpbGQpKTsKKyAgICBlbHNlIGlmIChjaGlsZC5pc1RleHRO
b2RlKCkpCisgICAgICAgIFN0eWxlOjpkZXRhY2hUZXh0UmVuZGVyZXIodG9UZXh0KGNoaWxkKSk7
CiB9CiAKIHZvaWQgQ29udGFpbmVyTm9kZTo6dGFrZUFsbENoaWxkcmVuRnJvbShDb250YWluZXJO
b2RlKiBvbGRQYXJlbnQpCiB7CisgICAgQVNTRVJUKG9sZFBhcmVudCk7CisKICAgICBOb2RlVmVj
dG9yIGNoaWxkcmVuOwotICAgIGdldENoaWxkTm9kZXMob2xkUGFyZW50LCBjaGlsZHJlbik7Cisg
ICAgZ2V0Q2hpbGROb2Rlcygqb2xkUGFyZW50LCBjaGlsZHJlbik7CiAKICAgICBpZiAob2xkUGFy
ZW50LT5kb2N1bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2
ZXI6OkNoaWxkTGlzdCkpIHsKLSAgICAgICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSBtdXRhdGlv
bihvbGRQYXJlbnQpOworICAgICAgICBDaGlsZExpc3RNdXRhdGlvblNjb3BlIG11dGF0aW9uKCpv
bGRQYXJlbnQpOwogICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgY2hpbGRyZW4uc2l6
ZSgpOyArK2kpCiAgICAgICAgICAgICBtdXRhdGlvbi53aWxsUmVtb3ZlQ2hpbGQoY2hpbGRyZW5b
aV0uZ2V0KCkpOwogICAgIH0KQEAgLTE0MywxOCArMTQ2LDE5IEBAIHZvaWQgQ29udGFpbmVyTm9k
ZTo6dGFrZUFsbENoaWxkcmVuRnJvbSgKICAgICBvbGRQYXJlbnQtPnJlbW92ZURldGFjaGVkQ2hp
bGRyZW4oKTsKIAogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjaGlsZHJlbi5zaXplKCk7
ICsraSkgewotICAgICAgICBOb2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldLmdldCgpOwotICAgICAg
ICBpZiAoY2hpbGQtPmF0dGFjaGVkKCkpCisgICAgICAgIE5vZGUmIGNoaWxkID0gY2hpbGRyZW5b
aV0uZ2V0KCk7CisgICAgICAgIGlmIChjaGlsZC5hdHRhY2hlZCgpKQogICAgICAgICAgICAgZGV0
YWNoQ2hpbGQoY2hpbGQpOworCiAgICAgICAgIC8vIEZJWE1FOiBXZSBuZWVkIGEgbm8gbXV0YXRp
b24gZXZlbnQgdmVyc2lvbiBvZiBhZG9wdE5vZGUuCi0gICAgICAgIFJlZlB0cjxOb2RlPiBhZG9w
dGVkQ2hpbGQgPSBkb2N1bWVudCgpLmFkb3B0Tm9kZShjaGlsZHJlbltpXS5yZWxlYXNlKCksIEFT
U0VSVF9OT19FWENFUFRJT04pOworICAgICAgICBSZWZQdHI8Tm9kZT4gYWRvcHRlZENoaWxkID0g
ZG9jdW1lbnQoKS5hZG9wdE5vZGUoJmNoaWxkcmVuW2ldLmdldCgpLCBBU1NFUlRfTk9fRVhDRVBU
SU9OKTsKICAgICAgICAgcGFyc2VyQXBwZW5kQ2hpbGQoYWRvcHRlZENoaWxkLmdldCgpKTsKICAg
ICAgICAgLy8gRklYTUU6IFRvZ2V0aGVyIHdpdGggYWRvcHROb2RlIGFib3ZlLCB0aGUgdHJlZSBz
Y29wZSBtaWdodCBnZXQgdXBkYXRlZCByZWN1cnNpdmVseSB0d2ljZQogICAgICAgICAvLyAoaWYg
dGhlIGRvY3VtZW50IGNoYW5nZWQgb3Igb2xkUGFyZW50IHdhcyBpbiBhIHNoYWRvdyB0cmVlLCBB
TkQgKnRoaXMgaXMgaW4gYSBzaGFkb3cgdHJlZSkuCiAgICAgICAgIC8vIENhbiB3ZSBkbyBiZXR0
ZXI/CiAgICAgICAgIHRyZWVTY29wZSgpLT5hZG9wdElmTmVlZGVkKGFkb3B0ZWRDaGlsZC5nZXQo
KSk7CiAgICAgICAgIGlmIChhdHRhY2hlZCgpICYmICFhZG9wdGVkQ2hpbGQtPmF0dGFjaGVkKCkp
Ci0gICAgICAgICAgICBhdHRhY2hDaGlsZChhZG9wdGVkQ2hpbGQuZ2V0KCkpOworICAgICAgICAg
ICAgYXR0YWNoQ2hpbGQoKmFkb3B0ZWRDaGlsZC5nZXQoKSk7CiAgICAgfQogfQogCkBAIC0yOTEs
NyArMjk1LDcgQEAgYm9vbCBDb250YWluZXJOb2RlOjppbnNlcnRCZWZvcmUoUGFzc1JlZgogICAg
IFJlZjxOb2RlPiBuZXh0KCpyZWZDaGlsZCk7CiAKICAgICBOb2RlVmVjdG9yIHRhcmdldHM7Ci0g
ICAgY29sbGVjdENoaWxkcmVuQW5kUmVtb3ZlRnJvbU9sZFBhcmVudChuZXdDaGlsZC5nZXQoKSwg
dGFyZ2V0cywgZWMpOworICAgIGNvbGxlY3RDaGlsZHJlbkFuZFJlbW92ZUZyb21PbGRQYXJlbnQo
Km5ld0NoaWxkLmdldCgpLCB0YXJnZXRzLCBlYyk7CiAgICAgaWYgKGVjKQogICAgICAgICByZXR1
cm4gZmFsc2U7CiAgICAgaWYgKHRhcmdldHMuaXNFbXB0eSgpKQpAQCAtMzAzLDkgKzMwNyw5IEBA
IGJvb2wgQ29udGFpbmVyTm9kZTo6aW5zZXJ0QmVmb3JlKFBhc3NSZWYKIAogICAgIEluc3BlY3Rv
ckluc3RydW1lbnRhdGlvbjo6d2lsbEluc2VydERPTU5vZGUoJmRvY3VtZW50KCksIHRoaXMpOwog
Ci0gICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSBtdXRhdGlvbih0aGlzKTsKLSAgICBmb3IgKE5v
ZGVWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gdGFyZ2V0cy5iZWdpbigpOyBpdCAhPSB0YXJn
ZXRzLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIE5vZGUqIGNoaWxkID0gaXQtPmdldCgpOworICAg
IENoaWxkTGlzdE11dGF0aW9uU2NvcGUgbXV0YXRpb24oKnRoaXMpOworICAgIGZvciAoYXV0byBp
dCA9IHRhcmdldHMuYmVnaW4oKSwgZW5kID0gdGFyZ2V0cy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIE5vZGUmIGNoaWxkID0gaXQtPmdldCgpOwogCiAgICAgICAgIC8vIER1ZSB0
byBhcmJpdHJhcnkgY29kZSBydW5uaW5nIGluIHJlc3BvbnNlIHRvIGEgRE9NIG11dGF0aW9uIGV2
ZW50IGl0J3MKICAgICAgICAgLy8gcG9zc2libGUgdGhhdCAibmV4dCIgaXMgbm8gbG9uZ2VyIGEg
Y2hpbGQgb2YgInRoaXMiLgpAQCAtMzEzLDEyICszMTcsMTIgQEAgYm9vbCBDb250YWluZXJOb2Rl
OjppbnNlcnRCZWZvcmUoUGFzc1JlZgogICAgICAgICAvLyBJbiBlaXRoZXIgb2YgdGhvc2UgY2Fz
ZXMsIHdlJ2xsIGp1c3Qgc3RvcC4KICAgICAgICAgaWYgKG5leHQtPnBhcmVudE5vZGUoKSAhPSB0
aGlzKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChjaGlsZC0+cGFyZW50Tm9kZSgp
KQorICAgICAgICBpZiAoY2hpbGQucGFyZW50Tm9kZSgpKQogICAgICAgICAgICAgYnJlYWs7CiAK
LSAgICAgICAgdHJlZVNjb3BlKCktPmFkb3B0SWZOZWVkZWQoY2hpbGQpOworICAgICAgICB0cmVl
U2NvcGUoKS0+YWRvcHRJZk5lZWRlZCgmY2hpbGQpOwogCi0gICAgICAgIGluc2VydEJlZm9yZUNv
bW1vbigmbmV4dC5nZXQoKSwgY2hpbGQpOworICAgICAgICBpbnNlcnRCZWZvcmVDb21tb24obmV4
dC5nZXQoKSwgY2hpbGQpOwogCiAgICAgICAgIHVwZGF0ZVRyZWVBZnRlckluc2VydGlvbihjaGls
ZCwgYXR0YWNoQmVoYXZpb3IpOwogICAgIH0KQEAgLTMyNyw0NyArMzMxLDQ2IEBAIGJvb2wgQ29u
dGFpbmVyTm9kZTo6aW5zZXJ0QmVmb3JlKFBhc3NSZWYKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAot
dm9pZCBDb250YWluZXJOb2RlOjppbnNlcnRCZWZvcmVDb21tb24oTm9kZSogbmV4dENoaWxkLCBO
b2RlKiBuZXdDaGlsZCkKK3ZvaWQgQ29udGFpbmVyTm9kZTo6aW5zZXJ0QmVmb3JlQ29tbW9uKE5v
ZGUmIG5leHRDaGlsZCwgTm9kZSYgbmV3Q2hpbGQpCiB7CiAgICAgTm9FdmVudERpc3BhdGNoQXNz
ZXJ0aW9uIGFzc2VydE5vRXZlbnREaXNwYXRjaDsKIAotICAgIEFTU0VSVChuZXdDaGlsZCk7Ci0g
ICAgQVNTRVJUKCFuZXdDaGlsZC0+cGFyZW50Tm9kZSgpKTsgLy8gVXNlIGluc2VydEJlZm9yZSBp
ZiB5b3UgbmVlZCB0byBoYW5kbGUgcmVwYXJlbnRpbmcgKGFuZCB3YW50IERPTSBtdXRhdGlvbiBl
dmVudHMpLgotICAgIEFTU0VSVCghbmV3Q2hpbGQtPm5leHRTaWJsaW5nKCkpOwotICAgIEFTU0VS
VCghbmV3Q2hpbGQtPnByZXZpb3VzU2libGluZygpKTsKLSAgICBBU1NFUlQoIW5ld0NoaWxkLT5p
c1NoYWRvd1Jvb3QoKSk7CisgICAgQVNTRVJUKCFuZXdDaGlsZC5wYXJlbnROb2RlKCkpOyAvLyBV
c2UgaW5zZXJ0QmVmb3JlIGlmIHlvdSBuZWVkIHRvIGhhbmRsZSByZXBhcmVudGluZyAoYW5kIHdh
bnQgRE9NIG11dGF0aW9uIGV2ZW50cykuCisgICAgQVNTRVJUKCFuZXdDaGlsZC5uZXh0U2libGlu
ZygpKTsKKyAgICBBU1NFUlQoIW5ld0NoaWxkLnByZXZpb3VzU2libGluZygpKTsKKyAgICBBU1NF
UlQoIW5ld0NoaWxkLmlzU2hhZG93Um9vdCgpKTsKIAotICAgIE5vZGUqIHByZXYgPSBuZXh0Q2hp
bGQtPnByZXZpb3VzU2libGluZygpOworICAgIE5vZGUqIHByZXYgPSBuZXh0Q2hpbGQucHJldmlv
dXNTaWJsaW5nKCk7CiAgICAgQVNTRVJUKG1fbGFzdENoaWxkICE9IHByZXYpOwotICAgIG5leHRD
aGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKG5ld0NoaWxkKTsKKyAgICBuZXh0Q2hpbGQuc2V0UHJl
dmlvdXNTaWJsaW5nKCZuZXdDaGlsZCk7CiAgICAgaWYgKHByZXYpIHsKLSAgICAgICAgQVNTRVJU
KG1fZmlyc3RDaGlsZCAhPSBuZXh0Q2hpbGQpOwotICAgICAgICBBU1NFUlQocHJldi0+bmV4dFNp
YmxpbmcoKSA9PSBuZXh0Q2hpbGQpOwotICAgICAgICBwcmV2LT5zZXROZXh0U2libGluZyhuZXdD
aGlsZCk7CisgICAgICAgIEFTU0VSVChtX2ZpcnN0Q2hpbGQgIT0gJm5leHRDaGlsZCk7CisgICAg
ICAgIEFTU0VSVChwcmV2LT5uZXh0U2libGluZygpID09ICZuZXh0Q2hpbGQpOworICAgICAgICBw
cmV2LT5zZXROZXh0U2libGluZygmbmV3Q2hpbGQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFT
U0VSVChtX2ZpcnN0Q2hpbGQgPT0gbmV4dENoaWxkKTsKLSAgICAgICAgbV9maXJzdENoaWxkID0g
bmV3Q2hpbGQ7CisgICAgICAgIEFTU0VSVChtX2ZpcnN0Q2hpbGQgPT0gJm5leHRDaGlsZCk7Cisg
ICAgICAgIG1fZmlyc3RDaGlsZCA9ICZuZXdDaGlsZDsKICAgICB9Ci0gICAgbmV3Q2hpbGQtPnNl
dFBhcmVudE5vZGUodGhpcyk7Ci0gICAgbmV3Q2hpbGQtPnNldFByZXZpb3VzU2libGluZyhwcmV2
KTsKLSAgICBuZXdDaGlsZC0+c2V0TmV4dFNpYmxpbmcobmV4dENoaWxkKTsKKyAgICBuZXdDaGls
ZC5zZXRQYXJlbnROb2RlKHRoaXMpOworICAgIG5ld0NoaWxkLnNldFByZXZpb3VzU2libGluZyhw
cmV2KTsKKyAgICBuZXdDaGlsZC5zZXROZXh0U2libGluZygmbmV4dENoaWxkKTsKIH0KIAotdm9p
ZCBDb250YWluZXJOb2RlOjpub3RpZnlDaGlsZEluc2VydGVkKE5vZGUqIGNoaWxkLCBDaGlsZENo
YW5nZVNvdXJjZSBzb3VyY2UpCit2b2lkIENvbnRhaW5lck5vZGU6Om5vdGlmeUNoaWxkSW5zZXJ0
ZWQoTm9kZSYgY2hpbGQsIENoaWxkQ2hhbmdlU291cmNlIHNvdXJjZSkKIHsKICAgICBDaGlsZENo
YW5nZSBjaGFuZ2U7Ci0gICAgY2hhbmdlLnR5cGUgPSBjaGlsZC0+aXNFbGVtZW50Tm9kZSgpID8g
RWxlbWVudEluc2VydGVkIDogY2hpbGQtPmlzVGV4dE5vZGUoKSA/IFRleHRJbnNlcnRlZCA6IE5v
bkNvbnRlbnRzQ2hpbGRDaGFuZ2VkOwotICAgIGNoYW5nZS5wcmV2aW91c1NpYmxpbmdFbGVtZW50
ID0gIEVsZW1lbnRUcmF2ZXJzYWw6OnByZXZpb3VzU2libGluZyhjaGlsZCk7Ci0gICAgY2hhbmdl
Lm5leHRTaWJsaW5nRWxlbWVudCA9IEVsZW1lbnRUcmF2ZXJzYWw6Om5leHRTaWJsaW5nKGNoaWxk
KTsKKyAgICBjaGFuZ2UudHlwZSA9IGNoaWxkLmlzRWxlbWVudE5vZGUoKSA/IEVsZW1lbnRJbnNl
cnRlZCA6IGNoaWxkLmlzVGV4dE5vZGUoKSA/IFRleHRJbnNlcnRlZCA6IE5vbkNvbnRlbnRzQ2hp
bGRDaGFuZ2VkOworICAgIGNoYW5nZS5wcmV2aW91c1NpYmxpbmdFbGVtZW50ID0gRWxlbWVudFRy
YXZlcnNhbDo6cHJldmlvdXNTaWJsaW5nKCZjaGlsZCk7CisgICAgY2hhbmdlLm5leHRTaWJsaW5n
RWxlbWVudCA9IEVsZW1lbnRUcmF2ZXJzYWw6Om5leHRTaWJsaW5nKCZjaGlsZCk7CiAgICAgY2hh
bmdlLnNvdXJjZSA9IHNvdXJjZTsKIAogICAgIGNoaWxkcmVuQ2hhbmdlZChjaGFuZ2UpOwogfQog
Ci12b2lkIENvbnRhaW5lck5vZGU6Om5vdGlmeUNoaWxkUmVtb3ZlZChOb2RlKiBjaGlsZCwgTm9k
ZSogcHJldmlvdXNTaWJsaW5nLCBOb2RlKiBuZXh0U2libGluZywgQ2hpbGRDaGFuZ2VTb3VyY2Ug
c291cmNlKQordm9pZCBDb250YWluZXJOb2RlOjpub3RpZnlDaGlsZFJlbW92ZWQoTm9kZSYgY2hp
bGQsIE5vZGUqIHByZXZpb3VzU2libGluZywgTm9kZSogbmV4dFNpYmxpbmcsIENoaWxkQ2hhbmdl
U291cmNlIHNvdXJjZSkKIHsKICAgICBDaGlsZENoYW5nZSBjaGFuZ2U7Ci0gICAgY2hhbmdlLnR5
cGUgPSBjaGlsZC0+aXNFbGVtZW50Tm9kZSgpID8gRWxlbWVudFJlbW92ZWQgOiBjaGlsZC0+aXNU
ZXh0Tm9kZSgpID8gVGV4dFJlbW92ZWQgOiBOb25Db250ZW50c0NoaWxkQ2hhbmdlZDsKKyAgICBj
aGFuZ2UudHlwZSA9IGNoaWxkLmlzRWxlbWVudE5vZGUoKSA/IEVsZW1lbnRSZW1vdmVkIDogY2hp
bGQuaXNUZXh0Tm9kZSgpID8gVGV4dFJlbW92ZWQgOiBOb25Db250ZW50c0NoaWxkQ2hhbmdlZDsK
ICAgICBjaGFuZ2UucHJldmlvdXNTaWJsaW5nRWxlbWVudCA9ICghcHJldmlvdXNTaWJsaW5nIHx8
IHByZXZpb3VzU2libGluZy0+aXNFbGVtZW50Tm9kZSgpKSA/IHRvRWxlbWVudChwcmV2aW91c1Np
YmxpbmcpIDogRWxlbWVudFRyYXZlcnNhbDo6cHJldmlvdXNTaWJsaW5nKHByZXZpb3VzU2libGlu
Zyk7CiAgICAgY2hhbmdlLm5leHRTaWJsaW5nRWxlbWVudCA9ICghbmV4dFNpYmxpbmcgfHwgbmV4
dFNpYmxpbmctPmlzRWxlbWVudE5vZGUoKSkgPyB0b0VsZW1lbnQobmV4dFNpYmxpbmcpIDogRWxl
bWVudFRyYXZlcnNhbDo6bmV4dFNpYmxpbmcobmV4dFNpYmxpbmcpOwogICAgIGNoYW5nZS5zb3Vy
Y2UgPSBzb3VyY2U7CkBAIC0zOTEsMTUgKzM5NCwxNSBAQCB2b2lkIENvbnRhaW5lck5vZGU6OnBh
cnNlckluc2VydEJlZm9yZShQCiAgICAgaWYgKCZkb2N1bWVudCgpICE9ICZuZXdDaGlsZC0+ZG9j
dW1lbnQoKSkKICAgICAgICAgZG9jdW1lbnQoKS5hZG9wdE5vZGUobmV3Q2hpbGQuZ2V0KCksIEFT
U0VSVF9OT19FWENFUFRJT04pOwogCi0gICAgaW5zZXJ0QmVmb3JlQ29tbW9uKG5leHRDaGlsZCwg
bmV3Q2hpbGQuZ2V0KCkpOworICAgIGluc2VydEJlZm9yZUNvbW1vbigqbmV4dENoaWxkLCAqbmV3
Q2hpbGQuZ2V0KCkpOwogCiAgICAgbmV3Q2hpbGQtPnVwZGF0ZUFuY2VzdG9yQ29ubmVjdGVkU3Vi
ZnJhbWVDb3VudEZvckluc2VydGlvbigpOwogCi0gICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSh0
aGlzKS5jaGlsZEFkZGVkKG5ld0NoaWxkLmdldCgpKTsKKyAgICBDaGlsZExpc3RNdXRhdGlvblNj
b3BlKCp0aGlzKS5jaGlsZEFkZGVkKCpuZXdDaGlsZCk7CiAKLSAgICBub3RpZnlDaGlsZEluc2Vy
dGVkKG5ld0NoaWxkLmdldCgpLCBDaGlsZENoYW5nZVNvdXJjZVBhcnNlcik7CisgICAgbm90aWZ5
Q2hpbGRJbnNlcnRlZCgqbmV3Q2hpbGQsIENoaWxkQ2hhbmdlU291cmNlUGFyc2VyKTsKIAotICAg
IENoaWxkTm9kZUluc2VydGlvbk5vdGlmaWVyKHRoaXMpLm5vdGlmeShuZXdDaGlsZC5nZXQoKSk7
CisgICAgQ2hpbGROb2RlSW5zZXJ0aW9uTm90aWZpZXIoKnRoaXMpLm5vdGlmeSgqbmV3Q2hpbGQp
OwogfQogCiBib29sIENvbnRhaW5lck5vZGU6OnJlcGxhY2VDaGlsZChQYXNzUmVmUHRyPE5vZGU+
IG5ld0NoaWxkLCBOb2RlKiBvbGRDaGlsZCwgRXhjZXB0aW9uQ29kZSYgZWMsIEF0dGFjaEJlaGF2
aW9yIGF0dGFjaEJlaGF2aW9yKQpAQCAtNDMwLDcgKzQzMyw3IEBAIGJvb2wgQ29udGFpbmVyTm9k
ZTo6cmVwbGFjZUNoaWxkKFBhc3NSZWYKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAot
ICAgIENoaWxkTGlzdE11dGF0aW9uU2NvcGUgbXV0YXRpb24odGhpcyk7CisgICAgQ2hpbGRMaXN0
TXV0YXRpb25TY29wZSBtdXRhdGlvbigqdGhpcyk7CiAKICAgICBSZWZQdHI8Tm9kZT4gbmV4dCA9
IG9sZENoaWxkLT5uZXh0U2libGluZygpOwogCkBAIC00NDgsNyArNDUxLDcgQEAgYm9vbCBDb250
YWluZXJOb2RlOjpyZXBsYWNlQ2hpbGQoUGFzc1JlZgogICAgICAgICByZXR1cm4gZmFsc2U7CiAK
ICAgICBOb2RlVmVjdG9yIHRhcmdldHM7Ci0gICAgY29sbGVjdENoaWxkcmVuQW5kUmVtb3ZlRnJv
bU9sZFBhcmVudChuZXdDaGlsZC5nZXQoKSwgdGFyZ2V0cywgZWMpOworICAgIGNvbGxlY3RDaGls
ZHJlbkFuZFJlbW92ZUZyb21PbGRQYXJlbnQoKm5ld0NoaWxkLmdldCgpLCB0YXJnZXRzLCBlYyk7
CiAgICAgaWYgKGVjKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTQ1OSw4ICs0NjIsOCBA
QCBib29sIENvbnRhaW5lck5vZGU6OnJlcGxhY2VDaGlsZChQYXNzUmVmCiAgICAgSW5zcGVjdG9y
SW5zdHJ1bWVudGF0aW9uOjp3aWxsSW5zZXJ0RE9NTm9kZSgmZG9jdW1lbnQoKSwgdGhpcyk7CiAK
ICAgICAvLyBBZGQgdGhlIG5ldyBjaGlsZChyZW4pCi0gICAgZm9yIChOb2RlVmVjdG9yOjpjb25z
dF9pdGVyYXRvciBpdCA9IHRhcmdldHMuYmVnaW4oKTsgaXQgIT0gdGFyZ2V0cy5lbmQoKTsgKytp
dCkgewotICAgICAgICBOb2RlKiBjaGlsZCA9IGl0LT5nZXQoKTsKKyAgICBmb3IgKGF1dG8gaXQg
PSB0YXJnZXRzLmJlZ2luKCksIGVuZCA9IHRhcmdldHMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBOb2RlJiBjaGlsZCA9IGl0LT5nZXQoKTsKIAogICAgICAgICAvLyBEdWUgdG8g
YXJiaXRyYXJ5IGNvZGUgcnVubmluZyBpbiByZXNwb25zZSB0byBhIERPTSBtdXRhdGlvbiBldmVu
dCBpdCdzCiAgICAgICAgIC8vIHBvc3NpYmxlIHRoYXQgIm5leHQiIGlzIG5vIGxvbmdlciBhIGNo
aWxkIG9mICJ0aGlzIi4KQEAgLTQ2OCwxOCArNDcxLDE4IEBAIGJvb2wgQ29udGFpbmVyTm9kZTo6
cmVwbGFjZUNoaWxkKFBhc3NSZWYKICAgICAgICAgLy8gSW4gZWl0aGVyIG9mIHRob3NlIGNhc2Vz
LCB3ZSdsbCBqdXN0IHN0b3AuCiAgICAgICAgIGlmIChuZXh0ICYmIG5leHQtPnBhcmVudE5vZGUo
KSAhPSB0aGlzKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChjaGlsZC0+cGFyZW50
Tm9kZSgpKQorICAgICAgICBpZiAoY2hpbGQucGFyZW50Tm9kZSgpKQogICAgICAgICAgICAgYnJl
YWs7CiAKLSAgICAgICAgdHJlZVNjb3BlKCktPmFkb3B0SWZOZWVkZWQoY2hpbGQpOworICAgICAg
ICB0cmVlU2NvcGUoKS0+YWRvcHRJZk5lZWRlZCgmY2hpbGQpOwogCiAgICAgICAgIC8vIEFkZCBj
aGlsZCBiZWZvcmUgIm5leHQiLgogICAgICAgICB7CiAgICAgICAgICAgICBOb0V2ZW50RGlzcGF0
Y2hBc3NlcnRpb24gYXNzZXJ0Tm9FdmVudERpc3BhdGNoOwogICAgICAgICAgICAgaWYgKG5leHQp
Ci0gICAgICAgICAgICAgICAgaW5zZXJ0QmVmb3JlQ29tbW9uKG5leHQuZ2V0KCksIGNoaWxkKTsK
KyAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmVDb21tb24oKm5leHQsIGNoaWxkKTsKICAgICAg
ICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKGNoaWxk
LCB0aGlzKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKCZjaGlsZCwg
KnRoaXMpOwogICAgICAgICB9CiAKICAgICAgICAgdXBkYXRlVHJlZUFmdGVySW5zZXJ0aW9uKGNo
aWxkLCBhdHRhY2hCZWhhdmlvcik7CkBAIC00ODksMjkgKzQ5MiwzMCBAQCBib29sIENvbnRhaW5l
ck5vZGU6OnJlcGxhY2VDaGlsZChQYXNzUmVmCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRp
YyB2b2lkIHdpbGxSZW1vdmVDaGlsZChOb2RlKiBjaGlsZCkKK3N0YXRpYyB2b2lkIHdpbGxSZW1v
dmVDaGlsZChOb2RlJiBjaGlsZCkKIHsKLSAgICBBU1NFUlQoY2hpbGQtPnBhcmVudE5vZGUoKSk7
Ci0gICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZShjaGlsZC0+cGFyZW50Tm9kZSgpKS53aWxsUmVt
b3ZlQ2hpbGQoY2hpbGQpOwotICAgIGNoaWxkLT5ub3RpZnlNdXRhdGlvbk9ic2VydmVyc05vZGVX
aWxsRGV0YWNoKCk7CisgICAgQVNTRVJUKGNoaWxkLnBhcmVudE5vZGUoKSk7CisKKyAgICBDaGls
ZExpc3RNdXRhdGlvblNjb3BlKCpjaGlsZC5wYXJlbnROb2RlKCkpLndpbGxSZW1vdmVDaGlsZChj
aGlsZCk7CisgICAgY2hpbGQubm90aWZ5TXV0YXRpb25PYnNlcnZlcnNOb2RlV2lsbERldGFjaCgp
OwogICAgIGRpc3BhdGNoQ2hpbGRSZW1vdmFsRXZlbnRzKGNoaWxkKTsKLSAgICBjaGlsZC0+ZG9j
dW1lbnQoKS5ub2RlV2lsbEJlUmVtb3ZlZChjaGlsZCk7IC8vIGUuZy4gbXV0YXRpb24gZXZlbnQg
bGlzdGVuZXIgY2FuIGNyZWF0ZSBhIG5ldyByYW5nZS4KLSAgICBpZiAoY2hpbGQtPmlzQ29udGFp
bmVyTm9kZSgpKQorICAgIGNoaWxkLmRvY3VtZW50KCkubm9kZVdpbGxCZVJlbW92ZWQoJmNoaWxk
KTsgLy8gZS5nLiBtdXRhdGlvbiBldmVudCBsaXN0ZW5lciBjYW4gY3JlYXRlIGEgbmV3IHJhbmdl
LgorICAgIGlmIChjaGlsZC5pc0NvbnRhaW5lck5vZGUoKSkKICAgICAgICAgQ2hpbGRGcmFtZURp
c2Nvbm5lY3Rvcih0b0NvbnRhaW5lck5vZGUoY2hpbGQpKS5kaXNjb25uZWN0KCk7CiB9CiAKLXN0
YXRpYyB2b2lkIHdpbGxSZW1vdmVDaGlsZHJlbihDb250YWluZXJOb2RlKiBjb250YWluZXIpCitz
dGF0aWMgdm9pZCB3aWxsUmVtb3ZlQ2hpbGRyZW4oQ29udGFpbmVyTm9kZSYgY29udGFpbmVyKQog
ewogICAgIE5vZGVWZWN0b3IgY2hpbGRyZW47CiAgICAgZ2V0Q2hpbGROb2Rlcyhjb250YWluZXIs
IGNoaWxkcmVuKTsKIAotICAgIGNvbnRhaW5lci0+ZG9jdW1lbnQoKS5ub2RlQ2hpbGRyZW5XaWxs
QmVSZW1vdmVkKGNvbnRhaW5lcik7CisgICAgY29udGFpbmVyLmRvY3VtZW50KCkubm9kZUNoaWxk
cmVuV2lsbEJlUmVtb3ZlZChjb250YWluZXIpOwogCiAgICAgQ2hpbGRMaXN0TXV0YXRpb25TY29w
ZSBtdXRhdGlvbihjb250YWluZXIpOwotICAgIGZvciAoTm9kZVZlY3Rvcjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBjaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgewot
ICAgICAgICBOb2RlKiBjaGlsZCA9IGl0LT5nZXQoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBjaGls
ZHJlbi5iZWdpbigpOyBpdCAhPSBjaGlsZHJlbi5lbmQoKTsgKytpdCkgeworICAgICAgICBOb2Rl
JiBjaGlsZCA9IGl0LT5nZXQoKTsKICAgICAgICAgbXV0YXRpb24ud2lsbFJlbW92ZUNoaWxkKGNo
aWxkKTsKLSAgICAgICAgY2hpbGQtPm5vdGlmeU11dGF0aW9uT2JzZXJ2ZXJzTm9kZVdpbGxEZXRh
Y2goKTsKKyAgICAgICAgY2hpbGQubm90aWZ5TXV0YXRpb25PYnNlcnZlcnNOb2RlV2lsbERldGFj
aCgpOwogCiAgICAgICAgIC8vIGZpcmUgcmVtb3ZlZCBmcm9tIGRvY3VtZW50IG11dGF0aW9uIGV2
ZW50cy4KICAgICAgICAgZGlzcGF0Y2hDaGlsZFJlbW92YWxFdmVudHMoY2hpbGQpOwpAQCAtNTIy
LDcgKzUyNiw3IEBAIHN0YXRpYyB2b2lkIHdpbGxSZW1vdmVDaGlsZHJlbihDb250YWluZXIKIAog
dm9pZCBDb250YWluZXJOb2RlOjpkaXNjb25uZWN0RGVzY2VuZGFudEZyYW1lcygpCiB7Ci0gICAg
Q2hpbGRGcmFtZURpc2Nvbm5lY3Rvcih0aGlzKS5kaXNjb25uZWN0KCk7CisgICAgQ2hpbGRGcmFt
ZURpc2Nvbm5lY3RvcigqdGhpcykuZGlzY29ubmVjdCgpOwogfQogCiBib29sIENvbnRhaW5lck5v
ZGU6OnJlbW92ZUNoaWxkKE5vZGUqIG9sZENoaWxkLCBFeGNlcHRpb25Db2RlJiBlYykKQEAgLTU2
Miw3ICs1NjYsNyBAQCBib29sIENvbnRhaW5lck5vZGU6OnJlbW92ZUNoaWxkKE5vZGUqIG9sCiAg
ICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB3aWxsUmVtb3ZlQ2hpbGQoJmNoaWxk
LmdldCgpKTsKKyAgICB3aWxsUmVtb3ZlQ2hpbGQoY2hpbGQuZ2V0KCkpOwogCiAgICAgLy8gTXV0
YXRpb24gZXZlbnRzIG1pZ2h0IGhhdmUgbW92ZWQgdGhpcyBjaGlsZCBpbnRvIGEgZGlmZmVyZW50
IHBhcmVudC4KICAgICBpZiAoY2hpbGQtPnBhcmVudE5vZGUoKSAhPSB0aGlzKSB7CkBAIC01NzUs
NjMgKzU3OSw2MSBAQCBib29sIENvbnRhaW5lck5vZGU6OnJlbW92ZUNoaWxkKE5vZGUqIG9sCiAK
ICAgICAgICAgTm9kZSogcHJldiA9IGNoaWxkLT5wcmV2aW91c1NpYmxpbmcoKTsKICAgICAgICAg
Tm9kZSogbmV4dCA9IGNoaWxkLT5uZXh0U2libGluZygpOwotICAgICAgICByZW1vdmVCZXR3ZWVu
KHByZXYsIG5leHQsICZjaGlsZC5nZXQoKSk7CisgICAgICAgIHJlbW92ZUJldHdlZW4ocHJldiwg
bmV4dCwgY2hpbGQuZ2V0KCkpOwogCi0gICAgICAgIG5vdGlmeUNoaWxkUmVtb3ZlZCgmY2hpbGQu
Z2V0KCksIHByZXYsIG5leHQsIENoaWxkQ2hhbmdlU291cmNlQVBJKTsKKyAgICAgICAgbm90aWZ5
Q2hpbGRSZW1vdmVkKGNoaWxkLmdldCgpLCBwcmV2LCBuZXh0LCBDaGlsZENoYW5nZVNvdXJjZUFQ
SSk7CiAKLSAgICAgICAgQ2hpbGROb2RlUmVtb3ZhbE5vdGlmaWVyKHRoaXMpLm5vdGlmeSgmY2hp
bGQuZ2V0KCkpOworICAgICAgICBDaGlsZE5vZGVSZW1vdmFsTm90aWZpZXIoKnRoaXMpLm5vdGlm
eShjaGlsZC5nZXQoKSk7CiAgICAgfQogICAgIGRpc3BhdGNoU3VidHJlZU1vZGlmaWVkRXZlbnQo
KTsKIAogICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENvbnRhaW5lck5vZGU6OnJlbW92ZUJl
dHdlZW4oTm9kZSogcHJldmlvdXNDaGlsZCwgTm9kZSogbmV4dENoaWxkLCBOb2RlKiBvbGRDaGls
ZCkKK3ZvaWQgQ29udGFpbmVyTm9kZTo6cmVtb3ZlQmV0d2VlbihOb2RlKiBwcmV2aW91c0NoaWxk
LCBOb2RlKiBuZXh0Q2hpbGQsIE5vZGUmIG9sZENoaWxkKQogewogICAgIE5vRXZlbnREaXNwYXRj
aEFzc2VydGlvbiBhc3NlcnROb0V2ZW50RGlzcGF0Y2g7CiAKLSAgICBBU1NFUlQob2xkQ2hpbGQp
OwotICAgIEFTU0VSVChvbGRDaGlsZC0+cGFyZW50Tm9kZSgpID09IHRoaXMpOworICAgIEFTU0VS
VChvbGRDaGlsZC5wYXJlbnROb2RlKCkgPT0gdGhpcyk7CiAKICAgICAvLyBSZW1vdmUgZnJvbSBy
ZW5kZXJpbmcgdHJlZQotICAgIGlmIChvbGRDaGlsZC0+YXR0YWNoZWQoKSkKKyAgICBpZiAob2xk
Q2hpbGQuYXR0YWNoZWQoKSkKICAgICAgICAgZGV0YWNoQ2hpbGQob2xkQ2hpbGQpOwogCiAgICAg
aWYgKG5leHRDaGlsZCkKICAgICAgICAgbmV4dENoaWxkLT5zZXRQcmV2aW91c1NpYmxpbmcocHJl
dmlvdXNDaGlsZCk7CiAgICAgaWYgKHByZXZpb3VzQ2hpbGQpCiAgICAgICAgIHByZXZpb3VzQ2hp
bGQtPnNldE5leHRTaWJsaW5nKG5leHRDaGlsZCk7Ci0gICAgaWYgKG1fZmlyc3RDaGlsZCA9PSBv
bGRDaGlsZCkKKyAgICBpZiAobV9maXJzdENoaWxkID09ICZvbGRDaGlsZCkKICAgICAgICAgbV9m
aXJzdENoaWxkID0gbmV4dENoaWxkOwotICAgIGlmIChtX2xhc3RDaGlsZCA9PSBvbGRDaGlsZCkK
KyAgICBpZiAobV9sYXN0Q2hpbGQgPT0gJm9sZENoaWxkKQogICAgICAgICBtX2xhc3RDaGlsZCA9
IHByZXZpb3VzQ2hpbGQ7CiAKLSAgICBvbGRDaGlsZC0+c2V0UHJldmlvdXNTaWJsaW5nKDApOwot
ICAgIG9sZENoaWxkLT5zZXROZXh0U2libGluZygwKTsKLSAgICBvbGRDaGlsZC0+c2V0UGFyZW50
Tm9kZSgwKTsKKyAgICBvbGRDaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcoMCk7CisgICAgb2xkQ2hp
bGQuc2V0TmV4dFNpYmxpbmcoMCk7CisgICAgb2xkQ2hpbGQuc2V0UGFyZW50Tm9kZSgwKTsKIAot
ICAgIGRvY3VtZW50KCkuYWRvcHRJZk5lZWRlZChvbGRDaGlsZCk7CisgICAgZG9jdW1lbnQoKS5h
ZG9wdElmTmVlZGVkKCZvbGRDaGlsZCk7CiB9CiAKLXZvaWQgQ29udGFpbmVyTm9kZTo6cGFyc2Vy
UmVtb3ZlQ2hpbGQoTm9kZSogb2xkQ2hpbGQpCit2b2lkIENvbnRhaW5lck5vZGU6OnBhcnNlclJl
bW92ZUNoaWxkKE5vZGUmIG9sZENoaWxkKQogewotICAgIEFTU0VSVChvbGRDaGlsZCk7Ci0gICAg
QVNTRVJUKG9sZENoaWxkLT5wYXJlbnROb2RlKCkgPT0gdGhpcyk7Ci0gICAgQVNTRVJUKCFvbGRD
aGlsZC0+aXNEb2N1bWVudEZyYWdtZW50KCkpOworICAgIEFTU0VSVChvbGRDaGlsZC5wYXJlbnRO
b2RlKCkgPT0gdGhpcyk7CisgICAgQVNTRVJUKCFvbGRDaGlsZC5pc0RvY3VtZW50RnJhZ21lbnQo
KSk7CiAKLSAgICBOb2RlKiBwcmV2ID0gb2xkQ2hpbGQtPnByZXZpb3VzU2libGluZygpOwotICAg
IE5vZGUqIG5leHQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKTsKKyAgICBOb2RlKiBwcmV2ID0g
b2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nKCk7CisgICAgTm9kZSogbmV4dCA9IG9sZENoaWxkLm5l
eHRTaWJsaW5nKCk7CiAKLSAgICBvbGRDaGlsZC0+dXBkYXRlQW5jZXN0b3JDb25uZWN0ZWRTdWJm
cmFtZUNvdW50Rm9yUmVtb3ZhbCgpOworICAgIG9sZENoaWxkLnVwZGF0ZUFuY2VzdG9yQ29ubmVj
dGVkU3ViZnJhbWVDb3VudEZvclJlbW92YWwoKTsKIAotICAgIENoaWxkTGlzdE11dGF0aW9uU2Nv
cGUodGhpcykud2lsbFJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLSAgICBvbGRDaGlsZC0+bm90aWZ5
TXV0YXRpb25PYnNlcnZlcnNOb2RlV2lsbERldGFjaCgpOworICAgIENoaWxkTGlzdE11dGF0aW9u
U2NvcGUoKnRoaXMpLndpbGxSZW1vdmVDaGlsZChvbGRDaGlsZCk7CisgICAgb2xkQ2hpbGQubm90
aWZ5TXV0YXRpb25PYnNlcnZlcnNOb2RlV2lsbERldGFjaCgpOwogCiAgICAgcmVtb3ZlQmV0d2Vl
bihwcmV2LCBuZXh0LCBvbGRDaGlsZCk7CiAKICAgICBub3RpZnlDaGlsZFJlbW92ZWQob2xkQ2hp
bGQsIHByZXYsIG5leHQsIENoaWxkQ2hhbmdlU291cmNlUGFyc2VyKTsKIAotICAgIENoaWxkTm9k
ZVJlbW92YWxOb3RpZmllcih0aGlzKS5ub3RpZnkob2xkQ2hpbGQpOworICAgIENoaWxkTm9kZVJl
bW92YWxOb3RpZmllcigqdGhpcykubm90aWZ5KG9sZENoaWxkKTsKIH0KIAogLy8gdGhpcyBkaWZm
ZXJzIGZyb20gb3RoZXIgcmVtb3ZlIGZ1bmN0aW9ucyBiZWNhdXNlIGl0IGZvcmNpYmx5IHJlbW92
ZXMgYWxsIHRoZSBjaGlsZHJlbiwKQEAgLTY1Myw3ICs2NTUsNyBAQCB2b2lkIENvbnRhaW5lck5v
ZGU6OnJlbW92ZUNoaWxkcmVuKCkKIAogICAgIC8vIERvIGFueSBwcmVwIHdvcmsgbmVlZGVkIGJl
Zm9yZSBhY3R1YWxseSBzdGFydGluZyB0byBkZXRhY2gKICAgICAvLyBhbmQgcmVtb3ZlLi4uIGUu
Zy4gc3RvcCBsb2FkaW5nIGZyYW1lcywgZmlyZSB1bmxvYWQgZXZlbnRzLgotICAgIHdpbGxSZW1v
dmVDaGlsZHJlbih0aGlzKTsKKyAgICB3aWxsUmVtb3ZlQ2hpbGRyZW4oKnRoaXMpOwogCiAgICAg
Tm9kZVZlY3RvciByZW1vdmVkQ2hpbGRyZW47CiAgICAgewpAQCAtNjYyLDggKzY2NCw4IEBAIHZv
aWQgQ29udGFpbmVyTm9kZTo6cmVtb3ZlQ2hpbGRyZW4oKQogICAgICAgICAgICAgTm9FdmVudERp
c3BhdGNoQXNzZXJ0aW9uIGFzc2VydE5vRXZlbnREaXNwYXRjaDsKICAgICAgICAgICAgIHJlbW92
ZWRDaGlsZHJlbi5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KGNoaWxkTm9kZUNvdW50KCkpOwogICAg
ICAgICAgICAgd2hpbGUgKFJlZlB0cjxOb2RlPiBuID0gbV9maXJzdENoaWxkKSB7Ci0gICAgICAg
ICAgICAgICAgcmVtb3ZlZENoaWxkcmVuLmFwcGVuZChtX2ZpcnN0Q2hpbGQpOwotICAgICAgICAg
ICAgICAgIHJlbW92ZUJldHdlZW4oMCwgbV9maXJzdENoaWxkLT5uZXh0U2libGluZygpLCBtX2Zp
cnN0Q2hpbGQpOworICAgICAgICAgICAgICAgIHJlbW92ZWRDaGlsZHJlbi5hcHBlbmQoKm1fZmly
c3RDaGlsZCk7CisgICAgICAgICAgICAgICAgcmVtb3ZlQmV0d2VlbigwLCBtX2ZpcnN0Q2hpbGQt
Pm5leHRTaWJsaW5nKCksICptX2ZpcnN0Q2hpbGQpOwogICAgICAgICAgICAgfQogICAgICAgICB9
CiAKQEAgLTY3MSw3ICs2NzMsNyBAQCB2b2lkIENvbnRhaW5lck5vZGU6OnJlbW92ZUNoaWxkcmVu
KCkKICAgICAgICAgY2hpbGRyZW5DaGFuZ2VkKGNoYW5nZSk7CiAgICAgICAgIAogICAgICAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWRDaGlsZHJlbi5zaXplKCk7ICsraSkKLSAgICAg
ICAgICAgIENoaWxkTm9kZVJlbW92YWxOb3RpZmllcih0aGlzKS5ub3RpZnkocmVtb3ZlZENoaWxk
cmVuW2ldLmdldCgpKTsKKyAgICAgICAgICAgIENoaWxkTm9kZVJlbW92YWxOb3RpZmllcigqdGhp
cykubm90aWZ5KHJlbW92ZWRDaGlsZHJlbltpXS5nZXQoKSk7CiAgICAgfQogCiAgICAgZGlzcGF0
Y2hTdWJ0cmVlTW9kaWZpZWRFdmVudCgpOwpAQCAtNjk1LDcgKzY5Nyw3IEBAIGJvb2wgQ29udGFp
bmVyTm9kZTo6YXBwZW5kQ2hpbGQoUGFzc1JlZlAKICAgICAgICAgcmV0dXJuIG5ld0NoaWxkOwog
CiAgICAgTm9kZVZlY3RvciB0YXJnZXRzOwotICAgIGNvbGxlY3RDaGlsZHJlbkFuZFJlbW92ZUZy
b21PbGRQYXJlbnQobmV3Q2hpbGQuZ2V0KCksIHRhcmdldHMsIGVjKTsKKyAgICBjb2xsZWN0Q2hp
bGRyZW5BbmRSZW1vdmVGcm9tT2xkUGFyZW50KCpuZXdDaGlsZC5nZXQoKSwgdGFyZ2V0cywgZWMp
OwogICAgIGlmIChlYykKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC03MDksMjIgKzcxMSwy
MiBAQCBib29sIENvbnRhaW5lck5vZGU6OmFwcGVuZENoaWxkKFBhc3NSZWZQCiAgICAgSW5zcGVj
dG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsSW5zZXJ0RE9NTm9kZSgmZG9jdW1lbnQoKSwgdGhpcyk7
CiAKICAgICAvLyBOb3cgYWN0dWFsbHkgYWRkIHRoZSBjaGlsZChyZW4pCi0gICAgQ2hpbGRMaXN0
TXV0YXRpb25TY29wZSBtdXRhdGlvbih0aGlzKTsKLSAgICBmb3IgKE5vZGVWZWN0b3I6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gdGFyZ2V0cy5iZWdpbigpOyBpdCAhPSB0YXJnZXRzLmVuZCgpOyArK2l0
KSB7Ci0gICAgICAgIE5vZGUqIGNoaWxkID0gaXQtPmdldCgpOworICAgIENoaWxkTGlzdE11dGF0
aW9uU2NvcGUgbXV0YXRpb24oKnRoaXMpOworICAgIGZvciAoYXV0byBpdCA9IHRhcmdldHMuYmVn
aW4oKSwgZW5kID0gdGFyZ2V0cy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIE5v
ZGUmIGNoaWxkID0gaXQtPmdldCgpOwogCiAgICAgICAgIC8vIElmIHRoZSBjaGlsZCBoYXMgYSBw
YXJlbnQgYWdhaW4sIGp1c3Qgc3RvcCB3aGF0IHdlJ3JlIGRvaW5nLCBiZWNhdXNlCiAgICAgICAg
IC8vIHRoYXQgbWVhbnMgc29tZW9uZSBpcyBkb2luZyBzb21ldGhpbmcgd2l0aCBET00gbXV0YXRp
b24gLS0gY2FuJ3QgcmUtcGFyZW50CiAgICAgICAgIC8vIGEgY2hpbGQgdGhhdCBhbHJlYWR5IGhh
cyBhIHBhcmVudC4KLSAgICAgICAgaWYgKGNoaWxkLT5wYXJlbnROb2RlKCkpCisgICAgICAgIGlm
IChjaGlsZC5wYXJlbnROb2RlKCkpCiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICB0cmVl
U2NvcGUoKS0+YWRvcHRJZk5lZWRlZChjaGlsZCk7CisgICAgICAgIHRyZWVTY29wZSgpLT5hZG9w
dElmTmVlZGVkKCZjaGlsZCk7CiAKICAgICAgICAgLy8gQXBwZW5kIGNoaWxkIHRvIHRoZSBlbmQg
b2YgdGhlIGxpc3QKICAgICAgICAgewogICAgICAgICAgICAgTm9FdmVudERpc3BhdGNoQXNzZXJ0
aW9uIGFzc2VydE5vRXZlbnREaXNwYXRjaDsKLSAgICAgICAgICAgIGFwcGVuZENoaWxkVG9Db250
YWluZXIoY2hpbGQsIHRoaXMpOworICAgICAgICAgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcigm
Y2hpbGQsICp0aGlzKTsKICAgICAgICAgfQogCiAgICAgICAgIHVwZGF0ZVRyZWVBZnRlckluc2Vy
dGlvbihjaGlsZCwgYXR0YWNoQmVoYXZpb3IpOwpAQCAtNzQ5LDE3ICs3NTEsMTcgQEAgdm9pZCBD
b250YWluZXJOb2RlOjpwYXJzZXJBcHBlbmRDaGlsZChQYQogICAgIHsKICAgICAgICAgTm9FdmVu
dERpc3BhdGNoQXNzZXJ0aW9uIGFzc2VydE5vRXZlbnREaXNwYXRjaDsKICAgICAgICAgLy8gRklY
TUU6IFRoaXMgbWV0aG9kIHNob3VsZCB0YWtlIGEgUGFzc1JlZlB0ci4KLSAgICAgICAgYXBwZW5k
Q2hpbGRUb0NvbnRhaW5lcihuZXdDaGlsZC5nZXQoKSwgdGhpcyk7CisgICAgICAgIGFwcGVuZENo
aWxkVG9Db250YWluZXIobmV3Q2hpbGQuZ2V0KCksICp0aGlzKTsKICAgICAgICAgdHJlZVNjb3Bl
KCktPmFkb3B0SWZOZWVkZWQobmV3Q2hpbGQuZ2V0KCkpOwogICAgIH0KIAogICAgIG5ld0NoaWxk
LT51cGRhdGVBbmNlc3RvckNvbm5lY3RlZFN1YmZyYW1lQ291bnRGb3JJbnNlcnRpb24oKTsKIAot
ICAgIENoaWxkTGlzdE11dGF0aW9uU2NvcGUodGhpcykuY2hpbGRBZGRlZChuZXdDaGlsZC5nZXQo
KSk7CisgICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSgqdGhpcykuY2hpbGRBZGRlZCgqbmV3Q2hp
bGQpOwogCi0gICAgbm90aWZ5Q2hpbGRJbnNlcnRlZChuZXdDaGlsZC5nZXQoKSwgQ2hpbGRDaGFu
Z2VTb3VyY2VQYXJzZXIpOworICAgIG5vdGlmeUNoaWxkSW5zZXJ0ZWQoKm5ld0NoaWxkLCBDaGls
ZENoYW5nZVNvdXJjZVBhcnNlcik7CiAKLSAgICBDaGlsZE5vZGVJbnNlcnRpb25Ob3RpZmllcih0
aGlzKS5ub3RpZnkobmV3Q2hpbGQuZ2V0KCkpOworICAgIENoaWxkTm9kZUluc2VydGlvbk5vdGlm
aWVyKCp0aGlzKS5ub3RpZnkoKm5ld0NoaWxkKTsKIH0KIAogdm9pZCBDb250YWluZXJOb2RlOjpz
dXNwZW5kUG9zdEF0dGFjaENhbGxiYWNrcygpCkBAIC04NDAsNyArODQyLDcgQEAgdm9pZCBDb250
YWluZXJOb2RlOjpjaGlsZHJlbkNoYW5nZWQoY29ucwogewogICAgIGRvY3VtZW50KCkuaW5jRE9N
VHJlZVZlcnNpb24oKTsKICAgICBpZiAoY2hhbmdlLnNvdXJjZSA9PSBDaGlsZENoYW5nZVNvdXJj
ZUFQSSAmJiBjaGFuZ2UudHlwZSAhPSBUZXh0Q2hhbmdlZCkKLSAgICAgICAgZG9jdW1lbnQoKS51
cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZCh0aGlzKTsKKyAgICAgICAgZG9jdW1lbnQo
KS51cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZCgqdGhpcyk7CiAgICAgaW52YWxpZGF0
ZU5vZGVMaXN0Q2FjaGVzSW5BbmNlc3RvcnMoKTsKIH0KIApAQCAtMTAyMiw0MCArMTAyNCw0MCBA
QCBOb2RlICpDb250YWluZXJOb2RlOjpjaGlsZE5vZGUodW5zaWduZWQgCiAgICAgcmV0dXJuIG47
CiB9CiAKLXN0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRJbnNlcnRpb25FdmVudHMoTm9kZSogY2hp
bGQpCitzdGF0aWMgdm9pZCBkaXNwYXRjaENoaWxkSW5zZXJ0aW9uRXZlbnRzKE5vZGUmIGNoaWxk
KQogewotICAgIGlmIChjaGlsZC0+aXNJblNoYWRvd1RyZWUoKSkKKyAgICBpZiAoY2hpbGQuaXNJ
blNoYWRvd1RyZWUoKSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgQVNTRVJUKCFOb0V2ZW50RGlz
cGF0Y2hBc3NlcnRpb246OmlzRXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKIAotICAgIFJlZlB0
cjxOb2RlPiBjID0gY2hpbGQ7Ci0gICAgUmVmPERvY3VtZW50PiBkb2N1bWVudChjaGlsZC0+ZG9j
dW1lbnQoKSk7CisgICAgUmVmUHRyPE5vZGU+IGMgPSAmY2hpbGQ7CisgICAgUmVmPERvY3VtZW50
PiBkb2N1bWVudChjaGlsZC5kb2N1bWVudCgpKTsKIAogICAgIGlmIChjLT5wYXJlbnROb2RlKCkg
JiYgZG9jdW1lbnQtPmhhc0xpc3RlbmVyVHlwZShEb2N1bWVudDo6RE9NTk9ERUlOU0VSVEVEX0xJ
U1RFTkVSKSkKICAgICAgICAgYy0+ZGlzcGF0Y2hTY29wZWRFdmVudChNdXRhdGlvbkV2ZW50Ojpj
cmVhdGUoZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZEV2ZW50LCB0cnVlLCBjLT5wYXJlbnRO
b2RlKCkpKTsKIAogICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlSW5zZXJ0ZWRJbnRvRG9jdW1l
bnQgZXZlbnQgdG8gYWxsIGRlc2NlbmRhbnRzCiAgICAgaWYgKGMtPmluRG9jdW1lbnQoKSAmJiBk
b2N1bWVudC0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01OT0RFSU5TRVJURURJTlRPRE9D
VU1FTlRfTElTVEVORVIpKSB7Ci0gICAgICAgIGZvciAoOyBjOyBjID0gTm9kZVRyYXZlcnNhbDo6
bmV4dChjLmdldCgpLCBjaGlsZCkpCisgICAgICAgIGZvciAoOyBjOyBjID0gTm9kZVRyYXZlcnNh
bDo6bmV4dChjLmdldCgpLCAmY2hpbGQpKQogICAgICAgICAgICAgYy0+ZGlzcGF0Y2hTY29wZWRF
dmVudChNdXRhdGlvbkV2ZW50OjpjcmVhdGUoZXZlbnROYW1lcygpLkRPTU5vZGVJbnNlcnRlZElu
dG9Eb2N1bWVudEV2ZW50LCBmYWxzZSkpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZGlzcGF0
Y2hDaGlsZFJlbW92YWxFdmVudHMoTm9kZSogY2hpbGQpCitzdGF0aWMgdm9pZCBkaXNwYXRjaENo
aWxkUmVtb3ZhbEV2ZW50cyhOb2RlJiBjaGlsZCkKIHsKLSAgICBpZiAoY2hpbGQtPmlzSW5TaGFk
b3dUcmVlKCkpIHsKLSAgICAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUmVtb3Zl
RE9NTm9kZSgmY2hpbGQtPmRvY3VtZW50KCksIGNoaWxkKTsKKyAgICBpZiAoY2hpbGQuaXNJblNo
YWRvd1RyZWUoKSkgeworICAgICAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRpb246OndpbGxSZW1v
dmVET01Ob2RlKCZjaGlsZC5kb2N1bWVudCgpLCAmY2hpbGQpOwogICAgICAgICByZXR1cm47CiAg
ICAgfQogCiAgICAgQVNTRVJUKCFOb0V2ZW50RGlzcGF0Y2hBc3NlcnRpb246OmlzRXZlbnREaXNw
YXRjaEZvcmJpZGRlbigpKTsKIAotICAgIHdpbGxDcmVhdGVQb3NzaWJseU9ycGhhbmVkVHJlZUJ5
UmVtb3ZhbChjaGlsZCk7Ci0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxsUmVtb3Zl
RE9NTm9kZSgmY2hpbGQtPmRvY3VtZW50KCksIGNoaWxkKTsKKyAgICB3aWxsQ3JlYXRlUG9zc2li
bHlPcnBoYW5lZFRyZWVCeVJlbW92YWwoJmNoaWxkKTsKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50
YXRpb246OndpbGxSZW1vdmVET01Ob2RlKCZjaGlsZC5kb2N1bWVudCgpLCAmY2hpbGQpOwogCi0g
ICAgUmVmUHRyPE5vZGU+IGMgPSBjaGlsZDsKLSAgICBSZWY8RG9jdW1lbnQ+IGRvY3VtZW50KGNo
aWxkLT5kb2N1bWVudCgpKTsKKyAgICBSZWZQdHI8Tm9kZT4gYyA9ICZjaGlsZDsKKyAgICBSZWY8
RG9jdW1lbnQ+IGRvY3VtZW50KGNoaWxkLmRvY3VtZW50KCkpOwogCiAgICAgLy8gZGlzcGF0Y2gg
cHJlLXJlbW92YWwgbXV0YXRpb24gZXZlbnRzCiAgICAgaWYgKGMtPnBhcmVudE5vZGUoKSAmJiBk
b2N1bWVudC0+aGFzTGlzdGVuZXJUeXBlKERvY3VtZW50OjpET01OT0RFUkVNT1ZFRF9MSVNURU5F
UikpCkBAIC0xMDYzLDMwICsxMDY1LDMwIEBAIHN0YXRpYyB2b2lkIGRpc3BhdGNoQ2hpbGRSZW1v
dmFsRXZlbnRzKE4KIAogICAgIC8vIGRpc3BhdGNoIHRoZSBET01Ob2RlUmVtb3ZlZEZyb21Eb2N1
bWVudCBldmVudCB0byBhbGwgZGVzY2VuZGFudHMKICAgICBpZiAoYy0+aW5Eb2N1bWVudCgpICYm
IGRvY3VtZW50LT5oYXNMaXN0ZW5lclR5cGUoRG9jdW1lbnQ6OkRPTU5PREVSRU1PVkVERlJPTURP
Q1VNRU5UX0xJU1RFTkVSKSkgewotICAgICAgICBmb3IgKDsgYzsgYyA9IE5vZGVUcmF2ZXJzYWw6
Om5leHQoYy5nZXQoKSwgY2hpbGQpKQorICAgICAgICBmb3IgKDsgYzsgYyA9IE5vZGVUcmF2ZXJz
YWw6Om5leHQoYy5nZXQoKSwgJmNoaWxkKSkKICAgICAgICAgICAgIGMtPmRpc3BhdGNoU2NvcGVk
RXZlbnQoTXV0YXRpb25FdmVudDo6Y3JlYXRlKGV2ZW50TmFtZXMoKS5ET01Ob2RlUmVtb3ZlZEZy
b21Eb2N1bWVudEV2ZW50LCBmYWxzZSkpOwogICAgIH0KIH0KIAotdm9pZCBDb250YWluZXJOb2Rl
Ojp1cGRhdGVUcmVlQWZ0ZXJJbnNlcnRpb24oTm9kZSogY2hpbGQsIEF0dGFjaEJlaGF2aW9yIGF0
dGFjaEJlaGF2aW9yKQordm9pZCBDb250YWluZXJOb2RlOjp1cGRhdGVUcmVlQWZ0ZXJJbnNlcnRp
b24oTm9kZSYgY2hpbGQsIEF0dGFjaEJlaGF2aW9yIGF0dGFjaEJlaGF2aW9yKQogewotICAgIEFT
U0VSVChjaGlsZC0+cmVmQ291bnQoKSk7CisgICAgQVNTRVJUKGNoaWxkLnJlZkNvdW50KCkpOwog
Ci0gICAgQ2hpbGRMaXN0TXV0YXRpb25TY29wZSh0aGlzKS5jaGlsZEFkZGVkKGNoaWxkKTsKKyAg
ICBDaGlsZExpc3RNdXRhdGlvblNjb3BlKCp0aGlzKS5jaGlsZEFkZGVkKGNoaWxkKTsKIAogICAg
IG5vdGlmeUNoaWxkSW5zZXJ0ZWQoY2hpbGQsIENoaWxkQ2hhbmdlU291cmNlQVBJKTsKIAotICAg
IENoaWxkTm9kZUluc2VydGlvbk5vdGlmaWVyKHRoaXMpLm5vdGlmeShjaGlsZCk7CisgICAgQ2hp
bGROb2RlSW5zZXJ0aW9uTm90aWZpZXIoKnRoaXMpLm5vdGlmeShjaGlsZCk7CiAKICAgICAvLyBG
SVhNRTogQXR0YWNobWVudCBzaG91bGQgYmUgdGhlIGZpcnN0IG9wZXJhdGlvbiBpbiB0aGlzIGZ1
bmN0aW9uLCBidXQgc29tZSBjb2RlCiAgICAgLy8gKGZvciBleGFtcGxlLCBIVE1MRm9ybUNvbnRy
b2xFbGVtZW50J3MgYXV0b2ZvY3VzIHN1cHBvcnQpIHJlcXVpcmVzIHRoaXMgb3JkZXJpbmcuCi0g
ICAgaWYgKGF0dGFjaGVkKCkgJiYgIWNoaWxkLT5hdHRhY2hlZCgpICYmIGNoaWxkLT5wYXJlbnRO
b2RlKCkgPT0gdGhpcykgeworICAgIGlmIChhdHRhY2hlZCgpICYmICFjaGlsZC5hdHRhY2hlZCgp
ICYmIGNoaWxkLnBhcmVudE5vZGUoKSA9PSB0aGlzKSB7CiAgICAgICAgIGlmIChhdHRhY2hCZWhh
dmlvciA9PSBBdHRhY2hMYXppbHkpIHsKLSAgICAgICAgICAgIGlmIChjaGlsZC0+aXNFbGVtZW50
Tm9kZSgpKQotICAgICAgICAgICAgICAgIHRvRWxlbWVudChjaGlsZCktPmxhenlBdHRhY2goKTsK
LSAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLT5pc1RleHROb2RlKCkpIHsKLSAgICAgICAgICAg
ICAgICBjaGlsZC0+c2V0QXR0YWNoZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgY2hpbGQtPnNl
dE5lZWRzU3R5bGVSZWNhbGMoKTsKKyAgICAgICAgICAgIGlmIChjaGlsZC5pc0VsZW1lbnROb2Rl
KCkpCisgICAgICAgICAgICAgICAgdG9FbGVtZW50KGNoaWxkKS5sYXp5QXR0YWNoKCk7CisgICAg
ICAgICAgICBlbHNlIGlmIChjaGlsZC5pc1RleHROb2RlKCkpIHsKKyAgICAgICAgICAgICAgICBj
aGlsZC5zZXRBdHRhY2hlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICBjaGlsZC5zZXROZWVkc1N0
eWxlUmVjYWxjKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAg
YXR0YWNoQ2hpbGQoY2hpbGQpOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5v
ZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5oCShy
ZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC0zOCw3ICszOCw3IEBAIHR5cGVkZWYgdm9pZCAoKk5vZGVDYWxsYmFj
aykoTm9kZSosIHVuc2kKIAogbmFtZXNwYWNlIFByaXZhdGUgeyAKICAgICB0ZW1wbGF0ZTxjbGFz
cyBHZW5lcmljTm9kZSwgY2xhc3MgR2VuZXJpY05vZGVDb250YWluZXI+Ci0gICAgdm9pZCBhZGRD
aGlsZE5vZGVzVG9EZWxldGlvblF1ZXVlKEdlbmVyaWNOb2RlKiYgaGVhZCwgR2VuZXJpY05vZGUq
JiB0YWlsLCBHZW5lcmljTm9kZUNvbnRhaW5lciopOworICAgIHZvaWQgYWRkQ2hpbGROb2Rlc1Rv
RGVsZXRpb25RdWV1ZShHZW5lcmljTm9kZSomIGhlYWQsIEdlbmVyaWNOb2RlKiYgdGFpbCwgR2Vu
ZXJpY05vZGVDb250YWluZXImKTsKIH07CiAKIGNsYXNzIE5vRXZlbnREaXNwYXRjaEFzc2VydGlv
biB7CkBAIC05OCw3ICs5OCw3IEBAIHB1YmxpYzoKICAgICAvLyBUaGV5IGRvbid0IHNlbmQgRE9N
IG11dGF0aW9uIGV2ZW50cyBvciBoYW5kbGUgcmVwYXJlbnRpbmcuCiAgICAgLy8gSG93ZXZlciwg
YXJiaXRyYXJ5IGNvZGUgbWF5IGJlIHJ1biBieSBiZWZvcmVsb2FkIGhhbmRsZXJzLgogICAgIHZv
aWQgcGFyc2VyQXBwZW5kQ2hpbGQoUGFzc1JlZlB0cjxOb2RlPik7Ci0gICAgdm9pZCBwYXJzZXJS
ZW1vdmVDaGlsZChOb2RlKik7CisgICAgdm9pZCBwYXJzZXJSZW1vdmVDaGlsZChOb2RlJik7CiAg
ICAgdm9pZCBwYXJzZXJJbnNlcnRCZWZvcmUoUGFzc1JlZlB0cjxOb2RlPiBuZXdDaGlsZCwgTm9k
ZSogcmVmQ2hpbGQpOwogCiAgICAgdm9pZCByZW1vdmVDaGlsZHJlbigpOwpAQCAtMTMzLDE4ICsx
MzMsMTggQEAgcHJvdGVjdGVkOgogICAgIHN0YXRpYyBib29sIHBvc3RBdHRhY2hDYWxsYmFja3NB
cmVTdXNwZW5kZWQoKTsKIAogICAgIHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFzcyBH
ZW5lcmljTm9kZUNvbnRhaW5lcj4KLSAgICBmcmllbmQgdm9pZCBhcHBlbmRDaGlsZFRvQ29udGFp
bmVyKEdlbmVyaWNOb2RlKiBjaGlsZCwgR2VuZXJpY05vZGVDb250YWluZXIqKTsKKyAgICBmcmll
bmQgdm9pZCBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKEdlbmVyaWNOb2RlKiBjaGlsZCwgR2VuZXJp
Y05vZGVDb250YWluZXImKTsKIAogICAgIHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFz
cyBHZW5lcmljTm9kZUNvbnRhaW5lcj4KLSAgICBmcmllbmQgdm9pZCBQcml2YXRlOjphZGRDaGls
ZE5vZGVzVG9EZWxldGlvblF1ZXVlKEdlbmVyaWNOb2RlKiYgaGVhZCwgR2VuZXJpY05vZGUqJiB0
YWlsLCBHZW5lcmljTm9kZUNvbnRhaW5lciopOworICAgIGZyaWVuZCB2b2lkIFByaXZhdGU6OmFk
ZENoaWxkTm9kZXNUb0RlbGV0aW9uUXVldWUoR2VuZXJpY05vZGUqJiBoZWFkLCBHZW5lcmljTm9k
ZSomIHRhaWwsIEdlbmVyaWNOb2RlQ29udGFpbmVyJik7CiAKICAgICB2b2lkIHJlbW92ZURldGFj
aGVkQ2hpbGRyZW4oKTsKICAgICB2b2lkIHNldEZpcnN0Q2hpbGQoTm9kZSogY2hpbGQpIHsgbV9m
aXJzdENoaWxkID0gY2hpbGQ7IH0KICAgICB2b2lkIHNldExhc3RDaGlsZChOb2RlKiBjaGlsZCkg
eyBtX2xhc3RDaGlsZCA9IGNoaWxkOyB9CiAKIHByaXZhdGU6Ci0gICAgdm9pZCByZW1vdmVCZXR3
ZWVuKE5vZGUqIHByZXZpb3VzQ2hpbGQsIE5vZGUqIG5leHRDaGlsZCwgTm9kZSogb2xkQ2hpbGQp
OwotICAgIHZvaWQgaW5zZXJ0QmVmb3JlQ29tbW9uKE5vZGUqIG5leHRDaGlsZCwgTm9kZSogb2xk
Q2hpbGQpOworICAgIHZvaWQgcmVtb3ZlQmV0d2VlbihOb2RlKiBwcmV2aW91c0NoaWxkLCBOb2Rl
KiBuZXh0Q2hpbGQsIE5vZGUmIG9sZENoaWxkKTsKKyAgICB2b2lkIGluc2VydEJlZm9yZUNvbW1v
bihOb2RlJiBuZXh0Q2hpbGQsIE5vZGUmIG9sZENoaWxkKTsKIAogICAgIHN0YXRpYyB2b2lkIGRp
c3BhdGNoUG9zdEF0dGFjaENhbGxiYWNrcygpOwogICAgIHZvaWQgc3VzcGVuZFBvc3RBdHRhY2hD
YWxsYmFja3MoKTsKQEAgLTE1MywxMCArMTUzLDEwIEBAIHByaXZhdGU6CiAgICAgYm9vbCBnZXRV
cHBlckxlZnRDb3JuZXIoRmxvYXRQb2ludCYpIGNvbnN0OwogICAgIGJvb2wgZ2V0TG93ZXJSaWdo
dENvcm5lcihGbG9hdFBvaW50JikgY29uc3Q7CiAKLSAgICB2b2lkIG5vdGlmeUNoaWxkSW5zZXJ0
ZWQoTm9kZSogY2hpbGQsIENoaWxkQ2hhbmdlU291cmNlKTsKLSAgICB2b2lkIG5vdGlmeUNoaWxk
UmVtb3ZlZChOb2RlKiBjaGlsZCwgTm9kZSogcHJldmlvdXNTaWJsaW5nLCBOb2RlKiBuZXh0U2li
bGluZywgQ2hpbGRDaGFuZ2VTb3VyY2UpOworICAgIHZvaWQgbm90aWZ5Q2hpbGRJbnNlcnRlZChO
b2RlJiBjaGlsZCwgQ2hpbGRDaGFuZ2VTb3VyY2UpOworICAgIHZvaWQgbm90aWZ5Q2hpbGRSZW1v
dmVkKE5vZGUmIGNoaWxkLCBOb2RlKiBwcmV2aW91c1NpYmxpbmcsIE5vZGUqIG5leHRTaWJsaW5n
LCBDaGlsZENoYW5nZVNvdXJjZSk7CiAKLSAgICB2b2lkIHVwZGF0ZVRyZWVBZnRlckluc2VydGlv
bihOb2RlKiBjaGlsZCwgQXR0YWNoQmVoYXZpb3IpOworICAgIHZvaWQgdXBkYXRlVHJlZUFmdGVy
SW5zZXJ0aW9uKE5vZGUmIGNoaWxkLCBBdHRhY2hCZWhhdmlvcik7CiAKICAgICBib29sIGlzQ29u
dGFpbmVyTm9kZSgpIGNvbnN0IFdURl9ERUxFVEVEX0ZVTkNUSU9OOwogCkBAIC0xNzYsOCArMTc2
LDIwIEBAIGlubGluZSBjb25zdCBDb250YWluZXJOb2RlKiB0b0NvbnRhaW5lck4KICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ29udGFpbmVyTm9kZSo+KG5vZGUpOwogfQogCitpbmxpbmUg
Q29udGFpbmVyTm9kZSYgdG9Db250YWluZXJOb2RlKE5vZGUmIG5vZGUpCit7CisgICAgQVNTRVJU
X1dJVEhfU0VDVVJJVFlfSU1QTElDQVRJT04obm9kZS5pc0NvbnRhaW5lck5vZGUoKSk7CisgICAg
cmV0dXJuIHN0YXRpY19jYXN0PENvbnRhaW5lck5vZGUmPihub2RlKTsKK30KK2lubGluZSBjb25z
dCBDb250YWluZXJOb2RlJiB0b0NvbnRhaW5lck5vZGUoY29uc3QgTm9kZSYgbm9kZSkKK3sKKyAg
ICBBU1NFUlRfV0lUSF9TRUNVUklUWV9JTVBMSUNBVElPTihub2RlLmlzQ29udGFpbmVyTm9kZSgp
KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ29udGFpbmVyTm9kZSY+KG5vZGUpOwor
fQorCiAvLyBUaGlzIHdpbGwgY2F0Y2ggYW55b25lIGRvaW5nIGFuIHVubmVjZXNzYXJ5IGNhc3Qu
CiB2b2lkIHRvQ29udGFpbmVyTm9kZShjb25zdCBDb250YWluZXJOb2RlKik7Cit2b2lkIHRvQ29u
dGFpbmVyTm9kZShjb25zdCBDb250YWluZXJOb2RlJik7CiAKIGlubGluZSBDb250YWluZXJOb2Rl
OjpDb250YWluZXJOb2RlKERvY3VtZW50KiBkb2N1bWVudCwgQ29uc3RydWN0aW9uVHlwZSB0eXBl
KQogICAgIDogTm9kZShkb2N1bWVudCwgdHlwZSkKQEAgLTI0MCwyMSArMjUyLDIxIEBAIGlubGlu
ZSBib29sIE5vZGU6OmlzVHJlZVNjb3BlKCkgY29uc3QKIC8vIGZvciBhIE5vZGUgVmVjdG9yIHRo
YXQgaXMgdXNlZCB0byBzdG9yZSBjaGlsZCBOb2RlcyBvZiBhIGdpdmVuIE5vZGUuCiAvLyBGSVhN
RTogT3B0aW1pemUgdGhlIHZhbHVlLgogY29uc3QgaW50IGluaXRpYWxOb2RlVmVjdG9yU2l6ZSA9
IDExOwotdHlwZWRlZiBWZWN0b3I8UmVmUHRyPE5vZGU+LCBpbml0aWFsTm9kZVZlY3RvclNpemU+
IE5vZGVWZWN0b3I7Cit0eXBlZGVmIFZlY3RvcjxSZWY8Tm9kZT4sIGluaXRpYWxOb2RlVmVjdG9y
U2l6ZT4gTm9kZVZlY3RvcjsKIAotaW5saW5lIHZvaWQgZ2V0Q2hpbGROb2RlcyhOb2RlKiBub2Rl
LCBOb2RlVmVjdG9yJiBub2RlcykKK2lubGluZSB2b2lkIGdldENoaWxkTm9kZXMoTm9kZSYgbm9k
ZSwgTm9kZVZlY3RvciYgbm9kZXMpCiB7Ci0gICAgQVNTRVJUKCFub2Rlcy5zaXplKCkpOwotICAg
IGZvciAoTm9kZSogY2hpbGQgPSBub2RlLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNo
aWxkLT5uZXh0U2libGluZygpKQotICAgICAgICBub2Rlcy5hcHBlbmQoY2hpbGQpOworICAgIEFT
U0VSVChub2Rlcy5pc0VtcHR5KCkpOworICAgIGZvciAoTm9kZSogY2hpbGQgPSBub2RlLmZpcnN0
Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpCisgICAgICAgIG5v
ZGVzLmFwcGVuZCgqY2hpbGQpOwogfQogCiBjbGFzcyBDaGlsZE5vZGVzTGF6eVNuYXBzaG90IHsK
ICAgICBXVEZfTUFLRV9OT05DT1BZQUJMRShDaGlsZE5vZGVzTGF6eVNuYXBzaG90KTsKICAgICBX
VEZfTUFLRV9GQVNUX0FMTE9DQVRFRDsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBDaGlsZE5vZGVz
TGF6eVNuYXBzaG90KE5vZGUqIHBhcmVudE5vZGUpCi0gICAgICAgIDogbV9jdXJyZW50Tm9kZShw
YXJlbnROb2RlLT5maXJzdENoaWxkKCkpCisgICAgZXhwbGljaXQgQ2hpbGROb2Rlc0xhenlTbmFw
c2hvdChOb2RlJiBwYXJlbnROb2RlKQorICAgICAgICA6IG1fY3VycmVudE5vZGUocGFyZW50Tm9k
ZS5maXJzdENoaWxkKCkpCiAgICAgICAgICwgbV9jdXJyZW50SW5kZXgoMCkKICAgICB7CiAgICAg
ICAgIG1fbmV4dFNuYXBzaG90ID0gbGF0ZXN0U25hcHNob3Q7CkluZGV4OiBTb3VyY2UvV2ViQ29y
ZS9kb20vQ29udGFpbmVyTm9kZUFsZ29yaXRobXMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2RvbS9Db250YWluZXJOb2RlQWxnb3JpdGhtcy5jcHAJKHJldmlzaW9uIDE1NjI1MCkK
KysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Db250YWluZXJOb2RlQWxnb3JpdGhtcy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTMxLDk4ICszMSw5OCBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXZv
aWQgQ2hpbGROb2RlSW5zZXJ0aW9uTm90aWZpZXI6Om5vdGlmeURlc2NlbmRhbnRJbnNlcnRlZElu
dG9Eb2N1bWVudChDb250YWluZXJOb2RlKiBub2RlKQordm9pZCBDaGlsZE5vZGVJbnNlcnRpb25O
b3RpZmllcjo6bm90aWZ5RGVzY2VuZGFudEluc2VydGVkSW50b0RvY3VtZW50KENvbnRhaW5lck5v
ZGUmIG5vZGUpCiB7CiAgICAgQ2hpbGROb2Rlc0xhenlTbmFwc2hvdCBzbmFwc2hvdChub2RlKTsK
ICAgICB3aGlsZSAoUmVmUHRyPE5vZGU+IGNoaWxkID0gc25hcHNob3QubmV4dE5vZGUoKSkgewog
ICAgICAgICAvLyBJZiB3ZSBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBkb2N1bWVudCBkdXJp
bmcgdGhpcyBsb29wLCB0aGVuCiAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gdGVsbCB0aGUg
cmVzdCBvZiBvdXIgY2hpbGRyZW4gdGhhdCB0aGV5J3ZlIGJlZW4KICAgICAgICAgLy8gaW5zZXJ0
ZWQgaW50byB0aGUgZG9jdW1lbnQgYmVjYXVzZSB0aGV5IGhhdmVuJ3QuCi0gICAgICAgIGlmIChu
b2RlLT5pbkRvY3VtZW50KCkgJiYgY2hpbGQtPnBhcmVudE5vZGUoKSA9PSBub2RlKQotICAgICAg
ICAgICAgbm90aWZ5Tm9kZUluc2VydGVkSW50b0RvY3VtZW50KGNoaWxkLmdldCgpKTsKKyAgICAg
ICAgaWYgKG5vZGUuaW5Eb2N1bWVudCgpICYmIGNoaWxkLT5wYXJlbnROb2RlKCkgPT0gJm5vZGUp
CisgICAgICAgICAgICBub3RpZnlOb2RlSW5zZXJ0ZWRJbnRvRG9jdW1lbnQoKmNoaWxkLmdldCgp
KTsKICAgICB9CiAKLSAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICBpZiAoIW5v
ZGUuaXNFbGVtZW50Tm9kZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoUmVmUHRyPFNo
YWRvd1Jvb3Q+IHJvb3QgPSB0b0VsZW1lbnQobm9kZSktPnNoYWRvd1Jvb3QoKSkgewotICAgICAg
ICBpZiAobm9kZS0+aW5Eb2N1bWVudCgpICYmIHJvb3QtPmhvc3RFbGVtZW50KCkgPT0gbm9kZSkK
LSAgICAgICAgICAgIG5vdGlmeU5vZGVJbnNlcnRlZEludG9Eb2N1bWVudChyb290LmdldCgpKTsK
KyAgICBpZiAoUmVmUHRyPFNoYWRvd1Jvb3Q+IHJvb3QgPSB0b0VsZW1lbnQobm9kZSkuc2hhZG93
Um9vdCgpKSB7CisgICAgICAgIGlmIChub2RlLmluRG9jdW1lbnQoKSAmJiByb290LT5ob3N0RWxl
bWVudCgpID09ICZub2RlKQorICAgICAgICAgICAgbm90aWZ5Tm9kZUluc2VydGVkSW50b0RvY3Vt
ZW50KCpyb290LmdldCgpKTsKICAgICB9CiB9CiAKLXZvaWQgQ2hpbGROb2RlSW5zZXJ0aW9uTm90
aWZpZXI6Om5vdGlmeURlc2NlbmRhbnRJbnNlcnRlZEludG9UcmVlKENvbnRhaW5lck5vZGUqIG5v
ZGUpCit2b2lkIENoaWxkTm9kZUluc2VydGlvbk5vdGlmaWVyOjpub3RpZnlEZXNjZW5kYW50SW5z
ZXJ0ZWRJbnRvVHJlZShDb250YWluZXJOb2RlJiBub2RlKQogewotICAgIGZvciAoTm9kZSogY2hp
bGQgPSBub2RlLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGlu
ZygpKSB7CisgICAgZm9yIChOb2RlKiBjaGlsZCA9IG5vZGUuZmlyc3RDaGlsZCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewogICAgICAgICBpZiAoY2hpbGQtPmlzQ29u
dGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgbm90aWZ5Tm9kZUluc2VydGVkSW50b1RyZWUodG9D
b250YWluZXJOb2RlKGNoaWxkKSk7CisgICAgICAgICAgICBub3RpZnlOb2RlSW5zZXJ0ZWRJbnRv
VHJlZSgqdG9Db250YWluZXJOb2RlKGNoaWxkKSk7CiAgICAgfQogCi0gICAgaWYgKFNoYWRvd1Jv
b3QqIHJvb3QgPSBub2RlLT5zaGFkb3dSb290KCkpCi0gICAgICAgIG5vdGlmeU5vZGVJbnNlcnRl
ZEludG9UcmVlKHJvb3QpOworICAgIGlmIChTaGFkb3dSb290KiByb290ID0gbm9kZS5zaGFkb3dS
b290KCkpCisgICAgICAgIG5vdGlmeU5vZGVJbnNlcnRlZEludG9UcmVlKCpyb290KTsKIH0KIAot
dm9pZCBDaGlsZE5vZGVSZW1vdmFsTm90aWZpZXI6Om5vdGlmeURlc2NlbmRhbnRSZW1vdmVkRnJv
bURvY3VtZW50KENvbnRhaW5lck5vZGUqIG5vZGUpCit2b2lkIENoaWxkTm9kZVJlbW92YWxOb3Rp
Zmllcjo6bm90aWZ5RGVzY2VuZGFudFJlbW92ZWRGcm9tRG9jdW1lbnQoQ29udGFpbmVyTm9kZSYg
bm9kZSkKIHsKICAgICBDaGlsZE5vZGVzTGF6eVNuYXBzaG90IHNuYXBzaG90KG5vZGUpOwogICAg
IHdoaWxlIChSZWZQdHI8Tm9kZT4gY2hpbGQgPSBzbmFwc2hvdC5uZXh0Tm9kZSgpKSB7CiAgICAg
ICAgIC8vIElmIHdlIGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgZG9jdW1lbnQgZHVyaW5nIHRoaXMg
bG9vcCwgdGhlbiB3ZQogICAgICAgICAvLyBkb24ndCB3YW50IHRvIHRlbGwgdGhlIHJlc3Qgb2Yg
b3VyIGNoaWxkcmVuIHRoYXQgdGhleSd2ZSBiZWVuCiAgICAgICAgIC8vIHJlbW92ZWQgZnJvbSB0
aGUgZG9jdW1lbnQgYmVjYXVzZSB0aGV5IGhhdmVuJ3QuCi0gICAgICAgIGlmICghbm9kZS0+aW5E
b2N1bWVudCgpICYmIGNoaWxkLT5wYXJlbnROb2RlKCkgPT0gbm9kZSkKLSAgICAgICAgICAgIG5v
dGlmeU5vZGVSZW1vdmVkRnJvbURvY3VtZW50KGNoaWxkLmdldCgpKTsKKyAgICAgICAgaWYgKCFu
b2RlLmluRG9jdW1lbnQoKSAmJiBjaGlsZC0+cGFyZW50Tm9kZSgpID09ICZub2RlKQorICAgICAg
ICAgICAgbm90aWZ5Tm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQoKmNoaWxkLmdldCgpKTsKICAgICB9
CiAKLSAgICBpZiAoIW5vZGUtPmlzRWxlbWVudE5vZGUoKSkKKyAgICBpZiAoIW5vZGUuaXNFbGVt
ZW50Tm9kZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAobm9kZS0+ZG9jdW1lbnQoKS5j
c3NUYXJnZXQoKSA9PSBub2RlKQotICAgICAgICBub2RlLT5kb2N1bWVudCgpLnNldENTU1Rhcmdl
dCgwKTsKKyAgICBpZiAobm9kZS5kb2N1bWVudCgpLmNzc1RhcmdldCgpID09ICZub2RlKQorICAg
ICAgICBub2RlLmRvY3VtZW50KCkuc2V0Q1NTVGFyZ2V0KDApOwogCi0gICAgaWYgKFJlZlB0cjxT
aGFkb3dSb290PiByb290ID0gdG9FbGVtZW50KG5vZGUpLT5zaGFkb3dSb290KCkpIHsKLSAgICAg
ICAgaWYgKCFub2RlLT5pbkRvY3VtZW50KCkgJiYgcm9vdC0+aG9zdEVsZW1lbnQoKSA9PSBub2Rl
KQotICAgICAgICAgICAgbm90aWZ5Tm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQocm9vdC5nZXQoKSk7
CisgICAgaWYgKFJlZlB0cjxTaGFkb3dSb290PiByb290ID0gdG9FbGVtZW50KG5vZGUpLnNoYWRv
d1Jvb3QoKSkgeworICAgICAgICBpZiAoIW5vZGUuaW5Eb2N1bWVudCgpICYmIHJvb3QtPmhvc3RF
bGVtZW50KCkgPT0gJm5vZGUpCisgICAgICAgICAgICBub3RpZnlOb2RlUmVtb3ZlZEZyb21Eb2N1
bWVudCgqcm9vdC5nZXQoKSk7CiAgICAgfQogfQogCi12b2lkIENoaWxkTm9kZVJlbW92YWxOb3Rp
Zmllcjo6bm90aWZ5RGVzY2VuZGFudFJlbW92ZWRGcm9tVHJlZShDb250YWluZXJOb2RlKiBub2Rl
KQordm9pZCBDaGlsZE5vZGVSZW1vdmFsTm90aWZpZXI6Om5vdGlmeURlc2NlbmRhbnRSZW1vdmVk
RnJvbVRyZWUoQ29udGFpbmVyTm9kZSYgbm9kZSkKIHsKLSAgICBmb3IgKE5vZGUqIGNoaWxkID0g
bm9kZS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkg
eworICAgIGZvciAoTm9kZSogY2hpbGQgPSBub2RlLmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxk
ID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgaWYgKGNoaWxkLT5pc0NvbnRhaW5l
ck5vZGUoKSkKLSAgICAgICAgICAgIG5vdGlmeU5vZGVSZW1vdmVkRnJvbVRyZWUodG9Db250YWlu
ZXJOb2RlKGNoaWxkKSk7CisgICAgICAgICAgICBub3RpZnlOb2RlUmVtb3ZlZEZyb21UcmVlKCp0
b0NvbnRhaW5lck5vZGUoY2hpbGQpKTsKICAgICB9CiAKLSAgICBpZiAoIW5vZGUtPmlzRWxlbWVu
dE5vZGUoKSkKKyAgICBpZiAoIW5vZGUuaXNFbGVtZW50Tm9kZSgpKQogICAgICAgICByZXR1cm47
CiAKLSAgICBpZiAoUmVmUHRyPFNoYWRvd1Jvb3Q+IHJvb3QgPSB0b0VsZW1lbnQobm9kZSktPnNo
YWRvd1Jvb3QoKSkKLSAgICAgICAgbm90aWZ5Tm9kZVJlbW92ZWRGcm9tVHJlZShyb290LmdldCgp
KTsKKyAgICBpZiAoUmVmUHRyPFNoYWRvd1Jvb3Q+IHJvb3QgPSB0b0VsZW1lbnQobm9kZSkuc2hh
ZG93Um9vdCgpKQorICAgICAgICBub3RpZnlOb2RlUmVtb3ZlZEZyb21UcmVlKCpyb290LmdldCgp
KTsKIH0KIAogI2lmbmRlZiBOREVCVUcKLXVuc2lnbmVkIGFzc2VydENvbm5lY3RlZFN1YnJhbWVD
b3VudElzQ29uc2lzdGVudChOb2RlKiBub2RlKQordW5zaWduZWQgYXNzZXJ0Q29ubmVjdGVkU3Vi
cmFtZUNvdW50SXNDb25zaXN0ZW50KE5vZGUmIG5vZGUpCiB7CiAgICAgdW5zaWduZWQgY291bnQg
PSAwOwogCi0gICAgaWYgKG5vZGUtPmlzRWxlbWVudE5vZGUoKSkgewotICAgICAgICBpZiAobm9k
ZS0+aXNGcmFtZU93bmVyRWxlbWVudCgpICYmIHRvRnJhbWVPd25lckVsZW1lbnQobm9kZSktPmNv
bnRlbnRGcmFtZSgpKQorICAgIGlmIChub2RlLmlzRWxlbWVudE5vZGUoKSkgeworICAgICAgICBp
ZiAobm9kZS5pc0ZyYW1lT3duZXJFbGVtZW50KCkgJiYgdG9GcmFtZU93bmVyRWxlbWVudChub2Rl
KS5jb250ZW50RnJhbWUoKSkKICAgICAgICAgICAgIGNvdW50Kys7CiAKLSAgICAgICAgaWYgKFNo
YWRvd1Jvb3QqIHJvb3QgPSB0b0VsZW1lbnQobm9kZSktPnNoYWRvd1Jvb3QoKSkKLSAgICAgICAg
ICAgIGNvdW50ICs9IGFzc2VydENvbm5lY3RlZFN1YnJhbWVDb3VudElzQ29uc2lzdGVudChyb290
KTsKKyAgICAgICAgaWYgKFNoYWRvd1Jvb3QqIHJvb3QgPSB0b0VsZW1lbnQobm9kZSkuc2hhZG93
Um9vdCgpKQorICAgICAgICAgICAgY291bnQgKz0gYXNzZXJ0Q29ubmVjdGVkU3VicmFtZUNvdW50
SXNDb25zaXN0ZW50KCpyb290KTsKICAgICB9CiAKLSAgICBmb3IgKE5vZGUqIGNoaWxkID0gbm9k
ZS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkKLSAg
ICAgICAgY291bnQgKz0gYXNzZXJ0Q29ubmVjdGVkU3VicmFtZUNvdW50SXNDb25zaXN0ZW50KGNo
aWxkKTsKKyAgICBmb3IgKE5vZGUqIGNoaWxkID0gbm9kZS5maXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKQorICAgICAgICBjb3VudCArPSBhc3NlcnRDb25u
ZWN0ZWRTdWJyYW1lQ291bnRJc0NvbnNpc3RlbnQoKmNoaWxkKTsKIAogICAgIC8vIElmIHdlIHVu
ZGVyY291bnQgdGhlcmUncyBwb3NzaWJseSBhIHNlY3VyaXR5IGJ1ZyBzaW5jZSB3ZSdkIGxlYXZl
IGZyYW1lcwogICAgIC8vIGluIHN1YnRyZWVzIG91dHNpZGUgdGhlIGRvY3VtZW50LgotICAgIEFT
U0VSVChub2RlLT5jb25uZWN0ZWRTdWJmcmFtZUNvdW50KCkgPj0gY291bnQpOworICAgIEFTU0VS
VChub2RlLmNvbm5lY3RlZFN1YmZyYW1lQ291bnQoKSA+PSBjb3VudCk7CiAKICAgICAvLyBJZiB3
ZSBvdmVyY291bnQgaXQncyBzYWZlLCBidXQgbm90IG9wdGltYWwgYmVjYXVzZSBpdCBtZWFucyB3
ZSdsbCB0cmF2ZXJzZQogICAgIC8vIHRocm91Z2ggdGhlIGRvY3VtZW50IGluIENoaWxkRnJhbWVE
aXNjb25uZWN0b3IgbG9va2luZyBmb3IgZnJhbWVzIHRoYXQgaGF2ZQogICAgIC8vIGFscmVhZHkg
YmVlbiBkaXNjb25uZWN0ZWQuCi0gICAgQVNTRVJUKG5vZGUtPmNvbm5lY3RlZFN1YmZyYW1lQ291
bnQoKSA9PSBjb3VudCk7CisgICAgQVNTRVJUKG5vZGUuY29ubmVjdGVkU3ViZnJhbWVDb3VudCgp
ID09IGNvdW50KTsKIAogICAgIHJldHVybiBjb3VudDsKIH0KSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L2RvbS9Db250YWluZXJOb2RlQWxnb3JpdGhtcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL2RvbS9Db250YWluZXJOb2RlQWxnb3JpdGhtcy5oCShyZXZpc2lvbiAxNTYyNTApCisrKyBT
b3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZUFsZ29yaXRobXMuaAkod29ya2luZyBjb3B5
KQpAQCAtMzYsNTIgKzM2LDUyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgQ2hpbGRO
b2RlSW5zZXJ0aW9uTm90aWZpZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IENoaWxkTm9kZUlu
c2VydGlvbk5vdGlmaWVyKENvbnRhaW5lck5vZGUqIGluc2VydGlvblBvaW50KQorICAgIGV4cGxp
Y2l0IENoaWxkTm9kZUluc2VydGlvbk5vdGlmaWVyKENvbnRhaW5lck5vZGUmIGluc2VydGlvblBv
aW50KQogICAgICAgICA6IG1faW5zZXJ0aW9uUG9pbnQoaW5zZXJ0aW9uUG9pbnQpCiAgICAgewog
ICAgIH0KIAotICAgIHZvaWQgbm90aWZ5KE5vZGUqKTsKKyAgICB2b2lkIG5vdGlmeShOb2RlJik7
CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBub3RpZnlEZXNjZW5kYW50SW5zZXJ0ZWRJbnRvRG9jdW1l
bnQoQ29udGFpbmVyTm9kZSopOwotICAgIHZvaWQgbm90aWZ5RGVzY2VuZGFudEluc2VydGVkSW50
b1RyZWUoQ29udGFpbmVyTm9kZSopOwotICAgIHZvaWQgbm90aWZ5Tm9kZUluc2VydGVkSW50b0Rv
Y3VtZW50KE5vZGUqKTsKLSAgICB2b2lkIG5vdGlmeU5vZGVJbnNlcnRlZEludG9UcmVlKENvbnRh
aW5lck5vZGUqKTsKKyAgICB2b2lkIG5vdGlmeURlc2NlbmRhbnRJbnNlcnRlZEludG9Eb2N1bWVu
dChDb250YWluZXJOb2RlJik7CisgICAgdm9pZCBub3RpZnlEZXNjZW5kYW50SW5zZXJ0ZWRJbnRv
VHJlZShDb250YWluZXJOb2RlJik7CisgICAgdm9pZCBub3RpZnlOb2RlSW5zZXJ0ZWRJbnRvRG9j
dW1lbnQoTm9kZSYpOworICAgIHZvaWQgbm90aWZ5Tm9kZUluc2VydGVkSW50b1RyZWUoQ29udGFp
bmVyTm9kZSYpOwogCi0gICAgQ29udGFpbmVyTm9kZSogbV9pbnNlcnRpb25Qb2ludDsKLSAgICBW
ZWN0b3I8IFJlZlB0cjxOb2RlPiA+IG1fcG9zdEluc2VydGlvbk5vdGlmaWNhdGlvblRhcmdldHM7
CisgICAgQ29udGFpbmVyTm9kZSYgbV9pbnNlcnRpb25Qb2ludDsKKyAgICBWZWN0b3I8UmVmUHRy
PE5vZGU+PiBtX3Bvc3RJbnNlcnRpb25Ob3RpZmljYXRpb25UYXJnZXRzOwogfTsKIAogY2xhc3Mg
Q2hpbGROb2RlUmVtb3ZhbE5vdGlmaWVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBDaGlsZE5v
ZGVSZW1vdmFsTm90aWZpZXIoQ29udGFpbmVyTm9kZSogaW5zZXJ0aW9uUG9pbnQpCisgICAgZXhw
bGljaXQgQ2hpbGROb2RlUmVtb3ZhbE5vdGlmaWVyKENvbnRhaW5lck5vZGUmIGluc2VydGlvblBv
aW50KQogICAgICAgICA6IG1faW5zZXJ0aW9uUG9pbnQoaW5zZXJ0aW9uUG9pbnQpCiAgICAgewog
ICAgIH0KIAotICAgIHZvaWQgbm90aWZ5KE5vZGUqKTsKKyAgICB2b2lkIG5vdGlmeShOb2RlJik7
CiAKIHByaXZhdGU6Ci0gICAgdm9pZCBub3RpZnlEZXNjZW5kYW50UmVtb3ZlZEZyb21Eb2N1bWVu
dChDb250YWluZXJOb2RlKik7Ci0gICAgdm9pZCBub3RpZnlEZXNjZW5kYW50UmVtb3ZlZEZyb21U
cmVlKENvbnRhaW5lck5vZGUqKTsKLSAgICB2b2lkIG5vdGlmeU5vZGVSZW1vdmVkRnJvbURvY3Vt
ZW50KE5vZGUqKTsKLSAgICB2b2lkIG5vdGlmeU5vZGVSZW1vdmVkRnJvbVRyZWUoQ29udGFpbmVy
Tm9kZSopOworICAgIHZvaWQgbm90aWZ5RGVzY2VuZGFudFJlbW92ZWRGcm9tRG9jdW1lbnQoQ29u
dGFpbmVyTm9kZSYpOworICAgIHZvaWQgbm90aWZ5RGVzY2VuZGFudFJlbW92ZWRGcm9tVHJlZShD
b250YWluZXJOb2RlJik7CisgICAgdm9pZCBub3RpZnlOb2RlUmVtb3ZlZEZyb21Eb2N1bWVudChO
b2RlJik7CisgICAgdm9pZCBub3RpZnlOb2RlUmVtb3ZlZEZyb21UcmVlKENvbnRhaW5lck5vZGUm
KTsKIAotICAgIENvbnRhaW5lck5vZGUqIG1faW5zZXJ0aW9uUG9pbnQ7CisgICAgQ29udGFpbmVy
Tm9kZSYgbV9pbnNlcnRpb25Qb2ludDsKIH07CiAKIG5hbWVzcGFjZSBQcml2YXRlIHsKIAogICAg
IHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFzcyBHZW5lcmljTm9kZUNvbnRhaW5lcj4K
LSAgICB2b2lkIGFkZENoaWxkTm9kZXNUb0RlbGV0aW9uUXVldWUoR2VuZXJpY05vZGUqJiBoZWFk
LCBHZW5lcmljTm9kZSomIHRhaWwsIEdlbmVyaWNOb2RlQ29udGFpbmVyKik7CisgICAgdm9pZCBh
ZGRDaGlsZE5vZGVzVG9EZWxldGlvblF1ZXVlKEdlbmVyaWNOb2RlKiYgaGVhZCwgR2VuZXJpY05v
ZGUqJiB0YWlsLCBHZW5lcmljTm9kZUNvbnRhaW5lciYpOwogCiB9CiAKIC8vIEhlbHBlciBmdW5j
dGlvbnMgZm9yIFRyZWVTaGFyZWQtZGVyaXZlZCBjbGFzc2VzLCB3aGljaCBoYXZlIGEgJ05vZGUn
IHN0eWxlIGludGVyZmFjZQogLy8gVGhpcyBhcHBsaWVzIHRvICdDb250YWluZXJOb2RlJyBhbmQg
J1NWR0VsZW1lbnRJbnN0YW5jZScKIHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFzcyBH
ZW5lcmljTm9kZUNvbnRhaW5lcj4KLWlubGluZSB2b2lkIHJlbW92ZURldGFjaGVkQ2hpbGRyZW5J
bkNvbnRhaW5lcihHZW5lcmljTm9kZUNvbnRhaW5lciogY29udGFpbmVyKQoraW5saW5lIHZvaWQg
cmVtb3ZlRGV0YWNoZWRDaGlsZHJlbkluQ29udGFpbmVyKEdlbmVyaWNOb2RlQ29udGFpbmVyJiBj
b250YWluZXIpCiB7CiAgICAgLy8gTGlzdCBvZiBub2RlcyB0byBiZSBkZWxldGVkLgogICAgIEdl
bmVyaWNOb2RlKiBoZWFkID0gMDsKQEAgLTEwMiwyNSArMTAyLDI1IEBAIGlubGluZSB2b2lkIHJl
bW92ZURldGFjaGVkQ2hpbGRyZW5JbkNvbnQKICAgICAgICAgICAgIHRhaWwgPSAwOwogCiAgICAg
ICAgIGlmIChuLT5oYXNDaGlsZE5vZGVzKCkpCi0gICAgICAgICAgICBQcml2YXRlOjphZGRDaGls
ZE5vZGVzVG9EZWxldGlvblF1ZXVlPEdlbmVyaWNOb2RlLCBHZW5lcmljTm9kZUNvbnRhaW5lcj4o
aGVhZCwgdGFpbCwgc3RhdGljX2Nhc3Q8R2VuZXJpY05vZGVDb250YWluZXIqPihuKSk7CisgICAg
ICAgICAgICBQcml2YXRlOjphZGRDaGlsZE5vZGVzVG9EZWxldGlvblF1ZXVlPEdlbmVyaWNOb2Rl
LCBHZW5lcmljTm9kZUNvbnRhaW5lcj4oaGVhZCwgdGFpbCwgKnN0YXRpY19jYXN0PEdlbmVyaWNO
b2RlQ29udGFpbmVyKj4obikpOwogCiAgICAgICAgIGRlbGV0ZSBuOwogICAgIH0KIH0KIAogdGVt
cGxhdGU8Y2xhc3MgR2VuZXJpY05vZGUsIGNsYXNzIEdlbmVyaWNOb2RlQ29udGFpbmVyPgotaW5s
aW5lIHZvaWQgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcihHZW5lcmljTm9kZSogY2hpbGQsIEdlbmVy
aWNOb2RlQ29udGFpbmVyKiBjb250YWluZXIpCitpbmxpbmUgdm9pZCBhcHBlbmRDaGlsZFRvQ29u
dGFpbmVyKEdlbmVyaWNOb2RlKiBjaGlsZCwgR2VuZXJpY05vZGVDb250YWluZXImIGNvbnRhaW5l
cikKIHsKLSAgICBjaGlsZC0+c2V0UGFyZW50Tm9kZShjb250YWluZXIpOworICAgIGNoaWxkLT5z
ZXRQYXJlbnROb2RlKCZjb250YWluZXIpOwogCi0gICAgR2VuZXJpY05vZGUqIGxhc3RDaGlsZCA9
IGNvbnRhaW5lci0+bGFzdENoaWxkKCk7CisgICAgR2VuZXJpY05vZGUqIGxhc3RDaGlsZCA9IGNv
bnRhaW5lci5sYXN0Q2hpbGQoKTsKICAgICBpZiAobGFzdENoaWxkKSB7CiAgICAgICAgIGNoaWxk
LT5zZXRQcmV2aW91c1NpYmxpbmcobGFzdENoaWxkKTsKICAgICAgICAgbGFzdENoaWxkLT5zZXRO
ZXh0U2libGluZyhjaGlsZCk7CiAgICAgfSBlbHNlCi0gICAgICAgIGNvbnRhaW5lci0+c2V0Rmly
c3RDaGlsZChjaGlsZCk7CisgICAgICAgIGNvbnRhaW5lci5zZXRGaXJzdENoaWxkKGNoaWxkKTsK
IAotICAgIGNvbnRhaW5lci0+c2V0TGFzdENoaWxkKGNoaWxkKTsKKyAgICBjb250YWluZXIuc2V0
TGFzdENoaWxkKGNoaWxkKTsKIH0KIAogLy8gSGVscGVyIG1ldGhvZHMgZm9yIHJlbW92ZURldGFj
aGVkQ2hpbGRyZW5JbkNvbnRhaW5lciwgaGlkZGVuIGZyb20gV2ViQ29yZSBuYW1lc3BhY2UKQEAg
LTEyOCw3ICsxMjgsNyBAQCBuYW1lc3BhY2UgUHJpdmF0ZSB7CiAKICAgICB0ZW1wbGF0ZTxjbGFz
cyBHZW5lcmljTm9kZSwgY2xhc3MgR2VuZXJpY05vZGVDb250YWluZXIsIGJvb2wgZGlzcGF0Y2hS
ZW1vdmFsTm90aWZpY2F0aW9uPgogICAgIHN0cnVjdCBOb2RlUmVtb3ZhbERpc3BhdGNoZXIgewot
ICAgICAgICBzdGF0aWMgdm9pZCBkaXNwYXRjaChHZW5lcmljTm9kZSosIEdlbmVyaWNOb2RlQ29u
dGFpbmVyKikKKyAgICAgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2goR2VuZXJpY05vZGUmLCBHZW5l
cmljTm9kZUNvbnRhaW5lciYpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIG5vLW9wLCBieSBk
ZWZhdWx0CiAgICAgICAgIH0KQEAgLTEzNiwxMiArMTM2LDEyIEBAIG5hbWVzcGFjZSBQcml2YXRl
IHsKIAogICAgIHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFzcyBHZW5lcmljTm9kZUNv
bnRhaW5lcj4KICAgICBzdHJ1Y3QgTm9kZVJlbW92YWxEaXNwYXRjaGVyPEdlbmVyaWNOb2RlLCBH
ZW5lcmljTm9kZUNvbnRhaW5lciwgdHJ1ZT4gewotICAgICAgICBzdGF0aWMgdm9pZCBkaXNwYXRj
aChHZW5lcmljTm9kZSogbm9kZSwgR2VuZXJpY05vZGVDb250YWluZXIqIGNvbnRhaW5lcikKKyAg
ICAgICAgc3RhdGljIHZvaWQgZGlzcGF0Y2goR2VuZXJpY05vZGUmIG5vZGUsIEdlbmVyaWNOb2Rl
Q29udGFpbmVyJiBjb250YWluZXIpCiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIENsZWFuIHVw
IGFueSBUcmVlU2NvcGUgdG8gYSByZW1vdmVkIHRyZWUuCi0gICAgICAgICAgICBpZiAoRG9jdW1l
bnQqIGNvbnRhaW5lckRvY3VtZW50ID0gY29udGFpbmVyLT5vd25lckRvY3VtZW50KCkpCi0gICAg
ICAgICAgICAgICAgY29udGFpbmVyRG9jdW1lbnQtPmFkb3B0SWZOZWVkZWQobm9kZSk7Ci0gICAg
ICAgICAgICBpZiAobm9kZS0+aW5Eb2N1bWVudCgpKQorICAgICAgICAgICAgaWYgKERvY3VtZW50
KiBjb250YWluZXJEb2N1bWVudCA9IGNvbnRhaW5lci5vd25lckRvY3VtZW50KCkpCisgICAgICAg
ICAgICAgICAgY29udGFpbmVyRG9jdW1lbnQtPmFkb3B0SWZOZWVkZWQoJm5vZGUpOworICAgICAg
ICAgICAgaWYgKG5vZGUuaW5Eb2N1bWVudCgpKQogICAgICAgICAgICAgICAgIENoaWxkTm9kZVJl
bW92YWxOb3RpZmllcihjb250YWluZXIpLm5vdGlmeShub2RlKTsKICAgICAgICAgfQogICAgIH07
CkBAIC0xNTcsMTcgKzE1NywxNyBAQCBuYW1lc3BhY2UgUHJpdmF0ZSB7CiAgICAgfTsKIAogICAg
IHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBjbGFzcyBHZW5lcmljTm9kZUNvbnRhaW5lcj4K
LSAgICB2b2lkIGFkZENoaWxkTm9kZXNUb0RlbGV0aW9uUXVldWUoR2VuZXJpY05vZGUqJiBoZWFk
LCBHZW5lcmljTm9kZSomIHRhaWwsIEdlbmVyaWNOb2RlQ29udGFpbmVyKiBjb250YWluZXIpCisg
ICAgdm9pZCBhZGRDaGlsZE5vZGVzVG9EZWxldGlvblF1ZXVlKEdlbmVyaWNOb2RlKiYgaGVhZCwg
R2VuZXJpY05vZGUqJiB0YWlsLCBHZW5lcmljTm9kZUNvbnRhaW5lciYgY29udGFpbmVyKQogICAg
IHsKICAgICAgICAgLy8gV2UgaGF2ZSB0byB0ZWxsIGFsbCBjaGlsZHJlbiB0aGF0IHRoZWlyIHBh
cmVudCBoYXMgZGllZC4KICAgICAgICAgR2VuZXJpY05vZGUqIG5leHQgPSAwOwotICAgICAgICBm
b3IgKEdlbmVyaWNOb2RlKiBuID0gY29udGFpbmVyLT5maXJzdENoaWxkKCk7IG4gIT0gMDsgbiA9
IG5leHQpIHsKKyAgICAgICAgZm9yIChHZW5lcmljTm9kZSogbiA9IGNvbnRhaW5lci5maXJzdENo
aWxkKCk7IG4gIT0gMDsgbiA9IG5leHQpIHsKICAgICAgICAgICAgIEFTU0VSVCghbi0+bV9kZWxl
dGlvbkhhc0JlZ3VuKTsKIAogICAgICAgICAgICAgbmV4dCA9IG4tPm5leHRTaWJsaW5nKCk7CiAg
ICAgICAgICAgICBuLT5zZXROZXh0U2libGluZygwKTsKICAgICAgICAgICAgIG4tPnNldFBhcmVu
dE5vZGUoMCk7Ci0gICAgICAgICAgICBjb250YWluZXItPnNldEZpcnN0Q2hpbGQobmV4dCk7Cisg
ICAgICAgICAgICBjb250YWluZXIuc2V0Rmlyc3RDaGlsZChuZXh0KTsKICAgICAgICAgICAgIGlm
IChuZXh0KQogICAgICAgICAgICAgICAgIG5leHQtPnNldFByZXZpb3VzU2libGluZygwKTsKIApA
QCAtMTg1LDgwICsxODUsODAgQEAgbmFtZXNwYWNlIFByaXZhdGUgewogICAgICAgICAgICAgICAg
IHRhaWwgPSBuOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBSZWY8R2Vu
ZXJpY05vZGU+IHByb3RlY3QoKm4pOyAvLyByZW1vdmVkRnJvbURvY3VtZW50IG1heSByZW1vdmUg
cmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIHRoaXMgbm9kZS4KLSAgICAgICAgICAgICAgICBOb2Rl
UmVtb3ZhbERpc3BhdGNoZXI8R2VuZXJpY05vZGUsIEdlbmVyaWNOb2RlQ29udGFpbmVyLCBTaG91
bGREaXNwYXRjaFJlbW92YWxOb3RpZmljYXRpb248R2VuZXJpY05vZGU+Ojp2YWx1ZT46OmRpc3Bh
dGNoKG4sIGNvbnRhaW5lcik7CisgICAgICAgICAgICAgICAgTm9kZVJlbW92YWxEaXNwYXRjaGVy
PEdlbmVyaWNOb2RlLCBHZW5lcmljTm9kZUNvbnRhaW5lciwgU2hvdWxkRGlzcGF0Y2hSZW1vdmFs
Tm90aWZpY2F0aW9uPEdlbmVyaWNOb2RlPjo6dmFsdWU+OjpkaXNwYXRjaCgqbiwgY29udGFpbmVy
KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGNvbnRhaW5lci0+c2V0TGFz
dENoaWxkKDApOworICAgICAgICBjb250YWluZXIuc2V0TGFzdENoaWxkKDApOwogICAgIH0KIAog
fSAvLyBuYW1lc3BhY2UgUHJpdmF0ZQogCi1pbmxpbmUgdm9pZCBDaGlsZE5vZGVJbnNlcnRpb25O
b3RpZmllcjo6bm90aWZ5Tm9kZUluc2VydGVkSW50b0RvY3VtZW50KE5vZGUqIG5vZGUpCitpbmxp
bmUgdm9pZCBDaGlsZE5vZGVJbnNlcnRpb25Ob3RpZmllcjo6bm90aWZ5Tm9kZUluc2VydGVkSW50
b0RvY3VtZW50KE5vZGUmIG5vZGUpCiB7Ci0gICAgQVNTRVJUKG1faW5zZXJ0aW9uUG9pbnQtPmlu
RG9jdW1lbnQoKSk7Ci0gICAgUmVmPE5vZGU+IHByb3RlY3QoKm5vZGUpOwotICAgIGlmIChOb2Rl
OjpJbnNlcnRpb25TaG91bGRDYWxsRGlkTm90aWZ5U3VidHJlZUluc2VydGlvbnMgPT0gbm9kZS0+
aW5zZXJ0ZWRJbnRvKG1faW5zZXJ0aW9uUG9pbnQpKQotICAgICAgICBtX3Bvc3RJbnNlcnRpb25O
b3RpZmljYXRpb25UYXJnZXRzLmFwcGVuZChub2RlKTsKLSAgICBpZiAobm9kZS0+aXNDb250YWlu
ZXJOb2RlKCkpCisgICAgQVNTRVJUKG1faW5zZXJ0aW9uUG9pbnQuaW5Eb2N1bWVudCgpKTsKKyAg
ICBSZWY8Tm9kZT4gcHJvdGVjdChub2RlKTsKKyAgICBpZiAoTm9kZTo6SW5zZXJ0aW9uU2hvdWxk
Q2FsbERpZE5vdGlmeVN1YnRyZWVJbnNlcnRpb25zID09IG5vZGUuaW5zZXJ0ZWRJbnRvKCZtX2lu
c2VydGlvblBvaW50KSkKKyAgICAgICAgbV9wb3N0SW5zZXJ0aW9uTm90aWZpY2F0aW9uVGFyZ2V0
cy5hcHBlbmQoJm5vZGUpOworICAgIGlmIChub2RlLmlzQ29udGFpbmVyTm9kZSgpKQogICAgICAg
ICBub3RpZnlEZXNjZW5kYW50SW5zZXJ0ZWRJbnRvRG9jdW1lbnQodG9Db250YWluZXJOb2RlKG5v
ZGUpKTsKIH0KIAotaW5saW5lIHZvaWQgQ2hpbGROb2RlSW5zZXJ0aW9uTm90aWZpZXI6Om5vdGlm
eU5vZGVJbnNlcnRlZEludG9UcmVlKENvbnRhaW5lck5vZGUqIG5vZGUpCitpbmxpbmUgdm9pZCBD
aGlsZE5vZGVJbnNlcnRpb25Ob3RpZmllcjo6bm90aWZ5Tm9kZUluc2VydGVkSW50b1RyZWUoQ29u
dGFpbmVyTm9kZSYgbm9kZSkKIHsKICAgICBOb0V2ZW50RGlzcGF0Y2hBc3NlcnRpb24gYXNzZXJ0
Tm9FdmVudERpc3BhdGNoOwotICAgIEFTU0VSVCghbV9pbnNlcnRpb25Qb2ludC0+aW5Eb2N1bWVu
dCgpKTsKKyAgICBBU1NFUlQoIW1faW5zZXJ0aW9uUG9pbnQuaW5Eb2N1bWVudCgpKTsKIAotICAg
IGlmIChOb2RlOjpJbnNlcnRpb25TaG91bGRDYWxsRGlkTm90aWZ5U3VidHJlZUluc2VydGlvbnMg
PT0gbm9kZS0+aW5zZXJ0ZWRJbnRvKG1faW5zZXJ0aW9uUG9pbnQpKQotICAgICAgICBtX3Bvc3RJ
bnNlcnRpb25Ob3RpZmljYXRpb25UYXJnZXRzLmFwcGVuZChub2RlKTsKKyAgICBpZiAoTm9kZTo6
SW5zZXJ0aW9uU2hvdWxkQ2FsbERpZE5vdGlmeVN1YnRyZWVJbnNlcnRpb25zID09IG5vZGUuaW5z
ZXJ0ZWRJbnRvKCZtX2luc2VydGlvblBvaW50KSkKKyAgICAgICAgbV9wb3N0SW5zZXJ0aW9uTm90
aWZpY2F0aW9uVGFyZ2V0cy5hcHBlbmQoJm5vZGUpOwogICAgIG5vdGlmeURlc2NlbmRhbnRJbnNl
cnRlZEludG9UcmVlKG5vZGUpOwogfQogCi1pbmxpbmUgdm9pZCBDaGlsZE5vZGVJbnNlcnRpb25O
b3RpZmllcjo6bm90aWZ5KE5vZGUqIG5vZGUpCitpbmxpbmUgdm9pZCBDaGlsZE5vZGVJbnNlcnRp
b25Ob3RpZmllcjo6bm90aWZ5KE5vZGUmIG5vZGUpCiB7CiAgICAgQVNTRVJUKCFOb0V2ZW50RGlz
cGF0Y2hBc3NlcnRpb246OmlzRXZlbnREaXNwYXRjaEZvcmJpZGRlbigpKTsKIAogI2lmIEVOQUJM
RShJTlNQRUNUT1IpCi0gICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjpkaWRJbnNlcnRET01O
b2RlKCZub2RlLT5kb2N1bWVudCgpLCBub2RlKTsKKyAgICBJbnNwZWN0b3JJbnN0cnVtZW50YXRp
b246OmRpZEluc2VydERPTU5vZGUoJm5vZGUuZG9jdW1lbnQoKSwgJm5vZGUpOwogI2VuZGlmCiAK
LSAgICBSZWY8RG9jdW1lbnQ+IHByb3RlY3REb2N1bWVudChub2RlLT5kb2N1bWVudCgpKTsKLSAg
ICBSZWY8Tm9kZT4gcHJvdGVjdE5vZGUoKm5vZGUpOworICAgIFJlZjxEb2N1bWVudD4gcHJvdGVj
dERvY3VtZW50KG5vZGUuZG9jdW1lbnQoKSk7CisgICAgUmVmPE5vZGU+IHByb3RlY3ROb2RlKG5v
ZGUpOwogCi0gICAgaWYgKG1faW5zZXJ0aW9uUG9pbnQtPmluRG9jdW1lbnQoKSkKKyAgICBpZiAo
bV9pbnNlcnRpb25Qb2ludC5pbkRvY3VtZW50KCkpCiAgICAgICAgIG5vdGlmeU5vZGVJbnNlcnRl
ZEludG9Eb2N1bWVudChub2RlKTsKLSAgICBlbHNlIGlmIChub2RlLT5pc0NvbnRhaW5lck5vZGUo
KSkKKyAgICBlbHNlIGlmIChub2RlLmlzQ29udGFpbmVyTm9kZSgpKQogICAgICAgICBub3RpZnlO
b2RlSW5zZXJ0ZWRJbnRvVHJlZSh0b0NvbnRhaW5lck5vZGUobm9kZSkpOwogCiAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBtX3Bvc3RJbnNlcnRpb25Ob3RpZmljYXRpb25UYXJnZXRzLnNpemUo
KTsgKytpKQotICAgICAgICBtX3Bvc3RJbnNlcnRpb25Ob3RpZmljYXRpb25UYXJnZXRzW2ldLT5k
aWROb3RpZnlTdWJ0cmVlSW5zZXJ0aW9ucyhtX2luc2VydGlvblBvaW50KTsKKyAgICAgICAgbV9w
b3N0SW5zZXJ0aW9uTm90aWZpY2F0aW9uVGFyZ2V0c1tpXS0+ZGlkTm90aWZ5U3VidHJlZUluc2Vy
dGlvbnMoJm1faW5zZXJ0aW9uUG9pbnQpOwogfQogCiAKLWlubGluZSB2b2lkIENoaWxkTm9kZVJl
bW92YWxOb3RpZmllcjo6bm90aWZ5Tm9kZVJlbW92ZWRGcm9tRG9jdW1lbnQoTm9kZSogbm9kZSkK
K2lubGluZSB2b2lkIENoaWxkTm9kZVJlbW92YWxOb3RpZmllcjo6bm90aWZ5Tm9kZVJlbW92ZWRG
cm9tRG9jdW1lbnQoTm9kZSYgbm9kZSkKIHsKLSAgICBBU1NFUlQobV9pbnNlcnRpb25Qb2ludC0+
aW5Eb2N1bWVudCgpKTsKLSAgICBub2RlLT5yZW1vdmVkRnJvbShtX2luc2VydGlvblBvaW50KTsK
KyAgICBBU1NFUlQobV9pbnNlcnRpb25Qb2ludC5pbkRvY3VtZW50KCkpOworICAgIG5vZGUucmVt
b3ZlZEZyb20oJm1faW5zZXJ0aW9uUG9pbnQpOwogCi0gICAgaWYgKG5vZGUtPmlzQ29udGFpbmVy
Tm9kZSgpKQorICAgIGlmIChub2RlLmlzQ29udGFpbmVyTm9kZSgpKQogICAgICAgICBub3RpZnlE
ZXNjZW5kYW50UmVtb3ZlZEZyb21Eb2N1bWVudCh0b0NvbnRhaW5lck5vZGUobm9kZSkpOwogfQog
Ci1pbmxpbmUgdm9pZCBDaGlsZE5vZGVSZW1vdmFsTm90aWZpZXI6Om5vdGlmeU5vZGVSZW1vdmVk
RnJvbVRyZWUoQ29udGFpbmVyTm9kZSogbm9kZSkKK2lubGluZSB2b2lkIENoaWxkTm9kZVJlbW92
YWxOb3RpZmllcjo6bm90aWZ5Tm9kZVJlbW92ZWRGcm9tVHJlZShDb250YWluZXJOb2RlJiBub2Rl
KQogewogICAgIE5vRXZlbnREaXNwYXRjaEFzc2VydGlvbiBhc3NlcnROb0V2ZW50RGlzcGF0Y2g7
Ci0gICAgQVNTRVJUKCFtX2luc2VydGlvblBvaW50LT5pbkRvY3VtZW50KCkpOworICAgIEFTU0VS
VCghbV9pbnNlcnRpb25Qb2ludC5pbkRvY3VtZW50KCkpOwogCi0gICAgbm9kZS0+cmVtb3ZlZEZy
b20obV9pbnNlcnRpb25Qb2ludCk7CisgICAgbm9kZS5yZW1vdmVkRnJvbSgmbV9pbnNlcnRpb25Q
b2ludCk7CiAgICAgbm90aWZ5RGVzY2VuZGFudFJlbW92ZWRGcm9tVHJlZShub2RlKTsKIH0KIAot
aW5saW5lIHZvaWQgQ2hpbGROb2RlUmVtb3ZhbE5vdGlmaWVyOjpub3RpZnkoTm9kZSogbm9kZSkK
K2lubGluZSB2b2lkIENoaWxkTm9kZVJlbW92YWxOb3RpZmllcjo6bm90aWZ5KE5vZGUmIG5vZGUp
CiB7Ci0gICAgaWYgKG5vZGUtPmluRG9jdW1lbnQoKSkgeworICAgIGlmIChub2RlLmluRG9jdW1l
bnQoKSkgewogICAgICAgICBub3RpZnlOb2RlUmVtb3ZlZEZyb21Eb2N1bWVudChub2RlKTsKLSAg
ICAgICAgbm9kZS0+ZG9jdW1lbnQoKS5ub3RpZnlSZW1vdmVQZW5kaW5nU2hlZXRJZk5lZWRlZCgp
OwotICAgIH0gZWxzZSBpZiAobm9kZS0+aXNDb250YWluZXJOb2RlKCkpCisgICAgICAgIG5vZGUu
ZG9jdW1lbnQoKS5ub3RpZnlSZW1vdmVQZW5kaW5nU2hlZXRJZk5lZWRlZCgpOworICAgIH0gZWxz
ZSBpZiAobm9kZS5pc0NvbnRhaW5lck5vZGUoKSkKICAgICAgICAgbm90aWZ5Tm9kZVJlbW92ZWRG
cm9tVHJlZSh0b0NvbnRhaW5lck5vZGUobm9kZSkpOwogfQogCkBAIC0yNjksNyArMjY5LDcgQEAg
cHVibGljOgogICAgICAgICBEZXNjZW5kYW50c09ubHkKICAgICB9OwogCi0gICAgZXhwbGljaXQg
Q2hpbGRGcmFtZURpc2Nvbm5lY3RvcihDb250YWluZXJOb2RlKiByb290KQorICAgIGV4cGxpY2l0
IENoaWxkRnJhbWVEaXNjb25uZWN0b3IoQ29udGFpbmVyTm9kZSYgcm9vdCkKICAgICAgICAgOiBt
X3Jvb3Qocm9vdCkKICAgICB7CiAgICAgfQpAQCAtMjc3LDMxICsyNzcsMzEgQEAgcHVibGljOgog
ICAgIHZvaWQgZGlzY29ubmVjdChEaXNjb25uZWN0UG9saWN5ID0gUm9vdEFuZERlc2NlbmRhbnRz
KTsKIAogcHJpdmF0ZToKLSAgICB2b2lkIGNvbGxlY3RGcmFtZU93bmVycyhDb250YWluZXJOb2Rl
KiByb290KTsKKyAgICB2b2lkIGNvbGxlY3RGcmFtZU93bmVycyhDb250YWluZXJOb2RlJiByb290
KTsKICAgICB2b2lkIGRpc2Nvbm5lY3RDb2xsZWN0ZWRGcmFtZU93bmVycygpOwogCiAgICAgVmVj
dG9yPFJlZlB0cjxIVE1MRnJhbWVPd25lckVsZW1lbnQ+LCAxMD4gbV9mcmFtZU93bmVyczsKLSAg
ICBDb250YWluZXJOb2RlKiBtX3Jvb3Q7CisgICAgQ29udGFpbmVyTm9kZSYgbV9yb290OwogfTsK
IAogI2lmbmRlZiBOREVCVUcKLXVuc2lnbmVkIGFzc2VydENvbm5lY3RlZFN1YnJhbWVDb3VudElz
Q29uc2lzdGVudChOb2RlKik7Cit1bnNpZ25lZCBhc3NlcnRDb25uZWN0ZWRTdWJyYW1lQ291bnRJ
c0NvbnNpc3RlbnQoTm9kZSYpOwogI2VuZGlmCiAKLWlubGluZSB2b2lkIENoaWxkRnJhbWVEaXNj
b25uZWN0b3I6OmNvbGxlY3RGcmFtZU93bmVycyhDb250YWluZXJOb2RlKiByb290KQoraW5saW5l
IHZvaWQgQ2hpbGRGcmFtZURpc2Nvbm5lY3Rvcjo6Y29sbGVjdEZyYW1lT3duZXJzKENvbnRhaW5l
ck5vZGUmIHJvb3QpCiB7Ci0gICAgaWYgKCFyb290LT5jb25uZWN0ZWRTdWJmcmFtZUNvdW50KCkp
CisgICAgaWYgKCFyb290LmNvbm5lY3RlZFN1YmZyYW1lQ291bnQoKSkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgaWYgKHJvb3QtPmlzSFRNTEVsZW1lbnQoKSAmJiByb290LT5pc0ZyYW1lT3duZXJF
bGVtZW50KCkpCi0gICAgICAgIG1fZnJhbWVPd25lcnMuYXBwZW5kKHRvRnJhbWVPd25lckVsZW1l
bnQocm9vdCkpOworICAgIGlmIChyb290LmlzSFRNTEVsZW1lbnQoKSAmJiByb290LmlzRnJhbWVP
d25lckVsZW1lbnQoKSkKKyAgICAgICAgbV9mcmFtZU93bmVycy5hcHBlbmQoJnRvRnJhbWVPd25l
ckVsZW1lbnQocm9vdCkpOwogCi0gICAgZm9yIChFbGVtZW50KiBjaGlsZCA9IEVsZW1lbnRUcmF2
ZXJzYWw6OmZpcnN0Q2hpbGQocm9vdCk7IGNoaWxkOyBjaGlsZCA9IEVsZW1lbnRUcmF2ZXJzYWw6
Om5leHRTaWJsaW5nKGNoaWxkKSkKLSAgICAgICAgY29sbGVjdEZyYW1lT3duZXJzKGNoaWxkKTsK
KyAgICBmb3IgKEVsZW1lbnQqIGNoaWxkID0gRWxlbWVudFRyYXZlcnNhbDo6Zmlyc3RDaGlsZCgm
cm9vdCk7IGNoaWxkOyBjaGlsZCA9IEVsZW1lbnRUcmF2ZXJzYWw6Om5leHRTaWJsaW5nKGNoaWxk
KSkKKyAgICAgICAgY29sbGVjdEZyYW1lT3duZXJzKCpjaGlsZCk7CiAKLSAgICBTaGFkb3dSb290
KiBzaGFkb3cgPSByb290LT5pc0VsZW1lbnROb2RlKCkgPyB0b0VsZW1lbnQocm9vdCktPnNoYWRv
d1Jvb3QoKSA6IDA7CisgICAgU2hhZG93Um9vdCogc2hhZG93ID0gcm9vdC5pc0VsZW1lbnROb2Rl
KCkgPyB0b0VsZW1lbnQocm9vdCkuc2hhZG93Um9vdCgpIDogMDsKICAgICBpZiAoc2hhZG93KQot
ICAgICAgICBjb2xsZWN0RnJhbWVPd25lcnMoc2hhZG93KTsKKyAgICAgICAgY29sbGVjdEZyYW1l
T3duZXJzKCpzaGFkb3cpOwogfQogCiBpbmxpbmUgdm9pZCBDaGlsZEZyYW1lRGlzY29ubmVjdG9y
OjpkaXNjb25uZWN0Q29sbGVjdGVkRnJhbWVPd25lcnMoKQpAQCAtMzE0LDcgKzMxNCw3IEBAIGlu
bGluZSB2b2lkIENoaWxkRnJhbWVEaXNjb25uZWN0b3I6OmRpc2MKICAgICAgICAgSFRNTEZyYW1l
T3duZXJFbGVtZW50KiBvd25lciA9IG1fZnJhbWVPd25lcnNbaV0uZ2V0KCk7CiAgICAgICAgIC8v
IERvbid0IG5lZWQgdG8gdHJhdmVyc2UgdXAgdGhlIHRyZWUgZm9yIHRoZSBmaXJzdCBvd25lciBz
aW5jZSBubwogICAgICAgICAvLyBzY3JpcHQgY291bGQgaGF2ZSBtb3ZlZCBpdC4KLSAgICAgICAg
aWYgKCFpIHx8IG1fcm9vdC0+Y29udGFpbnNJbmNsdWRpbmdTaGFkb3dET00ob3duZXIpKQorICAg
ICAgICBpZiAoIWkgfHwgbV9yb290LmNvbnRhaW5zSW5jbHVkaW5nU2hhZG93RE9NKG93bmVyKSkK
ICAgICAgICAgICAgIG93bmVyLT5kaXNjb25uZWN0Q29udGVudEZyYW1lKCk7CiAgICAgfQogfQpA
QCAtMzI1LDE0ICszMjUsMTQgQEAgaW5saW5lIHZvaWQgQ2hpbGRGcmFtZURpc2Nvbm5lY3Rvcjo6
ZGlzYwogICAgIGFzc2VydENvbm5lY3RlZFN1YnJhbWVDb3VudElzQ29uc2lzdGVudChtX3Jvb3Qp
OwogI2VuZGlmCiAKLSAgICBpZiAoIW1fcm9vdC0+Y29ubmVjdGVkU3ViZnJhbWVDb3VudCgpKQor
ICAgIGlmICghbV9yb290LmNvbm5lY3RlZFN1YmZyYW1lQ291bnQoKSkKICAgICAgICAgcmV0dXJu
OwogCiAgICAgaWYgKHBvbGljeSA9PSBSb290QW5kRGVzY2VuZGFudHMpCiAgICAgICAgIGNvbGxl
Y3RGcmFtZU93bmVycyhtX3Jvb3QpOwogICAgIGVsc2UgewotICAgICAgICBmb3IgKEVsZW1lbnQq
IGNoaWxkID0gRWxlbWVudFRyYXZlcnNhbDo6Zmlyc3RDaGlsZChtX3Jvb3QpOyBjaGlsZDsgY2hp
bGQgPSBFbGVtZW50VHJhdmVyc2FsOjpuZXh0U2libGluZyhjaGlsZCkpCi0gICAgICAgICAgICBj
b2xsZWN0RnJhbWVPd25lcnMoY2hpbGQpOworICAgICAgICBmb3IgKEVsZW1lbnQqIGNoaWxkID0g
RWxlbWVudFRyYXZlcnNhbDo6Zmlyc3RDaGlsZCgmbV9yb290KTsgY2hpbGQ7IGNoaWxkID0gRWxl
bWVudFRyYXZlcnNhbDo6bmV4dFNpYmxpbmcoY2hpbGQpKQorICAgICAgICAgICAgY29sbGVjdEZy
YW1lT3duZXJzKCpjaGlsZCk7CiAgICAgfQogCiAgICAgZGlzY29ubmVjdENvbGxlY3RlZEZyYW1l
T3duZXJzKCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHJldmlzaW9uIDE1NjI1MCkK
KysrIFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0
ODUsMzEgKzM0ODUsMjggQEAgdm9pZCBEb2N1bWVudDo6bW92ZU5vZGVJdGVyYXRvcnNUb05ld0Rv
YwogICAgIH0KIH0KIAotdm9pZCBEb2N1bWVudDo6dXBkYXRlUmFuZ2VzQWZ0ZXJDaGlsZHJlbkNo
YW5nZWQoQ29udGFpbmVyTm9kZSogY29udGFpbmVyKQordm9pZCBEb2N1bWVudDo6dXBkYXRlUmFu
Z2VzQWZ0ZXJDaGlsZHJlbkNoYW5nZWQoQ29udGFpbmVyTm9kZSYgY29udGFpbmVyKQogewogICAg
IGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFuZ2UqPjo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAoSGFzaFNldDxS
YW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbV9yYW5nZXMuYmVnaW4oKSwgZW5kID0gbV9y
YW5nZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKICAgICAgICAgICAgICgqaXQpLT5ub2RlQ2hp
bGRyZW5DaGFuZ2VkKGNvbnRhaW5lcik7CiAgICAgfQogfQogCi12b2lkIERvY3VtZW50Ojpub2Rl
Q2hpbGRyZW5XaWxsQmVSZW1vdmVkKENvbnRhaW5lck5vZGUqIGNvbnRhaW5lcikKK3ZvaWQgRG9j
dW1lbnQ6Om5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSYgY29udGFpbmVy
KQogewogICAgIGlmICghbV9yYW5nZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEhhc2hTZXQ8UmFu
Z2UqPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9yYW5nZXMuZW5kKCk7Ci0gICAgICAgIGZvciAo
SGFzaFNldDxSYW5nZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fcmFuZ2VzLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbV9yYW5nZXMuYmVnaW4oKSwg
ZW5kID0gbV9yYW5nZXMuZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKICAgICAgICAgICAgICgqaXQp
LT5ub2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKGNvbnRhaW5lcik7CiAgICAgfQogCi0gICAgSGFz
aFNldDxOb2RlSXRlcmF0b3IqPjo6Y29uc3RfaXRlcmF0b3Igbm9kZUl0ZXJhdG9yc0VuZCA9IG1f
bm9kZUl0ZXJhdG9ycy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8Tm9kZUl0ZXJhdG9yKj46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV9ub2RlSXRlcmF0b3JzLmJlZ2luKCk7IGl0ICE9IG5vZGVJdGVy
YXRvcnNFbmQ7ICsraXQpIHsKLSAgICAgICAgZm9yIChOb2RlKiBuID0gY29udGFpbmVyLT5maXJz
dENoaWxkKCk7IG47IG4gPSBuLT5uZXh0U2libGluZygpKQorICAgIGZvciAoYXV0byBpdCA9IG1f
bm9kZUl0ZXJhdG9ycy5iZWdpbigpLCBlbmQgPSBtX25vZGVJdGVyYXRvcnMuZW5kKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBmb3IgKE5vZGUqIG4gPSBjb250YWluZXIuZmlyc3RDaGls
ZCgpOyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKICAgICAgICAgICAgICgqaXQpLT5ub2RlV2ls
bEJlUmVtb3ZlZChuKTsKICAgICB9CiAKICAgICBpZiAoRnJhbWUqIGZyYW1lID0gdGhpcy0+ZnJh
bWUoKSkgewotICAgICAgICBmb3IgKE5vZGUqIG4gPSBjb250YWluZXItPmZpcnN0Q2hpbGQoKTsg
bjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgZm9yIChOb2RlKiBuID0gY29udGFp
bmVyLmZpcnN0Q2hpbGQoKTsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICAg
IGZyYW1lLT5ldmVudEhhbmRsZXIoKS5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKICAgICAgICAgICAg
IGZyYW1lLT5zZWxlY3Rpb24oKS5ub2RlV2lsbEJlUmVtb3ZlZChuKTsKICAgICAgICAgICAgIGZy
YW1lLT5wYWdlKCktPmRyYWdDYXJldENvbnRyb2xsZXIoKS5ub2RlV2lsbEJlUmVtb3ZlZChuKTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2Vi
Q29yZS9kb20vRG9jdW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtNzA5LDkgKzcwOSw5IEBAIHB1
YmxpYzoKICAgICB2b2lkIGF0dGFjaFJhbmdlKFJhbmdlKik7CiAgICAgdm9pZCBkZXRhY2hSYW5n
ZShSYW5nZSopOwogCi0gICAgdm9pZCB1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdlZChD
b250YWluZXJOb2RlKik7CisgICAgdm9pZCB1cGRhdGVSYW5nZXNBZnRlckNoaWxkcmVuQ2hhbmdl
ZChDb250YWluZXJOb2RlJik7CiAgICAgLy8gbm9kZUNoaWxkcmVuV2lsbEJlUmVtb3ZlZCBpcyB1
c2VkIHdoZW4gcmVtb3ZpbmcgYWxsIG5vZGUgY2hpbGRyZW4gYXQgb25jZS4KLSAgICB2b2lkIG5v
ZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSopOworICAgIHZvaWQgbm9kZUNo
aWxkcmVuV2lsbEJlUmVtb3ZlZChDb250YWluZXJOb2RlJik7CiAgICAgLy8gbm9kZVdpbGxCZVJl
bW92ZWQgaXMgb25seSBzYWZlIHdoZW4gcmVtb3Zpbmcgb25lIG5vZGUgYXQgYSB0aW1lLgogICAg
IHZvaWQgbm9kZVdpbGxCZVJlbW92ZWQoTm9kZSopOwogICAgIGJvb2wgY2FuUmVwbGFjZUNoaWxk
KE5vZGUqIG5ld0NoaWxkLCBOb2RlKiBvbGRDaGlsZCk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9k
b20vRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQu
Y3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTE0MzYsNyArMTQzNiw3IEBAIHZvaWQgRWxlbWVudDo6YWRkU2hh
ZG93Um9vdChQYXNzUmVmUHRyPFMKICAgICBzaGFkb3dSb290LT5zZXRQYXJlbnRUcmVlU2NvcGUo
dHJlZVNjb3BlKCkpOwogICAgIHNoYWRvd1Jvb3QtPmRpc3RyaWJ1dG9yKCkuZGlkU2hhZG93Qm91
bmRhcnlDaGFuZ2UodGhpcyk7CiAKLSAgICBDaGlsZE5vZGVJbnNlcnRpb25Ob3RpZmllcih0aGlz
KS5ub3RpZnkoc2hhZG93Um9vdCk7CisgICAgQ2hpbGROb2RlSW5zZXJ0aW9uTm90aWZpZXIoKnRo
aXMpLm5vdGlmeSgqc2hhZG93Um9vdCk7CiAKICAgICByZXNldE5lZWRzTm9kZVJlbmRlcmluZ1Ry
YXZlcnNhbFNsb3dQYXRoKCk7CiAKQEAgLTE0NjQsNyArMTQ2NCw3IEBAIHZvaWQgRWxlbWVudDo6
cmVtb3ZlU2hhZG93Um9vdCgpCiAgICAgb2xkUm9vdC0+c2V0SG9zdEVsZW1lbnQoMCk7CiAgICAg
b2xkUm9vdC0+c2V0UGFyZW50VHJlZVNjb3BlKCZkb2N1bWVudCgpKTsKIAotICAgIENoaWxkTm9k
ZVJlbW92YWxOb3RpZmllcih0aGlzKS5ub3RpZnkob2xkUm9vdC5nZXQoKSk7CisgICAgQ2hpbGRO
b2RlUmVtb3ZhbE5vdGlmaWVyKCp0aGlzKS5ub3RpZnkoKm9sZFJvb3QpOwogCiAgICAgb2xkUm9v
dC0+ZGlzdHJpYnV0b3IoKS5pbnZhbGlkYXRlRGlzdHJpYnV0aW9uKHRoaXMpOwogfQpAQCAtMjg0
OCw4ICsyODQ4LDggQEAgdm9pZCBFbGVtZW50Ojp3aWxsTW9kaWZ5QXR0cmlidXRlKGNvbnN0IAog
ICAgICAgICAgICAgc2V0TmVlZHNTdHlsZVJlY2FsYygpOwogICAgIH0KIAotICAgIGlmIChPd25Q
dHI8TXV0YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXA+IHJlY2lwaWVudHMgPSBNdXRhdGlvbk9i
c2VydmVySW50ZXJlc3RHcm91cDo6Y3JlYXRlRm9yQXR0cmlidXRlc011dGF0aW9uKHRoaXMsIG5h
bWUpKQotICAgICAgICByZWNpcGllbnRzLT5lbnF1ZXVlTXV0YXRpb25SZWNvcmQoTXV0YXRpb25S
ZWNvcmQ6OmNyZWF0ZUF0dHJpYnV0ZXModGhpcywgbmFtZSwgb2xkVmFsdWUpKTsKKyAgICBpZiAo
T3duUHRyPE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwPiByZWNpcGllbnRzID0gTXV0YXRp
b25PYnNlcnZlckludGVyZXN0R3JvdXA6OmNyZWF0ZUZvckF0dHJpYnV0ZXNNdXRhdGlvbigqdGhp
cywgbmFtZSkpCisgICAgICAgIHJlY2lwaWVudHMtPmVucXVldWVNdXRhdGlvblJlY29yZChNdXRh
dGlvblJlY29yZDo6Y3JlYXRlQXR0cmlidXRlcygqdGhpcywgbmFtZSwgb2xkVmFsdWUpKTsKIAog
I2lmIEVOQUJMRShJTlNQRUNUT1IpCiAgICAgSW5zcGVjdG9ySW5zdHJ1bWVudGF0aW9uOjp3aWxs
TW9kaWZ5RE9NQXR0cigmZG9jdW1lbnQoKSwgdGhpcywgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9NdXRhdGlvbk9ic2VydmVySW50ZXJlc3RHcm91cC5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL011dGF0aW9uT2JzZXJ2ZXJJbnRlcmVz
dEdyb3VwLmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL011dGF0
aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzksMTEgKzM5
LDExIEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotUGFzc093blB0cjxNdXRhdGlvbk9ic2Vy
dmVySW50ZXJlc3RHcm91cD4gTXV0YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXA6OmNyZWF0ZUlm
TmVlZGVkKE5vZGUqIHRhcmdldCwgTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25UeXBlIHR5cGUs
IE11dGF0aW9uUmVjb3JkRGVsaXZlcnlPcHRpb25zIG9sZFZhbHVlRmxhZywgY29uc3QgUXVhbGlm
aWVkTmFtZSogYXR0cmlidXRlTmFtZSkKK1Bhc3NPd25QdHI8TXV0YXRpb25PYnNlcnZlckludGVy
ZXN0R3JvdXA+IE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwOjpjcmVhdGVJZk5lZWRlZChO
b2RlJiB0YXJnZXQsIE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSB0eXBlLCBNdXRhdGlv
blJlY29yZERlbGl2ZXJ5T3B0aW9ucyBvbGRWYWx1ZUZsYWcsIGNvbnN0IFF1YWxpZmllZE5hbWUq
IGF0dHJpYnV0ZU5hbWUpCiB7CiAgICAgQVNTRVJUKCh0eXBlID09IE11dGF0aW9uT2JzZXJ2ZXI6
OkF0dHJpYnV0ZXMgJiYgYXR0cmlidXRlTmFtZSkgfHwgIWF0dHJpYnV0ZU5hbWUpOwogICAgIEhh
c2hNYXA8TXV0YXRpb25PYnNlcnZlciosIE11dGF0aW9uUmVjb3JkRGVsaXZlcnlPcHRpb25zPiBv
YnNlcnZlcnM7Ci0gICAgdGFyZ2V0LT5nZXRSZWdpc3RlcmVkTXV0YXRpb25PYnNlcnZlcnNPZlR5
cGUob2JzZXJ2ZXJzLCB0eXBlLCBhdHRyaWJ1dGVOYW1lKTsKKyAgICB0YXJnZXQuZ2V0UmVnaXN0
ZXJlZE11dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKG9ic2VydmVycywgdHlwZSwgYXR0cmlidXRlTmFt
ZSk7CiAgICAgaWYgKG9ic2VydmVycy5pc0VtcHR5KCkpCiAgICAgICAgIHJldHVybiBudWxscHRy
OwogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vTXV0YXRpb25PYnNlcnZlckludGVyZXN0R3Jv
dXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vTXV0YXRpb25PYnNlcnZlcklu
dGVyZXN0R3JvdXAuaAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL011
dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwLmgJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMz
LDYgQEAKIAogI2luY2x1ZGUgIkRvY3VtZW50LmgiCiAjaW5jbHVkZSAiTXV0YXRpb25PYnNlcnZl
ci5oIgotI2luY2x1ZGUgIk5vZGUuaCIKICNpbmNsdWRlICJRdWFsaWZpZWROYW1lLmgiCiAjaW5j
bHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgpAQCAtNDIs
MjYgKzQxLDI2IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3MgTXV0YXRpb25PYnNlcnZl
ckludGVyZXN0R3JvdXAgewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzT3duUHRyPE11dGF0aW9u
T2JzZXJ2ZXJJbnRlcmVzdEdyb3VwPiBjcmVhdGVGb3JDaGlsZExpc3RNdXRhdGlvbihOb2RlKiB0
YXJnZXQpCisgICAgc3RhdGljIFBhc3NPd25QdHI8TXV0YXRpb25PYnNlcnZlckludGVyZXN0R3Jv
dXA+IGNyZWF0ZUZvckNoaWxkTGlzdE11dGF0aW9uKE5vZGUmIHRhcmdldCkKICAgICB7Ci0gICAg
ICAgIGlmICghdGFyZ2V0LT5kb2N1bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11
dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCkpCisgICAgICAgIGlmICghdGFyZ2V0LmRvY3VtZW50
KCkuaGFzTXV0YXRpb25PYnNlcnZlcnNPZlR5cGUoTXV0YXRpb25PYnNlcnZlcjo6Q2hpbGRMaXN0
KSkKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAgICAgIE11dGF0aW9uUmVjb3Jk
RGVsaXZlcnlPcHRpb25zIG9sZFZhbHVlRmxhZyA9IDA7CiAgICAgICAgIHJldHVybiBjcmVhdGVJ
Zk5lZWRlZCh0YXJnZXQsIE11dGF0aW9uT2JzZXJ2ZXI6OkNoaWxkTGlzdCwgb2xkVmFsdWVGbGFn
KTsKICAgICB9CiAKLSAgICBzdGF0aWMgUGFzc093blB0cjxNdXRhdGlvbk9ic2VydmVySW50ZXJl
c3RHcm91cD4gY3JlYXRlRm9yQ2hhcmFjdGVyRGF0YU11dGF0aW9uKE5vZGUqIHRhcmdldCkKKyAg
ICBzdGF0aWMgUGFzc093blB0cjxNdXRhdGlvbk9ic2VydmVySW50ZXJlc3RHcm91cD4gY3JlYXRl
Rm9yQ2hhcmFjdGVyRGF0YU11dGF0aW9uKE5vZGUmIHRhcmdldCkKICAgICB7Ci0gICAgICAgIGlm
ICghdGFyZ2V0LT5kb2N1bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9u
T2JzZXJ2ZXI6OkNoYXJhY3RlckRhdGEpKQorICAgICAgICBpZiAoIXRhcmdldC5kb2N1bWVudCgp
Lmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2ZXI6OkNoYXJhY3RlckRh
dGEpKQogICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICAgICAgcmV0dXJuIGNyZWF0
ZUlmTmVlZGVkKHRhcmdldCwgTXV0YXRpb25PYnNlcnZlcjo6Q2hhcmFjdGVyRGF0YSwgTXV0YXRp
b25PYnNlcnZlcjo6Q2hhcmFjdGVyRGF0YU9sZFZhbHVlKTsKICAgICB9CiAKLSAgICBzdGF0aWMg
UGFzc093blB0cjxNdXRhdGlvbk9ic2VydmVySW50ZXJlc3RHcm91cD4gY3JlYXRlRm9yQXR0cmli
dXRlc011dGF0aW9uKE5vZGUqIHRhcmdldCwgY29uc3QgUXVhbGlmaWVkTmFtZSYgYXR0cmlidXRl
TmFtZSkKKyAgICBzdGF0aWMgUGFzc093blB0cjxNdXRhdGlvbk9ic2VydmVySW50ZXJlc3RHcm91
cD4gY3JlYXRlRm9yQXR0cmlidXRlc011dGF0aW9uKE5vZGUmIHRhcmdldCwgY29uc3QgUXVhbGlm
aWVkTmFtZSYgYXR0cmlidXRlTmFtZSkKICAgICB7Ci0gICAgICAgIGlmICghdGFyZ2V0LT5kb2N1
bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2ZXI6OkF0dHJp
YnV0ZXMpKQorICAgICAgICBpZiAoIXRhcmdldC5kb2N1bWVudCgpLmhhc011dGF0aW9uT2JzZXJ2
ZXJzT2ZUeXBlKE11dGF0aW9uT2JzZXJ2ZXI6OkF0dHJpYnV0ZXMpKQogICAgICAgICAgICAgcmV0
dXJuIG51bGxwdHI7CiAKICAgICAgICAgcmV0dXJuIGNyZWF0ZUlmTmVlZGVkKHRhcmdldCwgTXV0
YXRpb25PYnNlcnZlcjo6QXR0cmlidXRlcywgTXV0YXRpb25PYnNlcnZlcjo6QXR0cmlidXRlT2xk
VmFsdWUsICZhdHRyaWJ1dGVOYW1lKTsKQEAgLTcxLDcgKzcwLDcgQEAgcHVibGljOgogICAgIHZv
aWQgZW5xdWV1ZU11dGF0aW9uUmVjb3JkKFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+KTsKIAog
cHJpdmF0ZToKLSAgICBzdGF0aWMgUGFzc093blB0cjxNdXRhdGlvbk9ic2VydmVySW50ZXJlc3RH
cm91cD4gY3JlYXRlSWZOZWVkZWQoTm9kZSogdGFyZ2V0LCBNdXRhdGlvbk9ic2VydmVyOjpNdXRh
dGlvblR5cGUsIE11dGF0aW9uUmVjb3JkRGVsaXZlcnlPcHRpb25zIG9sZFZhbHVlRmxhZywgY29u
c3QgUXVhbGlmaWVkTmFtZSogYXR0cmlidXRlTmFtZSA9IDApOworICAgIHN0YXRpYyBQYXNzT3du
UHRyPE11dGF0aW9uT2JzZXJ2ZXJJbnRlcmVzdEdyb3VwPiBjcmVhdGVJZk5lZWRlZChOb2RlJiB0
YXJnZXQsIE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uVHlwZSwgTXV0YXRpb25SZWNvcmREZWxp
dmVyeU9wdGlvbnMgb2xkVmFsdWVGbGFnLCBjb25zdCBRdWFsaWZpZWROYW1lKiBhdHRyaWJ1dGVO
YW1lID0gMCk7CiAgICAgTXV0YXRpb25PYnNlcnZlckludGVyZXN0R3JvdXAoSGFzaE1hcDxNdXRh
dGlvbk9ic2VydmVyKiwgTXV0YXRpb25SZWNvcmREZWxpdmVyeU9wdGlvbnM+JiBvYnNlcnZlcnMs
IE11dGF0aW9uUmVjb3JkRGVsaXZlcnlPcHRpb25zIG9sZFZhbHVlRmxhZyk7CiAKICAgICBib29s
IGhhc09sZFZhbHVlKE11dGF0aW9uUmVjb3JkRGVsaXZlcnlPcHRpb25zIG9wdGlvbnMpIHsgcmV0
dXJuIG9wdGlvbnMgJiBtX29sZFZhbHVlRmxhZzsgfQpJbmRleDogU291cmNlL1dlYkNvcmUvZG9t
L011dGF0aW9uUmVjb3JkLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vTXV0
YXRpb25SZWNvcmQuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20v
TXV0YXRpb25SZWNvcmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSwxMCArMjksMTAgQEAKICAq
LwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0KICNpbmNsdWRlICJNdXRhdGlvblJlY29yZC5oIgog
Ci0jaW5jbHVkZSAiTm9kZS5oIgorI2luY2x1ZGUgIkNoYXJhY3RlckRhdGEuaCIKKyNpbmNsdWRl
ICJFbGVtZW50LmgiCiAjaW5jbHVkZSAiTm9kZUxpc3QuaCIKICNpbmNsdWRlICJRdWFsaWZpZWRO
YW1lLmgiCiAjaW5jbHVkZSAiU3RhdGljTm9kZUxpc3QuaCIKQEAgLTQ1LDcgKzQ1LDcgQEAgbmFt
ZXNwYWNlIHsKIAogY2xhc3MgQ2hpbGRMaXN0UmVjb3JkIDogcHVibGljIE11dGF0aW9uUmVjb3Jk
IHsKIHB1YmxpYzoKLSAgICBDaGlsZExpc3RSZWNvcmQoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQs
IFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IGFkZGVkLCBQYXNzUmVmUHRyPE5vZGVMaXN0PiByZW1vdmVk
LCBQYXNzUmVmUHRyPE5vZGU+IHByZXZpb3VzU2libGluZywgUGFzc1JlZlB0cjxOb2RlPiBuZXh0
U2libGluZykKKyAgICBDaGlsZExpc3RSZWNvcmQoQ29udGFpbmVyTm9kZSYgdGFyZ2V0LCBQYXNz
UmVmUHRyPE5vZGVMaXN0PiBhZGRlZCwgUGFzc1JlZlB0cjxOb2RlTGlzdD4gcmVtb3ZlZCwgUGFz
c1JlZlB0cjxOb2RlPiBwcmV2aW91c1NpYmxpbmcsIFBhc3NSZWZQdHI8Tm9kZT4gbmV4dFNpYmxp
bmcpCiAgICAgICAgIDogbV90YXJnZXQodGFyZ2V0KQogICAgICAgICAsIG1fYWRkZWROb2Rlcyhh
ZGRlZCkKICAgICAgICAgLCBtX3JlbW92ZWROb2RlcyhyZW1vdmVkKQpAQCAtNTYsMTMgKzU2LDEz
IEBAIHB1YmxpYzoKIAogcHJpdmF0ZToKICAgICB2aXJ0dWFsIGNvbnN0IEF0b21pY1N0cmluZyYg
dHlwZSgpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgTm9kZSogdGFyZ2V0KCkgT1ZFUlJJREUgeyBy
ZXR1cm4gbV90YXJnZXQuZ2V0KCk7IH0KKyAgICB2aXJ0dWFsIE5vZGUqIHRhcmdldCgpIE9WRVJS
SURFIHsgcmV0dXJuICZtX3RhcmdldC5nZXQoKTsgfQogICAgIHZpcnR1YWwgTm9kZUxpc3QqIGFk
ZGVkTm9kZXMoKSBPVkVSUklERSB7IHJldHVybiBtX2FkZGVkTm9kZXMuZ2V0KCk7IH0KICAgICB2
aXJ0dWFsIE5vZGVMaXN0KiByZW1vdmVkTm9kZXMoKSBPVkVSUklERSB7IHJldHVybiBtX3JlbW92
ZWROb2Rlcy5nZXQoKTsgfQogICAgIHZpcnR1YWwgTm9kZSogcHJldmlvdXNTaWJsaW5nKCkgT1ZF
UlJJREUgeyByZXR1cm4gbV9wcmV2aW91c1NpYmxpbmcuZ2V0KCk7IH0KICAgICB2aXJ0dWFsIE5v
ZGUqIG5leHRTaWJsaW5nKCkgT1ZFUlJJREUgeyByZXR1cm4gbV9uZXh0U2libGluZy5nZXQoKTsg
fQogCi0gICAgUmVmUHRyPE5vZGU+IG1fdGFyZ2V0OworICAgIFJlZjxDb250YWluZXJOb2RlPiBt
X3RhcmdldDsKICAgICBSZWZQdHI8Tm9kZUxpc3Q+IG1fYWRkZWROb2RlczsKICAgICBSZWZQdHI8
Tm9kZUxpc3Q+IG1fcmVtb3ZlZE5vZGVzOwogICAgIFJlZlB0cjxOb2RlPiBtX3ByZXZpb3VzU2li
bGluZzsKQEAgLTcxLDE0ICs3MSwxNCBAQCBwcml2YXRlOgogCiBjbGFzcyBSZWNvcmRXaXRoRW1w
dHlOb2RlTGlzdHMgOiBwdWJsaWMgTXV0YXRpb25SZWNvcmQgewogcHVibGljOgotICAgIFJlY29y
ZFdpdGhFbXB0eU5vZGVMaXN0cyhQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwgY29uc3QgU3RyaW5n
JiBvbGRWYWx1ZSkKKyAgICBSZWNvcmRXaXRoRW1wdHlOb2RlTGlzdHMoTm9kZSYgdGFyZ2V0LCBj
b25zdCBTdHJpbmcmIG9sZFZhbHVlKQogICAgICAgICA6IG1fdGFyZ2V0KHRhcmdldCkKICAgICAg
ICAgLCBtX29sZFZhbHVlKG9sZFZhbHVlKQogICAgIHsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAg
dmlydHVhbCBOb2RlKiB0YXJnZXQoKSBPVkVSUklERSB7IHJldHVybiBtX3RhcmdldC5nZXQoKTsg
fQorICAgIHZpcnR1YWwgTm9kZSogdGFyZ2V0KCkgT1ZFUlJJREUgeyByZXR1cm4gJm1fdGFyZ2V0
LmdldCgpOyB9CiAgICAgdmlydHVhbCBTdHJpbmcgb2xkVmFsdWUoKSBPVkVSUklERSB7IHJldHVy
biBtX29sZFZhbHVlOyB9CiAgICAgdmlydHVhbCBOb2RlTGlzdCogYWRkZWROb2RlcygpIE9WRVJS
SURFIHsgcmV0dXJuIGxhemlseUluaXRpYWxpemVFbXB0eU5vZGVMaXN0KG1fYWRkZWROb2Rlcyk7
IH0KICAgICB2aXJ0dWFsIE5vZGVMaXN0KiByZW1vdmVkTm9kZXMoKSBPVkVSUklERSB7IHJldHVy
biBsYXppbHlJbml0aWFsaXplRW1wdHlOb2RlTGlzdChtX3JlbW92ZWROb2Rlcyk7IH0KQEAgLTkw
LDcgKzkwLDcgQEAgcHJpdmF0ZToKICAgICAgICAgcmV0dXJuIG5vZGVMaXN0LmdldCgpOwogICAg
IH0KIAotICAgIFJlZlB0cjxOb2RlPiBtX3RhcmdldDsKKyAgICBSZWY8Tm9kZT4gbV90YXJnZXQ7
CiAgICAgU3RyaW5nIG1fb2xkVmFsdWU7CiAgICAgUmVmUHRyPE5vZGVMaXN0PiBtX2FkZGVkTm9k
ZXM7CiAgICAgUmVmUHRyPE5vZGVMaXN0PiBtX3JlbW92ZWROb2RlczsKQEAgLTk4LDcgKzk4LDcg
QEAgcHJpdmF0ZToKIAogY2xhc3MgQXR0cmlidXRlc1JlY29yZCA6IHB1YmxpYyBSZWNvcmRXaXRo
RW1wdHlOb2RlTGlzdHMgewogcHVibGljOgotICAgIEF0dHJpYnV0ZXNSZWNvcmQoUGFzc1JlZlB0
cjxOb2RlPiB0YXJnZXQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0
cmluZyYgb2xkVmFsdWUpCisgICAgQXR0cmlidXRlc1JlY29yZChFbGVtZW50JiB0YXJnZXQsIGNv
bnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgb2xkVmFsdWUpCiAg
ICAgICAgIDogUmVjb3JkV2l0aEVtcHR5Tm9kZUxpc3RzKHRhcmdldCwgb2xkVmFsdWUpCiAgICAg
ICAgICwgbV9hdHRyaWJ1dGVOYW1lKG5hbWUubG9jYWxOYW1lKCkpCiAgICAgICAgICwgbV9hdHRy
aWJ1dGVOYW1lc3BhY2UobmFtZS5uYW1lc3BhY2VVUkkoKSkKQEAgLTExNiw3ICsxMTYsNyBAQCBw
cml2YXRlOgogCiBjbGFzcyBDaGFyYWN0ZXJEYXRhUmVjb3JkIDogcHVibGljIFJlY29yZFdpdGhF
bXB0eU5vZGVMaXN0cyB7CiBwdWJsaWM6Ci0gICAgQ2hhcmFjdGVyRGF0YVJlY29yZChQYXNzUmVm
UHRyPE5vZGU+IHRhcmdldCwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSkKKyAgICBDaGFyYWN0ZXJE
YXRhUmVjb3JkKENoYXJhY3RlckRhdGEmIHRhcmdldCwgY29uc3QgU3RyaW5nJiBvbGRWYWx1ZSkK
ICAgICAgICAgOiBSZWNvcmRXaXRoRW1wdHlOb2RlTGlzdHModGFyZ2V0LCBvbGRWYWx1ZSkKICAg
ICB7CiAgICAgfQpAQCAtMTY3LDE3ICsxNjcsMTcgQEAgY29uc3QgQXRvbWljU3RyaW5nJiBDaGFy
YWN0ZXJEYXRhUmVjb3JkOgogCiB9IC8vIG5hbWVzcGFjZQogCi1QYXNzUmVmUHRyPE11dGF0aW9u
UmVjb3JkPiBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hpbGRMaXN0KFBhc3NSZWZQdHI8Tm9kZT4g
dGFyZ2V0LCBQYXNzUmVmUHRyPE5vZGVMaXN0PiBhZGRlZCwgUGFzc1JlZlB0cjxOb2RlTGlzdD4g
cmVtb3ZlZCwgUGFzc1JlZlB0cjxOb2RlPiBwcmV2aW91c1NpYmxpbmcsIFBhc3NSZWZQdHI8Tm9k
ZT4gbmV4dFNpYmxpbmcpCitQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBNdXRhdGlvblJlY29y
ZDo6Y3JlYXRlQ2hpbGRMaXN0KENvbnRhaW5lck5vZGUmIHRhcmdldCwgUGFzc1JlZlB0cjxOb2Rl
TGlzdD4gYWRkZWQsIFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IHJlbW92ZWQsIFBhc3NSZWZQdHI8Tm9k
ZT4gcHJldmlvdXNTaWJsaW5nLCBQYXNzUmVmUHRyPE5vZGU+IG5leHRTaWJsaW5nKQogewogICAg
IHJldHVybiBhZG9wdFJlZihzdGF0aWNfY2FzdDxNdXRhdGlvblJlY29yZCo+KG5ldyBDaGlsZExp
c3RSZWNvcmQodGFyZ2V0LCBhZGRlZCwgcmVtb3ZlZCwgcHJldmlvdXNTaWJsaW5nLCBuZXh0U2li
bGluZykpKTsKIH0KIAotUGFzc1JlZlB0cjxNdXRhdGlvblJlY29yZD4gTXV0YXRpb25SZWNvcmQ6
OmNyZWF0ZUF0dHJpYnV0ZXMoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIGNvbnN0IFF1YWxpZmll
ZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgb2xkVmFsdWUpCitQYXNzUmVmUHRyPE11
dGF0aW9uUmVjb3JkPiBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQXR0cmlidXRlcyhFbGVtZW50JiB0
YXJnZXQsIGNvbnN0IFF1YWxpZmllZE5hbWUmIG5hbWUsIGNvbnN0IEF0b21pY1N0cmluZyYgb2xk
VmFsdWUpCiB7CiAgICAgcmV0dXJuIGFkb3B0UmVmKHN0YXRpY19jYXN0PE11dGF0aW9uUmVjb3Jk
Kj4obmV3IEF0dHJpYnV0ZXNSZWNvcmQodGFyZ2V0LCBuYW1lLCBvbGRWYWx1ZSkpKTsKIH0KIAot
UGFzc1JlZlB0cjxNdXRhdGlvblJlY29yZD4gTXV0YXRpb25SZWNvcmQ6OmNyZWF0ZUNoYXJhY3Rl
ckRhdGEoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUpCitQ
YXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBNdXRhdGlvblJlY29yZDo6Y3JlYXRlQ2hhcmFjdGVy
RGF0YShDaGFyYWN0ZXJEYXRhJiB0YXJnZXQsIGNvbnN0IFN0cmluZyYgb2xkVmFsdWUpCiB7CiAg
ICAgcmV0dXJuIGFkb3B0UmVmKHN0YXRpY19jYXN0PE11dGF0aW9uUmVjb3JkKj4obmV3IENoYXJh
Y3RlckRhdGFSZWNvcmQodGFyZ2V0LCBvbGRWYWx1ZSkpKTsKIH0KSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2RvbS9NdXRhdGlvblJlY29yZC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Rv
bS9NdXRhdGlvblJlY29yZC5oCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9k
b20vTXV0YXRpb25SZWNvcmQuaAkod29ya2luZyBjb3B5KQpAQCAtMzgsMTUgKzM4LDE4IEBACiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgQ2hhcmFjdGVyRGF0YTsKK2NsYXNzIENvbnRh
aW5lck5vZGU7CitjbGFzcyBFbGVtZW50OwogY2xhc3MgTm9kZTsKIGNsYXNzIE5vZGVMaXN0Owog
Y2xhc3MgUXVhbGlmaWVkTmFtZTsKIAogY2xhc3MgTXV0YXRpb25SZWNvcmQgOiBwdWJsaWMgUmVm
Q291bnRlZDxNdXRhdGlvblJlY29yZD4gewogcHVibGljOgotICAgIHN0YXRpYyBQYXNzUmVmUHRy
PE11dGF0aW9uUmVjb3JkPiBjcmVhdGVDaGlsZExpc3QoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQs
IFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IGFkZGVkLCBQYXNzUmVmUHRyPE5vZGVMaXN0PiByZW1vdmVk
LCBQYXNzUmVmUHRyPE5vZGU+IHByZXZpb3VzU2libGluZywgUGFzc1JlZlB0cjxOb2RlPiBuZXh0
U2libGluZyk7Ci0gICAgc3RhdGljIFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+IGNyZWF0ZUF0
dHJpYnV0ZXMoUGFzc1JlZlB0cjxOb2RlPiB0YXJnZXQsIGNvbnN0IFF1YWxpZmllZE5hbWUmLCBj
b25zdCBBdG9taWNTdHJpbmcmIG9sZFZhbHVlKTsKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxNdXRh
dGlvblJlY29yZD4gY3JlYXRlQ2hhcmFjdGVyRGF0YShQYXNzUmVmUHRyPE5vZGU+IHRhcmdldCwg
Y29uc3QgU3RyaW5nJiBvbGRWYWx1ZSk7CisgICAgc3RhdGljIFBhc3NSZWZQdHI8TXV0YXRpb25S
ZWNvcmQ+IGNyZWF0ZUNoaWxkTGlzdChDb250YWluZXJOb2RlJiB0YXJnZXQsIFBhc3NSZWZQdHI8
Tm9kZUxpc3Q+IGFkZGVkLCBQYXNzUmVmUHRyPE5vZGVMaXN0PiByZW1vdmVkLCBQYXNzUmVmUHRy
PE5vZGU+IHByZXZpb3VzU2libGluZywgUGFzc1JlZlB0cjxOb2RlPiBuZXh0U2libGluZyk7Cisg
ICAgc3RhdGljIFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+IGNyZWF0ZUF0dHJpYnV0ZXMoRWxl
bWVudCYgdGFyZ2V0LCBjb25zdCBRdWFsaWZpZWROYW1lJiwgY29uc3QgQXRvbWljU3RyaW5nJiBv
bGRWYWx1ZSk7CisgICAgc3RhdGljIFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+IGNyZWF0ZUNo
YXJhY3RlckRhdGEoQ2hhcmFjdGVyRGF0YSYgdGFyZ2V0LCBjb25zdCBTdHJpbmcmIG9sZFZhbHVl
KTsKIAogICAgIHN0YXRpYyBQYXNzUmVmUHRyPE11dGF0aW9uUmVjb3JkPiBjcmVhdGVXaXRoTnVs
bE9sZFZhbHVlKFBhc3NSZWZQdHI8TXV0YXRpb25SZWNvcmQ+KTsKIApJbmRleDogU291cmNlL1dl
YkNvcmUvZG9tL05vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2Rl
LmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xNDM0LDcgKzE0MzQsNyBAQCB2b2lkIE5vZGU6OnNldFRleHRDb250
ZW50KGNvbnN0IFN0cmluZyYgCiAgICAgICAgIGNhc2UgRU5USVRZX1JFRkVSRU5DRV9OT0RFOgog
ICAgICAgICBjYXNlIERPQ1VNRU5UX0ZSQUdNRU5UX05PREU6IHsKICAgICAgICAgICAgIFJlZjxD
b250YWluZXJOb2RlPiBjb250YWluZXIoKnRvQ29udGFpbmVyTm9kZSh0aGlzKSk7Ci0gICAgICAg
ICAgICBDaGlsZExpc3RNdXRhdGlvblNjb3BlIG11dGF0aW9uKHRoaXMpOworICAgICAgICAgICAg
Q2hpbGRMaXN0TXV0YXRpb25TY29wZSBtdXRhdGlvbihjb250YWluZXIuZ2V0KCkpOwogICAgICAg
ICAgICAgY29udGFpbmVyLT5yZW1vdmVDaGlsZHJlbigpOwogICAgICAgICAgICAgaWYgKCF0ZXh0
LmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgICBjb250YWluZXItPmFwcGVuZENoaWxkKGRvY3Vt
ZW50KCkuY3JlYXRlVGV4dE5vZGUodGV4dCksIGVjKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Rv
bS9SYW5nZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAko
cmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMTcyNSw0NCArMTcyNSw0MiBAQCBpbnQgUmFuZ2U6Om1heEVuZE9mZnNldCgp
IGNvbnN0CiAgICAgcmV0dXJuIG1fZW5kLmNvbnRhaW5lcigpLT5tYXhDaGFyYWN0ZXJPZmZzZXQo
KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJvdW5kYXJ5Tm9kZUNoaWxkcmVuQ2hhbmdlZChS
YW5nZUJvdW5kYXJ5UG9pbnQmIGJvdW5kYXJ5LCBDb250YWluZXJOb2RlKiBjb250YWluZXIpCitz
dGF0aWMgaW5saW5lIHZvaWQgYm91bmRhcnlOb2RlQ2hpbGRyZW5DaGFuZ2VkKFJhbmdlQm91bmRh
cnlQb2ludCYgYm91bmRhcnksIENvbnRhaW5lck5vZGUmIGNvbnRhaW5lcikKIHsKICAgICBpZiAo
IWJvdW5kYXJ5LmNoaWxkQmVmb3JlKCkpCiAgICAgICAgIHJldHVybjsKLSAgICBpZiAoYm91bmRh
cnkuY29udGFpbmVyKCkgIT0gY29udGFpbmVyKQorICAgIGlmIChib3VuZGFyeS5jb250YWluZXIo
KSAhPSAmY29udGFpbmVyKQogICAgICAgICByZXR1cm47CiAgICAgYm91bmRhcnkuaW52YWxpZGF0
ZU9mZnNldCgpOwogfQogCi12b2lkIFJhbmdlOjpub2RlQ2hpbGRyZW5DaGFuZ2VkKENvbnRhaW5l
ck5vZGUqIGNvbnRhaW5lcikKK3ZvaWQgUmFuZ2U6Om5vZGVDaGlsZHJlbkNoYW5nZWQoQ29udGFp
bmVyTm9kZSYgY29udGFpbmVyKQogewotICAgIEFTU0VSVChjb250YWluZXIpOwotICAgIEFTU0VS
VCgmY29udGFpbmVyLT5kb2N1bWVudCgpID09IG1fb3duZXJEb2N1bWVudCk7CisgICAgQVNTRVJU
KCZjb250YWluZXIuZG9jdW1lbnQoKSA9PSBtX293bmVyRG9jdW1lbnQpOwogICAgIGJvdW5kYXJ5
Tm9kZUNoaWxkcmVuQ2hhbmdlZChtX3N0YXJ0LCBjb250YWluZXIpOwogICAgIGJvdW5kYXJ5Tm9k
ZUNoaWxkcmVuQ2hhbmdlZChtX2VuZCwgY29udGFpbmVyKTsKIH0KIAotc3RhdGljIGlubGluZSB2
b2lkIGJvdW5kYXJ5Tm9kZUNoaWxkcmVuV2lsbEJlUmVtb3ZlZChSYW5nZUJvdW5kYXJ5UG9pbnQm
IGJvdW5kYXJ5LCBDb250YWluZXJOb2RlKiBjb250YWluZXIpCitzdGF0aWMgaW5saW5lIHZvaWQg
Ym91bmRhcnlOb2RlQ2hpbGRyZW5XaWxsQmVSZW1vdmVkKFJhbmdlQm91bmRhcnlQb2ludCYgYm91
bmRhcnksIENvbnRhaW5lck5vZGUmIGNvbnRhaW5lcikKIHsKLSAgICBmb3IgKE5vZGUqIG5vZGVU
b0JlUmVtb3ZlZCA9IGNvbnRhaW5lci0+Zmlyc3RDaGlsZCgpOyBub2RlVG9CZVJlbW92ZWQ7IG5v
ZGVUb0JlUmVtb3ZlZCA9IG5vZGVUb0JlUmVtb3ZlZC0+bmV4dFNpYmxpbmcoKSkgeworICAgIGZv
ciAoTm9kZSogbm9kZVRvQmVSZW1vdmVkID0gY29udGFpbmVyLmZpcnN0Q2hpbGQoKTsgbm9kZVRv
QmVSZW1vdmVkOyBub2RlVG9CZVJlbW92ZWQgPSBub2RlVG9CZVJlbW92ZWQtPm5leHRTaWJsaW5n
KCkpIHsKICAgICAgICAgaWYgKGJvdW5kYXJ5LmNoaWxkQmVmb3JlKCkgPT0gbm9kZVRvQmVSZW1v
dmVkKSB7Ci0gICAgICAgICAgICBib3VuZGFyeS5zZXRUb1N0YXJ0T2ZOb2RlKGNvbnRhaW5lcik7
CisgICAgICAgICAgICBib3VuZGFyeS5zZXRUb1N0YXJ0T2ZOb2RlKCZjb250YWluZXIpOwogICAg
ICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChOb2RlKiBuID0gYm91
bmRhcnkuY29udGFpbmVyKCk7IG47IG4gPSBuLT5wYXJlbnROb2RlKCkpIHsKICAgICAgICAgICAg
IGlmIChuID09IG5vZGVUb0JlUmVtb3ZlZCkgewotICAgICAgICAgICAgICAgIGJvdW5kYXJ5LnNl
dFRvU3RhcnRPZk5vZGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgICAgICBib3VuZGFyeS5zZXRU
b1N0YXJ0T2ZOb2RlKCZjb250YWluZXIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAg
ICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBSYW5nZTo6bm9kZUNoaWxkcmVu
V2lsbEJlUmVtb3ZlZChDb250YWluZXJOb2RlKiBjb250YWluZXIpCit2b2lkIFJhbmdlOjpub2Rl
Q2hpbGRyZW5XaWxsQmVSZW1vdmVkKENvbnRhaW5lck5vZGUmIGNvbnRhaW5lcikKIHsKLSAgICBB
U1NFUlQoY29udGFpbmVyKTsKLSAgICBBU1NFUlQoJmNvbnRhaW5lci0+ZG9jdW1lbnQoKSA9PSBt
X293bmVyRG9jdW1lbnQpOworICAgIEFTU0VSVCgmY29udGFpbmVyLmRvY3VtZW50KCkgPT0gbV9v
d25lckRvY3VtZW50KTsKICAgICBib3VuZGFyeU5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQobV9z
dGFydCwgY29udGFpbmVyKTsKICAgICBib3VuZGFyeU5vZGVDaGlsZHJlbldpbGxCZVJlbW92ZWQo
bV9lbmQsIGNvbnRhaW5lcik7CiB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vUmFuZ2UuaAkocmV2aXNpb24gMTU2MjUw
KQorKysgU291cmNlL1dlYkNvcmUvZG9tL1JhbmdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTEyNyw4
ICsxMjcsOCBAQCBwdWJsaWM6CiAgICAgdm9pZCBnZXRCb3JkZXJBbmRUZXh0UXVhZHMoVmVjdG9y
PEZsb2F0UXVhZD4mKSBjb25zdDsKICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0KCkgY29uc3Q7
CiAKLSAgICB2b2lkIG5vZGVDaGlsZHJlbkNoYW5nZWQoQ29udGFpbmVyTm9kZSopOwotICAgIHZv
aWQgbm9kZUNoaWxkcmVuV2lsbEJlUmVtb3ZlZChDb250YWluZXJOb2RlKik7CisgICAgdm9pZCBu
b2RlQ2hpbGRyZW5DaGFuZ2VkKENvbnRhaW5lck5vZGUmKTsKKyAgICB2b2lkIG5vZGVDaGlsZHJl
bldpbGxCZVJlbW92ZWQoQ29udGFpbmVyTm9kZSYpOwogICAgIHZvaWQgbm9kZVdpbGxCZVJlbW92
ZWQoTm9kZSopOwogCiAgICAgdm9pZCB0ZXh0SW5zZXJ0ZWQoTm9kZSosIHVuc2lnbmVkIG9mZnNl
dCwgdW5zaWduZWQgbGVuZ3RoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9TdGF0aWNOb2Rl
TGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL1N0YXRpY05vZGVMaXN0
LmNwcAkocmV2aXNpb24gMTU2MjUxKQorKysgU291cmNlL1dlYkNvcmUvZG9tL1N0YXRpY05vZGVM
aXN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksOCArMjksNiBAQAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIlN0YXRpY05vZGVMaXN0LmgiCiAKLSNpbmNsdWRlICJFbGVtZW50Lmgi
Ci0KIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogdW5zaWduZWQgU3RhdGljTm9kZUxpc3Q6Omxlbmd0
aCgpIGNvbnN0CkBAIC00MSwyMCArMzksMTggQEAgdW5zaWduZWQgU3RhdGljTm9kZUxpc3Q6Omxl
bmd0aCgpIGNvbnN0CiBOb2RlKiBTdGF0aWNOb2RlTGlzdDo6aXRlbSh1bnNpZ25lZCBpbmRleCkg
Y29uc3QKIHsKICAgICBpZiAoaW5kZXggPCBtX25vZGVzLnNpemUoKSkKLSAgICAgICAgcmV0dXJu
IG1fbm9kZXNbaW5kZXhdLmdldCgpOwotICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gJmNv
bnN0X2Nhc3Q8Tm9kZSY+KG1fbm9kZXNbaW5kZXhdLmdldCgpKTsKKyAgICByZXR1cm4gbnVsbHB0
cjsKIH0KIAogTm9kZSogU3RhdGljTm9kZUxpc3Q6Om5hbWVkSXRlbShjb25zdCBBdG9taWNTdHJp
bmcmIGVsZW1lbnRJZCkgY29uc3QKIHsKLSAgICBzaXplX3QgbGVuZ3RoID0gbV9ub2Rlcy5zaXpl
KCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgICBO
b2RlKiBub2RlID0gbV9ub2Rlc1tpXS5nZXQoKTsKLSAgICAgICAgaWYgKG5vZGUtPmlzRWxlbWVu
dE5vZGUoKSAmJiB0b0VsZW1lbnQobm9kZSktPmdldElkQXR0cmlidXRlKCkgPT0gZWxlbWVudElk
KQotICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbGVu
Z3RoID0gbV9ub2Rlcy5zaXplKCk7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgICBOb2RlJiBu
b2RlID0gY29uc3RfY2FzdDxOb2RlJj4obV9ub2Rlc1tpXS5nZXQoKSk7CisgICAgICAgIGlmIChu
b2RlLmlzRWxlbWVudE5vZGUoKSAmJiB0b0VsZW1lbnQobm9kZSkuZ2V0SWRBdHRyaWJ1dGUoKSA9
PSBlbGVtZW50SWQpCisgICAgICAgICAgICByZXR1cm4gJm5vZGU7CiAgICAgfQotCi0gICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHVuc2lnbmVkIFN0YXRpY0VsZW1lbnRM
aXN0OjpsZW5ndGgoKSBjb25zdApAQCAtNjYsMTkgKzYyLDE3IEBAIE5vZGUqIFN0YXRpY0VsZW1l
bnRMaXN0OjppdGVtKHVuc2lnbmVkIGkKIHsKICAgICBpZiAoaW5kZXggPCBtX2VsZW1lbnRzLnNp
emUoKSkKICAgICAgICAgcmV0dXJuICZjb25zdF9jYXN0PEVsZW1lbnQmPihtX2VsZW1lbnRzW2lu
ZGV4XS5nZXQoKSk7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIE5v
ZGUqIFN0YXRpY0VsZW1lbnRMaXN0OjpuYW1lZEl0ZW0oY29uc3QgQXRvbWljU3RyaW5nJiBlbGVt
ZW50SWQpIGNvbnN0CiB7Ci0gICAgc2l6ZV90IGxlbmd0aCA9IG1fZWxlbWVudHMuc2l6ZSgpOwot
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBmb3IgKHVuc2ln
bmVkIGkgPSAwLCBsZW5ndGggPSBtX2VsZW1lbnRzLnNpemUoKTsgaSA8IGxlbmd0aDsgKytpKSB7
CiAgICAgICAgIEVsZW1lbnQmIGVsZW1lbnQgPSBjb25zdF9jYXN0PEVsZW1lbnQmPihtX2VsZW1l
bnRzW2ldLmdldCgpKTsKICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0SWRBdHRyaWJ1dGUoKSA9PSBl
bGVtZW50SWQpCiAgICAgICAgICAgICByZXR1cm4gJmVsZW1lbnQ7CiAgICAgfQotCi0gICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9TdGF0aWNOb2RlTGlzdC5oCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9XZWJDb3JlL2RvbS9TdGF0aWNOb2RlTGlzdC5oCShyZXZpc2lvbiAxNTYyNTEpCisr
KyBTb3VyY2UvV2ViQ29yZS9kb20vU3RhdGljTm9kZUxpc3QuaAkod29ya2luZyBjb3B5KQpAQCAt
MzksNyArMzksNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIFN0YXRpY05vZGVMaXN0
IEZJTkFMIDogcHVibGljIE5vZGVMaXN0IHsKIHB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0
cjxTdGF0aWNOb2RlTGlzdD4gYWRvcHQoVmVjdG9yPFJlZlB0cjxOb2RlPj4mIG5vZGVzKQorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPFN0YXRpY05vZGVMaXN0PiBhZG9wdChWZWN0b3I8UmVmPE5vZGU+
PiYgbm9kZXMpCiAgICAgewogICAgICAgICBSZWZQdHI8U3RhdGljTm9kZUxpc3Q+IG5vZGVMaXN0
ID0gYWRvcHRSZWYobmV3IFN0YXRpY05vZGVMaXN0KTsKICAgICAgICAgbm9kZUxpc3QtPm1fbm9k
ZXMuc3dhcChub2Rlcyk7CkBAIC01OCw3ICs1OCw3IEBAIHB1YmxpYzoKIHByaXZhdGU6CiAgICAg
U3RhdGljTm9kZUxpc3QoKSB7IH0KIAotICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4+IG1fbm9kZXM7
CisgICAgVmVjdG9yPFJlZjxOb2RlPj4gbV9ub2RlczsKIH07CiAKIGNsYXNzIFN0YXRpY0VsZW1l
bnRMaXN0IEZJTkFMIDogcHVibGljIE5vZGVMaXN0IHsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2Vk
aXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2VkaXRpbmcvQXBwbHlTdHlsZUNvbW1hbmQuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3Vy
Y2UvV2ViQ29yZS9lZGl0aW5nL0FwcGx5U3R5bGVDb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMTAzOSwxNCArMTAzOSwxNSBAQCB2b2lkIEFwcGx5U3R5bGVDb21tYW5kOjpwdXNoRG93bklu
bGluZVN0CiAgICAgUmVmUHRyPE5vZGU+IGN1cnJlbnQgPSBoaWdoZXN0QW5jZXN0b3I7CiAgICAg
Ly8gQWxvbmcgdGhlIHdheSwgc3R5bGVkIGVsZW1lbnRzIHRoYXQgY29udGFpbiB0YXJnZXROb2Rl
IGFyZSByZW1vdmVkIGFuZCBhY2N1bXVsYXRlZCBpbnRvIGVsZW1lbnRzVG9QdXNoRG93bi4KICAg
ICAvLyBFYWNoIGNoaWxkIG9mIHRoZSByZW1vdmVkIGVsZW1lbnQsIGV4Y2x1c2luZyBhbmNlc3Rv
cnMgb2YgdGFyZ2V0Tm9kZSwgaXMgdGhlbiB3cmFwcGVkIGJ5IGNsb25lcyBvZiBlbGVtZW50cyBp
biBlbGVtZW50c1RvUHVzaERvd24uCi0gICAgVmVjdG9yPFJlZlB0cjxFbGVtZW50PiA+IGVsZW1l
bnRzVG9QdXNoRG93bjsKKyAgICBWZWN0b3I8UmVmPEVsZW1lbnQ+PiBlbGVtZW50c1RvUHVzaERv
d247CiAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudCAhPSB0YXJnZXROb2RlICYmIGN1cnJl
bnQtPmNvbnRhaW5zKHRhcmdldE5vZGUpKSB7CiAgICAgICAgIE5vZGVWZWN0b3IgY3VycmVudENo
aWxkcmVuOwotICAgICAgICBnZXRDaGlsZE5vZGVzKGN1cnJlbnQuZ2V0KCksIGN1cnJlbnRDaGls
ZHJlbik7CisgICAgICAgIGdldENoaWxkTm9kZXMoKmN1cnJlbnQuZ2V0KCksIGN1cnJlbnRDaGls
ZHJlbik7CisKICAgICAgICAgUmVmUHRyPFN0eWxlZEVsZW1lbnQ+IHN0eWxlZEVsZW1lbnQ7CiAg
ICAgICAgIGlmIChjdXJyZW50LT5pc1N0eWxlZEVsZW1lbnQoKSAmJiBpc1N0eWxlZElubGluZUVs
ZW1lbnRUb1JlbW92ZSh0b0VsZW1lbnQoY3VycmVudC5nZXQoKSkpKSB7CiAgICAgICAgICAgICBz
dHlsZWRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8U3R5bGVkRWxlbWVudCo+KGN1cnJlbnQuZ2V0KCkp
OwotICAgICAgICAgICAgZWxlbWVudHNUb1B1c2hEb3duLmFwcGVuZChzdHlsZWRFbGVtZW50KTsK
KyAgICAgICAgICAgIGVsZW1lbnRzVG9QdXNoRG93bi5hcHBlbmQoKnN0eWxlZEVsZW1lbnQpOwog
ICAgICAgICB9CiAKICAgICAgICAgUmVmUHRyPEVkaXRpbmdTdHlsZT4gc3R5bGVUb1B1c2hEb3du
ID0gRWRpdGluZ1N0eWxlOjpjcmVhdGUoKTsKQEAgLTEwNTYsMjYgKzEwNTcsMjYgQEAgdm9pZCBB
cHBseVN0eWxlQ29tbWFuZDo6cHVzaERvd25JbmxpbmVTdAogICAgICAgICAvLyBUaGUgaW5uZXIg
bG9vcCB3aWxsIGdvIHRocm91Z2ggY2hpbGRyZW4gb24gZWFjaCBsZXZlbAogICAgICAgICAvLyBG
SVhNRTogd2Ugc2hvdWxkIGFnZ3JlZ2F0ZSBpbmxpbmUgY2hpbGQgZWxlbWVudHMgdG9nZXRoZXIg
c28gdGhhdCB3ZSBkb24ndCB3cmFwIGVhY2ggY2hpbGQgc2VwYXJhdGVseS4KICAgICAgICAgZm9y
IChzaXplX3QgaSA9IDA7IGkgPCBjdXJyZW50Q2hpbGRyZW4uc2l6ZSgpOyArK2kpIHsKLSAgICAg
ICAgICAgIE5vZGUqIGNoaWxkID0gY3VycmVudENoaWxkcmVuW2ldLmdldCgpOwotICAgICAgICAg
ICAgaWYgKCFjaGlsZC0+cGFyZW50Tm9kZSgpKQorICAgICAgICAgICAgTm9kZSYgY2hpbGQgPSBj
dXJyZW50Q2hpbGRyZW5baV0uZ2V0KCk7CisgICAgICAgICAgICBpZiAoIWNoaWxkLnBhcmVudE5v
ZGUoKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICghY2hpbGQt
PmNvbnRhaW5zKHRhcmdldE5vZGUpICYmIGVsZW1lbnRzVG9QdXNoRG93bi5zaXplKCkpIHsKKyAg
ICAgICAgICAgIGlmICghY2hpbGQuY29udGFpbnModGFyZ2V0Tm9kZSkgJiYgZWxlbWVudHNUb1B1
c2hEb3duLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
ZWxlbWVudHNUb1B1c2hEb3duLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIFJl
ZlB0cjxFbGVtZW50PiB3cmFwcGVyID0gZWxlbWVudHNUb1B1c2hEb3duW2ldLT5jbG9uZUVsZW1l
bnRXaXRob3V0Q2hpbGRyZW4oKTsKICAgICAgICAgICAgICAgICAgICAgd3JhcHBlci0+cmVtb3Zl
QXR0cmlidXRlKHN0eWxlQXR0cik7Ci0gICAgICAgICAgICAgICAgICAgIHN1cnJvdW5kTm9kZVJh
bmdlV2l0aEVsZW1lbnQoY2hpbGQsIGNoaWxkLCB3cmFwcGVyKTsKKyAgICAgICAgICAgICAgICAg
ICAgc3Vycm91bmROb2RlUmFuZ2VXaXRoRWxlbWVudCgmY2hpbGQsICZjaGlsZCwgd3JhcHBlcik7
CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBBcHBs
eSBzdHlsZSB0byBhbGwgbm9kZXMgY29udGFpbmluZyB0YXJnZXROb2RlIGFuZCB0aGVpciBzaWJs
aW5ncyBidXQgTk9UIHRvIHRhcmdldE5vZGUKICAgICAgICAgICAgIC8vIEJ1dCBpZiB3ZSd2ZSBy
ZW1vdmVkIHN0eWxlZEVsZW1lbnQgdGhlbiBnbyBhaGVhZCBhbmQgYWx3YXlzIGFwcGx5IHRoZSBz
dHlsZS4KLSAgICAgICAgICAgIGlmIChjaGlsZCAhPSB0YXJnZXROb2RlIHx8IHN0eWxlZEVsZW1l
bnQpCi0gICAgICAgICAgICAgICAgYXBwbHlJbmxpbmVTdHlsZVRvUHVzaERvd24oY2hpbGQsIHN0
eWxlVG9QdXNoRG93bi5nZXQoKSk7CisgICAgICAgICAgICBpZiAoJmNoaWxkICE9IHRhcmdldE5v
ZGUgfHwgc3R5bGVkRWxlbWVudCkKKyAgICAgICAgICAgICAgICBhcHBseUlubGluZVN0eWxlVG9Q
dXNoRG93bigmY2hpbGQsIHN0eWxlVG9QdXNoRG93bi5nZXQoKSk7CiAKICAgICAgICAgICAgIC8v
IFdlIGZvdW5kIHRoZSBuZXh0IG5vZGUgZm9yIHRoZSBvdXRlciBsb29wIChjb250YWlucyB0YXJn
ZXROb2RlKQogICAgICAgICAgICAgLy8gV2hlbiByZWFjaGVkIHRhcmdldE5vZGUsIHN0b3AgdGhl
IG91dGVyIGxvb3AgdXBvbiB0aGUgY29tcGxldGlvbiBvZiB0aGUgY3VycmVudCBpbm5lciBsb29w
Ci0gICAgICAgICAgICBpZiAoY2hpbGQgPT0gdGFyZ2V0Tm9kZSB8fCBjaGlsZC0+Y29udGFpbnMo
dGFyZ2V0Tm9kZSkpCi0gICAgICAgICAgICAgICAgY3VycmVudCA9IGNoaWxkOworICAgICAgICAg
ICAgaWYgKCZjaGlsZCA9PSB0YXJnZXROb2RlIHx8IGNoaWxkLmNvbnRhaW5zKHRhcmdldE5vZGUp
KQorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSAmY2hpbGQ7CiAgICAgICAgIH0KICAgICB9CiB9
CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5kLmNwcAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL0NvbXBvc2l0ZUVkaXRDb21tYW5k
LmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9Db21wb3Np
dGVFZGl0Q29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyMCwxMSArNDIwLDExIEBAIHZv
aWQgQ29tcG9zaXRlRWRpdENvbW1hbmQ6Om1vdmVSZW1haW5pbmcKICAgICBSZWZQdHI8RWxlbWVu
dD4gbmV3UGFyZW50ID0gcHJwTmV3UGFyZW50OwogCiAgICAgZm9yICg7IG5vZGUgJiYgbm9kZSAh
PSBwYXN0TGFzdE5vZGVUb01vdmU7IG5vZGUgPSBub2RlLT5uZXh0U2libGluZygpKQotICAgICAg
ICBub2Rlc1RvUmVtb3ZlLmFwcGVuZChub2RlKTsKKyAgICAgICAgbm9kZXNUb1JlbW92ZS5hcHBl
bmQoKm5vZGUpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5vZGVzVG9SZW1vdmUu
c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVtb3ZlTm9kZShub2Rlc1RvUmVtb3ZlW2ldKTsKLSAg
ICAgICAgYXBwZW5kTm9kZShub2Rlc1RvUmVtb3ZlW2ldLCBuZXdQYXJlbnQpOworICAgICAgICBy
ZW1vdmVOb2RlKCZub2Rlc1RvUmVtb3ZlW2ldLmdldCgpKTsKKyAgICAgICAgYXBwZW5kTm9kZSgm
bm9kZXNUb1JlbW92ZVtpXS5nZXQoKSwgbmV3UGFyZW50KTsKICAgICB9CiB9CiAKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVwbGFjZU5vZGVXaXRoU3BhbkNvbW1hbmQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvUmVwbGFjZU5vZGVXaXRoU3BhbkNvbW1h
bmQuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9lZGl0aW5nL1JlcGxh
Y2VOb2RlV2l0aFNwYW5Db21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYsOSArNTYsOSBA
QCBzdGF0aWMgdm9pZCBzd2FwSW5Ob2RlUHJlc2VydmluZ0F0dHJpYnV0CiAgICAgLy8gRklYTUU6
IEZpeCB0aGlzIHRvIHNlbmQgdGhlIHByb3BlciBNdXRhdGlvblJlY29yZHMgd2hlbiBNdXRhdGlv
bk9ic2VydmVycyBhcmUgcHJlc2VudC4KICAgICBuZXdOb2RlLT5jbG9uZURhdGFGcm9tRWxlbWVu
dCgqbm9kZVRvUmVwbGFjZSk7CiAgICAgTm9kZVZlY3RvciBjaGlsZHJlbjsKLSAgICBnZXRDaGls
ZE5vZGVzKG5vZGVUb1JlcGxhY2UsIGNoaWxkcmVuKTsKKyAgICBnZXRDaGlsZE5vZGVzKCpub2Rl
VG9SZXBsYWNlLCBjaGlsZHJlbik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGlsZHJl
bi5zaXplKCk7ICsraSkKLSAgICAgICAgbmV3Tm9kZS0+YXBwZW5kQ2hpbGQoY2hpbGRyZW5baV0s
IEFTU0VSVF9OT19FWENFUFRJT04pOworICAgICAgICBuZXdOb2RlLT5hcHBlbmRDaGlsZCgmY2hp
bGRyZW5baV0uZ2V0KCksIEFTU0VSVF9OT19FWENFUFRJT04pOwogCiAgICAgcGFyZW50Tm9kZS0+
aW5zZXJ0QmVmb3JlKG5ld05vZGUsIG5vZGVUb1JlcGxhY2UsIEFTU0VSVF9OT19FWENFUFRJT04p
OwogICAgIHBhcmVudE5vZGUtPnJlbW92ZUNoaWxkKG5vZGVUb1JlcGxhY2UsIEFTU0VSVF9OT19F
WENFUFRJT04pOwpJbmRleDogU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2VkaXRpbmcvbWFya3VwLmNwcAkocmV2aXNpb24gMTU2
MjUwKQorKysgU291cmNlL1dlYkNvcmUvZWRpdGluZy9tYXJrdXAuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0xMDY3LDggKzEwNjcsNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wgaGFzT25lVGV4dENoaWxk
KENvbnRhCiAKIHZvaWQgcmVwbGFjZUNoaWxkcmVuV2l0aEZyYWdtZW50KENvbnRhaW5lck5vZGUq
IGNvbnRhaW5lciwgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCwgRXhjZXB0
aW9uQ29kZSYgZWMpCiB7Ci0gICAgUmVmUHRyPENvbnRhaW5lck5vZGU+IGNvbnRhaW5lck5vZGUo
Y29udGFpbmVyKTsKLQorICAgIFJlZjxDb250YWluZXJOb2RlPiBjb250YWluZXJOb2RlKCpjb250
YWluZXIpOwogICAgIENoaWxkTGlzdE11dGF0aW9uU2NvcGUgbXV0YXRpb24oY29udGFpbmVyTm9k
ZS5nZXQoKSk7CiAKICAgICBpZiAoIWZyYWdtZW50LT5maXJzdENoaWxkKCkpIHsKQEAgLTEwNzYs
MTIgKzEwNzUsMTIgQEAgdm9pZCByZXBsYWNlQ2hpbGRyZW5XaXRoRnJhZ21lbnQoQ29udGFpbgog
ICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGhhc09uZVRleHRDaGlsZChjb250YWlu
ZXJOb2RlLmdldCgpKSAmJiBoYXNPbmVUZXh0Q2hpbGQoZnJhZ21lbnQuZ2V0KCkpKSB7CisgICAg
aWYgKGhhc09uZVRleHRDaGlsZCgmY29udGFpbmVyTm9kZS5nZXQoKSkgJiYgaGFzT25lVGV4dENo
aWxkKGZyYWdtZW50LmdldCgpKSkgewogICAgICAgICB0b1RleHQoY29udGFpbmVyTm9kZS0+Zmly
c3RDaGlsZCgpKS0+c2V0RGF0YSh0b1RleHQoZnJhZ21lbnQtPmZpcnN0Q2hpbGQoKSktPmRhdGEo
KSwgZWMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgaWYgKGhhc09uZUNoaWxkKGNv
bnRhaW5lck5vZGUuZ2V0KCkpKSB7CisgICAgaWYgKGhhc09uZUNoaWxkKCZjb250YWluZXJOb2Rl
LmdldCgpKSkgewogICAgICAgICBjb250YWluZXJOb2RlLT5yZXBsYWNlQ2hpbGQoZnJhZ21lbnQs
IGNvbnRhaW5lck5vZGUtPmZpcnN0Q2hpbGQoKSwgZWMpOwogICAgICAgICByZXR1cm47CiAgICAg
fQpAQCAtMTA5MiwxOCArMTA5MSwxNyBAQCB2b2lkIHJlcGxhY2VDaGlsZHJlbldpdGhGcmFnbWVu
dChDb250YWluCiAKIHZvaWQgcmVwbGFjZUNoaWxkcmVuV2l0aFRleHQoQ29udGFpbmVyTm9kZSog
Y29udGFpbmVyLCBjb25zdCBTdHJpbmcmIHRleHQsIEV4Y2VwdGlvbkNvZGUmIGVjKQogewotICAg
IFJlZlB0cjxDb250YWluZXJOb2RlPiBjb250YWluZXJOb2RlKGNvbnRhaW5lcik7Ci0KKyAgICBS
ZWY8Q29udGFpbmVyTm9kZT4gY29udGFpbmVyTm9kZSgqY29udGFpbmVyKTsKICAgICBDaGlsZExp
c3RNdXRhdGlvblNjb3BlIG11dGF0aW9uKGNvbnRhaW5lck5vZGUuZ2V0KCkpOwogCi0gICAgaWYg
KGhhc09uZVRleHRDaGlsZChjb250YWluZXJOb2RlLmdldCgpKSkgeworICAgIGlmIChoYXNPbmVU
ZXh0Q2hpbGQoJmNvbnRhaW5lck5vZGUuZ2V0KCkpKSB7CiAgICAgICAgIHRvVGV4dChjb250YWlu
ZXJOb2RlLT5maXJzdENoaWxkKCkpLT5zZXREYXRhKHRleHQsIGVjKTsKICAgICAgICAgcmV0dXJu
OwogICAgIH0KIAogICAgIFJlZlB0cjxUZXh0PiB0ZXh0Tm9kZSA9IFRleHQ6OmNyZWF0ZShjb250
YWluZXJOb2RlLT5kb2N1bWVudCgpLCB0ZXh0KTsKIAotICAgIGlmIChoYXNPbmVDaGlsZChjb250
YWluZXJOb2RlLmdldCgpKSkgeworICAgIGlmIChoYXNPbmVDaGlsZCgmY29udGFpbmVyTm9kZS5n
ZXQoKSkpIHsKICAgICAgICAgY29udGFpbmVyTm9kZS0+cmVwbGFjZUNoaWxkKHRleHROb2RlLnJl
bGVhc2UoKSwgY29udGFpbmVyTm9kZS0+Zmlyc3RDaGlsZCgpLCBlYyk7CiAgICAgICAgIHJldHVy
bjsKICAgICB9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGcmFtZUVsZW1lbnRCYXNl
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGcmFtZUVsZW1lbnRC
YXNlLmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRnJh
bWVFbGVtZW50QmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1OSw3ICsxNTksNyBAQCB2b2lk
IEhUTUxGcmFtZUVsZW1lbnRCYXNlOjpkaWROb3RpZnlTdWJ0CiAgICAgaWYgKCFkb2N1bWVudCgp
LmZyYW1lKCkpCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmICghU3ViZnJhbWVMb2FkaW5nRGlz
YWJsZXI6OmNhbkxvYWRGcmFtZSh0aGlzKSkKKyAgICBpZiAoIVN1YmZyYW1lTG9hZGluZ0Rpc2Fi
bGVyOjpjYW5Mb2FkRnJhbWUoKnRoaXMpKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBKYXZh
U2NyaXB0IGluIHNyYz1qYXZhc2NyaXB0OiBhbmQgYmVmb3Jlb25sb2FkIGNhbiBhY2Nlc3MgdGhl
IHJlbmRlcmVyCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGcmFtZU93bmVyRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRnJhbWVPd25lckVs
ZW1lbnQuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxG
cmFtZU93bmVyRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyNiw5ICsxMjYsOSBAQCBT
VkdEb2N1bWVudCogSFRNTEZyYW1lT3duZXJFbGVtZW50OjpnZXRTCiB9CiAjZW5kaWYKIAotYm9v
bCBTdWJmcmFtZUxvYWRpbmdEaXNhYmxlcjo6Y2FuTG9hZEZyYW1lKEhUTUxGcmFtZU93bmVyRWxl
bWVudCogb3duZXIpCitib29sIFN1YmZyYW1lTG9hZGluZ0Rpc2FibGVyOjpjYW5Mb2FkRnJhbWUo
SFRNTEZyYW1lT3duZXJFbGVtZW50JiBvd25lcikKIHsKLSAgICBmb3IgKE5vZGUqIG5vZGUgPSBv
d25lcjsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE9yU2hhZG93SG9zdE5vZGUoKSkgeworICAg
IGZvciAoTm9kZSogbm9kZSA9ICZvd25lcjsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE9yU2hh
ZG93SG9zdE5vZGUoKSkgewogICAgICAgICBpZiAoZGlzYWJsZWRTdWJ0cmVlUm9vdHMoKS5jb250
YWlucyhub2RlKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxGcmFtZU93bmVyRWxlbWVudC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZyYW1lT3duZXJFbGVtZW50LmgJKHJldmlzaW9uIDE1NjI1
MCkKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZyYW1lT3duZXJFbGVtZW50LmgJKHdvcmtp
bmcgY29weSkKQEAgLTg1LDE4ICs4NSwxOCBAQCBpbmxpbmUgSFRNTEZyYW1lT3duZXJFbGVtZW50
KiB0b0ZyYW1lT3duCiAKIGNsYXNzIFN1YmZyYW1lTG9hZGluZ0Rpc2FibGVyIHsKIHB1YmxpYzoK
LSAgICBleHBsaWNpdCBTdWJmcmFtZUxvYWRpbmdEaXNhYmxlcihOb2RlKiByb290KQorICAgIGV4
cGxpY2l0IFN1YmZyYW1lTG9hZGluZ0Rpc2FibGVyKE5vZGUmIHJvb3QpCiAgICAgICAgIDogbV9y
b290KHJvb3QpCiAgICAgewotICAgICAgICBkaXNhYmxlZFN1YnRyZWVSb290cygpLmFkZChtX3Jv
b3QpOworICAgICAgICBkaXNhYmxlZFN1YnRyZWVSb290cygpLmFkZCgmbV9yb290KTsKICAgICB9
CiAKICAgICB+U3ViZnJhbWVMb2FkaW5nRGlzYWJsZXIoKQogICAgIHsKLSAgICAgICAgZGlzYWJs
ZWRTdWJ0cmVlUm9vdHMoKS5yZW1vdmUobV9yb290KTsKKyAgICAgICAgZGlzYWJsZWRTdWJ0cmVl
Um9vdHMoKS5yZW1vdmUoJm1fcm9vdCk7CiAgICAgfQogCi0gICAgc3RhdGljIGJvb2wgY2FuTG9h
ZEZyYW1lKEhUTUxGcmFtZU93bmVyRWxlbWVudCopOworICAgIHN0YXRpYyBib29sIGNhbkxvYWRG
cmFtZShIVE1MRnJhbWVPd25lckVsZW1lbnQmKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgSGFz
aFNldDxOb2RlKj4mIGRpc2FibGVkU3VidHJlZVJvb3RzKCkKQEAgLTEwNSw3ICsxMDUsNyBAQCBw
cml2YXRlOgogICAgICAgICByZXR1cm4gbm9kZXM7CiAgICAgfQogCi0gICAgTm9kZSogbV9yb290
OworICAgIE5vZGUmIG1fcm9vdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTE1lZGlhRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcAkocmV2aXNpb24gMTU2MjUw
KQorKysgU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MTWVkaWFFbGVtZW50LmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzQ1MCw3ICszNDUwLDYgQEAgS1VSTCBIVE1MTWVkaWFFbGVtZW50OjpzZWxlY3RO
ZXh0U291cmNlQwogICAgIH0KIAogICAgIEtVUkwgbWVkaWFVUkw7Ci0gICAgTm9kZSogbm9kZTsK
ICAgICBIVE1MU291cmNlRWxlbWVudCogc291cmNlID0gMDsKICAgICBTdHJpbmcgdHlwZTsKICAg
ICBTdHJpbmcgc3lzdGVtOwpAQCAtMzQ1OSwyMCArMzQ1OCwyMCBAQCBLVVJMIEhUTUxNZWRpYUVs
ZW1lbnQ6OnNlbGVjdE5leHRTb3VyY2VDCiAgICAgYm9vbCBva1RvTG9hZFNvdXJjZVVSTDsKIAog
ICAgIE5vZGVWZWN0b3IgcG90ZW50aWFsU291cmNlTm9kZXM7Ci0gICAgZ2V0Q2hpbGROb2Rlcyh0
aGlzLCBwb3RlbnRpYWxTb3VyY2VOb2Rlcyk7CisgICAgZ2V0Q2hpbGROb2RlcygqdGhpcywgcG90
ZW50aWFsU291cmNlTm9kZXMpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgIWNhblVzZVNv
dXJjZUVsZW1lbnQgJiYgaSA8IHBvdGVudGlhbFNvdXJjZU5vZGVzLnNpemUoKTsgKytpKSB7Ci0g
ICAgICAgIG5vZGUgPSBwb3RlbnRpYWxTb3VyY2VOb2Rlc1tpXS5nZXQoKTsKLSAgICAgICAgaWYg
KGxvb2tpbmdGb3JTdGFydE5vZGUgJiYgbV9uZXh0Q2hpbGROb2RlVG9Db25zaWRlciAhPSBub2Rl
KQorICAgICAgICBOb2RlJiBub2RlID0gcG90ZW50aWFsU291cmNlTm9kZXNbaV0uZ2V0KCk7Cisg
ICAgICAgIGlmIChsb29raW5nRm9yU3RhcnROb2RlICYmIG1fbmV4dENoaWxkTm9kZVRvQ29uc2lk
ZXIgIT0gJm5vZGUpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgbG9va2luZ0ZvclN0
YXJ0Tm9kZSA9IGZhbHNlOwogCi0gICAgICAgIGlmICghbm9kZS0+aGFzVGFnTmFtZShzb3VyY2VU
YWcpKQorICAgICAgICBpZiAoIW5vZGUuaGFzVGFnTmFtZShzb3VyY2VUYWcpKQogICAgICAgICAg
ICAgY29udGludWU7Ci0gICAgICAgIGlmIChub2RlLT5wYXJlbnROb2RlKCkgIT0gdGhpcykKKyAg
ICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSgpICE9IHRoaXMpCiAgICAgICAgICAgICBjb250aW51
ZTsKIAotICAgICAgICBzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVE1MU291cmNlRWxlbWVudCo+KG5v
ZGUpOworICAgICAgICBzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVE1MU291cmNlRWxlbWVudCo+KCZu
b2RlKTsKIAogICAgICAgICAvLyBJZiBjYW5kaWRhdGUgZG9lcyBub3QgaGF2ZSBhIHNyYyBhdHRy
aWJ1dGUsIG9yIGlmIGl0cyBzcmMgYXR0cmlidXRlJ3MgdmFsdWUgaXMgdGhlIGVtcHR5IHN0cmlu
ZyAuLi4ganVtcCBkb3duIHRvIHRoZSBmYWlsZWQgc3RlcCBiZWxvdwogICAgICAgICBtZWRpYVVS
TCA9IHNvdXJjZS0+Z2V0Tm9uRW1wdHlVUkxBdHRyaWJ1dGUoc3JjQXR0cik7CkBAIC0zNTExLDcg
KzM1MTAsNyBAQCBLVVJMIEhUTUxNZWRpYUVsZW1lbnQ6OnNlbGVjdE5leHRTb3VyY2VDCiAgICAg
ICAgIG9rVG9Mb2FkU291cmNlVVJMID0gaXNTYWZlVG9Mb2FkVVJMKG1lZGlhVVJMLCBhY3Rpb25J
ZkludmFsaWQpICYmIGRpc3BhdGNoQmVmb3JlTG9hZEV2ZW50KG1lZGlhVVJMLnN0cmluZygpKTsK
IAogICAgICAgICAvLyBBICdiZWZvcmVsb2FkJyBldmVudCBoYW5kbGVyIGNhbiBtdXRhdGUgdGhl
IERPTSwgc28gY2hlY2sgdG8gc2VlIGlmIHRoZSBzb3VyY2UgZWxlbWVudCBpcyBzdGlsbCBhIGNo
aWxkIG5vZGUuCi0gICAgICAgIGlmIChub2RlLT5wYXJlbnROb2RlKCkgIT0gdGhpcykgeworICAg
ICAgICBpZiAobm9kZS5wYXJlbnROb2RlKCkgIT0gdGhpcykgewogICAgICAgICAgICAgTE9HKE1l
ZGlhLCAiSFRNTE1lZGlhRWxlbWVudDo6c2VsZWN0TmV4dFNvdXJjZUNoaWxkIDogJ2JlZm9yZWxv
YWQnIHJlbW92ZWQgY3VycmVudCBlbGVtZW50Iik7CiAgICAgICAgICAgICBzb3VyY2UgPSAwOwog
ICAgICAgICAgICAgZ290byBjaGVja19hZ2FpbjsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwv
SFRNTE9iamVjdEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwv
SFRNTE9iamVjdEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29y
ZS9odG1sL0hUTUxPYmplY3RFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjg0LDcgKzI4
NCw3IEBAIHZvaWQgSFRNTE9iamVjdEVsZW1lbnQ6OnVwZGF0ZVdpZGdldChQbHUKICAgICAvLyBG
SVhNRTogSSdtIG5vdCBzdXJlIGl0J3MgZXZlciBwb3NzaWJsZSB0byBnZXQgaW50byB1cGRhdGVX
aWRnZXQgZHVyaW5nIGEKICAgICAvLyByZW1vdmFsLCBidXQganVzdCBpbiBjYXNlIHdlIHNob3Vs
ZCBhdm9pZCBsb2FkaW5nIHRoZSBmcmFtZSB0byBwcmV2ZW50CiAgICAgLy8gc2VjdXJpdHkgYnVn
cy4KLSAgICBpZiAoIVN1YmZyYW1lTG9hZGluZ0Rpc2FibGVyOjpjYW5Mb2FkRnJhbWUodGhpcykp
CisgICAgaWYgKCFTdWJmcmFtZUxvYWRpbmdEaXNhYmxlcjo6Y2FuTG9hZEZyYW1lKCp0aGlzKSkK
ICAgICAgICAgcmV0dXJuOwogCiAgICAgU3RyaW5nIHVybCA9IHRoaXMtPnVybCgpOwpJbmRleDog
U291cmNlL1dlYkNvcmUvaHRtbC9wYXJzZXIvSFRNTFRyZWVCdWlsZGVyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MVHJlZUJ1aWxkZXIuY3BwCShyZXZp
c2lvbiAxNTYyNTApCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL3BhcnNlci9IVE1MVHJlZUJ1aWxk
ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xNTgxLDcgKzE1ODEsNyBAQCB2b2lkIEhUTUxUcmVl
QnVpbGRlcjo6Y2FsbFRoZUFkb3B0aW9uQWdlCiAgICAgICAgICAgICAgICAgYm9va21hcmsubW92
ZVRvQWZ0ZXIobm9kZUVudHJ5KTsKICAgICAgICAgICAgIC8vIDkuOQogICAgICAgICAgICAgaWYg
KENvbnRhaW5lck5vZGUqIHBhcmVudCA9IGxhc3ROb2RlLT5lbGVtZW50KCktPnBhcmVudE5vZGUo
KSkKLSAgICAgICAgICAgICAgICBwYXJlbnQtPnBhcnNlclJlbW92ZUNoaWxkKGxhc3ROb2RlLT5l
bGVtZW50KCkpOworICAgICAgICAgICAgICAgIHBhcmVudC0+cGFyc2VyUmVtb3ZlQ2hpbGQoKmxh
c3ROb2RlLT5lbGVtZW50KCkpOwogICAgICAgICAgICAgbm9kZS0+ZWxlbWVudCgpLT5wYXJzZXJB
cHBlbmRDaGlsZChsYXN0Tm9kZS0+ZWxlbWVudCgpKTsKICAgICAgICAgICAgIGlmIChsYXN0Tm9k
ZS0+ZWxlbWVudCgpLT5wYXJlbnRFbGVtZW50KCktPmF0dGFjaGVkKCkgJiYgIWxhc3ROb2RlLT5l
bGVtZW50KCktPmF0dGFjaGVkKCkpCiAgICAgICAgICAgICAgICAgbGFzdE5vZGUtPmVsZW1lbnQo
KS0+bGF6eUF0dGFjaCgpOwpAQCAtMTU5MCw3ICsxNTkwLDcgQEAgdm9pZCBIVE1MVHJlZUJ1aWxk
ZXI6OmNhbGxUaGVBZG9wdGlvbkFnZQogICAgICAgICB9CiAgICAgICAgIC8vIDEwLgogICAgICAg
ICBpZiAoQ29udGFpbmVyTm9kZSogcGFyZW50ID0gbGFzdE5vZGUtPmVsZW1lbnQoKS0+cGFyZW50
Tm9kZSgpKQotICAgICAgICAgICAgcGFyZW50LT5wYXJzZXJSZW1vdmVDaGlsZChsYXN0Tm9kZS0+
ZWxlbWVudCgpKTsKKyAgICAgICAgICAgIHBhcmVudC0+cGFyc2VyUmVtb3ZlQ2hpbGQoKmxhc3RO
b2RlLT5lbGVtZW50KCkpOwogICAgICAgICBpZiAoY29tbW9uQW5jZXN0b3ItPmNhdXNlc0Zvc3Rl
clBhcmVudGluZygpKQogICAgICAgICAgICAgbV90cmVlLmZvc3RlclBhcmVudChsYXN0Tm9kZS0+
ZWxlbWVudCgpKTsKICAgICAgICAgZWxzZSB7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
RWxlbWVudEluc3RhbmNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZH
RWxlbWVudEluc3RhbmNlLmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291cmNlL1dlYkNvcmUv
c3ZnL1NWR0VsZW1lbnRJbnN0YW5jZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE1Nyw3ICsxNTcs
NyBAQCB2b2lkIFNWR0VsZW1lbnRJbnN0YW5jZTo6ZGV0YWNoKCkKICAgICBtX2RpcmVjdFVzZUVs
ZW1lbnQgPSAwOwogICAgIG1fY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQgPSAwOwogCi0gICAgcmVt
b3ZlRGV0YWNoZWRDaGlsZHJlbkluQ29udGFpbmVyPFNWR0VsZW1lbnRJbnN0YW5jZSwgU1ZHRWxl
bWVudEluc3RhbmNlPih0aGlzKTsKKyAgICByZW1vdmVEZXRhY2hlZENoaWxkcmVuSW5Db250YWlu
ZXI8U1ZHRWxlbWVudEluc3RhbmNlLCBTVkdFbGVtZW50SW5zdGFuY2U+KCp0aGlzKTsKIH0KIAog
UGFzc1JlZlB0cjxTVkdFbGVtZW50SW5zdGFuY2VMaXN0PiBTVkdFbGVtZW50SW5zdGFuY2U6OmNo
aWxkTm9kZXMoKQpAQCAtMTc4LDcgKzE3OCw3IEBAIHZvaWQgU1ZHRWxlbWVudEluc3RhbmNlOjpz
ZXRTaGFkb3dUcmVlRWwKIAogdm9pZCBTVkdFbGVtZW50SW5zdGFuY2U6OmFwcGVuZENoaWxkKFBh
c3NSZWZQdHI8U1ZHRWxlbWVudEluc3RhbmNlPiBjaGlsZCkKIHsKLSAgICBhcHBlbmRDaGlsZFRv
Q29udGFpbmVyPFNWR0VsZW1lbnRJbnN0YW5jZSwgU1ZHRWxlbWVudEluc3RhbmNlPihjaGlsZC5n
ZXQoKSwgdGhpcyk7CisgICAgYXBwZW5kQ2hpbGRUb0NvbnRhaW5lcjxTVkdFbGVtZW50SW5zdGFu
Y2UsIFNWR0VsZW1lbnRJbnN0YW5jZT4oY2hpbGQuZ2V0KCksICp0aGlzKTsKIH0KIAogdm9pZCBT
VkdFbGVtZW50SW5zdGFuY2U6OmludmFsaWRhdGVBbGxJbnN0YW5jZXNPZkVsZW1lbnQoU1ZHRWxl
bWVudCogZWxlbWVudCkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVtZW50SW5zdGFu
Y2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9zdmcvU1ZHRWxlbWVudEluc3RhbmNl
LmgJKHJldmlzaW9uIDE1NjI1MCkKKysrIFNvdXJjZS9XZWJDb3JlL3N2Zy9TVkdFbGVtZW50SW5z
dGFuY2UuaAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjksNyBAQCBuYW1lc3BhY2UgV2ViQ29y
ZSB7CiAKIG5hbWVzcGFjZSBQcml2YXRlIHsKIHRlbXBsYXRlPGNsYXNzIEdlbmVyaWNOb2RlLCBj
bGFzcyBHZW5lcmljTm9kZUNvbnRhaW5lcj4KLXZvaWQgYWRkQ2hpbGROb2Rlc1RvRGVsZXRpb25R
dWV1ZShHZW5lcmljTm9kZSomIGhlYWQsIEdlbmVyaWNOb2RlKiYgdGFpbCwgR2VuZXJpY05vZGVD
b250YWluZXIqIGNvbnRhaW5lcik7Cit2b2lkIGFkZENoaWxkTm9kZXNUb0RlbGV0aW9uUXVldWUo
R2VuZXJpY05vZGUqJiBoZWFkLCBHZW5lcmljTm9kZSomIHRhaWwsIEdlbmVyaWNOb2RlQ29udGFp
bmVyJiBjb250YWluZXIpOwogfTsKIAogY2xhc3MgRG9jdW1lbnQ7CkBAIC0xNTksMTMgKzE1OSwx
MyBAQCBwcml2YXRlOgogICAgIHZvaWQgc2V0U2hhZG93VHJlZUVsZW1lbnQoU1ZHRWxlbWVudCop
OwogCiAgICAgdGVtcGxhdGU8Y2xhc3MgR2VuZXJpY05vZGUsIGNsYXNzIEdlbmVyaWNOb2RlQ29u
dGFpbmVyPgotICAgIGZyaWVuZCB2b2lkIGFwcGVuZENoaWxkVG9Db250YWluZXIoR2VuZXJpY05v
ZGUqIGNoaWxkLCBHZW5lcmljTm9kZUNvbnRhaW5lciogY29udGFpbmVyKTsKKyAgICBmcmllbmQg
dm9pZCBhcHBlbmRDaGlsZFRvQ29udGFpbmVyKEdlbmVyaWNOb2RlKiBjaGlsZCwgR2VuZXJpY05v
ZGVDb250YWluZXImIGNvbnRhaW5lcik7CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBHZW5lcmljTm9k
ZSwgY2xhc3MgR2VuZXJpY05vZGVDb250YWluZXI+Ci0gICAgZnJpZW5kIHZvaWQgcmVtb3ZlRGV0
YWNoZWRDaGlsZHJlbkluQ29udGFpbmVyKEdlbmVyaWNOb2RlQ29udGFpbmVyKik7CisgICAgZnJp
ZW5kIHZvaWQgcmVtb3ZlRGV0YWNoZWRDaGlsZHJlbkluQ29udGFpbmVyKEdlbmVyaWNOb2RlQ29u
dGFpbmVyJik7CiAKICAgICB0ZW1wbGF0ZTxjbGFzcyBHZW5lcmljTm9kZSwgY2xhc3MgR2VuZXJp
Y05vZGVDb250YWluZXI+Ci0gICAgZnJpZW5kIHZvaWQgUHJpdmF0ZTo6YWRkQ2hpbGROb2Rlc1Rv
RGVsZXRpb25RdWV1ZShHZW5lcmljTm9kZSomIGhlYWQsIEdlbmVyaWNOb2RlKiYgdGFpbCwgR2Vu
ZXJpY05vZGVDb250YWluZXIqIGNvbnRhaW5lcik7CisgICAgZnJpZW5kIHZvaWQgUHJpdmF0ZTo6
YWRkQ2hpbGROb2Rlc1RvRGVsZXRpb25RdWV1ZShHZW5lcmljTm9kZSomIGhlYWQsIEdlbmVyaWNO
b2RlKiYgdGFpbCwgR2VuZXJpY05vZGVDb250YWluZXImIGNvbnRhaW5lcik7CiAKICAgICBib29s
IGhhc0NoaWxkTm9kZXMoKSBjb25zdCB7IHJldHVybiBtX2ZpcnN0Q2hpbGQ7IH0KIApJbmRleDog
U291cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3Rlc3RpbmcvSW50ZXJuYWxzLmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysgU291
cmNlL1dlYkNvcmUvdGVzdGluZy9JbnRlcm5hbHMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjQ2
LDcgKzEyNDYsNyBAQCBQYXNzUmVmUHRyPE5vZGVMaXN0PiBJbnRlcm5hbHM6Om5vZGVzRnJvCiAg
ICAgaWYgKCFyZXF1ZXN0Lmlnbm9yZUNsaXBwaW5nKCkgJiYgIWZyYW1lVmlldy0+dmlzaWJsZUNv
bnRlbnRSZWN0KCkuaW50ZXJzZWN0cyhIaXRUZXN0TG9jYXRpb246OnJlY3RGb3JQb2ludChwb2lu
dCwgdG9wUGFkZGluZywgcmlnaHRQYWRkaW5nLCBib3R0b21QYWRkaW5nLCBsZWZ0UGFkZGluZykp
KQogICAgICAgICByZXR1cm4gMDsKIAotICAgIFZlY3RvcjxSZWZQdHI8Tm9kZT4gPiBtYXRjaGVz
OworICAgIFZlY3RvcjxSZWY8Tm9kZT4+IG1hdGNoZXM7CiAKICAgICAvLyBOZWVkIHBhZGRpbmcg
dG8gdHJpZ2dlciBhIHJlY3QgYmFzZWQgaGl0IHRlc3QsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiBh
IE5vZGVMaXN0CiAgICAgLy8gc28gd2Ugc3BlY2lhbCBjYXNlIHRoaXMuCkBAIC0xMjU0LDExICsx
MjU0LDE1IEBAIFBhc3NSZWZQdHI8Tm9kZUxpc3Q+IEludGVybmFsczo6bm9kZXNGcm8KICAgICAg
ICAgSGl0VGVzdFJlc3VsdCByZXN1bHQocG9pbnQpOwogICAgICAgICByZW5kZXJWaWV3LT5oaXRU
ZXN0KHJlcXVlc3QsIHJlc3VsdCk7CiAgICAgICAgIGlmIChyZXN1bHQuaW5uZXJOb2RlKCkpCi0g
ICAgICAgICAgICBtYXRjaGVzLmFwcGVuZChyZXN1bHQuaW5uZXJOb2RlKCktPmRlcHJlY2F0ZWRT
aGFkb3dBbmNlc3Rvck5vZGUoKSk7CisgICAgICAgICAgICBtYXRjaGVzLmFwcGVuZCgqcmVzdWx0
LmlubmVyTm9kZSgpLT5kZXByZWNhdGVkU2hhZG93QW5jZXN0b3JOb2RlKCkpOwogICAgIH0gZWxz
ZSB7CiAgICAgICAgIEhpdFRlc3RSZXN1bHQgcmVzdWx0KHBvaW50LCB0b3BQYWRkaW5nLCByaWdo
dFBhZGRpbmcsIGJvdHRvbVBhZGRpbmcsIGxlZnRQYWRkaW5nKTsKICAgICAgICAgcmVuZGVyVmll
dy0+aGl0VGVzdChyZXF1ZXN0LCByZXN1bHQpOwotICAgICAgICBjb3B5VG9WZWN0b3IocmVzdWx0
LnJlY3RCYXNlZFRlc3RSZXN1bHQoKSwgbWF0Y2hlcyk7CisgICAgICAgIAorICAgICAgICBjb25z
dCBIaXRUZXN0UmVzdWx0OjpOb2RlU2V0JiBub2RlU2V0ID0gcmVzdWx0LnJlY3RCYXNlZFRlc3RS
ZXN1bHQoKTsKKyAgICAgICAgbWF0Y2hlcy5yZXNlcnZlQ2FwYWNpdHkobm9kZVNldC5zaXplKCkp
OworICAgICAgICBmb3IgKGF1dG8gaXQgPSBub2RlU2V0LmJlZ2luKCksIGVuZCA9IG5vZGVTZXQu
ZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKCppdC0+
Z2V0KCkpOwogICAgIH0KIAogICAgIHJldHVybiBTdGF0aWNOb2RlTGlzdDo6YWRvcHQobWF0Y2hl
cyk7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS94bWwvWE1MRXJyb3JzLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS94bWwvWE1MRXJyb3JzLmNwcAkocmV2aXNpb24gMTU2MjUwKQorKysg
U291cmNlL1dlYkNvcmUveG1sL1hNTEVycm9ycy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzNyw3
ICsxMzcsNyBAQCB2b2lkIFhNTEVycm9yczo6aW5zZXJ0RXJyb3JNZXNzYWdlQmxvY2soCiAgICAg
ICAgIFJlZlB0cjxFbGVtZW50PiBib2R5ID0gbV9kb2N1bWVudC0+Y3JlYXRlRWxlbWVudChib2R5
VGFnLCB0cnVlKTsKICAgICAgICAgcm9vdEVsZW1lbnQtPnBhcnNlckFwcGVuZENoaWxkKGJvZHkp
OwogCi0gICAgICAgIGRvY3VtZW50RWxlbWVudC0+cGFyZW50Tm9kZSgpLT5wYXJzZXJSZW1vdmVD
aGlsZChkb2N1bWVudEVsZW1lbnQuZ2V0KCkpOworICAgICAgICBkb2N1bWVudEVsZW1lbnQtPnBh
cmVudE5vZGUoKS0+cGFyc2VyUmVtb3ZlQ2hpbGQoKmRvY3VtZW50RWxlbWVudC5nZXQoKSk7CiAg
ICAgICAgIGlmIChkb2N1bWVudEVsZW1lbnQtPmF0dGFjaGVkKCkpCiAgICAgICAgICAgICBTdHls
ZTo6ZGV0YWNoUmVuZGVyVHJlZSgqZG9jdW1lbnRFbGVtZW50KTsKIAo=
</data>
<flag name="review"
          id="234512"
          type_id="1"
          status="+"
          setter="kling"
    />
    <flag name="commit-queue"
          id="234515"
          type_id="3"
          status="-"
          setter="webkit-ews"
    />
          </attachment>
      

    </bug>

</bugzilla>