<?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>6502</bug_id>
          
          <creation_ts>2006-01-12 04:07:48 -0800</creation_ts>
          <short_desc>split dom_docimpl.* into multiple files (one per class)</short_desc>
          <delta_ts>2006-01-12 04:27:00 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit Misc.</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P4</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Eric Seidel (no email)">eric</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>28283</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-12 04:07:48 -0800</bug_when>
    <thetext>split dom_docimpl.* into multiple files (one per class)

The attached patch does just that.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28284</commentid>
    <comment_count>1</comment_count>
      <attachid>5615</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-12 04:08:31 -0800</bug_when>
    <thetext>Created attachment 5615
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28285</commentid>
    <comment_count>2</comment_count>
      <attachid>5615</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-12 04:09:18 -0800</bug_when>
    <thetext>Comment on attachment 5615
proposed patch.

Simple.

I just ran my fancy splitter script, then went and fixed include files until
things worked.	(I removed all #include &quot;dom_docimpl.h&quot; lines and then added
back ones that were needed.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28286</commentid>
    <comment_count>3</comment_count>
      <attachid>5616</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-12 04:10:15 -0800</bug_when>
    <thetext>Created attachment 5616
split_class.pl script for splitting class files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28287</commentid>
    <comment_count>4</comment_count>
      <attachid>5617</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2006-01-12 04:10:37 -0800</bug_when>
    <thetext>Created attachment 5617
SpacingHeuristics.pm perl module</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>28288</commentid>
    <comment_count>5</comment_count>
      <attachid>5615</attachid>
    <who name="Anders Carlsson">andersca</who>
    <bug_when>2006-01-12 04:23:16 -0800</bug_when>
    <thetext>Comment on attachment 5615
proposed patch.

r=me</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>5615</attachid>
            <date>2006-01-12 04:08:31 -0800</date>
            <delta_ts>2006-01-12 04:23:16 -0800</delta_ts>
            <desc>proposed patch.</desc>
            <filename>mega.patch</filename>
            <type>text/plain</type>
            <size>647754</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">SW5kZXg6IGtodG1sL3htbC9kb20yX3ZpZXdzaW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
eG1sL2RvbTJfdmlld3NpbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC94bWwvZG9t
Ml92aWV3c2ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNs
dWRlICJjc3MvY3NzX2NvbXB1dGVkc3R5bGUuaCIKICNpbmNsdWRlICJkb21fZWxlbWVudGltcGwu
aCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgog
I2luY2x1ZGUgImNzc3N0eWxlc2VsZWN0b3IuaCIKIAogbmFtZXNwYWNlIERPTSB7CkluZGV4OiBr
aHRtbC94bWwvRG9jdW1lbnRUeXBlSW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL0Rv
Y3VtZW50VHlwZUltcGwuY3BwCShyZXZpc2lvbiAxMjAxNSkKKysrIGtodG1sL3htbC9Eb2N1bWVu
dFR5cGVJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsMzM0NyArMjMsMTIgQEAKICAqLwog
CiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKIAotI2luY2x1
ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVkZSAiZG9tL2RvbTJfZXZlbnRzLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnRUeXBlSW1wbC5oIgorI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0aW9u
SW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogCi0jaW5jbHVkZSAieG1sL2RvbV90
ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21feG1saW1wbC5oIgotI2luY2x1ZGUgInhtbC9k
b20yX3JhbmdlaW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKLSNpbmNs
dWRlICJ4bWwvZG9tMl92aWV3c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgot
I2luY2x1ZGUgInhtbC94bWxfdG9rZW5pemVyLmgiCi0KLSNpbmNsdWRlICJjc3MvY3NzaGVscGVy
LmgiCi0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJjc3MvY3Nz
X3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc192YWx1ZWltcGwuaCIKLSNpbmNs
dWRlICJtaXNjL2hlbHBlci5oIgotI2luY2x1ZGUgIkRvY0xvYWRlci5oIgotI2luY2x1ZGUgImVj
bWEva2pzX3Byb3h5LmgiCi0jaW5jbHVkZSAiZWNtYS9ranNfYmluZGluZy5oIgotCi0jaW5jbHVk
ZSA8cXB0cnN0YWNrLmg+Ci0jaW5jbHVkZSA8cXBhaW50ZGV2aWNlbWV0cmljcy5oPgotI2luY2x1
ZGUgPHFyZWdleHAuaD4KLSNpbmNsdWRlIDxrZGVidWcuaD4KLQotI2luY2x1ZGUgInJlbmRlcmlu
Zy9yZW5kZXJfY2FudmFzLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMuaCIK
LSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2ltYWdlLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5n
L3JlbmRlcl9vYmplY3QuaCIKLSNpbmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKLQotI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVQcml2
YXRlLmgiCi0KLSNpbmNsdWRlIDxrZ2xvYmFsc2V0dGluZ3MuaD4KLSNpbmNsdWRlICJraHRtbF9z
ZXR0aW5ncy5oIgotCi0vLyBGSVhNRTogV2Ugd2FudCB0byBjdXQgdGhlIHJlbWFpbmluZyBIVE1M
IGRlcGVuZGVuY2llcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSB0aGVzZSBmaWxl
cy4KLSNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9o
dG1sX2hlYWRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2ltYWdlaW1wbC5oIgotI2luY2x1
ZGUgIkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCi0jaW5jbHVkZSAiaHRtbGZhY3RvcnkuaCIKLQot
I2luY2x1ZGUgImNzc3ZhbHVlcy5oIgotCi0jaW5jbHVkZSAiZWRpdGluZy9qc2VkaXRpbmcuaCIK
LSNpbmNsdWRlICJlZGl0aW5nL3Zpc2libGVfcG9zaXRpb24uaCIKLSNpbmNsdWRlICJlZGl0aW5n
L3Zpc2libGVfdGV4dC5oIgotCi0jaW5jbHVkZSA8a2lvL2pvYi5oPgotCi0jaWZkZWYgS0hUTUxf
WFNMVAotI2luY2x1ZGUgInhzbF9zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUgInhzbHRfcHJv
Y2Vzc29yaW1wbC5oIgotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVkZSAi
eGJsL3hibF9iaW5kaW5nX21hbmFnZXIuaCIKLXVzaW5nIFhCTDo6WEJMQmluZGluZ01hbmFnZXI7
Ci0jZW5kaWYKLQotI2luY2x1ZGUgIktXUUFjY09iamVjdENhY2hlLmgiCi0jaW5jbHVkZSAiS1dR
TG9nZ2luZy5oIgotCi0jaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlICJTVkdOYW1lcy5oIgotI2lu
Y2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudEltcGwuaCIK
LSNpbmNsdWRlICJTVkdab29tRXZlbnRJbXBsLmgiCi0jaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50
SW1wbC5oIgotI2luY2x1ZGUgImtjYW52YXMvZGV2aWNlL3F1YXJ0ei9LUmVuZGVyaW5nRGV2aWNl
UXVhcnR6LmgiCi0jZW5kaWYKLQotdXNpbmcgbmFtZXNwYWNlIERPTTsKLXVzaW5nIG5hbWVzcGFj
ZSBET006OkV2ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotdXNpbmcgbmFt
ZXNwYWNlIGtodG1sOwotCi0vLyAjZGVmaW5lIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcg
MQotCi0vLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2VkIGJlZm9yZSB3ZSB3
aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0IGEgZGVsYXkuCi0v
LyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiByZWFsbHkgYmUgbG93
ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBoaWdoCi0vLyBmb3Ig
ZHVhbCBHNXMuIDopCi1jb25zdCBpbnQgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0gMjUwOwot
Ci1ET01JbXBsZW1lbnRhdGlvbkltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6bV9pbnN0YW5j
ZSA9IDA7Ci0KLS8vIFVzZSAxIHRvIHJlcHJlc2VudCB0aGUgZG9jdW1lbnQncyBkZWZhdWx0IGZv
cm0uCi1IVE1MRm9ybUVsZW1lbnRJbXBsKiBjb25zdCBkZWZhdWx0Rm9ybSA9IChIVE1MRm9ybUVs
ZW1lbnRJbXBsKikgMTsKLQotLy8gRE9NIExldmVsIDIgc2F5cyAobGV0dGVycyBhZGRlZCk6Ci0v
LwotLy8gYSkgTmFtZSBzdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVn
b3JpZXMgTGwsIEx1LCBMbywgTHQsIE5sLgotLy8gYikgTmFtZSBjaGFyYWN0ZXJzIG90aGVyIHRo
YW4gTmFtZS1zdGFydCBjaGFyYWN0ZXJzIG11c3QgaGF2ZSBvbmUgb2YgdGhlIGNhdGVnb3JpZXMg
TWMsIE1lLCBNbiwgTG0sIG9yIE5kLgotLy8gYykgQ2hhcmFjdGVycyBpbiB0aGUgY29tcGF0aWJp
bGl0eSBhcmVhIChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlciB0aGFuICN4RjkwMCBh
bmQgbGVzcyB0aGFuICN4RkZGRSkgYXJlIG5vdCBhbGxvd2VkIGluIFhNTCBuYW1lcy4KLS8vIGQp
IENoYXJhY3RlcnMgd2hpY2ggaGF2ZSBhIGZvbnQgb3IgY29tcGF0aWJpbGl0eSBkZWNvbXBvc2l0
aW9uIChpLmUuIHRob3NlIHdpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIgaW4g
ZmllbGQgNSBvZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkIGJ5IGZpZWxkIDUgYmVnaW5uaW5nIHdp
dGggYSAiPCIpIGFyZSBub3QgYWxsb3dlZC4KLS8vIGUpIFRoZSBmb2xsb3dpbmcgY2hhcmFjdGVy
cyBhcmUgdHJlYXRlZCBhcyBuYW1lLXN0YXJ0IGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gbmFtZSBj
aGFyYWN0ZXJzLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBhcyBB
bHBoYWJldGljOiBbI3gwMkJCLSN4MDJDMV0sICN4MDU1OSwgI3gwNkU1LCAjeDA2RTYuCi0vLyBm
KSBDaGFyYWN0ZXJzICN4MjBERC0jeDIwRTAgYXJlIGV4Y2x1ZGVkIChpbiBhY2NvcmRhbmNlIHdp
dGggVW5pY29kZSwgc2VjdGlvbiA1LjE0KS4KLS8vIGcpIENoYXJhY3RlciAjeDAwQjcgaXMgY2xh
c3NpZmllZCBhcyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkgbGlzdCBzbyBpZGVu
dGlmaWVzIGl0LgotLy8gaCkgQ2hhcmFjdGVyICN4MDM4NyBpcyBhZGRlZCBhcyBhIG5hbWUgY2hh
cmFjdGVyLCBiZWNhdXNlICN4MDBCNyBpcyBpdHMgY2Fub25pY2FsIGVxdWl2YWxlbnQuCi0vLyBp
KSBDaGFyYWN0ZXJzICc6JyBhbmQgJ18nIGFyZSBhbGxvd2VkIGFzIG5hbWUtc3RhcnQgY2hhcmFj
dGVycy4KLS8vIGopIENoYXJhY3RlcnMgJy0nIGFuZCAnLicgYXJlIGFsbG93ZWQgYXMgbmFtZSBj
aGFyYWN0ZXJzLgotLy8KLS8vIEl0IGFsc28gY29udGFpbnMgY29tcGxldGUgdGFibGVzLiBJZiB3
ZSBkZWNpZGUgaXQncyBiZXR0ZXIsIHdlIGNvdWxkIGluY2x1ZGUgdGhvc2UgaW5zdGVhZCBvZiB0
aGUgZm9sbG93aW5nIGNvZGUuCi0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkTmFtZVN0YXJ0
KFVDaGFyMzIgYykKLXsKLSAgICAvLyBydWxlIChlKSBhYm92ZQotICAgIGlmICgoYyA+PSAweDAy
QkIgJiYgYyA8PSAweDAyQzEpIHx8IGMgPT0gMHg1NTkgfHwgYyA9PSAweDZFNSB8fCBjID09IDB4
NkU2KQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIHJ1bGUgKGkpIGFib3ZlCi0gICAg
aWYgKGMgPT0gJzonIHx8IGMgPT0gJ18nKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIC8v
IHJ1bGVzIChhKSBhbmQgKGYpIGFib3ZlCi0gICAgY29uc3QgdWludDMyX3QgbmFtZVN0YXJ0TWFz
ayA9IFVfR0NfTExfTUFTSyB8IFVfR0NfTFVfTUFTSyB8IFVfR0NfTE9fTUFTSyB8IFVfR0NfTFRf
TUFTSyB8IFVfR0NfTkxfTUFTSzsKLSAgICBpZiAoIShVX0dFVF9HQ19NQVNLKGMpICYgbmFtZVN0
YXJ0TWFzaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGMpIGFib3Zl
Ci0gICAgaWYgKGMgPj0gMHhGOTAwICYmIGMgPCAweEZGRkUpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIC8vIHJ1bGUgKGQpIGFib3ZlCi0gICAgVURlY29tcG9zaXRpb25UeXBlIGRlY29t
cFR5cGUgPSBzdGF0aWNfY2FzdDxVRGVjb21wb3NpdGlvblR5cGU+KHVfZ2V0SW50UHJvcGVydHlW
YWx1ZShjLCBVQ0hBUl9ERUNPTVBPU0lUSU9OX1RZUEUpKTsKLSAgICBpZiAoZGVjb21wVHlwZSA9
PSBVX0RUX0ZPTlQgfHwgZGVjb21wVHlwZSA9PSBVX0RUX0NPTVBBVCkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1Zh
bGlkTmFtZVBhcnQoVUNoYXIzMiBjKQotewotICAgIC8vIHJ1bGVzIChhKSwgKGUpLCBhbmQgKGkp
IGFib3ZlCi0gICAgaWYgKGlzVmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgLy8gcnVsZXMgKGcpIGFuZCAoaCkgYWJvdmUKLSAgICBpZiAoYyA9PSAweDAwQjcg
fHwgYyA9PSAweDAzODcpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gcnVsZSAoaikg
YWJvdmUKLSAgICBpZiAoYyA9PSAnLScgfHwgYyA9PSAnLicpCi0gICAgICAgIHJldHVybiB0cnVl
OwotCi0gICAgLy8gcnVsZXMgKGIpIGFuZCAoZikgYWJvdmUKLSAgICBjb25zdCB1aW50MzJfdCBv
dGhlck5hbWVQYXJ0TWFzayA9IFVfR0NfTUNfTUFTSyB8IFVfR0NfTUVfTUFTSyB8IFVfR0NfTU5f
TUFTSyB8IFVfR0NfTE1fTUFTSyB8IFVfR0NfTkRfTUFTSzsKLSAgICBpZiAoIShVX0dFVF9HQ19N
QVNLKGMpICYgb3RoZXJOYW1lUGFydE1hc2spKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICAvLyBydWxlIChjKSBhYm92ZQotICAgIGlmIChjID49IDB4RjkwMCAmJiBjIDwgMHhGRkZFKQot
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBydWxlIChkKSBhYm92ZQotICAgIFVEZWNv
bXBvc2l0aW9uVHlwZSBkZWNvbXBUeXBlID0gc3RhdGljX2Nhc3Q8VURlY29tcG9zaXRpb25UeXBl
Pih1X2dldEludFByb3BlcnR5VmFsdWUoYywgVUNIQVJfREVDT01QT1NJVElPTl9UWVBFKSk7Ci0g
ICAgaWYgKGRlY29tcFR5cGUgPT0gVV9EVF9GT05UIHx8IGRlY29tcFR5cGUgPT0gVV9EVF9DT01Q
QVQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBG
SVhNRTogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpcyBzdGlsbCB3YWl0aW5nIGZvciBtZSB0
byB1bmRlcnN0YW5kIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuCi0vLyBhICJtYWxmb3JtZWQiIHF1
YWxpZmllZCBuYW1lIGFuZCBvbmUgd2l0aCBiYWQgY2hhcmFjdGVycyBpbiBpdC4gRm9yIGV4YW1w
bGUsIGlzIGEgc2Vjb25kIGNvbG9uCi0vLyBhbiBpbGxlZ2FsIGNoYXJhY3RlciBvciBhIG1hbGZv
cm1lZCBxdWFsaWZpZWQgbmFtZT8gVGhpcyB3aWxsIGRldGVybWluZSBib3RoIHdoYXQgcGFyYW1l
dGVycwotLy8gdGhpcyBmdW5jdGlvbiBuZWVkcyB0byB0YWtlIGFuZCBleGFjdGx5IHdoYXQgaXQg
d2lsbCBkby4gU2hvdWxkIGFsc28gYmUgZXhwb3J0ZWQgc28gdGhhdAotLy8gRWxlbWVudEltcGwg
Y2FuIHVzZSBpdCB0b28uCi1zdGF0aWMgYm9vbCBxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQoY29u
c3QgRE9NU3RyaW5nICYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01JbXBsZW1lbnRh
dGlvbkltcGw6OkRPTUltcGxlbWVudGF0aW9uSW1wbCgpCi17Ci19Ci0KLURPTUltcGxlbWVudGF0
aW9uSW1wbDo6fkRPTUltcGxlbWVudGF0aW9uSW1wbCgpCi17Ci19Ci0KLWJvb2wgRE9NSW1wbGVt
ZW50YXRpb25JbXBsOjpoYXNGZWF0dXJlIChjb25zdCBET01TdHJpbmcgJmZlYXR1cmUsIGNvbnN0
IERPTVN0cmluZyAmdmVyc2lvbikgY29uc3QKLXsKLSAgICBET01TdHJpbmcgbG93ZXIgPSBmZWF0
dXJlLmxvd2VyKCk7Ci0gICAgaWYgKGxvd2VyID09ICJjb3JlIiB8fCBsb3dlciA9PSAiaHRtbCIg
fHwgbG93ZXIgPT0gInhtbCIgfHwgbG93ZXIgPT0gInhodG1sIikKLSAgICAgICAgcmV0dXJuIHZl
cnNpb24uaXNFbXB0eSgpIHx8IHZlcnNpb24gPT0gIjEuMCIgfHwgdmVyc2lvbiA9PSAiMi4wIjsK
LSAgICBpZiAobG93ZXIgPT0gImNzcyIKLSAgICAgICAgICAgIHx8IGxvd2VyID09ICJjc3MyIgot
ICAgICAgICAgICAgfHwgbG93ZXIgPT0gImV2ZW50cyIKLSAgICAgICAgICAgIHx8IGxvd2VyID09
ICJodG1sZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gIm1vdXNlZXZlbnRzIgotICAg
ICAgICAgICAgfHwgbG93ZXIgPT0gIm11dGF0aW9uZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93
ZXIgPT0gInJhbmdlIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gInN0eWxlc2hlZXRzIgotICAg
ICAgICAgICAgfHwgbG93ZXIgPT0gInRyYXZlcnNhbCIKLSAgICAgICAgICAgIHx8IGxvd2VyID09
ICJ1aWV2ZW50cyIKLSAgICAgICAgICAgIHx8IGxvd2VyID09ICJ2aWV3cyIpCi0gICAgICAgIHJl
dHVybiB2ZXJzaW9uLmlzRW1wdHkoKSB8fCB2ZXJzaW9uID09ICIyLjAiOwotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotRG9jdW1lbnRUeXBlSW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVh
dGVEb2N1bWVudFR5cGUoIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgY29uc3QgRE9N
U3RyaW5nICZwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBET01TdHJpbmcgJnN5c3RlbUlkLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKQotewotICAgIC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgTkFN
RVNQQUNFX0VSUiBpZiBubyBxdWFsaWZpZWROYW1lIHN1cHBsaWVkCi0gICAgaWYgKHF1YWxpZmll
ZE5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6
TkFNRVNQQUNFX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gSU5WQUxJ
RF9DSEFSQUNURVJfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBj
b250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4KLSAgICBET01TdHJpbmcgcHJlZml4LCBsb2Nh
bE5hbWU7Ci0gICAgaWYgKCFEb2N1bWVudEltcGw6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZp
ZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERP
TUV4Y2VwdGlvbjo6SU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0KLSAgICAvLyBOQU1FU1BBQ0VfRVJSOiBSYWlzZWQgaWYgdGhlIHF1YWxpZmllZE5hbWUg
aXMgbWFsZm9ybWVkLgotICAgIGlmIChxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQocXVhbGlmaWVk
TmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNF
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBEb2N1bWVu
dFR5cGVJbXBsKHRoaXMsIDAsIHF1YWxpZmllZE5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci19
Ci0KLURPTUltcGxlbWVudGF0aW9uSW1wbCogRE9NSW1wbGVtZW50YXRpb25JbXBsOjpnZXRJbnRl
cmZhY2UoY29uc3QgRE9NU3RyaW5nJiAvKmZlYXR1cmUqLykgY29uc3QKLXsKLSAgICAvLyAjIyMK
LSAgICByZXR1cm4gMDsKLX0KLQotRG9jdW1lbnRJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6
OmNyZWF0ZURvY3VtZW50KCBjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9N
U3RyaW5nICZxdWFsaWZpZWROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsICpkb2N0eXBlLCBpbnQgJmV4Y2Vw
dGlvbmNvZGUgKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgaWYgKCFxdWFsaWZp
ZWROYW1lLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJh
aXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwg
Y2hhcmFjdGVyLgotICAgICAgICBET01TdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgICAg
IGlmICghRG9jdW1lbnRJbXBsOjpwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJl
Zml4LCBsb2NhbE5hbWUpKSB7Ci0gICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0
aW9uOjpJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAg
ICAgfQotCi0gICAgICAgIC8vIE5BTUVTUEFDRV9FUlI6Ci0gICAgICAgIC8vIC0gUmFpc2VkIGlm
IHRoZSBxdWFsaWZpZWROYW1lIGlzIG1hbGZvcm1lZCwKLSAgICAgICAgLy8gLSBpZiB0aGUgcXVh
bGlmaWVkTmFtZSBoYXMgYSBwcmVmaXggYW5kIHRoZSBuYW1lc3BhY2VVUkkgaXMgbnVsbCwgb3IK
LSAgICAgICAgLy8gLSBpZiB0aGUgcXVhbGlmaWVkTmFtZSBoYXMgYSBwcmVmaXggdGhhdCBpcyAi
eG1sIiBhbmQgdGhlIG5hbWVzcGFjZVVSSSBpcyBkaWZmZXJlbnQKLSAgICAgICAgLy8gICBmcm9t
ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiIFtOYW1lc3BhY2VzXS4KLSAg
ICAgICAgaW50IGNvbG9ucG9zID0gLTE7Ci0gICAgICAgIHVpbnQgaTsKLSAgICAgICAgRE9NU3Ry
aW5nSW1wbCAqcW5hbWUgPSBxdWFsaWZpZWROYW1lLmltcGwoKTsKLSAgICAgICAgZm9yIChpID0g
MDsgaSA8IHFuYW1lLT5sICYmIGNvbG9ucG9zIDwgMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAo
KCpxbmFtZSlbaV0gPT0gJzonKQotICAgICAgICAgICAgICAgIGNvbG9ucG9zID0gaTsKLSAgICAg
ICAgfQotICAgIAotICAgICAgICBpZiAocXVhbGlmaWVkTmFtZUlzTWFsZm9ybWVkKHF1YWxpZmll
ZE5hbWUpIHx8Ci0gICAgICAgICAgICAoY29sb25wb3MgPj0gMCAmJiBuYW1lc3BhY2VVUkkuaXNO
dWxsKCkpIHx8Ci0gICAgICAgICAgICAoY29sb25wb3MgPT0gMyAmJiBxdWFsaWZpZWROYW1lWzBd
ID09ICd4JyAmJiBxdWFsaWZpZWROYW1lWzFdID09ICdtJyAmJiBxdWFsaWZpZWROYW1lWzJdID09
ICdsJyAmJgotICAgICAgICAgICAgIG5hbWVzcGFjZVVSSSAhPSAiaHR0cDovL3d3dy53My5vcmcv
WE1MLzE5OTgvbmFtZXNwYWNlIikpIHsKLQotICAgICAgICAgICAgZXhjZXB0aW9uY29kZSA9IERP
TUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIC8vIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIGRv
Y3R5cGUgaGFzIGFscmVhZHkgYmVlbiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgZG9jdW1lbnQgb3Ig
d2FzCi0gICAgLy8gY3JlYXRlZCBmcm9tIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotICAg
IGlmIChkb2N0eXBlICYmIChkb2N0eXBlLT5nZXREb2N1bWVudCgpIHx8IGRvY3R5cGUtPmltcGxl
bWVudGF0aW9uKCkgIT0gdGhpcykpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2Vw
dGlvbjo6V1JPTkdfRE9DVU1FTlRfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAg
ICAvLyAjIyMgdGhpcyBpcyBjb21wbGV0ZWx5IGJyb2tlbi4uIHdpdGhvdXQgYSB2aWV3IGl0IHdp
bGwgbm90IHdvcmsgKERpcmspCi0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBuZXcgRG9jdW1lbnRJ
bXBsKHRoaXMsIDApOwotCi0gICAgLy8gbm93IGdldCB0aGUgaW50ZXJlc3RpbmcgcGFydHMgb2Yg
dGhlIGRvY3R5cGUKLSAgICBpZiAoZG9jdHlwZSkKLSAgICAgICAgZG9jLT5zZXREb2NUeXBlKG5l
dyBEb2N1bWVudFR5cGVJbXBsKGRvYywgKmRvY3R5cGUpKTsKLQotICAgIGlmICghcXVhbGlmaWVk
TmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgRWxlbWVudEltcGwgKnJvb3RFbGVtZW50ID0gZG9j
LT5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCBleGNlcHRpb25j
b2RlKTsKLSAgICAgICAgZG9jLT5hZGRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgfQotICAgIAot
ICAgIHJldHVybiBkb2M7Ci19Ci0KLUNTU1N0eWxlU2hlZXRJbXBsICpET01JbXBsZW1lbnRhdGlv
bkltcGw6OmNyZWF0ZUNTU1N0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICYvKnRpdGxlKi8sIGNv
bnN0IERPTVN0cmluZyAmbWVkaWEsIGludCAmLypleGNlcHRpb24qLykKLXsKLSAgICAvLyAjIyMg
VE9ETyA6IHRpdGxlIHNob3VsZCBiZSBzZXQsIGFuZCBtZWRpYSBjb3VsZCBoYXZlIHdyb25nIHN5
bnRheCwgaW4gd2hpY2ggY2FzZSB3ZSBzaG91bGQgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uLgotICAg
IENTU1N0eWxlU2hlZXRJbXBsICogY29uc3QgbnVsbFNoZWV0ID0gMDsKLSAgICBDU1NTdHlsZVNo
ZWV0SW1wbCAqc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwobnVsbFNoZWV0KTsKLSAgICBz
aGVldC0+c2V0TWVkaWEobmV3IE1lZGlhTGlzdEltcGwoc2hlZXQsIG1lZGlhKSk7Ci0gICAgcmV0
dXJuIHNoZWV0OwotfQotCi1Eb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3Jl
YXRlRG9jdW1lbnQoIEtIVE1MVmlldyAqdiApCi17Ci0gICAgcmV0dXJuIG5ldyBEb2N1bWVudElt
cGwodGhpcywgdik7Ci19Ci0KLUhUTUxEb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1w
bDo6Y3JlYXRlSFRNTERvY3VtZW50KCBLSFRNTFZpZXcgKnYgKQotewotICAgIHJldHVybiBuZXcg
SFRNTERvY3VtZW50SW1wbCh0aGlzLCB2KTsKLX0KLQotRE9NSW1wbGVtZW50YXRpb25JbXBsICpE
T01JbXBsZW1lbnRhdGlvbkltcGw6Omluc3RhbmNlKCkKLXsKLSAgICBpZiAoIW1faW5zdGFuY2Up
IHsKLSAgICAgICAgbV9pbnN0YW5jZSA9IG5ldyBET01JbXBsZW1lbnRhdGlvbkltcGwoKTsKLSAg
ICAgICAgbV9pbnN0YW5jZS0+cmVmKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1faW5zdGFuY2U7
Ci19Ci0KLWJvb2wgRE9NSW1wbGVtZW50YXRpb25JbXBsOjppc1hNTE1JTUVUeXBlKGNvbnN0IERP
TVN0cmluZyYgbWltZVR5cGUpCi17Ci0gICAgaWYgKG1pbWVUeXBlID09ICJ0ZXh0L3htbCIgfHwg
bWltZVR5cGUgPT0gImFwcGxpY2F0aW9uL3htbCIgfHwgbWltZVR5cGUgPT0gImFwcGxpY2F0aW9u
L3hodG1sK3htbCIgfHwKLSAgICAgICAgbWltZVR5cGUgPT0gInRleHQveHNsIiB8fCBtaW1lVHlw
ZSA9PSAiYXBwbGljYXRpb24vcnNzK3htbCIgfHwgbWltZVR5cGUgPT0gImFwcGxpY2F0aW9uL2F0
b20reG1sIgotI2lmIFNWR19TVVBQT1JUCi0gICAgICAgIHx8IG1pbWVUeXBlID09ICJpbWFnZS9z
dmcreG1sIgotI2VuZGlmCi0gICAgICAgICkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi1IVE1MRG9jdW1lbnRJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6
OmNyZWF0ZUhUTUxEb2N1bWVudChjb25zdCBET01TdHJpbmcgJnRpdGxlKQotewotICAgIEhUTUxE
b2N1bWVudEltcGwgKmQgPSBjcmVhdGVIVE1MRG9jdW1lbnQoIDAgLyogIyMjIGNyZWF0ZSBhIHZp
ZXcgb3RoZXJ3aXNlIGl0IGRvZXNuJ3Qgd29yayAqLyk7Ci0gICAgZC0+b3BlbigpOwotICAgIC8v
IEZJWE1FOiBOZWVkIHRvIGVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHRpdGxlPwot
ICAgIGQtPndyaXRlKCI8aHRtbD48aGVhZD48dGl0bGU+IiArIHRpdGxlLnFzdHJpbmcoKSArICI8
L3RpdGxlPjwvaGVhZD4iKTsKLSAgICByZXR1cm4gZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0KLVFQdHJMaXN0PERvY3VtZW50SW1wbD4gKiBEb2N1bWVudEltcGw6OmNoYW5nZWREb2N1bWVu
dHMgPSAwOwotCi0vLyBLSFRNTFZpZXcgbWlnaHQgYmUgMAotRG9jdW1lbnRJbXBsOjpEb2N1bWVu
dEltcGwoRE9NSW1wbGVtZW50YXRpb25JbXBsICpfaW1wbGVtZW50YXRpb24sIEtIVE1MVmlldyAq
dikKLSAgICA6IENvbnRhaW5lck5vZGVJbXBsKDApCi0gICAgICAsIG1fZG9tdHJlZV92ZXJzaW9u
KDApCi0gICAgICAsIG1fdGl0bGUoIiIpCi0gICAgICAsIG1fdGl0bGVTZXRFeHBsaWNpdGx5KGZh
bHNlKQotICAgICAgLCBtX2ltYWdlTG9hZEV2ZW50VGltZXIoMCkKLSNpZm5kZWYgS0hUTUxfTk9f
WEJMCi0gICAgICAsIG1fYmluZGluZ01hbmFnZXIobmV3IFhCTEJpbmRpbmdNYW5hZ2VyKHRoaXMp
KQotI2VuZGlmCi0jaWZkZWYgS0hUTUxfWFNMVAotICAgICwgbV90cmFuc2Zvcm1Tb3VyY2UoMCkK
LSNlbmRpZgotICAgICwgbV9maW5pc2hlZFBhcnNpbmcodGhpcywgU0lHTkFMKGZpbmlzaGVkUGFy
c2luZygpKSkKLSAgICAsIG1faW5QYWdlQ2FjaGUoZmFsc2UpCi0gICAgLCBtX3NhdmVkUmVuZGVy
ZXIoMCkKLSAgICAsIG1fcGFzc3dvcmRGaWVsZHMoMCkKLSAgICAsIG1fc2VjdXJlRm9ybXMoMCkK
LSAgICAsIG1fY3JlYXRlUmVuZGVyZXJzKHRydWUpCi0gICAgLCBtX2Rlc2lnbk1vZGUoaW5oZXJp
dCkKLSAgICAsIG1faGFzRGFzaGJvYXJkUmVnaW9ucyhmYWxzZSkKLSAgICAsIG1fZGFzaGJvYXJk
UmVnaW9uc0RpcnR5KGZhbHNlKQotICAgICwgbV9zZWxmT25seVJlZkNvdW50KDApCi0gICAgLCBt
X3NlbGVjdGVkUmFkaW9CdXR0b25zKDApCi17Ci0gICAgZG9jdW1lbnQucmVzZXRTa2lwcGluZ1Jl
Zih0aGlzKTsKLQotICAgIG1fcGFpbnREZXZpY2UgPSAwOwotICAgIG1fcGFpbnREZXZpY2VNZXRy
aWNzID0gMDsKLQotICAgIG1fdmlldyA9IHY7Ci0gICAgbV9yZW5kZXJBcmVuYSA9IDA7Ci0KLSAg
ICBtX2FjY0NhY2hlID0gMDsKLSAgICAKLSAgICBpZiAoIHYgKSB7Ci0gICAgICAgIG1fZG9jTG9h
ZGVyID0gbmV3IERvY0xvYWRlcih2LT5mcmFtZSgpLCB0aGlzICk7Ci0gICAgICAgIHNldFBhaW50
RGV2aWNlKCBtX3ZpZXcgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBtX2RvY0xvYWRlciA9
IG5ldyBEb2NMb2FkZXIoIDAsIHRoaXMgKTsKLQotICAgIHZpc3VhbGx5T3JkZXJlZCA9IGZhbHNl
OwotICAgIG1fbG9hZGluZ1NoZWV0ID0gZmFsc2U7Ci0gICAgbV9iUGFyc2luZyA9IGZhbHNlOwot
ICAgIG1fZG9jQ2hhbmdlZCA9IGZhbHNlOwotICAgIG1fc2hlZXQgPSAwOwotICAgIG1fZWxlbVNo
ZWV0ID0gMDsKLSAgICBtX3Rva2VuaXplciA9IDA7Ci0KLSAgICBtX2ltcGxlbWVudGF0aW9uID0g
X2ltcGxlbWVudGF0aW9uOwotICAgIGlmIChtX2ltcGxlbWVudGF0aW9uKQotICAgICAgICBtX2lt
cGxlbWVudGF0aW9uLT5yZWYoKTsKLSAgICBwTW9kZSA9IFN0cmljdDsKLSAgICBoTW9kZSA9IFhI
dG1sOwotICAgIG1fdGV4dENvbG9yID0gUXQ6OmJsYWNrOwotICAgIG1fZWxlbWVudE5hbWVzID0g
MDsKLSAgICBtX2VsZW1lbnROYW1lQWxsb2MgPSAwOwotICAgIG1fZWxlbWVudE5hbWVDb3VudCA9
IDA7Ci0gICAgbV9hdHRyTmFtZXMgPSAwOwotICAgIG1fYXR0ck5hbWVBbGxvYyA9IDA7Ci0gICAg
bV9hdHRyTmFtZUNvdW50ID0gMDsKLSAgICBtX2RlZmF1bHRWaWV3ID0gbmV3IEFic3RyYWN0Vmll
d0ltcGwodGhpcyk7Ci0gICAgbV9kZWZhdWx0Vmlldy0+cmVmKCk7Ci0gICAgbV9saXN0ZW5lclR5
cGVzID0gMDsKLSAgICBtX3N0eWxlU2hlZXRzID0gbmV3IFN0eWxlU2hlZXRMaXN0SW1wbDsKLSAg
ICBtX3N0eWxlU2hlZXRzLT5yZWYoKTsKLSAgICBtX2luRG9jdW1lbnQgPSB0cnVlOwotICAgIG1f
c3R5bGVTZWxlY3RvckRpcnR5ID0gZmFsc2U7Ci0gICAgbV9pblN0eWxlUmVjYWxjID0gZmFsc2U7
Ci0gICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICBtX3VzZXNEZXNjZW5k
YW50UnVsZXMgPSBmYWxzZTsKLSAgICBtX3VzZXNTaWJsaW5nUnVsZXMgPSBmYWxzZTsKLQotICAg
IG1fc3R5bGVTZWxlY3RvciA9IG5ldyBDU1NTdHlsZVNlbGVjdG9yKHRoaXMsIG1fdXNlcnNoZWV0
LCBtX3N0eWxlU2hlZXRzLCAhaW5Db21wYXRNb2RlKCkpOwotICAgIG1fd2luZG93RXZlbnRMaXN0
ZW5lcnMuc2V0QXV0b0RlbGV0ZSh0cnVlKTsKLSAgICBtX3BlbmRpbmdTdHlsZXNoZWV0cyA9IDA7
Ci0gICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSBmYWxzZTsKLQotICAgIG1fY3NzVGFy
Z2V0ID0gMDsKLSAgICBtX2FjY2Vzc0tleURpY3RWYWxpZCA9IGZhbHNlOwotCi0gICAgcmVzZXRM
aW5rQ29sb3IoKTsKLSAgICByZXNldFZpc2l0ZWRMaW5rQ29sb3IoKTsKLSAgICByZXNldEFjdGl2
ZUxpbmtDb2xvcigpOwotCi0gICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7Ci0gICAg
bV9zdGFydFRpbWUucmVzdGFydCgpOwotICAgIG1fb3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQg
PSBmYWxzZTsKLSAgICAKLSAgICBtX2pzRWRpdG9yID0gMDsKLQotICAgIG1fbWFya2Vycy5zZXRB
dXRvRGVsZXRlKHRydWUpOwotICAgIAotICAgIHN0YXRpYyBpbnQgZG9jSUQgPSAwOwotICAgIG1f
ZG9jSUQgPSBkb2NJRCsrOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlZExhc3RSZWYo
KQotewotICAgIGlmIChtX3NlbGZPbmx5UmVmQ291bnQpIHsKLSAgICAgICAgLy8gaWYgcmVtb3Zp
bmcgYSBjaGlsZCByZW1vdmVzIHRoZSBsYXN0IHNlbGYtb25seSByZWYsIHdlIGRvbid0Ci0gICAg
ICAgIC8vIHdhbnQgdGhlIGRvY3VtZW50IHRvIGJlIGRlc3RydWN0ZWQgdW50aWwgYWZ0ZXIKLSAg
ICAgICAgLy8gcmVtb3ZlQWxsQ2hpbGRyZW4gcmV0dXJucywgc28gd2UgZ3VhcmQgb3Vyc2VsdmVz
IHdpdGggYW4KLSAgICAgICAgLy8gZXh0cmEgc2VsZi1vbmx5IHJlZgotCi0gICAgICAgIERvY1B0
cjxEb2N1bWVudEltcGw+IGd1YXJkKHRoaXMpOwotCi0gICAgICAgIC8vIHdlIG11c3QgbWFrZSBz
dXJlIG5vdCB0byBiZSByZXRhaW5pbmcgYW55IG9mIG91ciBjaGlsZHJlbiB0aHJvdWdoCi0gICAg
ICAgIC8vIHRoZXNlIGV4dHJhIHBvaW50ZXJzIG9yIHdlIHdpbGwgY3JlYXRlIGEgcmVmZXJlbmNl
IGN5Y2xlCi0gICAgICAgIG1fZG9jVHlwZSA9IDA7Ci0gICAgICAgIG1fZm9jdXNOb2RlID0gMDsK
LSAgICAgICAgbV9ob3Zlck5vZGUgPSAwOwotICAgICAgICBtX2FjdGl2ZU5vZGUgPSAwOwotICAg
ICAgICBtX3RpdGxlRWxlbWVudCA9IDA7Ci0KLSAgICAgICAgcmVtb3ZlQWxsQ2hpbGRyZW4oKTsK
LSAgICB9IGVsc2UKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci19Ci0KLURvY3VtZW50SW1wbDo6fkRv
Y3VtZW50SW1wbCgpCi17Ci0gICAgYXNzZXJ0KCFtX3JlbmRlcik7Ci0gICAgYXNzZXJ0KCFtX2lu
UGFnZUNhY2hlKTsKLSAgICBhc3NlcnQobV9zYXZlZFJlbmRlcmVyID09IDApOwotICAgIAotICAg
IEtKUzo6U2NyaXB0SW50ZXJwcmV0ZXI6OmZvcmdldEFsbERPTU5vZGVzRm9yRG9jdW1lbnQodGhp
cyk7Ci0KLSAgICBpZiAoY2hhbmdlZERvY3VtZW50cyAmJiBtX2RvY0NoYW5nZWQpCi0gICAgICAg
IGNoYW5nZWREb2N1bWVudHMtPnJlbW92ZSh0aGlzKTsKLSAgICBkZWxldGUgbV90b2tlbml6ZXI7
Ci0gICAgZG9jdW1lbnQucmVzZXRTa2lwcGluZ1JlZigwKTsKLSAgICBkZWxldGUgbV9zaGVldDsK
LSAgICBkZWxldGUgbV9zdHlsZVNlbGVjdG9yOwotICAgIGRlbGV0ZSBtX2RvY0xvYWRlcjsKLSAg
ICBpZiAobV9lbGVtU2hlZXQgKSAgbV9lbGVtU2hlZXQtPmRlcmVmKCk7Ci0gICAgaWYgKG1faW1w
bGVtZW50YXRpb24pCi0gICAgICAgIG1faW1wbGVtZW50YXRpb24tPmRlcmVmKCk7Ci0gICAgZGVs
ZXRlIG1fcGFpbnREZXZpY2VNZXRyaWNzOwotICAgIAotICAgIGlmIChtX2VsZW1lbnROYW1lcykg
ewotICAgICAgICBmb3IgKHVuc2lnbmVkIHNob3J0IGlkID0gMDsgaWQgPCBtX2VsZW1lbnROYW1l
Q291bnQ7IGlkKyspCi0gICAgICAgICAgICBtX2VsZW1lbnROYW1lc1tpZF0tPmRlcmVmKCk7Ci0g
ICAgICAgIGRlbGV0ZSBbXSBtX2VsZW1lbnROYW1lczsKLSAgICB9Ci0gICAgaWYgKG1fYXR0ck5h
bWVzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgc2hvcnQgaWQgPSAwOyBpZCA8IG1fYXR0ck5h
bWVDb3VudDsgaWQrKykKLSAgICAgICAgICAgIG1fYXR0ck5hbWVzW2lkXS0+ZGVyZWYoKTsKLSAg
ICAgICAgZGVsZXRlIFtdIG1fYXR0ck5hbWVzOwotICAgIH0KLSAgICBtX2RlZmF1bHRWaWV3LT5k
ZXJlZigpOwotICAgIG1fc3R5bGVTaGVldHMtPmRlcmVmKCk7Ci0KLSAgICBpZiAobV9yZW5kZXJB
cmVuYSl7Ci0gICAgICAgIGRlbGV0ZSBtX3JlbmRlckFyZW5hOwotICAgICAgICBtX3JlbmRlckFy
ZW5hID0gMDsKLSAgICB9Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgeG1sRnJlZURvYygoeG1s
RG9jUHRyKW1fdHJhbnNmb3JtU291cmNlKTsKLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hC
TAotICAgIGRlbGV0ZSBtX2JpbmRpbmdNYW5hZ2VyOwotI2VuZGlmCi0KLSAgICBpZiAobV9hY2ND
YWNoZSl7Ci0gICAgICAgIGRlbGV0ZSBtX2FjY0NhY2hlOwotICAgICAgICBtX2FjY0NhY2hlID0g
MDsKLSAgICB9Ci0gICAgbV9kZWNvZGVyID0gMDsKLSAgICAKLSAgICBpZiAobV9qc0VkaXRvcikg
ewotICAgICAgICBkZWxldGUgbV9qc0VkaXRvcjsKLSAgICAgICAgbV9qc0VkaXRvciA9IDA7Ci0g
ICAgfQotICAgIAotICAgIGlmIChtX3NlbGVjdGVkUmFkaW9CdXR0b25zKSB7Ci0gICAgICAgIEZv
cm1Ub0dyb3VwTWFwOjppdGVyYXRvciBlbmQgPSBtX3NlbGVjdGVkUmFkaW9CdXR0b25zLT5lbmQo
KTsKLSAgICAgICAgZm9yIChGb3JtVG9Hcm91cE1hcDo6aXRlcmF0b3IgaXQgPSBtX3NlbGVjdGVk
UmFkaW9CdXR0b25zLT5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIE5h
bWVUb0lucHV0TWFwICpuID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIGlmIChuKQotICAgICAg
ICAgICAgICAgIGRlbGV0ZSBuOwotICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtX3NlbGVjdGVk
UmFkaW9CdXR0b25zOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlc2V0TGlua0Nv
bG9yKCkKLXsKLSAgICBtX2xpbmtDb2xvciA9IFFDb2xvcigwLCAwLCAyMzgpOwotfQotCi12b2lk
IERvY3VtZW50SW1wbDo6cmVzZXRWaXNpdGVkTGlua0NvbG9yKCkKLXsKLSAgICBtX3Zpc2l0ZWRM
aW5rQ29sb3IgPSBRQ29sb3IoODUsIDI2LCAxMzkpOyAgICAKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnJlc2V0QWN0aXZlTGlua0NvbG9yKCkKLXsKLSAgICBtX2FjdGl2ZUxpbmtDb2xvci5zZXRO
YW1lZENvbG9yKFFTdHJpbmcoInJlZCIpKTsKLX0KLQotRG9jdW1lbnRUeXBlSW1wbCAqRG9jdW1l
bnRJbXBsOjpkb2N0eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kb2NUeXBlLmdldCgpOwot
fQotCi1ET01JbXBsZW1lbnRhdGlvbkltcGwgKkRvY3VtZW50SW1wbDo6aW1wbGVtZW50YXRpb24o
KSBjb25zdAotewotICAgIHJldHVybiBtX2ltcGxlbWVudGF0aW9uOwotfQotCi1FbGVtZW50SW1w
bCAqRG9jdW1lbnRJbXBsOjpkb2N1bWVudEVsZW1lbnQoKSBjb25zdAotewotICAgIE5vZGVJbXBs
ICpuID0gZmlyc3RDaGlsZCgpOwotICAgIHdoaWxlIChuICYmIG4tPm5vZGVUeXBlKCkgIT0gTm9k
ZTo6RUxFTUVOVF9OT0RFKQotICAgICAgbiA9IG4tPm5leHRTaWJsaW5nKCk7Ci0gICAgcmV0dXJu
IHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsKj4obik7Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVu
dEltcGw6OmNyZWF0ZUVsZW1lbnQoY29uc3QgRE9NU3RyaW5nICZuYW1lLCBpbnQgJmV4Y2VwdGlv
bkNvZGUpCi17Ci0gICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnROUyhudWxsQXRvbSwgbmFtZSwgZXhj
ZXB0aW9uQ29kZSk7Ci19Ci0KLURvY3VtZW50RnJhZ21lbnRJbXBsICpEb2N1bWVudEltcGw6OmNy
ZWF0ZURvY3VtZW50RnJhZ21lbnQoICApCi17Ci0gICAgcmV0dXJuIG5ldyBEb2N1bWVudEZyYWdt
ZW50SW1wbChnZXREb2N1bWVudCgpKTsKLX0KLQotVGV4dEltcGwgKkRvY3VtZW50SW1wbDo6Y3Jl
YXRlVGV4dE5vZGUoY29uc3QgRE9NU3RyaW5nICZkYXRhKQotewotICAgIHJldHVybiBuZXcgVGV4
dEltcGwodGhpcywgZGF0YSk7Ci19Ci0KLUNvbW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0
ZUNvbW1lbnQgKGNvbnN0IERPTVN0cmluZyAmZGF0YSkKLXsKLSAgICByZXR1cm4gbmV3IENvbW1l
bnRJbXBsKHRoaXMsIGRhdGEpOwotfQotCi1DREFUQVNlY3Rpb25JbXBsICpEb2N1bWVudEltcGw6
OmNyZWF0ZUNEQVRBU2VjdGlvbihjb25zdCBET01TdHJpbmcgJmRhdGEsIGludCAmZXhjZXB0aW9u
KQotewotICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbiA9IERP
TUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAg
IH0KLSAgICByZXR1cm4gbmV3IENEQVRBU2VjdGlvbkltcGwodGhpcywgZGF0YSk7Ci19Ci0KLVBy
b2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlUHJvY2Vzc2luZ0lu
c3RydWN0aW9uKGNvbnN0IERPTVN0cmluZyAmdGFyZ2V0LCBjb25zdCBET01TdHJpbmcgJmRhdGEs
IGludCAmZXhjZXB0aW9uKQotewotICAgIGlmICghaXNWYWxpZE5hbWUodGFyZ2V0KSkgewotICAg
ICAgICBleGNlcHRpb24gPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAg
ICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKSB7Ci0g
ICAgICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAg
ICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFByb2Nlc3NpbmdJbnN0cnVj
dGlvbkltcGwodGhpcywgdGFyZ2V0LCBkYXRhKTsKLX0KLQotRW50aXR5UmVmZXJlbmNlSW1wbCAq
RG9jdW1lbnRJbXBsOjpjcmVhdGVFbnRpdHlSZWZlcmVuY2UoY29uc3QgRE9NU3RyaW5nICZuYW1l
LCBpbnQgJmV4Y2VwdGlvbikKLXsKLSAgICBpZiAoIWlzVmFsaWROYW1lKG5hbWUpKSB7Ci0gICAg
ICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6SU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAg
ICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAg
ICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAg
ICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRW50aXR5UmVmZXJlbmNlSW1w
bCh0aGlzLCBuYW1lLmltcGwoKSk7Ci19Ci0KLUVkaXRpbmdUZXh0SW1wbCAqRG9jdW1lbnRJbXBs
OjpjcmVhdGVFZGl0aW5nVGV4dE5vZGUoY29uc3QgRE9NU3RyaW5nICZ0ZXh0KQotewotICAgIHJl
dHVybiBuZXcgRWRpdGluZ1RleHRJbXBsKHRoaXMsIHRleHQpOwotfQotCi1DU1NTdHlsZURlY2xh
cmF0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkKLXsK
LSAgICByZXR1cm4gbmV3IENTU011dGFibGVTdHlsZURlY2xhcmF0aW9uSW1wbDsKLX0KLQotTm9k
ZUltcGwgKkRvY3VtZW50SW1wbDo6aW1wb3J0Tm9kZShOb2RlSW1wbCAqaW1wb3J0ZWROb2RlLCBi
b29sIGRlZXAsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICBleGNlcHRpb25jb2RlID0gMDsK
LQotICAgIHN3aXRjaCAoaW1wb3J0ZWROb2RlLT5ub2RlVHlwZSgpKSB7Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6VEVYVF9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRleHROb2RlKGltcG9y
dGVkTm9kZS0+bm9kZVZhbHVlKCkpOwotICAgICAgICBjYXNlIE5vZGU6OkNEQVRBX1NFQ1RJT05f
Tk9ERToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVDREFUQVNlY3Rpb24oaW1wb3J0ZWROb2Rl
LT5ub2RlVmFsdWUoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZ
X1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVudGl0eVJlZmVyZW5j
ZShpbXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBjYXNl
IE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgICAgIHJldHVybiBj
cmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oaW1wb3J0ZWROb2RlLT5ub2RlTmFtZSgpLCBpbXBv
cnRlZE5vZGUtPm5vZGVWYWx1ZSgpLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgY2FzZSBOb2Rl
OjpDT01NRU5UX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlQ29tbWVudChpbXBvcnRl
ZE5vZGUtPm5vZGVWYWx1ZSgpKTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6IHsK
LSAgICAgICAgICAgIEVsZW1lbnRJbXBsICpvbGRFbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVu
dEltcGwgKj4oaW1wb3J0ZWROb2RlKTsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsICpuZXdFbGVt
ZW50ID0gY3JlYXRlRWxlbWVudE5TKG9sZEVsZW1lbnQtPm5hbWVzcGFjZVVSSSgpLCBvbGRFbGVt
ZW50LT50YWdOYW1lKCkudG9TdHJpbmcoKSwgZXhjZXB0aW9uY29kZSk7Ci0JCQkKLSAgICAgICAg
ICAgIGlmIChleGNlcHRpb25jb2RlICE9IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0K
LSAgICAgICAgICAgIG5ld0VsZW1lbnQtPnJlZigpOwotCi0gICAgICAgICAgICBOYW1lZEF0dHJN
YXBJbXBsICphdHRycyA9IG9sZEVsZW1lbnQtPmF0dHJpYnV0ZXModHJ1ZSk7Ci0gICAgICAgICAg
ICBpZiAoYXR0cnMpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW5ndGggPSBhdHRycy0+
bGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbmd0
aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUltcGwqIGF0dHIgPSBhdHRy
cy0+YXR0cmlidXRlSXRlbShpKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+c2V0
QXR0cmlidXRlKGF0dHItPm5hbWUoKSwgYXR0ci0+dmFsdWUoKS5pbXBsKCksIGV4Y2VwdGlvbmNv
ZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAhPSAwKSB7Ci0gICAg
ICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG5ld0VsZW1lbnQtPmNvcHlOb25BdHRy
aWJ1dGVQcm9wZXJ0aWVzKG9sZEVsZW1lbnQpOwotCi0gICAgICAgICAgICBpZiAoZGVlcCkgewot
ICAgICAgICAgICAgICAgIGZvciAoTm9kZUltcGwgKm9sZENoaWxkID0gb2xkRWxlbWVudC0+Zmly
c3RDaGlsZCgpOyBvbGRDaGlsZDsgb2xkQ2hpbGQgPSBvbGRDaGlsZC0+bmV4dFNpYmxpbmcoKSkg
ewotICAgICAgICAgICAgICAgICAgICBOb2RlSW1wbCAqbmV3Q2hpbGQgPSBpbXBvcnROb2RlKG9s
ZENoaWxkLCB0cnVlLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4
Y2VwdGlvbmNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+
ZGVyZWYoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQtPmFwcGVuZENoaWxkKG5l
d0NoaWxkLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlv
bmNvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+ZGVyZWYo
KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBU
cmljayB0byBnZXQgdGhlIHJlc3VsdCBiYWNrIHRvIHRoZSBmbG9hdGluZyBzdGF0ZSwgd2l0aCAw
IHJlZnMgYnV0IG5vdCBkZXN0cm95ZWQuCi0gICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRQYXJl
bnQodGhpcyk7Ci0gICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAgICAgICAg
bmV3RWxlbWVudC0+c2V0UGFyZW50KDApOwotCi0gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVu
dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246
Ok5PVF9TVVBQT1JURURfRVJSOwotICAgIHJldHVybiAwOwotfQotCi0KLU5vZGVJbXBsICpEb2N1
bWVudEltcGw6OmFkb3B0Tm9kZShOb2RlSW1wbCAqc291cmNlLCBpbnQgJmV4Y2VwdGlvbmNvZGUp
Ci17Ci0gICAgaWYgKCFzb3VyY2UpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIFJlZlB0
cjxOb2RlSW1wbD4gcHJvdGVjdChzb3VyY2UpOwotCi0gICAgc3dpdGNoIChzb3VyY2UtPm5vZGVU
eXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfTk9ERToKLSAgICAgICAgY2FzZSBO
b2RlOjpOT1RBVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6RE9DVU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05P
REU6Ci0gICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9S
VEVEX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgIAotICAgICAgICBjYXNl
IE5vZGU6OkFUVFJJQlVURV9OT0RFOiB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAg
QXR0ckltcGwgKmF0dHIgPSBzdGF0aWNfY2FzdDxBdHRySW1wbCAqPihzb3VyY2UpOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICBpZiAoYXR0ci0+b3duZXJFbGVtZW50KCkpCi0gICAgICAgICAg
ICAgICAgYXR0ci0+b3duZXJFbGVtZW50KCktPnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0ciwgZXhj
ZXB0aW9uY29kZSk7Ci0KLSAgICAgICAgICAgIGF0dHItPm1fc3BlY2lmaWVkID0gdHJ1ZTsKLSAg
ICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgICAgIAotICAgICAgICBkZWZhdWx0OgotICAg
ICAgICAgICAgaWYgKHNvdXJjZS0+cGFyZW50Tm9kZSgpKQotICAgICAgICAgICAgICAgIHNvdXJj
ZS0+cGFyZW50Tm9kZSgpLT5yZW1vdmVDaGlsZChzb3VyY2UsIGV4Y2VwdGlvbmNvZGUpOwotICAg
IH0KLSAgICAgICAgICAgICAgICAKLSAgICBmb3IgKE5vZGVJbXBsICpub2RlID0gc291cmNlOyBu
b2RlOyBub2RlID0gbm9kZS0+dHJhdmVyc2VOZXh0Tm9kZShzb3VyY2UpKSB7Ci0gICAgICAgIEtK
Uzo6U2NyaXB0SW50ZXJwcmV0ZXI6OnVwZGF0ZURPTU5vZGVEb2N1bWVudChub2RlLCBub2RlLT5n
ZXREb2N1bWVudCgpLCB0aGlzKTsKLSAgICAgICAgbm9kZS0+c2V0RG9jdW1lbnQodGhpcyk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHNvdXJjZTsKLQotfQotCi1FbGVtZW50SW1wbCAqRG9jdW1lbnRJ
bXBsOjpjcmVhdGVFbGVtZW50TlMoY29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBjb25z
dCBET01TdHJpbmcgJnF1YWxpZmllZE5hbWUsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICAv
LyBGSVhNRTogV2UnZCBsaWtlIGEgZmFzdGVyIGNvZGUgcGF0aCB0aGF0IHNraXBzIHRoaXMgY2hl
Y2sgZm9yIGNhbGxzIGZyb20gaW5zaWRlIHRoZSBlbmdpbmUgd2hlcmUgdGhlIG5hbWUgaXMga25v
d24gdG8gYmUgdmFsaWQuCi0gICAgRE9NU3RyaW5nIHByZWZpeCwgbG9jYWxOYW1lOwotICAgIGlm
ICghcGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwgbG9jYWxOYW1lKSkg
ewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpJTlZBTElEX0NIQVJBQ1RF
Ul9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIEVsZW1lbnRJbXBsICplID0g
MDsKLSAgICBRdWFsaWZpZWROYW1lIHFOYW1lID0gUXVhbGlmaWVkTmFtZShBdG9taWNTdHJpbmco
cHJlZml4KSwgQXRvbWljU3RyaW5nKGxvY2FsTmFtZSksIEF0b21pY1N0cmluZyhfbmFtZXNwYWNl
VVJJKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IFVzZSByZWdpc3RlcmVkIG5hbWVzcGFjZXMgYW5k
IGxvb2sgdXAgaW4gYSBoYXNoIHRvIGZpbmQgdGhlIHJpZ2h0IGZhY3RvcnkuCi0gICAgaWYgKF9u
YW1lc3BhY2VVUkkgPT0geGh0bWxOYW1lc3BhY2VVUkkpIHsKLSAgICAgICAgZSA9IEhUTUxFbGVt
ZW50RmFjdG9yeTo6Y3JlYXRlSFRNTEVsZW1lbnQocU5hbWUubG9jYWxOYW1lKCksIHRoaXMsIDAs
IGZhbHNlKTsKLSAgICAgICAgaWYgKGUgJiYgIXByZWZpeC5pc051bGwoKSkgewotICAgICAgICAg
ICAgZS0+c2V0UHJlZml4KHFOYW1lLnByZWZpeCgpLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAg
ICAgIGlmIChleGNlcHRpb25jb2RlKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAg
ICB9Ci0gICAgfQotI2lmIFNWR19TVVBQT1JUCi0gICAgZWxzZSBpZiAoX25hbWVzcGFjZVVSSSA9
PSBLU1ZHOjpTVkdOYW1lczo6c3ZnTmFtZXNwYWNlVVJJKQotICAgICAgICBlID0gS1NWRzo6U1ZH
RWxlbWVudEZhY3Rvcnk6OmNyZWF0ZVNWR0VsZW1lbnQocU5hbWUsIHRoaXMsIGZhbHNlKTsKLSNl
bmRpZgotICAgIAotICAgIGlmICghZSkKLSAgICAgICAgZSA9IG5ldyBFbGVtZW50SW1wbChxTmFt
ZSwgZ2V0RG9jdW1lbnQoKSk7Ci0gICAgCi0gICAgcmV0dXJuIGU7Ci19Ci0KLUVsZW1lbnRJbXBs
ICpEb2N1bWVudEltcGw6OmdldEVsZW1lbnRCeUlkKCBjb25zdCBET01TdHJpbmcgJmVsZW1lbnRJ
ZCApIGNvbnN0Ci17Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnQ7Ci0gICAgUVN0cmluZyBxSWQg
PSBlbGVtZW50SWQucXN0cmluZygpOwotCi0gICAgaWYgKGVsZW1lbnRJZC5sZW5ndGgoKSA9PSAw
KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGVsZW1lbnQgPSBtX2VsZW1lbnRz
QnlJZC5maW5kKHFJZCk7Ci0gICAgCi0gICAgaWYgKGVsZW1lbnQpCi0gICAgICAgIHJldHVybiBl
bGVtZW50OwotICAgICAgICAKLSAgICBpZiAoaW50IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5m
aW5kKHFJZCkpIHsKLSAgICAgICAgZm9yIChOb2RlSW1wbCAqbiA9IHRyYXZlcnNlTmV4dE5vZGUo
KTsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgICAgICAgICBpZiAo
IW4tPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
ICAgIAotICAgICAgICAgICAgZWxlbWVudCA9IHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsICo+KG4p
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoZWxlbWVudC0+aGFzSUQoKSAmJiBlbGVt
ZW50LT5nZXRBdHRyaWJ1dGUoaWRBdHRyKSA9PSBlbGVtZW50SWQpIHsKLSAgICAgICAgICAgICAg
ICBpZiAoaWRDb3VudCA9PSAxKSAKLSAgICAgICAgICAgICAgICAgICAgbV9pZENvdW50LnJlbW92
ZShxSWQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbV9pZENv
dW50Lmluc2VydChxSWQsIChjaGFyICopaWRDb3VudCAtIDEpOwotICAgICAgICAgICAgICAgIAot
ICAgICAgICAgICAgICAgIG1fZWxlbWVudHNCeUlkLmluc2VydChxSWQsIGVsZW1lbnQpOwotICAg
ICAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0g
ICAgfQotICAgIHJldHVybiAwOwotfQotCi1FbGVtZW50SW1wbCAqRG9jdW1lbnRJbXBsOjplbGVt
ZW50RnJvbVBvaW50KCBjb25zdCBpbnQgX3gsIGNvbnN0IGludCBfeSApIGNvbnN0Ci17Ci0gICAg
aWYgKCFtX3JlbmRlcikgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5m
byBub2RlSW5mbyh0cnVlLCB0cnVlKTsKLSAgICBtX3JlbmRlci0+bGF5ZXIoKS0+aGl0VGVzdChu
b2RlSW5mbywgX3gsIF95KTsgCi0gICAgTm9kZUltcGwqIG4gPSBub2RlSW5mby5pbm5lck5vZGUo
KTsKLQotICAgIHdoaWxlICggbiAmJiAhbi0+aXNFbGVtZW50Tm9kZSgpICkgewotICAgICAgICBu
ID0gbi0+cGFyZW50Tm9kZSgpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudEltcGwqPihuKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmFkZEVsZW1lbnRCeUlk
KGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCkKLXsKLSAg
ICBRU3RyaW5nIHFJZCA9IGVsZW1lbnRJZC5xc3RyaW5nKCk7Ci0gICAgCi0gICAgaWYgKG1fZWxl
bWVudHNCeUlkLmZpbmQocUlkKSA9PSBOVUxMKSB7Ci0gICAgICAgIG1fZWxlbWVudHNCeUlkLmlu
c2VydChxSWQsIGVsZW1lbnQpOwotICAgICAgICBtX2FjY2Vzc0tleURpY3RWYWxpZCA9IGZhbHNl
OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBpZENvdW50ID0gKGludCltX2lkQ291bnQuZmlu
ZChxSWQpOwotICAgICAgICBtX2lkQ291bnQuaW5zZXJ0KHFJZCwgKGNoYXIgKikoaWRDb3VudCAr
IDEpKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVFbGVtZW50QnlJZChj
b25zdCBET01TdHJpbmcgJmVsZW1lbnRJZCwgRWxlbWVudEltcGwgKmVsZW1lbnQpCi17Ci0gICAg
UVN0cmluZyBxSWQgPSBlbGVtZW50SWQucXN0cmluZygpOwotCi0gICAgaWYgKG1fZWxlbWVudHNC
eUlkLmZpbmQocUlkKSA9PSBlbGVtZW50KSB7Ci0gICAgICAgIG1fZWxlbWVudHNCeUlkLnJlbW92
ZShxSWQpOwotICAgICAgICBtX2FjY2Vzc0tleURpY3RWYWxpZCA9IGZhbHNlOwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIGludCBpZENvdW50ID0gKGludCltX2lkQ291bnQuZmluZChxSWQpOyAgICAg
ICAgCi0gICAgICAgIGFzc2VydChpZENvdW50ID4gMCk7Ci0gICAgICAgIGlmIChpZENvdW50ID09
IDEpIAotICAgICAgICAgICAgbV9pZENvdW50LnJlbW92ZShxSWQpOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgICBtX2lkQ291bnQuaW5zZXJ0KHFJZCwgKGNoYXIgKikoaWRDb3VudCAtIDEpKTsK
LSAgICB9Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmdldEVsZW1lbnRCeUFjY2Vz
c0tleSggY29uc3QgRE9NU3RyaW5nICZrZXkgKQotewotICAgIGlmICgha2V5Lmxlbmd0aCgpKQot
CXJldHVybiAwOwotCi0gICAgaWYgKCFtX2FjY2Vzc0tleURpY3RWYWxpZCkgewotICAgICAgICBt
X2VsZW1lbnRzQnlBY2Nlc3NLZXkuY2xlYXIoKTsKLSAgICAKLSAgICAgICAgY29uc3QgTm9kZUlt
cGwgKm47Ci0gICAgICAgIGZvciAobiA9IHRoaXM7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUoKSkgewotICAgICAgICAgICAgaWYgKCFuLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjb25zdCBFbGVtZW50SW1wbCAqZWxlbWVu
dEltcGwgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGVtZW50SW1wbCAqPihuKTsKLSAgICAgICAgICAg
IERPTVN0cmluZyBhY2Nlc3NLZXkoZWxlbWVudEltcGwtPmdldEF0dHJpYnV0ZShhY2Nlc3NrZXlB
dHRyKSk7OwotICAgICAgICAgICAgaWYgKCFhY2Nlc3NLZXkuaXNFbXB0eSgpKSB7Ci0gICAgICAg
ICAgICAgICAgUVN0cmluZyBhayA9IGFjY2Vzc0tleS5xc3RyaW5nKCkubG93ZXIoKTsKLSAgICAg
ICAgICAgICAgICBpZiAobV9lbGVtZW50c0J5QWNjZXNzS2V5LmZpbmQoYWspID09IE5VTEwpCi0g
ICAgICAgICAgICAgICAgICAgIG1fZWxlbWVudHNCeUFjY2Vzc0tleS5pbnNlcnQoYWssIGVsZW1l
bnRJbXBsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtX2FjY2Vzc0tleURp
Y3RWYWxpZCA9IHRydWU7Ci0gICAgfQotICAgIHJldHVybiBtX2VsZW1lbnRzQnlBY2Nlc3NLZXku
ZmluZChrZXkucXN0cmluZygpKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnVwZGF0ZVRpdGxl
KCkKLXsKLSAgICBGcmFtZSAqcCA9IGZyYW1lKCk7Ci0gICAgaWYgKCFwKQotICAgICAgICByZXR1
cm47Ci0KLSAgICBNYWMocCktPnNldFRpdGxlKG1fdGl0bGUpOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6c2V0VGl0bGUoRE9NU3RyaW5nIHRpdGxlLCBOb2RlSW1wbCAqdGl0bGVFbGVtZW50KQot
ewotICAgIGlmICghdGl0bGVFbGVtZW50KSB7Ci0gICAgICAgIC8vIFRpdGxlIHNldCBieSBKYXZh
U2NyaXB0IC0tIG92ZXJyaWRlcyBhbnkgdGl0bGUgZWxlbWVudHMuCi0gICAgICAgIG1fdGl0bGVT
ZXRFeHBsaWNpdGx5ID0gdHJ1ZTsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSAwOwotICAgIH0g
ZWxzZSBpZiAodGl0bGVFbGVtZW50ICE9IG1fdGl0bGVFbGVtZW50KSB7Ci0gICAgICAgIGlmICht
X3RpdGxlRWxlbWVudCkKLSAgICAgICAgICAgIC8vIE9ubHkgYWxsb3cgdGhlIGZpcnN0IHRpdGxl
IGVsZW1lbnQgdG8gY2hhbmdlIHRoZSB0aXRsZSAtLSBvdGhlcnMgaGF2ZSBubyBlZmZlY3QuCi0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIG1fdGl0bGVFbGVtZW50ID0gdGl0bGVFbGVtZW50
OwotICAgIH0KLQotICAgIGlmIChtX3RpdGxlID09IHRpdGxlKQotICAgICAgICByZXR1cm47Ci0K
LSAgICBtX3RpdGxlID0gdGl0bGU7Ci0gICAgdXBkYXRlVGl0bGUoKTsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnJlbW92ZVRpdGxlKE5vZGVJbXBsICp0aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYg
KG1fdGl0bGVFbGVtZW50ICE9IHRpdGxlRWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAg
Ly8gRklYTUU6IElkZWFsbHkgd2UgbWlnaHQgd2FudCB0aGlzIHRvIHNlYXJjaCBmb3IgdGhlIGZp
cnN0IHJlbWFpbmluZyB0aXRsZSBlbGVtZW50LCBhbmQgdXNlIGl0LgotICAgIG1fdGl0bGVFbGVt
ZW50ID0gMDsKLQotICAgIGlmICghbV90aXRsZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgbV90aXRs
ZSA9ICIiOwotICAgICAgICB1cGRhdGVUaXRsZSgpOwotICAgIH0KLX0KLQotRE9NU3RyaW5nIERv
Y3VtZW50SW1wbDo6bm9kZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiAiI2RvY3VtZW50IjsK
LX0KLQotdW5zaWduZWQgc2hvcnQgRG9jdW1lbnRJbXBsOjpub2RlVHlwZSgpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIE5vZGU6OkRPQ1VNRU5UX05PREU7Ci19Ci0KLVFTdHJpbmcgRG9jdW1lbnRJbXBs
OjpuZXh0U3RhdGUoKQotewotICAgUVN0cmluZyBzdGF0ZTsKLSAgIGlmICghbV9zdGF0ZS5pc0Vt
cHR5KCkpCi0gICB7Ci0gICAgICBzdGF0ZSA9IG1fc3RhdGUuZmlyc3QoKTsKLSAgICAgIG1fc3Rh
dGUucmVtb3ZlKG1fc3RhdGUuYmVnaW4oKSk7Ci0gICB9Ci0gICByZXR1cm4gc3RhdGU7Ci19Ci0K
LVFTdHJpbmdMaXN0IERvY3VtZW50SW1wbDo6ZG9jU3RhdGUoKQotewotICAgIFFTdHJpbmdMaXN0
IHM7Ci0gICAgZm9yIChRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJbXBsPiBpdChtX21haW50YWluc1N0
YXRlKTsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBzLmFwcGVuZChpdC5jdXJyZW50KCkt
PnN0YXRlKCkpOwotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLUZyYW1lICpEb2N1bWVudEltcGw6OmZy
YW1lKCkgY29uc3QgCi17Ci0gICAgcmV0dXJuIG1fdmlldyA/IG1fdmlldy0+ZnJhbWUoKSA6IDA7
IAotfQotCi1SYW5nZUltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlUmFuZ2UoKQotewotICAgIHJl
dHVybiBuZXcgUmFuZ2VJbXBsKHRoaXMpOwotfQotCi1Ob2RlSXRlcmF0b3JJbXBsICpEb2N1bWVu
dEltcGw6OmNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hhdFRv
U2hvdywgCi0gICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZl
cmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgaWYgKCFyb290KSB7Ci0gICAgICAg
IGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBOb2RlSXRlcmF0b3JJbXBsKHJvb3Qs
IHdoYXRUb1Nob3csIGZpbHRlciwgZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci19Ci0KLVRyZWVX
YWxrZXJJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZVRyZWVXYWxrZXIoTm9kZUltcGwgKnJvb3Qs
IHVuc2lnbmVkIHdoYXRUb1Nob3csIAotICAgIE5vZGVGaWx0ZXJJbXBsICpmaWx0ZXIsIGJvb2wg
ZXhwYW5kRW50aXR5UmVmZXJlbmNlcywgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIGlmICgh
cm9vdCkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9S
VEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVHJlZVdh
bGtlckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2Vz
KTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldERvY3VtZW50Q2hhbmdlZChib29sIGIpCi17
Ci0gICAgaWYgKCFjaGFuZ2VkRG9jdW1lbnRzKQotICAgICAgICBjaGFuZ2VkRG9jdW1lbnRzID0g
bmV3IFFQdHJMaXN0PERvY3VtZW50SW1wbD47Ci0KLSAgICBpZiAoYiAmJiAhbV9kb2NDaGFuZ2Vk
KQotICAgICAgICBjaGFuZ2VkRG9jdW1lbnRzLT5hcHBlbmQodGhpcyk7Ci0gICAgZWxzZSBpZiAo
IWIgJiYgbV9kb2NDaGFuZ2VkKQotICAgICAgICBjaGFuZ2VkRG9jdW1lbnRzLT5yZW1vdmUodGhp
cyk7Ci0gICAgbV9kb2NDaGFuZ2VkID0gYjsKLSAgICAKLSAgICBpZiAobV9kb2NDaGFuZ2VkKQot
ICAgICAgICBtX2FjY2Vzc0tleURpY3RWYWxpZCA9IGZhbHNlOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlIGNoYW5nZSApCi17Ci0vLyAgICAgcURlYnVn
KCJyZWNhbGNTdHlsZSglcCkiLCB0aGlzKTsKLS8vICAgICBRVGltZSBxdDsKLS8vICAgICBxdC5z
dGFydCgpOwotICAgIGlmIChtX2luU3R5bGVSZWNhbGMpCi0gICAgICAgIHJldHVybjsgLy8gR3Vh
cmQgYWdhaW5zdCByZS1lbnRyYW5jeS4gLWR3aAotICAgICAgICAKLSAgICBtX2luU3R5bGVSZWNh
bGMgPSB0cnVlOwotICAgIAotICAgIGlmKCAhbV9yZW5kZXIgKSBnb3RvIGJhaWxfb3V0OwotCi0g
ICAgaWYgKCBjaGFuZ2UgPT0gRm9yY2UgKSB7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBvbGRTdHls
ZSA9IG1fcmVuZGVyLT5zdHlsZSgpOwotICAgICAgICBpZiAoIG9sZFN0eWxlICkgb2xkU3R5bGUt
PnJlZigpOwotICAgICAgICBSZW5kZXJTdHlsZSogX3N0eWxlID0gbmV3IChtX3JlbmRlckFyZW5h
KSBSZW5kZXJTdHlsZSgpOwotICAgICAgICBfc3R5bGUtPnJlZigpOwotICAgICAgICBfc3R5bGUt
PnNldERpc3BsYXkoQkxPQ0spOwotICAgICAgICBfc3R5bGUtPnNldFZpc3VhbGx5T3JkZXJlZCgg
dmlzdWFsbHlPcmRlcmVkICk7Ci0gICAgICAgIC8vICMjIyBtYWtlIHRoZSBmb250IHN0dWZmIF9y
ZWFsbHlfIHdvcmshISEhCi0KLQlraHRtbDo6Rm9udERlZiBmb250RGVmOwotCVFGb250IGYgPSBL
R2xvYmFsU2V0dGluZ3M6OmdlbmVyYWxGb250KCk7Ci0JZm9udERlZi5mYW1pbHkgPSAqKGYuZmly
c3RGYW1pbHkoKSk7Ci0JZm9udERlZi5pdGFsaWMgPSBmLml0YWxpYygpOwotCWZvbnREZWYud2Vp
Z2h0ID0gZi53ZWlnaHQoKTsKLSAgICAgICAgYm9vbCBwcmludGluZyA9IG1fcGFpbnREZXZpY2Ug
JiYgKG1fcGFpbnREZXZpY2UtPmRldlR5cGUoKSA9PSBRSW50ZXJuYWw6OlByaW50ZXIpOwotICAg
ICAgICBmb250RGVmLnVzZVByaW50ZXJGb250ID0gcHJpbnRpbmc7Ci0gICAgICAgIGlmIChtX3Zp
ZXcpIHsKLSAgICAgICAgICAgIGNvbnN0IEtIVE1MU2V0dGluZ3MgKnNldHRpbmdzID0gbV92aWV3
LT5mcmFtZSgpLT5zZXR0aW5ncygpOwotICAgICAgICAgICAgaWYgKHByaW50aW5nICYmICFzZXR0
aW5ncy0+c2hvdWxkUHJpbnRCYWNrZ3JvdW5kcygpKSB7Ci0gICAgICAgICAgICAgICAgX3N0eWxl
LT5zZXRGb3JjZUJhY2tncm91bmRzVG9XaGl0ZSh0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIFFTdHJpbmcgc3RkZm9udCA9IHNldHRpbmdzLT5zdGRGb250TmFtZSgpOwotICAgICAg
ICAgICAgaWYgKCAhc3RkZm9udC5pc0VtcHR5KCkgKSB7Ci0gICAgICAgICAgICAgICAgZm9udERl
Zi5mYW1pbHkuc2V0RmFtaWx5KHN0ZGZvbnQpOwotICAgICAgICAgICAgICAgIGZvbnREZWYuZmFt
aWx5LmFwcGVuZEZhbWlseSgwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fc3R5bGVT
ZWxlY3Rvci0+c2V0Rm9udFNpemUoZm9udERlZiwgbV9zdHlsZVNlbGVjdG9yLT5mb250U2l6ZUZv
cktleXdvcmQoQ1NTX1ZBTF9NRURJVU0sIGluQ29tcGF0TW9kZSgpKSk7Ci0gICAgICAgIH0KLQot
ICAgICAgICAvL2tkRGVidWcoKSA8PCAiRG9jdW1lbnRJbXBsOjphdHRhY2g6IHNldHRpbmcgdG8g
Y2hhcnNldCAiIDw8IHNldHRpbmdzLT5jaGFyc2V0KCkgPDwgZW5kbDsKLSAgICAgICAgX3N0eWxl
LT5zZXRGb250RGVmKGZvbnREZWYpOwotCV9zdHlsZS0+aHRtbEZvbnQoKS51cGRhdGUoIHBhaW50
RGV2aWNlTWV0cmljcygpICk7Ci0gICAgICAgIGlmICggaW5Db21wYXRNb2RlKCkgKQotICAgICAg
ICAgICAgX3N0eWxlLT5zZXRIdG1sSGFja3ModHJ1ZSk7IC8vIGVuYWJsZSBodG1sIHNwZWNpZmlj
IHJlbmRlcmluZyB0cmlja3MKLQotICAgICAgICBTdHlsZUNoYW5nZSBjaCA9IGRpZmYoIF9zdHls
ZSwgb2xkU3R5bGUgKTsKLSAgICAgICAgaWYobV9yZW5kZXIgJiYgY2ggIT0gTm9DaGFuZ2UpCi0g
ICAgICAgICAgICBtX3JlbmRlci0+c2V0U3R5bGUoX3N0eWxlKTsKLSAgICAgICAgaWYgKCBjaGFu
Z2UgIT0gRm9yY2UgKQotICAgICAgICAgICAgY2hhbmdlID0gY2g7Ci0KLSAgICAgICAgX3N0eWxl
LT5kZXJlZihtX3JlbmRlckFyZW5hKTsKLSAgICAgICAgaWYgKG9sZFN0eWxlKQotICAgICAgICAg
ICAgb2xkU3R5bGUtPmRlcmVmKG1fcmVuZGVyQXJlbmEpOwotICAgIH0KLQotICAgIE5vZGVJbXBs
ICpuOwotICAgIGZvciAobiA9IF9maXJzdDsgbjsgbiA9IG4tPm5leHRTaWJsaW5nKCkpCi0gICAg
ICAgIGlmICggY2hhbmdlPj0gSW5oZXJpdCB8fCBuLT5oYXNDaGFuZ2VkQ2hpbGQoKSB8fCBuLT5j
aGFuZ2VkKCkgKQotICAgICAgICAgICAgbi0+cmVjYWxjU3R5bGUoIGNoYW5nZSApOwotICAgIC8v
a2REZWJ1ZyggNjAyMCApIDw8ICJUSU1FOiByZWNhbGNTdHlsZSgpIGR0PSIgPDwgcXQuZWxhcHNl
ZCgpIDw8IGVuZGw7Ci0KLSAgICBpZiAoY2hhbmdlZCgpICYmIG1fdmlldykKLQltX3ZpZXctPmxh
eW91dCgpOwotCi1iYWlsX291dDoKLSAgICBzZXRDaGFuZ2VkKCBmYWxzZSApOwotICAgIHNldEhh
c0NoYW5nZWRDaGlsZCggZmFsc2UgKTsKLSAgICBzZXREb2N1bWVudENoYW5nZWQoIGZhbHNlICk7
Ci0gICAgCi0gICAgbV9pblN0eWxlUmVjYWxjID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gSWYgd2Ug
d2FudGVkIHRvIGVtaXQgdGhlIGltcGxpY2l0Q2xvc2UoKSBkdXJpbmcgcmVjYWxjU3R5bGUsIGRv
IHNvIG5vdyB0aGF0IHdlJ3JlIGZpbmlzaGVkLgotICAgIGlmIChtX2Nsb3NlQWZ0ZXJTdHlsZVJl
Y2FsYykgewotICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgICAg
ICBpbXBsaWNpdENsb3NlKCk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRl
UmVuZGVyaW5nKCkKLXsKLSAgICBpZiAoIWhhc0NoYW5nZWRDaGlsZCgpKSByZXR1cm47Ci0KLS8v
ICAgICBRVGltZSB0aW1lOwotLy8gICAgIHRpbWUuc3RhcnQoKTsKLS8vICAgICBrZERlYnVnKCkg
PDwgIlVQREFURVJFTkRFUklORzogIjw8ZW5kbDsKLQotICAgIFN0eWxlQ2hhbmdlIGNoYW5nZSA9
IE5vQ2hhbmdlOwotICAgIHJlY2FsY1N0eWxlKCBjaGFuZ2UgKTsKLQotLy8gICAga2REZWJ1Zygp
IDw8ICJVUERBVEVSRU5ERVJJTkcgdGltZSB1c2VkPSI8PHRpbWUuZWxhcHNlZCgpPDxlbmRsOwot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nKCkKLXsKLSAg
ICBpZiAoIWNoYW5nZWREb2N1bWVudHMpCi0gICAgICAgIHJldHVybjsKLQotICAgIHdoaWxlIChE
b2N1bWVudEltcGwqIGRvYyA9IGNoYW5nZWREb2N1bWVudHMtPnRha2UoKSkgewotICAgICAgICBk
b2MtPm1fZG9jQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICBkb2MtPnVwZGF0ZVJlbmRlcmluZygp
OwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnVwZGF0ZUxheW91dCgpCi17Ci0gICAg
Ly8gRklYTUU6IERhdmUncyBwcmV0dHkgc3VyZSB3ZSBjYW4gcmVtb3ZlIHRoaXMgYmVjYXVzZQot
ICAgIC8vIGxheW91dCBjYWxscyByZWNhbGNTdHlsZSBhcyBuZWVkZWQuCi0gICAgdXBkYXRlUmVu
ZGVyaW5nKCk7Ci0KLSAgICAvLyBPbmx5IGRvIGEgbGF5b3V0IGlmIGNoYW5nZXMgaGF2ZSBvY2N1
cnJlZCB0aGF0IG1ha2UgaXQgbmVjZXNzYXJ5LiAgICAgIAotICAgIGlmIChtX3ZpZXcgJiYgcmVu
ZGVyZXIoKSAmJiByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpKQotCW1fdmlldy0+bGF5b3V0KCk7
Ci19Ci0KLS8vIEZJWE1FOiBUaGlzIGlzIGEgYmFkIGlkZWEgYW5kIG5lZWRzIHRvIGJlIHJlbW92
ZWQgZXZlbnR1YWxseS4KLS8vIE90aGVyIGJyb3dzZXJzIGxvYWQgc3R5bGVzaGVldHMgYmVmb3Jl
IHRoZXkgY29udGludWUgcGFyc2luZyB0aGUgd2ViIHBhZ2UuCi0vLyBTaW5jZSB3ZSBkb24ndCwg
d2UgY2FuIHJ1biBKYXZhU2NyaXB0IGNvZGUgdGhhdCBuZWVkcyBhbnN3ZXJzIGJlZm9yZSB0aGUK
LS8vIHN0eWxlc2hlZXRzIGFyZSBsb2FkZWQuIERvaW5nIGEgbGF5b3V0IGlnbm9yaW5nIHRoZSBw
ZW5kaW5nIHN0eWxlc2hlZXRzCi0vLyBsZXRzIHVzIGdldCByZWFzb25hYmxlIGFuc3dlcnMuIFRo
ZSBsb25nIHRlcm0gc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtIGlzCi0vLyB0byBpbnN0ZWFkIHN1
c3BlbmQgSmF2YVNjcmlwdCBleGVjdXRpb24uCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlTGF5
b3V0SWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzKCkKLXsKLSAgICBib29sIG9sZElnbm9yZSA9IG1f
aWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotICAgIAotICAgIGlmICghaGF2ZVN0eWxlc2hlZXRz
TG9hZGVkKCkpIHsKLSAgICAgICAgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMgPSB0cnVlOwot
CXVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsgICAgCi0gICAgfQotCi0gICAgdXBkYXRlTGF5b3V0KCk7
Ci0KLSAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IG9sZElnbm9yZTsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OmF0dGFjaCgpCi17Ci0gICAgYXNzZXJ0KCFhdHRhY2hlZCgpKTsKLSAg
ICBhc3NlcnQoIW1faW5QYWdlQ2FjaGUpOwotCi0gICAgaWYgKCBtX3ZpZXcgKQotICAgICAgICBz
ZXRQYWludERldmljZSggbV92aWV3ICk7Ci0KLSAgICBpZiAoIW1fcmVuZGVyQXJlbmEpCi0gICAg
ICAgIG1fcmVuZGVyQXJlbmEgPSBuZXcgUmVuZGVyQXJlbmEoKTsKLSAgICAKLSAgICAvLyBDcmVh
dGUgdGhlIHJlbmRlcmluZyB0cmVlCi0gICAgbV9yZW5kZXIgPSBuZXcgKG1fcmVuZGVyQXJlbmEp
IFJlbmRlckNhbnZhcyh0aGlzLCBtX3ZpZXcpOwotICAgIHJlY2FsY1N0eWxlKCBGb3JjZSApOwot
Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXIgPSBtX3JlbmRlcjsKLSAgICBtX3JlbmRlciA9IDA7
Ci0KLSAgICBDb250YWluZXJOb2RlSW1wbDo6YXR0YWNoKCk7Ci0gICAgbV9yZW5kZXIgPSByZW5k
ZXI7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZXN0b3JlUmVuZGVyZXIoUmVuZGVyT2JqZWN0
KiByZW5kZXIpCi17Ci0gICAgbV9yZW5kZXIgPSByZW5kZXI7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpkZXRhY2goKQotewotICAgIFJlbmRlck9iamVjdCogcmVuZGVyID0gbV9yZW5kZXI7Ci0K
LSAgICAvLyBpbmRpY2F0ZSBkZXN0cnVjdGlvbiBtb2RlLCAgaS5lLiBhdHRhY2hlZCgpIGJ1dCBt
X3JlbmRlciA9PSAwCi0gICAgbV9yZW5kZXIgPSAwOwotICAgIAotICAgIGlmIChtX2luUGFnZUNh
Y2hlKSB7Ci0gICAgICAgIGlmICggcmVuZGVyICkKLSAgICAgICAgICAgIGdldEFjY09iamVjdENh
Y2hlKCktPmRldGFjaChyZW5kZXIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8g
RW1wdHkgb3V0IHRoZXNlIGxpc3RzIGFzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBzaW5j
ZSBkZXRhY2hpbmcKLSAgICAvLyBhbGwgdGhlIGluZGl2aWR1YWwgcmVuZGVyIG9iamVjdHMgd2ls
bCBjYXVzZSBhbGwgdGhlIFJlbmRlckltYWdlCi0gICAgLy8gb2JqZWN0cyB0byByZW1vdmUgdGhl
bXNlbHZlcyBmcm9tIHRoZSBsaXN0cy4KLSAgICBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hTb29u
TGlzdC5jbGVhcigpOwotICAgIG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaGluZ0xpc3QuY2xlYXIo
KTsKLSAgICAKLSAgICBDb250YWluZXJOb2RlSW1wbDo6ZGV0YWNoKCk7Ci0KLSAgICBpZiAoIHJl
bmRlciApCi0gICAgICAgIHJlbmRlci0+ZGVzdHJveSgpOwotCi0gICAgaWYgKG1fcGFpbnREZXZp
Y2UgPT0gbV92aWV3KQotICAgICAgICBzZXRQYWludERldmljZSgwKTsKLSAgICBtX3ZpZXcgPSAw
OwotICAgIAotICAgIGlmIChtX3JlbmRlckFyZW5hKXsKLSAgICAgICAgZGVsZXRlIG1fcmVuZGVy
QXJlbmE7Ci0gICAgICAgIG1fcmVuZGVyQXJlbmEgPSAwOwotICAgIH0KLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzRnJvbUFsbE5vZGVzKCkKLXsKLSAgICBt
X3dpbmRvd0V2ZW50TGlzdGVuZXJzLmNsZWFyKCk7Ci0gICAgcmVtb3ZlQWxsRGlzY29ubmVjdGVk
Tm9kZUV2ZW50TGlzdGVuZXJzKCk7Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IHRoaXM7IG47IG4g
PSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAgbi0+cmVtb3ZlQWxsRXZlbnRMaXN0
ZW5lcnMoKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZWdpc3RlckRpc2Nvbm5l
Y3RlZE5vZGVXaXRoRXZlbnRMaXN0ZW5lcnMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgbV9kaXNj
b25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycy5pbnNlcnQobm9kZSwgbm9kZSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjp1bnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExp
c3RlbmVycyhOb2RlSW1wbCAqbm9kZSkKLXsKLSAgICBtX2Rpc2Nvbm5lY3RlZE5vZGVzV2l0aEV2
ZW50TGlzdGVuZXJzLnJlbW92ZShub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92
ZUFsbERpc2Nvbm5lY3RlZE5vZGVFdmVudExpc3RlbmVycygpCi17Ci0gICAgZm9yIChRUHRyRGlj
dEl0ZXJhdG9yPE5vZGVJbXBsPiBpdGVyKG1fZGlzY29ubmVjdGVkTm9kZXNXaXRoRXZlbnRMaXN0
ZW5lcnMpOwotICAgICAgICAgaXRlci5jdXJyZW50KCk7Ci0gICAgICAgICArK2l0ZXIpIHsKLSAg
ICAgICAgaXRlci5jdXJyZW50KCktPnJlbW92ZUFsbEV2ZW50TGlzdGVuZXJzKCk7Ci0gICAgfQot
ICAgIG1fZGlzY29ubmVjdGVkTm9kZXNXaXRoRXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTsKLX0KLQot
S1dRQWNjT2JqZWN0Q2FjaGUqIERvY3VtZW50SW1wbDo6Z2V0QWNjT2JqZWN0Q2FjaGUoKQotewot
ICAgIC8vIFRoZSBvbmx5IGRvY3VtZW50IHRoYXQgYWN0dWFsbHkgaGFzIGEgS1dRQWNjT2JqZWN0
Q2FjaGUgaXMgdGhlIHRvcC1sZXZlbAotICAgIC8vIGRvY3VtZW50LiAgVGhpcyBpcyBiZWNhdXNl
IHdlIG5lZWQgdG8gYmUgYWJsZSB0byBnZXQgZnJvbSBhbnkgS1dRQWNjT2JqZWN0Ci0gICAgLy8g
dG8gYW55IG90aGVyIEtXUUFjY09iamVjdCBvbiB0aGUgc2FtZSBwYWdlLiAgVXNpbmcgYSBzaW5n
bGUgY2FjaGUgYWxsb3dzCi0gICAgLy8gbG9va3VwcyBhY3Jvc3MgbmVzdGVkIHdlYmFyZWFzIChp
LmUuIG11bHRpcGxlIGRvY3VtZW50cykuCi0gICAgCi0gICAgaWYgKG1fYWNjQ2FjaGUpIHsKLSAg
ICAgICAgLy8gcmV0dXJuIGFscmVhZHkga25vd24gdG9wLWxldmVsIGNhY2hlCi0gICAgICAgIGlm
ICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gbV9hY2NDYWNoZTsKLSAgICAg
ICAgCi0gICAgICAgIC8vIEluIHNvbWUgcGFnZXMgd2l0aCBmcmFtZXMsIHRoZSBjYWNoZSBpcyBj
cmVhdGVkIGJlZm9yZSB0aGUgc3ViLXdlYmFyZWEgaXMKLSAgICAgICAgLy8gaW5zZXJ0ZWQgaW50
byB0aGUgdHJlZS4gIEhlcmUsIHdlIGNhdGNoIHRoYXQgY2FzZSBhbmQganVzdCB0b3NzIHRoZSBv
bGQKLSAgICAgICAgLy8gY2FjaGUgYW5kIHN0YXJ0IG92ZXIuCi0gICAgICAgIGRlbGV0ZSBtX2Fj
Y0NhY2hlOwotICAgICAgICBtX2FjY0NhY2hlID0gMDsKLSAgICB9Ci0gICAgCi0gICAgLy8gbG9v
ayBmb3IgdG9wLWxldmVsIGRvY3VtZW50Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnQgPSBvd25l
ckVsZW1lbnQoKTsKLSAgICBpZiAoZWxlbWVudCkgewotICAgICAgICBEb2N1bWVudEltcGwgKmRv
YzsKLSAgICAgICAgd2hpbGUgKGVsZW1lbnQpIHsKLSAgICAgICAgICAgIGRvYyA9IGVsZW1lbnQt
PmdldERvY3VtZW50KCk7Ci0gICAgICAgICAgICBlbGVtZW50ID0gZG9jLT5vd25lckVsZW1lbnQo
KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gYXNrIHRoZSB0b3AtbGV2ZWwgZG9j
dW1lbnQgZm9yIGl0cyBjYWNoZQotICAgICAgICByZXR1cm4gZG9jLT5nZXRBY2NPYmplY3RDYWNo
ZSgpOwotICAgIH0KLSAgICAKLSAgICAvLyB0aGlzIGlzIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnQs
IHNvIGluc3RhbGwgYSBuZXcgY2FjaGUKLSAgICBtX2FjY0NhY2hlID0gbmV3IEtXUUFjY09iamVj
dENhY2hlOwotICAgIHJldHVybiBtX2FjY0NhY2hlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6
c2V0VmlzdWFsbHlPcmRlcmVkKCkKLXsKLSAgICB2aXN1YWxseU9yZGVyZWQgPSB0cnVlOwotICAg
IGlmIChtX3JlbmRlcikKLSAgICAgICAgbV9yZW5kZXItPnN0eWxlKCktPnNldFZpc3VhbGx5T3Jk
ZXJlZCh0cnVlKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnVwZGF0ZVNlbGVjdGlvbigpCi17
Ci0gICAgaWYgKCFtX3JlbmRlcikKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFJlbmRlckNh
bnZhcyAqY2FudmFzID0gc3RhdGljX2Nhc3Q8UmVuZGVyQ2FudmFzKj4obV9yZW5kZXIpOwotICAg
IFNlbGVjdGlvbkNvbnRyb2xsZXIgcyA9IGZyYW1lKCktPnNlbGVjdGlvbigpOwotICAgIGlmICgh
cy5pc1JhbmdlKCkpIHsKLSAgICAgICAgY2FudmFzLT5jbGVhclNlbGVjdGlvbigpOwotICAgIH0K
LSAgICBlbHNlIHsKLSAgICAgICAgUG9zaXRpb24gc3RhcnRQb3MgPSBWaXNpYmxlUG9zaXRpb24o
cy5zdGFydCgpLCBzLnN0YXJ0QWZmaW5pdHkoKSkuZGVlcEVxdWl2YWxlbnQoKTsKLSAgICAgICAg
UG9zaXRpb24gZW5kUG9zID0gVmlzaWJsZVBvc2l0aW9uKHMuZW5kKCksIHMuZW5kQWZmaW5pdHko
KSkuZGVlcEVxdWl2YWxlbnQoKTsKLSAgICAgICAgaWYgKHN0YXJ0UG9zLmlzTm90TnVsbCgpICYm
IGVuZFBvcy5pc05vdE51bGwoKSkgewotICAgICAgICAgICAgUmVuZGVyT2JqZWN0ICpzdGFydFJl
bmRlcmVyID0gc3RhcnRQb3Mubm9kZSgpLT5yZW5kZXJlcigpOwotICAgICAgICAgICAgUmVuZGVy
T2JqZWN0ICplbmRSZW5kZXJlciA9IGVuZFBvcy5ub2RlKCktPnJlbmRlcmVyKCk7Ci0gICAgICAg
ICAgICBzdGF0aWNfY2FzdDxSZW5kZXJDYW52YXMqPihtX3JlbmRlciktPnNldFNlbGVjdGlvbihz
dGFydFJlbmRlcmVyLCBzdGFydFBvcy5vZmZzZXQoKSwgZW5kUmVuZGVyZXIsIGVuZFBvcy5vZmZz
ZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gc2VuZCB0aGUgQVhTZWxlY3Rl
ZFRleHRDaGFuZ2VkIG5vdGlmaWNhdGlvbiBvbmx5IGlmIHRoZSBuZXcgc2VsZWN0aW9uIGlzIG5v
bi1udWxsLAotICAgIC8vIGJlY2F1c2UgbnVsbCBzZWxlY3Rpb25zIGFyZSBvbmx5IHRyYW5zaXRv
cnkgKGUuZy4gd2hlbiBzdGFydGluZyBhbiBFZGl0Q29tbWFuZCwgY3VycmVudGx5KQotICAgIGlm
IChLV1FBY2NPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSAmJiBzLnN0YXJ0KCku
aXNOb3ROdWxsKCkgJiYgcy5lbmQoKS5pc05vdE51bGwoKSkgewotICAgICAgICBnZXRBY2NPYmpl
Y3RDYWNoZSgpLT5wb3N0Tm90aWZpY2F0aW9uVG9Ub3BXZWJBcmVhKHJlbmRlcmVyKCksICJBWFNl
bGVjdGVkVGV4dENoYW5nZWQiKTsKLSAgICB9Ci0KLX0KLQotVG9rZW5pemVyICpEb2N1bWVudElt
cGw6OmNyZWF0ZVRva2VuaXplcigpCi17Ci0gICAgcmV0dXJuIG5ld1hNTFRva2VuaXplcih0aGlz
LCBtX3ZpZXcpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0UGFpbnREZXZpY2UoIFFQYWlu
dERldmljZSAqZGV2ICkKLXsKLSAgICBpZiAobV9wYWludERldmljZSA9PSBkZXYpIHsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BhaW50RGV2aWNlID0gZGV2OwotICAgIGRlbGV0ZSBt
X3BhaW50RGV2aWNlTWV0cmljczsKLSAgICBtX3BhaW50RGV2aWNlTWV0cmljcyA9IGRldiA/IG5l
dyBRUGFpbnREZXZpY2VNZXRyaWNzKCBkZXYgKSA6IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBs
OjpvcGVuKCAgKQotewotICAgIGlmIChwYXJzaW5nKCkpIHJldHVybjsKLQotICAgIGltcGxpY2l0
T3BlbigpOwotCi0gICAgaWYgKGZyYW1lKCkpIHsKLSAgICAgICAgZnJhbWUoKS0+ZGlkRXhwbGlj
aXRPcGVuKCk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyB3b3JrIHRoYXQgd2Ugc2hvdWxkIHBy
b2JhYmx5IGRvIGluIGNsZWFyKCksIGJ1dCB3ZSBjYW4ndCBoYXZlIGl0Ci0gICAgLy8gaGFwcGVu
IHdoZW4gaW1wbGljaXRPcGVuKCkgaXMgY2FsbGVkIHVubGVzcyB3ZSByZW9yZ2FuaXplIEZyYW1l
IGNvZGUuCi0gICAgc2V0VVJMKFFTdHJpbmcoKSk7Ci0gICAgRG9jdW1lbnRJbXBsICpwYXJlbnQg
PSBwYXJlbnREb2N1bWVudCgpOwotICAgIGlmIChwYXJlbnQpIHsKLSAgICAgICAgc2V0QmFzZVVS
TChwYXJlbnQtPmJhc2VVUkwoKSk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6aW1w
bGljaXRPcGVuKCkKLXsKLSAgICBpZiAobV90b2tlbml6ZXIpCi0gICAgICAgIGNsb3NlKCk7Ci0K
LSAgICBjbGVhcigpOwotICAgIG1fdG9rZW5pemVyID0gY3JlYXRlVG9rZW5pemVyKCk7Ci0gICAg
Y29ubmVjdChtX3Rva2VuaXplcixTSUdOQUwoZmluaXNoZWRQYXJzaW5nKCkpLHRoaXMsU0lHTkFM
KGZpbmlzaGVkUGFyc2luZygpKSk7Ci0gICAgc2V0UGFyc2luZyh0cnVlKTsKLX0KLQotSFRNTEVs
ZW1lbnRJbXBsKiBEb2N1bWVudEltcGw6OmJvZHkoKQotewotICAgIE5vZGVJbXBsICpkZSA9IGRv
Y3VtZW50RWxlbWVudCgpOwotICAgIGlmICghZGUpCi0gICAgICAgIHJldHVybiAwOwotICAgIAot
ICAgIC8vIHRyeSB0byBwcmVmZXIgYSBGUkFNRVNFVCBlbGVtZW50IG92ZXIgQk9EWQotICAgIE5v
ZGVJbXBsKiBib2R5ID0gMDsKLSAgICBmb3IgKE5vZGVJbXBsKiBpID0gZGUtPmZpcnN0Q2hpbGQo
KTsgaTsgaSA9IGktPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUo
ZnJhbWVzZXRUYWcpKQotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhUTUxFbGVtZW50
SW1wbCo+KGkpOwotICAgICAgICAKLSAgICAgICAgaWYgKGktPmhhc1RhZ05hbWUoYm9keVRhZykp
Ci0gICAgICAgICAgICBib2R5ID0gaTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PEhU
TUxFbGVtZW50SW1wbCAqPihib2R5KTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmNsb3NlKCkK
LXsKLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+ZW5kSWZOb3RMb2FkaW5nKCk7
Ci0gICAgaW1wbGljaXRDbG9zZSgpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6aW1wbGljaXRD
bG9zZSgpCi17Ci0gICAgLy8gSWYgd2UncmUgaW4gdGhlIG1pZGRsZSBvZiByZWNhbGNTdHlsZSwg
d2UgbmVlZCB0byBkZWZlciB0aGUgY2xvc2UgdW50aWwgdGhlIHN0eWxlIGluZm9ybWF0aW9uIGlz
IGFjY3VyYXRlIGFuZCBhbGwgZWxlbWVudHMgYXJlIHJlLWF0dGFjaGVkLgotICAgIGlmIChtX2lu
U3R5bGVSZWNhbGMpIHsKLSAgICAgICAgbV9jbG9zZUFmdGVyU3R5bGVSZWNhbGMgPSB0cnVlOwot
ICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCB3YXNMb2NhdGlvbkNoYW5nZVBlbmRp
bmcgPSBmcmFtZSgpICYmIGZyYW1lKCktPmlzU2NoZWR1bGVkTG9jYXRpb25DaGFuZ2VQZW5kaW5n
KCk7Ci0gICAgYm9vbCBkb2xvYWQgPSAhcGFyc2luZygpICYmIG1fdG9rZW5pemVyICYmICFtX3By
b2Nlc3NpbmdMb2FkRXZlbnQgJiYgIXdhc0xvY2F0aW9uQ2hhbmdlUGVuZGluZzsKLSAgICAKLSAg
ICBpZiAoIWRvbG9hZCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgbV9wcm9jZXNzaW5nTG9hZEV2
ZW50ID0gdHJ1ZTsKLQotICAgIC8vIFdlIGhhdmUgdG8gY2xlYXIgdGhlIHRva2VuaXplciwgaW4g
Y2FzZSBzb21lb25lIGRvY3VtZW50LndyaXRlKClzIGZyb20gdGhlCi0gICAgLy8gb25Mb2FkIGV2
ZW50IGhhbmRsZXIsIGFzIGluIFJhZGFyIDMyMDY1MjQuCi0gICAgZGVsZXRlIG1fdG9rZW5pemVy
OwotICAgIG1fdG9rZW5pemVyID0gMDsKLQotICAgIC8vIENyZWF0ZSBhIGJvZHkgZWxlbWVudCBp
ZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgb25lLgotICAgIC8vIEluIHRoZSBjYXNlIG9mIFJhZGFy
IDM3NTg3ODUsIHRoZSB3aW5kb3cub25sb2FkIHdhcyBzZXQgaW4gc29tZSBqYXZhc2NyaXB0LCBi
dXQgbmV2ZXIgZmlyZWQgYmVjYXVzZSB0aGVyZSB3YXMgbm8gYm9keS4gIAotICAgIC8vIFRoaXMg
YmVoYXZpb3Igbm93IG1hdGNoZXMgRmlyZWZveCBhbmQgSUUuCi0gICAgSFRNTEVsZW1lbnRJbXBs
ICpib2R5ID0gdGhpcy0+Ym9keSgpOwotICAgIGlmICghYm9keSAmJiBpc0hUTUxEb2N1bWVudCgp
KSB7Ci0gICAgICAgIE5vZGVJbXBsICpkZSA9IGRvY3VtZW50RWxlbWVudCgpOwotICAgICAgICBp
ZiAoZGUpIHsKLSAgICAgICAgICAgIGJvZHkgPSBuZXcgSFRNTEJvZHlFbGVtZW50SW1wbCh0aGlz
KTsKLSAgICAgICAgICAgIGludCBleGNlcHRpb25Db2RlID0gMDsKLSAgICAgICAgICAgIGRlLT5h
cHBlbmRDaGlsZChib2R5LCBleGNlcHRpb25Db2RlKTsKLSAgICAgICAgICAgIGlmIChleGNlcHRp
b25Db2RlICE9IDApCi0gICAgICAgICAgICAgICAgYm9keSA9IDA7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgCi0gICAgTm9kZUltcGwgKm9ubG9hZFRhcmdldCA9IGJvZHk7Ci0gICAgaWYgKCFpc0hU
TUxEb2N1bWVudCgpKQotICAgICAgICBvbmxvYWRUYXJnZXQgPSBkb2N1bWVudEVsZW1lbnQoKTsK
LQotICAgIGlmIChvbmxvYWRUYXJnZXQpIHsKLSAgICAgICAgZGlzcGF0Y2hJbWFnZUxvYWRFdmVu
dHNOb3coKTsKLSAgICAgICAgb25sb2FkVGFyZ2V0LT5kaXNwYXRjaFdpbmRvd0V2ZW50KGxvYWRF
dmVudCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKEZyYW1lICpwID0gZnJhbWUoKSkKLSAg
ICAgICAgICAgIE1hYyhwKS0+aGFuZGxlZE9ubG9hZEV2ZW50cygpOwotI2lmZGVmIElOU1RSVU1F
TlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAg
ICAgICAgIHByaW50Zigib25sb2FkIGZpcmVkIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNl
bmRpZgotICAgIH0KLQotICAgIG1fcHJvY2Vzc2luZ0xvYWRFdmVudCA9IGZhbHNlOwotCi0gICAg
Ly8gTWFrZSBzdXJlIGJvdGggdGhlIGluaXRpYWwgbGF5b3V0IGFuZCByZWZsb3cgaGFwcGVuIGFm
dGVyIHRoZSBvbmxvYWQKLSAgICAvLyBmaXJlcy4gVGhpcyB3aWxsIGltcHJvdmUgb25sb2FkIHNj
b3JlcywgYW5kIG90aGVyIGJyb3dzZXJzIGRvIGl0LgotICAgIC8vIElmIHRoZXkgd2FubmEgY2hl
YXQsIHdlIGNhbiB0b28uIC1kd2gKLQotICAgIGlmIChmcmFtZSgpICYmIGZyYW1lKCktPmlzU2No
ZWR1bGVkTG9jYXRpb25DaGFuZ2VQZW5kaW5nKCkgJiYgbV9zdGFydFRpbWUuZWxhcHNlZCgpIDwg
Y0xheW91dFNjaGVkdWxlVGhyZXNob2xkKSB7Ci0gICAgICAgIC8vIEp1c3QgYmFpbCBvdXQuIEJl
Zm9yZSBvciBkdXJpbmcgdGhlIG9ubG9hZCB3ZSB3ZXJlIHNoaWZ0ZWQgdG8gYW5vdGhlciBwYWdl
LgotICAgICAgICAvLyBUaGUgb2xkIGktQmVuY2ggc3VpdGUgZG9lcyB0aGlzLiBXaGVuIHRoaXMg
aGFwcGVucyBkb24ndCBib3RoZXIgcGFpbnRpbmcgb3IgbGF5aW5nIG91dC4gICAgICAgIAotICAg
ICAgICB2aWV3KCktPnVuc2NoZWR1bGVSZWxheW91dCgpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgaWYgKGZyYW1lKCkpCi0gICAgICAgIGZyYW1lKCktPmNoZWNrRW1pdExvYWRFdmVu
dCgpOwotCi0gICAgLy8gTm93IGRvIG91ciBwYWludGluZy9sYXlvdXQsIGJ1dCBvbmx5IGlmIHdl
IGFyZW4ndCBpbiBhIHN1YmZyYW1lIG9yIGlmIHdlJ3JlIGluIGEgc3ViZnJhbWUKLSAgICAvLyB0
aGF0IGhhcyBiZWVuIHNpemVkIGFscmVhZHkuICBPdGhlcndpc2UsIG91ciB2aWV3IHNpemUgd291
bGQgYmUgaW5jb3JyZWN0LCBzbyBkb2luZyBhbnkgCi0gICAgLy8gbGF5b3V0L3BhaW50aW5nIG5v
dyB3b3VsZCBiZSBwb2ludGxlc3MuCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSB8fCAob3duZXJF
bGVtZW50KCktPnJlbmRlcmVyKCkgJiYgIW93bmVyRWxlbWVudCgpLT5yZW5kZXJlcigpLT5uZWVk
c0xheW91dCgpKSkgewotICAgICAgICB1cGRhdGVSZW5kZXJpbmcoKTsKLSAgICAgICAgCi0gICAg
ICAgIC8vIEFsd2F5cyBkbyBhIGxheW91dCBhZnRlciBsb2FkaW5nIGlmIG5lZWRlZC4KLSAgICAg
ICAgaWYgKHZpZXcoKSAmJiByZW5kZXJlcigpICYmICghcmVuZGVyZXIoKS0+Zmlyc3RDaGlsZCgp
IHx8IHJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKQotICAgICAgICAgICAgdmlldygpLT5sYXlv
dXQoKTsKLSAgICB9Ci0gICAgaWYgKHJlbmRlcmVyKCkgJiYgS1dRQWNjT2JqZWN0Q2FjaGU6OmFj
Y2Vzc2liaWxpdHlFbmFibGVkKCkpCi0gICAgICAgIGdldEFjY09iamVjdENhY2hlKCktPnBvc3RO
b3RpZmljYXRpb24ocmVuZGVyZXIoKSwgIkFYTG9hZENvbXBsZXRlIik7Ci19Ci0KLXZvaWQgRG9j
dW1lbnRJbXBsOjpzZXRQYXJzaW5nKGJvb2wgYikKLXsKLSAgICBtX2JQYXJzaW5nID0gYjsKLSAg
ICBpZiAoIW1fYlBhcnNpbmcgJiYgdmlldygpKQotICAgICAgICB2aWV3KCktPnNjaGVkdWxlUmVs
YXlvdXQoKTsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAo
IW93bmVyRWxlbWVudCgpICYmICFtX2JQYXJzaW5nKQotICAgICAgICBwcmludGYoIlBhcnNpbmcg
ZmluaXNoZWQgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi19Ci0KLWJvb2wgRG9j
dW1lbnRJbXBsOjpzaG91bGRTY2hlZHVsZUxheW91dCgpCi17Ci0gICAgLy8gV2UgY2FuIHVwZGF0
ZSBsYXlvdXQgaWY6Ci0gICAgLy8gKGEpIHdlIGFjdHVhbGx5IG5lZWQgYSBsYXlvdXQKLSAgICAv
LyAoYikgb3VyIHN0eWxlc2hlZXRzIGFyZSBhbGwgbG9hZGVkCi0gICAgLy8gKGMpIHdlIGhhdmUg
YSA8Ym9keT4KLSAgICByZXR1cm4gKHJlbmRlcmVyKCkgJiYgcmVuZGVyZXIoKS0+bmVlZHNMYXlv
dXQoKSAmJiBoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSAmJgotICAgICAgICAgICAgZG9jdW1lbnRF
bGVtZW50KCkgJiYgZG9jdW1lbnRFbGVtZW50KCktPnJlbmRlcmVyKCkgJiYKLSAgICAgICAgICAg
ICghZG9jdW1lbnRFbGVtZW50KCktPmhhc1RhZ05hbWUoaHRtbFRhZykgfHwgYm9keSgpKSk7Ci19
Ci0KLWludCBEb2N1bWVudEltcGw6Om1pbmltdW1MYXlvdXREZWxheSgpCi17Ci0gICAgaWYgKG1f
b3Zlck1pbmltdW1MYXlvdXRUaHJlc2hvbGQpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAg
IGludCBlbGFwc2VkID0gbV9zdGFydFRpbWUuZWxhcHNlZCgpOwotICAgIG1fb3Zlck1pbmltdW1M
YXlvdXRUaHJlc2hvbGQgPSBlbGFwc2VkID4gY0xheW91dFNjaGVkdWxlVGhyZXNob2xkOwotICAg
IAotICAgIC8vIFdlJ2xsIHdhbnQgdG8gc2NoZWR1bGUgdGhlIHRpbWVyIHRvIGZpcmUgYXQgdGhl
IG1pbmltdW0gbGF5b3V0IHRocmVzaG9sZC4KLSAgICByZXR1cm4ga01heCgwLCBjTGF5b3V0U2No
ZWR1bGVUaHJlc2hvbGQgLSBlbGFwc2VkKTsKLX0KLQotaW50IERvY3VtZW50SW1wbDo6ZWxhcHNl
ZFRpbWUoKSBjb25zdAotewotICAgIHJldHVybiBtX3N0YXJ0VGltZS5lbGFwc2VkKCk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjp3cml0ZSggY29uc3QgRE9NU3RyaW5nICZ0ZXh0ICkKLXsKLSAg
ICB3cml0ZSh0ZXh0LnFzdHJpbmcoKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp3cml0ZSgg
Y29uc3QgUVN0cmluZyAmdGV4dCApCi17Ci0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURV
TElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHByaW50ZigiQmVnaW5uaW5n
IGEgZG9jdW1lbnQud3JpdGUgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi0gICAg
Ci0gICAgaWYgKCFtX3Rva2VuaXplcikgewotICAgICAgICBvcGVuKCk7Ci0gICAgICAgIGFzc2Vy
dChtX3Rva2VuaXplcik7Ci0gICAgICAgIHdyaXRlKFFTdHJpbmcoIjxodG1sPiIpKTsKLSAgICB9
Ci0gICAgbV90b2tlbml6ZXItPndyaXRlKHRleHQsIGZhbHNlKTsKLSAgICAKLSNpZmRlZiBJTlNU
UlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAg
ICAgcHJpbnRmKCJFbmRpbmcgYSBkb2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUo
KSk7Ci0jZW5kaWYgICAgCi19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp3cml0ZWxuKCBjb25zdCBE
T01TdHJpbmcgJnRleHQgKQotewotICAgIHdyaXRlKHRleHQpOwotICAgIHdyaXRlKERPTVN0cmlu
ZygiXG4iKSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpmaW5pc2hQYXJzaW5nKCkKLXsKLSNp
ZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQo
KSkKLSAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhbGwgZGF0YSBhdCAlZFxuIiwgZWxhcHNlZFRp
bWUoKSk7Ci0jZW5kaWYKLSAgICAKLSAgICAvLyBMZXQgdGhlIHRva2VuaXplciBnbyB0aHJvdWdo
IGFzIG11Y2ggZGF0YSBhcyBpdCBjYW4uICBUaGVyZSB3aWxsIGJlIHRocmVlIHBvc3NpYmxlIG91
dGNvbWVzIGFmdGVyCi0gICAgLy8gZmluaXNoKCkgaXMgY2FsbGVkOgotICAgIC8vICgxKSBBbGwg
cmVtYWluaW5nIGRhdGEgaXMgcGFyc2VkLCBkb2N1bWVudCBpc24ndCBsb2FkZWQgeWV0Ci0gICAg
Ly8gKDIpIEFsbCByZW1haW5pbmcgZGF0YSBpcyBwYXJzZWQsIGRvY3VtZW50IGlzIGxvYWRlZCwg
dG9rZW5pemVyIGdldHMgZGVsZXRlZAotICAgIC8vICgzKSBEYXRhIGlzIHN0aWxsIHJlbWFpbmlu
ZyB0byBiZSBwYXJzZWQuCi0gICAgaWYgKG1fdG9rZW5pemVyKQotICAgICAgICBtX3Rva2VuaXpl
ci0+ZmluaXNoKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpjbGVhcigpCi17Ci0gICAgZGVs
ZXRlIG1fdG9rZW5pemVyOwotICAgIG1fdG9rZW5pemVyID0gMDsKLQotICAgIHJlbW92ZUNoaWxk
cmVuKCk7Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQo
bV93aW5kb3dFdmVudExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTspCi0gICAg
ICAgIG1fd2luZG93RXZlbnRMaXN0ZW5lcnMucmVtb3ZlUmVmKGl0LmN1cnJlbnQoKSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRVUkwoY29uc3QgUVN0cmluZyYgdXJsKQotewotICAgIG1f
dXJsID0gdXJsOwotICAgIGlmIChtX3N0eWxlU2VsZWN0b3IpCi0gICAgICAgIG1fc3R5bGVTZWxl
Y3Rvci0+c2V0RW5jb2RlZFVSTChtX3VybCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRT
dHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBET01TdHJpbmcgJnNoZWV0KQot
ewotLy8gICAga2REZWJ1ZyggNjAzMCApIDw8ICJIVE1MRG9jdW1lbnQ6OnNldFN0eWxlU2hlZXQo
KSIgPDwgZW5kbDsKLSAgICBtX3NoZWV0ID0gbmV3IENTU1N0eWxlU2hlZXRJbXBsKHRoaXMsIHVy
bCk7Ci0gICAgbV9zaGVldC0+cmVmKCk7Ci0gICAgbV9zaGVldC0+cGFyc2VTdHJpbmcoc2hlZXQp
OwotICAgIG1fbG9hZGluZ1NoZWV0ID0gZmFsc2U7Ci0KLSAgICB1cGRhdGVTdHlsZVNlbGVjdG9y
KCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRVc2VyU3R5bGVTaGVldCggY29uc3QgUVN0
cmluZyYgc2hlZXQgKQotewotICAgIGlmICggbV91c2Vyc2hlZXQgIT0gc2hlZXQgKSB7Ci0gICAg
ICAgIG1fdXNlcnNoZWV0ID0gc2hlZXQ7Ci0JdXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICAgIH0K
LX0KLQotQ1NTU3R5bGVTaGVldEltcGwqIERvY3VtZW50SW1wbDo6ZWxlbWVudFNoZWV0KCkKLXsK
LSAgICBpZiAoIW1fZWxlbVNoZWV0KSB7Ci0gICAgICAgIG1fZWxlbVNoZWV0ID0gbmV3IENTU1N0
eWxlU2hlZXRJbXBsKHRoaXMsIGJhc2VVUkwoKSApOwotICAgICAgICBtX2VsZW1TaGVldC0+cmVm
KCk7Ci0gICAgfQotICAgIHJldHVybiBtX2VsZW1TaGVldDsKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OmRldGVybWluZVBhcnNlTW9kZSggY29uc3QgUVN0cmluZyAmLypzdHIqLyApCi17Ci0gICAg
Ly8gRm9yIFhNTCBkb2N1bWVudHMgdXNlIHN0cmljdCBwYXJzZSBtb2RlLiAgSFRNTCBkb2NzIHdp
bGwgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAvLyBkZXRlcm1pbmUgdGhlaXIgcGFyc2Ug
bW9kZS4KLSAgICBwTW9kZSA9IFN0cmljdDsKLSAgICBoTW9kZSA9IFhIdG1sOwotICAgIGtkRGVi
dWcoNjAyMCkgPDwgIiB1c2luZyBzdHJpY3QgcGFyc2VNb2RlIiA8PCBlbmRsOwotfQotCi1Ob2Rl
SW1wbCAqRG9jdW1lbnRJbXBsOjpuZXh0Rm9jdXNOb2RlKE5vZGVJbXBsICpmcm9tTm9kZSkKLXsK
LSAgICB1bnNpZ25lZCBzaG9ydCBmcm9tVGFiSW5kZXg7Ci0KLSAgICBpZiAoIWZyb21Ob2RlKSB7
Ci0JLy8gTm8gc3RhcnRpbmcgbm9kZSBzdXBwbGllZDsgYmVnaW4gd2l0aCB0aGUgdG9wIG9mIHRo
ZSBkb2N1bWVudAotCU5vZGVJbXBsICpuOwotCi0JaW50IGxvd2VzdFRhYkluZGV4ID0gNjU1MzU7
Ci0JZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0J
ICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkpIHsKLQkJaWYgKChuLT50YWJJbmRleCgp
ID4gMCkgJiYgKG4tPnRhYkluZGV4KCkgPCBsb3dlc3RUYWJJbmRleCkpCi0JCSAgICBsb3dlc3RU
YWJJbmRleCA9IG4tPnRhYkluZGV4KCk7Ci0JICAgIH0KLQl9Ci0KLQlpZiAobG93ZXN0VGFiSW5k
ZXggPT0gNjU1MzUpCi0JICAgIGxvd2VzdFRhYkluZGV4ID0gMDsKLQotCS8vIEdvIHRvIHRoZSBm
aXJzdCBub2RlIGluIHRoZSBkb2N1bWVudCB0aGF0IGhhcyB0aGUgZGVzaXJlZCB0YWIgaW5kZXgK
LQlmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkg
ICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBsb3dl
c3RUYWJJbmRleCkpCi0JCXJldHVybiBuOwotCX0KLQotCXJldHVybiAwOwotICAgIH0KLSAgICBl
bHNlIHsKLQlmcm9tVGFiSW5kZXggPSBmcm9tTm9kZS0+dGFiSW5kZXgoKTsKLSAgICB9Ci0KLSAg
ICBpZiAoZnJvbVRhYkluZGV4ID09IDApIHsKLQkvLyBKdXN0IG5lZWQgdG8gZmluZCB0aGUgbmV4
dCBzZWxlY3RhYmxlIG5vZGUgYWZ0ZXIgZnJvbU5vZGUgKGluIGRvY3VtZW50IG9yZGVyKSB0aGF0
IGRvZXNuJ3QgaGF2ZSBhIHRhYiBpbmRleAotCU5vZGVJbXBsICpuID0gZnJvbU5vZGUtPnRyYXZl
cnNlTmV4dE5vZGUoKTsKLQl3aGlsZSAobiAmJiAhKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAm
JiBuLT50YWJJbmRleCgpID09IDApKQotCSAgICBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpOwot
CXJldHVybiBuOwotICAgIH0KLSAgICBlbHNlIHsKLQkvLyBGaW5kIHRoZSBsb3dlc3QgdGFiIGlu
ZGV4IG91dCBvZiBhbGwgdGhlIG5vZGVzIGV4Y2VwdCBmcm9tTm9kZSwgdGhhdCBpcyBncmVhdGVy
IHRoYW4gb3IgZXF1YWwgdG8gZnJvbU5vZGUncwotCS8vIHRhYiBpbmRleC4gRm9yIG5vZGVzIHdp
dGggdGhlIHNhbWUgdGFiIGluZGV4IGFzIGZyb21Ob2RlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVk
IGluIHRob3NlIHRoYXQgY29tZSBhZnRlcgotCS8vIGZyb21Ob2RlIGluIGRvY3VtZW50IG9yZGVy
LgotCS8vIElmIHdlIGRvbid0IGZpbmQgYSBzdWl0YWJsZSB0YWIgaW5kZXgsIHRoZSBuZXh0IGZv
Y3VzIG5vZGUgd2lsbCBiZSBvbmUgd2l0aCBhIHRhYiBpbmRleCBvZiAwLgotCXVuc2lnbmVkIHNo
b3J0IGxvd2VzdFN1aXRhYmxlVGFiSW5kZXggPSA2NTUzNTsKLQlOb2RlSW1wbCAqbjsKLQotCWJv
b2wgcmVhY2hlZEZyb21Ob2RlID0gZmFsc2U7Ci0JZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0g
bi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0JICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxl
KCkgJiYKLQkJKChyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPj0gZnJvbVRhYklu
ZGV4KSkgfHwKLQkJICghcmVhY2hlZEZyb21Ob2RlICYmIChuLT50YWJJbmRleCgpID4gZnJvbVRh
YkluZGV4KSkpICYmCi0JCShuLT50YWJJbmRleCgpIDwgbG93ZXN0U3VpdGFibGVUYWJJbmRleCkg
JiYKLQkJKG4gIT0gZnJvbU5vZGUpKSB7Ci0KLQkJLy8gV2UgZm91bmQgYSBzZWxlY3RhYmxlIG5v
ZGUgd2l0aCBhIHRhYiBpbmRleCBhdCBsZWFzdCBhcyBoaWdoIGFzIGZyb21Ob2RlJ3MuIEtlZXAg
c2VhcmNoaW5nIHRob3VnaCwKLQkJLy8gYXMgdGhlcmUgbWF5IGJlIGFub3RoZXIgbm9kZSB3aGlj
aCBoYXMgYSBsb3dlciB0YWIgaW5kZXggYnV0IGlzIHN0aWxsIHN1aXRhYmxlIGZvciB1c2UuCi0J
CWxvd2VzdFN1aXRhYmxlVGFiSW5kZXggPSBuLT50YWJJbmRleCgpOwotCSAgICB9Ci0KLQkgICAg
aWYgKG4gPT0gZnJvbU5vZGUpCi0JCXJlYWNoZWRGcm9tTm9kZSA9IHRydWU7Ci0JfQotCi0JaWYg
KGxvd2VzdFN1aXRhYmxlVGFiSW5kZXggPT0gNjU1MzUpIHsKLQkgICAgLy8gTm8gbmV4dCBub2Rl
IHdpdGggYSB0YWIgaW5kZXggLT4ganVzdCB0YWtlIGZpcnN0IG5vZGUgd2l0aCB0YWIgaW5kZXgg
b2YgMAotCSAgICBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0JICAgIHdoaWxlIChuICYmICEobi0+aXNL
ZXlib2FyZEZvY3VzYWJsZSgpICYmIG4tPnRhYkluZGV4KCkgPT0gMCkpCi0JCW4gPSBuLT50cmF2
ZXJzZU5leHROb2RlKCk7Ci0JICAgIHJldHVybiBuOwotCX0KLQotCS8vIFNlYXJjaCBmb3J3YXJk
cyBmcm9tIGZyb21Ob2RlCi0JZm9yIChuID0gZnJvbU5vZGUtPnRyYXZlcnNlTmV4dE5vZGUoKTsg
biAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0JICAgIGlmIChuLT5pc0tleWJv
YXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gbG93ZXN0U3VpdGFibGVUYWJJbmRl
eCkpCi0JCXJldHVybiBuOwotCX0KLQotCS8vIFRoZSBuZXh0IG5vZGUgaXNuJ3QgYWZ0ZXIgZnJv
bU5vZGUsIHN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZG9jdW1lbnQKLQlmb3IgKG4g
PSB0aGlzOyBuICE9IGZyb21Ob2RlOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0JICAg
IGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gbG93ZXN0
U3VpdGFibGVUYWJJbmRleCkpCi0JCXJldHVybiBuOwotCX0KLQotCWFzc2VydChmYWxzZSk7IC8v
IHNob3VsZCBuZXZlciBnZXQgaGVyZQotCXJldHVybiAwOwotICAgIH0KLX0KLQotTm9kZUltcGwg
KkRvY3VtZW50SW1wbDo6cHJldmlvdXNGb2N1c05vZGUoTm9kZUltcGwgKmZyb21Ob2RlKQotewot
ICAgIE5vZGVJbXBsICpsYXN0Tm9kZSA9IHRoaXM7Ci0gICAgd2hpbGUgKGxhc3ROb2RlLT5sYXN0
Q2hpbGQoKSkKLQlsYXN0Tm9kZSA9IGxhc3ROb2RlLT5sYXN0Q2hpbGQoKTsKLQotICAgIGlmICgh
ZnJvbU5vZGUpIHsKLQkvLyBObyBzdGFydGluZyBub2RlIHN1cHBsaWVkOyBiZWdpbiB3aXRoIHRo
ZSB2ZXJ5IGxhc3Qgbm9kZSBpbiB0aGUgZG9jdW1lbnQKLQlOb2RlSW1wbCAqbjsKLQotCWludCBo
aWdoZXN0VGFiSW5kZXggPSAwOwotCWZvciAobiA9IGxhc3ROb2RlOyBuICE9IDA7IG4gPSBuLT50
cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxl
KCkpIHsKLQkJaWYgKG4tPnRhYkluZGV4KCkgPT0gMCkKLQkJICAgIHJldHVybiBuOwotCQllbHNl
IGlmIChuLT50YWJJbmRleCgpID4gaGlnaGVzdFRhYkluZGV4KQotCQkgICAgaGlnaGVzdFRhYklu
ZGV4ID0gbi0+dGFiSW5kZXgoKTsKLQkgICAgfQotCX0KLQotCS8vIE5vIG5vZGUgd2l0aCBhIHRh
YiBpbmRleCBvZiAwOyBqdXN0IGdvIHRvIHRoZSBsYXN0IG5vZGUgd2l0aCB0aGUgaGlnaGVzdCB0
YWIgaW5kZXgKLQlmb3IgKG4gPSBsYXN0Tm9kZTsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VQcmV2
aW91c05vZGUoKSkgewotCSAgICBpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIChuLT50
YWJJbmRleCgpID09IGhpZ2hlc3RUYWJJbmRleCkpCi0JCXJldHVybiBuOwotCX0KLQotCXJldHVy
biAwOwotICAgIH0KLSAgICBlbHNlIHsKLQl1bnNpZ25lZCBzaG9ydCBmcm9tVGFiSW5kZXggPSBm
cm9tTm9kZS0+dGFiSW5kZXgoKTsKLQotCWlmIChmcm9tVGFiSW5kZXggPT0gMCkgewotCSAgICAv
LyBGaW5kIHRoZSBwcmV2aW91cyBzZWxlY3RhYmxlIG5vZGUgYmVmb3JlIGZyb21Ob2RlIChpbiBk
b2N1bWVudCBvcmRlcikgdGhhdCBkb2Vzbid0IGhhdmUgYSB0YWIgaW5kZXgKLQkgICAgTm9kZUlt
cGwgKm4gPSBmcm9tTm9kZS0+dHJhdmVyc2VQcmV2aW91c05vZGUoKTsKLQkgICAgd2hpbGUgKG4g
JiYgIShuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgbi0+dGFiSW5kZXgoKSA9PSAwKSkKLQkJ
biA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCk7Ci0JICAgIGlmIChuKQotCQlyZXR1cm4gbjsK
LQotCSAgICAvLyBObyBwcmV2aW91cyBub2RlcyB3aXRoIGEgMCB0YWIgaW5kZXgsIGdvIHRvIHRo
ZSBsYXN0IG5vZGUgaW4gdGhlIGRvY3VtZW50IHRoYXQgaGFzIHRoZSBoaWdoZXN0IHRhYiBpbmRl
eAotCSAgICBpbnQgaGlnaGVzdFRhYkluZGV4ID0gMDsKLQkgICAgZm9yIChuID0gdGhpczsgbiAh
PSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJkRm9j
dXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPiBoaWdoZXN0VGFiSW5kZXgpKQotCQkgICAgaGln
aGVzdFRhYkluZGV4ID0gbi0+dGFiSW5kZXgoKTsKLQkgICAgfQotCi0JICAgIGlmIChoaWdoZXN0
VGFiSW5kZXggPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkgICAgZm9yIChuID0gbGFzdE5vZGU7IG4g
IT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpIHsKLQkJaWYgKG4tPmlzS2V5Ym9h
cmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBoaWdoZXN0VGFiSW5kZXgpKQotCQkg
ICAgcmV0dXJuIG47Ci0JICAgIH0KLQotCSAgICBhc3NlcnQoZmFsc2UpOyAvLyBzaG91bGQgbmV2
ZXIgZ2V0IGhlcmUKLQkgICAgcmV0dXJuIDA7Ci0JfQotCWVsc2UgewotCSAgICAvLyBGaW5kIHRo
ZSBsb3dlc3QgdGFiIGluZGV4IG91dCBvZiBhbGwgdGhlIG5vZGVzIGV4Y2VwdCBmcm9tTm9kZSwg
dGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZnJvbU5vZGUncwotCSAgICAvLyB0YWIgaW5k
ZXguIEZvciBub2RlcyB3aXRoIHRoZSBzYW1lIHRhYiBpbmRleCBhcyBmcm9tTm9kZSwgd2UgYXJl
IG9ubHkgaW50ZXJlc3RlZCBpbiB0aG9zZSBiZWZvcmUKLQkgICAgLy8gZnJvbU5vZGUuCi0JICAg
IC8vIElmIHdlIGRvbid0IGZpbmQgYSBzdWl0YWJsZSB0YWIgaW5kZXgsIHRoZW4gdGhlcmUgd2ls
bCBiZSBubyBwcmV2aW91cyBmb2N1cyBub2RlLgotCSAgICB1bnNpZ25lZCBzaG9ydCBoaWdoZXN0
U3VpdGFibGVUYWJJbmRleCA9IDA7Ci0JICAgIE5vZGVJbXBsICpuOwotCi0JICAgIGJvb2wgcmVh
Y2hlZEZyb21Ob2RlID0gZmFsc2U7Ci0JICAgIGZvciAobiA9IHRoaXM7IG4gIT0gMDsgbiA9IG4t
PnRyYXZlcnNlTmV4dE5vZGUoKSkgewotCQlpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYm
Ci0JCSAgICAoKCFyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPD0gZnJvbVRhYklu
ZGV4KSkgfHwKLQkJICAgICAocmVhY2hlZEZyb21Ob2RlICYmIChuLT50YWJJbmRleCgpIDwgZnJv
bVRhYkluZGV4KSkpICAmJgotCQkgICAgKG4tPnRhYkluZGV4KCkgPiBoaWdoZXN0U3VpdGFibGVU
YWJJbmRleCkgJiYKLQkJICAgIChuICE9IGZyb21Ob2RlKSkgewotCi0JCSAgICAvLyBXZSBmb3Vu
ZCBhIHNlbGVjdGFibGUgbm9kZSB3aXRoIGEgdGFiIGluZGV4IG5vIGhpZ2hlciB0aGFuIGZyb21O
b2RlJ3MuIEtlZXAgc2VhcmNoaW5nIHRob3VnaCwgYXMKLQkJICAgIC8vIHRoZXJlIG1heSBiZSBh
bm90aGVyIG5vZGUgd2hpY2ggaGFzIGEgaGlnaGVyIHRhYiBpbmRleCBidXQgaXMgc3RpbGwgc3Vp
dGFibGUgZm9yIHVzZS4KLQkJICAgIGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4ID0gbi0+dGFiSW5k
ZXgoKTsKLQkJfQotCi0JCWlmIChuID09IGZyb21Ob2RlKQotCQkgICAgcmVhY2hlZEZyb21Ob2Rl
ID0gdHJ1ZTsKLQkgICAgfQotCi0JICAgIGlmIChoaWdoZXN0U3VpdGFibGVUYWJJbmRleCA9PSAw
KSB7Ci0JCS8vIE5vIHByZXZpb3VzIG5vZGUgd2l0aCBhIHRhYiBpbmRleC4gU2luY2UgdGhlIG9y
ZGVyIHNwZWNpZmllZCBieSBIVE1MIGlzIG5vZGVzIHdpdGggdGFiIGluZGV4ID4gMAotCQkvLyBm
aXJzdCwgdGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHByZXZpb3VzIG5vZGUuCi0JCXJldHVy
biAwOwotCSAgICB9Ci0KLQkgICAgLy8gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGZyb21Ob2RlCi0J
ICAgIGZvciAobiA9IGZyb21Ob2RlLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpOyBuICE9IDA7IG4g
PSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJkRm9jdXNh
YmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gaGlnaGVzdFN1aXRhYmxlVGFiSW5kZXgpKQotCQkg
ICAgcmV0dXJuIG47Ci0JICAgIH0KLQkgICAgLy8gVGhlIHByZXZpb3VzIG5vZGUgaXNuJ3QgYmVm
b3JlIGZyb21Ob2RlLCBzdGFydCBmcm9tIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50Ci0JICAgIGZv
ciAobiA9IGxhc3ROb2RlOyBuICE9IGZyb21Ob2RlOyBuID0gbi0+dHJhdmVyc2VQcmV2aW91c05v
ZGUoKSkgewotCQlpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIChuLT50YWJJbmRleCgp
ID09IGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4KSkKLQkJICAgIHJldHVybiBuOwotCSAgICB9Ci0K
LQkgICAgYXNzZXJ0KGZhbHNlKTsgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JICAgIHJldHVy
biAwOwotCX0KLSAgICB9Ci19Ci0KLWludCBEb2N1bWVudEltcGw6Om5vZGVBYnNJbmRleChOb2Rl
SW1wbCAqbm9kZSkKLXsKLSAgICBhc3NlcnQobm9kZS0+Z2V0RG9jdW1lbnQoKSA9PSB0aGlzKTsK
LQotICAgIGludCBhYnNJbmRleCA9IDA7Ci0gICAgZm9yIChOb2RlSW1wbCAqbiA9IG5vZGU7IG4g
JiYgbiAhPSB0aGlzOyBuID0gbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkKLQlhYnNJbmRleCsr
OwotICAgIHJldHVybiBhYnNJbmRleDsKLX0KLQotTm9kZUltcGwgKkRvY3VtZW50SW1wbDo6bm9k
ZVdpdGhBYnNJbmRleChpbnQgYWJzSW5kZXgpCi17Ci0gICAgTm9kZUltcGwgKm4gPSB0aGlzOwot
ICAgIGZvciAoaW50IGkgPSAwOyBuICYmIChpIDwgYWJzSW5kZXgpOyBpKyspIHsKLQluID0gbi0+
dHJhdmVyc2VOZXh0Tm9kZSgpOwotICAgIH0KLSAgICByZXR1cm4gbjsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnByb2Nlc3NIdHRwRXF1aXYoY29uc3QgRE9NU3RyaW5nICZlcXVpdiwgY29uc3Qg
RE9NU3RyaW5nICZjb250ZW50KQotewotICAgIGFzc2VydCghZXF1aXYuaXNOdWxsKCkgJiYgIWNv
bnRlbnQuaXNOdWxsKCkpOwotCi0gICAgRnJhbWUgKmZyYW1lID0gdGhpcy0+ZnJhbWUoKTsKLQot
ICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImRlZmF1bHQtc3R5bGUiKSkgewotICAg
ICAgICAvLyBUaGUgcHJlZmVycmVkIHN0eWxlIHNldCBoYXMgYmVlbiBvdmVycmlkZGVuIGFzIHBl
ciBzZWN0aW9uIAotICAgICAgICAvLyAxNC4zLjIgb2YgdGhlIEhUTUw0LjAgc3BlY2lmaWNhdGlv
bi4gIFdlIG5lZWQgdG8gdXBkYXRlIHRoZQotICAgICAgICAvLyBzaGVldCB1c2VkIHZhcmlhYmxl
IGFuZCB0aGVuIHVwZGF0ZSBvdXIgc3R5bGUgc2VsZWN0b3IuIAotICAgICAgICAvLyBGb3IgbW9y
ZSBpbmZvLCBzZWUgdGhlIHRlc3QgYXQ6Ci0gICAgICAgIC8vIGh0dHA6Ly93d3cuaGl4aWUuY2gv
dGVzdHMvZXZpbC9jc3MvaW1wb3J0L21haW4vcHJlZmVycmVkLmh0bWwKLSAgICAgICAgLy8gLWR3
aAotICAgICAgICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0gICAgICAgIG1f
cHJlZmVycmVkU3R5bGVzaGVldFNldCA9IGNvbnRlbnQ7Ci0gICAgICAgIHVwZGF0ZVN0eWxlU2Vs
ZWN0b3IoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJy
ZWZyZXNoIikgJiYgZnJhbWUtPm1ldGFSZWZyZXNoRW5hYmxlZCgpKQotICAgIHsKLSAgICAgICAg
Ly8gZ2V0IGRlbGF5IGFuZCB1cmwKLSAgICAgICAgUVN0cmluZyBzdHIgPSBjb250ZW50LnFzdHJp
bmcoKS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgaW50IHBvcyA9IHN0ci5maW5kKFFSZWdF
eHAoIls7LF0iKSk7Ci0gICAgICAgIGlmICggcG9zID09IC0xICkKLSAgICAgICAgICAgIHBvcyA9
IHN0ci5maW5kKFFSZWdFeHAoIlsgXHRdIikpOwotCi0gICAgICAgIGlmIChwb3MgPT0gLTEpIC8v
IFRoZXJlIGNhbiBiZSBubyB1cmwgKERhdmlkKQotICAgICAgICB7Ci0gICAgICAgICAgICBib29s
IG9rID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQgZGVsYXkgPSAwOwotCSAgICBkZWxheSA9IHN0
ci50b0ludCgmb2spOwotCSAgICAvLyBXZSB3YW50IGEgbmV3IGhpc3RvcnkgaXRlbSBpZiB0aGUg
cmVmcmVzaCB0aW1lb3V0ID4gMSBzZWNvbmQKLQkgICAgaWYob2sgJiYgZnJhbWUpIGZyYW1lLT5z
Y2hlZHVsZVJlZGlyZWN0aW9uKGRlbGF5LCBmcmFtZS0+dXJsKCkudXJsKCksIGRlbGF5IDw9IDEp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG91YmxlIGRlbGF5ID0gMDsKLSAgICAg
ICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKLQkgICAgZGVsYXkgPSBzdHIubGVmdChwb3MpLnN0cmlw
V2hpdGVTcGFjZSgpLnRvRG91YmxlKCZvayk7Ci0KLSAgICAgICAgICAgIHBvcysrOwotICAgICAg
ICAgICAgd2hpbGUocG9zIDwgKGludClzdHIubGVuZ3RoKCkgJiYgc3RyW3Bvc10uaXNTcGFjZSgp
KSBwb3MrKzsKLSAgICAgICAgICAgIHN0ciA9IHN0ci5taWQocG9zKTsKLSAgICAgICAgICAgIGlm
IChzdHIuZmluZCgidXJsIiwgMCwgIGZhbHNlICkgPT0gMCkKLSAgICAgICAgICAgICAgICBzdHIg
PSBzdHIubWlkKDMpOwotICAgICAgICAgICAgc3RyID0gc3RyLnN0cmlwV2hpdGVTcGFjZSgpOwot
ICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGgoKSAmJiBzdHJbMF0gPT0gJz0nKQotICAgICAgICAg
ICAgICAgIHN0ciA9IHN0ci5taWQoMSkuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICBz
dHIgPSBwYXJzZVVSTChET01TdHJpbmcoc3RyKSkucXN0cmluZygpOwotICAgICAgICAgICAgaWYg
KG9rICYmIGZyYW1lKQotICAgICAgICAgICAgICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBp
dGVtIGlmIHRoZSByZWZyZXNoIHRpbWVvdXQgPiAxIHNlY29uZAotICAgICAgICAgICAgICAgIGZy
YW1lLT5zY2hlZHVsZVJlZGlyZWN0aW9uKGRlbGF5LCBjb21wbGV0ZVVSTCggc3RyICksIGRlbGF5
IDw9IDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGVxdWFsSWdub3JpbmdDYXNl
KGVxdWl2LCAiZXhwaXJlcyIpKQotICAgIHsKLSAgICAgICAgUVN0cmluZyBzdHIgPSBjb250ZW50
LnFzdHJpbmcoKS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgdGltZV90IGV4cGlyZV9kYXRl
ID0gc3RyLnRvSW50KCk7Ci0gICAgICAgIGlmIChtX2RvY0xvYWRlcikKLSAgICAgICAgICAgIG1f
ZG9jTG9hZGVyLT5zZXRFeHBpcmVEYXRlKGV4cGlyZV9kYXRlKTsKLSAgICB9Ci0gICAgZWxzZSBp
ZiAoKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAicHJhZ21hIikgfHwgZXF1YWxJZ25vcmluZ0Nh
c2UoZXF1aXYsICJjYWNoZS1jb250cm9sIikpICYmIGZyYW1lKQotICAgIHsKLSAgICAgICAgUVN0
cmluZyBzdHIgPSBjb250ZW50LnFzdHJpbmcoKS5sb3dlcigpLnN0cmlwV2hpdGVTcGFjZSgpOwot
ICAgICAgICBLVVJMIHVybCA9IGZyYW1lLT51cmwoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJzZXQtY29va2llIikpCi0gICAgewotICAgICAgICAvLyAj
IyMgbWFrZSBzZXRDb29raWUgd29yayBvbiBYTUwgZG9jdW1lbnRzIHRvbzsgZS5nLiBpbiBjYXNl
IG9mIDxodG1sOm1ldGEgLi4uLi4+Ci0gICAgICAgIGlmIChpc0hUTUxEb2N1bWVudCgpKQotICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8SFRNTERvY3VtZW50SW1wbCAqPih0aGlzKS0+c2V0Q29va2ll
KGNvbnRlbnQpOwotICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnByZXBhcmVNb3VzZUV2
ZW50KGJvb2wgcmVhZG9ubHksIGludCB4LCBpbnQgeSwgTW91c2VFdmVudCogZXYpCi17Ci0gICAg
cmV0dXJuIHByZXBhcmVNb3VzZUV2ZW50KHJlYWRvbmx5LCBldi0+dHlwZSA9PSBNb3VzZVByZXNz
LCB4LCB5LCBldik7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpwcmVwYXJlTW91c2VFdmVudChi
b29sIHJlYWRvbmx5LCBib29sIGFjdGl2ZSwgaW50IF94LCBpbnQgX3ksIE1vdXNlRXZlbnQgKmV2
KQotewotICAgIGlmICggbV9yZW5kZXIgKSB7Ci0gICAgICAgIGFzc2VydChtX3JlbmRlci0+aXND
YW52YXMoKSk7Ci0gICAgICAgIFJlbmRlck9iamVjdDo6Tm9kZUluZm8gcmVuZGVySW5mbyhyZWFk
b25seSwgYWN0aXZlLCBldi0+dHlwZSA9PSBNb3VzZU1vdmUpOwotICAgICAgICBib29sIGlzSW5z
aWRlID0gbV9yZW5kZXItPmxheWVyKCktPmhpdFRlc3QocmVuZGVySW5mbywgX3gsIF95KTsKLSAg
ICAgICAgZXYtPmlubmVyTm9kZSA9IHJlbmRlckluZm8uaW5uZXJOb2RlKCk7Ci0KLSAgICAgICAg
aWYgKHJlbmRlckluZm8uVVJMRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBhc3NlcnQocmVuZGVy
SW5mby5VUkxFbGVtZW50KCktPmlzRWxlbWVudE5vZGUoKSk7Ci0gICAgICAgICAgICBFbGVtZW50
SW1wbCogZSA9ICBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+KHJlbmRlckluZm8uVVJMRWxlbWVu
dCgpKTsKLSAgICAgICAgICAgIERPTVN0cmluZyBocmVmID0ga2h0bWw6OnBhcnNlVVJMKGUtPmdl
dEF0dHJpYnV0ZShocmVmQXR0cikpOwotICAgICAgICAgICAgRE9NU3RyaW5nIHRhcmdldCA9IGUt
PmdldEF0dHJpYnV0ZSh0YXJnZXRBdHRyKTsKLQotICAgICAgICAgICAgaWYgKCF0YXJnZXQuaXNO
dWxsKCkgJiYgIWhyZWYuaXNOdWxsKCkpIHsKLSAgICAgICAgICAgICAgICBldi0+dGFyZ2V0ID0g
dGFyZ2V0OwotICAgICAgICAgICAgICAgIGV2LT51cmwgPSBocmVmOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGV2LT51cmwgPSBocmVmOwotICAgICAg
ICB9Ci0KLSAgICAgICAgaWYgKCFyZWFkb25seSkKLSAgICAgICAgICAgIHVwZGF0ZVJlbmRlcmlu
ZygpOwotCi0gICAgICAgIHJldHVybiBpc0luc2lkZTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBm
YWxzZTsKLX0KLQotLy8gRE9NIFNlY3Rpb24gMS4xLjEKLWJvb2wgRG9jdW1lbnRJbXBsOjpjaGls
ZEFsbG93ZWQoIE5vZGVJbXBsICpuZXdDaGlsZCApCi17Ci0gICAgLy8gRG9jdW1lbnRzIG1heSBj
b250YWluIGEgbWF4aW11bSBvZiBvbmUgRWxlbWVudCBjaGlsZAotICAgIGlmIChuZXdDaGlsZC0+
bm9kZVR5cGUoKSA9PSBOb2RlOjpFTEVNRU5UX05PREUpIHsKLSAgICAgICAgTm9kZUltcGwgKmM7
Ci0gICAgICAgIGZvciAoYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkp
IHsKLSAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IE5vZGU6OkVMRU1FTlRfTk9ERSkK
LSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAv
LyBEb2N1bWVudHMgbWF5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIG9uZSBEb2N1bWVudFR5cGUgY2hp
bGQKLSAgICBpZiAobmV3Q2hpbGQtPm5vZGVUeXBlKCkgPT0gTm9kZTo6RE9DVU1FTlRfVFlQRV9O
T0RFKSB7Ci0gICAgICAgIE5vZGVJbXBsICpjOwotICAgICAgICBmb3IgKGMgPSBmaXJzdENoaWxk
KCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICBpZiAoYy0+bm9kZVR5
cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREUpCi0gICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGNoaWxkVHlwZUFsbG93ZWQo
bmV3Q2hpbGQtPm5vZGVUeXBlKCkpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6Y2hpbGRUeXBl
QWxsb3dlZCggdW5zaWduZWQgc2hvcnQgdHlwZSApCi17Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0g
ICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OlBST0NF
U1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDT01NRU5UX05PREU6
Ci0gICAgICAgIGNhc2UgTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOgotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjpjbG9uZU5vZGUgKCBib29sIC8qZGVl
cCovICkKLXsKLSAgICAvLyBTcGVjIHNheXMgY2xvbmluZyBEb2N1bWVudCBub2RlcyBpcyAiaW1w
bGVtZW50YXRpb24gZGVwZW5kZW50IgotICAgIC8vIHNvIHdlIGRvIG5vdCBzdXBwb3J0IGl0Li4u
Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLVN0eWxlU2hlZXRMaXN0SW1wbCogRG9jdW1lbnRJbXBsOjpz
dHlsZVNoZWV0cygpCi17Ci0gICAgcmV0dXJuIG1fc3R5bGVTaGVldHM7Ci19Ci0KLURPTVN0cmlu
ZyBEb2N1bWVudEltcGw6OnByZWZlcnJlZFN0eWxlc2hlZXRTZXQoKQotewotICByZXR1cm4gbV9w
cmVmZXJyZWRTdHlsZXNoZWV0U2V0OwotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpzZWxl
Y3RlZFN0eWxlc2hlZXRTZXQoKQotewotICByZXR1cm4gbV9zZWxlY3RlZFN0eWxlc2hlZXRTZXQ7
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRTZWxlY3RlZFN0eWxlc2hlZXRTZXQoY29uc3Qg
RE9NU3RyaW5nJiBhU3RyaW5nKQotewotICBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IGFTdHJp
bmc7Ci0gIHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLSAgaWYgKHJlbmRlcmVyKCkpCi0gICAgcmVu
ZGVyZXIoKS0+cmVwYWludCgpOwotfQotCi0vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2
ZXIgYSB0b3AtbGV2ZWwgc3R5bGVzaGVldCBoYXMgZmluaXNoZWQgbG9hZGluZy4KLXZvaWQgRG9j
dW1lbnRJbXBsOjpzdHlsZXNoZWV0TG9hZGVkKCkKLXsKLSAgLy8gTWFrZSBzdXJlIHdlIGtuZXcg
dGhpcyBzaGVldCB3YXMgcGVuZGluZywgYW5kIHRoYXQgb3VyIGNvdW50IGlzbid0IG91dCBvZiBz
eW5jLgotICBhc3NlcnQobV9wZW5kaW5nU3R5bGVzaGVldHMgPiAwKTsKLQotICBtX3BlbmRpbmdT
dHlsZXNoZWV0cy0tOwotICAKLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0g
IGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICBwcmludGYoIlN0eWxlc2hlZXQgbG9hZGVkIGF0
IHRpbWUgJWQuICVkIHN0eWxlc2hlZXRzIHN0aWxsIHJlbWFpbi5cbiIsIGVsYXBzZWRUaW1lKCks
IG1fcGVuZGluZ1N0eWxlc2hlZXRzKTsKLSNlbmRpZgotCi0gIHVwZGF0ZVN0eWxlU2VsZWN0b3Io
KTsgICAgCi19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVTdHlsZVNlbGVjdG9yKCkKLXsK
LSAgICAvLyBEb24ndCBib3RoZXIgdXBkYXRpbmcsIHNpbmNlIHdlIGhhdmVuJ3QgbG9hZGVkIGFs
bCBvdXIgc3R5bGUgaW5mbyB5ZXQuCi0gICAgaWYgKCFoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkK
LSAgICAgICAgcmV0dXJuOwotCi0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwot
ICAgIGlmICghb3duZXJFbGVtZW50KCkpCi0gICAgICAgIHByaW50ZigiQmVnaW5uaW5nIHVwZGF0
ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkLlxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5k
aWYKLQotICAgIHJlY2FsY1N0eWxlU2VsZWN0b3IoKTsKLSAgICByZWNhbGNTdHlsZShGb3JjZSk7
Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJGaW5pc2hlZCB1cGRhdGUgb2Ygc3R5bGUgc2VsZWN0
b3IgYXQgdGltZSAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLQotICAgIGlmIChyZW5k
ZXJlcigpKSB7Ci0gICAgICAgIHJlbmRlcmVyKCktPnNldE5lZWRzTGF5b3V0QW5kTWluTWF4UmVj
YWxjKCk7Ci0gICAgICAgIGlmICh2aWV3KCkpCi0gICAgICAgICAgICB2aWV3KCktPnNjaGVkdWxl
UmVsYXlvdXQoKTsKLSAgICB9Ci19Ci0KLQotUVN0cmluZ0xpc3QgRG9jdW1lbnRJbXBsOjphdmFp
bGFibGVTdHlsZVNoZWV0cygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXZhaWxhYmxlU2hlZXRz
OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVjYWxjU3R5bGVTZWxlY3RvcigpCi17Ci0gICAg
aWYgKCAhbV9yZW5kZXIgfHwgIWF0dGFjaGVkKCkgKSByZXR1cm47Ci0KLSAgICBRUHRyTGlzdDxT
dHlsZVNoZWV0SW1wbD4gb2xkU3R5bGVTaGVldHMgPSBtX3N0eWxlU2hlZXRzLT5zdHlsZVNoZWV0
czsKLSAgICBtX3N0eWxlU2hlZXRzLT5zdHlsZVNoZWV0cy5jbGVhcigpOwotICAgIG1fYXZhaWxh
YmxlU2hlZXRzLmNsZWFyKCk7Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gdGhpczsg
bjsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgIAlTdHlsZVNoZWV0SW1wbCAqc2hl
ZXQgPSAwOwotCi0gICAgICAgIGlmIChuLT5ub2RlVHlwZSgpID09IE5vZGU6OlBST0NFU1NJTkdf
SU5TVFJVQ1RJT05fTk9ERSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBp
bnN0cnVjdGlvbiAoWE1MIGRvY3VtZW50cyBvbmx5KQotICAgICAgICAgICAgUHJvY2Vzc2luZ0lu
c3RydWN0aW9uSW1wbCogcGkgPSBzdGF0aWNfY2FzdDxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBs
Kj4obik7Ci0gICAgICAgICAgICBzaGVldCA9IHBpLT5zaGVldCgpOwotI2lmZGVmIEtIVE1MX1hT
TFQKLSAgICAgICAgICAgIGlmIChwaS0+aXNYU0woKSkgewotICAgICAgICAgICAgICAgIC8vIERv
bid0IGFwcGx5IHRyYW5zZm9ybXMgdG8gYWxyZWFkeSB0cmFuc2Zvcm1lZCBkb2N1bWVudHMgLS0g
PHJkYXI6Ly9wcm9ibGVtLzQxMzI4MDY+Ci0gICAgICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1T
b3VyY2VEb2N1bWVudCgpKQotICAgICAgICAgICAgICAgICAgICBhcHBseVhTTFRyYW5zZm9ybShw
aSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAg
ICAgICAgICBpZiAoIXNoZWV0ICYmICFwaS0+bG9jYWxIcmVmKCkuaXNFbXB0eSgpKQotICAgICAg
ICAgICAgewotICAgICAgICAgICAgICAgIC8vIFByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gd2l0aCBy
ZWZlcmVuY2UgdG8gYW4gZWxlbWVudCBpbiB0aGlzIGRvY3VtZW50IC0gZS5nLgotICAgICAgICAg
ICAgICAgIC8vIDw/eG1sLXN0eWxlc2hlZXQgaHJlZj0iI215c3R5bGUiPiwgd2l0aCB0aGUgZWxl
bWVudAotICAgICAgICAgICAgICAgIC8vIDxmb28gaWQ9Im15c3R5bGUiPmhlYWRpbmcgeyBjb2xv
cjogcmVkOyB9PC9mb28+IGF0IHNvbWUgbG9jYXRpb24gaW4KLSAgICAgICAgICAgICAgICAvLyB0
aGUgZG9jdW1lbnQKLSAgICAgICAgICAgICAgICBFbGVtZW50SW1wbCogZWxlbSA9IGdldEVsZW1l
bnRCeUlkKHBpLT5sb2NhbEhyZWYoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVsZW0pIHsKLSAg
ICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIHNoZWV0VGV4dCgiIik7Ci0gICAgICAgICAgICAg
ICAgICAgIE5vZGVJbXBsICpjOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSBlbGVtLT5m
aXJzdENoaWxkKCk7IGM7IGMgPSBjLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoYy0+bm9kZVR5cGUoKSA9PSBOb2RlOjpURVhUX05PREUgfHwgYy0+bm9kZVR5
cGUoKSA9PSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREUpCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgc2hlZXRUZXh0ICs9IGMtPm5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICB9
Ci0KLSAgICAgICAgICAgICAgICAgICAgQ1NTU3R5bGVTaGVldEltcGwgKmNzc1NoZWV0ID0gbmV3
IENTU1N0eWxlU2hlZXRJbXBsKHRoaXMpOwotICAgICAgICAgICAgICAgICAgICBjc3NTaGVldC0+
cGFyc2VTdHJpbmcoc2hlZXRUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgcGktPnNldFN0eWxl
U2hlZXQoY3NzU2hlZXQpOwotICAgICAgICAgICAgICAgICAgICBzaGVldCA9IGNzc1NoZWV0Owot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgIGVs
c2UgaWYgKG4tPmlzSFRNTEVsZW1lbnQoKSAmJiAobi0+aGFzVGFnTmFtZShsaW5rVGFnKSB8fCBu
LT5oYXNUYWdOYW1lKHN0eWxlVGFnKSkpIHsKLSAgICAgICAgICAgIEhUTUxFbGVtZW50SW1wbCAq
ZSA9IHN0YXRpY19jYXN0PEhUTUxFbGVtZW50SW1wbCAqPihuKTsKLSAgICAgICAgICAgIFFTdHJp
bmcgdGl0bGUgPSBlLT5nZXRBdHRyaWJ1dGUodGl0bGVBdHRyKS5xc3RyaW5nKCk7Ci0gICAgICAg
ICAgICBib29sIGVuYWJsZWRWaWFTY3JpcHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChlLT5o
YXNMb2NhbE5hbWUobGlua1RhZykpIHsKLSAgICAgICAgICAgICAgICAvLyA8TElOSz4gZWxlbWVu
dAotICAgICAgICAgICAgICAgIEhUTUxMaW5rRWxlbWVudEltcGwqIGwgPSBzdGF0aWNfY2FzdDxI
VE1MTGlua0VsZW1lbnRJbXBsKj4obik7Ci0gICAgICAgICAgICAgICAgaWYgKGwtPmlzTG9hZGlu
ZygpIHx8IGwtPmlzRGlzYWJsZWQoKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0g
ICAgICAgICAgICAgICAgaWYgKCFsLT5zaGVldCgpKQotICAgICAgICAgICAgICAgICAgICB0aXRs
ZSA9IFFTdHJpbmc6Om51bGw7Ci0gICAgICAgICAgICAgICAgZW5hYmxlZFZpYVNjcmlwdCA9IGwt
PmlzRW5hYmxlZFZpYVNjcmlwdCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBH
ZXQgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHN0eWxlc2V0LiAgVGhpcyBpcyB0aGUKLSAgICAgICAg
ICAgIC8vIHNldCBvZiBzaGVldHMgdGhhdCB3aWxsIGJlIGVuYWJsZWQuCi0gICAgICAgICAgICBp
ZiAoZS0+aGFzTG9jYWxOYW1lKGxpbmtUYWcpKQotICAgICAgICAgICAgICAgIHNoZWV0ID0gc3Rh
dGljX2Nhc3Q8SFRNTExpbmtFbGVtZW50SW1wbCo+KG4pLT5zaGVldCgpOwotICAgICAgICAgICAg
ZWxzZQotICAgICAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVudAotICAgICAgICAgICAgICAg
IHNoZWV0ID0gc3RhdGljX2Nhc3Q8SFRNTFN0eWxlRWxlbWVudEltcGwqPihuKS0+c2hlZXQoKTsK
LQotICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoaXMgc2hlZXQgYmVsb25ncyB0byBh
IHN0eWxlc2V0Ci0gICAgICAgICAgICAvLyAodGh1cyBtYWtpbmcgaXQgUFJFRkVSUkVEIG9yIEFM
VEVSTkFURSByYXRoZXIgdGhhbgotICAgICAgICAgICAgLy8gUEVSU0lTVEVOVCkuCi0gICAgICAg
ICAgICBpZiAoIWVuYWJsZWRWaWFTY3JpcHQgJiYgIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAg
ICAgICAgICAgIC8vIFllcywgd2UgaGF2ZSBhIHRpdGxlLgotICAgICAgICAgICAgICAgIGlmICht
X3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAg
IC8vIE5vIHByZWZlcnJlZCBzZXQgaGFzIGJlZW4gZXN0YWJsaXNoZWQuICBJZgotICAgICAgICAg
ICAgICAgICAgICAvLyB3ZSBhcmUgTk9UIGFuIGFsdGVybmF0ZSBzaGVldCwgdGhlbiBlc3RhYmxp
c2gKLSAgICAgICAgICAgICAgICAgICAgLy8gdXMgYXMgdGhlIHByZWZlcnJlZCBzZXQuICBPdGhl
cndpc2UsIGp1c3QgaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hlZXQuCi0g
ICAgICAgICAgICAgICAgICAgIFFTdHJpbmcgcmVsID0gZS0+Z2V0QXR0cmlidXRlKHJlbEF0dHIp
LnFzdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShzdHls
ZVRhZykgfHwgIXJlbC5jb250YWlucygiYWx0ZXJuYXRlIikpCi0gICAgICAgICAgICAgICAgICAg
ICAgICBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQgPSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9
IHRpdGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAKLSAgICAg
ICAgICAgICAgICBpZiAoIW1fYXZhaWxhYmxlU2hlZXRzLmNvbnRhaW5zKCB0aXRsZSApICkKLSAg
ICAgICAgICAgICAgICAgICAgbV9hdmFpbGFibGVTaGVldHMuYXBwZW5kKCB0aXRsZSApOwotICAg
ICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3ByZWZlcnJlZFN0
eWxlc2hlZXRTZXQpCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgfQotI2lmIFNWR19TVVBQT1JUCi0gICAgICAgIGVsc2UgaWYgKG4tPmlzU1ZH
RWxlbWVudCgpICYmIG4tPmhhc1RhZ05hbWUoS1NWRzo6U1ZHTmFtZXM6OnN0eWxlVGFnKSkgewot
ICAgICAgICAgICAgUVN0cmluZyB0aXRsZTsKLSAgICAgICAgICAgIC8vIDxTVFlMRT4gZWxlbWVu
dAotICAgICAgICAgICAgS1NWRzo6U1ZHU3R5bGVFbGVtZW50SW1wbCAqcyA9IHN0YXRpY19jYXN0
PEtTVkc6OlNWR1N0eWxlRWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAgIGlmICghcy0+aXNM
b2FkaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBzaGVldCA9IHMtPnNoZWV0KCk7Ci0gICAgICAg
ICAgICAgICAgaWYoc2hlZXQpCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gcy0+Z2V0QXR0
cmlidXRlKEtTVkc6OlNWR05hbWVzOjp0aXRsZUF0dHIpLnFzdHJpbmcoKTsKLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgaWYgKCF0aXRsZS5pc0VtcHR5KCkgJiYgbV9wcmVmZXJyZWRTdHls
ZXNoZWV0U2V0LmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBtX3ByZWZlcnJlZFN0eWxlc2hl
ZXRTZXQgPSBtX3NlbGVjdGVkU3R5bGVzaGVldFNldCA9IHRpdGxlOwotCi0gICAgICAgICAgICBp
ZiAoIXRpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBtX3By
ZWZlcnJlZFN0eWxlc2hlZXRTZXQpCi0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gMDsgLy8g
ZG9uJ3QgdXNlIGl0Ci0KLSAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UoJyYn
LCBRU3RyaW5nOjpmcm9tTGF0aW4xKCImJiIpKTsKLQotICAgICAgICAgICAgICAgIGlmICghbV9h
dmFpbGFibGVTaGVldHMuY29udGFpbnModGl0bGUpKQotICAgICAgICAgICAgICAgICAgICBtX2F2
YWlsYWJsZVNoZWV0cy5hcHBlbmQodGl0bGUpOwotICAgICAgICAgICAgfQotICAgICAgIH0KLSNl
bmRpZgotCi0gICAgICAgIGlmIChzaGVldCkgewotICAgICAgICAgICAgc2hlZXQtPnJlZigpOwot
ICAgICAgICAgICAgbV9zdHlsZVNoZWV0cy0+c3R5bGVTaGVldHMuYXBwZW5kKHNoZWV0KTsKLSAg
ICAgICAgfQotICAgIAotICAgICAgICAvLyBGb3IgSFRNTCBkb2N1bWVudHMsIHN0eWxlc2hlZXRz
IGFyZSBub3QgYWxsb3dlZCB3aXRoaW4vYWZ0ZXIgdGhlIDxCT0RZPiB0YWcuIFNvIHdlCi0gICAg
ICAgIC8vIGNhbiBzdG9wIHNlYXJjaGluZyBoZXJlLgotICAgICAgICBpZiAoaXNIVE1MRG9jdW1l
bnQoKSAmJiBuLT5oYXNUYWdOYW1lKGJvZHlUYWcpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
fQotCi0gICAgLy8gRGUtcmVmZXJlbmNlIGFsbCB0aGUgc3R5bGVzaGVldHMgaW4gdGhlIG9sZCBs
aXN0Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxTdHlsZVNoZWV0SW1wbD4gaXQob2xkU3R5bGVTaGVl
dHMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0JaXQuY3VycmVudCgpLT5kZXJl
ZigpOwotCi0gICAgLy8gQ3JlYXRlIGEgbmV3IHN0eWxlIHNlbGVjdG9yCi0gICAgZGVsZXRlIG1f
c3R5bGVTZWxlY3RvcjsKLSAgICBRU3RyaW5nIHVzZXJzaGVldCA9IG1fdXNlcnNoZWV0OwotICAg
IGlmICggbV92aWV3ICYmIG1fdmlldy0+bWVkaWFUeXBlKCkgPT0gInByaW50IiApCi0JdXNlcnNo
ZWV0ICs9IG1fcHJpbnRTaGVldDsKLSAgICBtX3N0eWxlU2VsZWN0b3IgPSBuZXcgQ1NTU3R5bGVT
ZWxlY3Rvcih0aGlzLCB1c2Vyc2hlZXQsIG1fc3R5bGVTaGVldHMsICFpbkNvbXBhdE1vZGUoKSk7
Ci0gICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRFbmNvZGVkVVJMKG1fdXJsKTsKLSAgICBtX3N0eWxl
U2VsZWN0b3JEaXJ0eSA9IGZhbHNlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0SG92ZXJO
b2RlKE5vZGVJbXBsKiBuZXdIb3Zlck5vZGUpCi17Ci0gICAgaWYgKG1faG92ZXJOb2RlICE9IG5l
d0hvdmVyTm9kZSkKLSAgICAgICAgbV9ob3Zlck5vZGUgPSBuZXdIb3Zlck5vZGU7Ci19Ci0KLXZv
aWQgRG9jdW1lbnRJbXBsOjpzZXRBY3RpdmVOb2RlKE5vZGVJbXBsKiBuZXdBY3RpdmVOb2RlKQot
ewotICAgIGlmIChtX2FjdGl2ZU5vZGUgIT0gbmV3QWN0aXZlTm9kZSkKLSAgICAgICAgbV9hY3Rp
dmVOb2RlID0gbmV3QWN0aXZlTm9kZTsKLX0KLQotCi1ib29sIERvY3VtZW50SW1wbDo6cmVsaW5x
dWlzaGVzRWRpdGluZ0ZvY3VzKE5vZGVJbXBsICpub2RlKQotewotICAgIGFzc2VydChub2RlKTsK
LSAgICBhc3NlcnQobm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSk7Ci0KLSAgICBOb2RlSW1wbCAq
cm9vdCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKLSAgICBpZiAoIWZyYW1lKCkgfHwg
IXJvb3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBmcmFtZSgpLT5zaG91
bGRFbmRFZGl0aW5nKHJhbmdlT2ZDb250ZW50cyhyb290KS5nZXQoKSk7Ci19Ci0KLWJvb2wgRG9j
dW1lbnRJbXBsOjphY2NlcHRzRWRpdGluZ0ZvY3VzKE5vZGVJbXBsICpub2RlKQotewotICAgIGFz
c2VydChub2RlKTsKLSAgICBhc3NlcnQobm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSk7Ci0KLSAg
ICBOb2RlSW1wbCAqcm9vdCA9IG5vZGUtPnJvb3RFZGl0YWJsZUVsZW1lbnQoKTsKLSAgICBpZiAo
IWZyYW1lKCkgfHwgIXJvb3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBm
cmFtZSgpLT5zaG91bGRCZWdpbkVkaXRpbmcocmFuZ2VPZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsK
LX0KLQotY29uc3QgUVZhbHVlTGlzdDxEYXNoYm9hcmRSZWdpb25WYWx1ZT4gJiBEb2N1bWVudElt
cGw6OmRhc2hib2FyZFJlZ2lvbnMoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rhc2hib2FyZFJl
Z2lvbnM7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXREYXNoYm9hcmRSZWdpb25zIChjb25z
dCBRVmFsdWVMaXN0PERhc2hib2FyZFJlZ2lvblZhbHVlPiYgcmVnaW9ucykKLXsKLSAgICBtX2Rh
c2hib2FyZFJlZ2lvbnMgPSByZWdpb25zOwotICAgIHNldERhc2hib2FyZFJlZ2lvbnNEaXJ0eSAo
ZmFsc2UpOwotfQotCi0KLXN0YXRpYyBRV2lkZ2V0ICp3aWRnZXRGb3JOb2RlKE5vZGVJbXBsICpm
b2N1c05vZGUpCi17Ci0gICAgaWYgKCFmb2N1c05vZGUpCi0gICAgICAgIHJldHVybiAwOwotICAg
IFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBmb2N1c05vZGUtPnJlbmRlcmVyKCk7Ci0gICAgaWYg
KCFyZW5kZXJlciB8fCAhcmVuZGVyZXItPmlzV2lkZ2V0KCkpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIHJldHVybiBzdGF0aWNfY2FzdDxSZW5kZXJXaWRnZXQgKj4ocmVuZGVyZXIpLT53aWRnZXQo
KTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnNldEZvY3VzTm9kZShOb2RlSW1wbCAqbmV3Rm9j
dXNOb2RlKQoteyAgICAKLSAgICAvLyBNYWtlIHN1cmUgbmV3Rm9jdXNOb2RlIGlzIGFjdHVhbGx5
IGluIHRoaXMgZG9jdW1lbnQKLSAgICBpZiAobmV3Rm9jdXNOb2RlICYmIChuZXdGb2N1c05vZGUt
PmdldERvY3VtZW50KCkgIT0gdGhpcykpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgaWYg
KG1fZm9jdXNOb2RlID09IG5ld0ZvY3VzTm9kZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAg
ICBpZiAobV9mb2N1c05vZGUgJiYgbV9mb2N1c05vZGUtPmlzQ29udGVudEVkaXRhYmxlKCkgJiYg
IXJlbGlucXVpc2hlc0VkaXRpbmdGb2N1cyhtX2ZvY3VzTm9kZS5nZXQoKSkpCi0gICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICAgICAKLSAgICBib29sIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IGZhbHNl
OwotICAgIFJlZlB0cjxOb2RlSW1wbD4gb2xkRm9jdXNOb2RlID0gbV9mb2N1c05vZGU7Ci0gICAg
bV9mb2N1c05vZGUgPSAwOwotICAgIGNsZWFyU2VsZWN0aW9uSWZOZWVkZWQobmV3Rm9jdXNOb2Rl
KTsKLQotICAgIC8vIFJlbW92ZSBmb2N1cyBmcm9tIHRoZSBleGlzdGluZyBmb2N1cyBub2RlIChp
ZiBhbnkpCi0gICAgaWYgKG9sZEZvY3VzTm9kZSAmJiAhb2xkRm9jdXNOb2RlLT5tX2luRGV0YWNo
KSB7IAotICAgICAgICBpZiAob2xkRm9jdXNOb2RlLT5hY3RpdmUoKSkKLSAgICAgICAgICAgIG9s
ZEZvY3VzTm9kZS0+c2V0QWN0aXZlKGZhbHNlKTsKLQotICAgICAgICBvbGRGb2N1c05vZGUtPnNl
dEZvY3VzKGZhbHNlKTsKLSAgICAgICAgb2xkRm9jdXNOb2RlLT5kaXNwYXRjaEhUTUxFdmVudChi
bHVyRXZlbnQsIGZhbHNlLCBmYWxzZSk7Ci0gICAgICAgIGlmIChtX2ZvY3VzTm9kZSkgewotICAg
ICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5n
ZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgbmV3Rm9jdXNOb2RlID0gMDsKLSAgICAgICAg
fQotICAgICAgICBjbGVhclNlbGVjdGlvbklmTmVlZGVkKG5ld0ZvY3VzTm9kZSk7Ci0gICAgICAg
IG9sZEZvY3VzTm9kZS0+ZGlzcGF0Y2hVSUV2ZW50KERPTUZvY3VzT3V0RXZlbnQpOwotICAgICAg
ICBpZiAobV9mb2N1c05vZGUpIHsKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1
cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIG5l
d0ZvY3VzTm9kZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgY2xlYXJTZWxlY3Rpb25JZk5lZWRl
ZChuZXdGb2N1c05vZGUpOwotICAgICAgICBpZiAoKG9sZEZvY3VzTm9kZS5nZXQoKSA9PSB0aGlz
KSAmJiBvbGRGb2N1c05vZGUtPmhhc09uZVJlZigpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7
Ci0gICAgfQotCi0gICAgaWYgKG5ld0ZvY3VzTm9kZSkgewotICAgICAgICBpZiAobmV3Rm9jdXNO
b2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpICYmICFhY2NlcHRzRWRpdGluZ0ZvY3VzKG5ld0ZvY3Vz
Tm9kZSkpIHsKLSAgICAgICAgICAgIC8vIGRlbGVnYXRlIGJsb2NrcyBmb2N1cyBjaGFuZ2UKLSAg
ICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBnb3RvIFNl
dEZvY3VzTm9kZURvbmU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2V0IGZvY3VzIG9uIHRoZSBu
ZXcgbm9kZQotICAgICAgICBtX2ZvY3VzTm9kZSA9IG5ld0ZvY3VzTm9kZTsKLSAgICAgICAgbV9m
b2N1c05vZGUtPmRpc3BhdGNoSFRNTEV2ZW50KGZvY3VzRXZlbnQsIGZhbHNlLCBmYWxzZSk7Ci0g
ICAgICAgIGlmIChtX2ZvY3VzTm9kZSAhPSBuZXdGb2N1c05vZGUpIHsKLSAgICAgICAgICAgIC8v
IGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0g
dHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsKLSAgICAgICAgfQotICAg
ICAgICBtX2ZvY3VzTm9kZS0+ZGlzcGF0Y2hVSUV2ZW50KERPTUZvY3VzSW5FdmVudCk7Ci0gICAg
ICAgIGlmIChtX2ZvY3VzTm9kZSAhPSBuZXdGb2N1c05vZGUpIHsgCi0gICAgICAgICAgICAvLyBo
YW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRy
dWU7Ci0gICAgICAgICAgICBnb3RvIFNldEZvY3VzTm9kZURvbmU7Ci0gICAgICAgIH0KLSAgICAg
ICAgbV9mb2N1c05vZGUtPnNldEZvY3VzKCk7Ci0gICAgICAgIC8vIGV3dywgSSBzdWNrLiBzZXQg
dGhlIHF0IGZvY3VzIGNvcnJlY3RseQotICAgICAgICAvLyAjIyMgZmluZCBhIGJldHRlciBwbGFj
ZSBpbiB0aGUgY29kZSBmb3IgdGhpcwotICAgICAgICBpZiAodmlldygpKSB7Ci0gICAgICAgICAg
ICBRV2lkZ2V0ICpmb2N1c1dpZGdldCA9IHdpZGdldEZvck5vZGUobV9mb2N1c05vZGUuZ2V0KCkp
OwotICAgICAgICAgICAgaWYgKGZvY3VzV2lkZ2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFr
ZSBzdXJlIGEgd2lkZ2V0IGhhcyB0aGUgcmlnaHQgc2l6ZSBiZWZvcmUgZ2l2aW5nIGl0IGZvY3Vz
LgotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRlc3RpbmcgZWRnZSBjYXNl
cyBvZiB0aGUgUVdpZGdldCBjb2RlLgotICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljYWxseSwg
aW4gV2ViQ29yZSB0aGlzIGRvZXMgbm90IHdvcmsgd2VsbCBmb3IgdGV4dCBmaWVsZHMuCi0gICAg
ICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gUmUtZ2V0IHRo
ZSB3aWRnZXQgaW4gY2FzZSB1cGRhdGluZyB0aGUgbGF5b3V0IGNoYW5nZWQgdGhpbmdzLgotICAg
ICAgICAgICAgICAgIGZvY3VzV2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzTm9kZS5nZXQo
KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZm9jdXNXaWRnZXQpCi0gICAgICAg
ICAgICAgICAgZm9jdXNXaWRnZXQtPnNldEZvY3VzKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAg
ICAgICAgICAgICAgdmlldygpLT5zZXRGb2N1cygpOwotICAgICAgICB9Ci0gICB9Ci0KLSAgICBp
ZiAoIWZvY3VzQ2hhbmdlQmxvY2tlZCAmJiBtX2ZvY3VzTm9kZSAmJiBLV1FBY2NPYmplY3RDYWNo
ZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKLSAgICAgICAgZ2V0QWNjT2JqZWN0Q2FjaGUoKS0+
aGFuZGxlRm9jdXNlZFVJRWxlbWVudENoYW5nZWQoKTsKLQotU2V0Rm9jdXNOb2RlRG9uZToKLSAg
ICB1cGRhdGVSZW5kZXJpbmcoKTsKLSAgICByZXR1cm4gIWZvY3VzQ2hhbmdlQmxvY2tlZDsKLX0K
LQotdm9pZCBEb2N1bWVudEltcGw6OmNsZWFyU2VsZWN0aW9uSWZOZWVkZWQoTm9kZUltcGwgKm5l
d0ZvY3VzTm9kZSkKLXsKLSAgICBpZiAoIWZyYW1lKCkpCi0gICAgICAgIHJldHVybjsKLQotICAg
IC8vIENsZWFyIHRoZSBzZWxlY3Rpb24gd2hlbiBjaGFuZ2luZyB0aGUgZm9jdXMgbm9kZSB0byBu
dWxsIG9yIHRvIGEgbm9kZSB0aGF0IGlzIG5vdCAKLSAgICAvLyBjb250YWluZWQgYnkgdGhlIGN1
cnJlbnQgc2VsZWN0aW9uLgotICAgIE5vZGVJbXBsICpzdGFydENvbnRhaW5lciA9IGZyYW1lKCkt
PnNlbGVjdGlvbigpLnN0YXJ0KCkubm9kZSgpOwotICAgIGlmICghbmV3Rm9jdXNOb2RlIHx8IChz
dGFydENvbnRhaW5lciAmJiBzdGFydENvbnRhaW5lciAhPSBuZXdGb2N1c05vZGUgJiYgIXN0YXJ0
Q29udGFpbmVyLT5pc0FuY2VzdG9yKG5ld0ZvY3VzTm9kZSkpKQotICAgICAgICAvLyBGSVhNRTog
NjQ5OCBTaG91bGQganVzdCBiZSBhYmxlIHRvIGNhbGwgbV9mcmFtZS0+c2VsZWN0aW9uKCkuY2xl
YXIoKQotICAgICAgICBmcmFtZSgpLT5zZXRTZWxlY3Rpb24oU2VsZWN0aW9uQ29udHJvbGxlcigp
KTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldENTU1RhcmdldChOb2RlSW1wbCogbikKLXsK
LSAgICBpZiAobV9jc3NUYXJnZXQpCi0gICAgICAgIG1fY3NzVGFyZ2V0LT5zZXRDaGFuZ2VkKCk7
Ci0gICAgbV9jc3NUYXJnZXQgPSBuOwotICAgIGlmIChuKQotICAgICAgICBuLT5zZXRDaGFuZ2Vk
KCk7Ci19Ci0KLU5vZGVJbXBsKiBEb2N1bWVudEltcGw6OmdldENTU1RhcmdldCgpCi17Ci0gICAg
cmV0dXJuIG1fY3NzVGFyZ2V0OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6YXR0YWNoTm9kZUl0
ZXJhdG9yKE5vZGVJdGVyYXRvckltcGwgKm5pKQotewotICAgIG1fbm9kZUl0ZXJhdG9ycy5hcHBl
bmQobmkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6ZGV0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJ
dGVyYXRvckltcGwgKm5pKQotewotICAgIG1fbm9kZUl0ZXJhdG9ycy5yZW1vdmUobmkpOwotfQot
Ci12b2lkIERvY3VtZW50SW1wbDo6bm90aWZ5QmVmb3JlTm9kZVJlbW92YWwoTm9kZUltcGwgKm4p
Ci17Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxOb2RlSXRlcmF0b3JJbXBsPiBpdChtX25vZGVJdGVy
YXRvcnMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGl0LmN1cnJl
bnQoKS0+bm90aWZ5QmVmb3JlTm9kZVJlbW92YWwobik7Ci19Ci0KLUFic3RyYWN0Vmlld0ltcGwg
KkRvY3VtZW50SW1wbDo6ZGVmYXVsdFZpZXcoKSBjb25zdAotewotICAgIHJldHVybiBtX2RlZmF1
bHRWaWV3OwotfQotCi1FdmVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlRXZlbnQoY29uc3Qg
RE9NU3RyaW5nICZldmVudFR5cGUsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoZXZl
bnRUeXBlID09ICJVSUV2ZW50cyIgfHwgZXZlbnRUeXBlID09ICJVSUV2ZW50IikKLSAgICAgICAg
cmV0dXJuIG5ldyBVSUV2ZW50SW1wbCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSAiTW91
c2VFdmVudHMiIHx8IGV2ZW50VHlwZSA9PSAiTW91c2VFdmVudCIpCi0gICAgICAgIHJldHVybiBu
ZXcgTW91c2VFdmVudEltcGwoKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gIk11dGF0aW9u
RXZlbnRzIiB8fCBldmVudFR5cGUgPT0gIk11dGF0aW9uRXZlbnQiKQotICAgICAgICByZXR1cm4g
bmV3IE11dGF0aW9uRXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJLZXli
b2FyZEV2ZW50cyIgfHwgZXZlbnRUeXBlID09ICJLZXlib2FyZEV2ZW50IikKLSAgICAgICAgcmV0
dXJuIG5ldyBLZXlib2FyZEV2ZW50SW1wbCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSAi
SFRNTEV2ZW50cyIgfHwgZXZlbnRUeXBlID09ICJFdmVudCIgfHwgZXZlbnRUeXBlID09ICJFdmVu
dHMiKQotICAgICAgICByZXR1cm4gbmV3IEV2ZW50SW1wbCgpOwotI2lmIFNWR19TVVBQT1JUCi0g
ICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJTVkdFdmVudHMiKQotICAgICAgICByZXR1cm4gbmV3
IEV2ZW50SW1wbCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSAiU1ZHWm9vbUV2ZW50cyIp
Ci0gICAgICAgIHJldHVybiBuZXcgS1NWRzo6U1ZHWm9vbUV2ZW50SW1wbCgpOwotI2VuZGlmCi0g
ICAgZWxzZSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQ
T1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLUNTU1N0eWxlRGVjbGFy
YXRpb25JbXBsICpEb2N1bWVudEltcGw6OmdldE92ZXJyaWRlU3R5bGUoRWxlbWVudEltcGwgKi8q
ZWx0Ki8sIGNvbnN0IERPTVN0cmluZyAmLypwc2V1ZG9FbHQqLykKLXsKLSAgICByZXR1cm4gMDsg
Ly8gIyMjCi19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpkZWZhdWx0RXZlbnRIYW5kbGVyKEV2ZW50
SW1wbCAqZXZ0KQotewotICAgIC8vIGlmIGFueSBodG1sIGV2ZW50IGxpc3RlbmVycyBhcmUgcmVn
aXN0ZXJlZCBvbiB0aGUgd2luZG93LCB0aGVuIGRpc3BhdGNoIHRoZW0gaGVyZQotICAgIFFQdHJM
aXN0PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBsaXN0ZW5lcnNDb3B5ID0gbV93aW5kb3dFdmVu
dExpc3RlbmVyczsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVy
PiBpdChsaXN0ZW5lcnNDb3B5KTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAg
ICAgICBpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldnQtPnR5cGUoKSkKLSAgICAg
ICAgICAgIGl0LmN1cnJlbnQoKS0+bGlzdGVuZXIoKS0+aGFuZGxlRXZlbnRJbXBsKGV2dCwgdHJ1
ZSk7Ci0KLSAgICAvLyBoYW5kbGUgYWNjZXNza2V5Ci0gICAgaWYgKGV2dC0+dHlwZSgpPT1rZXlk
b3duRXZlbnQpIHsKLSAgICAgICAgS2V5Ym9hcmRFdmVudEltcGwgKmtldnQgPSBzdGF0aWNfY2Fz
dDxLZXlib2FyZEV2ZW50SW1wbCAqPihldnQpOwotICAgICAgICBpZiAoa2V2dC0+Y3RybEtleSgp
KSB7Ci0gICAgICAgICAgICBRS2V5RXZlbnQgKnFldnQgPSBrZXZ0LT5xS2V5RXZlbnQoKTsKLSAg
ICAgICAgICAgIERPTVN0cmluZyBrZXkgPSAocWV2dCA/IHFldnQtPnVubW9kaWZpZWRUZXh0KCkg
OiBrZXZ0LT5rZXlJZGVudGlmaWVyKCkpLmxvd2VyKCk7Ci0gICAgICAgICAgICBFbGVtZW50SW1w
bCAqZWxlbSA9IGdldEVsZW1lbnRCeUFjY2Vzc0tleShrZXkpOwotICAgICAgICAgICAgaWYgKGVs
ZW0pIHsKLSAgICAgICAgICAgICAgICBlbGVtLT5hY2Nlc3NLZXlBY3Rpb24oZmFsc2UpOwotICAg
ICAgICAgICAgICAgIGV2dC0+c2V0RGVmYXVsdEhhbmRsZWQoKTsKLSAgICAgICAgICAgIH0KLSAg
ICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldEhUTUxXaW5kb3dFdmVu
dExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICps
aXN0ZW5lcikKLXsKLSAgICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgaXQgd2UgZG9uJ3Qgd2FudCBy
ZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyIHRvIGRlbGV0ZSBpdAotICAgIGlmIChsaXN0ZW5lcikK
LQlsaXN0ZW5lci0+cmVmKCk7Ci0gICAgcmVtb3ZlSFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoZXZl
bnRUeXBlKTsKLSAgICBpZiAobGlzdGVuZXIpIHsKLQlhZGRXaW5kb3dFdmVudExpc3RlbmVyKGV2
ZW50VHlwZSwgbGlzdGVuZXIsIGZhbHNlKTsKLQlsaXN0ZW5lci0+ZGVyZWYoKTsKLSAgICB9Ci19
Ci0KLUV2ZW50TGlzdGVuZXIgKkRvY3VtZW50SW1wbDo6Z2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVu
ZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0gICAgUVB0ckxpc3RJdGVyYXRv
cjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQobV93aW5kb3dFdmVudExpc3RlbmVycyk7Ci0g
ICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLQlpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5
cGUoKSA9PSBldmVudFR5cGUgJiYgaXQuY3VycmVudCgpLT5saXN0ZW5lcigpLT5ldmVudExpc3Rl
bmVyVHlwZSgpID09ICJfa2h0bWxfSFRNTEV2ZW50TGlzdGVuZXIiKQotCSAgICByZXR1cm4gaXQu
Y3VycmVudCgpLT5saXN0ZW5lcigpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6cmVtb3ZlSFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZl
dmVudFR5cGUpCi17Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5l
cj4gaXQobV93aW5kb3dFdmVudExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsg
KytpdCkKLQlpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldmVudFR5cGUgJiYgaXQu
Y3VycmVudCgpLT5saXN0ZW5lcigpLT5ldmVudExpc3RlbmVyVHlwZSgpID09ICJfa2h0bWxfSFRN
TEV2ZW50TGlzdGVuZXIiKSB7Ci0JICAgIG1fd2luZG93RXZlbnRMaXN0ZW5lcnMucmVtb3ZlUmVm
KGl0LmN1cnJlbnQoKSk7Ci0JICAgIHJldHVybjsKLQl9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBs
OjphZGRXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBF
dmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKQotewotICAgIGxpc3RlbmVy
LT5yZWYoKTsKLQotICAgIC8vIFJlbW92ZSBleGlzdGluZyBpZGVudGljYWwgbGlzdGVuZXIgc2V0
IHdpdGggaWRlbnRpY2FsIGFyZ3VtZW50cy4KLSAgICAvLyBUaGUgRE9NIDIgc3BlYyBzYXlzIHRo
YXQgImR1cGxpY2F0ZSBpbnN0YW5jZXMgYXJlIGRpc2NhcmRlZCIgaW4gdGhpcyBjYXNlLgotICAg
IHJlbW92ZVdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVy
ZSk7Ci0gICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5hcHBlbmQobmV3IFJlZ2lzdGVyZWRFdmVu
dExpc3RlbmVyKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpKTsKLQotICAgIGxpc3Rl
bmVyLT5kZXJlZigpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlV2luZG93RXZlbnRM
aXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlz
dGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSkKLXsKLSAgICBSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lciBy
bChldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLSAgICBRUHRyTGlzdEl0ZXJhdG9y
PFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlzdGVuZXJzKTsKLSAg
ICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotICAgICAgICBpZiAoKihpdC5jdXJyZW50KCkp
ID09IHJsKSB7Ci0gICAgICAgICAgICBtX3dpbmRvd0V2ZW50TGlzdGVuZXJzLnJlbW92ZVJlZihp
dC5jdXJyZW50KCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci19Ci0KLWJvb2wg
RG9jdW1lbnRJbXBsOjpoYXNXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAm
ZXZlbnRUeXBlKQotewotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVu
ZXI+IGl0KG1fd2luZG93RXZlbnRMaXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7
ICsraXQpIHsKLQlpZiAoaXQuY3VycmVudCgpLT5ldmVudFR5cGUoKSA9PSBldmVudFR5cGUpIHsK
LQkgICAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0KLQot
RXZlbnRMaXN0ZW5lciAqRG9jdW1lbnRJbXBsOjpjcmVhdGVIVE1MRXZlbnRMaXN0ZW5lcihjb25z
dCBET01TdHJpbmcmIGNvZGUsIE5vZGVJbXBsICpub2RlKQotewotICAgIGlmIChmcmFtZSgpKSB7
Ci0JcmV0dXJuIGZyYW1lKCktPmNyZWF0ZUhUTUxFdmVudExpc3RlbmVyKGNvZGUsIG5vZGUpOwot
ICAgIH0gZWxzZSB7Ci0JcmV0dXJuIE5VTEw7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1w
bDo6c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5
cGUsIEF0dHJpYnV0ZUltcGwqIGF0dHIpCi17Ci0gICAgc2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVu
ZXIoZXZlbnRUeXBlLCBjcmVhdGVIVE1MRXZlbnRMaXN0ZW5lcihhdHRyLT52YWx1ZSgpLCAwKSk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpkaXNwYXRjaEltYWdlTG9hZEV2ZW50U29vbihIVE1M
SW1hZ2VMb2FkZXIgKmltYWdlKQotewotICAgIG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25M
aXN0LmFwcGVuZChpbWFnZSk7Ci0gICAgaWYgKCFtX2ltYWdlTG9hZEV2ZW50VGltZXIpIHsKLSAg
ICAgICAgbV9pbWFnZUxvYWRFdmVudFRpbWVyID0gc3RhcnRUaW1lcigwKTsKLSAgICB9Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVJbWFnZShIVE1MSW1hZ2VMb2FkZXIqIGltYWdlKQot
ewotICAgIC8vIFJlbW92ZSBpbnN0YW5jZXMgb2YgdGhpcyBpbWFnZSBmcm9tIGJvdGggbGlzdHMu
Ci0gICAgLy8gVXNlIGxvb3BzIGJlY2F1c2Ugd2UgYWxsb3cgbXVsdGlwbGUgaW5zdGFuY2VzIHRv
IGdldCBpbnRvIHRoZSBsaXN0cy4KLSAgICB3aGlsZSAobV9pbWFnZUxvYWRFdmVudERpc3BhdGNo
U29vbkxpc3QucmVtb3ZlUmVmKGltYWdlKSkgeyB9Ci0gICAgd2hpbGUgKG1faW1hZ2VMb2FkRXZl
bnREaXNwYXRjaGluZ0xpc3QucmVtb3ZlUmVmKGltYWdlKSkgeyB9Ci0gICAgaWYgKG1faW1hZ2VM
b2FkRXZlbnREaXNwYXRjaFNvb25MaXN0LmlzRW1wdHkoKSAmJiBtX2ltYWdlTG9hZEV2ZW50VGlt
ZXIpIHsKLSAgICAgICAga2lsbFRpbWVyKG1faW1hZ2VMb2FkRXZlbnRUaW1lcik7Ci0gICAgICAg
IG1faW1hZ2VMb2FkRXZlbnRUaW1lciA9IDA7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1w
bDo6ZGlzcGF0Y2hJbWFnZUxvYWRFdmVudHNOb3coKQotewotICAgIC8vIG5lZWQgdG8gYXZvaWQg
cmUtZW50ZXJpbmcgdGhpcyBmdW5jdGlvbjsgaWYgbmV3IGRpc3BhdGNoZXMgYXJlCi0gICAgLy8g
c2NoZWR1bGVkIGJlZm9yZSB0aGUgcGFyZW50IGZpbmlzaGVzIHByb2Nlc3NpbmcgdGhlIGxpc3Qs
IHRoZXkKLSAgICAvLyB3aWxsIHNldCBhIHRpbWVyIGFuZCBldmVudHVhbGx5IGJlIHByb2Nlc3Nl
ZAotICAgIGlmICghbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdC5pc0VtcHR5KCkpIHsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtX2ltYWdlTG9hZEV2ZW50VGltZXIp
IHsKLSAgICAgICAga2lsbFRpbWVyKG1faW1hZ2VMb2FkRXZlbnRUaW1lcik7Ci0gICAgICAgIG1f
aW1hZ2VMb2FkRXZlbnRUaW1lciA9IDA7Ci0gICAgfQotICAgIAotICAgIG1faW1hZ2VMb2FkRXZl
bnREaXNwYXRjaGluZ0xpc3QgPSBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hTb29uTGlzdDsKLSAg
ICBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hTb29uTGlzdC5jbGVhcigpOwotICAgIGZvciAoUVB0
ckxpc3RJdGVyYXRvcjxIVE1MSW1hZ2VMb2FkZXI+IGl0KG1faW1hZ2VMb2FkRXZlbnREaXNwYXRj
aGluZ0xpc3QpOyBpdC5jdXJyZW50KCk7ICkgewotICAgICAgICBIVE1MSW1hZ2VMb2FkZXIqIGlt
YWdlID0gaXQuY3VycmVudCgpOwotICAgICAgICAvLyBNdXN0IGFkdmFuY2UgaXRlcmF0b3IgKmJl
Zm9yZSogZGlzcGF0Y2hpbmcgY2FsbC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBtaWdodCBi
ZSBhZHZhbmNlZCBhdXRvbWF0aWNhbGx5IGlmIGRpc3BhdGNoaW5nIHRoZSBjYWxsIGhhZCBhIHNp
ZGUgZWZmZWN0Ci0gICAgICAgIC8vIG9mIGRlc3Ryb3lpbmcgdGhlIGN1cnJlbnQgSFRNTEltYWdl
TG9hZGVyLCBhbmQgdGhlbiB3ZSB3b3VsZCBhZHZhbmNlIHBhc3QgdGhlICpuZXh0KiBpdGVtLAot
ICAgICAgICAvLyBtaXNzaW5nIG9uZSBhbHRvZ2V0aGVyLgotICAgICAgICArK2l0OwotICAgICAg
ICBpbWFnZS0+ZGlzcGF0Y2hMb2FkRXZlbnQoKTsKLSAgICB9Ci0gICAgbV9pbWFnZUxvYWRFdmVu
dERpc3BhdGNoaW5nTGlzdC5jbGVhcigpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dGltZXJF
dmVudChRVGltZXJFdmVudCAqKQotewotICAgIGRpc3BhdGNoSW1hZ2VMb2FkRXZlbnRzTm93KCk7
Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6Om93bmVyRWxlbWVudCgpCi17Ci0gICAg
S0hUTUxWaWV3ICpjaGlsZFZpZXcgPSB2aWV3KCk7Ci0gICAgaWYgKCFjaGlsZFZpZXcpCi0gICAg
ICAgIHJldHVybiAwOwotICAgIEZyYW1lICpjaGlsZFBhcnQgPSBjaGlsZFZpZXctPmZyYW1lKCk7
Ci0gICAgaWYgKCFjaGlsZFBhcnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIEZyYW1lICpwYXJl
bnQgPSBjaGlsZFBhcnQtPnBhcmVudEZyYW1lKCk7Ci0gICAgaWYgKCFwYXJlbnQpCi0gICAgICAg
IHJldHVybiAwOwotICAgIENoaWxkRnJhbWUgKmNoaWxkRnJhbWUgPSBwYXJlbnQtPmNoaWxkRnJh
bWUoY2hpbGRQYXJ0KTsKLSAgICBpZiAoIWNoaWxkRnJhbWUpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIFJlbmRlclBhcnQgKnJlbmRlclBhcnQgPSBjaGlsZEZyYW1lLT5tX3JlbmRlcmVyOwotICAg
IGlmICghcmVuZGVyUGFydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19j
YXN0PEVsZW1lbnRJbXBsICo+KHJlbmRlclBhcnQtPmVsZW1lbnQoKSk7Ci19Ci0KLURPTVN0cmlu
ZyBEb2N1bWVudEltcGw6OnJlZmVycmVyKCkgY29uc3QKLXsKLSAgICBpZiAoIGZyYW1lKCkgKQot
ICAgICAgICByZXR1cm4gTWFjKGZyYW1lKCkpLT5pbmNvbWluZ1JlZmVycmVyKCk7Ci0gICAgCi0g
ICAgcmV0dXJuIERPTVN0cmluZygpOwotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpkb21h
aW4oKSBjb25zdAotewotICAgIGlmICggbV9kb21haW4uaXNFbXB0eSgpICkgLy8gbm90IHNldCB5
ZXQgKHdlIHNldCBpdCBvbiBkZW1hbmQgdG8gc2F2ZSB0aW1lIGFuZCBzcGFjZSkKLSAgICAgICAg
bV9kb21haW4gPSBLVVJMKFVSTCgpKS5ob3N0KCk7IC8vIEluaXRpYWxseSBzZXQgdG8gdGhlIGhv
c3QKLSAgICByZXR1cm4gbV9kb21haW47Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXREb21h
aW4oY29uc3QgRE9NU3RyaW5nICZuZXdEb21haW4sIGJvb2wgZm9yY2UgLyo9ZmFsc2UqLykKLXsK
LSAgICBpZiAoIGZvcmNlICkgewotICAgICAgICBtX2RvbWFpbiA9IG5ld0RvbWFpbjsKLSAgICAg
ICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoIG1fZG9tYWluLmlzRW1wdHkoKSApIC8vIG5vdCBz
ZXQgeWV0ICh3ZSBzZXQgaXQgb24gZGVtYW5kIHRvIHNhdmUgdGltZSBhbmQgc3BhY2UpCi0gICAg
ICAgIG1fZG9tYWluID0gS1VSTChVUkwoKSkuaG9zdCgpOyAvLyBJbml0aWFsbHkgc2V0IHRvIHRo
ZSBob3N0Ci0KLSAgICAvLyBCb3RoIE5TIGFuZCBJRSBzcGVjaWZ5IHRoYXQgY2hhbmdpbmcgdGhl
IGRvbWFpbiBpcyBvbmx5IGFsbG93ZWQgd2hlbgotICAgIC8vIHRoZSBuZXcgZG9tYWluIGlzIGEg
c3VmZml4IG9mIHRoZSBvbGQgZG9tYWluLgotICAgIGludCBvbGRMZW5ndGggPSBtX2RvbWFpbi5s
ZW5ndGgoKTsKLSAgICBpbnQgbmV3TGVuZ3RoID0gbmV3RG9tYWluLmxlbmd0aCgpOwotICAgIGlm
ICggbmV3TGVuZ3RoIDwgb2xkTGVuZ3RoICkgLy8gZS5nLiBuZXdEb21haW49a2RlLm9yZyAoNykg
YW5kIG1fZG9tYWluPXd3dy5rZGUub3JnICgxMSkKLSAgICB7Ci0gICAgICAgIERPTVN0cmluZyB0
ZXN0ID0gbV9kb21haW4uY29weSgpOwotICAgICAgICBpZiAoIHRlc3Rbb2xkTGVuZ3RoIC0gbmV3
TGVuZ3RoIC0gMV0gPT0gJy4nICkgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3ViZG9tYWluLCBub3Qg
ZS5nLiAiZGUub3JnIgotICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0LnJlbW92ZSggMCwgb2xk
TGVuZ3RoIC0gbmV3TGVuZ3RoICk7IC8vIG5vdyB0ZXN0IGlzICJrZGUub3JnIiBmcm9tIG1fZG9t
YWluCi0gICAgICAgICAgICBpZiAoIHRlc3QgPT0gbmV3RG9tYWluICkgICAgICAgICAgICAgICAg
IC8vIGFuZCB3ZSBjaGVjayB0aGF0IGl0J3MgdGhlIHNhbWUgdGhpbmcgYXMgbmV3RG9tYWluCi0g
ICAgICAgICAgICAgICAgbV9kb21haW4gPSBuZXdEb21haW47Ci0gICAgICAgIH0KLSAgICB9Ci19
Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjppc1ZhbGlkTmFtZShjb25zdCBET01TdHJpbmcgJm5hbWUp
Ci17Ci0gICAgY29uc3QgVUNoYXIgKnMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFVDaGFyICo+
KG5hbWUudW5pY29kZSgpKTsKLSAgICB1bnNpZ25lZCBsZW5ndGggPSBuYW1lLmxlbmd0aCgpOwot
Ci0gICAgaWYgKGxlbmd0aCA9PSAwKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB1bnNp
Z25lZCBpID0gMDsKLQotICAgIFVDaGFyMzIgYzsKLSAgICBVMTZfTkVYVChzLCBpLCBsZW5ndGgs
IGMpCi0gICAgaWYgKCFpc1ZhbGlkTmFtZVN0YXJ0KGMpKQotICAgICAgICByZXR1cm4gZmFsc2U7
Ci0KLSAgICB3aGlsZSAoaSA8IGxlbmd0aCkgewotICAgICAgICBVMTZfTkVYVChzLCBpLCBsZW5n
dGgsIGMpCi0gICAgICAgIGlmICghaXNWYWxpZE5hbWVQYXJ0KGMpKQotICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50
SW1wbDo6cGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwg
RE9NU3RyaW5nICZwcmVmaXgsIERPTVN0cmluZyAmbG9jYWxOYW1lKQotewotICAgIHVuc2lnbmVk
IGxlbmd0aCA9IHF1YWxpZmllZE5hbWUubGVuZ3RoKCk7Ci0KLSAgICBpZiAobGVuZ3RoID09IDAp
Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgbmFtZVN0YXJ0ID0gdHJ1ZTsKLSAg
ICBib29sIHNhd0NvbG9uID0gZmFsc2U7Ci0gICAgaW50IGNvbG9uUG9zID0gMDsKLQotICAgIGNv
bnN0IFFDaGFyICpzID0gcXVhbGlmaWVkTmFtZS51bmljb2RlKCk7Ci0gICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGxlbmd0aDsgKSB7Ci0gICAgICAgIFVDaGFyMzIgYzsKLSAgICAgICAgVTE2
X05FWFQocywgaSwgbGVuZ3RoLCBjKQotICAgICAgICBpZiAoYyA9PSAnOicpIHsKLSAgICAgICAg
ICAgIGlmIChzYXdDb2xvbikKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIG11bHRp
cGxlIGNvbG9uczogbm90IGFsbG93ZWQKLSAgICAgICAgICAgIG5hbWVTdGFydCA9IHRydWU7Ci0g
ICAgICAgICAgICBzYXdDb2xvbiA9IHRydWU7Ci0gICAgICAgICAgICBjb2xvblBvcyA9IGkgLSAx
OwotICAgICAgICB9IGVsc2UgaWYgKG5hbWVTdGFydCkgewotICAgICAgICAgICAgaWYgKCFpc1Zh
bGlkTmFtZVN0YXJ0KGMpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
ICAgIG5hbWVTdGFydCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYg
KCFpc1ZhbGlkTmFtZVBhcnQoYykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFzYXdDb2xvbikgewotICAgICAgICBwcmVmaXggPSBE
T01TdHJpbmcoKTsKLSAgICAgICAgbG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZS5jb3B5KCk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoMCwg
Y29sb25Qb3MpOwotICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZyhj
b2xvblBvcyArIDEsIGxlbmd0aCAtIChjb2xvblBvcyArIDEpKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gdHJ1ZTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmFkZEltYWdlTWFwKEhUTUxNYXBFbGVt
ZW50SW1wbCAqaW1hZ2VNYXApCi17Ci0gICAgLy8gQWRkIHRoZSBpbWFnZSBtYXAsIHVubGVzcyB0
aGVyZSdzIGFscmVhZHkgYW5vdGhlciB3aXRoIHRoYXQgbmFtZS4KLSAgICAvLyAiRmlyc3QgbWFw
IHdpbnMiIGlzIHRoZSBydWxlIG90aGVyIGJyb3dzZXJzIHNlZW0gdG8gaW1wbGVtZW50LgotICAg
IFFTdHJpbmcgbmFtZSA9IGltYWdlTWFwLT5nZXROYW1lKCkucXN0cmluZygpOwotICAgIGlmICgh
bV9pbWFnZU1hcHNCeU5hbWUuY29udGFpbnMobmFtZSkpCi0gICAgICAgIG1faW1hZ2VNYXBzQnlO
YW1lLmluc2VydChuYW1lLCBpbWFnZU1hcCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1v
dmVJbWFnZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKmltYWdlTWFwKQotewotICAgIC8vIFJlbW92
ZSB0aGUgaW1hZ2UgbWFwIGJ5IG5hbWUuCi0gICAgLy8gQnV0IGRvbid0IHJlbW92ZSBzb21lIG90
aGVyIGltYWdlIG1hcCB0aGF0IGp1c3QgaGFwcGVucyB0byBoYXZlIHRoZSBzYW1lIG5hbWUuCi0g
ICAgUVN0cmluZyBuYW1lID0gaW1hZ2VNYXAtPmdldE5hbWUoKS5xc3RyaW5nKCk7Ci0gICAgUU1h
cEl0ZXJhdG9yPFFTdHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAqPiBpdCA9IG1faW1hZ2VNYXBz
QnlOYW1lLmZpbmQobmFtZSk7Ci0gICAgaWYgKGl0ICE9IG1faW1hZ2VNYXBzQnlOYW1lLmVuZCgp
ICYmICppdCA9PSBpbWFnZU1hcCkKLSAgICAgICAgbV9pbWFnZU1hcHNCeU5hbWUucmVtb3ZlKGl0
KTsKLX0KLQotSFRNTE1hcEVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmdldEltYWdlTWFwKGNv
bnN0IERPTVN0cmluZyAmVVJMKSBjb25zdAotewotICAgIGlmIChVUkwuaXNOdWxsKCkpIHsKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgUVN0cmluZyBzID0gVVJMLnFzdHJpbmcoKTsK
LSAgICBpbnQgaGFzaFBvcyA9IHMuZmluZCgnIycpOwotICAgIGlmIChoYXNoUG9zID49IDApCi0g
ICAgICAgIHMgPSBzLm1pZChoYXNoUG9zICsgMSk7Ci0KLSAgICBRTWFwQ29uc3RJdGVyYXRvcjxR
U3RyaW5nLCBIVE1MTWFwRWxlbWVudEltcGwgKj4gaXQgPSBtX2ltYWdlTWFwc0J5TmFtZS5maW5k
KHMpOwotICAgIGlmIChpdCA9PSBtX2ltYWdlTWFwc0J5TmFtZS5lbmQoKSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgcmV0dXJuICppdDsKLX0KLQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0RGVj
b2RlcihEZWNvZGVyICpkZWNvZGVyKQotewotICAgIG1fZGVjb2RlciA9IGRlY29kZXI7Ci19Ci0K
LVFTdHJpbmcgRG9jdW1lbnRJbXBsOjpjb21wbGV0ZVVSTChjb25zdCBRU3RyaW5nICZVUkwpCi17
Ci0gICAgcmV0dXJuIEtVUkwoYmFzZVVSTCgpLCBVUkwsIG1fZGVjb2RlciA/IG1fZGVjb2Rlci0+
Y29kZWMoKSA6IDApLnVybCgpOwotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpjb21wbGV0
ZVVSTChjb25zdCBET01TdHJpbmcgJlVSTCkKLXsKLSAgICBpZiAoVVJMLmlzTnVsbCgpKQotICAg
ICAgICByZXR1cm4gVVJMOwotICAgIHJldHVybiBjb21wbGV0ZVVSTChVUkwucXN0cmluZygpKTsK
LX0KLQotYm9vbCBEb2N1bWVudEltcGw6OmluUGFnZUNhY2hlKCkKLXsKLSAgICByZXR1cm4gbV9p
blBhZ2VDYWNoZTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldEluUGFnZUNhY2hlKGJvb2wg
ZmxhZykKLXsKLSAgICBpZiAobV9pblBhZ2VDYWNoZSA9PSBmbGFnKQotICAgICAgICByZXR1cm47
Ci0KLSAgICBtX2luUGFnZUNhY2hlID0gZmxhZzsKLSAgICBpZiAoZmxhZykgewotICAgICAgICBh
c3NlcnQobV9zYXZlZFJlbmRlcmVyID09IDApOwotICAgICAgICBtX3NhdmVkUmVuZGVyZXIgPSBt
X3JlbmRlcjsKLSAgICAgICAgaWYgKG1fdmlldykgewotICAgICAgICAgICAgbV92aWV3LT5yZXNl
dFNjcm9sbEJhcnMoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFzc2VydCht
X3JlbmRlciA9PSAwIHx8IG1fcmVuZGVyID09IG1fc2F2ZWRSZW5kZXJlcik7Ci0gICAgICAgIG1f
cmVuZGVyID0gbV9zYXZlZFJlbmRlcmVyOwotICAgICAgICBtX3NhdmVkUmVuZGVyZXIgPSAwOwot
ICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnBhc3N3b3JkRmllbGRBZGRlZCgpCi17Ci0g
ICAgbV9wYXNzd29yZEZpZWxkcysrOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cGFzc3dvcmRG
aWVsZFJlbW92ZWQoKQotewotICAgIGFzc2VydChtX3Bhc3N3b3JkRmllbGRzID4gMCk7Ci0gICAg
bV9wYXNzd29yZEZpZWxkcy0tOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6aGFzUGFzc3dvcmRG
aWVsZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGFzc3dvcmRGaWVsZHMgPiAwOwotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6c2VjdXJlRm9ybUFkZGVkKCkKLXsKLSAgICBtX3NlY3VyZUZvcm1z
Kys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZWN1cmVGb3JtUmVtb3ZlZCgpCi17Ci0gICAg
YXNzZXJ0KG1fc2VjdXJlRm9ybXMgPiAwKTsKLSAgICBtX3NlY3VyZUZvcm1zLS07Ci19Ci0KLWJv
b2wgRG9jdW1lbnRJbXBsOjpoYXNTZWN1cmVGb3JtKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9z
ZWN1cmVGb3JtcyA+IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRTaG91bGRDcmVhdGVS
ZW5kZXJlcnMoYm9vbCBmKQotewotICAgIG1fY3JlYXRlUmVuZGVyZXJzID0gZjsKLX0KLQotYm9v
bCBEb2N1bWVudEltcGw6OnNob3VsZENyZWF0ZVJlbmRlcmVycygpCi17Ci0gICAgcmV0dXJuIG1f
Y3JlYXRlUmVuZGVyZXJzOwotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjp0b1N0cmluZygp
IGNvbnN0Ci17Ci0gICAgRE9NU3RyaW5nIHJlc3VsdDsKLQotICAgIGZvciAoTm9kZUltcGwgKmNo
aWxkID0gZmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2li
bGluZygpKSB7Ci0JcmVzdWx0ICs9IGNoaWxkLT50b1N0cmluZygpOwotICAgIH0KLQotICAgIHJl
dHVybiByZXN1bHQ7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3VwcG9ydCBm
b3IgSmF2YXNjcmlwdCBleGVjQ29tbWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcwotCi1KU0VkaXRv
ciAqRG9jdW1lbnRJbXBsOjpqc0VkaXRvcigpCi17Ci0gICAgaWYgKCFtX2pzRWRpdG9yKQotICAg
ICAgICBtX2pzRWRpdG9yID0gbmV3IEpTRWRpdG9yKHRoaXMpOwotICAgIHJldHVybiBtX2pzRWRp
dG9yOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6ZXhlY0NvbW1hbmQoY29uc3QgRE9NU3RyaW5n
ICZjb21tYW5kLCBib29sIHVzZXJJbnRlcmZhY2UsIGNvbnN0IERPTVN0cmluZyAmdmFsdWUpCi17
Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPmV4ZWNDb21tYW5kKGNvbW1hbmQsIHVzZXJJbnRlcmZh
Y2UsIHZhbHVlKTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnF1ZXJ5Q29tbWFuZEVuYWJsZWQo
Y29uc3QgRE9NU3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0VkaXRvcigpLT5xdWVy
eUNvbW1hbmRFbmFibGVkKGNvbW1hbmQpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlD
b21tYW5kSW5kZXRlcm0oY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBq
c0VkaXRvcigpLT5xdWVyeUNvbW1hbmRJbmRldGVybShjb21tYW5kKTsKLX0KLQotYm9vbCBEb2N1
bWVudEltcGw6OnF1ZXJ5Q29tbWFuZFN0YXRlKGNvbnN0IERPTVN0cmluZyAmY29tbWFuZCkKLXsK
LSAgICByZXR1cm4ganNFZGl0b3IoKS0+cXVlcnlDb21tYW5kU3RhdGUoY29tbWFuZCk7Ci19Ci0K
LWJvb2wgRG9jdW1lbnRJbXBsOjpxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29uc3QgRE9NU3RyaW5n
ICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0VkaXRvcigpLT5xdWVyeUNvbW1hbmRTdXBwb3J0
ZWQoY29tbWFuZCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OnF1ZXJ5Q29tbWFuZFZh
bHVlKGNvbnN0IERPTVN0cmluZyAmY29tbWFuZCkKLXsKLSAgICByZXR1cm4ganNFZGl0b3IoKS0+
cXVlcnlDb21tYW5kVmFsdWUoY29tbWFuZCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K
LQotdm9pZCBEb2N1bWVudEltcGw6OmFkZE1hcmtlcihSYW5nZUltcGwgKnJhbmdlLCBEb2N1bWVu
dE1hcmtlcjo6TWFya2VyVHlwZSB0eXBlKQotewotICAgIC8vIFVzZSBhIFRleHRJdGVyYXRvciB0
byB2aXNpdCB0aGUgcG90ZW50aWFsbHkgbXVsdGlwbGUgbm9kZXMgdGhlIHJhbmdlIGNvdmVycy4K
LSAgICBmb3IgKFRleHRJdGVyYXRvciBtYXJrZWRUZXh0KHJhbmdlKTsgIW1hcmtlZFRleHQuYXRF
bmQoKTsgbWFya2VkVGV4dC5hZHZhbmNlKCkpIHsKLSAgICAgICAgUmVmUHRyPFJhbmdlSW1wbD4g
dGV4dFBpZWNlID0gbWFya2VkVGV4dC5yYW5nZSgpOwotICAgICAgICBpbnQgZXhjZXB0aW9uID0g
MDsKLSAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0ge3R5cGUsIHRleHRQaWVjZS0+c3Rh
cnRPZmZzZXQoZXhjZXB0aW9uKSwgdGV4dFBpZWNlLT5lbmRPZmZzZXQoZXhjZXB0aW9uKX07Ci0g
ICAgICAgIGFkZE1hcmtlcih0ZXh0UGllY2UtPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIG1h
cmtlcik7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlTWFya2VycyhSYW5n
ZUltcGwgKnJhbmdlLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlKQotewot
ICAgIC8vIFVzZSBhIFRleHRJdGVyYXRvciB0byB2aXNpdCB0aGUgcG90ZW50aWFsbHkgbXVsdGlw
bGUgbm9kZXMgdGhlIHJhbmdlIGNvdmVycy4KLSAgICBmb3IgKFRleHRJdGVyYXRvciBtYXJrZWRU
ZXh0KHJhbmdlKTsgIW1hcmtlZFRleHQuYXRFbmQoKTsgbWFya2VkVGV4dC5hZHZhbmNlKCkpIHsK
LSAgICAgICAgUmVmUHRyPFJhbmdlSW1wbD4gdGV4dFBpZWNlID0gbWFya2VkVGV4dC5yYW5nZSgp
OwotICAgICAgICBpbnQgZXhjZXB0aW9uID0gMDsKLSAgICAgICAgdW5zaWduZWQgc3RhcnRPZmZz
ZXQgPSB0ZXh0UGllY2UtPnN0YXJ0T2Zmc2V0KGV4Y2VwdGlvbik7Ci0gICAgICAgIHVuc2lnbmVk
IGxlbmd0aCA9IHRleHRQaWVjZS0+ZW5kT2Zmc2V0KGV4Y2VwdGlvbikgLSBzdGFydE9mZnNldCAr
IDE7Ci0gICAgICAgIHJlbW92ZU1hcmtlcnModGV4dFBpZWNlLT5zdGFydENvbnRhaW5lcihleGNl
cHRpb24pLCBzdGFydE9mZnNldCwgbGVuZ3RoLCBtYXJrZXJUeXBlKTsKLSAgICB9Ci19Ci0KLS8v
IE1hcmtlcnMgYXJlIHN0b3JlZCBpbiBvcmRlciBzb3J0ZWQgYnkgdGhlaXIgbG9jYXRpb24uICBU
aGV5IGRvIG5vdCBvdmVybGFwIGVhY2ggb3RoZXIsIGFzIGN1cnJlbnRseQotLy8gcmVxdWlyZWQg
YnkgdGhlIGRyYXdpbmcgY29kZSBpbiBSZW5kZXJUZXh0LmNwcC4KLQotdm9pZCBEb2N1bWVudElt
cGw6OmFkZE1hcmtlcihOb2RlSW1wbCAqbm9kZSwgRG9jdW1lbnRNYXJrZXIgbmV3TWFya2VyKSAK
LXsKLSAgICBhc3NlcnQobmV3TWFya2VyLmVuZE9mZnNldCA+PSBuZXdNYXJrZXIuc3RhcnRPZmZz
ZXQpOwotICAgIGlmIChuZXdNYXJrZXIuZW5kT2Zmc2V0ID09IG5ld01hcmtlci5zdGFydE9mZnNl
dCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFFWYWx1ZUxpc3QgPERvY3VtZW50TWFya2Vy
PiAqbWFya2VycyA9IG1fbWFya2Vycy5maW5kKG5vZGUpOwotICAgIGlmICghbWFya2Vycykgewot
ICAgICAgICBtYXJrZXJzID0gbmV3IFFWYWx1ZUxpc3QgPERvY3VtZW50TWFya2VyPjsKLSAgICAg
ICAgbWFya2Vycy0+YXBwZW5kKG5ld01hcmtlcik7Ci0gICAgICAgIG1fbWFya2Vycy5pbnNlcnQo
bm9kZSwgbWFya2Vycyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUVZhbHVlTGlzdEl0ZXJhdG9y
PERvY3VtZW50TWFya2VyPiBpdDsKLSAgICAgICAgZm9yIChpdCA9IG1hcmtlcnMtPmJlZ2luKCk7
IGl0ICE9IG1hcmtlcnMtPmVuZCgpOyApIHsKLSAgICAgICAgICAgIERvY3VtZW50TWFya2VyIG1h
cmtlciA9ICppdDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG5ld01hcmtlci5lbmRP
ZmZzZXQgPCBtYXJrZXIuc3RhcnRPZmZzZXQrMSkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMg
aXMgdGhlIGZpcnN0IG1hcmtlciB0aGF0IGlzIGNvbXBsZXRlbHkgYWZ0ZXIgbmV3TWFya2VyLCBh
bmQgZGlzam9pbnQgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBvdXIgaW5z
ZXJ0aW9uIHBvaW50LhAKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxz
ZSBpZiAobmV3TWFya2VyLnN0YXJ0T2Zmc2V0ID4gbWFya2VyLmVuZE9mZnNldCkgewotICAgICAg
ICAgICAgICAgIC8vIG1ha2VyIGlzIGJlZm9yZSBuZXdNYXJrZXIsIGFuZCBkaXNqb2ludCBmcm9t
IGl0LiAgS2VlcCBzY2FubmluZy4KLSAgICAgICAgICAgICAgICBpdCsrOwotICAgICAgICAgICAg
fSBlbHNlIGlmIChuZXdNYXJrZXIgPT0gbWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWxy
ZWFkeSBoYXZlIHRoaXMgb25lLCBOT1AKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIG1hcmtlciBhbmQgbmV3TWFya2VyIGlu
dGVyc2VjdCBvciB0b3VjaCAtIG1lcmdlIHRoZW0gaW50byBuZXdNYXJrZXIKLSAgICAgICAgICAg
ICAgICBuZXdNYXJrZXIuc3RhcnRPZmZzZXQgPSBrTWluKG5ld01hcmtlci5zdGFydE9mZnNldCwg
bWFya2VyLnN0YXJ0T2Zmc2V0KTsKLSAgICAgICAgICAgICAgICBuZXdNYXJrZXIuZW5kT2Zmc2V0
ID0ga01heChuZXdNYXJrZXIuZW5kT2Zmc2V0LCBtYXJrZXIuZW5kT2Zmc2V0KTsKLSAgICAgICAg
ICAgICAgICAvLyByZW1vdmUgb2xkIG9uZSwgd2UnbGwgYWRkIG5ld01hcmtlciBsYXRlcgotICAg
ICAgICAgICAgICAgIGl0ID0gbWFya2Vycy0+cmVtb3ZlKGl0KTsKLSAgICAgICAgICAgICAgICAv
LyBpdCBwb2ludHMgdG8gdGhlIG5leHQgbWFya2VyIHRvIGNvbnNpZGVyCi0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICAgICAgLy8gYXQgdGhpcyBwb2ludCBpdCBwb2ludHMgdG8gdGhlIG5v
ZGUgYmVmb3JlIHdoaWNoIHdlIHdhbnQgdG8gaW5zZXJ0Ci0gICAgICAgIG1hcmtlcnMtPmluc2Vy
dChpdCwgbmV3TWFya2VyKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0
ZWQgbm9kZQotICAgIGlmIChub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJl
cigpLT5yZXBhaW50KCk7Ci19Ci0KLS8vIGNvcGllcyBtYXJrZXJzIGZyb20gc3JjTm9kZSB0byBk
c3ROb2RlLCBhcHBseWluZyB0aGUgc3BlY2lmaWVkIHNoaWZ0IGRlbHRhIHRvIHRoZSBjb3BpZXMu
ICBUaGUgc2hpZnQgaXMKLS8vIHVzZWZ1bCBpZiwgZS5nLiwgdGhlIGNhbGxlciBoYXMgY3JlYXRl
ZCB0aGUgZHN0Tm9kZSBmcm9tIGEgbm9uLXByZWZpeCBzdWJzdHJpbmcgb2YgdGhlIHNyY05vZGUu
Ci12b2lkIERvY3VtZW50SW1wbDo6Y29weU1hcmtlcnMoTm9kZUltcGwgKnNyY05vZGUsIHVuc2ln
bmVkIHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBOb2RlSW1wbCAqZHN0Tm9kZSwgaW50IGRlbHRh
LCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlKQotewotICAgIGlmIChsZW5n
dGggPD0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFFWYWx1ZUxpc3QgPERvY3VtZW50
TWFya2VyPiAqbWFya2VycyA9IG1fbWFya2Vycy5maW5kKHNyY05vZGUpOwotICAgIGlmICghbWFy
a2VycykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBkb2NEaXJ0eSA9IGZhbHNlOwotICAg
IHVuc2lnbmVkIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoIC0gMTsKLSAgICBRVmFs
dWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgIGZvciAoaXQgPSBtYXJrZXJz
LT5iZWdpbigpOyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKytpdCkgewotICAgICAgICBEb2N1bWVu
dE1hcmtlciBtYXJrZXIgPSAqaXQ7Ci0KLSAgICAgICAgLy8gc3RvcCBpZiB3ZSBhcmUgbm93IHBh
c3QgdGhlIHNwZWNpZmllZCByYW5nZQotICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0ID4g
ZW5kT2Zmc2V0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICAvLyBza2lw
IG1hcmtlciB0aGF0IGlzIGJlZm9yZSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9yIGlzIHRoZSB3cm9u
ZyB0eXBlCi0gICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0IDwgc3RhcnRPZmZzZXQgfHwgKG1h
cmtlci50eXBlICE9IG1hcmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6
QWxsTWFya2VycykpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvLyBwaW4gdGhl
IG1hcmtlciB0byB0aGUgc3BlY2lmaWVkIHJhbmdlIGFuZCBhcHBseSB0aGUgc2hpZnQgZGVsdGEK
LSAgICAgICAgZG9jRGlydHkgPSB0cnVlOwotICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0
IDwgc3RhcnRPZmZzZXQpCi0gICAgICAgICAgICBtYXJrZXIuc3RhcnRPZmZzZXQgPSBzdGFydE9m
ZnNldDsKLSAgICAgICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPiBlbmRPZmZzZXQpCi0gICAgICAg
ICAgICBtYXJrZXIuZW5kT2Zmc2V0ID0gZW5kT2Zmc2V0OwotICAgICAgICBtYXJrZXIuc3RhcnRP
ZmZzZXQgKz0gZGVsdGE7Ci0gICAgICAgIG1hcmtlci5lbmRPZmZzZXQgKz0gZGVsdGE7Ci0gICAg
ICAgIAotICAgICAgICBhZGRNYXJrZXIoZHN0Tm9kZSwgbWFya2VyKTsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAgIGlmIChkb2NEaXJ0eSAmJiBkc3RO
b2RlLT5yZW5kZXJlcigpKQotICAgICAgICBkc3ROb2RlLT5yZW5kZXJlcigpLT5yZXBhaW50KCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVNYXJrZXJzKE5vZGVJbXBsICpub2RlLCB1
bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5
cGUgbWFya2VyVHlwZSkKLXsKLSAgICBpZiAobGVuZ3RoIDw9IDApCi0gICAgICAgIHJldHVybjsK
LQotICAgIFFWYWx1ZUxpc3QgPERvY3VtZW50TWFya2VyPiAqbWFya2VycyA9IG1fbWFya2Vycy5m
aW5kKG5vZGUpOwotICAgIGlmICghbWFya2VycykKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAg
IGJvb2wgZG9jRGlydHkgPSBmYWxzZTsKLSAgICB1bnNpZ25lZCBlbmRPZmZzZXQgPSBzdGFydE9m
ZnNldCArIGxlbmd0aCAtIDE7Ci0gICAgUVZhbHVlTGlzdEl0ZXJhdG9yPERvY3VtZW50TWFya2Vy
PiBpdDsKLSAgICBmb3IgKGl0ID0gbWFya2Vycy0+YmVnaW4oKTsgaXQgIT0gbWFya2Vycy0+ZW5k
KCk7ICkgewotICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSAqaXQ7Ci0KLSAgICAgICAg
Ly8gbWFya2VycyBhcmUgcmV0dXJuZWQgaW4gb3JkZXIsIHNvIHN0b3AgaWYgd2UgYXJlIG5vdyBw
YXN0IHRoZSBzcGVjaWZpZWQgcmFuZ2UKLSAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+
IGVuZE9mZnNldCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAKLSAgICAgICAgLy8gc2tp
cCBtYXJrZXIgdGhhdCBpcyB3cm9uZyB0eXBlIG9yIGJlZm9yZSB0YXJnZXQKLSAgICAgICAgaWYg
KG1hcmtlci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0gbWFya2Vy
VHlwZSAmJiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkgewotICAg
ICAgICAgICAgaXQrKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gYXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgbWFya2VyIGFuZCB0YXJnZXQgaW50ZXJz
ZWN0IGluIHNvbWUgd2F5Ci0gICAgICAgIGRvY0RpcnR5ID0gdHJ1ZTsKLQotICAgICAgICAvLyBw
aXRjaCB0aGUgb2xkIG1hcmtlcgotICAgICAgICBpdCA9IG1hcmtlcnMtPnJlbW92ZShpdCk7Ci0g
ICAgICAgIC8vIGl0IG5vdyBwb2ludHMgdG8gdGhlIG5leHQgbm9kZQotICAgICAgICAKLSAgICAg
ICAgLy8gYWRkIGVpdGhlciBvZiB0aGUgcmVzdWx0aW5nIHNsaWNlcyB0aGF0IGFyZSBsZWZ0IGFm
dGVyIHJlbW92aW5nIHRhcmdldAotICAgICAgICAvLyBOT1RFOiBUaGlzIGFkZHMgdG8gdGhlIGxp
c3Qgd2UgYXJlIGl0ZXJhdGluZyEgIFRoYXQgaXMgT0sgcmVnYXJkbGVzcyBvZgotICAgICAgICAv
LyB3aGV0aGVyIHRoZSBpdGVyYXRvciBzZWVzIHRoZSBuZXcgbm9kZSwgc2luY2UgdGhlIG5ldyBu
b2RlIGlzIGEga2VlcGVyLgotICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiBtYXJrZXIuc3RhcnRP
ZmZzZXQpIHsKLSAgICAgICAgICAgIERvY3VtZW50TWFya2VyIG5ld0xlZnQgPSBtYXJrZXI7Ci0g
ICAgICAgICAgICBuZXdMZWZ0LmVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotICAgICAgICAgICAg
bWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdMZWZ0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFy
a2VyLmVuZE9mZnNldCA+IGVuZE9mZnNldCkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJrZXIg
bmV3UmlnaHQgPSBtYXJrZXI7Ci0gICAgICAgICAgICBuZXdSaWdodC5zdGFydE9mZnNldCA9IGVu
ZE9mZnNldDsKLSAgICAgICAgICAgIG1hcmtlcnMtPmluc2VydChpdCwgbmV3UmlnaHQpOwotICAg
ICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1hcmtlcnMtPmlzRW1wdHkoKSkKLSAgICAgICAgbV9t
YXJrZXJzLnJlbW92ZShub2RlKTsKLQotICAgIC8vIHJlcGFpbnQgdGhlIGFmZmVjdGVkIG5vZGUK
LSAgICBpZiAoZG9jRGlydHkgJiYgbm9kZS0+cmVuZGVyZXIoKSkKLSAgICAgICAgbm9kZS0+cmVu
ZGVyZXIoKS0+cmVwYWludCgpOwotfQotCi1RVmFsdWVMaXN0PERvY3VtZW50TWFya2VyPiBEb2N1
bWVudEltcGw6Om1hcmtlcnNGb3JOb2RlKE5vZGVJbXBsICpub2RlKQotewotICAgIFFWYWx1ZUxp
c3QgPERvY3VtZW50TWFya2VyPiAqbWFya2VycyA9IG1fbWFya2Vycy5maW5kKG5vZGUpOwotICAg
IGlmIChtYXJrZXJzKQotICAgICAgICByZXR1cm4gKm1hcmtlcnM7Ci0gICAgcmV0dXJuIFFWYWx1
ZUxpc3QgPERvY3VtZW50TWFya2VyPiAoKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92
ZU1hcmtlcnMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgUVZhbHVlTGlzdDxEb2N1bWVudE1hcmtl
cj4gKm1hcmtlcnMgPSBtX21hcmtlcnMudGFrZShub2RlKTsKLSAgICBpZiAobWFya2Vycykgewot
ICAgICAgICBSZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICAg
ICAgaWYgKHJlbmRlcmVyKQotICAgICAgICAgICAgcmVuZGVyZXItPnJlcGFpbnQoKTsKLSAgICAg
ICAgZGVsZXRlIG1hcmtlcnM7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3Zl
TWFya2VycyhEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlKQotewotICAgIC8v
IG91dGVyIGxvb3A6IHByb2Nlc3MgZWFjaCBtYXJrZXJlZCBub2RlIGluIHRoZSBkb2N1bWVudAot
ICAgIFFQdHJEaWN0SXRlcmF0b3I8IFFWYWx1ZUxpc3Q8RG9jdW1lbnRNYXJrZXI+ID4gZGljdEl0
ZXJhdG9yKG1fbWFya2Vycyk7Ci0gICAgZm9yICg7IE5vZGVJbXBsICpub2RlID0gc3RhdGljX2Nh
c3Q8Tm9kZUltcGwgKj4oZGljdEl0ZXJhdG9yLmN1cnJlbnRLZXkoKSk7ICkgewotICAgICAgICAv
LyBpbm5lciBsb29wOiBwcm9jZXNzIGVhY2ggbWFya2VyIGluIHRoZSBjdXJyZW50IG5vZGUKLSAg
ICAgICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gc3RhdGljX2Nhc3Q8
UVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICo+KGRpY3RJdGVyYXRvci5jdXJyZW50KCkpOwot
ICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IG1hcmtlckl0ZXJhdG9y
OwotICAgICAgICBmb3IgKG1hcmtlckl0ZXJhdG9yID0gbWFya2Vycy0+YmVnaW4oKTsgbWFya2Vy
SXRlcmF0b3IgIT0gbWFya2Vycy0+ZW5kKCk7ICkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJr
ZXIgbWFya2VyID0gKm1hcmtlckl0ZXJhdG9yOwotCi0gICAgICAgICAgICAvLyBza2lwIG5vZGVz
IHRoYXQgYXJlIG5vdCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUKLSAgICAgICAgICAgIGlmIChtYXJr
ZXIudHlwZSAhPSBtYXJrZXJUeXBlICYmIG1hcmtlclR5cGUgIT0gRG9jdW1lbnRNYXJrZXI6OkFs
bE1hcmtlcnMpIHsKLSAgICAgICAgICAgICAgICArK21hcmtlckl0ZXJhdG9yOwotICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBwaXRjaCB0
aGUgb2xkIG1hcmtlcgotICAgICAgICAgICAgbWFya2VySXRlcmF0b3IgPSBtYXJrZXJzLT5yZW1v
dmUobWFya2VySXRlcmF0b3IpOwotICAgICAgICAgICAgLy8gbWFya2VySXRlcmF0b3Igbm93IHBv
aW50cyB0byB0aGUgbmV4dCBub2RlCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIGRl
bGV0ZSB0aGUgbm9kZSdzIGxpc3QgaWYgaXQgaXMgbm93IGVtcHR5Ci0gICAgICAgIGlmIChtYXJr
ZXJzLT5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX21hcmtlcnMucmVtb3ZlKG5vZGUpOwotICAg
ICAgICAKLSAgICAgICAgLy8gY2F1c2UgdGhlIG5vZGUgdG8gYmUgcmVkcmF3bgotICAgICAgICBS
ZW5kZXJPYmplY3QgKnJlbmRlcmVyID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKHJl
bmRlcmVyKQotICAgICAgICAgICAgcmVuZGVyZXItPnJlcGFpbnQoKTsKLSAgICB9Ci19Ci0KLXZv
aWQgRG9jdW1lbnRJbXBsOjpzaGlmdE1hcmtlcnMoTm9kZUltcGwgKm5vZGUsIHVuc2lnbmVkIHN0
YXJ0T2Zmc2V0LCBpbnQgZGVsdGEsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5
cGUpCi17Ci0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJr
ZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICBib29sIGRvY0RpcnR5ID0gZmFsc2U7Ci0gICAgUVZhbHVlTGlzdEl0ZXJhdG9yPERvY3VtZW50
TWFya2VyPiBpdDsKLSAgICBmb3IgKGl0ID0gbWFya2Vycy0+YmVnaW4oKTsgaXQgIT0gbWFya2Vy
cy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgRG9jdW1lbnRNYXJrZXIgJm1hcmtlciA9ICppdDsK
LSAgICAgICAgaWYgKG1hcmtlci5zdGFydE9mZnNldCA+PSBzdGFydE9mZnNldCAmJiAobWFya2Vy
VHlwZSA9PSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2VycyB8fCBtYXJrZXIudHlwZSA9PSBtYXJr
ZXJUeXBlKSkgewotICAgICAgICAgICAgYXNzZXJ0KChpbnQpbWFya2VyLnN0YXJ0T2Zmc2V0ICsg
ZGVsdGEgPj0gMCk7Ci0gICAgICAgICAgICBtYXJrZXIuc3RhcnRPZmZzZXQgKz0gZGVsdGE7Ci0g
ICAgICAgICAgICBtYXJrZXIuZW5kT2Zmc2V0ICs9IGRlbHRhOwotICAgICAgICAgICAgZG9jRGly
dHkgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIHJlcGFpbnQgdGhlIGFm
ZmVjdGVkIG5vZGUKLSAgICBpZiAoZG9jRGlydHkgJiYgbm9kZS0+cmVuZGVyZXIoKSkKLSAgICAg
ICAgbm9kZS0+cmVuZGVyZXIoKS0+cmVwYWludCgpOwotfQotCi0jaWZkZWYgS0hUTUxfWFNMVAot
Ci12b2lkIERvY3VtZW50SW1wbDo6YXBwbHlYU0xUcmFuc2Zvcm0oUHJvY2Vzc2luZ0luc3RydWN0
aW9uSW1wbCogcGkpCi17Ci0gICAgUmVmUHRyPFhTTFRQcm9jZXNzb3JJbXBsPiBwcm9jZXNzb3Ig
PSBuZXcgWFNMVFByb2Nlc3NvckltcGw7Ci0gICAgcHJvY2Vzc29yLT5zZXRYU0xTdHlsZXNoZWV0
KHN0YXRpY19jYXN0PFhTTFN0eWxlU2hlZXRJbXBsKj4ocGktPnNoZWV0KCkpKTsKLSAgICAKLSAg
ICBRU3RyaW5nIHJlc3VsdE1JTUVUeXBlOwotICAgIFFTdHJpbmcgbmV3U291cmNlOwotICAgIFFT
dHJpbmcgcmVzdWx0RW5jb2Rpbmc7Ci0gICAgaWYgKCFwcm9jZXNzb3ItPnRyYW5zZm9ybVRvU3Ry
aW5nKHRoaXMsIHJlc3VsdE1JTUVUeXBlLCBuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nKSkKLSAg
ICAgICAgcmV0dXJuOwotICAgIC8vIEZJWE1FOiBJZiB0aGUgdHJhbnNmb3JtIGZhaWxlZCB3ZSBz
aG91bGQgcHJvYmFibHkgcmVwb3J0IGFuIGVycm9yIChsaWtlIE1vemlsbGEgZG9lcykuCi0gICAg
cHJvY2Vzc29yLT5jcmVhdGVEb2N1bWVudEZyb21Tb3VyY2UobmV3U291cmNlLCByZXN1bHRFbmNv
ZGluZywgcmVzdWx0TUlNRVR5cGUsIHRoaXMsIHZpZXcoKSk7Ci19Ci0KLSNlbmRpZgotCi12b2lk
IERvY3VtZW50SW1wbDo6c2V0RGVzaWduTW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKQotewotICAg
IG1fZGVzaWduTW9kZSA9IHZhbHVlOwotfQotCi1Eb2N1bWVudEltcGw6OkluaGVyaXRlZEJvb2wg
RG9jdW1lbnRJbXBsOjpnZXREZXNpZ25Nb2RlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9kZXNp
Z25Nb2RlOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6aW5EZXNpZ25Nb2RlKCkgY29uc3QKLXsK
LSAgICBmb3IgKGNvbnN0IERvY3VtZW50SW1wbCogZCA9IHRoaXM7IGQ7IGQgPSBkLT5wYXJlbnRE
b2N1bWVudCgpKSB7Ci0gICAgICAgIGlmIChkLT5tX2Rlc2lnbk1vZGUgIT0gaW5oZXJpdCkKLSAg
ICAgICAgICAgIHJldHVybiBkLT5tX2Rlc2lnbk1vZGU7ICAgICAgCi0gICAgfQotICAgIHJldHVy
biBmYWxzZTsKLX0KLQotRG9jdW1lbnRJbXBsICpEb2N1bWVudEltcGw6OnBhcmVudERvY3VtZW50
KCkgY29uc3QKLXsKLSAgICBGcmFtZSAqY2hpbGRQYXJ0ID0gZnJhbWUoKTsKLSAgICBpZiAoIWNo
aWxkUGFydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUgKnBhcmVudCA9IGNoaWxkUGFy
dC0+cGFyZW50RnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgcmV0dXJuIHBhcmVudC0+eG1sRG9jSW1wbCgpOwotfQotCi1Eb2N1bWVudEltcGwgKkRvY3Vt
ZW50SW1wbDo6dG9wRG9jdW1lbnQoKSBjb25zdAotewotICAgIERvY3VtZW50SW1wbCAqZG9jID0g
Y29uc3RfY2FzdDxEb2N1bWVudEltcGwgKj4odGhpcyk7Ci0gICAgRWxlbWVudEltcGwgKmVsZW1l
bnQ7Ci0gICAgd2hpbGUgKChlbGVtZW50ID0gZG9jLT5vd25lckVsZW1lbnQoKSkgIT0gMCkgewot
ICAgICAgICBkb2MgPSBlbGVtZW50LT5nZXREb2N1bWVudCgpOwotICAgICAgICBlbGVtZW50ID0g
ZG9jID8gZG9jLT5vd25lckVsZW1lbnQoKSA6IDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBk
b2M7Ci19Ci0KLUF0dHJJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUF0dHJpYnV0ZU5TKGNvbnN0
IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxpZmllZE5hbWUs
IGludCAmZXhjZXB0aW9uKQotewotICAgIGlmIChxdWFsaWZpZWROYW1lLmlzTnVsbCgpKSB7Ci0g
ICAgICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRE9NU3RyaW5nIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5h
bWU7Ci0gICAgRE9NU3RyaW5nIHByZWZpeDsKLSAgICBpbnQgY29sb25wb3M7Ci0gICAgaWYgKChj
b2xvbnBvcyA9IHF1YWxpZmllZE5hbWUuZmluZCgnOicpKSA+PSAwKSB7Ci0gICAgICAgIHByZWZp
eCA9IHF1YWxpZmllZE5hbWUuY29weSgpOwotICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWRO
YW1lLmNvcHkoKTsKLSAgICAgICAgcHJlZml4LnRydW5jYXRlKGNvbG9ucG9zKTsKLSAgICAgICAg
bG9jYWxOYW1lLnJlbW92ZSgwLCBjb2xvbnBvcysxKTsKLSAgICB9Ci0KLSAgICBpZiAoIWlzVmFs
aWROYW1lKGxvY2FsTmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpJ
TlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAg
ICAvLyBGSVhNRTogQXNzdW1lIHRoaXMgaXMgYSBtYXBwZWQgYXR0cmlidXRlLCBzaW5jZSBjcmVh
dGVBdHRyaWJ1dGUgaXNuJ3QgbmFtZXNwYWNlLWF3YXJlLiAgVGhlcmUncyBubyBoYXJtIHRvIFhN
TAotICAgIC8vIGRvY3VtZW50cyBpZiB3ZSdyZSB3cm9uZy4KLSAgICByZXR1cm4gbmV3IEF0dHJJ
bXBsKDAsIHRoaXMsIG5ldyBNYXBwZWRBdHRyaWJ1dGVJbXBsKFF1YWxpZmllZE5hbWUocHJlZml4
LmltcGwoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsTmFtZS5pbXBsKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5hbWVzcGFjZVVSSS5pbXBsKCkpLCBET01TdHJpbmcoIiIpLmltcGwoKSksIGZhbHNlKTsKLX0K
LQotdm9pZCBEb2N1bWVudEltcGw6OnJhZGlvQnV0dG9uQ2hlY2tlZChIVE1MSW5wdXRFbGVtZW50
SW1wbCAqY2FsbGVyLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKQotewotICAgIC8vIFdpdGhv
dXQgYSBuYW1lLCB0aGVyZSBpcyBubyBncm91cC4KLSAgICBpZiAoY2FsbGVyLT5uYW1lKCkuaXNF
bXB0eSgpKQotICAgICAgICByZXR1cm47Ci0gICAgaWYgKCFmb3JtKQotICAgICAgICBmb3JtID0g
ZGVmYXVsdEZvcm07Ci0gICAgLy8gVW5jaGVjayB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0K
LSAgICBpZiAoIW1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMpCi0gICAgICAgIG1fc2VsZWN0ZWRSYWRp
b0J1dHRvbnMgPSBuZXcgRm9ybVRvR3JvdXBNYXA7Ci0gICAgTmFtZVRvSW5wdXRNYXAqIGZvcm1S
YWRpb0J1dHRvbnMgPSBtX3NlbGVjdGVkUmFkaW9CdXR0b25zLT5nZXQoZm9ybSk7Ci0gICAgaWYg
KCFmb3JtUmFkaW9CdXR0b25zKSB7Ci0gICAgICAgIGZvcm1SYWRpb0J1dHRvbnMgPSBuZXcgTmFt
ZVRvSW5wdXRNYXA7Ci0gICAgICAgIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPnNldChmb3JtLCBm
b3JtUmFkaW9CdXR0b25zKTsKLSAgICB9Ci0gICAgCi0gICAgSFRNTElucHV0RWxlbWVudEltcGwq
IGN1cnJlbnRDaGVja2VkUmFkaW8gPSBmb3JtUmFkaW9CdXR0b25zLT5nZXQoY2FsbGVyLT5uYW1l
KCkuaW1wbCgpKTsKLSAgICBpZiAoY3VycmVudENoZWNrZWRSYWRpbyAmJiBjdXJyZW50Q2hlY2tl
ZFJhZGlvICE9IGNhbGxlcikKLSAgICAgICAgY3VycmVudENoZWNrZWRSYWRpby0+c2V0Q2hlY2tl
ZChmYWxzZSk7Ci0KLSAgICBmb3JtUmFkaW9CdXR0b25zLT5zZXQoY2FsbGVyLT5uYW1lKCkuaW1w
bCgpLCBjYWxsZXIpOwotfQotCi1IVE1MSW5wdXRFbGVtZW50SW1wbCogRG9jdW1lbnRJbXBsOjpj
aGVja2VkUmFkaW9CdXR0b25Gb3JHcm91cChET01TdHJpbmdJbXBsKiBuYW1lLCBIVE1MRm9ybUVs
ZW1lbnRJbXBsICpmb3JtKQotewotICAgIGlmICghbV9zZWxlY3RlZFJhZGlvQnV0dG9ucykKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFmb3JtKQotICAgICAgICBmb3JtID0gZGVmYXVsdEZv
cm07Ci0gICAgTmFtZVRvSW5wdXRNYXAqIGZvcm1SYWRpb0J1dHRvbnMgPSBtX3NlbGVjdGVkUmFk
aW9CdXR0b25zLT5nZXQoZm9ybSk7Ci0gICAgaWYgKCFmb3JtUmFkaW9CdXR0b25zKQotICAgICAg
ICByZXR1cm4gMDsKLSAgICAKLSAgICByZXR1cm4gZm9ybVJhZGlvQnV0dG9ucy0+Z2V0KG5hbWUp
OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlUmFkaW9CdXR0b25Hcm91cChET01TdHJp
bmdJbXBsKiBuYW1lLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKQotewotICAgIGlmICghZm9y
bSkKLSAgICAgICAgZm9ybSA9IGRlZmF1bHRGb3JtOwotICAgIGlmIChtX3NlbGVjdGVkUmFkaW9C
dXR0b25zKSB7Ci0gICAgICAgIE5hbWVUb0lucHV0TWFwKiBmb3JtUmFkaW9CdXR0b25zID0gbV9z
ZWxlY3RlZFJhZGlvQnV0dG9ucy0+Z2V0KGZvcm0pOwotICAgICAgICBpZiAoZm9ybVJhZGlvQnV0
dG9ucykgewotICAgICAgICAgICAgZm9ybVJhZGlvQnV0dG9ucy0+cmVtb3ZlKG5hbWUpOwotICAg
ICAgICAgICAgaWYgKGZvcm1SYWRpb0J1dHRvbnMtPmlzRW1wdHkoKSkgewotICAgICAgICAgICAg
ICAgIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPnJlbW92ZShmb3JtKTsKLSAgICAgICAgICAgICAg
ICBkZWxldGUgZm9ybVJhZGlvQnV0dG9uczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjppbWFnZXMo
KQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxl
Y3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DX0lNQUdFUykpOwotfQotCi1S
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmFwcGxldHMoKQotewotICAg
IHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBs
KHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DX0FQUExFVFMpKTsKLX0KLQotUmVmUHRyPEhU
TUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjplbWJlZHMoKQotewotICAgIHJldHVybiBS
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhU
TUxDb2xsZWN0aW9uSW1wbDo6RE9DX0VNQkVEUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rp
b25JbXBsPiBEb2N1bWVudEltcGw6Om9iamVjdHMoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0
aW9uSW1wbDo6RE9DX09CSkVDVFMpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4g
RG9jdW1lbnRJbXBsOjpsaW5rcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlv
bkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpE
T0NfTElOS1MpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBs
Ojpmb3JtcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBI
VE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfRk9STVMpKTsK
LX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjphbmNob3JzKCkK
LXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0
aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19BTkNIT1JTKSk7Ci19Ci0KLVJl
ZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IERvY3VtZW50SW1wbDo6YWxsKCkKLXsKLSAgICByZXR1
cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1wbCh0aGlz
LCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19BTEwpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0
aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjp3aW5kb3dOYW1lZEl0ZW1zKERPTVN0cmluZyAmbmFtZSkK
LXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxOYW1lQ29s
bGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpXSU5ET1dfTkFNRURfSVRFTVMs
IG5hbWUpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjpk
b2N1bWVudE5hbWVkSXRlbXMoRE9NU3RyaW5nICZuYW1lKQotewotICAgIHJldHVybiBSZWZQdHI8
SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTE5hbWVDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1M
Q29sbGVjdGlvbkltcGw6OkRPQ1VNRU5UX05BTUVEX0lURU1TLCBuYW1lKSk7Ci19Ci0KLVJlZlB0
cjxOYW1lTm9kZUxpc3RJbXBsPiBEb2N1bWVudEltcGw6OmdldEVsZW1lbnRzQnlOYW1lKGNvbnN0
IERPTVN0cmluZyAmZWxlbWVudE5hbWUpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxOYW1lTm9kZUxp
c3RJbXBsPihuZXcgTmFtZU5vZGVMaXN0SW1wbCh0aGlzLCBlbGVtZW50TmFtZSkpOwotfQotCi0v
LyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURvY3VtZW50RnJhZ21lbnRJbXBsOjpEb2N1bWVudEZy
YWdtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYykgOiBDb250YWluZXJOb2RlSW1wbChkb2MpCi17
Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEZyYWdtZW50SW1wbDo6bm9kZU5hbWUoKSBjb25zdAot
ewotICByZXR1cm4gIiNkb2N1bWVudC1mcmFnbWVudCI7Ci19Ci0KLXVuc2lnbmVkIHNob3J0IERv
Y3VtZW50RnJhZ21lbnRJbXBsOjpub2RlVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIE5vZGU6
OkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU7Ci19Ci0KLS8vIERPTSBTZWN0aW9uIDEuMS4xCi1ib29s
IERvY3VtZW50RnJhZ21lbnRJbXBsOjpjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25lZCBzaG9ydCB0
eXBlICkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5U
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpURVhU
X05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICBj
YXNlIE5vZGU6OkVOVElUWV9SRUZFUkVOQ0VfTk9ERToKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0K
LQotRE9NU3RyaW5nIERvY3VtZW50RnJhZ21lbnRJbXBsOjp0b1N0cmluZygpIGNvbnN0Ci17Ci0g
ICAgRE9NU3RyaW5nIHJlc3VsdDsKLQotICAgIGZvciAoTm9kZUltcGwgKmNoaWxkID0gZmlyc3RD
aGlsZCgpOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0U2libGluZygpKSB7Ci0J
cmVzdWx0ICs9IGNoaWxkLT50b1N0cmluZygpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7
Ci19Ci0KLQotTm9kZUltcGwgKkRvY3VtZW50RnJhZ21lbnRJbXBsOjpjbG9uZU5vZGUgKGJvb2wg
ZGVlcCkKLXsKLSAgICBEb2N1bWVudEZyYWdtZW50SW1wbCAqY2xvbmUgPSBuZXcgRG9jdW1lbnRG
cmFnbWVudEltcGwoZ2V0RG9jdW1lbnQoKSk7Ci0gICAgaWYgKGRlZXApCi0gICAgICAgIGNsb25l
Q2hpbGROb2RlcyhjbG9uZSk7Ci0gICAgcmV0dXJuIGNsb25lOwotfQotCi0KLS8vIC0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0KK25hbWVzcGFjZSBET00gewogCiBEb2N1bWVudFR5cGVJbXBsOjpEb2N1bWVu
dFR5cGVJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqaSwgRG9jdW1lbnRJbXBsICpkb2MsIGNv
bnN0IERPTVN0cmluZyAmbiwgY29uc3QgRE9NU3RyaW5nICZwLCBjb25zdCBET01TdHJpbmcgJnMp
CiAgICAgOiBOb2RlSW1wbChkb2MpLCBtX2ltcGxlbWVudGF0aW9uKGkpLCBtX25hbWUobiksIG1f
cHVibGljSWQocCksIG1fc3lzdGVtSWQocykKQEAgLTM0MjMsMyArODgsNSBAQCBOb2RlSW1wbCAq
RG9jdW1lbnRUeXBlSW1wbDo6Y2xvbmVOb2RlKGJvCiAgICAgLy8gVGhlIERPTSBMZXZlbCAyIHNw
ZWNpZmljYXRpb24gc2F5cyBjbG9uaW5nIERvY3VtZW50VHlwZSBub2RlcyBpcyAiaW1wbGVtZW50
YXRpb24gZGVwZW5kZW50IiBzbyBmb3Igbm93IHdlIGRvIG5vdCBzdXBwb3J0IGl0LgogICAgIHJl
dHVybiAwOwogfQorCit9OwpJbmRleDoga2h0bWwveG1sL2RvbV90ZXh0aW1wbC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga2h0bWwveG1sL2RvbV90ZXh0aW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysg
a2h0bWwveG1sL2RvbV90ZXh0aW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcg
QEAKICNpbmNsdWRlICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgogI2luY2x1ZGUgInhtbC9kb20y
X2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5jbHVkZSAi
eG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAi
eG1sL0V2ZW50TmFtZXMuaCIKIAogI2luY2x1ZGUgIlJlbmRlclRleHQuaCIKSW5kZXg6IGtodG1s
L3htbC9Eb2N1bWVudEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94bWwvRG9jdW1lbnRJbXBs
LmgJKHJldmlzaW9uIDEyMDE1KQorKysga2h0bWwveG1sL0RvY3VtZW50SW1wbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC0yMiw4ICsyMiw5IEBACiAgKiBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4K
ICAqCiAgKi8KLSNpZm5kZWYgX0RPTV9Eb2N1bWVudEltcGxfaF8KLSNkZWZpbmUgX0RPTV9Eb2N1
bWVudEltcGxfaF8KKworI2lmbmRlZiBET01fRG9jdW1lbnRJbXBsX2gKKyNkZWZpbmUgRE9NX0Rv
Y3VtZW50SW1wbF9oCiAKICNpbmNsdWRlICJ4bWwvZG9tX2VsZW1lbnRpbXBsLmgiCiAjaW5jbHVk
ZSAieG1sL2RvbTJfdHJhdmVyc2FsaW1wbC5oIgpAQCAtNTYsOSArNTcsNyBAQCBuYW1lc3BhY2Ug
a2h0bWwgewogICAgIGNsYXNzIENTU1N0eWxlU2VsZWN0b3I7CiAgICAgc3RydWN0IERhc2hib2Fy
ZFJlZ2lvblZhbHVlOwogICAgIGNsYXNzIERvY0xvYWRlcjsKLSAgICBjbGFzcyBSZW5kZXJJbWFn
ZTsKICAgICBjbGFzcyBUb2tlbml6ZXI7Ci0gICAgY2xhc3MgWE1MSGFuZGxlcjsKIH0KIAogI2lm
bmRlZiBLSFRNTF9OT19YQkwKQEAgLTcyLDE4ICs3MSwxNSBAQCBuYW1lc3BhY2UgRE9NIHsKICAg
ICBjbGFzcyBBdHRySW1wbDsKICAgICBjbGFzcyBDREFUQVNlY3Rpb25JbXBsOwogICAgIGNsYXNz
IENTU1N0eWxlU2hlZXRJbXBsOwotICAgIGNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0
aW9uSW1wbDsKICAgICBjbGFzcyBDb21tZW50SW1wbDsKICAgICBjbGFzcyBEb2N1bWVudEZyYWdt
ZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1bWVudEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRUeXBl
OworICAgIGNsYXNzIERPTUltcGxlbWVudGF0aW9uSW1wbDsKICAgICBjbGFzcyBEb2N1bWVudFR5
cGVJbXBsOwogICAgIGNsYXNzIEVkaXRpbmdUZXh0SW1wbDsKICAgICBjbGFzcyBFbGVtZW50SW1w
bDsKICAgICBjbGFzcyBFbnRpdHlSZWZlcmVuY2VJbXBsOwogICAgIGNsYXNzIEV2ZW50SW1wbDsK
ICAgICBjbGFzcyBFdmVudExpc3RlbmVyOwotICAgIGNsYXNzIEdlbmVyaWNST05hbWVkTm9kZU1h
cEltcGw7CiAgICAgY2xhc3MgSFRNTENvbGxlY3Rpb25JbXBsOwogICAgIGNsYXNzIEhUTUxEb2N1
bWVudEltcGw7CiAgICAgY2xhc3MgSFRNTEVsZW1lbnRJbXBsOwpAQCAtOTIsNyArODgsNiBAQCBu
YW1lc3BhY2UgRE9NIHsKICAgICBjbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbDsKICAgICBjbGFz
cyBIVE1MTWFwRWxlbWVudEltcGw7CiAgICAgY2xhc3MgSlNFZGl0b3I7Ci0gICAgY2xhc3MgTm9k
ZUZpbHRlcjsKICAgICBjbGFzcyBOb2RlRmlsdGVySW1wbDsKICAgICBjbGFzcyBOb2RlSXRlcmF0
b3JJbXBsOwogICAgIGNsYXNzIE5vZGVMaXN0SW1wbDsKQEAgLTEyNSw0OCArMTIwLDggQEAgbmFt
ZXNwYWNlIERPTSB7CiAgICAgICAgIH0KICAgICB9OwogICAgIAotY2xhc3MgRE9NSW1wbGVtZW50
YXRpb25JbXBsIDogcHVibGljIGtodG1sOjpTaGFyZWQ8RE9NSW1wbGVtZW50YXRpb25JbXBsPgot
ewotcHVibGljOgotICAgIERPTUltcGxlbWVudGF0aW9uSW1wbCgpOwotICAgIH5ET01JbXBsZW1l
bnRhdGlvbkltcGwoKTsKLQotICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgRE9N
SW1wbGVtZW50YXRpb24KLSAgICBib29sIGhhc0ZlYXR1cmUoY29uc3QgRE9NU3RyaW5nJiBmZWF0
dXJlLCBjb25zdCBET01TdHJpbmcmIHZlcnNpb24pIGNvbnN0OwotICAgIERvY3VtZW50VHlwZUlt
cGwgKmNyZWF0ZURvY3VtZW50VHlwZSggY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBj
b25zdCBET01TdHJpbmcgJnB1YmxpY0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgRE9NU3RyaW5nICZzeXN0ZW1JZCwgaW50ICZleGNlcHRpb25jb2Rl
ICk7Ci0gICAgRG9jdW1lbnRJbXBsICpjcmVhdGVEb2N1bWVudCggY29uc3QgRE9NU3RyaW5nICZu
YW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwKLSAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFR5cGVJbXBsICpkb2N0eXBlLCBpbnQgJmV4
Y2VwdGlvbmNvZGUgKTsKLQotICAgIERPTUltcGxlbWVudGF0aW9uSW1wbCogZ2V0SW50ZXJmYWNl
KGNvbnN0IERPTVN0cmluZyYgZmVhdHVyZSkgY29uc3Q7Ci0KLSAgICAvLyBGcm9tIHRoZSBET01J
bXBsZW1lbnRhdGlvbkNTUyBpbnRlcmZhY2UKLSAgICBDU1NTdHlsZVNoZWV0SW1wbCAqY3JlYXRl
Q1NTU3R5bGVTaGVldChjb25zdCBET01TdHJpbmcgJnRpdGxlLCBjb25zdCBET01TdHJpbmcgJm1l
ZGlhLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0gICAgLy8gRnJvbSB0aGUgSFRNTERPTUltcGxl
bWVudGF0aW9uIGludGVyZmFjZQotICAgIEhUTUxEb2N1bWVudEltcGwqIGNyZWF0ZUhUTUxEb2N1
bWVudCggY29uc3QgRE9NU3RyaW5nJiB0aXRsZSk7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChu
b3QgcGFydCBvZiBET00pCi0gICAgRG9jdW1lbnRJbXBsICpjcmVhdGVEb2N1bWVudCggS0hUTUxW
aWV3ICp2ID0gMCApOwotICAgIEhUTUxEb2N1bWVudEltcGwgKmNyZWF0ZUhUTUxEb2N1bWVudCgg
S0hUTUxWaWV3ICp2ID0gMCApOwotCi0gICAgLy8gUmV0dXJucyB0aGUgc3RhdGljIGluc3RhbmNl
IG9mIHRoaXMgY2xhc3MgLSBvbmx5IG9uZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHNob3VsZAot
ICAgIC8vIGV2ZXIgYmUgcHJlc2VudCwgYW5kIGlzIHVzZWQgYXMgYSBmYWN0b3J5IG1ldGhvZCBm
b3IgY3JlYXRpbmcgRG9jdW1lbnRJbXBsIG9iamVjdHMKLSAgICBzdGF0aWMgRE9NSW1wbGVtZW50
YXRpb25JbXBsICppbnN0YW5jZSgpOwotICAgIAotICAgIHN0YXRpYyBib29sIGlzWE1MTUlNRVR5
cGUoY29uc3QgRE9NU3RyaW5nJiBtaW1lVHlwZSk7Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0aWMg
RE9NSW1wbGVtZW50YXRpb25JbXBsICptX2luc3RhbmNlOwotfTsKLQotCi0vKioKLSAqIEBpbnRl
cm5hbAotICovCiBjbGFzcyBEb2N1bWVudEltcGwgOiBwdWJsaWMgUU9iamVjdCwgcHVibGljIENv
bnRhaW5lck5vZGVJbXBsCiB7Ci0gICAgUV9PQkpFQ1QKIHB1YmxpYzoKICAgICBEb2N1bWVudElt
cGwoRE9NSW1wbGVtZW50YXRpb25JbXBsICpfaW1wbGVtZW50YXRpb24sIEtIVE1MVmlldyAqdik7
CiAgICAgfkRvY3VtZW50SW1wbCgpOwpAQCAtNjAyLDcgKzU1Nyw3IEBAIHB1YmxpYzoKICAgICB2
b2lkIGluY0RPTVRyZWVWZXJzaW9uKCkgeyArK21fZG9tdHJlZV92ZXJzaW9uOyB9CiAgICAgdW5z
aWduZWQgaW50IGRvbVRyZWVWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbV9kb210cmVlX3ZlcnNp
b247IH0KIAotICAgIHZvaWQgc2V0RG9jVHlwZShEb2N1bWVudFR5cGVJbXBsICpkb2NUeXBlKSB7
IG1fZG9jVHlwZSA9IGRvY1R5cGU7IH0KKyAgICB2b2lkIHNldERvY1R5cGUoRG9jdW1lbnRUeXBl
SW1wbCAqZG9jVHlwZSk7CiAKIHNpZ25hbHM6CiAgICAgdm9pZCBmaW5pc2hlZFBhcnNpbmcoKTsK
QEAgLTgwMyw1OCArNzU4LDYgQEAgcHJpdmF0ZToKICAgICBGb3JtVG9Hcm91cE1hcCogbV9zZWxl
Y3RlZFJhZGlvQnV0dG9uczsKIH07CiAKLWNsYXNzIERvY3VtZW50RnJhZ21lbnRJbXBsIDogcHVi
bGljIENvbnRhaW5lck5vZGVJbXBsCi17Ci1wdWJsaWM6Ci0gICAgRG9jdW1lbnRGcmFnbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBm
cm9tICBwYXJlbnQgY2xhc3NlcwotICAgIHZpcnR1YWwgRE9NU3RyaW5nIG5vZGVOYW1lKCkgY29u
c3Q7Ci0gICAgdmlydHVhbCB1bnNpZ25lZCBzaG9ydCBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZp
cnR1YWwgTm9kZUltcGwgKmNsb25lTm9kZSAoIGJvb2wgZGVlcCApOwotCi0gICAgLy8gT3RoZXIg
bWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIHZpcnR1YWwgYm9vbCBjaGlsZFR5cGVBbGxv
d2VkKCB1bnNpZ25lZCBzaG9ydCB0eXBlICk7Ci0KLSAgICB2aXJ0dWFsIERPTVN0cmluZyB0b1N0
cmluZygpIGNvbnN0OwotfTsKLQotY2xhc3MgRG9jdW1lbnRUeXBlSW1wbCA6IHB1YmxpYyBOb2Rl
SW1wbAotewotcHVibGljOgotICAgIERvY3VtZW50VHlwZUltcGwoRE9NSW1wbGVtZW50YXRpb25J
bXBsICosIERvY3VtZW50SW1wbCAqLCBjb25zdCBET01TdHJpbmcgJm5hbWUsIGNvbnN0IERPTVN0
cmluZyAmcHVibGljSWQsIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQpOwotICAgIERvY3VtZW50
VHlwZUltcGwoRG9jdW1lbnRJbXBsICosIGNvbnN0IERPTVN0cmluZyAmbmFtZSwgY29uc3QgRE9N
U3RyaW5nICZwdWJsaWNJZCwgY29uc3QgRE9NU3RyaW5nICZzeXN0ZW1JZCk7Ci0gICAgRG9jdW1l
bnRUeXBlSW1wbChEb2N1bWVudEltcGwgKiwgY29uc3QgRG9jdW1lbnRUeXBlSW1wbCAmKTsKLQot
ICAgIC8vIERPTSBtZXRob2RzICYgYXR0cmlidXRlcyBmb3IgRG9jdW1lbnRUeXBlCi0gICAgTmFt
ZWROb2RlTWFwSW1wbCAqZW50aXRpZXMoKSBjb25zdCB7IHJldHVybiBtX2VudGl0aWVzLmdldCgp
OyB9Ci0gICAgTmFtZWROb2RlTWFwSW1wbCAqbm90YXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9u
b3RhdGlvbnMuZ2V0KCk7IH0KLQotICAgIERPTVN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4g
bV9uYW1lOyB9Ci0gICAgRE9NU3RyaW5nIHB1YmxpY0lkKCkgY29uc3QgeyByZXR1cm4gbV9wdWJs
aWNJZDsgfQotICAgIERPTVN0cmluZyBzeXN0ZW1JZCgpIGNvbnN0IHsgcmV0dXJuIG1fc3lzdGVt
SWQ7IH0KLSAgICBET01TdHJpbmcgaW50ZXJuYWxTdWJzZXQoKSBjb25zdCB7IHJldHVybiBtX3N1
YnNldDsgfQotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tIHBhcmVudCBjbGFz
c2VzCi0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFs
IHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAq
Y2xvbmVOb2RlKGJvb2wgZGVlcCk7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBv
ZiBET00pCi0gICAgRE9NSW1wbGVtZW50YXRpb25JbXBsICppbXBsZW1lbnRhdGlvbigpIGNvbnN0
IHsgcmV0dXJuIG1faW1wbGVtZW50YXRpb24uZ2V0KCk7IH0KLSAgICB2aXJ0dWFsIERPTVN0cmlu
ZyB0b1N0cmluZygpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFJlZlB0cjxET01JbXBsZW1lbnRh
dGlvbkltcGw+IG1faW1wbGVtZW50YXRpb247Ci0gICAgUmVmUHRyPE5hbWVkTm9kZU1hcEltcGw+
IG1fZW50aXRpZXM7Ci0gICAgUmVmUHRyPE5hbWVkTm9kZU1hcEltcGw+IG1fbm90YXRpb25zOwot
Ci0gICAgRE9NU3RyaW5nIG1fbmFtZTsKLSAgICBET01TdHJpbmcgbV9wdWJsaWNJZDsKLSAgICBE
T01TdHJpbmcgbV9zeXN0ZW1JZDsKLSAgICBET01TdHJpbmcgbV9zdWJzZXQ7Ci19OwotCiB9IC8v
bmFtZXNwYWNlCiAKICNlbmRpZgpJbmRleDoga2h0bWwveG1sL2RvbTJfdHJhdmVyc2FsaW1wbC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwveG1sL2RvbTJfdHJhdmVyc2FsaW1wbC5jcHAJKHJldmlz
aW9uIDEyMDIxKQorKysga2h0bWwveG1sL2RvbTJfdHJhdmVyc2FsaW1wbC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTI1LDcgKzI1LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJ4
bWwvZG9tMl90cmF2ZXJzYWxpbXBsLmgiCiAjaW5jbHVkZSAiZG9tL2RvbV9leGNlcHRpb24uaCIK
LSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIK
IAogbmFtZXNwYWNlIERPTSB7CiAKSW5kZXg6IGtodG1sL3htbC9kb20yX2V2ZW50c2ltcGwuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb20yX2V2ZW50c2ltcGwuY3BwCShyZXZpc2lvbiAx
MjAyMSkKKysrIGtodG1sL3htbC9kb20yX2V2ZW50c2ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yOSw3ICsyOSw3IEBACiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9sYXllci5oIgogI2lu
Y2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfdmlld3NpbXBsLmgi
Ci0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgi
CiAKIHVzaW5nIG5hbWVzcGFjZSBraHRtbDsKIApJbmRleDoga2h0bWwveG1sL0RPTUltcGxlbWVu
dGF0aW9uSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9ET01JbXBsZW1lbnRhdGlvbklt
cGwuaAkocmV2aXNpb24gMTIwMTUpCisrKyBraHRtbC94bWwvRE9NSW1wbGVtZW50YXRpb25JbXBs
LmgJKHdvcmtpbmcgY29weSkKQEAgLTIyLDEwOSArMjIsMjEgQEAKICAqIEJvc3RvbiwgTUEgMDIx
MTEtMTMwNywgVVNBLgogICoKICAqLwotI2lmbmRlZiBfRE9NX0RvY3VtZW50SW1wbF9oXwotI2Rl
ZmluZSBfRE9NX0RvY3VtZW50SW1wbF9oXworI2lmbmRlZiBET01fRE9NSW1wbGVtZW50YXRpb25J
bXBsX2gKKyNkZWZpbmUgRE9NX0RPTUltcGxlbWVudGF0aW9uSW1wbF9oCiAKLSNpbmNsdWRlICJ4
bWwvZG9tX2VsZW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfdHJhdmVyc2FsaW1wbC5o
IgogI2luY2x1ZGUgIm1pc2Mvc2hhcmVkLmgiCiAKLSNpbmNsdWRlIDxxc3RyaW5nbGlzdC5oPgot
I2luY2x1ZGUgPHFwdHJsaXN0Lmg+Ci0jaW5jbHVkZSA8cW9iamVjdC5oPgotI2luY2x1ZGUgPHFk
aWN0Lmg+Ci0jaW5jbHVkZSA8cXB0cmRpY3QuaD4KLSNpbmNsdWRlIDxxbWFwLmg+Ci0jaW5jbHVk
ZSA8cWRhdGV0aW1lLmg+Ci0KLSNpbmNsdWRlIDxrdXJsLmg+Ci0KLSNpbmNsdWRlICJLV1FTaWdu
YWwuaCIKLSNpbmNsdWRlICJkZWNvZGVyLmgiCi0KLSNpbmNsdWRlIDxreG1sY29yZS9IYXNoTWFw
Lmg+Ci0KLWNsYXNzIFFQYWludERldmljZTsKLWNsYXNzIFFQYWludERldmljZU1ldHJpY3M7CiBj
bGFzcyBLSFRNTFZpZXc7Ci1jbGFzcyBGcmFtZTsKLWNsYXNzIFJlbmRlckFyZW5hOwogCi1jbGFz
cyBLV1FBY2NPYmplY3RDYWNoZTsKK25hbWVzcGFjZSBET00gewogCi1uYW1lc3BhY2Uga2h0bWwg
ewotICAgIGNsYXNzIENTU1N0eWxlU2VsZWN0b3I7Ci0gICAgc3RydWN0IERhc2hib2FyZFJlZ2lv
blZhbHVlOwotICAgIGNsYXNzIERvY0xvYWRlcjsKLSAgICBjbGFzcyBSZW5kZXJJbWFnZTsKLSAg
ICBjbGFzcyBUb2tlbml6ZXI7Ci0gICAgY2xhc3MgWE1MSGFuZGxlcjsKLX0KLQotI2lmbmRlZiBL
SFRNTF9OT19YQkwKLW5hbWVzcGFjZSBYQkwgewotICAgIGNsYXNzIFhCTEJpbmRpbmdNYW5hZ2Vy
OwotfQotI2VuZGlmCitjbGFzcyBET01TdHJpbmc7CitjbGFzcyBDU1NTdHlsZVNoZWV0SW1wbDsK
K2NsYXNzIERvY3VtZW50SW1wbDsKK2NsYXNzIERvY3VtZW50VHlwZUltcGw7CitjbGFzcyBIVE1M
RG9jdW1lbnRJbXBsOwogCi1uYW1lc3BhY2UgRE9NIHsKLSAgICBjbGFzcyBBYnN0cmFjdFZpZXdJ
bXBsOwotICAgIGNsYXNzIEF0dHJJbXBsOwotICAgIGNsYXNzIENEQVRBU2VjdGlvbkltcGw7Ci0g
ICAgY2xhc3MgQ1NTU3R5bGVTaGVldEltcGw7Ci0gICAgY2xhc3MgQ1NTTWFwcGVkQXR0cmlidXRl
RGVjbGFyYXRpb25JbXBsOwotICAgIGNsYXNzIENvbW1lbnRJbXBsOwotICAgIGNsYXNzIERvY3Vt
ZW50RnJhZ21lbnRJbXBsOwotICAgIGNsYXNzIERvY3VtZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1
bWVudFR5cGU7Ci0gICAgY2xhc3MgRG9jdW1lbnRUeXBlSW1wbDsKLSAgICBjbGFzcyBFZGl0aW5n
VGV4dEltcGw7Ci0gICAgY2xhc3MgRWxlbWVudEltcGw7Ci0gICAgY2xhc3MgRW50aXR5UmVmZXJl
bmNlSW1wbDsKLSAgICBjbGFzcyBFdmVudEltcGw7Ci0gICAgY2xhc3MgRXZlbnRMaXN0ZW5lcjsK
LSAgICBjbGFzcyBHZW5lcmljUk9OYW1lZE5vZGVNYXBJbXBsOwotICAgIGNsYXNzIEhUTUxDb2xs
ZWN0aW9uSW1wbDsKLSAgICBjbGFzcyBIVE1MRG9jdW1lbnRJbXBsOwotICAgIGNsYXNzIEhUTUxF
bGVtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MRm9ybUVsZW1lbnRJbXBsOwotICAgIGNsYXNzIEhU
TUxJbWFnZUxvYWRlcjsKLSAgICBjbGFzcyBIVE1MSW5wdXRFbGVtZW50SW1wbDsKLSAgICBjbGFz
cyBIVE1MTWFwRWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSlNFZGl0b3I7Ci0gICAgY2xhc3MgTm9k
ZUZpbHRlcjsKLSAgICBjbGFzcyBOb2RlRmlsdGVySW1wbDsKLSAgICBjbGFzcyBOb2RlSXRlcmF0
b3JJbXBsOwotICAgIGNsYXNzIE5vZGVMaXN0SW1wbDsKLSAgICBjbGFzcyBQcm9jZXNzaW5nSW5z
dHJ1Y3Rpb25JbXBsOwotICAgIGNsYXNzIFJhbmdlSW1wbDsKLSAgICBjbGFzcyBSZWdpc3RlcmVk
RXZlbnRMaXN0ZW5lcjsKLSAgICBjbGFzcyBTdHlsZVNoZWV0SW1wbDsKLSAgICBjbGFzcyBTdHls
ZVNoZWV0TGlzdEltcGw7Ci0gICAgY2xhc3MgVGV4dEltcGw7Ci0gICAgY2xhc3MgVHJlZVdhbGtl
ckltcGw7Ci0KLSAgICAvLyBBIHJhbmdlIG9mIGEgbm9kZSB3aXRoaW4gYSBkb2N1bWVudCB0aGF0
IGlzICJtYXJrZWQiLCBzdWNoIGFzIGJlaW5nIG1pc3NwZWxsZWQKLSAgICBzdHJ1Y3QgRG9jdW1l
bnRNYXJrZXIKLSAgICB7Ci0gICAgICAgIGVudW0gTWFya2VyVHlwZSB7Ci0gICAgICAgICAgICBB
bGxNYXJrZXJzID0gLTEsCi0gICAgICAgICAgICBTcGVsbGluZyA9IDAKLSAgICAgICAgICAgIC8v
IE5vdCBkb2luZyBncmFtbWFyIHlldCwgYnV0IHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgaXQK
LSAgICAgICAgICAgIC8vIEdyYW1tYXIKLSAgICAgICAgfTsKLSAgICAgICAgCi0gICAgICAgIGVu
dW0gTWFya2VyVHlwZSB0eXBlOwotICAgICAgICB1bnNpZ25lZCBzdGFydE9mZnNldCwgZW5kT2Zm
c2V0OwotICAgICAgICAKLSAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgRG9jdW1lbnRN
YXJrZXIgJm8pIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVybiB0eXBlID09IG8udHlwZSAmJiBz
dGFydE9mZnNldCA9PSBvLnN0YXJ0T2Zmc2V0ICYmIGVuZE9mZnNldCA9PSBvLmVuZE9mZnNldDsK
LSAgICAgICAgfQotICAgICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBEb2N1bWVudE1hcmtl
ciAmbykgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gbyk7Ci0gICAgICAg
IH0KLSAgICB9OwotICAgIAogY2xhc3MgRE9NSW1wbGVtZW50YXRpb25JbXBsIDogcHVibGljIGto
dG1sOjpTaGFyZWQ8RE9NSW1wbGVtZW50YXRpb25JbXBsPgogewogcHVibGljOgpAQCAtMTYwLDcw
MSArNzIsNiBAQCBwcm90ZWN0ZWQ6CiAgICAgc3RhdGljIERPTUltcGxlbWVudGF0aW9uSW1wbCAq
bV9pbnN0YW5jZTsKIH07CiAKLQotLyoqCi0gKiBAaW50ZXJuYWwKLSAqLwotY2xhc3MgRG9jdW1l
bnRJbXBsIDogcHVibGljIFFPYmplY3QsIHB1YmxpYyBDb250YWluZXJOb2RlSW1wbAotewotICAg
IFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgRG9jdW1lbnRJbXBsKERPTUltcGxlbWVudGF0aW9uSW1w
bCAqX2ltcGxlbWVudGF0aW9uLCBLSFRNTFZpZXcgKnYpOwotICAgIH5Eb2N1bWVudEltcGwoKTsK
LQotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkTGFzdFJlZigpOwotCi0gICAgLy8gTm9kZXMgYmVs
b25naW5nIHRvIHRoaXMgZG9jdW1lbnQgaG9sZCAic2VsZi1vbmx5IiByZWZlcmVuY2VzIC0KLSAg
ICAvLyB0aGVzZSBhcmUgZW5vdWdoIHRvIGtlZXAgdGhlIGRvY3VtZW50IGZyb20gYmVpbmcgZGVz
dHJveWVkLCBidXQKLSAgICAvLyBub3QgZW5vdWdoIHRvIGtlZXAgaXQgZnJvbSByZW1vdmluZyBp
dHMgY2hpbGRyZW4uIFRoaXMgYWxsb3dzIGEKLSAgICAvLyBub2RlIHRoYXQgb3V0bGl2ZXMgaXRz
IGRvY3VtZW50IHRvIHN0aWxsIGhhdmUgYSB2YWxpZCBkb2N1bWVudAotICAgIC8vIHBvaW50ZXIg
d2l0aG91dCBpbnRyb2R1Y2luZyByZWZlcmVuY2UgY3ljbGVzCi0KLSAgICB2b2lkIHNlbGZPbmx5
UmVmKCkgeyArK21fc2VsZk9ubHlSZWZDb3VudDsgfQotICAgIHZvaWQgc2VsZk9ubHlEZXJlZigp
IHsKLSAgICAgICAgLS1tX3NlbGZPbmx5UmVmQ291bnQ7Ci0gICAgICAgIGlmICghbV9zZWxmT25s
eVJlZkNvdW50ICYmICFyZWZDb3VudCgpKQotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAg
fQotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBEb2N1bWVudAotCi0gICAg
dmlydHVhbCBEb2N1bWVudFR5cGVJbXBsICpkb2N0eXBlKCkgY29uc3Q7IC8vIHJldHVybnMgMCBm
b3IgSFRNTCBkb2N1bWVudHMKLSAgICBEb2N1bWVudFR5cGVJbXBsICpyZWFsRG9jVHlwZSgpIGNv
bnN0IHsgcmV0dXJuIG1fZG9jVHlwZS5nZXQoKTsgfQotCi0gICAgRE9NSW1wbGVtZW50YXRpb25J
bXBsICppbXBsZW1lbnRhdGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmRv
Y3VtZW50RWxlbWVudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmNyZWF0ZUVs
ZW1lbnQoY29uc3QgRE9NU3RyaW5nICZ0YWdOYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAg
IERvY3VtZW50RnJhZ21lbnRJbXBsICpjcmVhdGVEb2N1bWVudEZyYWdtZW50ICgpOwotICAgIFRl
eHRJbXBsICpjcmVhdGVUZXh0Tm9kZSAoIGNvbnN0IERPTVN0cmluZyAmZGF0YSApOwotICAgIENv
bW1lbnRJbXBsICpjcmVhdGVDb21tZW50ICggY29uc3QgRE9NU3RyaW5nICZkYXRhICk7Ci0gICAg
Q0RBVEFTZWN0aW9uSW1wbCAqY3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0
YSwgaW50ICZleGNlcHRpb24pOwotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgKmNyZWF0
ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjb25zdCBET01TdHJpbmcgJnRhcmdldCwgY29uc3QgRE9N
U3RyaW5nICZkYXRhLCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgQXR0ckltcGwgKmNyZWF0ZUF0dHJp
YnV0ZShjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uKSB7IHJldHVybiBjcmVh
dGVBdHRyaWJ1dGVOUyhET01TdHJpbmcoKSwgbmFtZSwgZXhjZXB0aW9uKTsgfQotICAgIEF0dHJJ
bXBsICpjcmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29u
c3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgRW50aXR5
UmVmZXJlbmNlSW1wbCAqY3JlYXRlRW50aXR5UmVmZXJlbmNlKGNvbnN0IERPTVN0cmluZyAmbmFt
ZSwgaW50ICZleGNlcHRpb25Db2RlKTsKLSAgICBOb2RlSW1wbCAqaW1wb3J0Tm9kZSggTm9kZUlt
cGwgKmltcG9ydGVkTm9kZSwgYm9vbCBkZWVwLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2
aXJ0dWFsIEVsZW1lbnRJbXBsICpjcmVhdGVFbGVtZW50TlMoY29uc3QgRE9NU3RyaW5nICZfbmFt
ZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJl9xdWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlv
bmNvZGUpOwotICAgIEVsZW1lbnRJbXBsICpnZXRFbGVtZW50QnlJZCAoIGNvbnN0IERPTVN0cmlu
ZyAmZWxlbWVudElkICkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnRGcm9tUG9pbnQg
KCBjb25zdCBpbnQgX3gsIGNvbnN0IGludCBfeSApIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmFk
b3B0Tm9kZShOb2RlSW1wbCAqc291cmNlLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIAotICAg
IFJlZlB0cjxOYW1lTm9kZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5TmFtZShjb25zdCBET01TdHJp
bmcgJmVsZW1lbnROYW1lKTsKLQotICAgIC8vIEFjdHVhbGx5IHBhcnQgb2YgSFRNTERvY3VtZW50
LCBidXQgdXNlZCBmb3IgZ2l2aW5nIFhNTCBkb2N1bWVudHMgYSB3aW5kb3cgdGl0bGUgYXMgd2Vs
bAotICAgIERPTVN0cmluZyB0aXRsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGl0bGU7IH0KLSAgICB2
b2lkIHNldFRpdGxlKERPTVN0cmluZywgTm9kZUltcGwgKnRpdGxlRWxlbWVudCA9IDApOwotICAg
IHZvaWQgcmVtb3ZlVGl0bGUoTm9kZUltcGwgKnRpdGxlRWxlbWVudCk7Ci0KLSAgICBSZWZQdHI8
SFRNTENvbGxlY3Rpb25JbXBsPiBpbWFnZXMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25J
bXBsPiBlbWJlZHMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBhcHBsZXRzKCk7
Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gbGlua3MoKTsKLSAgICBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPiBmb3JtcygpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+
IGFuY2hvcnMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBhbGwoKTsKLSAgICBS
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvYmplY3RzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uSW1wbD4gd2luZG93TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpOwotICAgIFJlZlB0
cjxIVE1MQ29sbGVjdGlvbkltcGw+IGRvY3VtZW50TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUp
OwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3Nlcwot
Ci0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVu
c2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChu
b3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGlzRG9jdW1lbnROb2RlKCkgY29uc3Qg
eyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0hUTUxEb2N1bWVudCgpIGNvbnN0
IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBraHRtbDo6Q1NTU3R5bGVTZWxlY3RvciAqc3R5bGVT
ZWxlY3RvcigpIHsgcmV0dXJuIG1fc3R5bGVTZWxlY3RvcjsgfQotCi0gICAgRWxlbWVudEltcGwg
KkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KCBjb25zdCBET01TdHJpbmcgJmtl
eSApOwotICAgIAotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHBlbmRpbmcgc2hlZXQgY291
bnQgYW5kIHRoZW4gY2FsbHMgdXBkYXRlU3R5bGVTZWxlY3Rvci4KLSAgICAgKi8KLSAgICB2b2lk
IHN0eWxlc2hlZXRMb2FkZWQoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVy
bnMgdHJ1ZSBpZiBhbGwgdG9wLWxldmVsIHN0eWxlc2hlZXRzIGhhdmUgbG9hZGVkIChpbmNsdWRp
bmcKLSAgICAgKiBhbnkgQGltcG9ydHMgdGhhdCB0aGV5IG1heSBiZSBsb2FkaW5nKS4KLSAgICAg
Ki8KLSAgICBib29sIGhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpIHsgcmV0dXJuIG1fcGVuZGluZ1N0
eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7IH0KLQotICAgIC8q
KgotICAgICAqIEluY3JlbWVudHMgdGhlIG51bWJlciBvZiBwZW5kaW5nIHNoZWV0cy4gIFRoZSA8
bGluaz4gZWxlbWVudHMKLSAgICAgKiBpbnZva2UgdGhpcyB0byBhZGQgdGhlbXNlbHZlcyB0byB0
aGUgbG9hZGluZyBsaXN0LgotICAgICAqLwotICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBt
X3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBv
bmUgb3IgbW9yZSBzdHlsZXNoZWV0cyBpbiB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBhZGRl
ZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzdHls
ZSBzZWxlY3RvciBhbmQgYXNzaWduIGl0IHRvIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgZG9uZSBi
eSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgbm9kZXMgaW4KLSAgICAgKiBkb2N1bWVudCAob3IgdGhv
c2UgYmVmb3JlIDxCT0RZPiBpbiBhIEhUTUwgZG9jdW1lbnQpLCBzZWFyY2hpbmcgZm9yIHN0eWxl
c2hlZXRzLiBTdHlsZXNoZWV0cyBjYW4gYmUgY29udGFpbmVkIGluCi0gICAgICogPExJTks+LCA8
U1RZTEU+IG9yIDxCT0RZPiBlbGVtZW50cywgYXMgd2VsbCBhcyBwcm9jZXNzaW5nIGluc3RydWN0
aW9ucyAoWE1MIGRvY3VtZW50cyBvbmx5KS4gQSBsaXN0IGlzCi0gICAgICogY29uc3RydWN0ZWQg
ZnJvbSB0aGVzZSB3aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYSBuZXcgc3R5bGUgc2VsZWN0
b3Igd2hpY2ggY29sbGF0ZXMgYWxsIG9mIHRoZSBzdHlsZXNoZWV0cwotICAgICAqIGZvdW5kIGFu
ZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGVyaXZlZCBzdHlsZXMgZm9yIGFsbCByZW5kZXJp
bmcgb2JqZWN0cy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLQot
ICAgIHZvaWQgcmVjYWxjU3R5bGVTZWxlY3RvcigpOwotCi0gICAgYm9vbCB1c2VzRGVzY2VuZGFu
dFJ1bGVzKCkgeyByZXR1cm4gbV91c2VzRGVzY2VuZGFudFJ1bGVzOyB9Ci0gICAgdm9pZCBzZXRV
c2VzRGVzY2VuZGFudFJ1bGVzKGJvb2wgYikgeyBtX3VzZXNEZXNjZW5kYW50UnVsZXMgPSBiOyB9
Ci0gICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkgeyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVz
OyB9Ci0gICAgdm9pZCBzZXRVc2VzU2libGluZ1J1bGVzKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5n
UnVsZXMgPSBiOyB9XAotCi0gICAgUVN0cmluZyBuZXh0U3RhdGUoKTsKLQotICAgIC8vIFF1ZXJ5
IGFsbCByZWdpc3RlcmVkIGVsZW1lbnRzIGZvciB0aGVpciBzdGF0ZQotICAgIFFTdHJpbmdMaXN0
IGRvY1N0YXRlKCk7Ci0gICAgdm9pZCByZWdpc3Rlck1haW50YWluc1N0YXRlKE5vZGVJbXBsKiBl
KSB7IG1fbWFpbnRhaW5zU3RhdGUuYXBwZW5kKGUpOyB9Ci0gICAgdm9pZCBkZXJlZ2lzdGVyTWFp
bnRhaW5zU3RhdGUoTm9kZUltcGwqIGUpIHsgbV9tYWludGFpbnNTdGF0ZS5yZW1vdmVSZWYoZSk7
IH0KLQotICAgIC8vIFNldCB0aGUgc3RhdGUgdGhlIGRvY3VtZW50IHNob3VsZCByZXN0b3JlIHRv
Ci0gICAgdm9pZCBzZXRSZXN0b3JlU3RhdGUoIGNvbnN0IFFTdHJpbmdMaXN0ICZzKSB7IG1fc3Rh
dGUgPSBzOyB9Ci0gICAgUVN0cmluZ0xpc3QgJnJlc3RvcmVTdGF0ZSggKSB7IHJldHVybiBtX3N0
YXRlOyB9Ci0KLSAgICBLSFRNTFZpZXcgKnZpZXcoKSBjb25zdCB7IHJldHVybiBtX3ZpZXc7IH0K
LSAgICBGcmFtZSAqZnJhbWUoKSBjb25zdDsKLQotICAgIFJhbmdlSW1wbCAqY3JlYXRlUmFuZ2Uo
KTsKLQotICAgIE5vZGVJdGVyYXRvckltcGwgKmNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlSW1wbCAq
cm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywKLSAgICAgICAgTm9kZUZpbHRlckltcGwgKmZpbHRl
ciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0g
ICAgVHJlZVdhbGtlckltcGwgKmNyZWF0ZVRyZWVXYWxrZXIoTm9kZUltcGwgKnJvb3QsIHVuc2ln
bmVkIHdoYXRUb1Nob3csIAotICAgICAgICBOb2RlRmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4
cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAmZXhjZXB0aW9uY29kZSk7Ci0KLSAgICAvLyBTcGVj
aWFsIHN1cHBvcnQgZm9yIGVkaXRpbmcKLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqY3Jl
YXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotICAgIEVkaXRpbmdUZXh0SW1wbCAqY3JlYXRlRWRp
dGluZ1RleHROb2RlKGNvbnN0IERPTVN0cmluZyAmdGV4dCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
cmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9DaGFuZ2UgKTsKLSAgICBzdGF0aWMgUVB0ckxp
c3Q8RG9jdW1lbnRJbXBsPiAqIGNoYW5nZWREb2N1bWVudHM7Ci0gICAgdmlydHVhbCB2b2lkIHVw
ZGF0ZVJlbmRlcmluZygpOwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCk7Ci0gICAgdm9pZCB1cGRh
dGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKLSAgICBzdGF0aWMgdm9pZCB1cGRh
dGVEb2N1bWVudHNSZW5kZXJpbmcoKTsKLSAgICBraHRtbDo6RG9jTG9hZGVyICpkb2NMb2FkZXIo
KSB7IHJldHVybiBtX2RvY0xvYWRlcjsgfQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwot
ICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQotICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVu
YSgpIHsgcmV0dXJuIG1fcmVuZGVyQXJlbmE7IH0KLQotICAgIEtXUUFjY09iamVjdENhY2hlKiBn
ZXRBY2NPYmplY3RDYWNoZSgpOwotICAgIAotICAgIC8vIHRvIGdldCB2aXN1YWxseSBvcmRlcmVk
IGhlYnJldyBhbmQgYXJhYmljIHBhZ2VzIHJpZ2h0Ci0gICAgdm9pZCBzZXRWaXN1YWxseU9yZGVy
ZWQoKTsKLQotICAgIHZvaWQgdXBkYXRlU2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgdm9pZCBvcGVu
KCk7Ci0gICAgdm9pZCBpbXBsaWNpdE9wZW4oKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdm9p
ZCBpbXBsaWNpdENsb3NlKCk7Ci0gICAgdm9pZCB3cml0ZSAoIGNvbnN0IERPTVN0cmluZyAmdGV4
dCApOwotICAgIHZvaWQgd3JpdGUgKCBjb25zdCBRU3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCB3
cml0ZWxuICggY29uc3QgRE9NU3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCBmaW5pc2hQYXJzaW5n
ICggICk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0gICAgUVN0cmluZyBVUkwoKSBjb25zdCB7IHJl
dHVybiBtX3VybC5pc0VtcHR5KCkgPyAiYWJvdXQ6YmxhbmsiIDogbV91cmw7IH0KLSAgICB2b2lk
IHNldFVSTChjb25zdCBRU3RyaW5nJiB1cmwpOwotCi0gICAgUVN0cmluZyBiYXNlVVJMKCkgY29u
c3QgeyByZXR1cm4gbV9iYXNlVVJMLmlzRW1wdHkoKSA/IFVSTCgpIDogbV9iYXNlVVJMOyB9Ci0g
ICAgdm9pZCBzZXRCYXNlVVJMKGNvbnN0IFFTdHJpbmcmIGJhc2VVUkwpIHsgbV9iYXNlVVJMID0g
YmFzZVVSTDsgfQotCi0gICAgUVN0cmluZyBiYXNlVGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9i
YXNlVGFyZ2V0OyB9Ci0gICAgdm9pZCBzZXRCYXNlVGFyZ2V0KGNvbnN0IFFTdHJpbmcmIGJhc2VU
YXJnZXQpIHsgbV9iYXNlVGFyZ2V0ID0gYmFzZVRhcmdldDsgfQotCi0gICAgUVN0cmluZyBjb21w
bGV0ZVVSTChjb25zdCBRU3RyaW5nICYpOwotICAgIERPTVN0cmluZyBjb21wbGV0ZVVSTChjb25z
dCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBmcm9tIGNhY2hlZE9iamVjdENsaWVudAotICAgIHZp
cnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBET01T
dHJpbmcgJnNoZWV0U3RyKTsKLSAgICB2b2lkIHNldFVzZXJTdHlsZVNoZWV0KGNvbnN0IFFTdHJp
bmcmIHNoZWV0KTsKLSAgICBRU3RyaW5nIHVzZXJTdHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4g
bV91c2Vyc2hlZXQ7IH0KLSAgICB2b2lkIHNldFByaW50U3R5bGVTaGVldChjb25zdCBRU3RyaW5n
JiBzaGVldCkgeyBtX3ByaW50U2hlZXQgPSBzaGVldDsgfQotICAgIFFTdHJpbmcgcHJpbnRTdHls
ZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9wcmludFNoZWV0OyB9Ci0KLSAgICBDU1NTdHlsZVNo
ZWV0SW1wbCogZWxlbWVudFNoZWV0KCk7Ci0gICAgdmlydHVhbCBraHRtbDo6VG9rZW5pemVyICpj
cmVhdGVUb2tlbml6ZXIoKTsKLSAgICBraHRtbDo6VG9rZW5pemVyICp0b2tlbml6ZXIoKSB7IHJl
dHVybiBtX3Rva2VuaXplcjsgfQotICAgIAotICAgIFFQYWludERldmljZU1ldHJpY3MgKnBhaW50
RGV2aWNlTWV0cmljcygpIHsgcmV0dXJuIG1fcGFpbnREZXZpY2VNZXRyaWNzOyB9Ci0gICAgUVBh
aW50RGV2aWNlICpwYWludERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFpbnREZXZpY2U7IH0K
LSAgICB2b2lkIHNldFBhaW50RGV2aWNlKCBRUGFpbnREZXZpY2UgKmRldiApOwotCi0gICAgZW51
bSBIVE1MTW9kZSB7Ci0gICAgICAgIEh0bWwzLAotICAgICAgICBIdG1sNCwKLSAgICAgICAgWEh0
bWwKLSAgICB9OwotCi0gICAgZW51bSBQYXJzZU1vZGUgewotICAgICAgICBDb21wYXQsCi0gICAg
ICAgIEFsbW9zdFN0cmljdCwKLSAgICAgICAgU3RyaWN0Ci0gICAgfTsKLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgZGV0ZXJtaW5lUGFyc2VNb2RlKCBjb25zdCBRU3RyaW5nICZzdHIgKTsKLSAgICB2
b2lkIHNldFBhcnNlTW9kZSggUGFyc2VNb2RlIG0gKSB7IHBNb2RlID0gbTsgfQotICAgIFBhcnNl
TW9kZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVybiBwTW9kZTsgfQotCi0gICAgYm9vbCBpbkNv
bXBhdE1vZGUoKSB7IHJldHVybiBwTW9kZSA9PSBDb21wYXQ7IH0KLSAgICBib29sIGluQWxtb3N0
U3RyaWN0TW9kZSgpIHsgcmV0dXJuIHBNb2RlID09IEFsbW9zdFN0cmljdDsgfQotICAgIGJvb2wg
aW5TdHJpY3RNb2RlKCkgeyByZXR1cm4gcE1vZGUgPT0gU3RyaWN0OyB9Ci0gICAgCi0gICAgdm9p
ZCBzZXRIVE1MTW9kZSggSFRNTE1vZGUgbSApIHsgaE1vZGUgPSBtOyB9Ci0gICAgSFRNTE1vZGUg
aHRtbE1vZGUoKSBjb25zdCB7IHJldHVybiBoTW9kZTsgfQotCi0gICAgdm9pZCBzZXRQYXJzaW5n
KGJvb2wgYik7Ci0gICAgYm9vbCBwYXJzaW5nKCkgY29uc3QgeyByZXR1cm4gbV9iUGFyc2luZzsg
fQotICAgIGludCBtaW5pbXVtTGF5b3V0RGVsYXkoKTsKLSAgICBib29sIHNob3VsZFNjaGVkdWxl
TGF5b3V0KCk7Ci0gICAgaW50IGVsYXBzZWRUaW1lKCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBz
ZXRUZXh0Q29sb3IoIFFDb2xvciBjb2xvciApIHsgbV90ZXh0Q29sb3IgPSBjb2xvcjsgfQotICAg
IFFDb2xvciB0ZXh0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3RleHRDb2xvcjsgfQotCi0gICAg
Y29uc3QgUUNvbG9yJiBsaW5rQ29sb3IoKSBjb25zdCB7IHJldHVybiBtX2xpbmtDb2xvcjsgfQot
ICAgIGNvbnN0IFFDb2xvciYgdmlzaXRlZExpbmtDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdmlz
aXRlZExpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFDb2xvciYgYWN0aXZlTGlua0NvbG9yKCkgY29u
c3QgeyByZXR1cm4gbV9hY3RpdmVMaW5rQ29sb3I7IH0KLSAgICB2b2lkIHNldExpbmtDb2xvcihj
b25zdCBRQ29sb3ImIGMpIHsgbV9saW5rQ29sb3IgPSBjOyB9Ci0gICAgdm9pZCBzZXRWaXNpdGVk
TGlua0NvbG9yKGNvbnN0IFFDb2xvciYgYykgeyBtX3Zpc2l0ZWRMaW5rQ29sb3IgPSBjOyB9Ci0g
ICAgdm9pZCBzZXRBY3RpdmVMaW5rQ29sb3IoY29uc3QgUUNvbG9yJiBjKSB7IG1fYWN0aXZlTGlu
a0NvbG9yID0gYzsgfQotICAgIHZvaWQgcmVzZXRMaW5rQ29sb3IoKTsKLSAgICB2b2lkIHJlc2V0
VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHZvaWQgcmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAg
ICAKLSAgICBib29sIHByZXBhcmVNb3VzZUV2ZW50KGJvb2wgcmVhZG9ubHksIGludCB4LCBpbnQg
eSwgTW91c2VFdmVudCogZXYpOwotICAgIGJvb2wgcHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFk
b25seSwgYm9vbCBhY3RpdmUsIGludCB4LCBpbnQgeSwgTW91c2VFdmVudCAqZXYpOwotCi0gICAg
dmlydHVhbCBib29sIGNoaWxkQWxsb3dlZCggTm9kZUltcGwgKm5ld0NoaWxkICk7Ci0gICAgdmly
dHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlICk7Ci0g
ICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2RlICggYm9vbCBkZWVwICk7Ci0KLSAgICBTdHls
ZVNoZWV0TGlzdEltcGwqIHN0eWxlU2hlZXRzKCk7Ci0KLSAgICAvKiBOZXdseSBwcm9wb3NlZCBD
U1MzIG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIGFsdGVybmF0ZQotICAgICAgIHN0eWxlc2hlZXRz
IHVzaW5nIHRoZSBET00uIE1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZSBhcwotICAgICAgIHNwZWMg
bWF0dXJlcy4gLSBkd2gKLSAgICAqLwotICAgIERPTVN0cmluZyBwcmVmZXJyZWRTdHlsZXNoZWV0
U2V0KCk7Ci0gICAgRE9NU3RyaW5nIHNlbGVjdGVkU3R5bGVzaGVldFNldCgpOwotICAgIHZvaWQg
c2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0IERPTVN0cmluZyYgYVN0cmluZyk7Ci0KLSAg
ICBRU3RyaW5nTGlzdCBhdmFpbGFibGVTdHlsZVNoZWV0cygpIGNvbnN0OwotCi0gICAgTm9kZUlt
cGwgKmZvY3VzTm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9jdXNOb2RlLmdldCgpOyB9Ci0gICAg
Ym9vbCBzZXRGb2N1c05vZGUoTm9kZUltcGwgKm5ld0ZvY3VzTm9kZSk7Ci0gICAgdm9pZCBjbGVh
clNlbGVjdGlvbklmTmVlZGVkKE5vZGVJbXBsICpuZXdGb2N1c05vZGUpOwotCi0gICAgTm9kZUlt
cGwgKmhvdmVyTm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1faG92ZXJOb2RlLmdldCgpOyB9Ci0gICAg
dm9pZCBzZXRIb3Zlck5vZGUoTm9kZUltcGwgKm5ld0hvdmVyTm9kZSk7Ci0gICAgCi0gICAgTm9k
ZUltcGwgKmFjdGl2ZU5vZGUoKSBjb25zdCB7IHJldHVybiBtX2FjdGl2ZU5vZGUuZ2V0KCk7IH0K
LSAgICB2b2lkIHNldEFjdGl2ZU5vZGUoTm9kZUltcGwgKm5ld0FjdGl2ZU5vZGUpOwotCi0gICAg
Ly8gVXBkYXRlcyBmb3IgOnRhcmdldCAoQ1NTMyBzZWxlY3RvcikuCi0gICAgdm9pZCBzZXRDU1NU
YXJnZXQoTm9kZUltcGwqIG4pOwotICAgIE5vZGVJbXBsKiBnZXRDU1NUYXJnZXQoKTsKLSAgICAK
LSAgICB2b2lkIHNldERvY3VtZW50Q2hhbmdlZChib29sKTsKLQotICAgIHZvaWQgYXR0YWNoTm9k
ZUl0ZXJhdG9yKE5vZGVJdGVyYXRvckltcGwgKm5pKTsKLSAgICB2b2lkIGRldGFjaE5vZGVJdGVy
YXRvcihOb2RlSXRlcmF0b3JJbXBsICpuaSk7Ci0gICAgdm9pZCBub3RpZnlCZWZvcmVOb2RlUmVt
b3ZhbChOb2RlSW1wbCAqbik7Ci0gICAgQWJzdHJhY3RWaWV3SW1wbCAqZGVmYXVsdFZpZXcoKSBj
b25zdDsKLSAgICBFdmVudEltcGwgKmNyZWF0ZUV2ZW50KGNvbnN0IERPTVN0cmluZyAmZXZlbnRU
eXBlLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB3aGF0IHR5
cGVzIG9mIGV2ZW50IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCwgc28gd2UgZG9uJ3QKLSAgICAv
LyBkaXNwYXRjaCBldmVudHMgdW5uZWNlc3NhcmlseQotICAgIGVudW0gTGlzdGVuZXJUeXBlIHsK
LSAgICAgICAgRE9NU1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSICAgICAgICAgID0gMHgwMSwKLSAg
ICAgICAgRE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVSICAgICAgICAgICAgID0gMHgwMiwKLSAgICAg
ICAgRE9NTk9ERVJFTU9WRURfTElTVEVORVIgICAgICAgICAgICAgID0gMHgwNCwKLSAgICAgICAg
RE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElTVEVORVIgID0gMHgwOCwKLSAgICAgICAgRE9N
Tk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RFTkVSID0gMHgxMCwKLSAgICAgICAgRE9NQVRU
Uk1PRElGSUVEX0xJU1RFTkVSICAgICAgICAgICAgID0gMHgyMCwKLSAgICAgICAgRE9NQ0hBUkFD
VEVSREFUQU1PRElGSUVEX0xJU1RFTkVSICAgID0gMHg0MAotICAgIH07Ci0KLSAgICBib29sIGhh
c0xpc3RlbmVyVHlwZShMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKSBjb25zdCB7IHJldHVybiAo
bV9saXN0ZW5lclR5cGVzICYgbGlzdGVuZXJUeXBlKTsgfQotICAgIHZvaWQgYWRkTGlzdGVuZXJU
eXBlKExpc3RlbmVyVHlwZSBsaXN0ZW5lclR5cGUpIHsgbV9saXN0ZW5lclR5cGVzID0gbV9saXN0
ZW5lclR5cGVzIHwgbGlzdGVuZXJUeXBlOyB9Ci0KLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1w
bCAqZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50SW1wbCAqZWx0LCBjb25zdCBET01TdHJpbmcgJnBz
ZXVkb0VsdCk7Ci0KLSAgICB0eXBlZGVmIFFNYXA8UVN0cmluZywgUHJvY2Vzc2luZ0luc3RydWN0
aW9uSW1wbCo+IExvY2FsU3R5bGVSZWZzOwotICAgIExvY2FsU3R5bGVSZWZzKiBsb2NhbFN0eWxl
UmVmcygpIHsgcmV0dXJuICZtX2xvY2FsU3R5bGVSZWZzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
ZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdm9pZCBzZXRIVE1MV2lu
ZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0
ZW5lciAqbGlzdGVuZXIpOwotICAgIEV2ZW50TGlzdGVuZXIgKmdldEhUTUxXaW5kb3dFdmVudExp
c3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lkIHJlbW92ZUhU
TUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLQot
ICAgIHZvaWQgc2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBl
dmVudFR5cGUsIEF0dHJpYnV0ZUltcGwqKTsKLQotICAgIHZvaWQgYWRkV2luZG93RXZlbnRMaXN0
ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVu
ZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9pZCByZW1vdmVXaW5kb3dFdmVudExpc3RlbmVy
KGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwg
Ym9vbCB1c2VDYXB0dXJlKTsKLSAgICBib29sIGhhc1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3Qg
QXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotCi0gICAgRXZlbnRMaXN0ZW5lciAqY3JlYXRlSFRN
TEV2ZW50TGlzdGVuZXIoY29uc3QgRE9NU3RyaW5nJiBjb2RlLCBOb2RlSW1wbCopOwotICAgIAot
ICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIGRvY3VtZW50LCBzdGFydGluZyBm
cm9tIGZyb21Ob2RlLCBmb3IgdGhlIG5leHQgc2VsZWN0YWJsZSBlbGVtZW50IHRoYXQgY29tZXMg
YWZ0ZXIgZnJvbU5vZGUuCi0gICAgICogVGhlIG9yZGVyIGZvbGxvd2VkIGlzIGFzIHNwZWNpZmll
ZCBpbiBzZWN0aW9uIDE3LjExLjEgb2YgdGhlIEhUTUw0IHNwZWMsIHdoaWNoIGlzIGVsZW1lbnRz
IHdpdGggdGFiIGluZGV4ZXMKLSAgICAgKiBmaXJzdCAoZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCks
IGFuZCB0aGVuIGVsZW1lbnRzIHdpdGhvdXQgdGFiIGluZGV4ZXMgKGluIGRvY3VtZW50IG9yZGVy
KS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcm9tTm9kZSBUaGUgbm9kZSBmcm9tIHdoaWNoIHRv
IHN0YXJ0IHNlYXJjaGluZy4gVGhlIG5vZGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1h
eSBiZSBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNv
bWVzIGFmdGVyIGZyb21Ob2RlCi0gICAgICoKLSAgICAgKiBTZWUgaHR0cDovL3d3dy53My5vcmcv
VFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjExLjEKLSAgICAgKi8KLSAgICBOb2Rl
SW1wbCAqbmV4dEZvY3VzTm9kZShOb2RlSW1wbCAqZnJvbU5vZGUpOwotCi0gICAgLyoqCi0gICAg
ICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgZG9jdW1lbnQsIHN0YXJ0aW5nIGZyb20gZnJvbU5vZGUs
IGZvciB0aGUgcHJldmlvdXMgc2VsZWN0YWJsZSBlbGVtZW50ICh0aGF0IGNvbWVzIF9iZWZvcmVf
KQotICAgICAqIGZyb21Ob2RlLiBUaGUgb3JkZXIgZm9sbG93ZWQgaXMgYXMgc3BlY2lmaWVkIGlu
IHNlY3Rpb24gMTcuMTEuMSBvZiB0aGUgSFRNTDQgc3BlYywgd2hpY2ggaXMgZWxlbWVudHMgd2l0
aCB0YWIKLSAgICAgKiBpbmRleGVzIGZpcnN0IChmcm9tIGxvd2VzdCB0byBoaWdoZXN0KSwgYW5k
IHRoZW4gZWxlbWVudHMgd2l0aG91dCB0YWIgaW5kZXhlcyAoaW4gZG9jdW1lbnQgb3JkZXIpLgot
ICAgICAqCi0gICAgICogQHBhcmFtIGZyb21Ob2RlIFRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3Rh
cnQgc2VhcmNoaW5nLiBUaGUgbm9kZSBiZWZvcmUgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBi
ZSBudWxsLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVz
IGJlZm9yZSBmcm9tTm9kZQotICAgICAqCi0gICAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RS
L2h0bWw0L2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0xNy4xMS4xCi0gICAgICovCi0gICAgTm9kZUlt
cGwgKnByZXZpb3VzRm9jdXNOb2RlKE5vZGVJbXBsICpmcm9tTm9kZSk7Ci0KLSAgICBpbnQgbm9k
ZUFic0luZGV4KE5vZGVJbXBsICpub2RlKTsKLSAgICBOb2RlSW1wbCAqbm9kZVdpdGhBYnNJbmRl
eChpbnQgYWJzSW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIEhUVFAgaGVhZGVy
IGVxdWl2YWxlbnQgc2V0IGJ5IGEgbWV0YSB0YWcgdXNpbmcgPG1ldGEgaHR0cC1lcXVpdj0iLi4u
IiBjb250ZW50PSIuLi4iPi4gVGhpcyBpcyBjYWxsZWQKLSAgICAgKiB3aGVuIGEgbWV0YSB0YWcg
aXMgZW5jb3VudGVyZWQgZHVyaW5nIGRvY3VtZW50IHBhcnNpbmcsIGFuZCBhbHNvIHdoZW4gYSBz
Y3JpcHQgZHluYW1pY2FsbHkgY2hhbmdlcyBvciBhZGRzIGEgbWV0YQotICAgICAqIHRhZy4gVGhp
cyBlbmFibGVzIHNjcmlwdHMgdG8gdXNlIG1ldGEgdGFncyB0byBwZXJmb3JtIHJlZnJlc2hlcyBh
bmQgc2V0IGV4cGlyeSBkYXRlcyBpbiBhZGRpdGlvbiB0byB0aGVtIGJlaW5nCi0gICAgICogc3Bl
Y2lmaWVkIGluIGEgSFRNTCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVxdWl2IFRoZSBo
dHRwIGhlYWRlciBuYW1lICh2YWx1ZSBvZiB0aGUgbWV0YSB0YWcncyAiZXF1aXYiIGF0dHJpYnV0
ZSkKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgaGVhZGVyIHZhbHVlICh2YWx1ZSBvZiB0aGUg
bWV0YSB0YWcncyAiY29udGVudCIgYXR0cmlidXRlKQotICAgICAqLwotICAgIHZvaWQgcHJvY2Vz
c0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcgJmVxdWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRl
bnQpOwotICAgIAotICAgIHZvaWQgZGlzcGF0Y2hJbWFnZUxvYWRFdmVudFNvb24oSFRNTEltYWdl
TG9hZGVyKik7Ci0gICAgdm9pZCBkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05vdygpOwotICAgIHZv
aWQgcmVtb3ZlSW1hZ2UoSFRNTEltYWdlTG9hZGVyKik7Ci0gICAgdmlydHVhbCB2b2lkIHRpbWVy
RXZlbnQoUVRpbWVyRXZlbnQgKik7Ci0gICAgCi0gICAgLy8gUmV0dXJucyB0aGUgb3duaW5nIGVs
ZW1lbnQgaW4gdGhlIHBhcmVudCBkb2N1bWVudC4KLSAgICAvLyBSZXR1cm5zIDAgaWYgdGhpcyBp
cyB0aGUgdG9wIGxldmVsIGRvY3VtZW50LgotICAgIEVsZW1lbnRJbXBsICpvd25lckVsZW1lbnQo
KTsKLSAgICAKLSAgICBET01TdHJpbmcgcmVmZXJyZXIoKSBjb25zdDsKLSAgICBET01TdHJpbmcg
ZG9tYWluKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREb21haW4oIGNvbnN0IERPTVN0cmluZyAmbmV3
RG9tYWluLCBib29sIGZvcmNlID0gZmFsc2UgKTsgLy8gbm90IHBhcnQgb2YgdGhlIERPTQotCi0g
ICAgRE9NU3RyaW5nIHBvbGljeUJhc2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3BvbGljeUJhc2VV
Ukw7IH0KLSAgICB2b2lkIHNldFBvbGljeUJhc2VVUkwoY29uc3QgRE9NU3RyaW5nICZzKSB7IG1f
cG9saWN5QmFzZVVSTCA9IHM7IH0KLSAgICAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGltcGxlbWVu
dHMgdGhlIHJ1bGUgZnJvbSBIVE1MIDQgZm9yIHdoYXQgdmFsaWQgbmFtZXMgYXJlLgotICAgIC8v
IFRvIGdldCB0aGlzIHJpZ2h0IGZvciBhbGwgdGhlIFhNTCBjYXNlcywgd2UgcHJvYmFibHkgaGF2
ZSB0byBpbXByb3ZlIHRoaXMgb3IgbW92ZSBpdAotICAgIC8vIGFuZCBtYWtlIGl0IHNlbnNpdGl2
ZSB0byB0aGUgdHlwZSBvZiBkb2N1bWVudC4KLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkTmFtZShj
b25zdCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGJyZWFrcyBhIHF1YWxp
ZmllZCBuYW1lIGludG8gYSBwcmVmaXggYW5kIGEgbG9jYWwgbmFtZS4KLSAgICAvLyBJdCBhbHNv
IGRvZXMgYSB2YWxpZGl0eSBjaGVjaywgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlIHF1YWxpZmll
ZCBuYW1lIGlzIGludmFsaWQKLSAgICAvLyAoZW1wdHkgc3RyaW5nIG9yIGludmFsaWQgY2hhcmFj
dGVycykuCi0gICAgc3RhdGljIGJvb2wgcGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IERPTVN0cmlu
ZyAmcXVhbGlmaWVkTmFtZSwgRE9NU3RyaW5nICZwcmVmaXgsIERPTVN0cmluZyAmbG9jYWxOYW1l
KTsKLSAgICAKLSAgICB2b2lkIGFkZEVsZW1lbnRCeUlkKGNvbnN0IERPTVN0cmluZyAmZWxlbWVu
dElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCk7Ci0gICAgdm9pZCByZW1vdmVFbGVtZW50QnlJZChj
b25zdCBET01TdHJpbmcgJmVsZW1lbnRJZCwgRWxlbWVudEltcGwgKmVsZW1lbnQpOwotCi0gICAg
dm9pZCBhZGRJbWFnZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJ
bWFnZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKik7Ci0gICAgSFRNTE1hcEVsZW1lbnRJbXBsICpn
ZXRJbWFnZU1hcChjb25zdCBET01TdHJpbmcgJlVSTCkgY29uc3Q7Ci0KLSAgICBIVE1MRWxlbWVu
dEltcGwqIGJvZHkoKTsKLQotICAgIERPTVN0cmluZyB0b1N0cmluZygpIGNvbnN0OwotICAgIAot
ICAgIGJvb2wgZXhlY0NvbW1hbmQoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kLCBib29sIHVzZXJJ
bnRlcmZhY2UsIGNvbnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIGJvb2wgcXVlcnlDb21tYW5k
RW5hYmxlZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpOwotICAgIGJvb2wgcXVlcnlDb21tYW5k
SW5kZXRlcm0oY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICBib29sIHF1ZXJ5Q29tbWFu
ZFN0YXRlKGNvbnN0IERPTVN0cmluZyAmY29tbWFuZCk7Ci0gICAgYm9vbCBxdWVyeUNvbW1hbmRT
dXBwb3J0ZWQoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICBET01TdHJpbmcgcXVlcnlD
b21tYW5kVmFsdWUoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICAKLSAgICB2b2lkIGFk
ZE1hcmtlcihSYW5nZUltcGwgKnJhbmdlLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSB0eXBl
KTsKLSAgICB2b2lkIGFkZE1hcmtlcihOb2RlSW1wbCAqbm9kZSwgRG9jdW1lbnRNYXJrZXIgbWFy
a2VyKTsKLSAgICB2b2lkIGNvcHlNYXJrZXJzKE5vZGVJbXBsICpzcmNOb2RlLCB1bnNpZ25lZCBz
dGFydE9mZnNldCwgaW50IGxlbmd0aCwgTm9kZUltcGwgKmRzdE5vZGUsIGludCBkZWx0YSwgRG9j
dW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2VyVHlwZT1Eb2N1bWVudE1hcmtlcjo6QWxsTWFy
a2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJzKFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50
TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMp
OwotICAgIHZvaWQgcmVtb3ZlTWFya2VycyhOb2RlSW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRP
ZmZzZXQsIGludCBsZW5ndGgsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9
RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQgcmVtb3ZlTWFya2VycyhEb2N1
bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJr
ZXJzKTsKLSAgICB2b2lkIHJlbW92ZU1hcmtlcnMoTm9kZUltcGwgKm5vZGUpOwotICAgIHZvaWQg
c2hpZnRNYXJrZXJzKE5vZGVJbXBsICpub2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGRl
bHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2Vy
OjpBbGxNYXJrZXJzKTsKLQotICAgIFFWYWx1ZUxpc3Q8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnNG
b3JOb2RlKE5vZGVJbXBsICpub2RlKTsKLSAgICAKLSAgIC8qKgotICAgICogZGVzaWduTW9kZSBz
dXBwb3J0Ci0gICAgKi8KLSAgICBlbnVtIEluaGVyaXRlZEJvb2wgewotICAgICAgICBvZmY9ZmFs
c2UsCi0gICAgICAgIG9uPXRydWUsCi0gICAgICAgIGluaGVyaXQKLSAgICB9OwotICAgIAotICAg
IHZvaWQgc2V0RGVzaWduTW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKTsKLSAgICBJbmhlcml0ZWRC
b29sIGdldERlc2lnbk1vZGUoKSBjb25zdDsKLSAgICBib29sIGluRGVzaWduTW9kZSgpIGNvbnN0
OwotICAgIERvY3VtZW50SW1wbCAqcGFyZW50RG9jdW1lbnQoKSBjb25zdDsKLSAgICBEb2N1bWVu
dEltcGwgKnRvcERvY3VtZW50KCkgY29uc3Q7Ci0KLSAgICBpbnQgZG9jSUQoKSBjb25zdCB7IHJl
dHVybiBtX2RvY0lEOyB9Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgdm9pZCBhcHBseVhTTFRy
YW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSk7Ci0gICAgdm9pZCBzZXRUcmFu
c2Zvcm1Tb3VyY2Uodm9pZCogZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlID0gZG9jOyB9Ci0gICAg
Y29uc3Qgdm9pZCogdHJhbnNmb3JtU291cmNlKCkgeyByZXR1cm4gbV90cmFuc2Zvcm1Tb3VyY2U7
IH0KLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiB0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpIHsg
cmV0dXJuIG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQ7IH0KLSAgICB2b2lkIHNldFRyYW5zZm9y
bVNvdXJjZURvY3VtZW50KERvY3VtZW50SW1wbCAqZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlRG9j
dW1lbnQgPSBkb2M7IH0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgIC8vIFhC
TCBtZXRob2RzCi0gICAgWEJMOjpYQkxCaW5kaW5nTWFuYWdlciogYmluZGluZ01hbmFnZXIoKSBj
b25zdCB7IHJldHVybiBtX2JpbmRpbmdNYW5hZ2VyOyB9Ci0jZW5kaWYKLQotICAgIHZvaWQgaW5j
RE9NVHJlZVZlcnNpb24oKSB7ICsrbV9kb210cmVlX3ZlcnNpb247IH0KLSAgICB1bnNpZ25lZCBp
bnQgZG9tVHJlZVZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtX2RvbXRyZWVfdmVyc2lvbjsgfQot
Ci0gICAgdm9pZCBzZXREb2NUeXBlKERvY3VtZW50VHlwZUltcGwgKmRvY1R5cGUpIHsgbV9kb2NU
eXBlID0gZG9jVHlwZTsgfQotCi1zaWduYWxzOgotICAgIHZvaWQgZmluaXNoZWRQYXJzaW5nKCk7
Ci0KLXByb3RlY3RlZDoKLSAgICBraHRtbDo6Q1NTU3R5bGVTZWxlY3RvciAqbV9zdHlsZVNlbGVj
dG9yOwotICAgIEtIVE1MVmlldyAqbV92aWV3OwotICAgIFFTdHJpbmdMaXN0IG1fc3RhdGU7Ci0K
LSAgICBraHRtbDo6RG9jTG9hZGVyICptX2RvY0xvYWRlcjsKLSAgICBraHRtbDo6VG9rZW5pemVy
ICptX3Rva2VuaXplcjsKLSAgICBRU3RyaW5nIG1fdXJsOwotICAgIFFTdHJpbmcgbV9iYXNlVVJM
OwotICAgIFFTdHJpbmcgbV9iYXNlVGFyZ2V0OwotCi0gICAgUmVmUHRyPERvY3VtZW50VHlwZUlt
cGw+IG1fZG9jVHlwZTsKLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwgKm1faW1wbGVtZW50YXRp
b247Ci0KLSAgICBTdHlsZVNoZWV0SW1wbCAqbV9zaGVldDsKLSAgICBRU3RyaW5nIG1fdXNlcnNo
ZWV0OwotICAgIFFTdHJpbmcgbV9wcmludFNoZWV0OwotICAgIFFTdHJpbmdMaXN0IG1fYXZhaWxh
YmxlU2hlZXRzOwotCi0gICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGlu
ZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMuICBTaGVldHMKLSAgICAvLyBsb2FkZWQgdXNpbmcgdGhl
IEBpbXBvcnQgZGlyZWN0aXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBjb3VudC4KLSAgICAv
LyBXZSB1c2UgdGhpcyBjb3VudCBvZiBwZW5kaW5nIHNoZWV0cyB0byBkZXRlY3Qgd2hlbiB3ZSBj
YW4gYmVnaW4gYXR0YWNoaW5nCi0gICAgLy8gZWxlbWVudHMuCi0gICAgaW50IG1fcGVuZGluZ1N0
eWxlc2hlZXRzOwotCi0gICAgLy8gQnV0IHNvbWV0aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVu
ZGluZyBzdHlsZXNoZWV0IGNvdW50IHRvCi0gICAgLy8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91
dCB3aGVuIHJlcXVlc3RlZCBieSBKUy4KLSAgICBib29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hl
ZXRzOwotCi0gICAgQ1NTU3R5bGVTaGVldEltcGwgKm1fZWxlbVNoZWV0OwotCi0gICAgUVBhaW50
RGV2aWNlICptX3BhaW50RGV2aWNlOwotICAgIFFQYWludERldmljZU1ldHJpY3MgKm1fcGFpbnRE
ZXZpY2VNZXRyaWNzOwotICAgIFBhcnNlTW9kZSBwTW9kZTsKLSAgICBIVE1MTW9kZSBoTW9kZTsK
LQotICAgIFFDb2xvciBtX3RleHRDb2xvcjsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gbV9mb2N1
c05vZGU7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBtX2hvdmVyTm9kZTsKLSAgICBSZWZQdHI8Tm9k
ZUltcGw+IG1fYWN0aXZlTm9kZTsKLQotICAgIHVuc2lnbmVkIGludCBtX2RvbXRyZWVfdmVyc2lv
bjsKLSAgICAKLSAgICAvLyAjIyMgcmVwbGFjZSBtZSB3aXRoIHNvbWV0aGluZyBtb3JlIGVmZmlj
aWVudAotICAgIC8vIGluIGxvb2t1cCBhbmQgaW5zZXJ0aW9uLgotICAgIERPTVN0cmluZ0ltcGwg
KiptX2VsZW1lbnROYW1lczsKLSAgICB1bnNpZ25lZCBzaG9ydCBtX2VsZW1lbnROYW1lQWxsb2M7
Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9lbGVtZW50TmFtZUNvdW50OwotCi0gICAgRE9NU3RyaW5n
SW1wbCAqKm1fYXR0ck5hbWVzOwotICAgIHVuc2lnbmVkIHNob3J0IG1fYXR0ck5hbWVBbGxvYzsK
LSAgICB1bnNpZ25lZCBzaG9ydCBtX2F0dHJOYW1lQ291bnQ7Ci0KLSAgICBET01TdHJpbmdJbXBs
KiogbV9uYW1lc3BhY2VVUklzOwotICAgIHVuc2lnbmVkIHNob3J0IG1fbmFtZXNwYWNlVVJJQWxs
b2M7Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9uYW1lc3BhY2VVUklDb3VudDsKLQotICAgIFFQdHJM
aXN0PE5vZGVJdGVyYXRvckltcGw+IG1fbm9kZUl0ZXJhdG9yczsKLSAgICBBYnN0cmFjdFZpZXdJ
bXBsICptX2RlZmF1bHRWaWV3OwotCi0gICAgdW5zaWduZWQgc2hvcnQgbV9saXN0ZW5lclR5cGVz
OwotICAgIFN0eWxlU2hlZXRMaXN0SW1wbCogbV9zdHlsZVNoZWV0czsKLSAgICBMb2NhbFN0eWxl
UmVmcyBtX2xvY2FsU3R5bGVSZWZzOyAvLyByZWZlcmVuY2VzIHRvIGlubGluZWQgc3R5bGUgZWxl
bWVudHMKLSAgICBRUHRyTGlzdDxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gbV93aW5kb3dFdmVu
dExpc3RlbmVyczsKLSAgICBRUHRyTGlzdDxOb2RlSW1wbD4gbV9tYWludGFpbnNTdGF0ZTsKLQot
ICAgIFFDb2xvciBtX2xpbmtDb2xvcjsKLSAgICBRQ29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwot
ICAgIFFDb2xvciBtX2FjdGl2ZUxpbmtDb2xvcjsKLQotICAgIERPTVN0cmluZyBtX3ByZWZlcnJl
ZFN0eWxlc2hlZXRTZXQ7Ci0gICAgRE9NU3RyaW5nIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0Owot
Ci0gICAgYm9vbCBtX2xvYWRpbmdTaGVldDsKLSAgICBib29sIHZpc3VhbGx5T3JkZXJlZDsKLSAg
ICBib29sIG1fYlBhcnNpbmc7Ci0gICAgYm9vbCBtX2JBbGxEYXRhUmVjZWl2ZWQ7Ci0gICAgYm9v
bCBtX2RvY0NoYW5nZWQ7Ci0gICAgYm9vbCBtX3N0eWxlU2VsZWN0b3JEaXJ0eTsKLSAgICBib29s
IG1faW5TdHlsZVJlY2FsYzsKLSAgICBib29sIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjOwotICAg
IGJvb2wgbV91c2VzRGVzY2VuZGFudFJ1bGVzOwotICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVz
OwotICAgIAotICAgIERPTVN0cmluZyBtX3RpdGxlOwotICAgIGJvb2wgbV90aXRsZVNldEV4cGxp
Y2l0bHk7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBtX3RpdGxlRWxlbWVudDsKLSAgICAKLSAgICBS
ZW5kZXJBcmVuYSogbV9yZW5kZXJBcmVuYTsKLQotICAgIFFQdHJEaWN0PCBRVmFsdWVMaXN0PERv
Y3VtZW50TWFya2VyPiA+IG1fbWFya2VyczsKLQotICAgIEtXUUFjY09iamVjdENhY2hlKiBtX2Fj
Y0NhY2hlOwotICAgIAotICAgIFFQdHJMaXN0PEhUTUxJbWFnZUxvYWRlcj4gbV9pbWFnZUxvYWRF
dmVudERpc3BhdGNoU29vbkxpc3Q7Ci0gICAgUVB0ckxpc3Q8SFRNTEltYWdlTG9hZGVyPiBtX2lt
YWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0OwotICAgIGludCBtX2ltYWdlTG9hZEV2ZW50VGlt
ZXI7Ci0KLSAgICBOb2RlSW1wbCogbV9jc3NUYXJnZXQ7Ci0gICAgCi0gICAgYm9vbCBtX3Byb2Nl
c3NpbmdMb2FkRXZlbnQ7Ci0gICAgUVRpbWUgbV9zdGFydFRpbWU7Ci0gICAgYm9vbCBtX292ZXJN
aW5pbXVtTGF5b3V0VGhyZXNob2xkOwotICAgIAotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB2b2lk
ICptX3RyYW5zZm9ybVNvdXJjZTsKLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiBtX3RyYW5zZm9y
bVNvdXJjZURvY3VtZW50OwotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgWEJM
OjpYQkxCaW5kaW5nTWFuYWdlciogbV9iaW5kaW5nTWFuYWdlcjsgLy8gVGhlIGFjY2VzcyBwb2lu
dCB0aHJvdWdoIHdoaWNoIGRvY3VtZW50cyBhbmQgZWxlbWVudHMgY29tbXVuaWNhdGUgd2l0aCBY
QkwuCi0jZW5kaWYKLSAgICAKLSAgICBRTWFwPFFTdHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAq
PiBtX2ltYWdlTWFwc0J5TmFtZTsKLQotICAgIERPTVN0cmluZyBtX3BvbGljeUJhc2VVUkw7Ci0K
LSAgICBRUHRyRGljdDxOb2RlSW1wbD4gbV9kaXNjb25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3Rl
bmVyczsKLQotICAgIGludCBtX2RvY0lEOyAvLyBBIHVuaXF1ZSBkb2N1bWVudCBpZGVudGlmaWVy
IHVzZWQgZm9yIHRoaW5ncyBsaWtlIGRvY3VtZW50LXNwZWNpZmljIG1hcHBlZCBhdHRyaWJ1dGVz
LgotCi1wdWJsaWM6Ci0gICAgS1dRU2lnbmFsIG1fZmluaXNoZWRQYXJzaW5nOwotCi0gICAgYm9v
bCBpblBhZ2VDYWNoZSgpOwotICAgIHZvaWQgc2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKTsKLSAg
ICB2b2lkIHJlc3RvcmVSZW5kZXJlcihraHRtbDo6UmVuZGVyT2JqZWN0KiByZW5kZXIpOwotCi0g
ICAgdm9pZCBwYXNzd29yZEZpZWxkQWRkZWQoKTsKLSAgICB2b2lkIHBhc3N3b3JkRmllbGRSZW1v
dmVkKCk7Ci0gICAgYm9vbCBoYXNQYXNzd29yZEZpZWxkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNl
Y3VyZUZvcm1BZGRlZCgpOwotICAgIHZvaWQgc2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAgICBib29s
IGhhc1NlY3VyZUZvcm0oKSBjb25zdDsKLQotICAgIHZvaWQgc2V0U2hvdWxkQ3JlYXRlUmVuZGVy
ZXJzKGJvb2wgZik7Ci0gICAgYm9vbCBzaG91bGRDcmVhdGVSZW5kZXJlcnMoKTsKLSAgICAKLSAg
ICB2b2lkIHNldERlY29kZXIoa2h0bWw6OkRlY29kZXIgKik7Ci0gICAga2h0bWw6OkRlY29kZXIg
KmRlY29kZXIoKSBjb25zdCB7IHJldHVybiBtX2RlY29kZXIuZ2V0KCk7IH0KLQotICAgIHZvaWQg
c2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5KGJvb2wgZikgeyBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0
eSA9IGY7IH0KLSAgICBib29sIGRhc2hib2FyZFJlZ2lvbnNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJu
IG1fZGFzaGJvYXJkUmVnaW9uc0RpcnR5OyB9Ci0gICAgYm9vbCBoYXNEYXNoYm9hcmRSZWdpb25z
ICgpIGNvbnN0IHsgcmV0dXJuIG1faGFzRGFzaGJvYXJkUmVnaW9uczsgfQotICAgIHZvaWQgc2V0
SGFzRGFzaGJvYXJkUmVnaW9ucyAoYm9vbCBmKSB7IG1faGFzRGFzaGJvYXJkUmVnaW9ucyA9IGY7
IH0KLSAgICBjb25zdCBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gJiBk
YXNoYm9hcmRSZWdpb25zKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREYXNoYm9hcmRSZWdpb25zIChj
b25zdCBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpOwot
ICAgIAotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tQWxsTm9kZXMoKTsKLQot
ICAgIHZvaWQgcmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJ
bXBsICpub2RlKTsKLSAgICB2b2lkIHVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50
TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsKLSAgICAKLSAgICB2b2lkIHJhZGlvQnV0dG9uQ2hl
Y2tlZChIVE1MSW5wdXRFbGVtZW50SW1wbCAqY2FsbGVyLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpm
b3JtKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY2hlY2tlZFJhZGlvQnV0dG9uRm9yR3Jv
dXAoRE9NU3RyaW5nSW1wbCogbmFtZSwgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSk7Ci0gICAg
dm9pZCByZW1vdmVSYWRpb0J1dHRvbkdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3Jt
RWxlbWVudEltcGwgKmZvcm0pOwotCi1wcml2YXRlOgotICAgIHZvaWQgdXBkYXRlVGl0bGUoKTsK
LSAgICB2b2lkIHJlbW92ZUFsbERpc2Nvbm5lY3RlZE5vZGVFdmVudExpc3RlbmVycygpOwotCi0g
ICAgSlNFZGl0b3IgKmpzRWRpdG9yKCk7Ci0KLSAgICBKU0VkaXRvciAqbV9qc0VkaXRvcjsKLSAg
ICBib29sIHJlbGlucXVpc2hlc0VkaXRpbmdGb2N1cyhOb2RlSW1wbCAqbm9kZSk7Ci0gICAgYm9v
bCBhY2NlcHRzRWRpdGluZ0ZvY3VzKE5vZGVJbXBsICpub2RlKTsKLQotICAgIG11dGFibGUgRE9N
U3RyaW5nIG1fZG9tYWluOwotICAgIGJvb2wgbV9pblBhZ2VDYWNoZTsKLSAgICBraHRtbDo6UmVu
ZGVyT2JqZWN0ICptX3NhdmVkUmVuZGVyZXI7Ci0gICAgaW50IG1fcGFzc3dvcmRGaWVsZHM7Ci0g
ICAgaW50IG1fc2VjdXJlRm9ybXM7Ci0gICAgCi0gICAgUmVmUHRyPGtodG1sOjpEZWNvZGVyPiBt
X2RlY29kZXI7Ci0KLSAgICBtdXRhYmxlIFFEaWN0PEVsZW1lbnRJbXBsPiBtX2VsZW1lbnRzQnlJ
ZDsKLSAgICBtdXRhYmxlIFFEaWN0PGNoYXI+IG1faWRDb3VudDsKLSAgICAKLSAgICBRRGljdDxF
bGVtZW50SW1wbD4gbV9lbGVtZW50c0J5QWNjZXNzS2V5OwotICAgIGJvb2wgbV9hY2Nlc3NLZXlE
aWN0VmFsaWQ7Ci0gCi0gICAgYm9vbCBtX2NyZWF0ZVJlbmRlcmVyczsKLSAgICAKLSAgICBJbmhl
cml0ZWRCb29sIG1fZGVzaWduTW9kZTsKLSAgICAKLSAgICBRVmFsdWVMaXN0PGtodG1sOjpEYXNo
Ym9hcmRSZWdpb25WYWx1ZT4gbV9kYXNoYm9hcmRSZWdpb25zOwotICAgIGJvb2wgbV9oYXNEYXNo
Ym9hcmRSZWdpb25zOwotICAgIGJvb2wgbV9kYXNoYm9hcmRSZWdpb25zRGlydHk7Ci0gICAgaW50
IG1fc2VsZk9ubHlSZWZDb3VudDsKLSAgICB0eXBlZGVmIEhhc2hNYXA8RE9NU3RyaW5nSW1wbCos
IEhUTUxJbnB1dEVsZW1lbnRJbXBsKiwgUG9pbnRlckhhc2g8RE9NU3RyaW5nSW1wbCo+ID4gTmFt
ZVRvSW5wdXRNYXA7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEhUTUxGb3JtRWxlbWVudEltcGwqLCBO
YW1lVG9JbnB1dE1hcCosIFBvaW50ZXJIYXNoPEhUTUxGb3JtRWxlbWVudEltcGwqPiA+IEZvcm1U
b0dyb3VwTWFwOwotICAgIEZvcm1Ub0dyb3VwTWFwKiBtX3NlbGVjdGVkUmFkaW9CdXR0b25zOwot
fTsKLQotY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGwgOiBwdWJsaWMgQ29udGFpbmVyTm9kZUlt
cGwKLXsKLXB1YmxpYzoKLSAgICBEb2N1bWVudEZyYWdtZW50SW1wbChEb2N1bWVudEltcGwgKmRv
Yyk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2Vz
Ci0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVu
c2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xv
bmVOb2RlICggYm9vbCBkZWVwICk7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBv
ZiBET00pCi0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0
IHR5cGUgKTsKLQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci19Owot
Ci1jbGFzcyBEb2N1bWVudFR5cGVJbXBsIDogcHVibGljIE5vZGVJbXBsCi17Ci1wdWJsaWM6Ci0g
ICAgRG9jdW1lbnRUeXBlSW1wbChET01JbXBsZW1lbnRhdGlvbkltcGwgKiwgRG9jdW1lbnRJbXBs
ICosIGNvbnN0IERPTVN0cmluZyAmbmFtZSwgY29uc3QgRE9NU3RyaW5nICZwdWJsaWNJZCwgY29u
c3QgRE9NU3RyaW5nICZzeXN0ZW1JZCk7Ci0gICAgRG9jdW1lbnRUeXBlSW1wbChEb2N1bWVudElt
cGwgKiwgY29uc3QgRE9NU3RyaW5nICZuYW1lLCBjb25zdCBET01TdHJpbmcgJnB1YmxpY0lkLCBj
b25zdCBET01TdHJpbmcgJnN5c3RlbUlkKTsKLSAgICBEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50
SW1wbCAqLCBjb25zdCBEb2N1bWVudFR5cGVJbXBsICYpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMg
JiBhdHRyaWJ1dGVzIGZvciBEb2N1bWVudFR5cGUKLSAgICBOYW1lZE5vZGVNYXBJbXBsICplbnRp
dGllcygpIGNvbnN0IHsgcmV0dXJuIG1fZW50aXRpZXMuZ2V0KCk7IH0KLSAgICBOYW1lZE5vZGVN
YXBJbXBsICpub3RhdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX25vdGF0aW9ucy5nZXQoKTsgfQot
Ci0gICAgRE9NU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KLSAgICBET01T
dHJpbmcgcHVibGljSWQoKSBjb25zdCB7IHJldHVybiBtX3B1YmxpY0lkOyB9Ci0gICAgRE9NU3Ry
aW5nIHN5c3RlbUlkKCkgY29uc3QgeyByZXR1cm4gbV9zeXN0ZW1JZDsgfQotICAgIERPTVN0cmlu
ZyBpbnRlcm5hbFN1YnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fc3Vic2V0OyB9Ci0KLSAgICAvLyBE
T00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gcGFyZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIERP
TVN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgbm9k
ZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5vZGVJbXBsICpjbG9uZU5vZGUoYm9vbCBkZWVw
KTsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5vdCBwYXJ0IG9mIERPTSkKLSAgICBET01JbXBs
ZW1lbnRhdGlvbkltcGwgKmltcGxlbWVudGF0aW9uKCkgY29uc3QgeyByZXR1cm4gbV9pbXBsZW1l
bnRhdGlvbi5nZXQoKTsgfQotICAgIHZpcnR1YWwgRE9NU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7
Ci0KLXByaXZhdGU6Ci0gICAgUmVmUHRyPERPTUltcGxlbWVudGF0aW9uSW1wbD4gbV9pbXBsZW1l
bnRhdGlvbjsKLSAgICBSZWZQdHI8TmFtZWROb2RlTWFwSW1wbD4gbV9lbnRpdGllczsKLSAgICBS
ZWZQdHI8TmFtZWROb2RlTWFwSW1wbD4gbV9ub3RhdGlvbnM7Ci0KLSAgICBET01TdHJpbmcgbV9u
YW1lOwotICAgIERPTVN0cmluZyBtX3B1YmxpY0lkOwotICAgIERPTVN0cmluZyBtX3N5c3RlbUlk
OwotICAgIERPTVN0cmluZyBtX3N1YnNldDsKLX07Ci0KIH0gLy9uYW1lc3BhY2UKIAogI2VuZGlm
CkluZGV4OiBraHRtbC94bWwvZG9tX3htbGltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3ht
bC9kb21feG1saW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwveG1sL2RvbV94bWxp
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgImRvbS9k
b21fZXhjZXB0aW9uLmgiCiAKICNpbmNsdWRlICJ4bWwvZG9tX3htbGltcGwuaCIKLSNpbmNsdWRl
ICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRl
ICJ4bWwvZG9tX3N0cmluZ2ltcGwuaCIKICNpbmNsdWRlICJjc3MvY3NzX3N0eWxlc2hlZXRpbXBs
LmgiCiAjaWZkZWYgS0hUTUxfWFNMVApJbmRleDoga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJ
bXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94bWwvRG9jdW1lbnRGcmFnbWVudEltcGwuY3Bw
CShyZXZpc2lvbiAxMjAxNSkKKysrIGtodG1sL3htbC9Eb2N1bWVudEZyYWdtZW50SW1wbC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTIzLDMyOTQgKzIzLDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImNv
bmZpZy5oIgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCiAKLSNpbmNsdWRlICJkb20vZG9tX2V4
Y2VwdGlvbi5oIgotI2luY2x1ZGUgImRvbS9kb20yX2V2ZW50cy5oIgorI2luY2x1ZGUgIkRvY3Vt
ZW50RnJhZ21lbnRJbXBsLmgiCiAKLSNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0jaW5j
bHVkZSAieG1sL2RvbV94bWxpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBsLmgi
Ci0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX3Zp
ZXdzaW1wbC5oIgotI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAieG1sL3ht
bF90b2tlbml6ZXIuaCIKLQotI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKLSNpbmNsdWRlICJj
c3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVldGltcGwu
aCIKLSNpbmNsdWRlICJjc3MvY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgIm1pc2MvaGVscGVy
LmgiCi0jaW5jbHVkZSAiRG9jTG9hZGVyLmgiCi0jaW5jbHVkZSAiZWNtYS9ranNfcHJveHkuaCIK
LSNpbmNsdWRlICJlY21hL2tqc19iaW5kaW5nLmgiCi0KLSNpbmNsdWRlIDxxcHRyc3RhY2suaD4K
LSNpbmNsdWRlIDxxcGFpbnRkZXZpY2VtZXRyaWNzLmg+Ci0jaW5jbHVkZSA8cXJlZ2V4cC5oPgot
I2luY2x1ZGUgPGtkZWJ1Zy5oPgotCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9jYW52YXMu
aCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2ZyYW1lcy5oIgotI2luY2x1ZGUgInJlbmRl
cmluZy9yZW5kZXJfaW1hZ2UuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX29iamVjdC5o
IgotI2luY2x1ZGUgInJlbmRlcl9hcmVuYS5oIgotCi0jaW5jbHVkZSAiRnJhbWVWaWV3LmgiCi0j
aW5jbHVkZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVByaXZhdGUuaCIKLQotI2luY2x1
ZGUgPGtnbG9iYWxzZXR0aW5ncy5oPgotI2luY2x1ZGUgImtodG1sX3NldHRpbmdzLmgiCi0KLS8v
IEZJWE1FOiBXZSB3YW50IHRvIGN1dCB0aGUgcmVtYWluaW5nIEhUTUwgZGVwZW5kZW5jaWVzIHNv
IHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHRoZXNlIGZpbGVzLgotI2luY2x1ZGUgImh0
bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfaGVhZGltcGwuaCIK
LSNpbmNsdWRlICJodG1sL2h0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTElucHV0RWxl
bWVudEltcGwuaCIKLSNpbmNsdWRlICJodG1sZmFjdG9yeS5oIgotCi0jaW5jbHVkZSAiY3NzdmFs
dWVzLmgiCi0KLSNpbmNsdWRlICJlZGl0aW5nL2pzZWRpdGluZy5oIgotI2luY2x1ZGUgImVkaXRp
bmcvdmlzaWJsZV9wb3NpdGlvbi5oIgotI2luY2x1ZGUgImVkaXRpbmcvdmlzaWJsZV90ZXh0Lmgi
Ci0KLSNpbmNsdWRlIDxraW8vam9iLmg+Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0jaW5jbHVkZSAi
eHNsX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAieHNsdF9wcm9jZXNzb3JpbXBsLmgiCi0j
ZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2JpbmRpbmdf
bWFuYWdlci5oIgotdXNpbmcgWEJMOjpYQkxCaW5kaW5nTWFuYWdlcjsKLSNlbmRpZgotCi0jaW5j
bHVkZSAiS1dRQWNjT2JqZWN0Q2FjaGUuaCIKLSNpbmNsdWRlICJLV1FMb2dnaW5nLmgiCi0KLSNp
ZiBTVkdfU1VQUE9SVAotI2luY2x1ZGUgIlNWR05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVu
dEZhY3RvcnkuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50SW1wbC5oIgotI2luY2x1ZGUgIlNWR1pv
b21FdmVudEltcGwuaCIKLSNpbmNsdWRlICJTVkdTdHlsZUVsZW1lbnRJbXBsLmgiCi0jaW5jbHVk
ZSAia2NhbnZhcy9kZXZpY2UvcXVhcnR6L0tSZW5kZXJpbmdEZXZpY2VRdWFydHouaCIKLSNlbmRp
ZgotCi11c2luZyBuYW1lc3BhY2UgRE9NOwotdXNpbmcgbmFtZXNwYWNlIERPTTo6RXZlbnROYW1l
czsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci11c2luZyBuYW1lc3BhY2Uga2h0bWw7Ci0K
LS8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORyAxCi0KLS8vIFRoaXMgYW1v
dW50IG9mIHRpbWUgbXVzdCBoYXZlIGVsYXBzZWQgYmVmb3JlIHdlIHdpbGwgZXZlbiBjb25zaWRl
ciBzY2hlZHVsaW5nIGEgbGF5b3V0IHdpdGhvdXQgYSBkZWxheS4KLS8vIEZJWE1FOiBGb3IgZmFz
dGVyIG1hY2hpbmVzIHRoaXMgdmFsdWUgY2FuIHJlYWxseSBiZSBsb3dlcmVkIHRvIDIwMC4gIDI1
MCBpcyBhZGVxdWF0ZSwgYnV0IGEgbGl0dGxlIGhpZ2gKLS8vIGZvciBkdWFsIEc1cy4gOikKLWNv
bnN0IGludCBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQgPSAyNTA7Ci0KLURPTUltcGxlbWVudGF0
aW9uSW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjptX2luc3RhbmNlID0gMDsKLQotLy8gVXNl
IDEgdG8gcmVwcmVzZW50IHRoZSBkb2N1bWVudCdzIGRlZmF1bHQgZm9ybS4KLUhUTUxGb3JtRWxl
bWVudEltcGwqIGNvbnN0IGRlZmF1bHRGb3JtID0gKEhUTUxGb3JtRWxlbWVudEltcGwqKSAxOwot
Ci0vLyBET00gTGV2ZWwgMiBzYXlzIChsZXR0ZXJzIGFkZGVkKToKLS8vCi0vLyBhKSBOYW1lIHN0
YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwgTHUsIExv
LCBMdCwgTmwuCi0vLyBiKSBOYW1lIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0YXJ0IGNo
YXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1uLCBMbSwg
b3IgTmQuCi0vLyBjKSBDaGFyYWN0ZXJzIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEgKGkuZS4g
d2l0aCBjaGFyYWN0ZXIgY29kZSBncmVhdGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRoYW4gI3hG
RkZFKSBhcmUgbm90IGFsbG93ZWQgaW4gWE1MIG5hbWVzLgotLy8gZCkgQ2hhcmFjdGVycyB3aGlj
aCBoYXZlIGEgZm9udCBvciBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4gdGhvc2Ug
d2l0aCBhICJjb21wYXRpYmlsaXR5IGZvcm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9mIHRoZSBk
YXRhYmFzZSAtLSBtYXJrZWQgYnkgZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8IikgYXJlIG5v
dCBhbGxvd2VkLgotLy8gZSkgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFz
IG5hbWUtc3RhcnQgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMsIGJlY2F1
c2UgdGhlIHByb3BlcnR5IGZpbGUgY2xhc3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6IFsjeDAy
QkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2RTUsICN4MDZFNi4KLS8vIGYpIENoYXJhY3RlcnMgI3gy
MERELSN4MjBFMCBhcmUgZXhjbHVkZWQgKGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlLCBzZWN0
aW9uIDUuMTQpLgotLy8gZykgQ2hhcmFjdGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFzIGFuIGV4
dGVuZGVyLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQuCi0vLyBo
KSBDaGFyYWN0ZXIgI3gwMzg3IGlzIGFkZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJlY2F1c2Ug
I3gwMEI3IGlzIGl0cyBjYW5vbmljYWwgZXF1aXZhbGVudC4KLS8vIGkpIENoYXJhY3RlcnMgJzon
IGFuZCAnXycgYXJlIGFsbG93ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLgotLy8gaikgQ2hh
cmFjdGVycyAnLScgYW5kICcuJyBhcmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMuCi0vLwot
Ly8gSXQgYWxzbyBjb250YWlucyBjb21wbGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBpdCdzIGJl
dHRlciwgd2UgY291bGQgaW5jbHVkZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgY29k
ZS4KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBjKQotewot
ICAgIC8vIHJ1bGUgKGUpIGFib3ZlCi0gICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9IDB4MDJD
MSkgfHwgYyA9PSAweDU1OSB8fCBjID09IDB4NkU1IHx8IGMgPT0gMHg2RTYpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgLy8gcnVsZSAoaSkgYWJvdmUKLSAgICBpZiAoYyA9PSAnOicgfHwg
YyA9PSAnXycpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gcnVsZXMgKGEpIGFuZCAo
ZikgYWJvdmUKLSAgICBjb25zdCB1aW50MzJfdCBuYW1lU3RhcnRNYXNrID0gVV9HQ19MTF9NQVNL
IHwgVV9HQ19MVV9NQVNLIHwgVV9HQ19MT19NQVNLIHwgVV9HQ19MVF9NQVNLIHwgVV9HQ19OTF9N
QVNLOwotICAgIGlmICghKFVfR0VUX0dDX01BU0soYykgJiBuYW1lU3RhcnRNYXNrKSkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoYykgYWJvdmUKLSAgICBpZiAoYyA+PSAw
eEY5MDAgJiYgYyA8IDB4RkZGRSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVs
ZSAoZCkgYWJvdmUKLSAgICBVRGVjb21wb3NpdGlvblR5cGUgZGVjb21wVHlwZSA9IHN0YXRpY19j
YXN0PFVEZWNvbXBvc2l0aW9uVHlwZT4odV9nZXRJbnRQcm9wZXJ0eVZhbHVlKGMsIFVDSEFSX0RF
Q09NUE9TSVRJT05fVFlQRSkpOwotICAgIGlmIChkZWNvbXBUeXBlID09IFVfRFRfRk9OVCB8fCBk
ZWNvbXBUeXBlID09IFVfRFRfQ09NUEFUKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hh
cjMyIGMpCi17Ci0gICAgLy8gcnVsZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBpZiAo
aXNWYWxpZE5hbWVTdGFydChjKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxl
cyAoZykgYW5kIChoKSBhYm92ZQotICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlmIChj
ID09ICctJyB8fCBjID09ICcuJykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxl
cyAoYikgYW5kIChmKSBhYm92ZQotICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNr
ID0gVV9HQ19NQ19NQVNLIHwgVV9HQ19NRV9NQVNLIHwgVV9HQ19NTl9NQVNLIHwgVV9HQ19MTV9N
QVNLIHwgVV9HQ19ORF9NQVNLOwotICAgIGlmICghKFVfR0VUX0dDX01BU0soYykgJiBvdGhlck5h
bWVQYXJ0TWFzaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGMpIGFi
b3ZlCi0gICAgaWYgKGMgPj0gMHhGOTAwICYmIGMgPCAweEZGRkUpCi0gICAgICAgIHJldHVybiBm
YWxzZTsKLQotICAgIC8vIHJ1bGUgKGQpIGFib3ZlCi0gICAgVURlY29tcG9zaXRpb25UeXBlIGRl
Y29tcFR5cGUgPSBzdGF0aWNfY2FzdDxVRGVjb21wb3NpdGlvblR5cGU+KHVfZ2V0SW50UHJvcGVy
dHlWYWx1ZShjLCBVQ0hBUl9ERUNPTVBPU0lUSU9OX1RZUEUpKTsKLSAgICBpZiAoZGVjb21wVHlw
ZSA9PSBVX0RUX0ZPTlQgfHwgZGVjb21wVHlwZSA9PSBVX0RUX0NPTVBBVCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiBBbiBpbXBsZW1l
bnRhdGlvbiBvZiB0aGlzIGlzIHN0aWxsIHdhaXRpbmcgZm9yIG1lIHRvIHVuZGVyc3RhbmQgdGhl
IGRpc3RpbmN0aW9uIGJldHdlZW4KLS8vIGEgIm1hbGZvcm1lZCIgcXVhbGlmaWVkIG5hbWUgYW5k
IG9uZSB3aXRoIGJhZCBjaGFyYWN0ZXJzIGluIGl0LiBGb3IgZXhhbXBsZSwgaXMgYSBzZWNvbmQg
Y29sb24KLS8vIGFuIGlsbGVnYWwgY2hhcmFjdGVyIG9yIGEgbWFsZm9ybWVkIHF1YWxpZmllZCBu
YW1lPyBUaGlzIHdpbGwgZGV0ZXJtaW5lIGJvdGggd2hhdCBwYXJhbWV0ZXJzCi0vLyB0aGlzIGZ1
bmN0aW9uIG5lZWRzIHRvIHRha2UgYW5kIGV4YWN0bHkgd2hhdCBpdCB3aWxsIGRvLiBTaG91bGQg
YWxzbyBiZSBleHBvcnRlZCBzbyB0aGF0Ci0vLyBFbGVtZW50SW1wbCBjYW4gdXNlIGl0IHRvby4K
LXN0YXRpYyBib29sIHF1YWxpZmllZE5hbWVJc01hbGZvcm1lZChjb25zdCBET01TdHJpbmcgJikK
LXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTUltcGxlbWVudGF0aW9uSW1wbDo6RE9NSW1w
bGVtZW50YXRpb25JbXBsKCkKLXsKLX0KLQotRE9NSW1wbGVtZW50YXRpb25JbXBsOjp+RE9NSW1w
bGVtZW50YXRpb25JbXBsKCkKLXsKLX0KLQotYm9vbCBET01JbXBsZW1lbnRhdGlvbkltcGw6Omhh
c0ZlYXR1cmUgKGNvbnN0IERPTVN0cmluZyAmZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nICZ2ZXJz
aW9uKSBjb25zdAotewotICAgIERPTVN0cmluZyBsb3dlciA9IGZlYXR1cmUubG93ZXIoKTsKLSAg
ICBpZiAobG93ZXIgPT0gImNvcmUiIHx8IGxvd2VyID09ICJodG1sIiB8fCBsb3dlciA9PSAieG1s
IiB8fCBsb3dlciA9PSAieGh0bWwiKQotICAgICAgICByZXR1cm4gdmVyc2lvbi5pc0VtcHR5KCkg
fHwgdmVyc2lvbiA9PSAiMS4wIiB8fCB2ZXJzaW9uID09ICIyLjAiOwotICAgIGlmIChsb3dlciA9
PSAiY3NzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gImNzczIiCi0gICAgICAgICAgICB8fCBs
b3dlciA9PSAiZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gImh0bWxldmVudHMiCi0g
ICAgICAgICAgICB8fCBsb3dlciA9PSAibW91c2VldmVudHMiCi0gICAgICAgICAgICB8fCBsb3dl
ciA9PSAibXV0YXRpb25ldmVudHMiCi0gICAgICAgICAgICB8fCBsb3dlciA9PSAicmFuZ2UiCi0g
ICAgICAgICAgICB8fCBsb3dlciA9PSAic3R5bGVzaGVldHMiCi0gICAgICAgICAgICB8fCBsb3dl
ciA9PSAidHJhdmVyc2FsIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gInVpZXZlbnRzIgotICAg
ICAgICAgICAgfHwgbG93ZXIgPT0gInZpZXdzIikKLSAgICAgICAgcmV0dXJuIHZlcnNpb24uaXNF
bXB0eSgpIHx8IHZlcnNpb24gPT0gIjIuMCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Eb2N1
bWVudFR5cGVJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6OmNyZWF0ZURvY3VtZW50VHlwZSgg
Y29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBjb25zdCBET01TdHJpbmcgJnB1YmxpY0lk
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQsIGludCAmZXhjZXB0aW9uY29kZSApCi17
Ci0gICAgLy8gTm90IG1lbnRpb25lZCBpbiBzcGVjOiB0aHJvdyBOQU1FU1BBQ0VfRVJSIGlmIG5v
IHF1YWxpZmllZE5hbWUgc3VwcGxpZWQKLSAgICBpZiAocXVhbGlmaWVkTmFtZS5pc051bGwoKSkg
ewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6
IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGlsbGVn
YWwgY2hhcmFjdGVyLgotICAgIERPTVN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKLSAgICBpZiAo
IURvY3VtZW50SW1wbDo6cGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZpeCwg
bG9jYWxOYW1lKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpJTlZB
TElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIE5B
TUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgcXVhbGlmaWVkTmFtZSBpcyBtYWxmb3JtZWQuCi0g
ICAgaWYgKHF1YWxpZmllZE5hbWVJc01hbGZvcm1lZChxdWFsaWZpZWROYW1lKSkgewotICAgICAg
ICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwotICAgICAgICBy
ZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IERvY3VtZW50VHlwZUltcGwodGhpcywg
MCwgcXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLX0KLQotRE9NSW1wbGVtZW50
YXRpb25JbXBsKiBET01JbXBsZW1lbnRhdGlvbkltcGw6OmdldEludGVyZmFjZShjb25zdCBET01T
dHJpbmcmIC8qZmVhdHVyZSovKSBjb25zdAotewotICAgIC8vICMjIwotICAgIHJldHVybiAwOwot
fQotCi1Eb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlRG9jdW1lbnQo
IGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxpZmll
ZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIERvY3VtZW50VHlwZUltcGwgKmRvY3R5cGUsIGludCAmZXhjZXB0aW9uY29kZSApCi17Ci0g
ICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBpZiAoIXF1YWxpZmllZE5hbWUuaXNFbXB0eSgp
KSB7Ci0gICAgICAgIC8vIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVj
aWZpZWQgcXVhbGlmaWVkIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuCi0gICAg
ICAgIERPTVN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKLSAgICAgICAgaWYgKCFEb2N1bWVudElt
cGw6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFtZSkp
IHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hB
UkFDVEVSX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gTkFNRVNQQUNFX0VSUjoKLSAgICAgICAgLy8gLSBSYWlzZWQgaWYgdGhlIHF1YWxpZmllZE5h
bWUgaXMgbWFsZm9ybWVkLAotICAgICAgICAvLyAtIGlmIHRoZSBxdWFsaWZpZWROYW1lIGhhcyBh
IHByZWZpeCBhbmQgdGhlIG5hbWVzcGFjZVVSSSBpcyBudWxsLCBvcgotICAgICAgICAvLyAtIGlm
IHRoZSBxdWFsaWZpZWROYW1lIGhhcyBhIHByZWZpeCB0aGF0IGlzICJ4bWwiIGFuZCB0aGUgbmFt
ZXNwYWNlVVJJIGlzIGRpZmZlcmVudAotICAgICAgICAvLyAgIGZyb20gImh0dHA6Ly93d3cudzMu
b3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgW05hbWVzcGFjZXNdLgotICAgICAgICBpbnQgY29sb25w
b3MgPSAtMTsKLSAgICAgICAgdWludCBpOwotICAgICAgICBET01TdHJpbmdJbXBsICpxbmFtZSA9
IHF1YWxpZmllZE5hbWUuaW1wbCgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcW5hbWUtPmwg
JiYgY29sb25wb3MgPCAwOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKnFuYW1lKVtpXSA9PSAn
OicpCi0gICAgICAgICAgICAgICAgY29sb25wb3MgPSBpOwotICAgICAgICB9Ci0gICAgCi0gICAg
ICAgIGlmIChxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQocXVhbGlmaWVkTmFtZSkgfHwKLSAgICAg
ICAgICAgIChjb2xvbnBvcyA+PSAwICYmIG5hbWVzcGFjZVVSSS5pc051bGwoKSkgfHwKLSAgICAg
ICAgICAgIChjb2xvbnBvcyA9PSAzICYmIHF1YWxpZmllZE5hbWVbMF0gPT0gJ3gnICYmIHF1YWxp
ZmllZE5hbWVbMV0gPT0gJ20nICYmIHF1YWxpZmllZE5hbWVbMl0gPT0gJ2wnICYmCi0gICAgICAg
ICAgICAgbmFtZXNwYWNlVVJJICE9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3Bh
Y2UiKSkgewotCi0gICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1F
U1BBQ0VfRVJSOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAg
Ci0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgZG9jdHlwZSBoYXMgYWxyZWFk
eSBiZWVuIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBkb2N1bWVudCBvciB3YXMKLSAgICAvLyBjcmVh
dGVkIGZyb20gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgaWYgKGRvY3R5cGUgJiYg
KGRvY3R5cGUtPmdldERvY3VtZW50KCkgfHwgZG9jdHlwZS0+aW1wbGVtZW50YXRpb24oKSAhPSB0
aGlzKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpXUk9OR19ET0NV
TUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vICMjIyB0aGlzIGlz
IGNvbXBsZXRlbHkgYnJva2VuLi4gd2l0aG91dCBhIHZpZXcgaXQgd2lsbCBub3Qgd29yayAoRGly
aykKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IG5ldyBEb2N1bWVudEltcGwodGhpcywgMCk7Ci0K
LSAgICAvLyBub3cgZ2V0IHRoZSBpbnRlcmVzdGluZyBwYXJ0cyBvZiB0aGUgZG9jdHlwZQotICAg
IGlmIChkb2N0eXBlKQotICAgICAgICBkb2MtPnNldERvY1R5cGUobmV3IERvY3VtZW50VHlwZUlt
cGwoZG9jLCAqZG9jdHlwZSkpOwotCi0gICAgaWYgKCFxdWFsaWZpZWROYW1lLmlzRW1wdHkoKSkg
ewotICAgICAgICBFbGVtZW50SW1wbCAqcm9vdEVsZW1lbnQgPSBkb2MtPmNyZWF0ZUVsZW1lbnRO
UyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUsIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBk
b2MtPmFkZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGRvYzsK
LX0KLQotQ1NTU3R5bGVTaGVldEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlQ1NT
U3R5bGVTaGVldChjb25zdCBET01TdHJpbmcgJi8qdGl0bGUqLywgY29uc3QgRE9NU3RyaW5nICZt
ZWRpYSwgaW50ICYvKmV4Y2VwdGlvbiovKQotewotICAgIC8vICMjIyBUT0RPIDogdGl0bGUgc2hv
dWxkIGJlIHNldCwgYW5kIG1lZGlhIGNvdWxkIGhhdmUgd3Jvbmcgc3ludGF4LCBpbiB3aGljaCBj
YXNlIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBleGNlcHRpb24uCi0gICAgQ1NTU3R5bGVTaGVldElt
cGwgKiBjb25zdCBudWxsU2hlZXQgPSAwOwotICAgIENTU1N0eWxlU2hlZXRJbXBsICpzaGVldCA9
IG5ldyBDU1NTdHlsZVNoZWV0SW1wbChudWxsU2hlZXQpOwotICAgIHNoZWV0LT5zZXRNZWRpYShu
ZXcgTWVkaWFMaXN0SW1wbChzaGVldCwgbWVkaWEpKTsKLSAgICByZXR1cm4gc2hlZXQ7Ci19Ci0K
LURvY3VtZW50SW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVhdGVEb2N1bWVudCggS0hU
TUxWaWV3ICp2ICkKLXsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50SW1wbCh0aGlzLCB2KTsKLX0K
LQotSFRNTERvY3VtZW50SW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVhdGVIVE1MRG9j
dW1lbnQoIEtIVE1MVmlldyAqdiApCi17Ci0gICAgcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRJbXBs
KHRoaXMsIHYpOwotfQotCi1ET01JbXBsZW1lbnRhdGlvbkltcGwgKkRPTUltcGxlbWVudGF0aW9u
SW1wbDo6aW5zdGFuY2UoKQotewotICAgIGlmICghbV9pbnN0YW5jZSkgewotICAgICAgICBtX2lu
c3RhbmNlID0gbmV3IERPTUltcGxlbWVudGF0aW9uSW1wbCgpOwotICAgICAgICBtX2luc3RhbmNl
LT5yZWYoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9pbnN0YW5jZTsKLX0KLQotYm9vbCBET01J
bXBsZW1lbnRhdGlvbkltcGw6OmlzWE1MTUlNRVR5cGUoY29uc3QgRE9NU3RyaW5nJiBtaW1lVHlw
ZSkKLXsKLSAgICBpZiAobWltZVR5cGUgPT0gInRleHQveG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBw
bGljYXRpb24veG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veGh0bWwreG1sIiB8fAot
ICAgICAgICBtaW1lVHlwZSA9PSAidGV4dC94c2wiIHx8IG1pbWVUeXBlID09ICJhcHBsaWNhdGlv
bi9yc3MreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24vYXRvbSt4bWwiCi0jaWYgU1ZH
X1NVUFBPUlQKLSAgICAgICAgfHwgbWltZVR5cGUgPT0gImltYWdlL3N2Zyt4bWwiCi0jZW5kaWYK
LSAgICAgICAgKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0K
LUhUTUxEb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlSFRNTERvY3Vt
ZW50KGNvbnN0IERPTVN0cmluZyAmdGl0bGUpCi17Ci0gICAgSFRNTERvY3VtZW50SW1wbCAqZCA9
IGNyZWF0ZUhUTUxEb2N1bWVudCggMCAvKiAjIyMgY3JlYXRlIGEgdmlldyBvdGhlcndpc2UgaXQg
ZG9lc24ndCB3b3JrICovKTsKLSAgICBkLT5vcGVuKCk7Ci0gICAgLy8gRklYTUU6IE5lZWQgdG8g
ZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgdGl0bGU/Ci0gICAgZC0+d3JpdGUoIjxo
dG1sPjxoZWFkPjx0aXRsZT4iICsgdGl0bGUucXN0cmluZygpICsgIjwvdGl0bGU+PC9oZWFkPiIp
OwotICAgIHJldHVybiBkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUVB0ckxpc3Q8RG9j
dW1lbnRJbXBsPiAqIERvY3VtZW50SW1wbDo6Y2hhbmdlZERvY3VtZW50cyA9IDA7Ci0KLS8vIEtI
VE1MVmlldyBtaWdodCBiZSAwCi1Eb2N1bWVudEltcGw6OkRvY3VtZW50SW1wbChET01JbXBsZW1l
bnRhdGlvbkltcGwgKl9pbXBsZW1lbnRhdGlvbiwgS0hUTUxWaWV3ICp2KQotICAgIDogQ29udGFp
bmVyTm9kZUltcGwoMCkKLSAgICAgICwgbV9kb210cmVlX3ZlcnNpb24oMCkKLSAgICAgICwgbV90
aXRsZSgiIikKLSAgICAgICwgbV90aXRsZVNldEV4cGxpY2l0bHkoZmFsc2UpCi0gICAgICAsIG1f
aW1hZ2VMb2FkRXZlbnRUaW1lcigwKQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICwgbV9i
aW5kaW5nTWFuYWdlcihuZXcgWEJMQmluZGluZ01hbmFnZXIodGhpcykpCi0jZW5kaWYKLSNpZmRl
ZiBLSFRNTF9YU0xUCi0gICAgLCBtX3RyYW5zZm9ybVNvdXJjZSgwKQotI2VuZGlmCi0gICAgLCBt
X2ZpbmlzaGVkUGFyc2luZyh0aGlzLCBTSUdOQUwoZmluaXNoZWRQYXJzaW5nKCkpKQotICAgICwg
bV9pblBhZ2VDYWNoZShmYWxzZSkKLSAgICAsIG1fc2F2ZWRSZW5kZXJlcigwKQotICAgICwgbV9w
YXNzd29yZEZpZWxkcygwKQotICAgICwgbV9zZWN1cmVGb3JtcygwKQotICAgICwgbV9jcmVhdGVS
ZW5kZXJlcnModHJ1ZSkKLSAgICAsIG1fZGVzaWduTW9kZShpbmhlcml0KQotICAgICwgbV9oYXNE
YXNoYm9hcmRSZWdpb25zKGZhbHNlKQotICAgICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHkoZmFs
c2UpCi0gICAgLCBtX3NlbGZPbmx5UmVmQ291bnQoMCkKLSAgICAsIG1fc2VsZWN0ZWRSYWRpb0J1
dHRvbnMoMCkKLXsKLSAgICBkb2N1bWVudC5yZXNldFNraXBwaW5nUmVmKHRoaXMpOwotCi0gICAg
bV9wYWludERldmljZSA9IDA7Ci0gICAgbV9wYWludERldmljZU1ldHJpY3MgPSAwOwotCi0gICAg
bV92aWV3ID0gdjsKLSAgICBtX3JlbmRlckFyZW5hID0gMDsKLQotICAgIG1fYWNjQ2FjaGUgPSAw
OwotICAgIAotICAgIGlmICggdiApIHsKLSAgICAgICAgbV9kb2NMb2FkZXIgPSBuZXcgRG9jTG9h
ZGVyKHYtPmZyYW1lKCksIHRoaXMgKTsKLSAgICAgICAgc2V0UGFpbnREZXZpY2UoIG1fdmlldyAp
OwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIG1fZG9jTG9hZGVyID0gbmV3IERvY0xvYWRlcigg
MCwgdGhpcyApOwotCi0gICAgdmlzdWFsbHlPcmRlcmVkID0gZmFsc2U7Ci0gICAgbV9sb2FkaW5n
U2hlZXQgPSBmYWxzZTsKLSAgICBtX2JQYXJzaW5nID0gZmFsc2U7Ci0gICAgbV9kb2NDaGFuZ2Vk
ID0gZmFsc2U7Ci0gICAgbV9zaGVldCA9IDA7Ci0gICAgbV9lbGVtU2hlZXQgPSAwOwotICAgIG1f
dG9rZW5pemVyID0gMDsKLQotICAgIG1faW1wbGVtZW50YXRpb24gPSBfaW1wbGVtZW50YXRpb247
Ci0gICAgaWYgKG1faW1wbGVtZW50YXRpb24pCi0gICAgICAgIG1faW1wbGVtZW50YXRpb24tPnJl
ZigpOwotICAgIHBNb2RlID0gU3RyaWN0OwotICAgIGhNb2RlID0gWEh0bWw7Ci0gICAgbV90ZXh0
Q29sb3IgPSBRdDo6YmxhY2s7Ci0gICAgbV9lbGVtZW50TmFtZXMgPSAwOwotICAgIG1fZWxlbWVu
dE5hbWVBbGxvYyA9IDA7Ci0gICAgbV9lbGVtZW50TmFtZUNvdW50ID0gMDsKLSAgICBtX2F0dHJO
YW1lcyA9IDA7Ci0gICAgbV9hdHRyTmFtZUFsbG9jID0gMDsKLSAgICBtX2F0dHJOYW1lQ291bnQg
PSAwOwotICAgIG1fZGVmYXVsdFZpZXcgPSBuZXcgQWJzdHJhY3RWaWV3SW1wbCh0aGlzKTsKLSAg
ICBtX2RlZmF1bHRWaWV3LT5yZWYoKTsKLSAgICBtX2xpc3RlbmVyVHlwZXMgPSAwOwotICAgIG1f
c3R5bGVTaGVldHMgPSBuZXcgU3R5bGVTaGVldExpc3RJbXBsOwotICAgIG1fc3R5bGVTaGVldHMt
PnJlZigpOwotICAgIG1faW5Eb2N1bWVudCA9IHRydWU7Ci0gICAgbV9zdHlsZVNlbGVjdG9yRGly
dHkgPSBmYWxzZTsKLSAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICBtX2Nsb3NlQWZ0
ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgIG1fdXNlc0Rlc2NlbmRhbnRSdWxlcyA9IGZhbHNl
OwotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IGZhbHNlOwotCi0gICAgbV9zdHlsZVNlbGVjdG9y
ID0gbmV3IENTU1N0eWxlU2VsZWN0b3IodGhpcywgbV91c2Vyc2hlZXQsIG1fc3R5bGVTaGVldHMs
ICFpbkNvbXBhdE1vZGUoKSk7Ci0gICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5zZXRBdXRvRGVs
ZXRlKHRydWUpOwotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzID0gMDsKLSAgICBtX2lnbm9yZVBl
bmRpbmdTdHlsZXNoZWV0cyA9IGZhbHNlOwotCi0gICAgbV9jc3NUYXJnZXQgPSAwOwotICAgIG1f
YWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0KLSAgICByZXNldExpbmtDb2xvcigpOwotICAg
IHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHJlc2V0QWN0aXZlTGlua0NvbG9yKCk7Ci0K
LSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLSAgICBtX3N0YXJ0VGltZS5yZXN0
YXJ0KCk7Ci0gICAgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCA9IGZhbHNlOwotICAgIAot
ICAgIG1fanNFZGl0b3IgPSAwOwotCi0gICAgbV9tYXJrZXJzLnNldEF1dG9EZWxldGUodHJ1ZSk7
Ci0gICAgCi0gICAgc3RhdGljIGludCBkb2NJRCA9IDA7Ci0gICAgbV9kb2NJRCA9IGRvY0lEKys7
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVkTGFzdFJlZigpCi17Ci0gICAgaWYgKG1f
c2VsZk9ubHlSZWZDb3VudCkgewotICAgICAgICAvLyBpZiByZW1vdmluZyBhIGNoaWxkIHJlbW92
ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJlZiwgd2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0aGUg
ZG9jdW1lbnQgdG8gYmUgZGVzdHJ1Y3RlZCB1bnRpbCBhZnRlcgotICAgICAgICAvLyByZW1vdmVB
bGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBndWFyZCBvdXJzZWx2ZXMgd2l0aCBhbgotICAgICAg
ICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmCi0KLSAgICAgICAgRG9jUHRyPERvY3VtZW50SW1wbD4g
Z3VhcmQodGhpcyk7Ci0KLSAgICAgICAgLy8gd2UgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGJlIHJl
dGFpbmluZyBhbnkgb2Ygb3VyIGNoaWxkcmVuIHRocm91Z2gKLSAgICAgICAgLy8gdGhlc2UgZXh0
cmEgcG9pbnRlcnMgb3Igd2Ugd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUKLSAgICAgICAg
bV9kb2NUeXBlID0gMDsKLSAgICAgICAgbV9mb2N1c05vZGUgPSAwOwotICAgICAgICBtX2hvdmVy
Tm9kZSA9IDA7Ci0gICAgICAgIG1fYWN0aXZlTm9kZSA9IDA7Ci0gICAgICAgIG1fdGl0bGVFbGVt
ZW50ID0gMDsKLQotICAgICAgICByZW1vdmVBbGxDaGlsZHJlbigpOwotICAgIH0gZWxzZQotICAg
ICAgICBkZWxldGUgdGhpczsKLX0KLQotRG9jdW1lbnRJbXBsOjp+RG9jdW1lbnRJbXBsKCkKLXsK
LSAgICBhc3NlcnQoIW1fcmVuZGVyKTsKLSAgICBhc3NlcnQoIW1faW5QYWdlQ2FjaGUpOwotICAg
IGFzc2VydChtX3NhdmVkUmVuZGVyZXIgPT0gMCk7Ci0gICAgCi0gICAgS0pTOjpTY3JpcHRJbnRl
cnByZXRlcjo6Zm9yZ2V0QWxsRE9NTm9kZXNGb3JEb2N1bWVudCh0aGlzKTsKLQotICAgIGlmIChj
aGFuZ2VkRG9jdW1lbnRzICYmIG1fZG9jQ2hhbmdlZCkKLSAgICAgICAgY2hhbmdlZERvY3VtZW50
cy0+cmVtb3ZlKHRoaXMpOwotICAgIGRlbGV0ZSBtX3Rva2VuaXplcjsKLSAgICBkb2N1bWVudC5y
ZXNldFNraXBwaW5nUmVmKDApOwotICAgIGRlbGV0ZSBtX3NoZWV0OwotICAgIGRlbGV0ZSBtX3N0
eWxlU2VsZWN0b3I7Ci0gICAgZGVsZXRlIG1fZG9jTG9hZGVyOwotICAgIGlmIChtX2VsZW1TaGVl
dCApICBtX2VsZW1TaGVldC0+ZGVyZWYoKTsKLSAgICBpZiAobV9pbXBsZW1lbnRhdGlvbikKLSAg
ICAgICAgbV9pbXBsZW1lbnRhdGlvbi0+ZGVyZWYoKTsKLSAgICBkZWxldGUgbV9wYWludERldmlj
ZU1ldHJpY3M7Ci0gICAgCi0gICAgaWYgKG1fZWxlbWVudE5hbWVzKSB7Ci0gICAgICAgIGZvciAo
dW5zaWduZWQgc2hvcnQgaWQgPSAwOyBpZCA8IG1fZWxlbWVudE5hbWVDb3VudDsgaWQrKykKLSAg
ICAgICAgICAgIG1fZWxlbWVudE5hbWVzW2lkXS0+ZGVyZWYoKTsKLSAgICAgICAgZGVsZXRlIFtd
IG1fZWxlbWVudE5hbWVzOwotICAgIH0KLSAgICBpZiAobV9hdHRyTmFtZXMpIHsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBzaG9ydCBpZCA9IDA7IGlkIDwgbV9hdHRyTmFtZUNvdW50OyBpZCsrKQot
ICAgICAgICAgICAgbV9hdHRyTmFtZXNbaWRdLT5kZXJlZigpOwotICAgICAgICBkZWxldGUgW10g
bV9hdHRyTmFtZXM7Ci0gICAgfQotICAgIG1fZGVmYXVsdFZpZXctPmRlcmVmKCk7Ci0gICAgbV9z
dHlsZVNoZWV0cy0+ZGVyZWYoKTsKLQotICAgIGlmIChtX3JlbmRlckFyZW5hKXsKLSAgICAgICAg
ZGVsZXRlIG1fcmVuZGVyQXJlbmE7Ci0gICAgICAgIG1fcmVuZGVyQXJlbmEgPSAwOwotICAgIH0K
LQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB4bWxGcmVlRG9jKCh4bWxEb2NQdHIpbV90cmFuc2Zv
cm1Tb3VyY2UpOwotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgZGVsZXRlIG1f
YmluZGluZ01hbmFnZXI7Ci0jZW5kaWYKLQotICAgIGlmIChtX2FjY0NhY2hlKXsKLSAgICAgICAg
ZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAgICAgIG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAgICBt
X2RlY29kZXIgPSAwOwotICAgIAotICAgIGlmIChtX2pzRWRpdG9yKSB7Ci0gICAgICAgIGRlbGV0
ZSBtX2pzRWRpdG9yOwotICAgICAgICBtX2pzRWRpdG9yID0gMDsKLSAgICB9Ci0gICAgCi0gICAg
aWYgKG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMpIHsKLSAgICAgICAgRm9ybVRvR3JvdXBNYXA6Oml0
ZXJhdG9yIGVuZCA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmVuZCgpOwotICAgICAgICBmb3Ig
KEZvcm1Ub0dyb3VwTWFwOjppdGVyYXRvciBpdCA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgTmFtZVRvSW5wdXRNYXAgKm4g
PSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgaWYgKG4pCi0gICAgICAgICAgICAgICAgZGVsZXRl
IG47Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnM7Ci0g
ICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVzZXRMaW5rQ29sb3IoKQotewotICAgIG1f
bGlua0NvbG9yID0gUUNvbG9yKDAsIDAsIDIzOCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpy
ZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQotewotICAgIG1fdmlzaXRlZExpbmtDb2xvciA9IFFDb2xv
cig4NSwgMjYsIDEzOSk7ICAgIAotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVzZXRBY3RpdmVM
aW5rQ29sb3IoKQotewotICAgIG1fYWN0aXZlTGlua0NvbG9yLnNldE5hbWVkQ29sb3IoUVN0cmlu
ZygicmVkIikpOwotfQotCi1Eb2N1bWVudFR5cGVJbXBsICpEb2N1bWVudEltcGw6OmRvY3R5cGUo
KSBjb25zdAotewotICAgIHJldHVybiBtX2RvY1R5cGUuZ2V0KCk7Ci19Ci0KLURPTUltcGxlbWVu
dGF0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjppbXBsZW1lbnRhdGlvbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1faW1wbGVtZW50YXRpb247Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6
OmRvY3VtZW50RWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBmaXJzdENoaWxk
KCk7Ci0gICAgd2hpbGUgKG4gJiYgbi0+bm9kZVR5cGUoKSAhPSBOb2RlOjpFTEVNRU5UX05PREUp
Ci0gICAgICBuID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwqPihuKTsKLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlRWxl
bWVudChjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uQ29kZSkKLXsKLSAgICBy
ZXR1cm4gY3JlYXRlRWxlbWVudE5TKG51bGxBdG9tLCBuYW1lLCBleGNlcHRpb25Db2RlKTsKLX0K
LQotRG9jdW1lbnRGcmFnbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlRG9jdW1lbnRGcmFn
bWVudCggICkKLXsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKGdldERvY3Vt
ZW50KCkpOwotfQotCi1UZXh0SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVUZXh0Tm9kZShjb25z
dCBET01TdHJpbmcgJmRhdGEpCi17Ci0gICAgcmV0dXJuIG5ldyBUZXh0SW1wbCh0aGlzLCBkYXRh
KTsKLX0KLQotQ29tbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQ29tbWVudCAoY29uc3Qg
RE9NU3RyaW5nICZkYXRhKQotewotICAgIHJldHVybiBuZXcgQ29tbWVudEltcGwodGhpcywgZGF0
YSk7Ci19Ci0KLUNEQVRBU2VjdGlvbkltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQ0RBVEFTZWN0
aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgaWYgKGlz
SFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOT1Rf
U1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBu
ZXcgQ0RBVEFTZWN0aW9uSW1wbCh0aGlzLCBkYXRhKTsKLX0KLQotUHJvY2Vzc2luZ0luc3RydWN0
aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29uc3Qg
RE9NU3RyaW5nICZ0YXJnZXQsIGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24p
Ci17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZSh0YXJnZXQpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbiA9
IERPTUV4Y2VwdGlvbjo6SU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4gTlVM
TDsKLSAgICB9Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZXhjZXB0aW9u
ID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIE5VTEw7
Ci0gICAgfQotICAgIHJldHVybiBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlzLCB0
YXJnZXQsIGRhdGEpOwotfQotCi1FbnRpdHlSZWZlcmVuY2VJbXBsICpEb2N1bWVudEltcGw6OmNy
ZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9u
KQotewotICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0g
RE9NRXhjZXB0aW9uOjpJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiBOVUxM
OwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBleGNlcHRpb24g
PSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gTlVMTDsK
LSAgICB9Ci0gICAgcmV0dXJuIG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKHRoaXMsIG5hbWUuaW1w
bCgpKTsKLX0KLQotRWRpdGluZ1RleHRJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVkaXRpbmdU
ZXh0Tm9kZShjb25zdCBET01TdHJpbmcgJnRleHQpCi17Ci0gICAgcmV0dXJuIG5ldyBFZGl0aW5n
VGV4dEltcGwodGhpcywgdGV4dCk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsICpEb2N1
bWVudEltcGw6OmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKQotewotICAgIHJldHVybiBuZXcg
Q1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb25JbXBsOwotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJ
bXBsOjppbXBvcnROb2RlKE5vZGVJbXBsICppbXBvcnRlZE5vZGUsIGJvb2wgZGVlcCwgaW50ICZl
eGNlcHRpb25jb2RlKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgc3dpdGNoIChp
bXBvcnRlZE5vZGUtPm5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpURVhUX05PREU6
Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlVGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2RlVmFs
dWUoKSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICAg
ICAgcmV0dXJuIGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpLCBl
eGNlcHRpb25jb2RlKTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6
Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5UmVmZXJlbmNlKGltcG9ydGVkTm9kZS0+
bm9kZU5hbWUoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lO
R19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3NpbmdJ
bnN0cnVjdGlvbihpbXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGltcG9ydGVkTm9kZS0+bm9kZVZh
bHVlKCksIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToK
LSAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS0+bm9kZVZhbHVl
KCkpOwotICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERTogewotICAgICAgICAgICAgRWxl
bWVudEltcGwgKm9sZEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihpbXBvcnRl
ZE5vZGUpOwotICAgICAgICAgICAgRWxlbWVudEltcGwgKm5ld0VsZW1lbnQgPSBjcmVhdGVFbGVt
ZW50TlMob2xkRWxlbWVudC0+bmFtZXNwYWNlVVJJKCksIG9sZEVsZW1lbnQtPnRhZ05hbWUoKS50
b1N0cmluZygpLCBleGNlcHRpb25jb2RlKTsKLQkJCQotICAgICAgICAgICAgaWYgKGV4Y2VwdGlv
bmNvZGUgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAgbmV3
RWxlbWVudC0+cmVmKCk7Ci0KLSAgICAgICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0g
b2xkRWxlbWVudC0+YXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdHRycykgewot
ICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGF0dHJzLT5sZW5ndGgoKTsKLSAgICAg
ICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAg
ICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCogYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVt
KGkpOwotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGUoYXR0ci0+
bmFtZSgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgICAg
ICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IH0KLQotICAgICAgICAgICAgbmV3RWxlbWVudC0+Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMo
b2xkRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGlmIChkZWVwKSB7Ci0gICAgICAgICAgICAgICAg
Zm9yIChOb2RlSW1wbCAqb2xkQ2hpbGQgPSBvbGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9sZENo
aWxkOyBvbGRDaGlsZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIE5vZGVJbXBsICpuZXdDaGlsZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGV4
Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAhPSAw
KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAg
ICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlv
bmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAhPSAwKSB7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAg
ICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRyaWNrIHRvIGdldCB0aGUg
cmVzdWx0IGJhY2sgdG8gdGhlIGZsb2F0aW5nIHN0YXRlLCB3aXRoIDAgcmVmcyBidXQgbm90IGRl
c3Ryb3llZC4KLSAgICAgICAgICAgIG5ld0VsZW1lbnQtPnNldFBhcmVudCh0aGlzKTsKLSAgICAg
ICAgICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7Ci0gICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRQ
YXJlbnQoMCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgICAgICB9Ci0g
ICAgfQotCi0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9F
UlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotTm9kZUltcGwgKkRvY3VtZW50SW1wbDo6YWRvcHRO
b2RlKE5vZGVJbXBsICpzb3VyY2UsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoIXNv
dXJjZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90
ZWN0KHNvdXJjZSk7Ci0KLSAgICBzd2l0Y2ggKHNvdXJjZS0+bm9kZVR5cGUoKSkgewotICAgICAg
ICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05P
REU6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9O
T0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAg
IGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAg
ICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRF
X05PREU6IHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBBdHRySW1wbCAqYXR0ciA9
IHN0YXRpY19jYXN0PEF0dHJJbXBsICo+KHNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIGlmIChhdHRyLT5vd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBhdHRyLT5vd25l
ckVsZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyLCBleGNlcHRpb25jb2RlKTsKLQot
ICAgICAgICAgICAgYXR0ci0+bV9zcGVjaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoc291
cmNlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgICAgICAgICAgc291cmNlLT5wYXJlbnROb2RlKCkt
PnJlbW92ZUNoaWxkKHNvdXJjZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgfQotICAgICAgICAgICAg
ICAgIAotICAgIGZvciAoTm9kZUltcGwgKm5vZGUgPSBzb3VyY2U7IG5vZGU7IG5vZGUgPSBub2Rl
LT50cmF2ZXJzZU5leHROb2RlKHNvdXJjZSkpIHsKLSAgICAgICAgS0pTOjpTY3JpcHRJbnRlcnBy
ZXRlcjo6dXBkYXRlRE9NTm9kZURvY3VtZW50KG5vZGUsIG5vZGUtPmdldERvY3VtZW50KCksIHRo
aXMpOwotICAgICAgICBub2RlLT5zZXREb2N1bWVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1
cm4gc291cmNlOwotCi19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVsZW1l
bnROUyhjb25zdCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmcXVh
bGlmaWVkTmFtZSwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIC8vIEZJWE1FOiBXZSdkIGxp
a2UgYSBmYXN0ZXIgY29kZSBwYXRoIHRoYXQgc2tpcHMgdGhpcyBjaGVjayBmb3IgY2FsbHMgZnJv
bSBpbnNpZGUgdGhlIGVuZ2luZSB3aGVyZSB0aGUgbmFtZSBpcyBrbm93biB0byBiZSB2YWxpZC4K
LSAgICBET01TdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYgKCFwYXJzZVF1YWxpZmll
ZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUpKSB7Ci0gICAgICAgIGV4Y2Vw
dGlvbmNvZGUgPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRWxlbWVudEltcGwgKmUgPSAwOwotICAgIFF1YWxpZmll
ZE5hbWUgcU5hbWUgPSBRdWFsaWZpZWROYW1lKEF0b21pY1N0cmluZyhwcmVmaXgpLCBBdG9taWNT
dHJpbmcobG9jYWxOYW1lKSwgQXRvbWljU3RyaW5nKF9uYW1lc3BhY2VVUkkpKTsKLSAgICAKLSAg
ICAvLyBGSVhNRTogVXNlIHJlZ2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBhIGhh
c2ggdG8gZmluZCB0aGUgcmlnaHQgZmFjdG9yeS4KLSAgICBpZiAoX25hbWVzcGFjZVVSSSA9PSB4
aHRtbE5hbWVzcGFjZVVSSSkgewotICAgICAgICBlID0gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVh
dGVIVE1MRWxlbWVudChxTmFtZS5sb2NhbE5hbWUoKSwgdGhpcywgMCwgZmFsc2UpOwotICAgICAg
ICBpZiAoZSAmJiAhcHJlZml4LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBlLT5zZXRQcmVmaXgo
cU5hbWUucHJlZml4KCksIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlv
bmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0jaWYg
U1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChfbmFtZXNwYWNlVVJJID09IEtTVkc6OlNWR05hbWVz
OjpzdmdOYW1lc3BhY2VVUkkpCi0gICAgICAgIGUgPSBLU1ZHOjpTVkdFbGVtZW50RmFjdG9yeTo6
Y3JlYXRlU1ZHRWxlbWVudChxTmFtZSwgdGhpcywgZmFsc2UpOwotI2VuZGlmCi0gICAgCi0gICAg
aWYgKCFlKQotICAgICAgICBlID0gbmV3IEVsZW1lbnRJbXBsKHFOYW1lLCBnZXREb2N1bWVudCgp
KTsKLSAgICAKLSAgICByZXR1cm4gZTsKLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6
Z2V0RWxlbWVudEJ5SWQoIGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkICkgY29uc3QKLXsKLSAg
ICBFbGVtZW50SW1wbCAqZWxlbWVudDsKLSAgICBRU3RyaW5nIHFJZCA9IGVsZW1lbnRJZC5xc3Ry
aW5nKCk7Ci0KLSAgICBpZiAoZWxlbWVudElkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgfQotCi0gICAgZWxlbWVudCA9IG1fZWxlbWVudHNCeUlkLmZpbmQocUlkKTsK
LSAgICAKLSAgICBpZiAoZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAg
IAotICAgIGlmIChpbnQgaWRDb3VudCA9IChpbnQpbV9pZENvdW50LmZpbmQocUlkKSkgewotICAg
ICAgICBmb3IgKE5vZGVJbXBsICpuID0gdHJhdmVyc2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4gPSBu
LT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAgICAgIGlmICghbi0+aXNFbGVtZW50Tm9k
ZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIGVsZW1lbnQtPmdldEF0dHJpYnV0
ZShpZEF0dHIpID09IGVsZW1lbnRJZCkgewotICAgICAgICAgICAgICAgIGlmIChpZENvdW50ID09
IDEpIAotICAgICAgICAgICAgICAgICAgICBtX2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0gICAgICAg
ICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtX2lkQ291bnQuaW5zZXJ0KHFJZCwg
KGNoYXIgKilpZENvdW50IC0gMSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAg
bV9lbGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0
dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJu
IDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmVsZW1lbnRGcm9tUG9pbnQoIGNv
bnN0IGludCBfeCwgY29uc3QgaW50IF95ICkgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSBy
ZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3Q6Ok5vZGVJbmZvIG5vZGVJbmZvKHRydWUs
IHRydWUpOwotICAgIG1fcmVuZGVyLT5sYXllcigpLT5oaXRUZXN0KG5vZGVJbmZvLCBfeCwgX3kp
OyAKLSAgICBOb2RlSW1wbCogbiA9IG5vZGVJbmZvLmlubmVyTm9kZSgpOwotCi0gICAgd2hpbGUg
KCBuICYmICFuLT5pc0VsZW1lbnROb2RlKCkgKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2Rl
KCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+KG4p
OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkRWxlbWVudEJ5SWQoY29uc3QgRE9NU3RyaW5n
ICZlbGVtZW50SWQsIEVsZW1lbnRJbXBsICplbGVtZW50KQotewotICAgIFFTdHJpbmcgcUlkID0g
ZWxlbWVudElkLnFzdHJpbmcoKTsKLSAgICAKLSAgICBpZiAobV9lbGVtZW50c0J5SWQuZmluZChx
SWQpID09IE5VTEwpIHsKLSAgICAgICAgbV9lbGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwgZWxlbWVu
dCk7Ci0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsK
LSAgICAgICAgaW50IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5maW5kKHFJZCk7Ci0gICAgICAg
IG1faWRDb3VudC5pbnNlcnQocUlkLCAoY2hhciAqKShpZENvdW50ICsgMSkpOwotICAgIH0KLX0K
LQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZUVsZW1lbnRCeUlkKGNvbnN0IERPTVN0cmluZyAm
ZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCkKLXsKLSAgICBRU3RyaW5nIHFJZCA9IGVs
ZW1lbnRJZC5xc3RyaW5nKCk7Ci0KLSAgICBpZiAobV9lbGVtZW50c0J5SWQuZmluZChxSWQpID09
IGVsZW1lbnQpIHsKLSAgICAgICAgbV9lbGVtZW50c0J5SWQucmVtb3ZlKHFJZCk7Ci0gICAgICAg
IG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50
IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5maW5kKHFJZCk7ICAgICAgICAKLSAgICAgICAgYXNz
ZXJ0KGlkQ291bnQgPiAwKTsKLSAgICAgICAgaWYgKGlkQ291bnQgPT0gMSkgCi0gICAgICAgICAg
ICBtX2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1faWRD
b3VudC5pbnNlcnQocUlkLCAoY2hhciAqKShpZENvdW50IC0gMSkpOwotICAgIH0KLX0KLQotRWxl
bWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KCBjb25zdCBET01T
dHJpbmcgJmtleSApCi17Ci0gICAgaWYgKCFrZXkubGVuZ3RoKCkpCi0JcmV0dXJuIDA7Ci0KLSAg
ICBpZiAoIW1fYWNjZXNzS2V5RGljdFZhbGlkKSB7Ci0gICAgICAgIG1fZWxlbWVudHNCeUFjY2Vz
c0tleS5jbGVhcigpOwotICAgIAotICAgICAgICBjb25zdCBOb2RlSW1wbCAqbjsKLSAgICAgICAg
Zm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAg
ICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJbXBsICplbGVtZW50SW1wbCA9IHN0YXRpY19j
YXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICAgICAgRE9NU3RyaW5nIGFjY2Vz
c0tleShlbGVtZW50SW1wbC0+Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpKTs7Ci0gICAgICAg
ICAgICBpZiAoIWFjY2Vzc0tleS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBRU3RyaW5n
IGFrID0gYWNjZXNzS2V5LnFzdHJpbmcoKS5sb3dlcigpOwotICAgICAgICAgICAgICAgIGlmICht
X2VsZW1lbnRzQnlBY2Nlc3NLZXkuZmluZChhaykgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAg
ICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5Lmluc2VydChhaywgZWxlbWVudEltcGwpOwotICAgICAg
ICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIG1fZWxlbWVudHNCeUFjY2Vzc0tleS5maW5kKGtleS5xc3RyaW5n
KCkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlVGl0bGUoKQotewotICAgIEZyYW1l
ICpwID0gZnJhbWUoKTsKLSAgICBpZiAoIXApCi0gICAgICAgIHJldHVybjsKLQotICAgIE1hYyhw
KS0+c2V0VGl0bGUobV90aXRsZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRUaXRsZShE
T01TdHJpbmcgdGl0bGUsIE5vZGVJbXBsICp0aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYgKCF0aXRs
ZUVsZW1lbnQpIHsKLSAgICAgICAgLy8gVGl0bGUgc2V0IGJ5IEphdmFTY3JpcHQgLS0gb3ZlcnJp
ZGVzIGFueSB0aXRsZSBlbGVtZW50cy4KLSAgICAgICAgbV90aXRsZVNldEV4cGxpY2l0bHkgPSB0
cnVlOwotICAgICAgICBtX3RpdGxlRWxlbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh0aXRsZUVs
ZW1lbnQgIT0gbV90aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKG1fdGl0bGVFbGVtZW50KQot
ICAgICAgICAgICAgLy8gT25seSBhbGxvdyB0aGUgZmlyc3QgdGl0bGUgZWxlbWVudCB0byBjaGFu
Z2UgdGhlIHRpdGxlIC0tIG90aGVycyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgICAgICAgIHJldHVy
bjsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSB0aXRsZUVsZW1lbnQ7Ci0gICAgfQotCi0gICAg
aWYgKG1fdGl0bGUgPT0gdGl0bGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGl0bGUgPSB0
aXRsZTsKLSAgICB1cGRhdGVUaXRsZSgpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3Zl
VGl0bGUoTm9kZUltcGwgKnRpdGxlRWxlbWVudCkKLXsKLSAgICBpZiAobV90aXRsZUVsZW1lbnQg
IT0gdGl0bGVFbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhNRTogSWRlYWxs
eSB3ZSBtaWdodCB3YW50IHRoaXMgdG8gc2VhcmNoIGZvciB0aGUgZmlyc3QgcmVtYWluaW5nIHRp
dGxlIGVsZW1lbnQsIGFuZCB1c2UgaXQuCi0gICAgbV90aXRsZUVsZW1lbnQgPSAwOwotCi0gICAg
aWYgKCFtX3RpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBtX3RpdGxlID0gIiI7Ci0gICAgICAg
IHVwZGF0ZVRpdGxlKCk7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpub2Rl
TmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICIjZG9jdW1lbnQiOwotfQotCi11bnNpZ25lZCBz
aG9ydCBEb2N1bWVudEltcGw6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gTm9kZTo6
RE9DVU1FTlRfTk9ERTsKLX0KLQotUVN0cmluZyBEb2N1bWVudEltcGw6Om5leHRTdGF0ZSgpCi17
Ci0gICBRU3RyaW5nIHN0YXRlOwotICAgaWYgKCFtX3N0YXRlLmlzRW1wdHkoKSkKLSAgIHsKLSAg
ICAgIHN0YXRlID0gbV9zdGF0ZS5maXJzdCgpOwotICAgICAgbV9zdGF0ZS5yZW1vdmUobV9zdGF0
ZS5iZWdpbigpKTsKLSAgIH0KLSAgIHJldHVybiBzdGF0ZTsKLX0KLQotUVN0cmluZ0xpc3QgRG9j
dW1lbnRJbXBsOjpkb2NTdGF0ZSgpCi17Ci0gICAgUVN0cmluZ0xpc3QgczsKLSAgICBmb3IgKFFQ
dHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0KG1fbWFpbnRhaW5zU3RhdGUpOyBpdC5jdXJyZW50
KCk7ICsraXQpCi0gICAgICAgIHMuYXBwZW5kKGl0LmN1cnJlbnQoKS0+c3RhdGUoKSk7Ci0KLSAg
ICByZXR1cm4gczsKLX0KLQotRnJhbWUgKkRvY3VtZW50SW1wbDo6ZnJhbWUoKSBjb25zdCAKLXsK
LSAgICByZXR1cm4gbV92aWV3ID8gbV92aWV3LT5mcmFtZSgpIDogMDsgCi19Ci0KLVJhbmdlSW1w
bCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVSYW5nZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBSYW5nZUlt
cGwodGhpcyk7Ci19Ci0KLU5vZGVJdGVyYXRvckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlTm9k
ZUl0ZXJhdG9yKE5vZGVJbXBsICpyb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKLSAgICBOb2Rl
RmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAmZXhj
ZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9
IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAg
IH0KLSAgICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmls
dGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLX0KLQotVHJlZVdhbGtlckltcGwgKkRvY3Vt
ZW50SW1wbDo6Y3JlYXRlVHJlZVdhbGtlcihOb2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hhdFRv
U2hvdywgCi0gICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZl
cmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgaWYgKCFyb290KSB7Ci0gICAgICAg
IGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBUcmVlV2Fsa2VySW1wbChyb290LCB3
aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotfQotCi12b2lkIERv
Y3VtZW50SW1wbDo6c2V0RG9jdW1lbnRDaGFuZ2VkKGJvb2wgYikKLXsKLSAgICBpZiAoIWNoYW5n
ZWREb2N1bWVudHMpCi0gICAgICAgIGNoYW5nZWREb2N1bWVudHMgPSBuZXcgUVB0ckxpc3Q8RG9j
dW1lbnRJbXBsPjsKLQotICAgIGlmIChiICYmICFtX2RvY0NoYW5nZWQpCi0gICAgICAgIGNoYW5n
ZWREb2N1bWVudHMtPmFwcGVuZCh0aGlzKTsKLSAgICBlbHNlIGlmICghYiAmJiBtX2RvY0NoYW5n
ZWQpCi0gICAgICAgIGNoYW5nZWREb2N1bWVudHMtPnJlbW92ZSh0aGlzKTsKLSAgICBtX2RvY0No
YW5nZWQgPSBiOwotICAgIAotICAgIGlmIChtX2RvY0NoYW5nZWQpCi0gICAgICAgIG1fYWNjZXNz
S2V5RGljdFZhbGlkID0gZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZWNhbGNTdHls
ZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsKLS8vICAgICBxRGVidWcoInJlY2FsY1N0eWxlKCVw
KSIsIHRoaXMpOwotLy8gICAgIFFUaW1lIHF0OwotLy8gICAgIHF0LnN0YXJ0KCk7Ci0gICAgaWYg
KG1faW5TdHlsZVJlY2FsYykKLSAgICAgICAgcmV0dXJuOyAvLyBHdWFyZCBhZ2FpbnN0IHJlLWVu
dHJhbmN5LiAtZHdoCi0gICAgICAgIAotICAgIG1faW5TdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAg
Ci0gICAgaWYoICFtX3JlbmRlciApIGdvdG8gYmFpbF9vdXQ7Ci0KLSAgICBpZiAoIGNoYW5nZSA9
PSBGb3JjZSApIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG9sZFN0eWxlID0gbV9yZW5kZXItPnN0
eWxlKCk7Ci0gICAgICAgIGlmICggb2xkU3R5bGUgKSBvbGRTdHlsZS0+cmVmKCk7Ci0gICAgICAg
IFJlbmRlclN0eWxlKiBfc3R5bGUgPSBuZXcgKG1fcmVuZGVyQXJlbmEpIFJlbmRlclN0eWxlKCk7
Ci0gICAgICAgIF9zdHlsZS0+cmVmKCk7Ci0gICAgICAgIF9zdHlsZS0+c2V0RGlzcGxheShCTE9D
Syk7Ci0gICAgICAgIF9zdHlsZS0+c2V0VmlzdWFsbHlPcmRlcmVkKCB2aXN1YWxseU9yZGVyZWQg
KTsKLSAgICAgICAgLy8gIyMjIG1ha2UgdGhlIGZvbnQgc3R1ZmYgX3JlYWxseV8gd29yayEhISEK
LQotCWtodG1sOjpGb250RGVmIGZvbnREZWY7Ci0JUUZvbnQgZiA9IEtHbG9iYWxTZXR0aW5nczo6
Z2VuZXJhbEZvbnQoKTsKLQlmb250RGVmLmZhbWlseSA9ICooZi5maXJzdEZhbWlseSgpKTsKLQlm
b250RGVmLml0YWxpYyA9IGYuaXRhbGljKCk7Ci0JZm9udERlZi53ZWlnaHQgPSBmLndlaWdodCgp
OwotICAgICAgICBib29sIHByaW50aW5nID0gbV9wYWludERldmljZSAmJiAobV9wYWludERldmlj
ZS0+ZGV2VHlwZSgpID09IFFJbnRlcm5hbDo6UHJpbnRlcik7Ci0gICAgICAgIGZvbnREZWYudXNl
UHJpbnRlckZvbnQgPSBwcmludGluZzsKLSAgICAgICAgaWYgKG1fdmlldykgewotICAgICAgICAg
ICAgY29uc3QgS0hUTUxTZXR0aW5ncyAqc2V0dGluZ3MgPSBtX3ZpZXctPmZyYW1lKCktPnNldHRp
bmdzKCk7Ci0gICAgICAgICAgICBpZiAocHJpbnRpbmcgJiYgIXNldHRpbmdzLT5zaG91bGRQcmlu
dEJhY2tncm91bmRzKCkpIHsKLSAgICAgICAgICAgICAgICBfc3R5bGUtPnNldEZvcmNlQmFja2dy
b3VuZHNUb1doaXRlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUVN0cmluZyBz
dGRmb250ID0gc2V0dGluZ3MtPnN0ZEZvbnROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoICFzdGRm
b250LmlzRW1wdHkoKSApIHsKLSAgICAgICAgICAgICAgICBmb250RGVmLmZhbWlseS5zZXRGYW1p
bHkoc3RkZm9udCk7Ci0gICAgICAgICAgICAgICAgZm9udERlZi5mYW1pbHkuYXBwZW5kRmFtaWx5
KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRGb250
U2l6ZShmb250RGVmLCBtX3N0eWxlU2VsZWN0b3ItPmZvbnRTaXplRm9yS2V5d29yZChDU1NfVkFM
X01FRElVTSwgaW5Db21wYXRNb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8va2REZWJ1
ZygpIDw8ICJEb2N1bWVudEltcGw6OmF0dGFjaDogc2V0dGluZyB0byBjaGFyc2V0ICIgPDwgc2V0
dGluZ3MtPmNoYXJzZXQoKSA8PCBlbmRsOwotICAgICAgICBfc3R5bGUtPnNldEZvbnREZWYoZm9u
dERlZik7Ci0JX3N0eWxlLT5odG1sRm9udCgpLnVwZGF0ZSggcGFpbnREZXZpY2VNZXRyaWNzKCkg
KTsKLSAgICAgICAgaWYgKCBpbkNvbXBhdE1vZGUoKSApCi0gICAgICAgICAgICBfc3R5bGUtPnNl
dEh0bWxIYWNrcyh0cnVlKTsgLy8gZW5hYmxlIGh0bWwgc3BlY2lmaWMgcmVuZGVyaW5nIHRyaWNr
cwotCi0gICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gZGlmZiggX3N0eWxlLCBvbGRTdHlsZSApOwot
ICAgICAgICBpZihtX3JlbmRlciAmJiBjaCAhPSBOb0NoYW5nZSkKLSAgICAgICAgICAgIG1fcmVu
ZGVyLT5zZXRTdHlsZShfc3R5bGUpOwotICAgICAgICBpZiAoIGNoYW5nZSAhPSBGb3JjZSApCi0g
ICAgICAgICAgICBjaGFuZ2UgPSBjaDsKLQotICAgICAgICBfc3R5bGUtPmRlcmVmKG1fcmVuZGVy
QXJlbmEpOwotICAgICAgICBpZiAob2xkU3R5bGUpCi0gICAgICAgICAgICBvbGRTdHlsZS0+ZGVy
ZWYobV9yZW5kZXJBcmVuYSk7Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChu
ID0gX2ZpcnN0OyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKCBjaGFuZ2U+
PSBJbmhlcml0IHx8IG4tPmhhc0NoYW5nZWRDaGlsZCgpIHx8IG4tPmNoYW5nZWQoKSApCi0gICAg
ICAgICAgICBuLT5yZWNhbGNTdHlsZSggY2hhbmdlICk7Ci0gICAgLy9rZERlYnVnKCA2MDIwICkg
PDwgIlRJTUU6IHJlY2FsY1N0eWxlKCkgZHQ9IiA8PCBxdC5lbGFwc2VkKCkgPDwgZW5kbDsKLQot
ICAgIGlmIChjaGFuZ2VkKCkgJiYgbV92aWV3KQotCW1fdmlldy0+bGF5b3V0KCk7Ci0KLWJhaWxf
b3V0OgotICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxkKCBm
YWxzZSApOwotICAgIHNldERvY3VtZW50Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAKLSAgICBtX2lu
U3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICAKLSAgICAvLyBJZiB3ZSB3YW50ZWQgdG8gZW1pdCB0
aGUgaW1wbGljaXRDbG9zZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2Un
cmUgZmluaXNoZWQuCi0gICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7Ci0gICAgICAg
IG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0gICAgICAgIGltcGxpY2l0Q2xvc2Uo
KTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVSZW5kZXJpbmcoKQotewot
ICAgIGlmICghaGFzQ2hhbmdlZENoaWxkKCkpIHJldHVybjsKLQotLy8gICAgIFFUaW1lIHRpbWU7
Ci0vLyAgICAgdGltZS5zdGFydCgpOwotLy8gICAgIGtkRGVidWcoKSA8PCAiVVBEQVRFUkVOREVS
SU5HOiAiPDxlbmRsOwotCi0gICAgU3R5bGVDaGFuZ2UgY2hhbmdlID0gTm9DaGFuZ2U7Ci0gICAg
cmVjYWxjU3R5bGUoIGNoYW5nZSApOwotCi0vLyAgICBrZERlYnVnKCkgPDwgIlVQREFURVJFTkRF
UklORyB0aW1lIHVzZWQ9Ijw8dGltZS5lbGFwc2VkKCk8PGVuZGw7Ci19Ci0KLXZvaWQgRG9jdW1l
bnRJbXBsOjp1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKQotewotICAgIGlmICghY2hhbmdlZERv
Y3VtZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKERvY3VtZW50SW1wbCogZG9j
ID0gY2hhbmdlZERvY3VtZW50cy0+dGFrZSgpKSB7Ci0gICAgICAgIGRvYy0+bV9kb2NDaGFuZ2Vk
ID0gZmFsc2U7Ci0gICAgICAgIGRvYy0+dXBkYXRlUmVuZGVyaW5nKCk7Ci0gICAgfQotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlTGF5b3V0KCkKLXsKLSAgICAvLyBGSVhNRTogRGF2ZSdz
IHByZXR0eSBzdXJlIHdlIGNhbiByZW1vdmUgdGhpcyBiZWNhdXNlCi0gICAgLy8gbGF5b3V0IGNh
bGxzIHJlY2FsY1N0eWxlIGFzIG5lZWRlZC4KLSAgICB1cGRhdGVSZW5kZXJpbmcoKTsKLQotICAg
IC8vIE9ubHkgZG8gYSBsYXlvdXQgaWYgY2hhbmdlcyBoYXZlIG9jY3VycmVkIHRoYXQgbWFrZSBp
dCBuZWNlc3NhcnkuICAgICAgCi0gICAgaWYgKG1fdmlldyAmJiByZW5kZXJlcigpICYmIHJlbmRl
cmVyKCktPm5lZWRzTGF5b3V0KCkpCi0JbV92aWV3LT5sYXlvdXQoKTsKLX0KLQotLy8gRklYTUU6
IFRoaXMgaXMgYSBiYWQgaWRlYSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBldmVudHVhbGx5Lgot
Ly8gT3RoZXIgYnJvd3NlcnMgbG9hZCBzdHlsZXNoZWV0cyBiZWZvcmUgdGhleSBjb250aW51ZSBw
YXJzaW5nIHRoZSB3ZWIgcGFnZS4KLS8vIFNpbmNlIHdlIGRvbid0LCB3ZSBjYW4gcnVuIEphdmFT
Y3JpcHQgY29kZSB0aGF0IG5lZWRzIGFuc3dlcnMgYmVmb3JlIHRoZQotLy8gc3R5bGVzaGVldHMg
YXJlIGxvYWRlZC4gRG9pbmcgYSBsYXlvdXQgaWdub3JpbmcgdGhlIHBlbmRpbmcgc3R5bGVzaGVl
dHMKLS8vIGxldHMgdXMgZ2V0IHJlYXNvbmFibGUgYW5zd2Vycy4gVGhlIGxvbmcgdGVybSBzb2x1
dGlvbiB0byB0aGlzIHByb2JsZW0gaXMKLS8vIHRvIGluc3RlYWQgc3VzcGVuZCBKYXZhU2NyaXB0
IGV4ZWN1dGlvbi4KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5n
U3R5bGVzaGVldHMoKQotewotICAgIGJvb2wgb2xkSWdub3JlID0gbV9pZ25vcmVQZW5kaW5nU3R5
bGVzaGVldHM7Ci0gICAgCi0gICAgaWYgKCFoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkgewotICAg
ICAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7Ci0JdXBkYXRlU3R5bGVTZWxl
Y3RvcigpOyAgICAKLSAgICB9Ci0KLSAgICB1cGRhdGVMYXlvdXQoKTsKLQotICAgIG1faWdub3Jl
UGVuZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdub3JlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6
YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotICAgIGFzc2VydCghbV9pblBh
Z2VDYWNoZSk7Ci0KLSAgICBpZiAoIG1fdmlldyApCi0gICAgICAgIHNldFBhaW50RGV2aWNlKCBt
X3ZpZXcgKTsKLQotICAgIGlmICghbV9yZW5kZXJBcmVuYSkKLSAgICAgICAgbV9yZW5kZXJBcmVu
YSA9IG5ldyBSZW5kZXJBcmVuYSgpOwotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVyaW5n
IHRyZWUKLSAgICBtX3JlbmRlciA9IG5ldyAobV9yZW5kZXJBcmVuYSkgUmVuZGVyQ2FudmFzKHRo
aXMsIG1fdmlldyk7Ci0gICAgcmVjYWxjU3R5bGUoIEZvcmNlICk7Ci0KLSAgICBSZW5kZXJPYmpl
Y3QqIHJlbmRlciA9IG1fcmVuZGVyOwotICAgIG1fcmVuZGVyID0gMDsKLQotICAgIENvbnRhaW5l
ck5vZGVJbXBsOjphdHRhY2goKTsKLSAgICBtX3JlbmRlciA9IHJlbmRlcjsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OnJlc3RvcmVSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcikKLXsKLSAg
ICBtX3JlbmRlciA9IHJlbmRlcjsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmRldGFjaCgpCi17
Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXIgPSBtX3JlbmRlcjsKLQotICAgIC8vIGluZGljYXRl
IGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0dGFjaGVkKCkgYnV0IG1fcmVuZGVyID09IDAKLSAg
ICBtX3JlbmRlciA9IDA7Ci0gICAgCi0gICAgaWYgKG1faW5QYWdlQ2FjaGUpIHsKLSAgICAgICAg
aWYgKCByZW5kZXIgKQotICAgICAgICAgICAgZ2V0QWNjT2JqZWN0Q2FjaGUoKS0+ZGV0YWNoKHJl
bmRlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBFbXB0eSBvdXQgdGhlc2Ug
bGlzdHMgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNpbmNlIGRldGFjaGluZwotICAg
IC8vIGFsbCB0aGUgaW5kaXZpZHVhbCByZW5kZXIgb2JqZWN0cyB3aWxsIGNhdXNlIGFsbCB0aGUg
UmVuZGVySW1hZ2UKLSAgICAvLyBvYmplY3RzIHRvIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhl
IGxpc3RzLgotICAgIG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7Ci0g
ICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdC5jbGVhcigpOwotICAgIAotICAgIENv
bnRhaW5lck5vZGVJbXBsOjpkZXRhY2goKTsKLQotICAgIGlmICggcmVuZGVyICkKLSAgICAgICAg
cmVuZGVyLT5kZXN0cm95KCk7Ci0KLSAgICBpZiAobV9wYWludERldmljZSA9PSBtX3ZpZXcpCi0g
ICAgICAgIHNldFBhaW50RGV2aWNlKDApOwotICAgIG1fdmlldyA9IDA7Ci0gICAgCi0gICAgaWYg
KG1fcmVuZGVyQXJlbmEpewotICAgICAgICBkZWxldGUgbV9yZW5kZXJBcmVuYTsKLSAgICAgICAg
bV9yZW5kZXJBcmVuYSA9IDA7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3Zl
QWxsRXZlbnRMaXN0ZW5lcnNGcm9tQWxsTm9kZXMoKQotewotICAgIG1fd2luZG93RXZlbnRMaXN0
ZW5lcnMuY2xlYXIoKTsKLSAgICByZW1vdmVBbGxEaXNjb25uZWN0ZWROb2RlRXZlbnRMaXN0ZW5l
cnMoKTsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0gdGhpczsgbjsgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUoKSkgewotICAgICAgICBuLT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwotICAgIH0K
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVu
dExpc3RlbmVycyhOb2RlSW1wbCAqbm9kZSkKLXsKLSAgICBtX2Rpc2Nvbm5lY3RlZE5vZGVzV2l0
aEV2ZW50TGlzdGVuZXJzLmluc2VydChub2RlLCBub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBs
ICpub2RlKQotewotICAgIG1fZGlzY29ubmVjdGVkTm9kZXNXaXRoRXZlbnRMaXN0ZW5lcnMucmVt
b3ZlKG5vZGUpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlQWxsRGlzY29ubmVjdGVk
Tm9kZUV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICBmb3IgKFFQdHJEaWN0SXRlcmF0b3I8Tm9kZUlt
cGw+IGl0ZXIobV9kaXNjb25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycyk7Ci0gICAgICAg
ICBpdGVyLmN1cnJlbnQoKTsKLSAgICAgICAgICsraXRlcikgewotICAgICAgICBpdGVyLmN1cnJl
bnQoKS0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICB9Ci0gICAgbV9kaXNjb25uZWN0
ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycy5jbGVhcigpOwotfQotCi1LV1FBY2NPYmplY3RDYWNo
ZSogRG9jdW1lbnRJbXBsOjpnZXRBY2NPYmplY3RDYWNoZSgpCi17Ci0gICAgLy8gVGhlIG9ubHkg
ZG9jdW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgYSBLV1FBY2NPYmplY3RDYWNoZSBpcyB0aGUgdG9w
LWxldmVsCi0gICAgLy8gZG9jdW1lbnQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBh
YmxlIHRvIGdldCBmcm9tIGFueSBLV1FBY2NPYmplY3QKLSAgICAvLyB0byBhbnkgb3RoZXIgS1dR
QWNjT2JqZWN0IG9uIHRoZSBzYW1lIHBhZ2UuICBVc2luZyBhIHNpbmdsZSBjYWNoZSBhbGxvd3MK
LSAgICAvLyBsb29rdXBzIGFjcm9zcyBuZXN0ZWQgd2ViYXJlYXMgKGkuZS4gbXVsdGlwbGUgZG9j
dW1lbnRzKS4KLSAgICAKLSAgICBpZiAobV9hY2NDYWNoZSkgewotICAgICAgICAvLyByZXR1cm4g
YWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2FjaGUKLSAgICAgICAgaWYgKCFvd25lckVsZW1lbnQo
KSkKLSAgICAgICAgICAgIHJldHVybiBtX2FjY0NhY2hlOwotICAgICAgICAKLSAgICAgICAgLy8g
SW4gc29tZSBwYWdlcyB3aXRoIGZyYW1lcywgdGhlIGNhY2hlIGlzIGNyZWF0ZWQgYmVmb3JlIHRo
ZSBzdWItd2ViYXJlYSBpcwotICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLiAgSGVy
ZSwgd2UgY2F0Y2ggdGhhdCBjYXNlIGFuZCBqdXN0IHRvc3MgdGhlIG9sZAotICAgICAgICAvLyBj
YWNoZSBhbmQgc3RhcnQgb3Zlci4KLSAgICAgICAgZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAgICAg
IG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAgICAKLSAgICAvLyBsb29rIGZvciB0b3AtbGV2ZWwg
ZG9jdW1lbnQKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IG93bmVyRWxlbWVudCgpOwotICAg
IGlmIChlbGVtZW50KSB7Ci0gICAgICAgIERvY3VtZW50SW1wbCAqZG9jOwotICAgICAgICB3aGls
ZSAoZWxlbWVudCkgewotICAgICAgICAgICAgZG9jID0gZWxlbWVudC0+Z2V0RG9jdW1lbnQoKTsK
LSAgICAgICAgICAgIGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVudCgpOwotICAgICAgICB9Ci0g
ICAgICAgIAotICAgICAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBmb3IgaXRzIGNh
Y2hlCi0gICAgICAgIHJldHVybiBkb2MtPmdldEFjY09iamVjdENhY2hlKCk7Ci0gICAgfQotICAg
IAotICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCwgc28gaW5zdGFsbCBhIG5l
dyBjYWNoZQotICAgIG1fYWNjQ2FjaGUgPSBuZXcgS1dRQWNjT2JqZWN0Q2FjaGU7Ci0gICAgcmV0
dXJuIG1fYWNjQ2FjaGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRWaXN1YWxseU9yZGVy
ZWQoKQotewotICAgIHZpc3VhbGx5T3JkZXJlZCA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQot
ICAgICAgICBtX3JlbmRlci0+c3R5bGUoKS0+c2V0VmlzdWFsbHlPcmRlcmVkKHRydWUpOwotfQot
Ci12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlU2VsZWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcmVu
ZGVyKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVuZGVyQ2FudmFzICpjYW52YXMgPSBz
dGF0aWNfY2FzdDxSZW5kZXJDYW52YXMqPihtX3JlbmRlcik7Ci0gICAgU2VsZWN0aW9uQ29udHJv
bGxlciBzID0gZnJhbWUoKS0+c2VsZWN0aW9uKCk7Ci0gICAgaWYgKCFzLmlzUmFuZ2UoKSkgewot
ICAgICAgICBjYW52YXMtPmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAg
ICAgICBQb3NpdGlvbiBzdGFydFBvcyA9IFZpc2libGVQb3NpdGlvbihzLnN0YXJ0KCksIHMuc3Rh
cnRBZmZpbml0eSgpKS5kZWVwRXF1aXZhbGVudCgpOwotICAgICAgICBQb3NpdGlvbiBlbmRQb3Mg
PSBWaXNpYmxlUG9zaXRpb24ocy5lbmQoKSwgcy5lbmRBZmZpbml0eSgpKS5kZWVwRXF1aXZhbGVu
dCgpOwotICAgICAgICBpZiAoc3RhcnRQb3MuaXNOb3ROdWxsKCkgJiYgZW5kUG9zLmlzTm90TnVs
bCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKnN0YXJ0UmVuZGVyZXIgPSBzdGFydFBv
cy5ub2RlKCktPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKmVuZFJlbmRl
cmVyID0gZW5kUG9zLm5vZGUoKS0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0
PFJlbmRlckNhbnZhcyo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uKHN0YXJ0UmVuZGVyZXIsIHN0
YXJ0UG9zLm9mZnNldCgpLCBlbmRSZW5kZXJlciwgZW5kUG9zLm9mZnNldCgpKTsKLSAgICAgICAg
fQotICAgIH0KLSAgICAKLSAgICAvLyBzZW5kIHRoZSBBWFNlbGVjdGVkVGV4dENoYW5nZWQgbm90
aWZpY2F0aW9uIG9ubHkgaWYgdGhlIG5ldyBzZWxlY3Rpb24gaXMgbm9uLW51bGwsCi0gICAgLy8g
YmVjYXVzZSBudWxsIHNlbGVjdGlvbnMgYXJlIG9ubHkgdHJhbnNpdG9yeSAoZS5nLiB3aGVuIHN0
YXJ0aW5nIGFuIEVkaXRDb21tYW5kLCBjdXJyZW50bHkpCi0gICAgaWYgKEtXUUFjY09iamVjdENh
Y2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpICYmIHMuc3RhcnQoKS5pc05vdE51bGwoKSAmJiBz
LmVuZCgpLmlzTm90TnVsbCgpKSB7Ci0gICAgICAgIGdldEFjY09iamVjdENhY2hlKCktPnBvc3RO
b3RpZmljYXRpb25Ub1RvcFdlYkFyZWEocmVuZGVyZXIoKSwgIkFYU2VsZWN0ZWRUZXh0Q2hhbmdl
ZCIpOwotICAgIH0KLQotfQotCi1Ub2tlbml6ZXIgKkRvY3VtZW50SW1wbDo6Y3JlYXRlVG9rZW5p
emVyKCkKLXsKLSAgICByZXR1cm4gbmV3WE1MVG9rZW5pemVyKHRoaXMsIG1fdmlldyk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRQYWludERldmljZSggUVBhaW50RGV2aWNlICpkZXYgKQot
ewotICAgIGlmIChtX3BhaW50RGV2aWNlID09IGRldikgewotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIG1fcGFpbnREZXZpY2UgPSBkZXY7Ci0gICAgZGVsZXRlIG1fcGFpbnREZXZpY2VNZXRy
aWNzOwotICAgIG1fcGFpbnREZXZpY2VNZXRyaWNzID0gZGV2ID8gbmV3IFFQYWludERldmljZU1l
dHJpY3MoIGRldiApIDogMDsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6Om9wZW4oICApCi17Ci0g
ICAgaWYgKHBhcnNpbmcoKSkgcmV0dXJuOwotCi0gICAgaW1wbGljaXRPcGVuKCk7Ci0KLSAgICBp
ZiAoZnJhbWUoKSkgewotICAgICAgICBmcmFtZSgpLT5kaWRFeHBsaWNpdE9wZW4oKTsKLSAgICB9
Ci0KLSAgICAvLyBUaGlzIGlzIHdvcmsgdGhhdCB3ZSBzaG91bGQgcHJvYmFibHkgZG8gaW4gY2xl
YXIoKSwgYnV0IHdlIGNhbid0IGhhdmUgaXQKLSAgICAvLyBoYXBwZW4gd2hlbiBpbXBsaWNpdE9w
ZW4oKSBpcyBjYWxsZWQgdW5sZXNzIHdlIHJlb3JnYW5pemUgRnJhbWUgY29kZS4KLSAgICBzZXRV
UkwoUVN0cmluZygpKTsKLSAgICBEb2N1bWVudEltcGwgKnBhcmVudCA9IHBhcmVudERvY3VtZW50
KCk7Ci0gICAgaWYgKHBhcmVudCkgewotICAgICAgICBzZXRCYXNlVVJMKHBhcmVudC0+YmFzZVVS
TCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjppbXBsaWNpdE9wZW4oKQotewot
ICAgIGlmIChtX3Rva2VuaXplcikKLSAgICAgICAgY2xvc2UoKTsKLQotICAgIGNsZWFyKCk7Ci0g
ICAgbV90b2tlbml6ZXIgPSBjcmVhdGVUb2tlbml6ZXIoKTsKLSAgICBjb25uZWN0KG1fdG9rZW5p
emVyLFNJR05BTChmaW5pc2hlZFBhcnNpbmcoKSksdGhpcyxTSUdOQUwoZmluaXNoZWRQYXJzaW5n
KCkpKTsKLSAgICBzZXRQYXJzaW5nKHRydWUpOwotfQotCi1IVE1MRWxlbWVudEltcGwqIERvY3Vt
ZW50SW1wbDo6Ym9keSgpCi17Ci0gICAgTm9kZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50KCk7
Ci0gICAgaWYgKCFkZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gdHJ5IHRvIHBy
ZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3ZlciBCT0RZCi0gICAgTm9kZUltcGwqIGJvZHkgPSAw
OwotICAgIGZvciAoTm9kZUltcGwqIGkgPSBkZS0+Zmlyc3RDaGlsZCgpOyBpOyBpID0gaS0+bmV4
dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpCi0g
ICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oaSk7Ci0gICAg
ICAgIAotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIGJv
ZHkgPSBpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+
KGJvZHkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6Y2xvc2UoKQotewotICAgIGlmIChmcmFt
ZSgpKQotICAgICAgICBmcmFtZSgpLT5lbmRJZk5vdExvYWRpbmcoKTsKLSAgICBpbXBsaWNpdENs
b3NlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjppbXBsaWNpdENsb3NlKCkKLXsKLSAgICAv
LyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHJlY2FsY1N0eWxlLCB3ZSBuZWVkIHRvIGRlZmVy
IHRoZSBjbG9zZSB1bnRpbCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gaXMgYWNjdXJhdGUgYW5kIGFs
bCBlbGVtZW50cyBhcmUgcmUtYXR0YWNoZWQuCi0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykgewot
ICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0KLSAgICBib29sIHdhc0xvY2F0aW9uQ2hhbmdlUGVuZGluZyA9IGZyYW1lKCkgJiYg
ZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlvbkNoYW5nZVBlbmRpbmcoKTsKLSAgICBib29sIGRv
bG9hZCA9ICFwYXJzaW5nKCkgJiYgbV90b2tlbml6ZXIgJiYgIW1fcHJvY2Vzc2luZ0xvYWRFdmVu
dCAmJiAhd2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nOwotICAgIAotICAgIGlmICghZG9sb2FkKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSB0cnVlOwotCi0g
ICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUgdG9rZW5pemVyLCBpbiBjYXNlIHNvbWVvbmUgZG9j
dW1lbnQud3JpdGUoKXMgZnJvbSB0aGUKLSAgICAvLyBvbkxvYWQgZXZlbnQgaGFuZGxlciwgYXMg
aW4gUmFkYXIgMzIwNjUyNC4KLSAgICBkZWxldGUgbV90b2tlbml6ZXI7Ci0gICAgbV90b2tlbml6
ZXIgPSAwOwotCi0gICAgLy8gQ3JlYXRlIGEgYm9keSBlbGVtZW50IGlmIHdlIGRvbid0IGFscmVh
ZHkgaGF2ZSBvbmUuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUmFkYXIgMzc1ODc4NSwgdGhlIHdp
bmRvdy5vbmxvYWQgd2FzIHNldCBpbiBzb21lIGphdmFzY3JpcHQsIGJ1dCBuZXZlciBmaXJlZCBi
ZWNhdXNlIHRoZXJlIHdhcyBubyBib2R5LiAgCi0gICAgLy8gVGhpcyBiZWhhdmlvciBub3cgbWF0
Y2hlcyBGaXJlZm94IGFuZCBJRS4KLSAgICBIVE1MRWxlbWVudEltcGwgKmJvZHkgPSB0aGlzLT5i
b2R5KCk7Ci0gICAgaWYgKCFib2R5ICYmIGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgTm9k
ZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChkZSkgewotICAgICAg
ICAgICAgYm9keSA9IG5ldyBIVE1MQm9keUVsZW1lbnRJbXBsKHRoaXMpOwotICAgICAgICAgICAg
aW50IGV4Y2VwdGlvbkNvZGUgPSAwOwotICAgICAgICAgICAgZGUtPmFwcGVuZENoaWxkKGJvZHks
IGV4Y2VwdGlvbkNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUgIT0gMCkKLSAg
ICAgICAgICAgICAgICBib2R5ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBOb2Rl
SW1wbCAqb25sb2FkVGFyZ2V0ID0gYm9keTsKLSAgICBpZiAoIWlzSFRNTERvY3VtZW50KCkpCi0g
ICAgICAgIG9ubG9hZFRhcmdldCA9IGRvY3VtZW50RWxlbWVudCgpOwotCi0gICAgaWYgKG9ubG9h
ZFRhcmdldCkgewotICAgICAgICBkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05vdygpOwotICAgICAg
ICBvbmxvYWRUYXJnZXQtPmRpc3BhdGNoV2luZG93RXZlbnQobG9hZEV2ZW50LCBmYWxzZSwgZmFs
c2UpOwotICAgICAgICBpZiAoRnJhbWUgKnAgPSBmcmFtZSgpKQotICAgICAgICAgICAgTWFjKHAp
LT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7Ci0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURV
TElORwotICAgICAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgcHJpbnRmKCJv
bmxvYWQgZmlyZWQgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi0gICAgfQotCi0g
ICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7Ci0KLSAgICAvLyBNYWtlIHN1cmUgYm90
aCB0aGUgaW5pdGlhbCBsYXlvdXQgYW5kIHJlZmxvdyBoYXBwZW4gYWZ0ZXIgdGhlIG9ubG9hZAot
ICAgIC8vIGZpcmVzLiBUaGlzIHdpbGwgaW1wcm92ZSBvbmxvYWQgc2NvcmVzLCBhbmQgb3RoZXIg
YnJvd3NlcnMgZG8gaXQuCi0gICAgLy8gSWYgdGhleSB3YW5uYSBjaGVhdCwgd2UgY2FuIHRvby4g
LWR3aAotCi0gICAgaWYgKGZyYW1lKCkgJiYgZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlvbkNo
YW5nZVBlbmRpbmcoKSAmJiBtX3N0YXJ0VGltZS5lbGFwc2VkKCkgPCBjTGF5b3V0U2NoZWR1bGVU
aHJlc2hvbGQpIHsKLSAgICAgICAgLy8gSnVzdCBiYWlsIG91dC4gQmVmb3JlIG9yIGR1cmluZyB0
aGUgb25sb2FkIHdlIHdlcmUgc2hpZnRlZCB0byBhbm90aGVyIHBhZ2UuCi0gICAgICAgIC8vIFRo
ZSBvbGQgaS1CZW5jaCBzdWl0ZSBkb2VzIHRoaXMuIFdoZW4gdGhpcyBoYXBwZW5zIGRvbid0IGJv
dGhlciBwYWludGluZyBvciBsYXlpbmcgb3V0LiAgICAgICAgCi0gICAgICAgIHZpZXcoKS0+dW5z
Y2hlZHVsZVJlbGF5b3V0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZnJh
bWUoKSkKLSAgICAgICAgZnJhbWUoKS0+Y2hlY2tFbWl0TG9hZEV2ZW50KCk7Ci0KLSAgICAvLyBO
b3cgZG8gb3VyIHBhaW50aW5nL2xheW91dCwgYnV0IG9ubHkgaWYgd2UgYXJlbid0IGluIGEgc3Vi
ZnJhbWUgb3IgaWYgd2UncmUgaW4gYSBzdWJmcmFtZQotICAgIC8vIHRoYXQgaGFzIGJlZW4gc2l6
ZWQgYWxyZWFkeS4gIE90aGVyd2lzZSwgb3VyIHZpZXcgc2l6ZSB3b3VsZCBiZSBpbmNvcnJlY3Qs
IHNvIGRvaW5nIGFueSAKLSAgICAvLyBsYXlvdXQvcGFpbnRpbmcgbm93IHdvdWxkIGJlIHBvaW50
bGVzcy4KLSAgICBpZiAoIW93bmVyRWxlbWVudCgpIHx8IChvd25lckVsZW1lbnQoKS0+cmVuZGVy
ZXIoKSAmJiAhb3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKSB7Ci0g
ICAgICAgIHVwZGF0ZVJlbmRlcmluZygpOwotICAgICAgICAKLSAgICAgICAgLy8gQWx3YXlzIGRv
IGEgbGF5b3V0IGFmdGVyIGxvYWRpbmcgaWYgbmVlZGVkLgotICAgICAgICBpZiAodmlldygpICYm
IHJlbmRlcmVyKCkgJiYgKCFyZW5kZXJlcigpLT5maXJzdENoaWxkKCkgfHwgcmVuZGVyZXIoKS0+
bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOwotICAgIH0KLSAg
ICBpZiAocmVuZGVyZXIoKSAmJiBLV1FBY2NPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJs
ZWQoKSkKLSAgICAgICAgZ2V0QWNjT2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNhdGlvbihyZW5k
ZXJlcigpLCAiQVhMb2FkQ29tcGxldGUiKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFBh
cnNpbmcoYm9vbCBiKQotewotICAgIG1fYlBhcnNpbmcgPSBiOwotICAgIGlmICghbV9iUGFyc2lu
ZyAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwotCi0jaWZk
ZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkg
JiYgIW1fYlBhcnNpbmcpCi0gICAgICAgIHByaW50ZigiUGFyc2luZyBmaW5pc2hlZCBhdCAlZFxu
IiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnNob3Vs
ZFNjaGVkdWxlTGF5b3V0KCkKLXsKLSAgICAvLyBXZSBjYW4gdXBkYXRlIGxheW91dCBpZjoKLSAg
ICAvLyAoYSkgd2UgYWN0dWFsbHkgbmVlZCBhIGxheW91dAotICAgIC8vIChiKSBvdXIgc3R5bGVz
aGVldHMgYXJlIGFsbCBsb2FkZWQKLSAgICAvLyAoYykgd2UgaGF2ZSBhIDxib2R5PgotICAgIHJl
dHVybiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpICYmIGhhdmVTdHls
ZXNoZWV0c0xvYWRlZCgpICYmCi0gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQoKSAmJiBkb2N1
bWVudEVsZW1lbnQoKS0+cmVuZGVyZXIoKSAmJgotICAgICAgICAgICAgKCFkb2N1bWVudEVsZW1l
bnQoKS0+aGFzVGFnTmFtZShodG1sVGFnKSB8fCBib2R5KCkpKTsKLX0KLQotaW50IERvY3VtZW50
SW1wbDo6bWluaW11bUxheW91dERlbGF5KCkKLXsKLSAgICBpZiAobV9vdmVyTWluaW11bUxheW91
dFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgaW50IGVsYXBzZWQgPSBt
X3N0YXJ0VGltZS5lbGFwc2VkKCk7Ci0gICAgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCA9
IGVsYXBzZWQgPiBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQ7Ci0gICAgCi0gICAgLy8gV2UnbGwg
d2FudCB0byBzY2hlZHVsZSB0aGUgdGltZXIgdG8gZmlyZSBhdCB0aGUgbWluaW11bSBsYXlvdXQg
dGhyZXNob2xkLgotICAgIHJldHVybiBrTWF4KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAt
IGVsYXBzZWQpOwotfQotCi1pbnQgRG9jdW1lbnRJbXBsOjplbGFwc2VkVGltZSgpIGNvbnN0Ci17
Ci0gICAgcmV0dXJuIG1fc3RhcnRUaW1lLmVsYXBzZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OndyaXRlKCBjb25zdCBET01TdHJpbmcgJnRleHQgKQotewotICAgIHdyaXRlKHRleHQucXN0
cmluZygpKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OndyaXRlKCBjb25zdCBRU3RyaW5nICZ0
ZXh0ICkKLXsKLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFv
d25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgYSBkb2N1bWVudC53cml0
ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAoIW1fdG9r
ZW5pemVyKSB7Ci0gICAgICAgIG9wZW4oKTsKLSAgICAgICAgYXNzZXJ0KG1fdG9rZW5pemVyKTsK
LSAgICAgICAgd3JpdGUoUVN0cmluZygiPGh0bWw+IikpOwotICAgIH0KLSAgICBtX3Rva2VuaXpl
ci0+d3JpdGUodGV4dCwgZmFsc2UpOwotICAgIAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1ND
SEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIkVuZGlu
ZyBhIGRvY3VtZW50LndyaXRlIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZiAgICAK
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OndyaXRlbG4oIGNvbnN0IERPTVN0cmluZyAmdGV4dCAp
Ci17Ci0gICAgd3JpdGUodGV4dCk7Ci0gICAgd3JpdGUoRE9NU3RyaW5nKCJcbiIpKTsKLX0KLQot
dm9pZCBEb2N1bWVudEltcGw6OmZpbmlzaFBhcnNpbmcoKQotewotI2lmZGVmIElOU1RSVU1FTlRf
TEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmlu
dGYoIlJlY2VpdmVkIGFsbCBkYXRhIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgot
ICAgIAotICAgIC8vIExldCB0aGUgdG9rZW5pemVyIGdvIHRocm91Z2ggYXMgbXVjaCBkYXRhIGFz
IGl0IGNhbi4gIFRoZXJlIHdpbGwgYmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgYWZ0ZXIKLSAg
ICAvLyBmaW5pc2goKSBpcyBjYWxsZWQ6Ci0gICAgLy8gKDEpIEFsbCByZW1haW5pbmcgZGF0YSBp
cyBwYXJzZWQsIGRvY3VtZW50IGlzbid0IGxvYWRlZCB5ZXQKLSAgICAvLyAoMikgQWxsIHJlbWFp
bmluZyBkYXRhIGlzIHBhcnNlZCwgZG9jdW1lbnQgaXMgbG9hZGVkLCB0b2tlbml6ZXIgZ2V0cyBk
ZWxldGVkCi0gICAgLy8gKDMpIERhdGEgaXMgc3RpbGwgcmVtYWluaW5nIHRvIGJlIHBhcnNlZC4K
LSAgICBpZiAobV90b2tlbml6ZXIpCi0gICAgICAgIG1fdG9rZW5pemVyLT5maW5pc2goKTsKLX0K
LQotdm9pZCBEb2N1bWVudEltcGw6OmNsZWFyKCkKLXsKLSAgICBkZWxldGUgbV90b2tlbml6ZXI7
Ci0gICAgbV90b2tlbml6ZXIgPSAwOwotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBRUHRy
TGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlz
dGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOykKLSAgICAgICAgbV93aW5kb3dFdmVu
dExpc3RlbmVycy5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnNldFVSTChjb25zdCBRU3RyaW5nJiB1cmwpCi17Ci0gICAgbV91cmwgPSB1cmw7Ci0gICAg
aWYgKG1fc3R5bGVTZWxlY3RvcikKLSAgICAgICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRFbmNvZGVk
VVJMKG1fdXJsKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFN0eWxlU2hlZXQoY29uc3Qg
RE9NU3RyaW5nICZ1cmwsIGNvbnN0IERPTVN0cmluZyAmc2hlZXQpCi17Ci0vLyAgICBrZERlYnVn
KCA2MDMwICkgPDwgIkhUTUxEb2N1bWVudDo6c2V0U3R5bGVTaGVldCgpIiA8PCBlbmRsOwotICAg
IG1fc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcywgdXJsKTsKLSAgICBtX3NoZWV0
LT5yZWYoKTsKLSAgICBtX3NoZWV0LT5wYXJzZVN0cmluZyhzaGVldCk7Ci0gICAgbV9sb2FkaW5n
U2hlZXQgPSBmYWxzZTsKLQotICAgIHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OnNldFVzZXJTdHlsZVNoZWV0KCBjb25zdCBRU3RyaW5nJiBzaGVldCApCi17
Ci0gICAgaWYgKCBtX3VzZXJzaGVldCAhPSBzaGVldCApIHsKLSAgICAgICAgbV91c2Vyc2hlZXQg
PSBzaGVldDsKLQl1cGRhdGVTdHlsZVNlbGVjdG9yKCk7Ci0gICAgfQotfQotCi1DU1NTdHlsZVNo
ZWV0SW1wbCogRG9jdW1lbnRJbXBsOjplbGVtZW50U2hlZXQoKQotewotICAgIGlmICghbV9lbGVt
U2hlZXQpIHsKLSAgICAgICAgbV9lbGVtU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhp
cywgYmFzZVVSTCgpICk7Ci0gICAgICAgIG1fZWxlbVNoZWV0LT5yZWYoKTsKLSAgICB9Ci0gICAg
cmV0dXJuIG1fZWxlbVNoZWV0OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6ZGV0ZXJtaW5lUGFy
c2VNb2RlKCBjb25zdCBRU3RyaW5nICYvKnN0ciovICkKLXsKLSAgICAvLyBGb3IgWE1MIGRvY3Vt
ZW50cyB1c2Ugc3RyaWN0IHBhcnNlIG1vZGUuICBIVE1MIGRvY3Mgd2lsbCBvdmVycmlkZSB0aGlz
IG1ldGhvZCB0bwotICAgIC8vIGRldGVybWluZSB0aGVpciBwYXJzZSBtb2RlLgotICAgIHBNb2Rl
ID0gU3RyaWN0OwotICAgIGhNb2RlID0gWEh0bWw7Ci0gICAga2REZWJ1Zyg2MDIwKSA8PCAiIHVz
aW5nIHN0cmljdCBwYXJzZU1vZGUiIDw8IGVuZGw7Ci19Ci0KLU5vZGVJbXBsICpEb2N1bWVudElt
cGw6Om5leHRGb2N1c05vZGUoTm9kZUltcGwgKmZyb21Ob2RlKQotewotICAgIHVuc2lnbmVkIHNo
b3J0IGZyb21UYWJJbmRleDsKLQotICAgIGlmICghZnJvbU5vZGUpIHsKLQkvLyBObyBzdGFydGlu
ZyBub2RlIHN1cHBsaWVkOyBiZWdpbiB3aXRoIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50Ci0JTm9k
ZUltcGwgKm47Ci0KLQlpbnQgbG93ZXN0VGFiSW5kZXggPSA2NTUzNTsKLQlmb3IgKG4gPSB0aGlz
OyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAoKG4tPnRhYkluZGV4KCkgPiAwKSAmJiAobi0+dGFi
SW5kZXgoKSA8IGxvd2VzdFRhYkluZGV4KSkKLQkJICAgIGxvd2VzdFRhYkluZGV4ID0gbi0+dGFi
SW5kZXgoKTsKLQkgICAgfQotCX0KLQotCWlmIChsb3dlc3RUYWJJbmRleCA9PSA2NTUzNSkKLQkg
ICAgbG93ZXN0VGFiSW5kZXggPSAwOwotCi0JLy8gR28gdG8gdGhlIGZpcnN0IG5vZGUgaW4gdGhl
IGRvY3VtZW50IHRoYXQgaGFzIHRoZSBkZXNpcmVkIHRhYiBpbmRleAotCWZvciAobiA9IHRoaXM7
IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotCSAgICBpZiAobi0+aXNLZXli
b2FyZEZvY3VzYWJsZSgpICYmIChuLT50YWJJbmRleCgpID09IGxvd2VzdFRhYkluZGV4KSkKLQkJ
cmV0dXJuIG47Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotCWZyb21UYWJJ
bmRleCA9IGZyb21Ob2RlLT50YWJJbmRleCgpOwotICAgIH0KLQotICAgIGlmIChmcm9tVGFiSW5k
ZXggPT0gMCkgewotCS8vIEp1c3QgbmVlZCB0byBmaW5kIHRoZSBuZXh0IHNlbGVjdGFibGUgbm9k
ZSBhZnRlciBmcm9tTm9kZSAoaW4gZG9jdW1lbnQgb3JkZXIpIHRoYXQgZG9lc24ndCBoYXZlIGEg
dGFiIGluZGV4Ci0JTm9kZUltcGwgKm4gPSBmcm9tTm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwot
CXdoaWxlIChuICYmICEobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIG4tPnRhYkluZGV4KCkg
PT0gMCkpCi0JICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0JcmV0dXJuIG47Ci0gICAg
fQotICAgIGVsc2UgewotCS8vIEZpbmQgdGhlIGxvd2VzdCB0YWIgaW5kZXggb3V0IG9mIGFsbCB0
aGUgbm9kZXMgZXhjZXB0IGZyb21Ob2RlLCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0
byBmcm9tTm9kZSdzCi0JLy8gdGFiIGluZGV4LiBGb3Igbm9kZXMgd2l0aCB0aGUgc2FtZSB0YWIg
aW5kZXggYXMgZnJvbU5vZGUsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhvc2UgdGhhdCBj
b21lIGFmdGVyCi0JLy8gZnJvbU5vZGUgaW4gZG9jdW1lbnQgb3JkZXIuCi0JLy8gSWYgd2UgZG9u
J3QgZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRleCwgdGhlIG5leHQgZm9jdXMgbm9kZSB3aWxsIGJl
IG9uZSB3aXRoIGEgdGFiIGluZGV4IG9mIDAuCi0JdW5zaWduZWQgc2hvcnQgbG93ZXN0U3VpdGFi
bGVUYWJJbmRleCA9IDY1NTM1OwotCU5vZGVJbXBsICpuOwotCi0JYm9vbCByZWFjaGVkRnJvbU5v
ZGUgPSBmYWxzZTsKLQlmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHRO
b2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJgotCQkoKHJlYWNo
ZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgoKSA+PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkgKCFy
ZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPiBmcm9tVGFiSW5kZXgpKSkgJiYKLQkJ
KG4tPnRhYkluZGV4KCkgPCBsb3dlc3RTdWl0YWJsZVRhYkluZGV4KSAmJgotCQkobiAhPSBmcm9t
Tm9kZSkpIHsKLQotCQkvLyBXZSBmb3VuZCBhIHNlbGVjdGFibGUgbm9kZSB3aXRoIGEgdGFiIGlu
ZGV4IGF0IGxlYXN0IGFzIGhpZ2ggYXMgZnJvbU5vZGUncy4gS2VlcCBzZWFyY2hpbmcgdGhvdWdo
LAotCQkvLyBhcyB0aGVyZSBtYXkgYmUgYW5vdGhlciBub2RlIHdoaWNoIGhhcyBhIGxvd2VyIHRh
YiBpbmRleCBidXQgaXMgc3RpbGwgc3VpdGFibGUgZm9yIHVzZS4KLQkJbG93ZXN0U3VpdGFibGVU
YWJJbmRleCA9IG4tPnRhYkluZGV4KCk7Ci0JICAgIH0KLQotCSAgICBpZiAobiA9PSBmcm9tTm9k
ZSkKLQkJcmVhY2hlZEZyb21Ob2RlID0gdHJ1ZTsKLQl9Ci0KLQlpZiAobG93ZXN0U3VpdGFibGVU
YWJJbmRleCA9PSA2NTUzNSkgewotCSAgICAvLyBObyBuZXh0IG5vZGUgd2l0aCBhIHRhYiBpbmRl
eCAtPiBqdXN0IHRha2UgZmlyc3Qgbm9kZSB3aXRoIHRhYiBpbmRleCBvZiAwCi0JICAgIE5vZGVJ
bXBsICpuID0gdGhpczsKLQkgICAgd2hpbGUgKG4gJiYgIShuLT5pc0tleWJvYXJkRm9jdXNhYmxl
KCkgJiYgbi0+dGFiSW5kZXgoKSA9PSAwKSkKLQkJbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKTsK
LQkgICAgcmV0dXJuIG47Ci0JfQotCi0JLy8gU2VhcmNoIGZvcndhcmRzIGZyb20gZnJvbU5vZGUK
LQlmb3IgKG4gPSBmcm9tTm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4gPSBuLT50
cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAm
JiAobi0+dGFiSW5kZXgoKSA9PSBsb3dlc3RTdWl0YWJsZVRhYkluZGV4KSkKLQkJcmV0dXJuIG47
Ci0JfQotCi0JLy8gVGhlIG5leHQgbm9kZSBpc24ndCBhZnRlciBmcm9tTm9kZSwgc3RhcnQgZnJv
bSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudAotCWZvciAobiA9IHRoaXM7IG4gIT0gZnJv
bU5vZGU7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9h
cmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBsb3dlc3RTdWl0YWJsZVRhYkluZGV4
KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JYXNzZXJ0KGZhbHNlKTsgLy8gc2hvdWxkIG5ldmVyIGdl
dCBoZXJlCi0JcmV0dXJuIDA7Ci0gICAgfQotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjpw
cmV2aW91c0ZvY3VzTm9kZShOb2RlSW1wbCAqZnJvbU5vZGUpCi17Ci0gICAgTm9kZUltcGwgKmxh
c3ROb2RlID0gdGhpczsKLSAgICB3aGlsZSAobGFzdE5vZGUtPmxhc3RDaGlsZCgpKQotCWxhc3RO
b2RlID0gbGFzdE5vZGUtPmxhc3RDaGlsZCgpOwotCi0gICAgaWYgKCFmcm9tTm9kZSkgewotCS8v
IE5vIHN0YXJ0aW5nIG5vZGUgc3VwcGxpZWQ7IGJlZ2luIHdpdGggdGhlIHZlcnkgbGFzdCBub2Rl
IGluIHRoZSBkb2N1bWVudAotCU5vZGVJbXBsICpuOwotCi0JaW50IGhpZ2hlc3RUYWJJbmRleCA9
IDA7Ci0JZm9yIChuID0gbGFzdE5vZGU7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNO
b2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAobi0+
dGFiSW5kZXgoKSA9PSAwKQotCQkgICAgcmV0dXJuIG47Ci0JCWVsc2UgaWYgKG4tPnRhYkluZGV4
KCkgPiBoaWdoZXN0VGFiSW5kZXgpCi0JCSAgICBoaWdoZXN0VGFiSW5kZXggPSBuLT50YWJJbmRl
eCgpOwotCSAgICB9Ci0JfQotCi0JLy8gTm8gbm9kZSB3aXRoIGEgdGFiIGluZGV4IG9mIDA7IGp1
c3QgZ28gdG8gdGhlIGxhc3Qgbm9kZSB3aXRoIHRoZSBoaWdoZXN0IHRhYiBpbmRleAotCWZvciAo
biA9IGxhc3ROb2RlOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0J
ICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gaGln
aGVzdFRhYkluZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAg
IGVsc2UgewotCXVuc2lnbmVkIHNob3J0IGZyb21UYWJJbmRleCA9IGZyb21Ob2RlLT50YWJJbmRl
eCgpOwotCi0JaWYgKGZyb21UYWJJbmRleCA9PSAwKSB7Ci0JICAgIC8vIEZpbmQgdGhlIHByZXZp
b3VzIHNlbGVjdGFibGUgbm9kZSBiZWZvcmUgZnJvbU5vZGUgKGluIGRvY3VtZW50IG9yZGVyKSB0
aGF0IGRvZXNuJ3QgaGF2ZSBhIHRhYiBpbmRleAotCSAgICBOb2RlSW1wbCAqbiA9IGZyb21Ob2Rl
LT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpOwotCSAgICB3aGlsZSAobiAmJiAhKG4tPmlzS2V5Ym9h
cmRGb2N1c2FibGUoKSAmJiBuLT50YWJJbmRleCgpID09IDApKQotCQluID0gbi0+dHJhdmVyc2VQ
cmV2aW91c05vZGUoKTsKLQkgICAgaWYgKG4pCi0JCXJldHVybiBuOwotCi0JICAgIC8vIE5vIHBy
ZXZpb3VzIG5vZGVzIHdpdGggYSAwIHRhYiBpbmRleCwgZ28gdG8gdGhlIGxhc3Qgbm9kZSBpbiB0
aGUgZG9jdW1lbnQgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgdGFiIGluZGV4Ci0JICAgIGludCBoaWdo
ZXN0VGFiSW5kZXggPSAwOwotCSAgICBmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2
ZXJzZU5leHROb2RlKCkpIHsKLQkJaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+
dGFiSW5kZXgoKSA+IGhpZ2hlc3RUYWJJbmRleCkpCi0JCSAgICBoaWdoZXN0VGFiSW5kZXggPSBu
LT50YWJJbmRleCgpOwotCSAgICB9Ci0KLQkgICAgaWYgKGhpZ2hlc3RUYWJJbmRleCA9PSAwKQot
CQlyZXR1cm4gMDsKLQotCSAgICBmb3IgKG4gPSBsYXN0Tm9kZTsgbiAhPSAwOyBuID0gbi0+dHJh
dmVyc2VQcmV2aW91c05vZGUoKSkgewotCQlpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYm
IChuLT50YWJJbmRleCgpID09IGhpZ2hlc3RUYWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsKLQkg
ICAgfQotCi0JICAgIGFzc2VydChmYWxzZSk7IC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQotCSAg
ICByZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8vIEZpbmQgdGhlIGxvd2VzdCB0YWIgaW5k
ZXggb3V0IG9mIGFsbCB0aGUgbm9kZXMgZXhjZXB0IGZyb21Ob2RlLCB0aGF0IGlzIGxlc3MgdGhh
biBvciBlcXVhbCB0byBmcm9tTm9kZSdzCi0JICAgIC8vIHRhYiBpbmRleC4gRm9yIG5vZGVzIHdp
dGggdGhlIHNhbWUgdGFiIGluZGV4IGFzIGZyb21Ob2RlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVk
IGluIHRob3NlIGJlZm9yZQotCSAgICAvLyBmcm9tTm9kZS4KLQkgICAgLy8gSWYgd2UgZG9uJ3Qg
ZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRleCwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIHByZXZpb3Vz
IGZvY3VzIG5vZGUuCi0JICAgIHVuc2lnbmVkIHNob3J0IGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4
ID0gMDsKLQkgICAgTm9kZUltcGwgKm47Ci0KLQkgICAgYm9vbCByZWFjaGVkRnJvbU5vZGUgPSBm
YWxzZTsKLQkgICAgZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9k
ZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYKLQkJICAgICgoIXJlYWNo
ZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgoKSA8PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkgICAg
IChyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPCBmcm9tVGFiSW5kZXgpKSkgICYm
Ci0JCSAgICAobi0+dGFiSW5kZXgoKSA+IGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4KSAmJgotCQkg
ICAgKG4gIT0gZnJvbU5vZGUpKSB7Ci0KLQkJICAgIC8vIFdlIGZvdW5kIGEgc2VsZWN0YWJsZSBu
b2RlIHdpdGggYSB0YWIgaW5kZXggbm8gaGlnaGVyIHRoYW4gZnJvbU5vZGUncy4gS2VlcCBzZWFy
Y2hpbmcgdGhvdWdoLCBhcwotCQkgICAgLy8gdGhlcmUgbWF5IGJlIGFub3RoZXIgbm9kZSB3aGlj
aCBoYXMgYSBoaWdoZXIgdGFiIGluZGV4IGJ1dCBpcyBzdGlsbCBzdWl0YWJsZSBmb3IgdXNlLgot
CQkgICAgaGlnaGVzdFN1aXRhYmxlVGFiSW5kZXggPSBuLT50YWJJbmRleCgpOwotCQl9Ci0KLQkJ
aWYgKG4gPT0gZnJvbU5vZGUpCi0JCSAgICByZWFjaGVkRnJvbU5vZGUgPSB0cnVlOwotCSAgICB9
Ci0KLQkgICAgaWYgKGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4ID09IDApIHsKLQkJLy8gTm8gcHJl
dmlvdXMgbm9kZSB3aXRoIGEgdGFiIGluZGV4LiBTaW5jZSB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5
IEhUTUwgaXMgbm9kZXMgd2l0aCB0YWIgaW5kZXggPiAwCi0JCS8vIGZpcnN0LCB0aGlzIG1lYW5z
IHRoYXQgdGhlcmUgaXMgbm8gcHJldmlvdXMgbm9kZS4KLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQot
CSAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZyb20gZnJvbU5vZGUKLQkgICAgZm9yIChuID0gZnJv
bU5vZGUtPnRyYXZlcnNlUHJldmlvdXNOb2RlKCk7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJl
dmlvdXNOb2RlKCkpIHsKLQkJaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFi
SW5kZXgoKSA9PSBoaWdoZXN0U3VpdGFibGVUYWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsKLQkg
ICAgfQotCSAgICAvLyBUaGUgcHJldmlvdXMgbm9kZSBpc24ndCBiZWZvcmUgZnJvbU5vZGUsIHN0
YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkgICAgZm9yIChuID0gbGFzdE5vZGU7
IG4gIT0gZnJvbU5vZGU7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JCWlmIChu
LT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gaGlnaGVzdFN1aXRh
YmxlVGFiSW5kZXgpKQotCQkgICAgcmV0dXJuIG47Ci0JICAgIH0KLQotCSAgICBhc3NlcnQoZmFs
c2UpOyAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0K
LX0KLQotaW50IERvY3VtZW50SW1wbDo6bm9kZUFic0luZGV4KE5vZGVJbXBsICpub2RlKQotewot
ICAgIGFzc2VydChub2RlLT5nZXREb2N1bWVudCgpID09IHRoaXMpOwotCi0gICAgaW50IGFic0lu
ZGV4ID0gMDsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7IG4g
PSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKQotCWFic0luZGV4Kys7Ci0gICAgcmV0dXJuIGFi
c0luZGV4OwotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjpub2RlV2l0aEFic0luZGV4KGlu
dCBhYnNJbmRleCkKLXsKLSAgICBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgZm9yIChpbnQgaSA9
IDA7IG4gJiYgKGkgPCBhYnNJbmRleCk7IGkrKykgewotCW4gPSBuLT50cmF2ZXJzZU5leHROb2Rl
KCk7Ci0gICAgfQotICAgIHJldHVybiBuOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cHJvY2Vz
c0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcgJmVxdWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRl
bnQpCi17Ci0gICAgYXNzZXJ0KCFlcXVpdi5pc051bGwoKSAmJiAhY29udGVudC5pc051bGwoKSk7
Ci0KLSAgICBGcmFtZSAqZnJhbWUgPSB0aGlzLT5mcmFtZSgpOwotCi0gICAgaWYgKGVxdWFsSWdu
b3JpbmdDYXNlKGVxdWl2LCAiZGVmYXVsdC1zdHlsZSIpKSB7Ci0gICAgICAgIC8vIFRoZSBwcmVm
ZXJyZWQgc3R5bGUgc2V0IGhhcyBiZWVuIG92ZXJyaWRkZW4gYXMgcGVyIHNlY3Rpb24gCi0gICAg
ICAgIC8vIDE0LjMuMiBvZiB0aGUgSFRNTDQuMCBzcGVjaWZpY2F0aW9uLiAgV2UgbmVlZCB0byB1
cGRhdGUgdGhlCi0gICAgICAgIC8vIHNoZWV0IHVzZWQgdmFyaWFibGUgYW5kIHRoZW4gdXBkYXRl
IG91ciBzdHlsZSBzZWxlY3Rvci4gCi0gICAgICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSB0aGUg
dGVzdCBhdDoKLSAgICAgICAgLy8gaHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9ldmlsL2Nzcy9p
bXBvcnQvbWFpbi9wcmVmZXJyZWQuaHRtbAotICAgICAgICAvLyAtZHdoCi0gICAgICAgIG1fc2Vs
ZWN0ZWRTdHlsZXNoZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNo
ZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgdXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICAgIH0K
LSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgInJlZnJlc2giKSAmJiBmcmFt
ZS0+bWV0YVJlZnJlc2hFbmFibGVkKCkpCi0gICAgewotICAgICAgICAvLyBnZXQgZGVsYXkgYW5k
IHVybAotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRlbnQucXN0cmluZygpLnN0cmlwV2hpdGVT
cGFjZSgpOwotICAgICAgICBpbnQgcG9zID0gc3RyLmZpbmQoUVJlZ0V4cCgiWzssXSIpKTsKLSAg
ICAgICAgaWYgKCBwb3MgPT0gLTEgKQotICAgICAgICAgICAgcG9zID0gc3RyLmZpbmQoUVJlZ0V4
cCgiWyBcdF0iKSk7Ci0KLSAgICAgICAgaWYgKHBvcyA9PSAtMSkgLy8gVGhlcmUgY2FuIGJlIG5v
IHVybCAoRGF2aWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKLSAg
ICAgICAgICAgIGludCBkZWxheSA9IDA7Ci0JICAgIGRlbGF5ID0gc3RyLnRvSW50KCZvayk7Ci0J
ICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlmIHRoZSByZWZyZXNoIHRpbWVvdXQg
PiAxIHNlY29uZAotCSAgICBpZihvayAmJiBmcmFtZSkgZnJhbWUtPnNjaGVkdWxlUmVkaXJlY3Rp
b24oZGVsYXksIGZyYW1lLT51cmwoKS51cmwoKSwgZGVsYXkgPD0gMSk7Ci0gICAgICAgIH0gZWxz
ZSB7Ci0gICAgICAgICAgICBkb3VibGUgZGVsYXkgPSAwOwotICAgICAgICAgICAgYm9vbCBvayA9
IGZhbHNlOwotCSAgICBkZWxheSA9IHN0ci5sZWZ0KHBvcykuc3RyaXBXaGl0ZVNwYWNlKCkudG9E
b3VibGUoJm9rKTsKLQotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICB3aGlsZShwb3Mg
PCAoaW50KXN0ci5sZW5ndGgoKSAmJiBzdHJbcG9zXS5pc1NwYWNlKCkpIHBvcysrOwotICAgICAg
ICAgICAgc3RyID0gc3RyLm1pZChwb3MpOwotICAgICAgICAgICAgaWYgKHN0ci5maW5kKCJ1cmwi
LCAwLCAgZmFsc2UgKSA9PSAwKQotICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5taWQoMyk7Ci0g
ICAgICAgICAgICBzdHIgPSBzdHIuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAo
c3RyLmxlbmd0aCgpICYmIHN0clswXSA9PSAnPScpCi0gICAgICAgICAgICAgICAgc3RyID0gc3Ry
Lm1pZCgxKS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgIHN0ciA9IHBhcnNlVVJMKERP
TVN0cmluZyhzdHIpKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAob2sgJiYgZnJhbWUpCi0g
ICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBhIG5ldyBoaXN0b3J5IGl0ZW0gaWYgdGhlIHJlZnJl
c2ggdGltZW91dCA+IDEgc2Vjb25kCi0gICAgICAgICAgICAgICAgZnJhbWUtPnNjaGVkdWxlUmVk
aXJlY3Rpb24oZGVsYXksIGNvbXBsZXRlVVJMKCBzdHIgKSwgZGVsYXkgPD0gMSk7Ci0gICAgICAg
IH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJleHBpcmVz
IikpCi0gICAgewotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRlbnQucXN0cmluZygpLnN0cmlw
V2hpdGVTcGFjZSgpOwotICAgICAgICB0aW1lX3QgZXhwaXJlX2RhdGUgPSBzdHIudG9JbnQoKTsK
LSAgICAgICAgaWYgKG1fZG9jTG9hZGVyKQotICAgICAgICAgICAgbV9kb2NMb2FkZXItPnNldEV4
cGlyZURhdGUoZXhwaXJlX2RhdGUpOwotICAgIH0KLSAgICBlbHNlIGlmICgoZXF1YWxJZ25vcmlu
Z0Nhc2UoZXF1aXYsICJwcmFnbWEiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImNhY2hl
LWNvbnRyb2wiKSkgJiYgZnJhbWUpCi0gICAgewotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRl
bnQucXN0cmluZygpLmxvd2VyKCkuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgIEtVUkwgdXJs
ID0gZnJhbWUtPnVybCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShl
cXVpdiwgInNldC1jb29raWUiKSkKLSAgICB7Ci0gICAgICAgIC8vICMjIyBtYWtlIHNldENvb2tp
ZSB3b3JrIG9uIFhNTCBkb2N1bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAu
Li4uLj4KLSAgICAgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgICAgICBzdGF0aWNf
Y2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KHRoaXMpLT5zZXRDb29raWUoY29udGVudCk7Ci0gICAg
fQotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFkb25s
eSwgaW50IHgsIGludCB5LCBNb3VzZUV2ZW50KiBldikKLXsKLSAgICByZXR1cm4gcHJlcGFyZU1v
dXNlRXZlbnQocmVhZG9ubHksIGV2LT50eXBlID09IE1vdXNlUHJlc3MsIHgsIHksIGV2KTsKLX0K
LQotYm9vbCBEb2N1bWVudEltcGw6OnByZXBhcmVNb3VzZUV2ZW50KGJvb2wgcmVhZG9ubHksIGJv
b2wgYWN0aXZlLCBpbnQgX3gsIGludCBfeSwgTW91c2VFdmVudCAqZXYpCi17Ci0gICAgaWYgKCBt
X3JlbmRlciApIHsKLSAgICAgICAgYXNzZXJ0KG1fcmVuZGVyLT5pc0NhbnZhcygpKTsKLSAgICAg
ICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyByZW5kZXJJbmZvKHJlYWRvbmx5LCBhY3RpdmUsIGV2
LT50eXBlID09IE1vdXNlTW92ZSk7Ci0gICAgICAgIGJvb2wgaXNJbnNpZGUgPSBtX3JlbmRlci0+
bGF5ZXIoKS0+aGl0VGVzdChyZW5kZXJJbmZvLCBfeCwgX3kpOwotICAgICAgICBldi0+aW5uZXJO
b2RlID0gcmVuZGVySW5mby5pbm5lck5vZGUoKTsKLQotICAgICAgICBpZiAocmVuZGVySW5mby5V
UkxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGFzc2VydChyZW5kZXJJbmZvLlVSTEVsZW1lbnQo
KS0+aXNFbGVtZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsKiBlID0gIHN0YXRp
Y19jYXN0PEVsZW1lbnRJbXBsKj4ocmVuZGVySW5mby5VUkxFbGVtZW50KCkpOwotICAgICAgICAg
ICAgRE9NU3RyaW5nIGhyZWYgPSBraHRtbDo6cGFyc2VVUkwoZS0+Z2V0QXR0cmlidXRlKGhyZWZB
dHRyKSk7Ci0gICAgICAgICAgICBET01TdHJpbmcgdGFyZ2V0ID0gZS0+Z2V0QXR0cmlidXRlKHRh
cmdldEF0dHIpOwotCi0gICAgICAgICAgICBpZiAoIXRhcmdldC5pc051bGwoKSAmJiAhaHJlZi5p
c051bGwoKSkgewotICAgICAgICAgICAgICAgIGV2LT50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAg
ICAgICAgICAgZXYtPnVybCA9IGhyZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNl
Ci0gICAgICAgICAgICAgICAgZXYtPnVybCA9IGhyZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBp
ZiAoIXJlYWRvbmx5KQotICAgICAgICAgICAgdXBkYXRlUmVuZGVyaW5nKCk7Ci0KLSAgICAgICAg
cmV0dXJuIGlzSW5zaWRlOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBE
T00gU2VjdGlvbiAxLjEuMQotYm9vbCBEb2N1bWVudEltcGw6OmNoaWxkQWxsb3dlZCggTm9kZUlt
cGwgKm5ld0NoaWxkICkKLXsKLSAgICAvLyBEb2N1bWVudHMgbWF5IGNvbnRhaW4gYSBtYXhpbXVt
IG9mIG9uZSBFbGVtZW50IGNoaWxkCi0gICAgaWYgKG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IE5v
ZGU6OkVMRU1FTlRfTk9ERSkgewotICAgICAgICBOb2RlSW1wbCAqYzsKLSAgICAgICAgZm9yIChj
ID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAg
aWYgKGMtPm5vZGVUeXBlKCkgPT0gTm9kZTo6RUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIERvY3VtZW50cyBtYXkg
Y29udGFpbiBhIG1heGltdW0gb2Ygb25lIERvY3VtZW50VHlwZSBjaGlsZAotICAgIGlmIChuZXdD
aGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREUpIHsKLSAgICAgICAg
Tm9kZUltcGwgKmM7Ci0gICAgICAgIGZvciAoYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5l
eHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IE5vZGU6OkRP
Q1VNRU5UX1RZUEVfTk9ERSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAg
IH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hpbGRUeXBlQWxsb3dlZChuZXdDaGlsZC0+bm9kZVR5
cGUoKSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25l
ZCBzaG9ydCB0eXBlICkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBOb2Rl
OjpFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElP
Tl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBO
b2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLU5vZGVJ
bXBsICpEb2N1bWVudEltcGw6OmNsb25lTm9kZSAoIGJvb2wgLypkZWVwKi8gKQotewotICAgIC8v
IFNwZWMgc2F5cyBjbG9uaW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBl
bmRlbnQiCi0gICAgLy8gc28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KLSAgICByZXR1cm4gMDsK
LX0KLQotU3R5bGVTaGVldExpc3RJbXBsKiBEb2N1bWVudEltcGw6OnN0eWxlU2hlZXRzKCkKLXsK
LSAgICByZXR1cm4gbV9zdHlsZVNoZWV0czsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6
cHJlZmVycmVkU3R5bGVzaGVldFNldCgpCi17Ci0gIHJldHVybiBtX3ByZWZlcnJlZFN0eWxlc2hl
ZXRTZXQ7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OnNlbGVjdGVkU3R5bGVzaGVldFNl
dCgpCi17Ci0gIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25zdCBET01TdHJpbmcmIGFTdHJp
bmcpCi17Ci0gIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gYVN0cmluZzsKLSAgdXBkYXRlU3R5
bGVTZWxlY3RvcigpOwotICBpZiAocmVuZGVyZXIoKSkKLSAgICByZW5kZXJlcigpLT5yZXBhaW50
KCk7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBz
dHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudEltcGw6OnN0eWxl
c2hlZXRMb2FkZWQoKQotewotICAvLyBNYWtlIHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBw
ZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQgaXNuJ3Qgb3V0IG9mIHN5bmMuCi0gIGFzc2VydCht
X3BlbmRpbmdTdHlsZXNoZWV0cyA+IDApOwotCi0gIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0g
IAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgaWYgKCFvd25lckVsZW1l
bnQoKSkKLSAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5
bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVz
aGVldHMpOwotI2VuZGlmCi0KLSAgdXBkYXRlU3R5bGVTZWxlY3RvcigpOyAgICAKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OnVwZGF0ZVN0eWxlU2VsZWN0b3IoKQotewotICAgIC8vIERvbid0IGJv
dGhlciB1cGRhdGluZywgc2luY2Ugd2UgaGF2ZW4ndCBsb2FkZWQgYWxsIG91ciBzdHlsZSBpbmZv
IHlldC4KLSAgICBpZiAoIWhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1cm47
Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgdXBkYXRlIG9mIHN0eWxlIHNlbGVj
dG9yIGF0IHRpbWUgJWQuXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgcmVjYWxj
U3R5bGVTZWxlY3RvcigpOwotICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLQotI2lmZGVmIElOU1RS
VU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAg
ICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkXG4i
LCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAg
ICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAg
aWYgKHZpZXcoKSkKLSAgICAgICAgICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwotICAg
IH0KLX0KLQotCi1RU3RyaW5nTGlzdCBEb2N1bWVudEltcGw6OmF2YWlsYWJsZVN0eWxlU2hlZXRz
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdmFpbGFibGVTaGVldHM7Ci19Ci0KLXZvaWQgRG9j
dW1lbnRJbXBsOjpyZWNhbGNTdHlsZVNlbGVjdG9yKCkKLXsKLSAgICBpZiAoICFtX3JlbmRlciB8
fCAhYXR0YWNoZWQoKSApIHJldHVybjsKLQotICAgIFFQdHJMaXN0PFN0eWxlU2hlZXRJbXBsPiBv
bGRTdHlsZVNoZWV0cyA9IG1fc3R5bGVTaGVldHMtPnN0eWxlU2hlZXRzOwotICAgIG1fc3R5bGVT
aGVldHMtPnN0eWxlU2hlZXRzLmNsZWFyKCk7Ci0gICAgbV9hdmFpbGFibGVTaGVldHMuY2xlYXIo
KTsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSB0aGlzOyBuOyBuID0gbi0+dHJhdmVy
c2VOZXh0Tm9kZSgpKSB7Ci0gICAgCVN0eWxlU2hlZXRJbXBsICpzaGVldCA9IDA7Ci0KLSAgICAg
ICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RF
KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwg
ZG9jdW1lbnRzIG9ubHkpCi0gICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBw
aSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwqPihuKTsKLSAgICAgICAg
ICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7Ci0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAgICAg
aWYgKHBpLT5pc1hTTCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgdHJhbnNm
b3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0v
NDEzMjgwNj4KLSAgICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybVNvdXJjZURvY3VtZW50KCkp
Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICghc2hl
ZXQgJiYgIXBpLT5sb2NhbEhyZWYoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAg
ICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aXRoIHJlZmVyZW5jZSB0byBhbiBl
bGVtZW50IGluIHRoaXMgZG9jdW1lbnQgLSBlLmcuCi0gICAgICAgICAgICAgICAgLy8gPD94bWwt
c3R5bGVzaGVldCBocmVmPSIjbXlzdHlsZSI+LCB3aXRoIHRoZSBlbGVtZW50Ci0gICAgICAgICAg
ICAgICAgLy8gPGZvbyBpZD0ibXlzdHlsZSI+aGVhZGluZyB7IGNvbG9yOiByZWQ7IH08L2Zvbz4g
YXQgc29tZSBsb2NhdGlvbiBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudAotICAg
ICAgICAgICAgICAgIEVsZW1lbnRJbXBsKiBlbGVtID0gZ2V0RWxlbWVudEJ5SWQocGktPmxvY2Fs
SHJlZigpKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbSkgewotICAgICAgICAgICAgICAgICAg
ICBET01TdHJpbmcgc2hlZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgTm9kZUltcGwg
KmM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IGVsZW0tPmZpcnN0Q2hpbGQoKTsgYzsg
YyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5u
b2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSB8fCBjLT5ub2RlVHlwZSgpID09IE5vZGU6OkNE
QVRBX1NFQ1RJT05fTk9ERSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldFRleHQg
Kz0gYy0+bm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
ICAgICAgICBDU1NTdHlsZVNoZWV0SW1wbCAqY3NzU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldElt
cGwodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNzc1NoZWV0LT5wYXJzZVN0cmluZyhzaGVl
dFRleHQpOwotICAgICAgICAgICAgICAgICAgICBwaS0+c2V0U3R5bGVTaGVldChjc3NTaGVldCk7
Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gY3NzU2hlZXQ7Ci0gICAgICAgICAgICAgICAg
fQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobi0+aXNIVE1M
RWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05hbWUoc3R5
bGVUYWcpKSkgewotICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplID0gc3RhdGljX2Nhc3Q8
SFRNTEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICAgICAgUVN0cmluZyB0aXRsZSA9IGUtPmdl
dEF0dHJpYnV0ZSh0aXRsZUF0dHIpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxl
ZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5r
VGFnKSkgewotICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50Ci0gICAgICAgICAgICAg
ICAgSFRNTExpbmtFbGVtZW50SW1wbCogbCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudElt
cGwqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAobC0+aXNMb2FkaW5nKCkgfHwgbC0+aXNEaXNh
YmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBp
ZiAoIWwtPnNoZWV0KCkpCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gUVN0cmluZzo6bnVs
bDsKLSAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbC0+aXNFbmFibGVkVmlhU2Ny
aXB0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBw
cmVmZXJyZWQgc3R5bGVzZXQuICBUaGlzIGlzIHRoZQotICAgICAgICAgICAgLy8gc2V0IG9mIHNo
ZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4KLSAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5h
bWUobGlua1RhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MTGlu
a0VsZW1lbnRJbXBsKj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAg
ICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNf
Y2FzdDxIVE1MU3R5bGVFbGVtZW50SW1wbCo+KG4pLT5zaGVldCgpOwotCi0gICAgICAgICAgICAv
LyBDaGVjayB0byBzZWUgaWYgdGhpcyBzaGVldCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKLSAgICAg
ICAgICAgIC8vICh0aHVzIG1ha2luZyBpdCBQUkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhlciB0
aGFuCi0gICAgICAgICAgICAvLyBQRVJTSVNURU5UKS4KLSAgICAgICAgICAgIGlmICghZW5hYmxl
ZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gWWVz
LCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVk
IHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCi0gICAgICAgICAgICAgICAgICAgIC8vIHdl
IGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlzaAotICAgICAgICAgICAg
ICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25v
cmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KLSAgICAgICAgICAgICAgICAg
ICAgUVN0cmluZyByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cikucXN0cmluZygpOwotICAg
ICAgICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNv
bnRhaW5zKCJhbHRlcm5hdGUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVk
U3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAg
ICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICgh
bV9hdmFpbGFibGVTaGVldHMuY29udGFpbnMoIHRpdGxlICkgKQotICAgICAgICAgICAgICAgICAg
ICBtX2F2YWlsYWJsZVNoZWV0cy5hcHBlbmQoIHRpdGxlICk7Ci0gICAgICAgICAgICAgICAgCi0g
ICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCkKLSAg
ICAgICAgICAgICAgICAgICAgc2hlZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0j
aWYgU1ZHX1NVUFBPUlQKLSAgICAgICAgZWxzZSBpZiAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+
aGFzVGFnTmFtZShLU1ZHOjpTVkdOYW1lczo6c3R5bGVUYWcpKSB7Ci0gICAgICAgICAgICBRU3Ry
aW5nIHRpdGxlOwotICAgICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAgICBL
U1ZHOjpTVkdTdHlsZUVsZW1lbnRJbXBsICpzID0gc3RhdGljX2Nhc3Q8S1NWRzo6U1ZHU3R5bGVF
bGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgaWYgKCFzLT5pc0xvYWRpbmcoKSkgewotICAg
ICAgICAgICAgICAgIHNoZWV0ID0gcy0+c2hlZXQoKTsKLSAgICAgICAgICAgICAgICBpZihzaGVl
dCkKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBzLT5nZXRBdHRyaWJ1dGUoS1NWRzo6U1ZH
TmFtZXM6OnRpdGxlQXR0cikucXN0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAg
ICBpZiAoIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0
eSgpKQotICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0
ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0KLSAgICAgICAgICAgIGlmICghdGl0bGUuaXNFbXB0
eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVzaGVl
dFNldCkKLSAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAwOyAvLyBkb24ndCB1c2UgaXQKLQot
ICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgnJicsIFFTdHJpbmc6OmZyb21M
YXRpbjEoIiYmIikpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtX2F2YWlsYWJsZVNoZWV0cy5j
b250YWlucyh0aXRsZSkpCi0gICAgICAgICAgICAgICAgICAgIG1fYXZhaWxhYmxlU2hlZXRzLmFw
cGVuZCh0aXRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAg
aWYgKHNoZWV0KSB7Ci0gICAgICAgICAgICBzaGVldC0+cmVmKCk7Ci0gICAgICAgICAgICBtX3N0
eWxlU2hlZXRzLT5zdHlsZVNoZWV0cy5hcHBlbmQoc2hlZXQpOwotICAgICAgICB9Ci0gICAgCi0g
ICAgICAgIC8vIEZvciBIVE1MIGRvY3VtZW50cywgc3R5bGVzaGVldHMgYXJlIG5vdCBhbGxvd2Vk
IHdpdGhpbi9hZnRlciB0aGUgPEJPRFk+IHRhZy4gU28gd2UKLSAgICAgICAgLy8gY2FuIHN0b3Ag
c2VhcmNoaW5nIGhlcmUuCi0gICAgICAgIGlmIChpc0hUTUxEb2N1bWVudCgpICYmIG4tPmhhc1Rh
Z05hbWUoYm9keVRhZykpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBEZS1y
ZWZlcmVuY2UgYWxsIHRoZSBzdHlsZXNoZWV0cyBpbiB0aGUgb2xkIGxpc3QKLSAgICBRUHRyTGlz
dEl0ZXJhdG9yPFN0eWxlU2hlZXRJbXBsPiBpdChvbGRTdHlsZVNoZWV0cyk7Ci0gICAgZm9yICg7
IGl0LmN1cnJlbnQoKTsgKytpdCkKLQlpdC5jdXJyZW50KCktPmRlcmVmKCk7Ci0KLSAgICAvLyBD
cmVhdGUgYSBuZXcgc3R5bGUgc2VsZWN0b3IKLSAgICBkZWxldGUgbV9zdHlsZVNlbGVjdG9yOwot
ICAgIFFTdHJpbmcgdXNlcnNoZWV0ID0gbV91c2Vyc2hlZXQ7Ci0gICAgaWYgKCBtX3ZpZXcgJiYg
bV92aWV3LT5tZWRpYVR5cGUoKSA9PSAicHJpbnQiICkKLQl1c2Vyc2hlZXQgKz0gbV9wcmludFNo
ZWV0OwotICAgIG1fc3R5bGVTZWxlY3RvciA9IG5ldyBDU1NTdHlsZVNlbGVjdG9yKHRoaXMsIHVz
ZXJzaGVldCwgbV9zdHlsZVNoZWV0cywgIWluQ29tcGF0TW9kZSgpKTsKLSAgICBtX3N0eWxlU2Vs
ZWN0b3ItPnNldEVuY29kZWRVUkwobV91cmwpOwotICAgIG1fc3R5bGVTZWxlY3RvckRpcnR5ID0g
ZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRIb3Zlck5vZGUoTm9kZUltcGwqIG5l
d0hvdmVyTm9kZSkKLXsKLSAgICBpZiAobV9ob3Zlck5vZGUgIT0gbmV3SG92ZXJOb2RlKQotICAg
ICAgICBtX2hvdmVyTm9kZSA9IG5ld0hvdmVyTm9kZTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6
OnNldEFjdGl2ZU5vZGUoTm9kZUltcGwqIG5ld0FjdGl2ZU5vZGUpCi17Ci0gICAgaWYgKG1fYWN0
aXZlTm9kZSAhPSBuZXdBY3RpdmVOb2RlKQotICAgICAgICBtX2FjdGl2ZU5vZGUgPSBuZXdBY3Rp
dmVOb2RlOwotfQotCi0KLWJvb2wgRG9jdW1lbnRJbXBsOjpyZWxpbnF1aXNoZXNFZGl0aW5nRm9j
dXMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgYXNzZXJ0KG5vZGUpOwotICAgIGFzc2VydChub2Rl
LT5pc0NvbnRlbnRFZGl0YWJsZSgpKTsKLQotICAgIE5vZGVJbXBsICpyb290ID0gbm9kZS0+cm9v
dEVkaXRhYmxlRWxlbWVudCgpOwotICAgIGlmICghZnJhbWUoKSB8fCAhcm9vdCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGZyYW1lKCktPnNob3VsZEVuZEVkaXRpbmcocmFu
Z2VPZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OmFjY2Vw
dHNFZGl0aW5nRm9jdXMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgYXNzZXJ0KG5vZGUpOwotICAg
IGFzc2VydChub2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKTsKLQotICAgIE5vZGVJbXBsICpyb290
ID0gbm9kZS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwotICAgIGlmICghZnJhbWUoKSB8fCAhcm9v
dCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGZyYW1lKCktPnNob3VsZEJl
Z2luRWRpdGluZyhyYW5nZU9mQ29udGVudHMocm9vdCkuZ2V0KCkpOwotfQotCi1jb25zdCBRVmFs
dWVMaXN0PERhc2hib2FyZFJlZ2lvblZhbHVlPiAmIERvY3VtZW50SW1wbDo6ZGFzaGJvYXJkUmVn
aW9ucygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uczsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OnNldERhc2hib2FyZFJlZ2lvbnMgKGNvbnN0IFFWYWx1ZUxpc3Q8RGFz
aGJvYXJkUmVnaW9uVmFsdWU+JiByZWdpb25zKQotewotICAgIG1fZGFzaGJvYXJkUmVnaW9ucyA9
IHJlZ2lvbnM7Ci0gICAgc2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5IChmYWxzZSk7Ci19Ci0KLQot
c3RhdGljIFFXaWRnZXQgKndpZGdldEZvck5vZGUoTm9kZUltcGwgKmZvY3VzTm9kZSkKLXsKLSAg
ICBpZiAoIWZvY3VzTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0ICpy
ZW5kZXJlciA9IGZvY3VzTm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFy
ZW5kZXJlci0+aXNXaWRnZXQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRp
Y19jYXN0PFJlbmRlcldpZGdldCAqPihyZW5kZXJlciktPndpZGdldCgpOwotfQotCi1ib29sIERv
Y3VtZW50SW1wbDo6c2V0Rm9jdXNOb2RlKE5vZGVJbXBsICpuZXdGb2N1c05vZGUpCi17ICAgIAot
ICAgIC8vIE1ha2Ugc3VyZSBuZXdGb2N1c05vZGUgaXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1bWVu
dAotICAgIGlmIChuZXdGb2N1c05vZGUgJiYgKG5ld0ZvY3VzTm9kZS0+Z2V0RG9jdW1lbnQoKSAh
PSB0aGlzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobV9mb2N1c05vZGUgPT0g
bmV3Rm9jdXNOb2RlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2ZvY3VzTm9k
ZSAmJiBtX2ZvY3VzTm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSAmJiAhcmVsaW5xdWlzaGVzRWRp
dGluZ0ZvY3VzKG1fZm9jdXNOb2RlLmdldCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgIAotICAgIGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7Ci0gICAgUmVmUHRyPE5v
ZGVJbXBsPiBvbGRGb2N1c05vZGUgPSBtX2ZvY3VzTm9kZTsKLSAgICBtX2ZvY3VzTm9kZSA9IDA7
Ci0gICAgY2xlYXJTZWxlY3Rpb25JZk5lZWRlZChuZXdGb2N1c05vZGUpOwotCi0gICAgLy8gUmVt
b3ZlIGZvY3VzIGZyb20gdGhlIGV4aXN0aW5nIGZvY3VzIG5vZGUgKGlmIGFueSkKLSAgICBpZiAo
b2xkRm9jdXNOb2RlICYmICFvbGRGb2N1c05vZGUtPm1faW5EZXRhY2gpIHsgCi0gICAgICAgIGlm
IChvbGRGb2N1c05vZGUtPmFjdGl2ZSgpKQotICAgICAgICAgICAgb2xkRm9jdXNOb2RlLT5zZXRB
Y3RpdmUoZmFsc2UpOwotCi0gICAgICAgIG9sZEZvY3VzTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOwot
ICAgICAgICBvbGRGb2N1c05vZGUtPmRpc3BhdGNoSFRNTEV2ZW50KGJsdXJFdmVudCwgZmFsc2Us
IGZhbHNlKTsKLSAgICAgICAgaWYgKG1fZm9jdXNOb2RlKSB7Ci0gICAgICAgICAgICAvLyBoYW5k
bGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7
Ci0gICAgICAgICAgICBuZXdGb2N1c05vZGUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNsZWFy
U2VsZWN0aW9uSWZOZWVkZWQobmV3Rm9jdXNOb2RlKTsKLSAgICAgICAgb2xkRm9jdXNOb2RlLT5k
aXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNPdXRFdmVudCk7Ci0gICAgICAgIGlmIChtX2ZvY3VzTm9k
ZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBm
b2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgbmV3Rm9jdXNOb2RlID0gMDsK
LSAgICAgICAgfQotICAgICAgICBjbGVhclNlbGVjdGlvbklmTmVlZGVkKG5ld0ZvY3VzTm9kZSk7
Ci0gICAgICAgIGlmICgob2xkRm9jdXNOb2RlLmdldCgpID09IHRoaXMpICYmIG9sZEZvY3VzTm9k
ZS0+aGFzT25lUmVmKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBp
ZiAobmV3Rm9jdXNOb2RlKSB7Ci0gICAgICAgIGlmIChuZXdGb2N1c05vZGUtPmlzQ29udGVudEVk
aXRhYmxlKCkgJiYgIWFjY2VwdHNFZGl0aW5nRm9jdXMobmV3Rm9jdXNOb2RlKSkgewotICAgICAg
ICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQotICAgICAgICAgICAgZm9jdXND
aGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsK
LSAgICAgICAgfQotICAgICAgICAvLyBTZXQgZm9jdXMgb24gdGhlIG5ldyBub2RlCi0gICAgICAg
IG1fZm9jdXNOb2RlID0gbmV3Rm9jdXNOb2RlOwotICAgICAgICBtX2ZvY3VzTm9kZS0+ZGlzcGF0
Y2hIVE1MRXZlbnQoZm9jdXNFdmVudCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1fZm9j
dXNOb2RlICE9IG5ld0ZvY3VzTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVk
IGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAg
ICAgZ290byBTZXRGb2N1c05vZGVEb25lOwotICAgICAgICB9Ci0gICAgICAgIG1fZm9jdXNOb2Rl
LT5kaXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNJbkV2ZW50KTsKLSAgICAgICAgaWYgKG1fZm9jdXNO
b2RlICE9IG5ld0ZvY3VzTm9kZSkgeyAKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBm
b2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAg
IGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsKLSAgICAgICAgfQotICAgICAgICBtX2ZvY3VzTm9kZS0+
c2V0Rm9jdXMoKTsKLSAgICAgICAgLy8gZXd3LCBJIHN1Y2suIHNldCB0aGUgcXQgZm9jdXMgY29y
cmVjdGx5Ci0gICAgICAgIC8vICMjIyBmaW5kIGEgYmV0dGVyIHBsYWNlIGluIHRoZSBjb2RlIGZv
ciB0aGlzCi0gICAgICAgIGlmICh2aWV3KCkpIHsKLSAgICAgICAgICAgIFFXaWRnZXQgKmZvY3Vz
V2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzTm9kZS5nZXQoKSk7Ci0gICAgICAgICAgICBp
ZiAoZm9jdXNXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYSB3aWRnZXQg
aGFzIHRoZSByaWdodCBzaXplIGJlZm9yZSBnaXZpbmcgaXQgZm9jdXMuCi0gICAgICAgICAgICAg
ICAgLy8gT3RoZXJ3aXNlLCB3ZSBhcmUgdGVzdGluZyBlZGdlIGNhc2VzIG9mIHRoZSBRV2lkZ2V0
IGNvZGUuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBpbiBXZWJDb3JlIHRoaXMg
ZG9lcyBub3Qgd29yayB3ZWxsIGZvciB0ZXh0IGZpZWxkcy4KLSAgICAgICAgICAgICAgICB1cGRh
dGVMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAvLyBSZS1nZXQgdGhlIHdpZGdldCBpbiBjYXNl
IHVwZGF0aW5nIHRoZSBsYXlvdXQgY2hhbmdlZCB0aGluZ3MuCi0gICAgICAgICAgICAgICAgZm9j
dXNXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG1fZm9jdXNOb2RlLmdldCgpKTsKLSAgICAgICAgICAg
IH0KLSAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkKLSAgICAgICAgICAgICAgICBmb2N1c1dp
ZGdldC0+c2V0Rm9jdXMoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2aWV3
KCktPnNldEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgIH0KLQotICAgIGlmICghZm9jdXNDaGFuZ2VC
bG9ja2VkICYmIG1fZm9jdXNOb2RlICYmIEtXUUFjY09iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5
RW5hYmxlZCgpKQotICAgICAgICBnZXRBY2NPYmplY3RDYWNoZSgpLT5oYW5kbGVGb2N1c2VkVUlF
bGVtZW50Q2hhbmdlZCgpOwotCi1TZXRGb2N1c05vZGVEb25lOgotICAgIHVwZGF0ZVJlbmRlcmlu
ZygpOwotICAgIHJldHVybiAhZm9jdXNDaGFuZ2VCbG9ja2VkOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6Y2xlYXJTZWxlY3Rpb25JZk5lZWRlZChOb2RlSW1wbCAqbmV3Rm9jdXNOb2RlKQotewot
ICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQ2xlYXIgdGhlIHNl
bGVjdGlvbiB3aGVuIGNoYW5naW5nIHRoZSBmb2N1cyBub2RlIHRvIG51bGwgb3IgdG8gYSBub2Rl
IHRoYXQgaXMgbm90IAotICAgIC8vIGNvbnRhaW5lZCBieSB0aGUgY3VycmVudCBzZWxlY3Rpb24u
Ci0gICAgTm9kZUltcGwgKnN0YXJ0Q29udGFpbmVyID0gZnJhbWUoKS0+c2VsZWN0aW9uKCkuc3Rh
cnQoKS5ub2RlKCk7Ci0gICAgaWYgKCFuZXdGb2N1c05vZGUgfHwgKHN0YXJ0Q29udGFpbmVyICYm
IHN0YXJ0Q29udGFpbmVyICE9IG5ld0ZvY3VzTm9kZSAmJiAhc3RhcnRDb250YWluZXItPmlzQW5j
ZXN0b3IobmV3Rm9jdXNOb2RlKSkpCi0gICAgICAgIC8vIEZJWE1FOiA2NDk4IFNob3VsZCBqdXN0
IGJlIGFibGUgdG8gY2FsbCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS5jbGVhcigpCi0gICAgICAgIGZy
YW1lKCktPnNldFNlbGVjdGlvbihTZWxlY3Rpb25Db250cm9sbGVyKCkpOwotfQotCi12b2lkIERv
Y3VtZW50SW1wbDo6c2V0Q1NTVGFyZ2V0KE5vZGVJbXBsKiBuKQotewotICAgIGlmIChtX2Nzc1Rh
cmdldCkKLSAgICAgICAgbV9jc3NUYXJnZXQtPnNldENoYW5nZWQoKTsKLSAgICBtX2Nzc1Rhcmdl
dCA9IG47Ci0gICAgaWYgKG4pCi0gICAgICAgIG4tPnNldENoYW5nZWQoKTsKLX0KLQotTm9kZUlt
cGwqIERvY3VtZW50SW1wbDo6Z2V0Q1NTVGFyZ2V0KCkKLXsKLSAgICByZXR1cm4gbV9jc3NUYXJn
ZXQ7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJh
dG9ySW1wbCAqbmkpCi17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLmFwcGVuZChuaSk7Ci19Ci0KLXZv
aWQgRG9jdW1lbnRJbXBsOjpkZXRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9ySW1wbCAqbmkp
Ci17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLnJlbW92ZShuaSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChOb2RlSW1wbCAqbikKLXsKLSAgICBRUHRyTGlz
dEl0ZXJhdG9yPE5vZGVJdGVyYXRvckltcGw+IGl0KG1fbm9kZUl0ZXJhdG9ycyk7Ci0gICAgZm9y
ICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaXQuY3VycmVudCgpLT5ub3RpZnlCZWZv
cmVOb2RlUmVtb3ZhbChuKTsKLX0KLQotQWJzdHJhY3RWaWV3SW1wbCAqRG9jdW1lbnRJbXBsOjpk
ZWZhdWx0VmlldygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGVmYXVsdFZpZXc7Ci19Ci0KLUV2
ZW50SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVFdmVudChjb25zdCBET01TdHJpbmcgJmV2ZW50
VHlwZSwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIGlmIChldmVudFR5cGUgPT0gIlVJRXZl
bnRzIiB8fCBldmVudFR5cGUgPT0gIlVJRXZlbnQiKQotICAgICAgICByZXR1cm4gbmV3IFVJRXZl
bnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJNb3VzZUV2ZW50cyIgfHwgZXZl
bnRUeXBlID09ICJNb3VzZUV2ZW50IikKLSAgICAgICAgcmV0dXJuIG5ldyBNb3VzZUV2ZW50SW1w
bCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSAiTXV0YXRpb25FdmVudHMiIHx8IGV2ZW50
VHlwZSA9PSAiTXV0YXRpb25FdmVudCIpCi0gICAgICAgIHJldHVybiBuZXcgTXV0YXRpb25FdmVu
dEltcGwoKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gIktleWJvYXJkRXZlbnRzIiB8fCBl
dmVudFR5cGUgPT0gIktleWJvYXJkRXZlbnQiKQotICAgICAgICByZXR1cm4gbmV3IEtleWJvYXJk
RXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJIVE1MRXZlbnRzIiB8fCBl
dmVudFR5cGUgPT0gIkV2ZW50IiB8fCBldmVudFR5cGUgPT0gIkV2ZW50cyIpCi0gICAgICAgIHJl
dHVybiBuZXcgRXZlbnRJbXBsKCk7Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gIlNWR0V2ZW50cyIpCi0gICAgICAgIHJldHVybiBuZXcgRXZlbnRJbXBsKCk7Ci0g
ICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJTVkdab29tRXZlbnRzIikKLSAgICAgICAgcmV0dXJu
IG5ldyBLU1ZHOjpTVkdab29tRXZlbnRJbXBsKCk7Ci0jZW5kaWYKLSAgICBlbHNlIHsKLSAgICAg
ICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAg
ICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgKkRvY3Vt
ZW50SW1wbDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50SW1wbCAqLyplbHQqLywgY29uc3QgRE9N
U3RyaW5nICYvKnBzZXVkb0VsdCovKQotewotICAgIHJldHVybiAwOyAvLyAjIyMKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0g
ICAgLy8gaWYgYW55IGh0bWwgZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIG9uIHRoZSB3
aW5kb3csIHRoZW4gZGlzcGF0Y2ggdGhlbSBoZXJlCi0gICAgUVB0ckxpc3Q8UmVnaXN0ZXJlZEV2
ZW50TGlzdGVuZXI+IGxpc3RlbmVyc0NvcHkgPSBtX3dpbmRvd0V2ZW50TGlzdGVuZXJzOwotICAg
IFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0KGxpc3RlbmVyc0Nv
cHkpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmIChpdC5jdXJy
ZW50KCktPmV2ZW50VHlwZSgpID09IGV2dC0+dHlwZSgpKQotICAgICAgICAgICAgaXQuY3VycmVu
dCgpLT5saXN0ZW5lcigpLT5oYW5kbGVFdmVudEltcGwoZXZ0LCB0cnVlKTsKLQotICAgIC8vIGhh
bmRsZSBhY2Nlc3NrZXkKLSAgICBpZiAoZXZ0LT50eXBlKCk9PWtleWRvd25FdmVudCkgewotICAg
ICAgICBLZXlib2FyZEV2ZW50SW1wbCAqa2V2dCA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJ
bXBsICo+KGV2dCk7Ci0gICAgICAgIGlmIChrZXZ0LT5jdHJsS2V5KCkpIHsKLSAgICAgICAgICAg
IFFLZXlFdmVudCAqcWV2dCA9IGtldnQtPnFLZXlFdmVudCgpOwotICAgICAgICAgICAgRE9NU3Ry
aW5nIGtleSA9IChxZXZ0ID8gcWV2dC0+dW5tb2RpZmllZFRleHQoKSA6IGtldnQtPmtleUlkZW50
aWZpZXIoKSkubG93ZXIoKTsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsICplbGVtID0gZ2V0RWxl
bWVudEJ5QWNjZXNzS2V5KGtleSk7Ci0gICAgICAgICAgICBpZiAoZWxlbSkgewotICAgICAgICAg
ICAgICAgIGVsZW0tPmFjY2Vzc0tleUFjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXZ0
LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3Qg
QXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKQotewotICAg
IC8vIElmIHdlIGFscmVhZHkgaGF2ZSBpdCB3ZSBkb24ndCB3YW50IHJlbW92ZVdpbmRvd0V2ZW50
TGlzdGVuZXIgdG8gZGVsZXRlIGl0Ci0gICAgaWYgKGxpc3RlbmVyKQotCWxpc3RlbmVyLT5yZWYo
KTsKLSAgICByZW1vdmVIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAgIGlm
IChsaXN0ZW5lcikgewotCWFkZFdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5l
ciwgZmFsc2UpOwotCWxpc3RlbmVyLT5kZXJlZigpOwotICAgIH0KLX0KLQotRXZlbnRMaXN0ZW5l
ciAqRG9jdW1lbnRJbXBsOjpnZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVu
dExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3Vy
cmVudCgpOyArK2l0KQotCWlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlw
ZSAmJiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9r
aHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIpCi0JICAgIHJldHVybiBpdC5jdXJyZW50KCktPmxpc3Rl
bmVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVIVE1M
V2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAg
ICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2
ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotCWlmIChpdC5j
dXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSAmJiBpdC5jdXJyZW50KCktPmxpc3Rl
bmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9raHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIp
IHsKLQkgICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsK
LQkgICAgcmV0dXJuOwotCX0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmFkZFdpbmRvd0V2ZW50
TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxp
c3RlbmVyLCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAgbGlzdGVuZXItPnJlZigpOwotCi0gICAg
Ly8gUmVtb3ZlIGV4aXN0aW5nIGlkZW50aWNhbCBsaXN0ZW5lciBzZXQgd2l0aCBpZGVudGljYWwg
YXJndW1lbnRzLgotICAgIC8vIFRoZSBET00gMiBzcGVjIHNheXMgdGhhdCAiZHVwbGljYXRlIGlu
c3RhbmNlcyBhcmUgZGlzY2FyZGVkIiBpbiB0aGlzIGNhc2UuCi0gICAgcmVtb3ZlV2luZG93RXZl
bnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLSAgICBtX3dpbmRv
d0V2ZW50TGlzdGVuZXJzLmFwcGVuZChuZXcgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIoZXZlbnRU
eXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkpOwotCi0gICAgbGlzdGVuZXItPmRlcmVmKCk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VD
YXB0dXJlKQotewotICAgIFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyIHJsKGV2ZW50VHlwZSwgbGlz
dGVuZXIsIHVzZUNhcHR1cmUpOwotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50
TGlzdGVuZXI+IGl0KG1fd2luZG93RXZlbnRMaXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5jdXJy
ZW50KCk7ICsraXQpCi0gICAgICAgIGlmICgqKGl0LmN1cnJlbnQoKSkgPT0gcmwpIHsKLSAgICAg
ICAgICAgIG1fd2luZG93RXZlbnRMaXN0ZW5lcnMucmVtb3ZlUmVmKGl0LmN1cnJlbnQoKSk7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudEltcGw6Omhh
c1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0g
ICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQobV93aW5kb3dF
dmVudExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkgewotCWlmIChp
dC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSkgewotCSAgICByZXR1cm4gdHJ1
ZTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1FdmVudExpc3RlbmVyICpE
b2N1bWVudEltcGw6OmNyZWF0ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IERPTVN0cmluZyYgY29k
ZSwgTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgaWYgKGZyYW1lKCkpIHsKLQlyZXR1cm4gZnJhbWUo
KS0+Y3JlYXRlSFRNTEV2ZW50TGlzdGVuZXIoY29kZSwgbm9kZSk7Ci0gICAgfSBlbHNlIHsKLQly
ZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRIVE1MV2luZG93
RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgQXR0cmlidXRlSW1w
bCogYXR0cikKLXsKLSAgICBzZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNy
ZWF0ZUhUTUxFdmVudExpc3RlbmVyKGF0dHItPnZhbHVlKCksIDApKTsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OmRpc3BhdGNoSW1hZ2VMb2FkRXZlbnRTb29uKEhUTUxJbWFnZUxvYWRlciAqaW1h
Z2UpCi17Ci0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoU29vbkxpc3QuYXBwZW5kKGltYWdl
KTsKLSAgICBpZiAoIW1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBtX2ltYWdlTG9h
ZEV2ZW50VGltZXIgPSBzdGFydFRpbWVyKDApOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnJlbW92ZUltYWdlKEhUTUxJbWFnZUxvYWRlciogaW1hZ2UpCi17Ci0gICAgLy8gUmVtb3Zl
IGluc3RhbmNlcyBvZiB0aGlzIGltYWdlIGZyb20gYm90aCBsaXN0cy4KLSAgICAvLyBVc2UgbG9v
cHMgYmVjYXVzZSB3ZSBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgdG8gZ2V0IGludG8gdGhlIGxp
c3RzLgotICAgIHdoaWxlIChtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hTb29uTGlzdC5yZW1vdmVS
ZWYoaW1hZ2UpKSB7IH0KLSAgICB3aGlsZSAobV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlz
dC5yZW1vdmVSZWYoaW1hZ2UpKSB7IH0KLSAgICBpZiAobV9pbWFnZUxvYWRFdmVudERpc3BhdGNo
U29vbkxpc3QuaXNFbXB0eSgpICYmIG1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBr
aWxsVGltZXIobV9pbWFnZUxvYWRFdmVudFRpbWVyKTsKLSAgICAgICAgbV9pbWFnZUxvYWRFdmVu
dFRpbWVyID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpkaXNwYXRjaEltYWdl
TG9hZEV2ZW50c05vdygpCi17Ci0gICAgLy8gbmVlZCB0byBhdm9pZCByZS1lbnRlcmluZyB0aGlz
IGZ1bmN0aW9uOyBpZiBuZXcgZGlzcGF0Y2hlcyBhcmUKLSAgICAvLyBzY2hlZHVsZWQgYmVmb3Jl
IHRoZSBwYXJlbnQgZmluaXNoZXMgcHJvY2Vzc2luZyB0aGUgbGlzdCwgdGhleQotICAgIC8vIHdp
bGwgc2V0IGEgdGltZXIgYW5kIGV2ZW50dWFsbHkgYmUgcHJvY2Vzc2VkCi0gICAgaWYgKCFtX2lt
YWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47
Ci0gICAgfQotCi0gICAgaWYgKG1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBraWxs
VGltZXIobV9pbWFnZUxvYWRFdmVudFRpbWVyKTsKLSAgICAgICAgbV9pbWFnZUxvYWRFdmVudFRp
bWVyID0gMDsKLSAgICB9Ci0gICAgCi0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlz
dCA9IG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25MaXN0OwotICAgIG1faW1hZ2VMb2FkRXZl
bnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7Ci0gICAgZm9yIChRUHRyTGlzdEl0ZXJhdG9yPEhU
TUxJbWFnZUxvYWRlcj4gaXQobV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdCk7IGl0LmN1
cnJlbnQoKTsgKSB7Ci0gICAgICAgIEhUTUxJbWFnZUxvYWRlciogaW1hZ2UgPSBpdC5jdXJyZW50
KCk7Ci0gICAgICAgIC8vIE11c3QgYWR2YW5jZSBpdGVyYXRvciAqYmVmb3JlKiBkaXNwYXRjaGlu
ZyBjYWxsLgotICAgICAgICAvLyBPdGhlcndpc2UsIGl0IG1pZ2h0IGJlIGFkdmFuY2VkIGF1dG9t
YXRpY2FsbHkgaWYgZGlzcGF0Y2hpbmcgdGhlIGNhbGwgaGFkIGEgc2lkZSBlZmZlY3QKLSAgICAg
ICAgLy8gb2YgZGVzdHJveWluZyB0aGUgY3VycmVudCBIVE1MSW1hZ2VMb2FkZXIsIGFuZCB0aGVu
IHdlIHdvdWxkIGFkdmFuY2UgcGFzdCB0aGUgKm5leHQqIGl0ZW0sCi0gICAgICAgIC8vIG1pc3Np
bmcgb25lIGFsdG9nZXRoZXIuCi0gICAgICAgICsraXQ7Ci0gICAgICAgIGltYWdlLT5kaXNwYXRj
aExvYWRFdmVudCgpOwotICAgIH0KLSAgICBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0
LmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp0aW1lckV2ZW50KFFUaW1lckV2ZW50
ICopCi17Ci0gICAgZGlzcGF0Y2hJbWFnZUxvYWRFdmVudHNOb3coKTsKLX0KLQotRWxlbWVudElt
cGwgKkRvY3VtZW50SW1wbDo6b3duZXJFbGVtZW50KCkKLXsKLSAgICBLSFRNTFZpZXcgKmNoaWxk
VmlldyA9IHZpZXcoKTsKLSAgICBpZiAoIWNoaWxkVmlldykKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgRnJhbWUgKmNoaWxkUGFydCA9IGNoaWxkVmlldy0+ZnJhbWUoKTsKLSAgICBpZiAoIWNoaWxk
UGFydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUgKnBhcmVudCA9IGNoaWxkUGFydC0+
cGFyZW50RnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
Q2hpbGRGcmFtZSAqY2hpbGRGcmFtZSA9IHBhcmVudC0+Y2hpbGRGcmFtZShjaGlsZFBhcnQpOwot
ICAgIGlmICghY2hpbGRGcmFtZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVyUGFydCAq
cmVuZGVyUGFydCA9IGNoaWxkRnJhbWUtPm1fcmVuZGVyZXI7Ci0gICAgaWYgKCFyZW5kZXJQYXJ0
KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwg
Kj4ocmVuZGVyUGFydC0+ZWxlbWVudCgpKTsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6
cmVmZXJyZXIoKSBjb25zdAotewotICAgIGlmICggZnJhbWUoKSApCi0gICAgICAgIHJldHVybiBN
YWMoZnJhbWUoKSktPmluY29taW5nUmVmZXJyZXIoKTsKLSAgICAKLSAgICByZXR1cm4gRE9NU3Ry
aW5nKCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OmRvbWFpbigpIGNvbnN0Ci17Ci0g
ICAgaWYgKCBtX2RvbWFpbi5pc0VtcHR5KCkgKSAvLyBub3Qgc2V0IHlldCAod2Ugc2V0IGl0IG9u
IGRlbWFuZCB0byBzYXZlIHRpbWUgYW5kIHNwYWNlKQotICAgICAgICBtX2RvbWFpbiA9IEtVUkwo
VVJMKCkpLmhvc3QoKTsgLy8gSW5pdGlhbGx5IHNldCB0byB0aGUgaG9zdAotICAgIHJldHVybiBt
X2RvbWFpbjsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldERvbWFpbihjb25zdCBET01TdHJp
bmcgJm5ld0RvbWFpbiwgYm9vbCBmb3JjZSAvKj1mYWxzZSovKQotewotICAgIGlmICggZm9yY2Ug
KSB7Ci0gICAgICAgIG1fZG9tYWluID0gbmV3RG9tYWluOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotICAgIGlmICggbV9kb21haW4uaXNFbXB0eSgpICkgLy8gbm90IHNldCB5ZXQgKHdlIHNldCBp
dCBvbiBkZW1hbmQgdG8gc2F2ZSB0aW1lIGFuZCBzcGFjZSkKLSAgICAgICAgbV9kb21haW4gPSBL
VVJMKFVSTCgpKS5ob3N0KCk7IC8vIEluaXRpYWxseSBzZXQgdG8gdGhlIGhvc3QKLQotICAgIC8v
IEJvdGggTlMgYW5kIElFIHNwZWNpZnkgdGhhdCBjaGFuZ2luZyB0aGUgZG9tYWluIGlzIG9ubHkg
YWxsb3dlZCB3aGVuCi0gICAgLy8gdGhlIG5ldyBkb21haW4gaXMgYSBzdWZmaXggb2YgdGhlIG9s
ZCBkb21haW4uCi0gICAgaW50IG9sZExlbmd0aCA9IG1fZG9tYWluLmxlbmd0aCgpOwotICAgIGlu
dCBuZXdMZW5ndGggPSBuZXdEb21haW4ubGVuZ3RoKCk7Ci0gICAgaWYgKCBuZXdMZW5ndGggPCBv
bGRMZW5ndGggKSAvLyBlLmcuIG5ld0RvbWFpbj1rZGUub3JnICg3KSBhbmQgbV9kb21haW49d3d3
LmtkZS5vcmcgKDExKQotICAgIHsKLSAgICAgICAgRE9NU3RyaW5nIHRlc3QgPSBtX2RvbWFpbi5j
b3B5KCk7Ci0gICAgICAgIGlmICggdGVzdFtvbGRMZW5ndGggLSBuZXdMZW5ndGggLSAxXSA9PSAn
LicgKSAvLyBDaGVjayB0aGF0IGl0J3MgYSBzdWJkb21haW4sIG5vdCBlLmcuICJkZS5vcmciCi0g
ICAgICAgIHsKLSAgICAgICAgICAgIHRlc3QucmVtb3ZlKCAwLCBvbGRMZW5ndGggLSBuZXdMZW5n
dGggKTsgLy8gbm93IHRlc3QgaXMgImtkZS5vcmciIGZyb20gbV9kb21haW4KLSAgICAgICAgICAg
IGlmICggdGVzdCA9PSBuZXdEb21haW4gKSAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIGNoZWNr
IHRoYXQgaXQncyB0aGUgc2FtZSB0aGluZyBhcyBuZXdEb21haW4KLSAgICAgICAgICAgICAgICBt
X2RvbWFpbiA9IG5ld0RvbWFpbjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBEb2N1bWVu
dEltcGw6OmlzVmFsaWROYW1lKGNvbnN0IERPTVN0cmluZyAmbmFtZSkKLXsKLSAgICBjb25zdCBV
Q2hhciAqcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIgKj4obmFtZS51bmljb2RlKCkp
OwotICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0KLSAgICBpZiAobGVuZ3Ro
ID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHVuc2lnbmVkIGkgPSAwOwotCi0g
ICAgVUNoYXIzMiBjOwotICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwgYykKLSAgICBpZiAoIWlz
VmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHdoaWxlIChp
IDwgbGVuZ3RoKSB7Ci0gICAgICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwgYykKLSAgICAgICAg
aWYgKCFpc1ZhbGlkTmFtZVBhcnQoYykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
fQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpwYXJzZVF1YWxp
ZmllZE5hbWUoY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBET01TdHJpbmcgJnByZWZp
eCwgRE9NU3RyaW5nICZsb2NhbE5hbWUpCi17Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gcXVhbGlm
aWVkTmFtZS5sZW5ndGgoKTsKLQotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgcmV0dXJu
IGZhbHNlOwotCi0gICAgYm9vbCBuYW1lU3RhcnQgPSB0cnVlOwotICAgIGJvb2wgc2F3Q29sb24g
PSBmYWxzZTsKLSAgICBpbnQgY29sb25Qb3MgPSAwOwotCi0gICAgY29uc3QgUUNoYXIgKnMgPSBx
dWFsaWZpZWROYW1lLnVuaWNvZGUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
Z3RoOyApIHsKLSAgICAgICAgVUNoYXIzMiBjOwotICAgICAgICBVMTZfTkVYVChzLCBpLCBsZW5n
dGgsIGMpCi0gICAgICAgIGlmIChjID09ICc6JykgewotICAgICAgICAgICAgaWYgKHNhd0NvbG9u
KQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbXVsdGlwbGUgY29sb25zOiBub3Qg
YWxsb3dlZAotICAgICAgICAgICAgbmFtZVN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHNhd0Nv
bG9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbG9uUG9zID0gaSAtIDE7Ci0gICAgICAgIH0gZWxz
ZSBpZiAobmFtZVN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lU3RhcnQoYykp
Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgbmFtZVN0YXJ0ID0g
ZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFy
dChjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBpZiAoIXNhd0NvbG9uKSB7Ci0gICAgICAgIHByZWZpeCA9IERPTVN0cmluZygpOwotICAg
ICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lLmNvcHkoKTsKLSAgICB9IGVsc2UgewotICAg
ICAgICBwcmVmaXggPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBjb2xvblBvcyk7Ci0gICAg
ICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSwgbGVu
Z3RoIC0gKGNvbG9uUG9zICsgMSkpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6YWRkSW1hZ2VNYXAoSFRNTE1hcEVsZW1lbnRJbXBsICppbWFnZU1h
cCkKLXsKLSAgICAvLyBBZGQgdGhlIGltYWdlIG1hcCwgdW5sZXNzIHRoZXJlJ3MgYWxyZWFkeSBh
bm90aGVyIHdpdGggdGhhdCBuYW1lLgotICAgIC8vICJGaXJzdCBtYXAgd2lucyIgaXMgdGhlIHJ1
bGUgb3RoZXIgYnJvd3NlcnMgc2VlbSB0byBpbXBsZW1lbnQuCi0gICAgUVN0cmluZyBuYW1lID0g
aW1hZ2VNYXAtPmdldE5hbWUoKS5xc3RyaW5nKCk7Ci0gICAgaWYgKCFtX2ltYWdlTWFwc0J5TmFt
ZS5jb250YWlucyhuYW1lKSkKLSAgICAgICAgbV9pbWFnZU1hcHNCeU5hbWUuaW5zZXJ0KG5hbWUs
IGltYWdlTWFwKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZUltYWdlTWFwKEhUTUxN
YXBFbGVtZW50SW1wbCAqaW1hZ2VNYXApCi17Ci0gICAgLy8gUmVtb3ZlIHRoZSBpbWFnZSBtYXAg
YnkgbmFtZS4KLSAgICAvLyBCdXQgZG9uJ3QgcmVtb3ZlIHNvbWUgb3RoZXIgaW1hZ2UgbWFwIHRo
YXQganVzdCBoYXBwZW5zIHRvIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSAgICBRU3RyaW5nIG5hbWUg
PSBpbWFnZU1hcC0+Z2V0TmFtZSgpLnFzdHJpbmcoKTsKLSAgICBRTWFwSXRlcmF0b3I8UVN0cmlu
ZywgSFRNTE1hcEVsZW1lbnRJbXBsICo+IGl0ID0gbV9pbWFnZU1hcHNCeU5hbWUuZmluZChuYW1l
KTsKLSAgICBpZiAoaXQgIT0gbV9pbWFnZU1hcHNCeU5hbWUuZW5kKCkgJiYgKml0ID09IGltYWdl
TWFwKQotICAgICAgICBtX2ltYWdlTWFwc0J5TmFtZS5yZW1vdmUoaXQpOwotfQotCi1IVE1MTWFw
RWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0SW1hZ2VNYXAoY29uc3QgRE9NU3RyaW5nICZV
UkwpIGNvbnN0Ci17Ci0gICAgaWYgKFVSTC5pc051bGwoKSkgewotICAgICAgICByZXR1cm4gMDsK
LSAgICB9Ci0KLSAgICBRU3RyaW5nIHMgPSBVUkwucXN0cmluZygpOwotICAgIGludCBoYXNoUG9z
ID0gcy5maW5kKCcjJyk7Ci0gICAgaWYgKGhhc2hQb3MgPj0gMCkKLSAgICAgICAgcyA9IHMubWlk
KGhhc2hQb3MgKyAxKTsKLQotICAgIFFNYXBDb25zdEl0ZXJhdG9yPFFTdHJpbmcsIEhUTUxNYXBF
bGVtZW50SW1wbCAqPiBpdCA9IG1faW1hZ2VNYXBzQnlOYW1lLmZpbmQocyk7Ci0gICAgaWYgKGl0
ID09IG1faW1hZ2VNYXBzQnlOYW1lLmVuZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1
cm4gKml0OwotfQotCi0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXREZWNvZGVyKERlY29kZXIgKmRl
Y29kZXIpCi17Ci0gICAgbV9kZWNvZGVyID0gZGVjb2RlcjsKLX0KLQotUVN0cmluZyBEb2N1bWVu
dEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IFFTdHJpbmcgJlVSTCkKLXsKLSAgICByZXR1cm4gS1VS
TChiYXNlVVJMKCksIFVSTCwgbV9kZWNvZGVyID8gbV9kZWNvZGVyLT5jb2RlYygpIDogMCkudXJs
KCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IERPTVN0
cmluZyAmVVJMKQotewotICAgIGlmIChVUkwuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBVUkw7
Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKFVSTC5xc3RyaW5nKCkpOwotfQotCi1ib29sIERvY3Vt
ZW50SW1wbDo6aW5QYWdlQ2FjaGUoKQotewotICAgIHJldHVybiBtX2luUGFnZUNhY2hlOwotfQot
Ci12b2lkIERvY3VtZW50SW1wbDo6c2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKQotewotICAgIGlm
IChtX2luUGFnZUNhY2hlID09IGZsYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5QYWdl
Q2FjaGUgPSBmbGFnOwotICAgIGlmIChmbGFnKSB7Ci0gICAgICAgIGFzc2VydChtX3NhdmVkUmVu
ZGVyZXIgPT0gMCk7Ci0gICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IG1fcmVuZGVyOwotICAgICAg
ICBpZiAobV92aWV3KSB7Ci0gICAgICAgICAgICBtX3ZpZXctPnJlc2V0U2Nyb2xsQmFycygpOwot
ICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0KG1fcmVuZGVyID09IDAgfHwg
bV9yZW5kZXIgPT0gbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgbV9yZW5kZXIgPSBtX3NhdmVk
UmVuZGVyZXI7Ci0gICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IDA7Ci0gICAgfQotfQotCi12b2lk
IERvY3VtZW50SW1wbDo6cGFzc3dvcmRGaWVsZEFkZGVkKCkKLXsKLSAgICBtX3Bhc3N3b3JkRmll
bGRzKys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpwYXNzd29yZEZpZWxkUmVtb3ZlZCgpCi17
Ci0gICAgYXNzZXJ0KG1fcGFzc3dvcmRGaWVsZHMgPiAwKTsKLSAgICBtX3Bhc3N3b3JkRmllbGRz
LS07Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpoYXNQYXNzd29yZEZpZWxkKCkgY29uc3QKLXsK
LSAgICByZXR1cm4gbV9wYXNzd29yZEZpZWxkcyA+IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBs
OjpzZWN1cmVGb3JtQWRkZWQoKQotewotICAgIG1fc2VjdXJlRm9ybXMrKzsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OnNlY3VyZUZvcm1SZW1vdmVkKCkKLXsKLSAgICBhc3NlcnQobV9zZWN1cmVG
b3JtcyA+IDApOwotICAgIG1fc2VjdXJlRm9ybXMtLTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6
Omhhc1NlY3VyZUZvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX3NlY3VyZUZvcm1zID4gMDsK
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYp
Ci17Ci0gICAgbV9jcmVhdGVSZW5kZXJlcnMgPSBmOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6
c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkKLXsKLSAgICByZXR1cm4gbV9jcmVhdGVSZW5kZXJlcnM7
Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBE
T01TdHJpbmcgcmVzdWx0OwotCi0gICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxk
KCk7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLQlyZXN1
bHQgKz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0K
LQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTdXBwb3J0IGZvciBKYXZhc2NyaXB0IGV4
ZWNDb21tYW5kLCBhbmQgcmVsYXRlZCBtZXRob2RzCi0KLUpTRWRpdG9yICpEb2N1bWVudEltcGw6
OmpzRWRpdG9yKCkKLXsKLSAgICBpZiAoIW1fanNFZGl0b3IpCi0gICAgICAgIG1fanNFZGl0b3Ig
PSBuZXcgSlNFZGl0b3IodGhpcyk7Ci0gICAgcmV0dXJuIG1fanNFZGl0b3I7Ci19Ci0KLWJvb2wg
RG9jdW1lbnRJbXBsOjpleGVjQ29tbWFuZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQsIGJvb2wg
dXNlckludGVyZmFjZSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICByZXR1cm4ganNF
ZGl0b3IoKS0+ZXhlY0NvbW1hbmQoY29tbWFuZCwgdXNlckludGVyZmFjZSwgdmFsdWUpOwotfQot
Ci1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlDb21tYW5kRW5hYmxlZChjb25zdCBET01TdHJpbmcg
JmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZEVuYWJsZWQo
Y29tbWFuZCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpxdWVyeUNvbW1hbmRJbmRldGVybShj
b25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5
Q29tbWFuZEluZGV0ZXJtKGNvbW1hbmQpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlD
b21tYW5kU3RhdGUoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0Vk
aXRvcigpLT5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKTsKLX0KLQotYm9vbCBEb2N1bWVudElt
cGw6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17Ci0g
ICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb21tYW5kKTsKLX0K
LQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6cXVlcnlDb21tYW5kVmFsdWUoY29uc3QgRE9NU3Ry
aW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0VkaXRvcigpLT5xdWVyeUNvbW1hbmRWYWx1
ZShjb21tYW5kKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIERvY3VtZW50
SW1wbDo6YWRkTWFya2VyKFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJU
eXBlIHR5cGUpCi17Ci0gICAgLy8gVXNlIGEgVGV4dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBwb3Rl
bnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUgcmFuZ2UgY292ZXJzLgotICAgIGZvciAoVGV4dEl0
ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAhbWFya2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRUZXh0
LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQdHI8UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBtYXJr
ZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGludCBleGNlcHRpb24gPSAwOwotICAgICAgICBEb2N1
bWVudE1hcmtlciBtYXJrZXIgPSB7dHlwZSwgdGV4dFBpZWNlLT5zdGFydE9mZnNldChleGNlcHRp
b24pLCB0ZXh0UGllY2UtPmVuZE9mZnNldChleGNlcHRpb24pfTsKLSAgICAgICAgYWRkTWFya2Vy
KHRleHRQaWVjZS0+c3RhcnRDb250YWluZXIoZXhjZXB0aW9uKSwgbWFya2VyKTsKLSAgICB9Ci19
Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVNYXJrZXJzKFJhbmdlSW1wbCAqcmFuZ2UsIERv
Y3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgLy8gVXNlIGEgVGV4
dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUgcmFu
Z2UgY292ZXJzLgotICAgIGZvciAoVGV4dEl0ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAhbWFy
a2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRUZXh0LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQdHI8
UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBtYXJrZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGludCBl
eGNlcHRpb24gPSAwOwotICAgICAgICB1bnNpZ25lZCBzdGFydE9mZnNldCA9IHRleHRQaWVjZS0+
c3RhcnRPZmZzZXQoZXhjZXB0aW9uKTsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dFBp
ZWNlLT5lbmRPZmZzZXQoZXhjZXB0aW9uKSAtIHN0YXJ0T2Zmc2V0ICsgMTsKLSAgICAgICAgcmVt
b3ZlTWFya2Vycyh0ZXh0UGllY2UtPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIHN0YXJ0T2Zm
c2V0LCBsZW5ndGgsIG1hcmtlclR5cGUpOwotICAgIH0KLX0KLQotLy8gTWFya2VycyBhcmUgc3Rv
cmVkIGluIG9yZGVyIHNvcnRlZCBieSB0aGVpciBsb2NhdGlvbi4gIFRoZXkgZG8gbm90IG92ZXJs
YXAgZWFjaCBvdGhlciwgYXMgY3VycmVudGx5Ci0vLyByZXF1aXJlZCBieSB0aGUgZHJhd2luZyBj
b2RlIGluIFJlbmRlclRleHQuY3BwLgotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkTWFya2VyKE5v
ZGVJbXBsICpub2RlLCBEb2N1bWVudE1hcmtlciBuZXdNYXJrZXIpIAotewotICAgIGFzc2VydChu
ZXdNYXJrZXIuZW5kT2Zmc2V0ID49IG5ld01hcmtlci5zdGFydE9mZnNldCk7Ci0gICAgaWYgKG5l
d01hcmtlci5lbmRPZmZzZXQgPT0gbmV3TWFya2VyLnN0YXJ0T2Zmc2V0KQotICAgICAgICByZXR1
cm47Ci0gICAgCi0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9t
YXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKSB7Ci0gICAgICAgIG1hcmtlcnMg
PSBuZXcgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+OwotICAgICAgICBtYXJrZXJzLT5hcHBl
bmQobmV3TWFya2VyKTsKLSAgICAgICAgbV9tYXJrZXJzLmluc2VydChub2RlLCBtYXJrZXJzKTsK
LSAgICB9IGVsc2UgewotICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+
IGl0OwotICAgICAgICBmb3IgKGl0ID0gbWFya2Vycy0+YmVnaW4oKTsgaXQgIT0gbWFya2Vycy0+
ZW5kKCk7ICkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0gKml0OwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBpZiAobmV3TWFya2VyLmVuZE9mZnNldCA8IG1hcmtlci5z
dGFydE9mZnNldCsxKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgbWFy
a2VyIHRoYXQgaXMgY29tcGxldGVseSBhZnRlciBuZXdNYXJrZXIsIGFuZCBkaXNqb2ludCBmcm9t
IGl0LgotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIG91ciBpbnNlcnRpb24gcG9pbnQuEAot
ICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdNYXJrZXIu
c3RhcnRPZmZzZXQgPiBtYXJrZXIuZW5kT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFr
ZXIgaXMgYmVmb3JlIG5ld01hcmtlciwgYW5kIGRpc2pvaW50IGZyb20gaXQuICBLZWVwIHNjYW5u
aW5nLgotICAgICAgICAgICAgICAgIGl0Kys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld01h
cmtlciA9PSBtYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhdmUgdGhpcyBv
bmUsIE5PUAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICAgICAgLy8gbWFya2VyIGFuZCBuZXdNYXJrZXIgaW50ZXJzZWN0IG9yIHRvdWNo
IC0gbWVyZ2UgdGhlbSBpbnRvIG5ld01hcmtlcgotICAgICAgICAgICAgICAgIG5ld01hcmtlci5z
dGFydE9mZnNldCA9IGtNaW4obmV3TWFya2VyLnN0YXJ0T2Zmc2V0LCBtYXJrZXIuc3RhcnRPZmZz
ZXQpOwotICAgICAgICAgICAgICAgIG5ld01hcmtlci5lbmRPZmZzZXQgPSBrTWF4KG5ld01hcmtl
ci5lbmRPZmZzZXQsIG1hcmtlci5lbmRPZmZzZXQpOwotICAgICAgICAgICAgICAgIC8vIHJlbW92
ZSBvbGQgb25lLCB3ZSdsbCBhZGQgbmV3TWFya2VyIGxhdGVyCi0gICAgICAgICAgICAgICAgaXQg
PSBtYXJrZXJzLT5yZW1vdmUoaXQpOwotICAgICAgICAgICAgICAgIC8vIGl0IHBvaW50cyB0byB0
aGUgbmV4dCBtYXJrZXIgdG8gY29uc2lkZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
ICAgICAvLyBhdCB0aGlzIHBvaW50IGl0IHBvaW50cyB0byB0aGUgbm9kZSBiZWZvcmUgd2hpY2gg
d2Ugd2FudCB0byBpbnNlcnQKLSAgICAgICAgbWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdNYXJrZXIp
OwotICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAgaWYg
KG5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsK
LX0KLQotLy8gY29waWVzIG1hcmtlcnMgZnJvbSBzcmNOb2RlIHRvIGRzdE5vZGUsIGFwcGx5aW5n
IHRoZSBzcGVjaWZpZWQgc2hpZnQgZGVsdGEgdG8gdGhlIGNvcGllcy4gIFRoZSBzaGlmdCBpcwot
Ly8gdXNlZnVsIGlmLCBlLmcuLCB0aGUgY2FsbGVyIGhhcyBjcmVhdGVkIHRoZSBkc3ROb2RlIGZy
b20gYSBub24tcHJlZml4IHN1YnN0cmluZyBvZiB0aGUgc3JjTm9kZS4KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpjb3B5TWFya2VycyhOb2RlSW1wbCAqc3JjTm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQs
IGludCBsZW5ndGgsIE5vZGVJbXBsICpkc3ROb2RlLCBpbnQgZGVsdGEsIERvY3VtZW50TWFya2Vy
OjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgaWYgKGxlbmd0aCA8PSAwKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJz
ID0gbV9tYXJrZXJzLmZpbmQoc3JjTm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBib29sIGRvY0RpcnR5ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgZW5kT2Zm
c2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGggLSAxOwotICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxE
b2N1bWVudE1hcmtlcj4gaXQ7Ci0gICAgZm9yIChpdCA9IG1hcmtlcnMtPmJlZ2luKCk7IGl0ICE9
IG1hcmtlcnMtPmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9
ICppdDsKLQotICAgICAgICAvLyBzdG9wIGlmIHdlIGFyZSBub3cgcGFzdCB0aGUgc3BlY2lmaWVk
IHJhbmdlCi0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0gICAg
ICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICAgIC8vIHNraXAgbWFya2VyIHRoYXQgaXMg
YmVmb3JlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb3IgaXMgdGhlIHdyb25nIHR5cGUKLSAgICAgICAg
aWYgKG1hcmtlci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0gbWFy
a2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkKLSAg
ICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIHBpbiB0aGUgbWFya2VyIHRvIHRoZSBz
cGVjaWZpZWQgcmFuZ2UgYW5kIGFwcGx5IHRoZSBzaGlmdCBkZWx0YQotICAgICAgICBkb2NEaXJ0
eSA9IHRydWU7Ci0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCkK
LSAgICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotICAgICAgICBp
ZiAobWFya2VyLmVuZE9mZnNldCA+IGVuZE9mZnNldCkKLSAgICAgICAgICAgIG1hcmtlci5lbmRP
ZmZzZXQgPSBlbmRPZmZzZXQ7Ci0gICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0YTsK
LSAgICAgICAgbWFya2VyLmVuZE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgCi0gICAgICAgIGFk
ZE1hcmtlcihkc3ROb2RlLCBtYXJrZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50IHRo
ZSBhZmZlY3RlZCBub2RlCi0gICAgaWYgKGRvY0RpcnR5ICYmIGRzdE5vZGUtPnJlbmRlcmVyKCkp
Ci0gICAgICAgIGRzdE5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnJlbW92ZU1hcmtlcnMoTm9kZUltcGwgKm5vZGUsIHVuc2lnbmVkIHN0YXJ0T2Zm
c2V0LCBpbnQgbGVuZ3RoLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlKQot
ewotICAgIGlmIChsZW5ndGggPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVZhbHVlTGlz
dCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAg
aWYgKCFtYXJrZXJzKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgYm9vbCBkb2NEaXJ0eSA9
IGZhbHNlOwotICAgIHVuc2lnbmVkIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoIC0g
MTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgIGZvciAo
aXQgPSBtYXJrZXJzLT5iZWdpbigpOyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKSB7Ci0gICAgICAg
IERvY3VtZW50TWFya2VyIG1hcmtlciA9ICppdDsKLQotICAgICAgICAvLyBtYXJrZXJzIGFyZSBy
ZXR1cm5lZCBpbiBvcmRlciwgc28gc3RvcCBpZiB3ZSBhcmUgbm93IHBhc3QgdGhlIHNwZWNpZmll
ZCByYW5nZQotICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KQotICAg
ICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICAvLyBza2lwIG1hcmtlciB0aGF0IGlz
IHdyb25nIHR5cGUgb3IgYmVmb3JlIHRhcmdldAotICAgICAgICBpZiAobWFya2VyLmVuZE9mZnNl
dCA8IHN0YXJ0T2Zmc2V0IHx8IChtYXJrZXIudHlwZSAhPSBtYXJrZXJUeXBlICYmIG1hcmtlclR5
cGUgIT0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpKSB7Ci0gICAgICAgICAgICBpdCsrOwot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdCB0aGlzIHBv
aW50IHdlIGtub3cgdGhhdCBtYXJrZXIgYW5kIHRhcmdldCBpbnRlcnNlY3QgaW4gc29tZSB3YXkK
LSAgICAgICAgZG9jRGlydHkgPSB0cnVlOwotCi0gICAgICAgIC8vIHBpdGNoIHRoZSBvbGQgbWFy
a2VyCi0gICAgICAgIGl0ID0gbWFya2Vycy0+cmVtb3ZlKGl0KTsKLSAgICAgICAgLy8gaXQgbm93
IHBvaW50cyB0byB0aGUgbmV4dCBub2RlCi0gICAgICAgIAotICAgICAgICAvLyBhZGQgZWl0aGVy
IG9mIHRoZSByZXN1bHRpbmcgc2xpY2VzIHRoYXQgYXJlIGxlZnQgYWZ0ZXIgcmVtb3ZpbmcgdGFy
Z2V0Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgYWRkcyB0byB0aGUgbGlzdCB3ZSBhcmUgaXRlcmF0
aW5nISAgVGhhdCBpcyBPSyByZWdhcmRsZXNzIG9mCi0gICAgICAgIC8vIHdoZXRoZXIgdGhlIGl0
ZXJhdG9yIHNlZXMgdGhlIG5ldyBub2RlLCBzaW5jZSB0aGUgbmV3IG5vZGUgaXMgYSBrZWVwZXIu
Ci0gICAgICAgIGlmIChzdGFydE9mZnNldCA+IG1hcmtlci5zdGFydE9mZnNldCkgewotICAgICAg
ICAgICAgRG9jdW1lbnRNYXJrZXIgbmV3TGVmdCA9IG1hcmtlcjsKLSAgICAgICAgICAgIG5ld0xl
ZnQuZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICBtYXJrZXJzLT5pbnNlcnQo
aXQsIG5ld0xlZnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0ID4g
ZW5kT2Zmc2V0KSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBuZXdSaWdodCA9IG1hcmtl
cjsKLSAgICAgICAgICAgIG5ld1JpZ2h0LnN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwotICAgICAg
ICAgICAgbWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdSaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0K
LSAgICBpZiAobWFya2Vycy0+aXNFbXB0eSgpKQotICAgICAgICBtX21hcmtlcnMucmVtb3ZlKG5v
ZGUpOwotCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAgIGlmIChkb2NEaXJ0
eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJlcigpLT5yZXBhaW50
KCk7Ci19Ci0KLVFWYWx1ZUxpc3Q8RG9jdW1lbnRNYXJrZXI+IERvY3VtZW50SW1wbDo6bWFya2Vy
c0Zvck5vZGUoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJr
ZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKG1hcmtlcnMpCi0g
ICAgICAgIHJldHVybiAqbWFya2VyczsKLSAgICByZXR1cm4gUVZhbHVlTGlzdCA8RG9jdW1lbnRN
YXJrZXI+ICgpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlTWFya2VycyhOb2RlSW1w
bCAqbm9kZSkKLXsKLSAgICBRVmFsdWVMaXN0PERvY3VtZW50TWFya2VyPiAqbWFya2VycyA9IG1f
bWFya2Vycy50YWtlKG5vZGUpOwotICAgIGlmIChtYXJrZXJzKSB7Ci0gICAgICAgIFJlbmRlck9i
amVjdCAqcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVyZXIp
Ci0gICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgICAgICBkZWxldGUgbWFya2Vy
czsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVNYXJrZXJzKERvY3VtZW50
TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgLy8gb3V0ZXIgbG9vcDogcHJv
Y2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4gdGhlIGRvY3VtZW50Ci0gICAgUVB0ckRpY3RJdGVy
YXRvcjwgUVZhbHVlTGlzdDxEb2N1bWVudE1hcmtlcj4gPiBkaWN0SXRlcmF0b3IobV9tYXJrZXJz
KTsKLSAgICBmb3IgKDsgTm9kZUltcGwgKm5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlSW1wbCAqPihk
aWN0SXRlcmF0b3IuY3VycmVudEtleSgpKTsgKSB7Ci0gICAgICAgIC8vIGlubmVyIGxvb3A6IHBy
b2Nlc3MgZWFjaCBtYXJrZXIgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICAgICBRVmFsdWVMaXN0
IDxEb2N1bWVudE1hcmtlcj4gKm1hcmtlcnMgPSBzdGF0aWNfY2FzdDxRVmFsdWVMaXN0IDxEb2N1
bWVudE1hcmtlcj4gKj4oZGljdEl0ZXJhdG9yLmN1cnJlbnQoKSk7Ci0gICAgICAgIFFWYWx1ZUxp
c3RJdGVyYXRvcjxEb2N1bWVudE1hcmtlcj4gbWFya2VySXRlcmF0b3I7Ci0gICAgICAgIGZvciAo
bWFya2VySXRlcmF0b3IgPSBtYXJrZXJzLT5iZWdpbigpOyBtYXJrZXJJdGVyYXRvciAhPSBtYXJr
ZXJzLT5lbmQoKTsgKSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSAqbWFy
a2VySXRlcmF0b3I7Ci0KLSAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgbm90IG9m
IHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlICE9IG1hcmtl
clR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2VycykgewotICAg
ICAgICAgICAgICAgICsrbWFya2VySXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBpdGNoIHRoZSBvbGQgbWFya2VyCi0g
ICAgICAgICAgICBtYXJrZXJJdGVyYXRvciA9IG1hcmtlcnMtPnJlbW92ZShtYXJrZXJJdGVyYXRv
cik7Ci0gICAgICAgICAgICAvLyBtYXJrZXJJdGVyYXRvciBub3cgcG9pbnRzIHRvIHRoZSBuZXh0
IG5vZGUKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gZGVsZXRlIHRoZSBub2RlJ3Mg
bGlzdCBpZiBpdCBpcyBub3cgZW1wdHkKLSAgICAgICAgaWYgKG1hcmtlcnMtPmlzRW1wdHkoKSkK
LSAgICAgICAgICAgIG1fbWFya2Vycy5yZW1vdmUobm9kZSk7Ci0gICAgICAgIAotICAgICAgICAv
LyBjYXVzZSB0aGUgbm9kZSB0byBiZSByZWRyYXduCi0gICAgICAgIFJlbmRlck9iamVjdCAqcmVu
ZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVyZXIpCi0gICAgICAg
ICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6
OnNoaWZ0TWFya2VycyhOb2RlSW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBk
ZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2VyVHlwZSkKLXsKLSAgICBRVmFs
dWVMaXN0IDxEb2N1bWVudE1hcmtlcj4gKm1hcmtlcnMgPSBtX21hcmtlcnMuZmluZChub2RlKTsK
LSAgICBpZiAoIW1hcmtlcnMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgZG9jRGlydHkg
PSBmYWxzZTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAg
IGZvciAoaXQgPSBtYXJrZXJzLT5iZWdpbigpOyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKytpdCkg
ewotICAgICAgICBEb2N1bWVudE1hcmtlciAmbWFya2VyID0gKml0OwotICAgICAgICBpZiAobWFy
a2VyLnN0YXJ0T2Zmc2V0ID49IHN0YXJ0T2Zmc2V0ICYmIChtYXJrZXJUeXBlID09IERvY3VtZW50
TWFya2VyOjpBbGxNYXJrZXJzIHx8IG1hcmtlci50eXBlID09IG1hcmtlclR5cGUpKSB7Ci0gICAg
ICAgICAgICBhc3NlcnQoKGludCltYXJrZXIuc3RhcnRPZmZzZXQgKyBkZWx0YSA+PSAwKTsKLSAg
ICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgICAgIG1hcmtl
ci5lbmRPZmZzZXQgKz0gZGVsdGE7Ci0gICAgICAgICAgICBkb2NEaXJ0eSA9IHRydWU7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAg
IGlmIChkb2NEaXJ0eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJl
cigpLT5yZXBhaW50KCk7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjphcHBseVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSkKLXsK
LSAgICBSZWZQdHI8WFNMVFByb2Nlc3NvckltcGw+IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vz
c29ySW1wbDsKLSAgICBwcm9jZXNzb3ItPnNldFhTTFN0eWxlc2hlZXQoc3RhdGljX2Nhc3Q8WFNM
U3R5bGVTaGVldEltcGwqPihwaS0+c2hlZXQoKSkpOwotICAgIAotICAgIFFTdHJpbmcgcmVzdWx0
TUlNRVR5cGU7Ci0gICAgUVN0cmluZyBuZXdTb3VyY2U7Ci0gICAgUVN0cmluZyByZXN1bHRFbmNv
ZGluZzsKLSAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0
TUlNRVR5cGUsIG5ld1NvdXJjZSwgcmVzdWx0RW5jb2RpbmcpKQotICAgICAgICByZXR1cm47Ci0g
ICAgLy8gRklYTUU6IElmIHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSBy
ZXBvcnQgYW4gZXJyb3IgKGxpa2UgTW96aWxsYSBkb2VzKS4KLSAgICBwcm9jZXNzb3ItPmNyZWF0
ZURvY3VtZW50RnJvbVNvdXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1F
VHlwZSwgdGhpcywgdmlldygpKTsKLX0KLQotI2VuZGlmCi0KLXZvaWQgRG9jdW1lbnRJbXBsOjpz
ZXREZXNpZ25Nb2RlKEluaGVyaXRlZEJvb2wgdmFsdWUpCi17Ci0gICAgbV9kZXNpZ25Nb2RlID0g
dmFsdWU7Ci19Ci0KLURvY3VtZW50SW1wbDo6SW5oZXJpdGVkQm9vbCBEb2N1bWVudEltcGw6Omdl
dERlc2lnbk1vZGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rlc2lnbk1vZGU7Ci19Ci0KLWJv
b2wgRG9jdW1lbnRJbXBsOjppbkRlc2lnbk1vZGUoKSBjb25zdAotewotICAgIGZvciAoY29uc3Qg
RG9jdW1lbnRJbXBsKiBkID0gdGhpczsgZDsgZCA9IGQtPnBhcmVudERvY3VtZW50KCkpIHsKLSAg
ICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBpbmhlcml0KQotICAgICAgICAgICAgcmV0dXJu
IGQtPm1fZGVzaWduTW9kZTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1E
b2N1bWVudEltcGwgKkRvY3VtZW50SW1wbDo6cGFyZW50RG9jdW1lbnQoKSBjb25zdAotewotICAg
IEZyYW1lICpjaGlsZFBhcnQgPSBmcmFtZSgpOwotICAgIGlmICghY2hpbGRQYXJ0KQotICAgICAg
ICByZXR1cm4gMDsKLSAgICBGcmFtZSAqcGFyZW50ID0gY2hpbGRQYXJ0LT5wYXJlbnRGcmFtZSgp
OwotICAgIGlmICghcGFyZW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcGFyZW50
LT54bWxEb2NJbXBsKCk7Ci19Ci0KLURvY3VtZW50SW1wbCAqRG9jdW1lbnRJbXBsOjp0b3BEb2N1
bWVudCgpIGNvbnN0Ci17Ci0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBjb25zdF9jYXN0PERvY3Vt
ZW50SW1wbCAqPih0aGlzKTsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudDsKLSAgICB3aGlsZSAo
KGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVudCgpKSAhPSAwKSB7Ci0gICAgICAgIGRvYyA9IGVs
ZW1lbnQtPmdldERvY3VtZW50KCk7Ci0gICAgICAgIGVsZW1lbnQgPSBkb2MgPyBkb2MtPm93bmVy
RWxlbWVudCgpIDogMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGRvYzsKLX0KLQotQXR0cklt
cGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQXR0cmlidXRlTlMoY29uc3QgRE9NU3RyaW5nICZuYW1l
c3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgaW50ICZleGNlcHRpb24p
Ci17Ci0gICAgaWYgKHF1YWxpZmllZE5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAgZXhjZXB0aW9u
ID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9
Ci0KLSAgICBET01TdHJpbmcgbG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZTsKLSAgICBET01TdHJp
bmcgcHJlZml4OwotICAgIGludCBjb2xvbnBvczsKLSAgICBpZiAoKGNvbG9ucG9zID0gcXVhbGlm
aWVkTmFtZS5maW5kKCc6JykpID49IDApIHsKLSAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFt
ZS5jb3B5KCk7Ci0gICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuY29weSgpOwotICAg
ICAgICBwcmVmaXgudHJ1bmNhdGUoY29sb25wb3MpOwotICAgICAgICBsb2NhbE5hbWUucmVtb3Zl
KDAsIGNvbG9ucG9zKzEpOwotICAgIH0KLQotICAgIGlmICghaXNWYWxpZE5hbWUobG9jYWxOYW1l
KSkgewotICAgICAgICBleGNlcHRpb24gPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFDVEVS
X0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8vIEZJWE1FOiBBc3N1
bWUgdGhpcyBpcyBhIG1hcHBlZCBhdHRyaWJ1dGUsIHNpbmNlIGNyZWF0ZUF0dHJpYnV0ZSBpc24n
dCBuYW1lc3BhY2UtYXdhcmUuICBUaGVyZSdzIG5vIGhhcm0gdG8gWE1MCi0gICAgLy8gZG9jdW1l
bnRzIGlmIHdlJ3JlIHdyb25nLgotICAgIHJldHVybiBuZXcgQXR0ckltcGwoMCwgdGhpcywgbmV3
IE1hcHBlZEF0dHJpYnV0ZUltcGwoUXVhbGlmaWVkTmFtZShwcmVmaXguaW1wbCgpLCAKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgbG9jYWxOYW1lLmltcGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJLmlt
cGwoKSksIERPTVN0cmluZygiIikuaW1wbCgpKSwgZmFsc2UpOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6cmFkaW9CdXR0b25DaGVja2VkKEhUTUxJbnB1dEVsZW1lbnRJbXBsICpjYWxsZXIsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17Ci0gICAgLy8gV2l0aG91dCBhIG5hbWUsIHRoZXJl
IGlzIG5vIGdyb3VwLgotICAgIGlmIChjYWxsZXItPm5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAg
IHJldHVybjsKLSAgICBpZiAoIWZvcm0pCi0gICAgICAgIGZvcm0gPSBkZWZhdWx0Rm9ybTsKLSAg
ICAvLyBVbmNoZWNrIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbQotICAgIGlmICghbV9zZWxl
Y3RlZFJhZGlvQnV0dG9ucykKLSAgICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9ucyA9IG5ldyBG
b3JtVG9Hcm91cE1hcDsKLSAgICBOYW1lVG9JbnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9IG1f
c2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdldChmb3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1dHRv
bnMpIHsKLSAgICAgICAgZm9ybVJhZGlvQnV0dG9ucyA9IG5ldyBOYW1lVG9JbnB1dE1hcDsKLSAg
ICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9ucy0+c2V0KGZvcm0sIGZvcm1SYWRpb0J1dHRvbnMp
OwotICAgIH0KLSAgICAKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3VycmVudENoZWNrZWRS
YWRpbyA9IGZvcm1SYWRpb0J1dHRvbnMtPmdldChjYWxsZXItPm5hbWUoKS5pbXBsKCkpOwotICAg
IGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvICYmIGN1cnJlbnRDaGVja2VkUmFkaW8gIT0gY2FsbGVy
KQotICAgICAgICBjdXJyZW50Q2hlY2tlZFJhZGlvLT5zZXRDaGVja2VkKGZhbHNlKTsKLQotICAg
IGZvcm1SYWRpb0J1dHRvbnMtPnNldChjYWxsZXItPm5hbWUoKS5pbXBsKCksIGNhbGxlcik7Ci19
Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsKiBEb2N1bWVudEltcGw6OmNoZWNrZWRSYWRpb0J1dHRv
bkZvckdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0p
Ci17Ci0gICAgaWYgKCFtX3NlbGVjdGVkUmFkaW9CdXR0b25zKQotICAgICAgICByZXR1cm4gMDsK
LSAgICBpZiAoIWZvcm0pCi0gICAgICAgIGZvcm0gPSBkZWZhdWx0Rm9ybTsKLSAgICBOYW1lVG9J
bnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdldChm
b3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1dHRvbnMpCi0gICAgICAgIHJldHVybiAwOwotICAg
IAotICAgIHJldHVybiBmb3JtUmFkaW9CdXR0b25zLT5nZXQobmFtZSk7Ci19Ci0KLXZvaWQgRG9j
dW1lbnRJbXBsOjpyZW1vdmVSYWRpb0J1dHRvbkdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhU
TUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17Ci0gICAgaWYgKCFmb3JtKQotICAgICAgICBmb3Jt
ID0gZGVmYXVsdEZvcm07Ci0gICAgaWYgKG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMpIHsKLSAgICAg
ICAgTmFtZVRvSW5wdXRNYXAqIGZvcm1SYWRpb0J1dHRvbnMgPSBtX3NlbGVjdGVkUmFkaW9CdXR0
b25zLT5nZXQoZm9ybSk7Ci0gICAgICAgIGlmIChmb3JtUmFkaW9CdXR0b25zKSB7Ci0gICAgICAg
ICAgICBmb3JtUmFkaW9CdXR0b25zLT5yZW1vdmUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoZm9y
bVJhZGlvQnV0dG9ucy0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbV9zZWxlY3RlZFJh
ZGlvQnV0dG9ucy0+cmVtb3ZlKGZvcm0pOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3JtUmFk
aW9CdXR0b25zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1SZWZQdHI8
SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmltYWdlcygpCi17Ci0gICAgcmV0dXJu
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywg
SFRNTENvbGxlY3Rpb25JbXBsOjpET0NfSU1BR0VTKSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+IERvY3VtZW50SW1wbDo6YXBwbGV0cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxI
VE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxl
Y3Rpb25JbXBsOjpET0NfQVBQTEVUUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBs
PiBEb2N1bWVudEltcGw6OmVtYmVkcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBs
OjpET0NfRU1CRURTKSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IERvY3VtZW50
SW1wbDo6b2JqZWN0cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+
KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfT0JK
RUNUUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6Omxp
bmtzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxD
b2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19MSU5LUykpOwotfQot
Ci1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmZvcm1zKCkKLXsKLSAg
ICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1w
bCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19GT1JNUykpOwotfQotCi1SZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmFuY2hvcnMoKQotewotICAgIHJldHVybiBS
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhU
TUxDb2xsZWN0aW9uSW1wbDo6RE9DX0FOQ0hPUlMpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0
aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjphbGwoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9u
SW1wbDo6RE9DX0FMTCkpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVu
dEltcGw6OndpbmRvd05hbWVkSXRlbXMoRE9NU3RyaW5nICZuYW1lKQotewotICAgIHJldHVybiBS
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTE5hbWVDb2xsZWN0aW9uSW1wbCh0aGlz
LCBIVE1MQ29sbGVjdGlvbkltcGw6OldJTkRPV19OQU1FRF9JVEVNUywgbmFtZSkpOwotfQotCi1S
ZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmRvY3VtZW50TmFtZWRJdGVt
cyhET01TdHJpbmcgJm5hbWUpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbklt
cGw+KG5ldyBIVE1MTmFtZUNvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6
RE9DVU1FTlRfTkFNRURfSVRFTVMsIG5hbWUpKTsKLX0KLQotUmVmUHRyPE5hbWVOb2RlTGlzdElt
cGw+IERvY3VtZW50SW1wbDo6Z2V0RWxlbWVudHNCeU5hbWUoY29uc3QgRE9NU3RyaW5nICZlbGVt
ZW50TmFtZSkKLXsKLSAgICByZXR1cm4gUmVmUHRyPE5hbWVOb2RlTGlzdEltcGw+KG5ldyBOYW1l
Tm9kZUxpc3RJbXBsKHRoaXMsIGVsZW1lbnROYW1lKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0KK25hbWVzcGFjZSBET00gewogCiBEb2N1bWVudEZyYWdtZW50SW1wbDo6RG9jdW1lbnRG
cmFnbWVudEltcGwoRG9jdW1lbnRJbXBsICpkb2MpIDogQ29udGFpbmVyTm9kZUltcGwoZG9jKQog
ewpAQCAtMzM1Myw3ICs2OSw2IEBAIERPTVN0cmluZyBEb2N1bWVudEZyYWdtZW50SW1wbDo6dG9T
dHJpbmcKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi0KIE5vZGVJbXBsICpEb2N1bWVudEZyYWdt
ZW50SW1wbDo6Y2xvbmVOb2RlIChib29sIGRlZXApCiB7CiAgICAgRG9jdW1lbnRGcmFnbWVudElt
cGwgKmNsb25lID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKGdldERvY3VtZW50KCkpOwpAQCAt
MzM2Miw2NCArNzcsNCBAQCBOb2RlSW1wbCAqRG9jdW1lbnRGcmFnbWVudEltcGw6OmNsb25lTm9k
CiAgICAgcmV0dXJuIGNsb25lOwogfQogCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9j
dW1lbnRUeXBlSW1wbDo6RG9jdW1lbnRUeXBlSW1wbChET01JbXBsZW1lbnRhdGlvbkltcGwgKmks
IERvY3VtZW50SW1wbCAqZG9jLCBjb25zdCBET01TdHJpbmcgJm4sIGNvbnN0IERPTVN0cmluZyAm
cCwgY29uc3QgRE9NU3RyaW5nICZzKQotICAgIDogTm9kZUltcGwoZG9jKSwgbV9pbXBsZW1lbnRh
dGlvbihpKSwgbV9uYW1lKG4pLCBtX3B1YmxpY0lkKHApLCBtX3N5c3RlbUlkKHMpCi17Ci19Ci0K
LURvY3VtZW50VHlwZUltcGw6OkRvY3VtZW50VHlwZUltcGwoRG9jdW1lbnRJbXBsICpkb2MsIGNv
bnN0IERPTVN0cmluZyAmbiwgY29uc3QgRE9NU3RyaW5nICZwLCBjb25zdCBET01TdHJpbmcgJnMp
Ci0gICAgOiBOb2RlSW1wbChkb2MpLCBtX25hbWUobiksIG1fcHVibGljSWQocCksIG1fc3lzdGVt
SWQocykKLXsKLX0KLQotRG9jdW1lbnRUeXBlSW1wbDo6RG9jdW1lbnRUeXBlSW1wbChEb2N1bWVu
dEltcGwgKmRvYywgY29uc3QgRG9jdW1lbnRUeXBlSW1wbCAmdCkKLSAgICA6IE5vZGVJbXBsKGRv
YyksIG1faW1wbGVtZW50YXRpb24odC5tX2ltcGxlbWVudGF0aW9uKQotICAgICwgbV9uYW1lKHQu
bV9uYW1lKSwgbV9wdWJsaWNJZCh0Lm1fcHVibGljSWQpLCBtX3N5c3RlbUlkKHQubV9zeXN0ZW1J
ZCksIG1fc3Vic2V0KHQubV9zdWJzZXQpCi17Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudFR5cGVJ
bXBsOjp0b1N0cmluZygpIGNvbnN0Ci17Ci0gICAgaWYgKG1fbmFtZS5pc0VtcHR5KCkpCi0gICAg
ICAgIHJldHVybiAiIjsKLQotICAgIERPTVN0cmluZyByZXN1bHQgPSAiPCFET0NUWVBFICI7Ci0g
ICAgcmVzdWx0ICs9IG1fbmFtZTsKLSAgICBpZiAoIW1fcHVibGljSWQuaXNFbXB0eSgpKSB7Ci0J
cmVzdWx0ICs9ICIgUFVCTElDIFwiIjsKLQlyZXN1bHQgKz0gbV9wdWJsaWNJZDsKLQlyZXN1bHQg
Kz0gIlwiIFwiIjsKLQlyZXN1bHQgKz0gbV9zeXN0ZW1JZDsKLQlyZXN1bHQgKz0gIlwiIjsKLSAg
ICB9IGVsc2UgaWYgKCFtX3N5c3RlbUlkLmlzRW1wdHkoKSkgewotCXJlc3VsdCArPSAiIFNZU1RF
TSBcIiI7Ci0JcmVzdWx0ICs9IG1fc3lzdGVtSWQ7Ci0JcmVzdWx0ICs9ICJcIiI7Ci0gICAgfQot
ICAgIGlmICghbV9zdWJzZXQuaXNFbXB0eSgpKSB7Ci0JcmVzdWx0ICs9ICIgWyI7Ci0JcmVzdWx0
ICs9IG1fc3Vic2V0OwotCXJlc3VsdCArPSAiXSI7Ci0gICAgfQotICAgIHJlc3VsdCArPSAiPiI7
Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50VHlwZUltcGw6Om5v
ZGVOYW1lKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbmFtZSgpOwotfQotCi11bnNpZ25lZCBzaG9y
dCBEb2N1bWVudFR5cGVJbXBsOjpub2RlVHlwZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIE5vZGU6
OkRPQ1VNRU5UX1RZUEVfTk9ERTsKLX0KLQotTm9kZUltcGwgKkRvY3VtZW50VHlwZUltcGw6OmNs
b25lTm9kZShib29sIC8qZGVlcCovKQotewotICAgIC8vIFRoZSBET00gTGV2ZWwgMiBzcGVjaWZp
Y2F0aW9uIHNheXMgY2xvbmluZyBEb2N1bWVudFR5cGUgbm9kZXMgaXMgImltcGxlbWVudGF0aW9u
IGRlcGVuZGVudCIgc28gZm9yIG5vdyB3ZSBkbyBub3Qgc3VwcG9ydCBpdC4KLSAgICByZXR1cm4g
MDsKLX0KK307CkluZGV4OiBraHRtbC94bWwvZG9tX2RvY2ltcGwuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC94bWwvZG9tX2RvY2ltcGwuaAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC94bWwvZG9t
X2RvY2ltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMSw4NjAgKzAsMCBAQAotLyoKLSAqIFRoaXMg
ZmlsZSBpcyBwYXJ0IG9mIHRoZSBET00gaW1wbGVtZW50YXRpb24gZm9yIEtERS4KLSAqCi0gKiBD
b3B5cmlnaHQgKEMpIDE5OTkgTGFycyBLbm9sbCAoa25vbGxAa2RlLm9yZykKLSAqICAgICAgICAg
ICAoQykgMTk5OSBBbnR0aSBLb2l2aXN0byAoa29pdmlzdG9Aa2RlLm9yZykKLSAqICAgICAgICAg
ICAoQykgMjAwMSBEaXJrIE11ZWxsZXIgKG11ZWxsZXJAa2RlLm9yZykKLSAqIENvcHlyaWdodCAo
QykgMjAwNCBBcHBsZSBDb21wdXRlciwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
LSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEg
MDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotI2lmbmRlZiBfRE9NX0RvY3VtZW50SW1wbF9oXwot
I2RlZmluZSBfRE9NX0RvY3VtZW50SW1wbF9oXwotCi0jaW5jbHVkZSAieG1sL2RvbV9lbGVtZW50
aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX3RyYXZlcnNhbGltcGwuaCIKLSNpbmNsdWRlICJt
aXNjL3NoYXJlZC5oIgotCi0jaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxcHRy
bGlzdC5oPgotI2luY2x1ZGUgPHFvYmplY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1
ZGUgPHFwdHJkaWN0Lmg+Ci0jaW5jbHVkZSA8cW1hcC5oPgotI2luY2x1ZGUgPHFkYXRldGltZS5o
PgotCi0jaW5jbHVkZSA8a3VybC5oPgotCi0jaW5jbHVkZSAiS1dRU2lnbmFsLmgiCi0jaW5jbHVk
ZSAiZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8a3htbGNvcmUvSGFzaE1hcC5oPgotCi1jbGFzcyBR
UGFpbnREZXZpY2U7Ci1jbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwotY2xhc3MgS0hUTUxWaWV3
OwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBSZW5kZXJBcmVuYTsKLQotY2xhc3MgS1dRQWNjT2JqZWN0
Q2FjaGU7Ci0KLW5hbWVzcGFjZSBraHRtbCB7Ci0gICAgY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsK
LSAgICBzdHJ1Y3QgRGFzaGJvYXJkUmVnaW9uVmFsdWU7Ci0gICAgY2xhc3MgRG9jTG9hZGVyOwot
ICAgIGNsYXNzIFJlbmRlckltYWdlOwotICAgIGNsYXNzIFRva2VuaXplcjsKLSAgICBjbGFzcyBY
TUxIYW5kbGVyOwotfQotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotbmFtZXNwYWNlIFhCTCB7Ci0g
ICAgY2xhc3MgWEJMQmluZGluZ01hbmFnZXI7Ci19Ci0jZW5kaWYKLQotbmFtZXNwYWNlIERPTSB7
Ci0gICAgY2xhc3MgQWJzdHJhY3RWaWV3SW1wbDsKLSAgICBjbGFzcyBBdHRySW1wbDsKLSAgICBj
bGFzcyBDREFUQVNlY3Rpb25JbXBsOwotICAgIGNsYXNzIENTU1N0eWxlU2hlZXRJbXBsOwotICAg
IGNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLSAgICBjbGFzcyBDb21t
ZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1bWVudEZyYWdtZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1
bWVudEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRUeXBlOwotICAgIGNsYXNzIERvY3VtZW50VHlw
ZUltcGw7Ci0gICAgY2xhc3MgRWRpdGluZ1RleHRJbXBsOwotICAgIGNsYXNzIEVsZW1lbnRJbXBs
OwotICAgIGNsYXNzIEVudGl0eVJlZmVyZW5jZUltcGw7Ci0gICAgY2xhc3MgRXZlbnRJbXBsOwot
ICAgIGNsYXNzIEV2ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgR2VuZXJpY1JPTmFtZWROb2RlTWFw
SW1wbDsKLSAgICBjbGFzcyBIVE1MQ29sbGVjdGlvbkltcGw7Ci0gICAgY2xhc3MgSFRNTERvY3Vt
ZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MRWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSFRNTEZvcm1F
bGVtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci0gICAgY2xhc3MgSFRNTElu
cHV0RWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSFRNTE1hcEVsZW1lbnRJbXBsOwotICAgIGNsYXNz
IEpTRWRpdG9yOwotICAgIGNsYXNzIE5vZGVGaWx0ZXI7Ci0gICAgY2xhc3MgTm9kZUZpbHRlcklt
cGw7Ci0gICAgY2xhc3MgTm9kZUl0ZXJhdG9ySW1wbDsKLSAgICBjbGFzcyBOb2RlTGlzdEltcGw7
Ci0gICAgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDsKLSAgICBjbGFzcyBSYW5nZUlt
cGw7Ci0gICAgY2xhc3MgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgU3R5bGVT
aGVldEltcGw7Ci0gICAgY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsOwotICAgIGNsYXNzIFRleHRJ
bXBsOwotICAgIGNsYXNzIFRyZWVXYWxrZXJJbXBsOwotCi0gICAgLy8gQSByYW5nZSBvZiBhIG5v
ZGUgd2l0aGluIGEgZG9jdW1lbnQgdGhhdCBpcyAibWFya2VkIiwgc3VjaCBhcyBiZWluZyBtaXNz
cGVsbGVkCi0gICAgc3RydWN0IERvY3VtZW50TWFya2VyCi0gICAgewotICAgICAgICBlbnVtIE1h
cmtlclR5cGUgewotICAgICAgICAgICAgQWxsTWFya2VycyA9IC0xLAotICAgICAgICAgICAgU3Bl
bGxpbmcgPSAwCi0gICAgICAgICAgICAvLyBOb3QgZG9pbmcgZ3JhbW1hciB5ZXQsIGJ1dCB0aGlz
IGlzIGEgcGxhY2Vob2xkZXIgZm9yIGl0Ci0gICAgICAgICAgICAvLyBHcmFtbWFyCi0gICAgICAg
IH07Ci0gICAgICAgIAotICAgICAgICBlbnVtIE1hcmtlclR5cGUgdHlwZTsKLSAgICAgICAgdW5z
aWduZWQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLSAgICAgICAgCi0gICAgICAgIGJvb2wgb3Bl
cmF0b3IgPT0gKGNvbnN0IERvY3VtZW50TWFya2VyICZvKSBjb25zdCB7Ci0gICAgICAgICAgICBy
ZXR1cm4gdHlwZSA9PSBvLnR5cGUgJiYgc3RhcnRPZmZzZXQgPT0gby5zdGFydE9mZnNldCAmJiBl
bmRPZmZzZXQgPT0gby5lbmRPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBvcGVyYXRv
ciAhPSAoY29uc3QgRG9jdW1lbnRNYXJrZXIgJm8pIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVy
biAhKCp0aGlzID09IG8pOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLWNsYXNzIERPTUltcGxl
bWVudGF0aW9uSW1wbCA6IHB1YmxpYyBraHRtbDo6U2hhcmVkPERPTUltcGxlbWVudGF0aW9uSW1w
bD4KLXsKLXB1YmxpYzoKLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwoKTsKLSAgICB+RE9NSW1w
bGVtZW50YXRpb25JbXBsKCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9y
IERPTUltcGxlbWVudGF0aW9uCi0gICAgYm9vbCBoYXNGZWF0dXJlKGNvbnN0IERPTVN0cmluZyYg
ZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nJiB2ZXJzaW9uKSBjb25zdDsKLSAgICBEb2N1bWVudFR5
cGVJbXBsICpjcmVhdGVEb2N1bWVudFR5cGUoIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFt
ZSwgY29uc3QgRE9NU3RyaW5nICZwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQsIGludCAmZXhjZXB0aW9u
Y29kZSApOwotICAgIERvY3VtZW50SW1wbCAqY3JlYXRlRG9jdW1lbnQoIGNvbnN0IERPTVN0cmlu
ZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxpZmllZE5hbWUsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlSW1wbCAqZG9jdHlwZSwgaW50
ICZleGNlcHRpb25jb2RlICk7Ci0KLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwqIGdldEludGVy
ZmFjZShjb25zdCBET01TdHJpbmcmIGZlYXR1cmUpIGNvbnN0OwotCi0gICAgLy8gRnJvbSB0aGUg
RE9NSW1wbGVtZW50YXRpb25DU1MgaW50ZXJmYWNlCi0gICAgQ1NTU3R5bGVTaGVldEltcGwgKmNy
ZWF0ZUNTU1N0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICZ0aXRsZSwgY29uc3QgRE9NU3RyaW5n
ICZtZWRpYSwgaW50ICZleGNlcHRpb25jb2RlKTsKLQotICAgIC8vIEZyb20gdGhlIEhUTUxET01J
bXBsZW1lbnRhdGlvbiBpbnRlcmZhY2UKLSAgICBIVE1MRG9jdW1lbnRJbXBsKiBjcmVhdGVIVE1M
RG9jdW1lbnQoIGNvbnN0IERPTVN0cmluZyYgdGl0bGUpOwotCi0gICAgLy8gT3RoZXIgbWV0aG9k
cyAobm90IHBhcnQgb2YgRE9NKQotICAgIERvY3VtZW50SW1wbCAqY3JlYXRlRG9jdW1lbnQoIEtI
VE1MVmlldyAqdiA9IDAgKTsKLSAgICBIVE1MRG9jdW1lbnRJbXBsICpjcmVhdGVIVE1MRG9jdW1l
bnQoIEtIVE1MVmlldyAqdiA9IDAgKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHN0YXRpYyBpbnN0
YW5jZSBvZiB0aGlzIGNsYXNzIC0gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzaG91
bGQKLSAgICAvLyBldmVyIGJlIHByZXNlbnQsIGFuZCBpcyB1c2VkIGFzIGEgZmFjdG9yeSBtZXRo
b2QgZm9yIGNyZWF0aW5nIERvY3VtZW50SW1wbCBvYmplY3RzCi0gICAgc3RhdGljIERPTUltcGxl
bWVudGF0aW9uSW1wbCAqaW5zdGFuY2UoKTsKLSAgICAKLSAgICBzdGF0aWMgYm9vbCBpc1hNTE1J
TUVUeXBlKGNvbnN0IERPTVN0cmluZyYgbWltZVR5cGUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3Rh
dGljIERPTUltcGxlbWVudGF0aW9uSW1wbCAqbV9pbnN0YW5jZTsKLX07Ci0KLQotLyoqCi0gKiBA
aW50ZXJuYWwKLSAqLwotY2xhc3MgRG9jdW1lbnRJbXBsIDogcHVibGljIFFPYmplY3QsIHB1Ymxp
YyBDb250YWluZXJOb2RlSW1wbAotewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgRG9jdW1l
bnRJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqX2ltcGxlbWVudGF0aW9uLCBLSFRNTFZpZXcg
KnYpOwotICAgIH5Eb2N1bWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkTGFz
dFJlZigpOwotCi0gICAgLy8gTm9kZXMgYmVsb25naW5nIHRvIHRoaXMgZG9jdW1lbnQgaG9sZCAi
c2VsZi1vbmx5IiByZWZlcmVuY2VzIC0KLSAgICAvLyB0aGVzZSBhcmUgZW5vdWdoIHRvIGtlZXAg
dGhlIGRvY3VtZW50IGZyb20gYmVpbmcgZGVzdHJveWVkLCBidXQKLSAgICAvLyBub3QgZW5vdWdo
IHRvIGtlZXAgaXQgZnJvbSByZW1vdmluZyBpdHMgY2hpbGRyZW4uIFRoaXMgYWxsb3dzIGEKLSAg
ICAvLyBub2RlIHRoYXQgb3V0bGl2ZXMgaXRzIGRvY3VtZW50IHRvIHN0aWxsIGhhdmUgYSB2YWxp
ZCBkb2N1bWVudAotICAgIC8vIHBvaW50ZXIgd2l0aG91dCBpbnRyb2R1Y2luZyByZWZlcmVuY2Ug
Y3ljbGVzCi0KLSAgICB2b2lkIHNlbGZPbmx5UmVmKCkgeyArK21fc2VsZk9ubHlSZWZDb3VudDsg
fQotICAgIHZvaWQgc2VsZk9ubHlEZXJlZigpIHsKLSAgICAgICAgLS1tX3NlbGZPbmx5UmVmQ291
bnQ7Ci0gICAgICAgIGlmICghbV9zZWxmT25seVJlZkNvdW50ICYmICFyZWZDb3VudCgpKQotICAg
ICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRy
aWJ1dGVzIGZvciBEb2N1bWVudAotCi0gICAgdmlydHVhbCBEb2N1bWVudFR5cGVJbXBsICpkb2N0
eXBlKCkgY29uc3Q7IC8vIHJldHVybnMgMCBmb3IgSFRNTCBkb2N1bWVudHMKLSAgICBEb2N1bWVu
dFR5cGVJbXBsICpyZWFsRG9jVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZG9jVHlwZS5nZXQoKTsg
fQotCi0gICAgRE9NSW1wbGVtZW50YXRpb25JbXBsICppbXBsZW1lbnRhdGlvbigpIGNvbnN0Owot
ICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmRvY3VtZW50RWxlbWVudCgpIGNvbnN0OwotICAgIHZp
cnR1YWwgRWxlbWVudEltcGwgKmNyZWF0ZUVsZW1lbnQoY29uc3QgRE9NU3RyaW5nICZ0YWdOYW1l
LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIERvY3VtZW50RnJhZ21lbnRJbXBsICpjcmVhdGVE
b2N1bWVudEZyYWdtZW50ICgpOwotICAgIFRleHRJbXBsICpjcmVhdGVUZXh0Tm9kZSAoIGNvbnN0
IERPTVN0cmluZyAmZGF0YSApOwotICAgIENvbW1lbnRJbXBsICpjcmVhdGVDb21tZW50ICggY29u
c3QgRE9NU3RyaW5nICZkYXRhICk7Ci0gICAgQ0RBVEFTZWN0aW9uSW1wbCAqY3JlYXRlQ0RBVEFT
ZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24pOwotICAgIFByb2Nl
c3NpbmdJbnN0cnVjdGlvbkltcGwgKmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjb25zdCBE
T01TdHJpbmcgJnRhcmdldCwgY29uc3QgRE9NU3RyaW5nICZkYXRhLCBpbnQgJmV4Y2VwdGlvbik7
Ci0gICAgQXR0ckltcGwgKmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBET01TdHJpbmcgJm5hbWUsIGlu
dCAmZXhjZXB0aW9uKSB7IHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhET01TdHJpbmcoKSwgbmFt
ZSwgZXhjZXB0aW9uKTsgfQotICAgIEF0dHJJbXBsICpjcmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBE
T01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBp
bnQgJmV4Y2VwdGlvbik7Ci0gICAgRW50aXR5UmVmZXJlbmNlSW1wbCAqY3JlYXRlRW50aXR5UmVm
ZXJlbmNlKGNvbnN0IERPTVN0cmluZyAmbmFtZSwgaW50ICZleGNlcHRpb25Db2RlKTsKLSAgICBO
b2RlSW1wbCAqaW1wb3J0Tm9kZSggTm9kZUltcGwgKmltcG9ydGVkTm9kZSwgYm9vbCBkZWVwLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIEVsZW1lbnRJbXBsICpjcmVhdGVFbGVt
ZW50TlMoY29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJl9x
dWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIEVsZW1lbnRJbXBsICpnZXRF
bGVtZW50QnlJZCAoIGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkICkgY29uc3Q7Ci0gICAgRWxl
bWVudEltcGwgKmVsZW1lbnRGcm9tUG9pbnQgKCBjb25zdCBpbnQgX3gsIGNvbnN0IGludCBfeSAp
IGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmFkb3B0Tm9kZShOb2RlSW1wbCAqc291cmNlLCBpbnQg
JmV4Y2VwdGlvbmNvZGUpOwotICAgIAotICAgIFJlZlB0cjxOYW1lTm9kZUxpc3RJbXBsPiBnZXRF
bGVtZW50c0J5TmFtZShjb25zdCBET01TdHJpbmcgJmVsZW1lbnROYW1lKTsKLQotICAgIC8vIEFj
dHVhbGx5IHBhcnQgb2YgSFRNTERvY3VtZW50LCBidXQgdXNlZCBmb3IgZ2l2aW5nIFhNTCBkb2N1
bWVudHMgYSB3aW5kb3cgdGl0bGUgYXMgd2VsbAotICAgIERPTVN0cmluZyB0aXRsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdGl0bGU7IH0KLSAgICB2b2lkIHNldFRpdGxlKERPTVN0cmluZywgTm9kZUlt
cGwgKnRpdGxlRWxlbWVudCA9IDApOwotICAgIHZvaWQgcmVtb3ZlVGl0bGUoTm9kZUltcGwgKnRp
dGxlRWxlbWVudCk7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBpbWFnZXMoKTsK
LSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBlbWJlZHMoKTsKLSAgICBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPiBhcHBsZXRzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1w
bD4gbGlua3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBmb3JtcygpOwotICAg
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGFuY2hvcnMoKTsKLSAgICBSZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPiBhbGwoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvYmpl
Y3RzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gd2luZG93TmFtZWRJdGVtcyhE
T01TdHJpbmcgJm5hbWUpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGRvY3VtZW50
TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJp
ZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotCi0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5h
bWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7
Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBi
b29sIGlzRG9jdW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwg
Ym9vbCBpc0hUTUxEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBraHRt
bDo6Q1NTU3R5bGVTZWxlY3RvciAqc3R5bGVTZWxlY3RvcigpIHsgcmV0dXJuIG1fc3R5bGVTZWxl
Y3RvcjsgfQotCi0gICAgRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5QWNj
ZXNzS2V5KCBjb25zdCBET01TdHJpbmcgJmtleSApOwotICAgIAotICAgIC8qKgotICAgICAqIFVw
ZGF0ZXMgdGhlIHBlbmRpbmcgc2hlZXQgY291bnQgYW5kIHRoZW4gY2FsbHMgdXBkYXRlU3R5bGVT
ZWxlY3Rvci4KLSAgICAgKi8KLSAgICB2b2lkIHN0eWxlc2hlZXRMb2FkZWQoKTsKLQotICAgIC8q
KgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBhbGwgdG9wLWxldmVsIHN0eWxl
c2hlZXRzIGhhdmUgbG9hZGVkIChpbmNsdWRpbmcKLSAgICAgKiBhbnkgQGltcG9ydHMgdGhhdCB0
aGV5IG1heSBiZSBsb2FkaW5nKS4KLSAgICAgKi8KLSAgICBib29sIGhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpIHsgcmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25vcmVQZW5k
aW5nU3R5bGVzaGVldHM7IH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudHMgdGhlIG51bWJl
ciBvZiBwZW5kaW5nIHNoZWV0cy4gIFRoZSA8bGluaz4gZWxlbWVudHMKLSAgICAgKiBpbnZva2Ug
dGhpcyB0byBhZGQgdGhlbXNlbHZlcyB0byB0aGUgbG9hZGluZyBsaXN0LgotICAgICAqLwotICAg
IHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9Ci0KLSAg
ICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBzdHlsZXNoZWV0cyBpbiB0aGUg
ZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLgotICAgICAq
Ci0gICAgICogQ3JlYXRlcyBhIG5ldyBzdHlsZSBzZWxlY3RvciBhbmQgYXNzaWduIGl0IHRvIHRo
aXMgZG9jdW1lbnQuIFRoaXMgaXMgZG9uZSBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgbm9kZXMg
aW4KLSAgICAgKiBkb2N1bWVudCAob3IgdGhvc2UgYmVmb3JlIDxCT0RZPiBpbiBhIEhUTUwgZG9j
dW1lbnQpLCBzZWFyY2hpbmcgZm9yIHN0eWxlc2hlZXRzLiBTdHlsZXNoZWV0cyBjYW4gYmUgY29u
dGFpbmVkIGluCi0gICAgICogPExJTks+LCA8U1RZTEU+IG9yIDxCT0RZPiBlbGVtZW50cywgYXMg
d2VsbCBhcyBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAoWE1MIGRvY3VtZW50cyBvbmx5KS4gQSBs
aXN0IGlzCi0gICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGVzZSB3aGljaCBpcyB1c2VkIHRvIGNy
ZWF0ZSB0aGUgYSBuZXcgc3R5bGUgc2VsZWN0b3Igd2hpY2ggY29sbGF0ZXMgYWxsIG9mIHRoZSBz
dHlsZXNoZWV0cwotICAgICAqIGZvdW5kIGFuZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGVy
aXZlZCBzdHlsZXMgZm9yIGFsbCByZW5kZXJpbmcgb2JqZWN0cy4KLSAgICAgKi8KLSAgICB2b2lk
IHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLQotICAgIHZvaWQgcmVjYWxjU3R5bGVTZWxlY3Rvcigp
OwotCi0gICAgYm9vbCB1c2VzRGVzY2VuZGFudFJ1bGVzKCkgeyByZXR1cm4gbV91c2VzRGVzY2Vu
ZGFudFJ1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzRGVzY2VuZGFudFJ1bGVzKGJvb2wgYikgeyBt
X3VzZXNEZXNjZW5kYW50UnVsZXMgPSBiOyB9Ci0gICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkg
eyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzU2libGluZ1J1
bGVzKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5nUnVsZXMgPSBiOyB9XAotCi0gICAgUVN0cmluZyBu
ZXh0U3RhdGUoKTsKLQotICAgIC8vIFF1ZXJ5IGFsbCByZWdpc3RlcmVkIGVsZW1lbnRzIGZvciB0
aGVpciBzdGF0ZQotICAgIFFTdHJpbmdMaXN0IGRvY1N0YXRlKCk7Ci0gICAgdm9pZCByZWdpc3Rl
ck1haW50YWluc1N0YXRlKE5vZGVJbXBsKiBlKSB7IG1fbWFpbnRhaW5zU3RhdGUuYXBwZW5kKGUp
OyB9Ci0gICAgdm9pZCBkZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUoTm9kZUltcGwqIGUpIHsgbV9t
YWludGFpbnNTdGF0ZS5yZW1vdmVSZWYoZSk7IH0KLQotICAgIC8vIFNldCB0aGUgc3RhdGUgdGhl
IGRvY3VtZW50IHNob3VsZCByZXN0b3JlIHRvCi0gICAgdm9pZCBzZXRSZXN0b3JlU3RhdGUoIGNv
bnN0IFFTdHJpbmdMaXN0ICZzKSB7IG1fc3RhdGUgPSBzOyB9Ci0gICAgUVN0cmluZ0xpc3QgJnJl
c3RvcmVTdGF0ZSggKSB7IHJldHVybiBtX3N0YXRlOyB9Ci0KLSAgICBLSFRNTFZpZXcgKnZpZXco
KSBjb25zdCB7IHJldHVybiBtX3ZpZXc7IH0KLSAgICBGcmFtZSAqZnJhbWUoKSBjb25zdDsKLQot
ICAgIFJhbmdlSW1wbCAqY3JlYXRlUmFuZ2UoKTsKLQotICAgIE5vZGVJdGVyYXRvckltcGwgKmNy
ZWF0ZU5vZGVJdGVyYXRvcihOb2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywKLSAg
ICAgICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2Vz
LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0gICAgVHJlZVdhbGtlckltcGwgKmNyZWF0ZVRyZWVX
YWxrZXIoTm9kZUltcGwgKnJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csIAotICAgICAgICBOb2Rl
RmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAmZXhj
ZXB0aW9uY29kZSk7Ci0KLSAgICAvLyBTcGVjaWFsIHN1cHBvcnQgZm9yIGVkaXRpbmcKLSAgICBD
U1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotICAg
IEVkaXRpbmdUZXh0SW1wbCAqY3JlYXRlRWRpdGluZ1RleHROb2RlKGNvbnN0IERPTVN0cmluZyAm
dGV4dCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9D
aGFuZ2UgKTsKLSAgICBzdGF0aWMgUVB0ckxpc3Q8RG9jdW1lbnRJbXBsPiAqIGNoYW5nZWREb2N1
bWVudHM7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVJlbmRlcmluZygpOwotICAgIHZvaWQgdXBk
YXRlTGF5b3V0KCk7Ci0gICAgdm9pZCB1cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVl
dHMoKTsKLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKTsKLSAgICBr
aHRtbDo6RG9jTG9hZGVyICpkb2NMb2FkZXIoKSB7IHJldHVybiBtX2RvY0xvYWRlcjsgfQotCi0g
ICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQot
ICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSgpIHsgcmV0dXJuIG1fcmVuZGVyQXJlbmE7IH0K
LQotICAgIEtXUUFjY09iamVjdENhY2hlKiBnZXRBY2NPYmplY3RDYWNoZSgpOwotICAgIAotICAg
IC8vIHRvIGdldCB2aXN1YWxseSBvcmRlcmVkIGhlYnJldyBhbmQgYXJhYmljIHBhZ2VzIHJpZ2h0
Ci0gICAgdm9pZCBzZXRWaXN1YWxseU9yZGVyZWQoKTsKLQotICAgIHZvaWQgdXBkYXRlU2VsZWN0
aW9uKCk7Ci0gICAgCi0gICAgdm9pZCBvcGVuKCk7Ci0gICAgdm9pZCBpbXBsaWNpdE9wZW4oKTsK
LSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBpbXBsaWNpdENsb3NlKCk7Ci0gICAgdm9pZCB3
cml0ZSAoIGNvbnN0IERPTVN0cmluZyAmdGV4dCApOwotICAgIHZvaWQgd3JpdGUgKCBjb25zdCBR
U3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCB3cml0ZWxuICggY29uc3QgRE9NU3RyaW5nICZ0ZXh0
ICk7Ci0gICAgdm9pZCBmaW5pc2hQYXJzaW5nICggICk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0g
ICAgUVN0cmluZyBVUkwoKSBjb25zdCB7IHJldHVybiBtX3VybC5pc0VtcHR5KCkgPyAiYWJvdXQ6
YmxhbmsiIDogbV91cmw7IH0KLSAgICB2b2lkIHNldFVSTChjb25zdCBRU3RyaW5nJiB1cmwpOwot
Ci0gICAgUVN0cmluZyBiYXNlVVJMKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlVVJMLmlzRW1wdHko
KSA/IFVSTCgpIDogbV9iYXNlVVJMOyB9Ci0gICAgdm9pZCBzZXRCYXNlVVJMKGNvbnN0IFFTdHJp
bmcmIGJhc2VVUkwpIHsgbV9iYXNlVVJMID0gYmFzZVVSTDsgfQotCi0gICAgUVN0cmluZyBiYXNl
VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlVGFyZ2V0OyB9Ci0gICAgdm9pZCBzZXRCYXNl
VGFyZ2V0KGNvbnN0IFFTdHJpbmcmIGJhc2VUYXJnZXQpIHsgbV9iYXNlVGFyZ2V0ID0gYmFzZVRh
cmdldDsgfQotCi0gICAgUVN0cmluZyBjb21wbGV0ZVVSTChjb25zdCBRU3RyaW5nICYpOwotICAg
IERPTVN0cmluZyBjb21wbGV0ZVVSTChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBmcm9t
IGNhY2hlZE9iamVjdENsaWVudAotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KGNvbnN0
IERPTVN0cmluZyAmdXJsLCBjb25zdCBET01TdHJpbmcgJnNoZWV0U3RyKTsKLSAgICB2b2lkIHNl
dFVzZXJTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcmIHNoZWV0KTsKLSAgICBRU3RyaW5nIHVzZXJT
dHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV91c2Vyc2hlZXQ7IH0KLSAgICB2b2lkIHNldFBy
aW50U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJiBzaGVldCkgeyBtX3ByaW50U2hlZXQgPSBzaGVl
dDsgfQotICAgIFFTdHJpbmcgcHJpbnRTdHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9wcmlu
dFNoZWV0OyB9Ci0KLSAgICBDU1NTdHlsZVNoZWV0SW1wbCogZWxlbWVudFNoZWV0KCk7Ci0gICAg
dmlydHVhbCBraHRtbDo6VG9rZW5pemVyICpjcmVhdGVUb2tlbml6ZXIoKTsKLSAgICBraHRtbDo6
VG9rZW5pemVyICp0b2tlbml6ZXIoKSB7IHJldHVybiBtX3Rva2VuaXplcjsgfQotICAgIAotICAg
IFFQYWludERldmljZU1ldHJpY3MgKnBhaW50RGV2aWNlTWV0cmljcygpIHsgcmV0dXJuIG1fcGFp
bnREZXZpY2VNZXRyaWNzOyB9Ci0gICAgUVBhaW50RGV2aWNlICpwYWludERldmljZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFpbnREZXZpY2U7IH0KLSAgICB2b2lkIHNldFBhaW50RGV2aWNlKCBRUGFp
bnREZXZpY2UgKmRldiApOwotCi0gICAgZW51bSBIVE1MTW9kZSB7Ci0gICAgICAgIEh0bWwzLAot
ICAgICAgICBIdG1sNCwKLSAgICAgICAgWEh0bWwKLSAgICB9OwotCi0gICAgZW51bSBQYXJzZU1v
ZGUgewotICAgICAgICBDb21wYXQsCi0gICAgICAgIEFsbW9zdFN0cmljdCwKLSAgICAgICAgU3Ry
aWN0Ci0gICAgfTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZGV0ZXJtaW5lUGFyc2VNb2RlKCBj
b25zdCBRU3RyaW5nICZzdHIgKTsKLSAgICB2b2lkIHNldFBhcnNlTW9kZSggUGFyc2VNb2RlIG0g
KSB7IHBNb2RlID0gbTsgfQotICAgIFBhcnNlTW9kZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVy
biBwTW9kZTsgfQotCi0gICAgYm9vbCBpbkNvbXBhdE1vZGUoKSB7IHJldHVybiBwTW9kZSA9PSBD
b21wYXQ7IH0KLSAgICBib29sIGluQWxtb3N0U3RyaWN0TW9kZSgpIHsgcmV0dXJuIHBNb2RlID09
IEFsbW9zdFN0cmljdDsgfQotICAgIGJvb2wgaW5TdHJpY3RNb2RlKCkgeyByZXR1cm4gcE1vZGUg
PT0gU3RyaWN0OyB9Ci0gICAgCi0gICAgdm9pZCBzZXRIVE1MTW9kZSggSFRNTE1vZGUgbSApIHsg
aE1vZGUgPSBtOyB9Ci0gICAgSFRNTE1vZGUgaHRtbE1vZGUoKSBjb25zdCB7IHJldHVybiBoTW9k
ZTsgfQotCi0gICAgdm9pZCBzZXRQYXJzaW5nKGJvb2wgYik7Ci0gICAgYm9vbCBwYXJzaW5nKCkg
Y29uc3QgeyByZXR1cm4gbV9iUGFyc2luZzsgfQotICAgIGludCBtaW5pbXVtTGF5b3V0RGVsYXko
KTsKLSAgICBib29sIHNob3VsZFNjaGVkdWxlTGF5b3V0KCk7Ci0gICAgaW50IGVsYXBzZWRUaW1l
KCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRUZXh0Q29sb3IoIFFDb2xvciBjb2xvciApIHsg
bV90ZXh0Q29sb3IgPSBjb2xvcjsgfQotICAgIFFDb2xvciB0ZXh0Q29sb3IoKSBjb25zdCB7IHJl
dHVybiBtX3RleHRDb2xvcjsgfQotCi0gICAgY29uc3QgUUNvbG9yJiBsaW5rQ29sb3IoKSBjb25z
dCB7IHJldHVybiBtX2xpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFDb2xvciYgdmlzaXRlZExpbmtD
b2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaXRlZExpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFD
b2xvciYgYWN0aXZlTGlua0NvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVMaW5rQ29sb3I7
IH0KLSAgICB2b2lkIHNldExpbmtDb2xvcihjb25zdCBRQ29sb3ImIGMpIHsgbV9saW5rQ29sb3Ig
PSBjOyB9Ci0gICAgdm9pZCBzZXRWaXNpdGVkTGlua0NvbG9yKGNvbnN0IFFDb2xvciYgYykgeyBt
X3Zpc2l0ZWRMaW5rQ29sb3IgPSBjOyB9Ci0gICAgdm9pZCBzZXRBY3RpdmVMaW5rQ29sb3IoY29u
c3QgUUNvbG9yJiBjKSB7IG1fYWN0aXZlTGlua0NvbG9yID0gYzsgfQotICAgIHZvaWQgcmVzZXRM
aW5rQ29sb3IoKTsKLSAgICB2b2lkIHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHZvaWQg
cmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAgICAKLSAgICBib29sIHByZXBhcmVNb3VzZUV2ZW50
KGJvb2wgcmVhZG9ubHksIGludCB4LCBpbnQgeSwgTW91c2VFdmVudCogZXYpOwotICAgIGJvb2wg
cHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFkb25seSwgYm9vbCBhY3RpdmUsIGludCB4LCBpbnQg
eSwgTW91c2VFdmVudCAqZXYpOwotCi0gICAgdmlydHVhbCBib29sIGNoaWxkQWxsb3dlZCggTm9k
ZUltcGwgKm5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoIHVu
c2lnbmVkIHNob3J0IG5vZGVUeXBlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2Rl
ICggYm9vbCBkZWVwICk7Ci0KLSAgICBTdHlsZVNoZWV0TGlzdEltcGwqIHN0eWxlU2hlZXRzKCk7
Ci0KLSAgICAvKiBOZXdseSBwcm9wb3NlZCBDU1MzIG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIGFs
dGVybmF0ZQotICAgICAgIHN0eWxlc2hlZXRzIHVzaW5nIHRoZSBET00uIE1heSBiZSBzdWJqZWN0
IHRvIGNoYW5nZSBhcwotICAgICAgIHNwZWMgbWF0dXJlcy4gLSBkd2gKLSAgICAqLwotICAgIERP
TVN0cmluZyBwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KCk7Ci0gICAgRE9NU3RyaW5nIHNlbGVjdGVk
U3R5bGVzaGVldFNldCgpOwotICAgIHZvaWQgc2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0
IERPTVN0cmluZyYgYVN0cmluZyk7Ci0KLSAgICBRU3RyaW5nTGlzdCBhdmFpbGFibGVTdHlsZVNo
ZWV0cygpIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmZvY3VzTm9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZm9jdXNOb2RlLmdldCgpOyB9Ci0gICAgYm9vbCBzZXRGb2N1c05vZGUoTm9kZUltcGwgKm5l
d0ZvY3VzTm9kZSk7Ci0gICAgdm9pZCBjbGVhclNlbGVjdGlvbklmTmVlZGVkKE5vZGVJbXBsICpu
ZXdGb2N1c05vZGUpOwotCi0gICAgTm9kZUltcGwgKmhvdmVyTm9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1faG92ZXJOb2RlLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRIb3Zlck5vZGUoTm9kZUltcGwgKm5l
d0hvdmVyTm9kZSk7Ci0gICAgCi0gICAgTm9kZUltcGwgKmFjdGl2ZU5vZGUoKSBjb25zdCB7IHJl
dHVybiBtX2FjdGl2ZU5vZGUuZ2V0KCk7IH0KLSAgICB2b2lkIHNldEFjdGl2ZU5vZGUoTm9kZUlt
cGwgKm5ld0FjdGl2ZU5vZGUpOwotCi0gICAgLy8gVXBkYXRlcyBmb3IgOnRhcmdldCAoQ1NTMyBz
ZWxlY3RvcikuCi0gICAgdm9pZCBzZXRDU1NUYXJnZXQoTm9kZUltcGwqIG4pOwotICAgIE5vZGVJ
bXBsKiBnZXRDU1NUYXJnZXQoKTsKLSAgICAKLSAgICB2b2lkIHNldERvY3VtZW50Q2hhbmdlZChi
b29sKTsKLQotICAgIHZvaWQgYXR0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvckltcGwgKm5p
KTsKLSAgICB2b2lkIGRldGFjaE5vZGVJdGVyYXRvcihOb2RlSXRlcmF0b3JJbXBsICpuaSk7Ci0g
ICAgdm9pZCBub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChOb2RlSW1wbCAqbik7Ci0gICAgQWJzdHJh
Y3RWaWV3SW1wbCAqZGVmYXVsdFZpZXcoKSBjb25zdDsKLSAgICBFdmVudEltcGwgKmNyZWF0ZUV2
ZW50KGNvbnN0IERPTVN0cmluZyAmZXZlbnRUeXBlLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0g
ICAgLy8ga2VlcCB0cmFjayBvZiB3aGF0IHR5cGVzIG9mIGV2ZW50IGxpc3RlbmVycyBhcmUgcmVn
aXN0ZXJlZCwgc28gd2UgZG9uJ3QKLSAgICAvLyBkaXNwYXRjaCBldmVudHMgdW5uZWNlc3Nhcmls
eQotICAgIGVudW0gTGlzdGVuZXJUeXBlIHsKLSAgICAgICAgRE9NU1VCVFJFRU1PRElGSUVEX0xJ
U1RFTkVSICAgICAgICAgID0gMHgwMSwKLSAgICAgICAgRE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVS
ICAgICAgICAgICAgID0gMHgwMiwKLSAgICAgICAgRE9NTk9ERVJFTU9WRURfTElTVEVORVIgICAg
ICAgICAgICAgID0gMHgwNCwKLSAgICAgICAgRE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElT
VEVORVIgID0gMHgwOCwKLSAgICAgICAgRE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RF
TkVSID0gMHgxMCwKLSAgICAgICAgRE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSICAgICAgICAgICAg
ID0gMHgyMCwKLSAgICAgICAgRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSICAgID0g
MHg0MAotICAgIH07Ci0KLSAgICBib29sIGhhc0xpc3RlbmVyVHlwZShMaXN0ZW5lclR5cGUgbGlz
dGVuZXJUeXBlKSBjb25zdCB7IHJldHVybiAobV9saXN0ZW5lclR5cGVzICYgbGlzdGVuZXJUeXBl
KTsgfQotICAgIHZvaWQgYWRkTGlzdGVuZXJUeXBlKExpc3RlbmVyVHlwZSBsaXN0ZW5lclR5cGUp
IHsgbV9saXN0ZW5lclR5cGVzID0gbV9saXN0ZW5lclR5cGVzIHwgbGlzdGVuZXJUeXBlOyB9Ci0K
LSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50SW1w
bCAqZWx0LCBjb25zdCBET01TdHJpbmcgJnBzZXVkb0VsdCk7Ci0KLSAgICB0eXBlZGVmIFFNYXA8
UVN0cmluZywgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCo+IExvY2FsU3R5bGVSZWZzOwotICAg
IExvY2FsU3R5bGVSZWZzKiBsb2NhbFN0eWxlUmVmcygpIHsgcmV0dXJuICZtX2xvY2FsU3R5bGVS
ZWZzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwg
KmV2dCk7Ci0gICAgdm9pZCBzZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOwotICAgIEV2ZW50TGlz
dGVuZXIgKmdldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZl
bnRUeXBlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLQotICAgIHZvaWQgc2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEF0dHJpYnV0ZUltcGwqKTsKLQot
ICAgIHZvaWQgYWRkV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50
VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9p
ZCByZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBl
LCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKTsKLSAgICBib29sIGhh
c1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotCi0g
ICAgRXZlbnRMaXN0ZW5lciAqY3JlYXRlSFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgRE9NU3RyaW5n
JiBjb2RlLCBOb2RlSW1wbCopOwotICAgIAotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRocm91
Z2ggdGhlIGRvY3VtZW50LCBzdGFydGluZyBmcm9tIGZyb21Ob2RlLCBmb3IgdGhlIG5leHQgc2Vs
ZWN0YWJsZSBlbGVtZW50IHRoYXQgY29tZXMgYWZ0ZXIgZnJvbU5vZGUuCi0gICAgICogVGhlIG9y
ZGVyIGZvbGxvd2VkIGlzIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDE3LjExLjEgb2YgdGhlIEhU
TUw0IHNwZWMsIHdoaWNoIGlzIGVsZW1lbnRzIHdpdGggdGFiIGluZGV4ZXMKLSAgICAgKiBmaXJz
dCAoZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCksIGFuZCB0aGVuIGVsZW1lbnRzIHdpdGhvdXQgdGFi
IGluZGV4ZXMgKGluIGRvY3VtZW50IG9yZGVyKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcm9t
Tm9kZSBUaGUgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZy4gVGhlIG5vZGUgYWZ0
ZXIgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgotICAgICAqCi0gICAgICogQHJl
dHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGFmdGVyIGZyb21Ob2RlCi0gICAgICoKLSAg
ICAgKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNo
LTE3LjExLjEKLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqbmV4dEZvY3VzTm9kZShOb2RlSW1wbCAq
ZnJvbU5vZGUpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgZG9jdW1l
bnQsIHN0YXJ0aW5nIGZyb20gZnJvbU5vZGUsIGZvciB0aGUgcHJldmlvdXMgc2VsZWN0YWJsZSBl
bGVtZW50ICh0aGF0IGNvbWVzIF9iZWZvcmVfKQotICAgICAqIGZyb21Ob2RlLiBUaGUgb3JkZXIg
Zm9sbG93ZWQgaXMgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gMTcuMTEuMSBvZiB0aGUgSFRNTDQg
c3BlYywgd2hpY2ggaXMgZWxlbWVudHMgd2l0aCB0YWIKLSAgICAgKiBpbmRleGVzIGZpcnN0IChm
cm9tIGxvd2VzdCB0byBoaWdoZXN0KSwgYW5kIHRoZW4gZWxlbWVudHMgd2l0aG91dCB0YWIgaW5k
ZXhlcyAoaW4gZG9jdW1lbnQgb3JkZXIpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyb21Ob2Rl
IFRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgc2VhcmNoaW5nLiBUaGUgbm9kZSBiZWZvcmUg
dGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgotICAgICAqCi0gICAgICogQHJldHVy
biBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSBmcm9tTm9kZQotICAgICAqCi0gICAg
ICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0x
Ny4xMS4xCi0gICAgICovCi0gICAgTm9kZUltcGwgKnByZXZpb3VzRm9jdXNOb2RlKE5vZGVJbXBs
ICpmcm9tTm9kZSk7Ci0KLSAgICBpbnQgbm9kZUFic0luZGV4KE5vZGVJbXBsICpub2RlKTsKLSAg
ICBOb2RlSW1wbCAqbm9kZVdpdGhBYnNJbmRleChpbnQgYWJzSW5kZXgpOwotCi0gICAgLyoqCi0g
ICAgICogSGFuZGxlcyBhIEhUVFAgaGVhZGVyIGVxdWl2YWxlbnQgc2V0IGJ5IGEgbWV0YSB0YWcg
dXNpbmcgPG1ldGEgaHR0cC1lcXVpdj0iLi4uIiBjb250ZW50PSIuLi4iPi4gVGhpcyBpcyBjYWxs
ZWQKLSAgICAgKiB3aGVuIGEgbWV0YSB0YWcgaXMgZW5jb3VudGVyZWQgZHVyaW5nIGRvY3VtZW50
IHBhcnNpbmcsIGFuZCBhbHNvIHdoZW4gYSBzY3JpcHQgZHluYW1pY2FsbHkgY2hhbmdlcyBvciBh
ZGRzIGEgbWV0YQotICAgICAqIHRhZy4gVGhpcyBlbmFibGVzIHNjcmlwdHMgdG8gdXNlIG1ldGEg
dGFncyB0byBwZXJmb3JtIHJlZnJlc2hlcyBhbmQgc2V0IGV4cGlyeSBkYXRlcyBpbiBhZGRpdGlv
biB0byB0aGVtIGJlaW5nCi0gICAgICogc3BlY2lmaWVkIGluIGEgSFRNTCBmaWxlLgotICAgICAq
Ci0gICAgICogQHBhcmFtIGVxdWl2IFRoZSBodHRwIGhlYWRlciBuYW1lICh2YWx1ZSBvZiB0aGUg
bWV0YSB0YWcncyAiZXF1aXYiIGF0dHJpYnV0ZSkKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUg
aGVhZGVyIHZhbHVlICh2YWx1ZSBvZiB0aGUgbWV0YSB0YWcncyAiY29udGVudCIgYXR0cmlidXRl
KQotICAgICAqLwotICAgIHZvaWQgcHJvY2Vzc0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcgJmVx
dWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRlbnQpOwotICAgIAotICAgIHZvaWQgZGlzcGF0Y2hJ
bWFnZUxvYWRFdmVudFNvb24oSFRNTEltYWdlTG9hZGVyKik7Ci0gICAgdm9pZCBkaXNwYXRjaElt
YWdlTG9hZEV2ZW50c05vdygpOwotICAgIHZvaWQgcmVtb3ZlSW1hZ2UoSFRNTEltYWdlTG9hZGVy
Kik7Ci0gICAgdmlydHVhbCB2b2lkIHRpbWVyRXZlbnQoUVRpbWVyRXZlbnQgKik7Ci0gICAgCi0g
ICAgLy8gUmV0dXJucyB0aGUgb3duaW5nIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBkb2N1bWVudC4K
LSAgICAvLyBSZXR1cm5zIDAgaWYgdGhpcyBpcyB0aGUgdG9wIGxldmVsIGRvY3VtZW50LgotICAg
IEVsZW1lbnRJbXBsICpvd25lckVsZW1lbnQoKTsKLSAgICAKLSAgICBET01TdHJpbmcgcmVmZXJy
ZXIoKSBjb25zdDsKLSAgICBET01TdHJpbmcgZG9tYWluKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRE
b21haW4oIGNvbnN0IERPTVN0cmluZyAmbmV3RG9tYWluLCBib29sIGZvcmNlID0gZmFsc2UgKTsg
Ly8gbm90IHBhcnQgb2YgdGhlIERPTQotCi0gICAgRE9NU3RyaW5nIHBvbGljeUJhc2VVUkwoKSBj
b25zdCB7IHJldHVybiBtX3BvbGljeUJhc2VVUkw7IH0KLSAgICB2b2lkIHNldFBvbGljeUJhc2VV
UkwoY29uc3QgRE9NU3RyaW5nICZzKSB7IG1fcG9saWN5QmFzZVVSTCA9IHM7IH0KLSAgICAKLSAg
ICAvLyBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUgZnJvbSBIVE1MIDQgZm9yIHdo
YXQgdmFsaWQgbmFtZXMgYXJlLgotICAgIC8vIFRvIGdldCB0aGlzIHJpZ2h0IGZvciBhbGwgdGhl
IFhNTCBjYXNlcywgd2UgcHJvYmFibHkgaGF2ZSB0byBpbXByb3ZlIHRoaXMgb3IgbW92ZSBpdAot
ICAgIC8vIGFuZCBtYWtlIGl0IHNlbnNpdGl2ZSB0byB0aGUgdHlwZSBvZiBkb2N1bWVudC4KLSAg
ICBzdGF0aWMgYm9vbCBpc1ZhbGlkTmFtZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBU
aGUgZm9sbG93aW5nIGJyZWFrcyBhIHF1YWxpZmllZCBuYW1lIGludG8gYSBwcmVmaXggYW5kIGEg
bG9jYWwgbmFtZS4KLSAgICAvLyBJdCBhbHNvIGRvZXMgYSB2YWxpZGl0eSBjaGVjaywgYW5kIHJl
dHVybnMgZmFsc2UgaWYgdGhlIHF1YWxpZmllZCBuYW1lIGlzIGludmFsaWQKLSAgICAvLyAoZW1w
dHkgc3RyaW5nIG9yIGludmFsaWQgY2hhcmFjdGVycykuCi0gICAgc3RhdGljIGJvb2wgcGFyc2VR
dWFsaWZpZWROYW1lKGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgRE9NU3RyaW5nICZw
cmVmaXgsIERPTVN0cmluZyAmbG9jYWxOYW1lKTsKLSAgICAKLSAgICB2b2lkIGFkZEVsZW1lbnRC
eUlkKGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCk7Ci0g
ICAgdm9pZCByZW1vdmVFbGVtZW50QnlJZChjb25zdCBET01TdHJpbmcgJmVsZW1lbnRJZCwgRWxl
bWVudEltcGwgKmVsZW1lbnQpOwotCi0gICAgdm9pZCBhZGRJbWFnZU1hcChIVE1MTWFwRWxlbWVu
dEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWFnZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKik7
Ci0gICAgSFRNTE1hcEVsZW1lbnRJbXBsICpnZXRJbWFnZU1hcChjb25zdCBET01TdHJpbmcgJlVS
TCkgY29uc3Q7Ci0KLSAgICBIVE1MRWxlbWVudEltcGwqIGJvZHkoKTsKLQotICAgIERPTVN0cmlu
ZyB0b1N0cmluZygpIGNvbnN0OwotICAgIAotICAgIGJvb2wgZXhlY0NvbW1hbmQoY29uc3QgRE9N
U3RyaW5nICZjb21tYW5kLCBib29sIHVzZXJJbnRlcmZhY2UsIGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kRW5hYmxlZChjb25zdCBET01TdHJpbmcgJmNvbW1h
bmQpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kSW5kZXRlcm0oY29uc3QgRE9NU3RyaW5nICZjb21t
YW5kKTsKLSAgICBib29sIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbnN0IERPTVN0cmluZyAmY29tbWFu
ZCk7Ci0gICAgYm9vbCBxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29uc3QgRE9NU3RyaW5nICZjb21t
YW5kKTsKLSAgICBET01TdHJpbmcgcXVlcnlDb21tYW5kVmFsdWUoY29uc3QgRE9NU3RyaW5nICZj
b21tYW5kKTsKLSAgICAKLSAgICB2b2lkIGFkZE1hcmtlcihSYW5nZUltcGwgKnJhbmdlLCBEb2N1
bWVudE1hcmtlcjo6TWFya2VyVHlwZSB0eXBlKTsKLSAgICB2b2lkIGFkZE1hcmtlcihOb2RlSW1w
bCAqbm9kZSwgRG9jdW1lbnRNYXJrZXIgbWFya2VyKTsKLSAgICB2b2lkIGNvcHlNYXJrZXJzKE5v
ZGVJbXBsICpzcmNOb2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgTm9kZUlt
cGwgKmRzdE5vZGUsIGludCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2Vy
VHlwZT1Eb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJz
KFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9
RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQgcmVtb3ZlTWFya2VycyhOb2Rl
SW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIERvY3VtZW50TWFy
a2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwot
ICAgIHZvaWQgcmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJU
eXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICB2b2lkIHJlbW92ZU1hcmtlcnMo
Tm9kZUltcGwgKm5vZGUpOwotICAgIHZvaWQgc2hpZnRNYXJrZXJzKE5vZGVJbXBsICpub2RlLCB1
bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGRlbHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlw
ZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLQotICAgIFFWYWx1ZUxp
c3Q8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnNGb3JOb2RlKE5vZGVJbXBsICpub2RlKTsKLSAgICAK
LSAgIC8qKgotICAgICogZGVzaWduTW9kZSBzdXBwb3J0Ci0gICAgKi8KLSAgICBlbnVtIEluaGVy
aXRlZEJvb2wgewotICAgICAgICBvZmY9ZmFsc2UsCi0gICAgICAgIG9uPXRydWUsCi0gICAgICAg
IGluaGVyaXQKLSAgICB9OwotICAgIAotICAgIHZvaWQgc2V0RGVzaWduTW9kZShJbmhlcml0ZWRC
b29sIHZhbHVlKTsKLSAgICBJbmhlcml0ZWRCb29sIGdldERlc2lnbk1vZGUoKSBjb25zdDsKLSAg
ICBib29sIGluRGVzaWduTW9kZSgpIGNvbnN0OwotICAgIERvY3VtZW50SW1wbCAqcGFyZW50RG9j
dW1lbnQoKSBjb25zdDsKLSAgICBEb2N1bWVudEltcGwgKnRvcERvY3VtZW50KCkgY29uc3Q7Ci0K
LSAgICBpbnQgZG9jSUQoKSBjb25zdCB7IHJldHVybiBtX2RvY0lEOyB9Ci0KLSNpZmRlZiBLSFRN
TF9YU0xUCi0gICAgdm9pZCBhcHBseVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25J
bXBsKiBwaSk7Ci0gICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2Uodm9pZCogZG9jKSB7IG1fdHJh
bnNmb3JtU291cmNlID0gZG9jOyB9Ci0gICAgY29uc3Qgdm9pZCogdHJhbnNmb3JtU291cmNlKCkg
eyByZXR1cm4gbV90cmFuc2Zvcm1Tb3VyY2U7IH0KLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiB0
cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpIHsgcmV0dXJuIG1fdHJhbnNmb3JtU291cmNlRG9jdW1l
bnQ7IH0KLSAgICB2b2lkIHNldFRyYW5zZm9ybVNvdXJjZURvY3VtZW50KERvY3VtZW50SW1wbCAq
ZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBkb2M7IH0KLSNlbmRpZgotCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgIC8vIFhCTCBtZXRob2RzCi0gICAgWEJMOjpYQkxCaW5kaW5n
TWFuYWdlciogYmluZGluZ01hbmFnZXIoKSBjb25zdCB7IHJldHVybiBtX2JpbmRpbmdNYW5hZ2Vy
OyB9Ci0jZW5kaWYKLQotICAgIHZvaWQgaW5jRE9NVHJlZVZlcnNpb24oKSB7ICsrbV9kb210cmVl
X3ZlcnNpb247IH0KLSAgICB1bnNpZ25lZCBpbnQgZG9tVHJlZVZlcnNpb24oKSBjb25zdCB7IHJl
dHVybiBtX2RvbXRyZWVfdmVyc2lvbjsgfQotCi0gICAgdm9pZCBzZXREb2NUeXBlKERvY3VtZW50
VHlwZUltcGwgKmRvY1R5cGUpIHsgbV9kb2NUeXBlID0gZG9jVHlwZTsgfQotCi1zaWduYWxzOgot
ICAgIHZvaWQgZmluaXNoZWRQYXJzaW5nKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBraHRtbDo6Q1NT
U3R5bGVTZWxlY3RvciAqbV9zdHlsZVNlbGVjdG9yOwotICAgIEtIVE1MVmlldyAqbV92aWV3Owot
ICAgIFFTdHJpbmdMaXN0IG1fc3RhdGU7Ci0KLSAgICBraHRtbDo6RG9jTG9hZGVyICptX2RvY0xv
YWRlcjsKLSAgICBraHRtbDo6VG9rZW5pemVyICptX3Rva2VuaXplcjsKLSAgICBRU3RyaW5nIG1f
dXJsOwotICAgIFFTdHJpbmcgbV9iYXNlVVJMOwotICAgIFFTdHJpbmcgbV9iYXNlVGFyZ2V0Owot
Ci0gICAgUmVmUHRyPERvY3VtZW50VHlwZUltcGw+IG1fZG9jVHlwZTsKLSAgICBET01JbXBsZW1l
bnRhdGlvbkltcGwgKm1faW1wbGVtZW50YXRpb247Ci0KLSAgICBTdHlsZVNoZWV0SW1wbCAqbV9z
aGVldDsKLSAgICBRU3RyaW5nIG1fdXNlcnNoZWV0OwotICAgIFFTdHJpbmcgbV9wcmludFNoZWV0
OwotICAgIFFTdHJpbmdMaXN0IG1fYXZhaWxhYmxlU2hlZXRzOwotCi0gICAgLy8gVHJhY2sgdGhl
IG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGluZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMuICBTaGVl
dHMKLSAgICAvLyBsb2FkZWQgdXNpbmcgdGhlIEBpbXBvcnQgZGlyZWN0aXZlIGFyZSBub3QgaW5j
bHVkZWQgaW4gdGhpcyBjb3VudC4KLSAgICAvLyBXZSB1c2UgdGhpcyBjb3VudCBvZiBwZW5kaW5n
IHNoZWV0cyB0byBkZXRlY3Qgd2hlbiB3ZSBjYW4gYmVnaW4gYXR0YWNoaW5nCi0gICAgLy8gZWxl
bWVudHMuCi0gICAgaW50IG1fcGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAgLy8gQnV0IHNvbWV0
aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50IHRvCi0gICAg
Ly8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91dCB3aGVuIHJlcXVlc3RlZCBieSBKUy4KLSAgICBi
b29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAgQ1NTU3R5bGVTaGVldEltcGwg
Km1fZWxlbVNoZWV0OwotCi0gICAgUVBhaW50RGV2aWNlICptX3BhaW50RGV2aWNlOwotICAgIFFQ
YWludERldmljZU1ldHJpY3MgKm1fcGFpbnREZXZpY2VNZXRyaWNzOwotICAgIFBhcnNlTW9kZSBw
TW9kZTsKLSAgICBIVE1MTW9kZSBoTW9kZTsKLQotICAgIFFDb2xvciBtX3RleHRDb2xvcjsKLQot
ICAgIFJlZlB0cjxOb2RlSW1wbD4gbV9mb2N1c05vZGU7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBt
X2hvdmVyTm9kZTsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IG1fYWN0aXZlTm9kZTsKLQotICAgIHVu
c2lnbmVkIGludCBtX2RvbXRyZWVfdmVyc2lvbjsKLSAgICAKLSAgICAvLyAjIyMgcmVwbGFjZSBt
ZSB3aXRoIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudAotICAgIC8vIGluIGxvb2t1cCBhbmQgaW5z
ZXJ0aW9uLgotICAgIERPTVN0cmluZ0ltcGwgKiptX2VsZW1lbnROYW1lczsKLSAgICB1bnNpZ25l
ZCBzaG9ydCBtX2VsZW1lbnROYW1lQWxsb2M7Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9lbGVtZW50
TmFtZUNvdW50OwotCi0gICAgRE9NU3RyaW5nSW1wbCAqKm1fYXR0ck5hbWVzOwotICAgIHVuc2ln
bmVkIHNob3J0IG1fYXR0ck5hbWVBbGxvYzsKLSAgICB1bnNpZ25lZCBzaG9ydCBtX2F0dHJOYW1l
Q291bnQ7Ci0KLSAgICBET01TdHJpbmdJbXBsKiogbV9uYW1lc3BhY2VVUklzOwotICAgIHVuc2ln
bmVkIHNob3J0IG1fbmFtZXNwYWNlVVJJQWxsb2M7Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9uYW1l
c3BhY2VVUklDb3VudDsKLQotICAgIFFQdHJMaXN0PE5vZGVJdGVyYXRvckltcGw+IG1fbm9kZUl0
ZXJhdG9yczsKLSAgICBBYnN0cmFjdFZpZXdJbXBsICptX2RlZmF1bHRWaWV3OwotCi0gICAgdW5z
aWduZWQgc2hvcnQgbV9saXN0ZW5lclR5cGVzOwotICAgIFN0eWxlU2hlZXRMaXN0SW1wbCogbV9z
dHlsZVNoZWV0czsKLSAgICBMb2NhbFN0eWxlUmVmcyBtX2xvY2FsU3R5bGVSZWZzOyAvLyByZWZl
cmVuY2VzIHRvIGlubGluZWQgc3R5bGUgZWxlbWVudHMKLSAgICBRUHRyTGlzdDxSZWdpc3RlcmVk
RXZlbnRMaXN0ZW5lcj4gbV93aW5kb3dFdmVudExpc3RlbmVyczsKLSAgICBRUHRyTGlzdDxOb2Rl
SW1wbD4gbV9tYWludGFpbnNTdGF0ZTsKLQotICAgIFFDb2xvciBtX2xpbmtDb2xvcjsKLSAgICBR
Q29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwotICAgIFFDb2xvciBtX2FjdGl2ZUxpbmtDb2xvcjsK
LQotICAgIERPTVN0cmluZyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7Ci0gICAgRE9NU3RyaW5n
IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OwotCi0gICAgYm9vbCBtX2xvYWRpbmdTaGVldDsKLSAg
ICBib29sIHZpc3VhbGx5T3JkZXJlZDsKLSAgICBib29sIG1fYlBhcnNpbmc7Ci0gICAgYm9vbCBt
X2JBbGxEYXRhUmVjZWl2ZWQ7Ci0gICAgYm9vbCBtX2RvY0NoYW5nZWQ7Ci0gICAgYm9vbCBtX3N0
eWxlU2VsZWN0b3JEaXJ0eTsKLSAgICBib29sIG1faW5TdHlsZVJlY2FsYzsKLSAgICBib29sIG1f
Y2xvc2VBZnRlclN0eWxlUmVjYWxjOwotICAgIGJvb2wgbV91c2VzRGVzY2VuZGFudFJ1bGVzOwot
ICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVzOwotICAgIAotICAgIERPTVN0cmluZyBtX3RpdGxl
OwotICAgIGJvb2wgbV90aXRsZVNldEV4cGxpY2l0bHk7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBt
X3RpdGxlRWxlbWVudDsKLSAgICAKLSAgICBSZW5kZXJBcmVuYSogbV9yZW5kZXJBcmVuYTsKLQot
ICAgIFFQdHJEaWN0PCBRVmFsdWVMaXN0PERvY3VtZW50TWFya2VyPiA+IG1fbWFya2VyczsKLQot
ICAgIEtXUUFjY09iamVjdENhY2hlKiBtX2FjY0NhY2hlOwotICAgIAotICAgIFFQdHJMaXN0PEhU
TUxJbWFnZUxvYWRlcj4gbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoU29vbkxpc3Q7Ci0gICAgUVB0
ckxpc3Q8SFRNTEltYWdlTG9hZGVyPiBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0Owot
ICAgIGludCBtX2ltYWdlTG9hZEV2ZW50VGltZXI7Ci0KLSAgICBOb2RlSW1wbCogbV9jc3NUYXJn
ZXQ7Ci0gICAgCi0gICAgYm9vbCBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQ7Ci0gICAgUVRpbWUgbV9z
dGFydFRpbWU7Ci0gICAgYm9vbCBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkOwotICAgIAot
I2lmZGVmIEtIVE1MX1hTTFQKLSAgICB2b2lkICptX3RyYW5zZm9ybVNvdXJjZTsKLSAgICBSZWZQ
dHI8RG9jdW1lbnRJbXBsPiBtX3RyYW5zZm9ybVNvdXJjZURvY3VtZW50OwotI2VuZGlmCi0KLSNp
Zm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgWEJMOjpYQkxCaW5kaW5nTWFuYWdlciogbV9iaW5kaW5n
TWFuYWdlcjsgLy8gVGhlIGFjY2VzcyBwb2ludCB0aHJvdWdoIHdoaWNoIGRvY3VtZW50cyBhbmQg
ZWxlbWVudHMgY29tbXVuaWNhdGUgd2l0aCBYQkwuCi0jZW5kaWYKLSAgICAKLSAgICBRTWFwPFFT
dHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAqPiBtX2ltYWdlTWFwc0J5TmFtZTsKLQotICAgIERP
TVN0cmluZyBtX3BvbGljeUJhc2VVUkw7Ci0KLSAgICBRUHRyRGljdDxOb2RlSW1wbD4gbV9kaXNj
b25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVyczsKLQotICAgIGludCBtX2RvY0lEOyAvLyBB
IHVuaXF1ZSBkb2N1bWVudCBpZGVudGlmaWVyIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGRvY3VtZW50
LXNwZWNpZmljIG1hcHBlZCBhdHRyaWJ1dGVzLgotCi1wdWJsaWM6Ci0gICAgS1dRU2lnbmFsIG1f
ZmluaXNoZWRQYXJzaW5nOwotCi0gICAgYm9vbCBpblBhZ2VDYWNoZSgpOwotICAgIHZvaWQgc2V0
SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKTsKLSAgICB2b2lkIHJlc3RvcmVSZW5kZXJlcihraHRtbDo6
UmVuZGVyT2JqZWN0KiByZW5kZXIpOwotCi0gICAgdm9pZCBwYXNzd29yZEZpZWxkQWRkZWQoKTsK
LSAgICB2b2lkIHBhc3N3b3JkRmllbGRSZW1vdmVkKCk7Ci0gICAgYm9vbCBoYXNQYXNzd29yZEZp
ZWxkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNlY3VyZUZvcm1BZGRlZCgpOwotICAgIHZvaWQgc2Vj
dXJlRm9ybVJlbW92ZWQoKTsKLSAgICBib29sIGhhc1NlY3VyZUZvcm0oKSBjb25zdDsKLQotICAg
IHZvaWQgc2V0U2hvdWxkQ3JlYXRlUmVuZGVyZXJzKGJvb2wgZik7Ci0gICAgYm9vbCBzaG91bGRD
cmVhdGVSZW5kZXJlcnMoKTsKLSAgICAKLSAgICB2b2lkIHNldERlY29kZXIoa2h0bWw6OkRlY29k
ZXIgKik7Ci0gICAga2h0bWw6OkRlY29kZXIgKmRlY29kZXIoKSBjb25zdCB7IHJldHVybiBtX2Rl
Y29kZXIuZ2V0KCk7IH0KLQotICAgIHZvaWQgc2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5KGJvb2wg
ZikgeyBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eSA9IGY7IH0KLSAgICBib29sIGRhc2hib2FyZFJl
Z2lvbnNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uc0RpcnR5OyB9Ci0g
ICAgYm9vbCBoYXNEYXNoYm9hcmRSZWdpb25zICgpIGNvbnN0IHsgcmV0dXJuIG1faGFzRGFzaGJv
YXJkUmVnaW9uczsgfQotICAgIHZvaWQgc2V0SGFzRGFzaGJvYXJkUmVnaW9ucyAoYm9vbCBmKSB7
IG1faGFzRGFzaGJvYXJkUmVnaW9ucyA9IGY7IH0KLSAgICBjb25zdCBRVmFsdWVMaXN0PGtodG1s
OjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gJiBkYXNoYm9hcmRSZWdpb25zKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXREYXNoYm9hcmRSZWdpb25zIChjb25zdCBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9h
cmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpOwotICAgIAotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRM
aXN0ZW5lcnNGcm9tQWxsTm9kZXMoKTsKLQotICAgIHZvaWQgcmVnaXN0ZXJEaXNjb25uZWN0ZWRO
b2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsKLSAgICB2b2lkIHVucmVnaXN0
ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsKLSAg
ICAKLSAgICB2b2lkIHJhZGlvQnV0dG9uQ2hlY2tlZChIVE1MSW5wdXRFbGVtZW50SW1wbCAqY2Fs
bGVyLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1w
bCogY2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoRE9NU3RyaW5nSW1wbCogbmFtZSwgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZm9ybSk7Ci0gICAgdm9pZCByZW1vdmVSYWRpb0J1dHRvbkdyb3VwKERP
TVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pOwotCi1wcml2YXRl
OgotICAgIHZvaWQgdXBkYXRlVGl0bGUoKTsKLSAgICB2b2lkIHJlbW92ZUFsbERpc2Nvbm5lY3Rl
ZE5vZGVFdmVudExpc3RlbmVycygpOwotCi0gICAgSlNFZGl0b3IgKmpzRWRpdG9yKCk7Ci0KLSAg
ICBKU0VkaXRvciAqbV9qc0VkaXRvcjsKLSAgICBib29sIHJlbGlucXVpc2hlc0VkaXRpbmdGb2N1
cyhOb2RlSW1wbCAqbm9kZSk7Ci0gICAgYm9vbCBhY2NlcHRzRWRpdGluZ0ZvY3VzKE5vZGVJbXBs
ICpub2RlKTsKLQotICAgIG11dGFibGUgRE9NU3RyaW5nIG1fZG9tYWluOwotICAgIGJvb2wgbV9p
blBhZ2VDYWNoZTsKLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICptX3NhdmVkUmVuZGVyZXI7Ci0g
ICAgaW50IG1fcGFzc3dvcmRGaWVsZHM7Ci0gICAgaW50IG1fc2VjdXJlRm9ybXM7Ci0gICAgCi0g
ICAgUmVmUHRyPGtodG1sOjpEZWNvZGVyPiBtX2RlY29kZXI7Ci0KLSAgICBtdXRhYmxlIFFEaWN0
PEVsZW1lbnRJbXBsPiBtX2VsZW1lbnRzQnlJZDsKLSAgICBtdXRhYmxlIFFEaWN0PGNoYXI+IG1f
aWRDb3VudDsKLSAgICAKLSAgICBRRGljdDxFbGVtZW50SW1wbD4gbV9lbGVtZW50c0J5QWNjZXNz
S2V5OwotICAgIGJvb2wgbV9hY2Nlc3NLZXlEaWN0VmFsaWQ7Ci0gCi0gICAgYm9vbCBtX2NyZWF0
ZVJlbmRlcmVyczsKLSAgICAKLSAgICBJbmhlcml0ZWRCb29sIG1fZGVzaWduTW9kZTsKLSAgICAK
LSAgICBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gbV9kYXNoYm9hcmRS
ZWdpb25zOwotICAgIGJvb2wgbV9oYXNEYXNoYm9hcmRSZWdpb25zOwotICAgIGJvb2wgbV9kYXNo
Ym9hcmRSZWdpb25zRGlydHk7Ci0gICAgaW50IG1fc2VsZk9ubHlSZWZDb3VudDsKLSAgICB0eXBl
ZGVmIEhhc2hNYXA8RE9NU3RyaW5nSW1wbCosIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiwgUG9pbnRl
ckhhc2g8RE9NU3RyaW5nSW1wbCo+ID4gTmFtZVRvSW5wdXRNYXA7Ci0gICAgdHlwZWRlZiBIYXNo
TWFwPEhUTUxGb3JtRWxlbWVudEltcGwqLCBOYW1lVG9JbnB1dE1hcCosIFBvaW50ZXJIYXNoPEhU
TUxGb3JtRWxlbWVudEltcGwqPiA+IEZvcm1Ub0dyb3VwTWFwOwotICAgIEZvcm1Ub0dyb3VwTWFw
KiBtX3NlbGVjdGVkUmFkaW9CdXR0b25zOwotfTsKLQotY2xhc3MgRG9jdW1lbnRGcmFnbWVudElt
cGwgOiBwdWJsaWMgQ29udGFpbmVyTm9kZUltcGwKLXsKLXB1YmxpYzoKLSAgICBEb2N1bWVudEZy
YWdtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVy
cmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5h
bWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2RlICggYm9vbCBkZWVwICk7Ci0KLSAgICAv
LyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGNoaWxk
VHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0IHR5cGUgKTsKLQotICAgIHZpcnR1YWwgRE9NU3Ry
aW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci19OwotCi1jbGFzcyBEb2N1bWVudFR5cGVJbXBsIDogcHVi
bGljIE5vZGVJbXBsCi17Ci1wdWJsaWM6Ci0gICAgRG9jdW1lbnRUeXBlSW1wbChET01JbXBsZW1l
bnRhdGlvbkltcGwgKiwgRG9jdW1lbnRJbXBsICosIGNvbnN0IERPTVN0cmluZyAmbmFtZSwgY29u
c3QgRE9NU3RyaW5nICZwdWJsaWNJZCwgY29uc3QgRE9NU3RyaW5nICZzeXN0ZW1JZCk7Ci0gICAg
RG9jdW1lbnRUeXBlSW1wbChEb2N1bWVudEltcGwgKiwgY29uc3QgRE9NU3RyaW5nICZuYW1lLCBj
b25zdCBET01TdHJpbmcgJnB1YmxpY0lkLCBjb25zdCBET01TdHJpbmcgJnN5c3RlbUlkKTsKLSAg
ICBEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50SW1wbCAqLCBjb25zdCBEb2N1bWVudFR5cGVJbXBs
ICYpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBEb2N1bWVudFR5cGUK
LSAgICBOYW1lZE5vZGVNYXBJbXBsICplbnRpdGllcygpIGNvbnN0IHsgcmV0dXJuIG1fZW50aXRp
ZXMuZ2V0KCk7IH0KLSAgICBOYW1lZE5vZGVNYXBJbXBsICpub3RhdGlvbnMoKSBjb25zdCB7IHJl
dHVybiBtX25vdGF0aW9ucy5nZXQoKTsgfQotCi0gICAgRE9NU3RyaW5nIG5hbWUoKSBjb25zdCB7
IHJldHVybiBtX25hbWU7IH0KLSAgICBET01TdHJpbmcgcHVibGljSWQoKSBjb25zdCB7IHJldHVy
biBtX3B1YmxpY0lkOyB9Ci0gICAgRE9NU3RyaW5nIHN5c3RlbUlkKCkgY29uc3QgeyByZXR1cm4g
bV9zeXN0ZW1JZDsgfQotICAgIERPTVN0cmluZyBpbnRlcm5hbFN1YnNldCgpIGNvbnN0IHsgcmV0
dXJuIG1fc3Vic2V0OyB9Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVycmlkZGVuIGZyb20gcGFy
ZW50IGNsYXNzZXMKLSAgICB2aXJ0dWFsIERPTVN0cmluZyBub2RlTmFtZSgpIGNvbnN0OwotICAg
IHZpcnR1YWwgdW5zaWduZWQgc2hvcnQgbm9kZVR5cGUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIE5v
ZGVJbXBsICpjbG9uZU5vZGUoYm9vbCBkZWVwKTsKLQotICAgIC8vIE90aGVyIG1ldGhvZHMgKG5v
dCBwYXJ0IG9mIERPTSkKLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwgKmltcGxlbWVudGF0aW9u
KCkgY29uc3QgeyByZXR1cm4gbV9pbXBsZW1lbnRhdGlvbi5nZXQoKTsgfQotICAgIHZpcnR1YWwg
RE9NU3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgUmVmUHRyPERPTUlt
cGxlbWVudGF0aW9uSW1wbD4gbV9pbXBsZW1lbnRhdGlvbjsKLSAgICBSZWZQdHI8TmFtZWROb2Rl
TWFwSW1wbD4gbV9lbnRpdGllczsKLSAgICBSZWZQdHI8TmFtZWROb2RlTWFwSW1wbD4gbV9ub3Rh
dGlvbnM7Ci0KLSAgICBET01TdHJpbmcgbV9uYW1lOwotICAgIERPTVN0cmluZyBtX3B1YmxpY0lk
OwotICAgIERPTVN0cmluZyBtX3N5c3RlbUlkOwotICAgIERPTVN0cmluZyBtX3N1YnNldDsKLX07
Ci0KLX0gLy9uYW1lc3BhY2UKLQotI2VuZGlmCkluZGV4OiBraHRtbC94bWwvZG9tMl9yYW5nZWlt
cGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9kb20yX3JhbmdlaW1wbC5jcHAJKHJldmlz
aW9uIDEyMDIxKQorKysga2h0bWwveG1sL2RvbTJfcmFuZ2VpbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImRvbTJf
cmFuZ2VpbXBsLmgiCiAKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3Vt
ZW50SW1wbC5oIgogI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiZG9t
X3RleHRpbXBsLmgiCiAjaW5jbHVkZSAiZG9tX3htbGltcGwuaCIKSW5kZXg6IGtodG1sL3htbC9E
b2N1bWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3htbC9Eb2N1bWVudEltcGwuY3Bw
CShyZXZpc2lvbiAxMjAxNSkKKysrIGtodG1sL3htbC9Eb2N1bWVudEltcGwuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yMyw3ICsyMyw2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lu
Y2x1ZGUgImRvbV9kb2NpbXBsLmgiCiAKICNpbmNsdWRlICJkb20vZG9tX2V4Y2VwdGlvbi5oIgog
I2luY2x1ZGUgImRvbS9kb20yX2V2ZW50cy5oIgpAQCAtMzUsNiArMzQsOSBAQAogI2luY2x1ZGUg
InhtbC9kb20yX3ZpZXdzaW1wbC5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAieG1sL3htbF90b2tlbml6ZXIuaCIKKyNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbklt
cGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudFR5cGVJbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRG
cmFnbWVudEltcGwuaCIKIAogI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKICNpbmNsdWRlICJj
c3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgpAQCAtNTAsMTAgKzUyLDggQEAKICNpbmNsdWRlIDxxcmVn
ZXhwLmg+CiAjaW5jbHVkZSA8a2RlYnVnLmg+CiAKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVy
X2NhbnZhcy5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmgiCi0jaW5jbHVk
ZSAicmVuZGVyaW5nL3JlbmRlcl9pbWFnZS5oIgotI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJf
b2JqZWN0LmgiCisjaW5jbHVkZSAicmVuZGVyX2NhbnZhcy5oIgorI2luY2x1ZGUgInJlbmRlcl9m
cmFtZXMuaCIKICNpbmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKIAogI2luY2x1ZGUgIkZyYW1lVmll
dy5oIgpAQCAtNjcsNiArNjcsNyBAQAogI2luY2x1ZGUgImh0bWwvaHRtbF9kb2N1bWVudGltcGwu
aCIKICNpbmNsdWRlICJodG1sL2h0bWxfaGVhZGltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0bWxf
aW1hZ2VpbXBsLmgiCisjaW5jbHVkZSAiaHRtbC9odG1sX2Jhc2VpbXBsLmgiCiAjaW5jbHVkZSAi
SFRNTElucHV0RWxlbWVudEltcGwuaCIKICNpbmNsdWRlICJodG1sZmFjdG9yeS5oIgogCkBAIC03
Niw4ICs3Nyw2IEBACiAjaW5jbHVkZSAiZWRpdGluZy92aXNpYmxlX3Bvc2l0aW9uLmgiCiAjaW5j
bHVkZSAiZWRpdGluZy92aXNpYmxlX3RleHQuaCIKIAotI2luY2x1ZGUgPGtpby9qb2IuaD4KLQog
I2lmZGVmIEtIVE1MX1hTTFQKICNpbmNsdWRlICJ4c2xfc3R5bGVzaGVldGltcGwuaCIKICNpbmNs
dWRlICJ4c2x0X3Byb2Nlc3NvcmltcGwuaCIKQEAgLTk0LDEwICs5Myw4IEBAIHVzaW5nIFhCTDo6
WEJMQmluZGluZ01hbmFnZXI7CiAjaWYgU1ZHX1NVUFBPUlQKICNpbmNsdWRlICJTVkdOYW1lcy5o
IgogI2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudElt
cGwuaCIKICNpbmNsdWRlICJTVkdab29tRXZlbnRJbXBsLmgiCiAjaW5jbHVkZSAiU1ZHU3R5bGVF
bGVtZW50SW1wbC5oIgotI2luY2x1ZGUgImtjYW52YXMvZGV2aWNlL3F1YXJ0ei9LUmVuZGVyaW5n
RGV2aWNlUXVhcnR6LmgiCiAjZW5kaWYKIAogdXNpbmcgbmFtZXNwYWNlIERPTTsKQEAgLTExMiw4
ICsxMDksNiBAQCB1c2luZyBuYW1lc3BhY2Uga2h0bWw7CiAvLyBmb3IgZHVhbCBHNXMuIDopCiBj
b25zdCBpbnQgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0gMjUwOwogCi1ET01JbXBsZW1lbnRh
dGlvbkltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6bV9pbnN0YW5jZSA9IDA7Ci0KIC8vIFVz
ZSAxIHRvIHJlcHJlc2VudCB0aGUgZG9jdW1lbnQncyBkZWZhdWx0IGZvcm0uCiBIVE1MRm9ybUVs
ZW1lbnRJbXBsKiBjb25zdCBkZWZhdWx0Rm9ybSA9IChIVE1MRm9ybUVsZW1lbnRJbXBsKikgMTsK
IApAQCAtMTkwLDE4NSArMTg1LDYgQEAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFy
dChVQ2hhcgogICAgIHJldHVybiB0cnVlOwogfQogCi0vLyBGSVhNRTogQW4gaW1wbGVtZW50YXRp
b24gb2YgdGhpcyBpcyBzdGlsbCB3YWl0aW5nIGZvciBtZSB0byB1bmRlcnN0YW5kIHRoZSBkaXN0
aW5jdGlvbiBiZXR3ZWVuCi0vLyBhICJtYWxmb3JtZWQiIHF1YWxpZmllZCBuYW1lIGFuZCBvbmUg
d2l0aCBiYWQgY2hhcmFjdGVycyBpbiBpdC4gRm9yIGV4YW1wbGUsIGlzIGEgc2Vjb25kIGNvbG9u
Ci0vLyBhbiBpbGxlZ2FsIGNoYXJhY3RlciBvciBhIG1hbGZvcm1lZCBxdWFsaWZpZWQgbmFtZT8g
VGhpcyB3aWxsIGRldGVybWluZSBib3RoIHdoYXQgcGFyYW1ldGVycwotLy8gdGhpcyBmdW5jdGlv
biBuZWVkcyB0byB0YWtlIGFuZCBleGFjdGx5IHdoYXQgaXQgd2lsbCBkby4gU2hvdWxkIGFsc28g
YmUgZXhwb3J0ZWQgc28gdGhhdAotLy8gRWxlbWVudEltcGwgY2FuIHVzZSBpdCB0b28uCi1zdGF0
aWMgYm9vbCBxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQoY29uc3QgRE9NU3RyaW5nICYpCi17Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1ET01JbXBsZW1lbnRhdGlvbkltcGw6OkRPTUltcGxlbWVu
dGF0aW9uSW1wbCgpCi17Ci19Ci0KLURPTUltcGxlbWVudGF0aW9uSW1wbDo6fkRPTUltcGxlbWVu
dGF0aW9uSW1wbCgpCi17Ci19Ci0KLWJvb2wgRE9NSW1wbGVtZW50YXRpb25JbXBsOjpoYXNGZWF0
dXJlIChjb25zdCBET01TdHJpbmcgJmZlYXR1cmUsIGNvbnN0IERPTVN0cmluZyAmdmVyc2lvbikg
Y29uc3QKLXsKLSAgICBET01TdHJpbmcgbG93ZXIgPSBmZWF0dXJlLmxvd2VyKCk7Ci0gICAgaWYg
KGxvd2VyID09ICJjb3JlIiB8fCBsb3dlciA9PSAiaHRtbCIgfHwgbG93ZXIgPT0gInhtbCIgfHwg
bG93ZXIgPT0gInhodG1sIikKLSAgICAgICAgcmV0dXJuIHZlcnNpb24uaXNFbXB0eSgpIHx8IHZl
cnNpb24gPT0gIjEuMCIgfHwgdmVyc2lvbiA9PSAiMi4wIjsKLSAgICBpZiAobG93ZXIgPT0gImNz
cyIKLSAgICAgICAgICAgIHx8IGxvd2VyID09ICJjc3MyIgotICAgICAgICAgICAgfHwgbG93ZXIg
PT0gImV2ZW50cyIKLSAgICAgICAgICAgIHx8IGxvd2VyID09ICJodG1sZXZlbnRzIgotICAgICAg
ICAgICAgfHwgbG93ZXIgPT0gIm1vdXNlZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0g
Im11dGF0aW9uZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gInJhbmdlIgotICAgICAg
ICAgICAgfHwgbG93ZXIgPT0gInN0eWxlc2hlZXRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0g
InRyYXZlcnNhbCIKLSAgICAgICAgICAgIHx8IGxvd2VyID09ICJ1aWV2ZW50cyIKLSAgICAgICAg
ICAgIHx8IGxvd2VyID09ICJ2aWV3cyIpCi0gICAgICAgIHJldHVybiB2ZXJzaW9uLmlzRW1wdHko
KSB8fCB2ZXJzaW9uID09ICIyLjAiOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotRG9jdW1lbnRU
eXBlSW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVhdGVEb2N1bWVudFR5cGUoIGNvbnN0
IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgY29uc3QgRE9NU3RyaW5nICZwdWJsaWNJZCwKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBET01TdHJpbmcgJnN5c3RlbUlkLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAg
IC8vIE5vdCBtZW50aW9uZWQgaW4gc3BlYzogdGhyb3cgTkFNRVNQQUNFX0VSUiBpZiBubyBxdWFs
aWZpZWROYW1lIHN1cHBsaWVkCi0gICAgaWYgKHF1YWxpZmllZE5hbWUuaXNOdWxsKCkpIHsKLSAg
ICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gSU5WQUxJRF9DSEFSQUNURVJfRVJSOiBSYWlz
ZWQgaWYgdGhlIHNwZWNpZmllZCBxdWFsaWZpZWQgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNo
YXJhY3Rlci4KLSAgICBET01TdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYgKCFEb2N1
bWVudEltcGw6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2Fs
TmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6SU5WQUxJRF9D
SEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBOQU1FU1BB
Q0VfRVJSOiBSYWlzZWQgaWYgdGhlIHF1YWxpZmllZE5hbWUgaXMgbWFsZm9ybWVkLgotICAgIGlm
IChxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQocXVhbGlmaWVkTmFtZSkpIHsKLSAgICAgICAgZXhj
ZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNFX0VSUjsKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBEb2N1bWVudFR5cGVJbXBsKHRoaXMsIDAsIHF1
YWxpZmllZE5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci19Ci0KLURPTUltcGxlbWVudGF0aW9u
SW1wbCogRE9NSW1wbGVtZW50YXRpb25JbXBsOjpnZXRJbnRlcmZhY2UoY29uc3QgRE9NU3RyaW5n
JiAvKmZlYXR1cmUqLykgY29uc3QKLXsKLSAgICAvLyAjIyMKLSAgICByZXR1cm4gMDsKLX0KLQot
RG9jdW1lbnRJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6OmNyZWF0ZURvY3VtZW50KCBjb25z
dCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1l
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBE
b2N1bWVudFR5cGVJbXBsICpkb2N0eXBlLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKQotewotICAgIGV4
Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgaWYgKCFxdWFsaWZpZWROYW1lLmlzRW1wdHkoKSkgewot
ICAgICAgICAvLyBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVk
IHF1YWxpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGlsbGVnYWwgY2hhcmFjdGVyLgotICAgICAgICBE
T01TdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgICAgIGlmICghRG9jdW1lbnRJbXBsOjpw
YXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUpKSB7Ci0g
ICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpJTlZBTElEX0NIQVJBQ1RF
Ul9FUlI7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5B
TUVTUEFDRV9FUlI6Ci0gICAgICAgIC8vIC0gUmFpc2VkIGlmIHRoZSBxdWFsaWZpZWROYW1lIGlz
IG1hbGZvcm1lZCwKLSAgICAgICAgLy8gLSBpZiB0aGUgcXVhbGlmaWVkTmFtZSBoYXMgYSBwcmVm
aXggYW5kIHRoZSBuYW1lc3BhY2VVUkkgaXMgbnVsbCwgb3IKLSAgICAgICAgLy8gLSBpZiB0aGUg
cXVhbGlmaWVkTmFtZSBoYXMgYSBwcmVmaXggdGhhdCBpcyAieG1sIiBhbmQgdGhlIG5hbWVzcGFj
ZVVSSSBpcyBkaWZmZXJlbnQKLSAgICAgICAgLy8gICBmcm9tICJodHRwOi8vd3d3LnczLm9yZy9Y
TUwvMTk5OC9uYW1lc3BhY2UiIFtOYW1lc3BhY2VzXS4KLSAgICAgICAgaW50IGNvbG9ucG9zID0g
LTE7Ci0gICAgICAgIHVpbnQgaTsKLSAgICAgICAgRE9NU3RyaW5nSW1wbCAqcW5hbWUgPSBxdWFs
aWZpZWROYW1lLmltcGwoKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHFuYW1lLT5sICYmIGNv
bG9ucG9zIDwgMDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKCpxbmFtZSlbaV0gPT0gJzonKQot
ICAgICAgICAgICAgICAgIGNvbG9ucG9zID0gaTsKLSAgICAgICAgfQotICAgIAotICAgICAgICBp
ZiAocXVhbGlmaWVkTmFtZUlzTWFsZm9ybWVkKHF1YWxpZmllZE5hbWUpIHx8Ci0gICAgICAgICAg
ICAoY29sb25wb3MgPj0gMCAmJiBuYW1lc3BhY2VVUkkuaXNOdWxsKCkpIHx8Ci0gICAgICAgICAg
ICAoY29sb25wb3MgPT0gMyAmJiBxdWFsaWZpZWROYW1lWzBdID09ICd4JyAmJiBxdWFsaWZpZWRO
YW1lWzFdID09ICdtJyAmJiBxdWFsaWZpZWROYW1lWzJdID09ICdsJyAmJgotICAgICAgICAgICAg
IG5hbWVzcGFjZVVSSSAhPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIikp
IHsKLQotICAgICAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6TkFNRVNQQUNF
X0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAg
IC8vIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIGRvY3R5cGUgaGFzIGFscmVhZHkgYmVl
biB1c2VkIHdpdGggYSBkaWZmZXJlbnQgZG9jdW1lbnQgb3Igd2FzCi0gICAgLy8gY3JlYXRlZCBm
cm9tIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgotICAgIGlmIChkb2N0eXBlICYmIChkb2N0
eXBlLT5nZXREb2N1bWVudCgpIHx8IGRvY3R5cGUtPmltcGxlbWVudGF0aW9uKCkgIT0gdGhpcykp
IHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6V1JPTkdfRE9DVU1FTlRf
RVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyAjIyMgdGhpcyBpcyBjb21w
bGV0ZWx5IGJyb2tlbi4uIHdpdGhvdXQgYSB2aWV3IGl0IHdpbGwgbm90IHdvcmsgKERpcmspCi0g
ICAgRG9jdW1lbnRJbXBsICpkb2MgPSBuZXcgRG9jdW1lbnRJbXBsKHRoaXMsIDApOwotCi0gICAg
Ly8gbm93IGdldCB0aGUgaW50ZXJlc3RpbmcgcGFydHMgb2YgdGhlIGRvY3R5cGUKLSAgICBpZiAo
ZG9jdHlwZSkKLSAgICAgICAgZG9jLT5zZXREb2NUeXBlKG5ldyBEb2N1bWVudFR5cGVJbXBsKGRv
YywgKmRvY3R5cGUpKTsKLQotICAgIGlmICghcXVhbGlmaWVkTmFtZS5pc0VtcHR5KCkpIHsKLSAg
ICAgICAgRWxlbWVudEltcGwgKnJvb3RFbGVtZW50ID0gZG9jLT5jcmVhdGVFbGVtZW50TlMobmFt
ZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgZG9jLT5h
ZGRDaGlsZChyb290RWxlbWVudCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkb2M7Ci19Ci0K
LUNTU1N0eWxlU2hlZXRJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6OmNyZWF0ZUNTU1N0eWxl
U2hlZXQoY29uc3QgRE9NU3RyaW5nICYvKnRpdGxlKi8sIGNvbnN0IERPTVN0cmluZyAmbWVkaWEs
IGludCAmLypleGNlcHRpb24qLykKLXsKLSAgICAvLyAjIyMgVE9ETyA6IHRpdGxlIHNob3VsZCBi
ZSBzZXQsIGFuZCBtZWRpYSBjb3VsZCBoYXZlIHdyb25nIHN5bnRheCwgaW4gd2hpY2ggY2FzZSB3
ZSBzaG91bGQgZ2VuZXJhdGUgYW4gZXhjZXB0aW9uLgotICAgIENTU1N0eWxlU2hlZXRJbXBsICog
Y29uc3QgbnVsbFNoZWV0ID0gMDsKLSAgICBDU1NTdHlsZVNoZWV0SW1wbCAqc2hlZXQgPSBuZXcg
Q1NTU3R5bGVTaGVldEltcGwobnVsbFNoZWV0KTsKLSAgICBzaGVldC0+c2V0TWVkaWEobmV3IE1l
ZGlhTGlzdEltcGwoc2hlZXQsIG1lZGlhKSk7Ci0gICAgcmV0dXJuIHNoZWV0OwotfQotCi1Eb2N1
bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlRG9jdW1lbnQoIEtIVE1MVmll
dyAqdiApCi17Ci0gICAgcmV0dXJuIG5ldyBEb2N1bWVudEltcGwodGhpcywgdik7Ci19Ci0KLUhU
TUxEb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlSFRNTERvY3VtZW50
KCBLSFRNTFZpZXcgKnYgKQotewotICAgIHJldHVybiBuZXcgSFRNTERvY3VtZW50SW1wbCh0aGlz
LCB2KTsKLX0KLQotRE9NSW1wbGVtZW50YXRpb25JbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6
Omluc3RhbmNlKCkKLXsKLSAgICBpZiAoIW1faW5zdGFuY2UpIHsKLSAgICAgICAgbV9pbnN0YW5j
ZSA9IG5ldyBET01JbXBsZW1lbnRhdGlvbkltcGwoKTsKLSAgICAgICAgbV9pbnN0YW5jZS0+cmVm
KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1faW5zdGFuY2U7Ci19Ci0KLWJvb2wgRE9NSW1wbGVt
ZW50YXRpb25JbXBsOjppc1hNTE1JTUVUeXBlKGNvbnN0IERPTVN0cmluZyYgbWltZVR5cGUpCi17
Ci0gICAgaWYgKG1pbWVUeXBlID09ICJ0ZXh0L3htbCIgfHwgbWltZVR5cGUgPT0gImFwcGxpY2F0
aW9uL3htbCIgfHwgbWltZVR5cGUgPT0gImFwcGxpY2F0aW9uL3hodG1sK3htbCIgfHwKLSAgICAg
ICAgbWltZVR5cGUgPT0gInRleHQveHNsIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24vcnNz
K3htbCIgfHwgbWltZVR5cGUgPT0gImFwcGxpY2F0aW9uL2F0b20reG1sIgotI2lmIFNWR19TVVBQ
T1JUCi0gICAgICAgIHx8IG1pbWVUeXBlID09ICJpbWFnZS9zdmcreG1sIgotI2VuZGlmCi0gICAg
ICAgICkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1IVE1M
RG9jdW1lbnRJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6OmNyZWF0ZUhUTUxEb2N1bWVudChj
b25zdCBET01TdHJpbmcgJnRpdGxlKQotewotICAgIEhUTUxEb2N1bWVudEltcGwgKmQgPSBjcmVh
dGVIVE1MRG9jdW1lbnQoIDAgLyogIyMjIGNyZWF0ZSBhIHZpZXcgb3RoZXJ3aXNlIGl0IGRvZXNu
J3Qgd29yayAqLyk7Ci0gICAgZC0+b3BlbigpOwotICAgIC8vIEZJWE1FOiBOZWVkIHRvIGVzY2Fw
ZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIHRpdGxlPwotICAgIGQtPndyaXRlKCI8aHRtbD48
aGVhZD48dGl0bGU+IiArIHRpdGxlLnFzdHJpbmcoKSArICI8L3RpdGxlPjwvaGVhZD4iKTsKLSAg
ICByZXR1cm4gZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFFQdHJMaXN0PERvY3VtZW50
SW1wbD4gKiBEb2N1bWVudEltcGw6OmNoYW5nZWREb2N1bWVudHMgPSAwOwogCiAvLyBLSFRNTFZp
ZXcgbWlnaHQgYmUgMApAQCAtNTc1LDYgKzM5MSwxMSBAQCB2b2lkIERvY3VtZW50SW1wbDo6cmVz
ZXRBY3RpdmVMaW5rQ29sb3IoCiAgICAgbV9hY3RpdmVMaW5rQ29sb3Iuc2V0TmFtZWRDb2xvcihR
U3RyaW5nKCJyZWQiKSk7CiB9CiAKK3ZvaWQgRG9jdW1lbnRJbXBsOjpzZXREb2NUeXBlKERvY3Vt
ZW50VHlwZUltcGwgKmRvY1R5cGUpCit7CisgICAgbV9kb2NUeXBlID0gZG9jVHlwZTsKK30KKwog
RG9jdW1lbnRUeXBlSW1wbCAqRG9jdW1lbnRJbXBsOjpkb2N0eXBlKCkgY29uc3QKIHsKICAgICBy
ZXR1cm4gbV9kb2NUeXBlLmdldCgpOwpAQCAtMjgyOSw4ICsyNjUwLDYgQEAgRE9NU3RyaW5nIERv
Y3VtZW50SW1wbDo6dG9TdHJpbmcoKSBjb25zdAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLQot
Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gU3VwcG9ydCBmb3IgSmF2YXNjcmlwdCBleGVjQ29t
bWFuZCwgYW5kIHJlbGF0ZWQgbWV0aG9kcwogCiBKU0VkaXRvciAqRG9jdW1lbnRJbXBsOjpqc0Vk
aXRvcigpCkBAIC0yODcwLDcgKzI2ODksNiBAQCBET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpxdWVy
eUNvbW1hbmRWYWx1CiAgICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZFZhbHVlKGNv
bW1hbmQpOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHZvaWQgRG9jdW1lbnRJbXBs
OjphZGRNYXJrZXIoUmFuZ2VJbXBsICpyYW5nZSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUg
dHlwZSkKIHsKQEAgLTMzMDksMTE3ICszMTI3LDMgQEAgUmVmUHRyPE5hbWVOb2RlTGlzdEltcGw+
IERvY3VtZW50SW1wbDo6ZwogewogICAgIHJldHVybiBSZWZQdHI8TmFtZU5vZGVMaXN0SW1wbD4o
bmV3IE5hbWVOb2RlTGlzdEltcGwodGhpcywgZWxlbWVudE5hbWUpKTsKIH0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi1Eb2N1bWVudEZyYWdtZW50SW1wbDo6RG9jdW1lbnRGcmFnbWVudElt
cGwoRG9jdW1lbnRJbXBsICpkb2MpIDogQ29udGFpbmVyTm9kZUltcGwoZG9jKQotewotfQotCi1E
T01TdHJpbmcgRG9jdW1lbnRGcmFnbWVudEltcGw6Om5vZGVOYW1lKCkgY29uc3QKLXsKLSAgcmV0
dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOwotfQotCi11bnNpZ25lZCBzaG9ydCBEb2N1bWVudEZy
YWdtZW50SW1wbDo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJldHVybiBOb2RlOjpET0NVTUVO
VF9GUkFHTUVOVF9OT0RFOwotfQotCi0vLyBET00gU2VjdGlvbiAxLjEuMQotYm9vbCBEb2N1bWVu
dEZyYWdtZW50SW1wbDo6Y2hpbGRUeXBlQWxsb3dlZCggdW5zaWduZWQgc2hvcnQgdHlwZSApCi17
Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTm9kZTo6RUxFTUVOVF9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6OlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKLSAgICAgICAg
Y2FzZSBOb2RlOjpDT01NRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6VEVYVF9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERToKLSAgICAgICAgY2FzZSBOb2Rl
OjpFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAg
ICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLURPTVN0
cmluZyBEb2N1bWVudEZyYWdtZW50SW1wbDo6dG9TdHJpbmcoKSBjb25zdAotewotICAgIERPTVN0
cmluZyByZXN1bHQ7Ci0KLSAgICBmb3IgKE5vZGVJbXBsICpjaGlsZCA9IGZpcnN0Q2hpbGQoKTsg
Y2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgewotCXJlc3VsdCAr
PSBjaGlsZC0+dG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0K
LU5vZGVJbXBsICpEb2N1bWVudEZyYWdtZW50SW1wbDo6Y2xvbmVOb2RlIChib29sIGRlZXApCi17
Ci0gICAgRG9jdW1lbnRGcmFnbWVudEltcGwgKmNsb25lID0gbmV3IERvY3VtZW50RnJhZ21lbnRJ
bXBsKGdldERvY3VtZW50KCkpOwotICAgIGlmIChkZWVwKQotICAgICAgICBjbG9uZUNoaWxkTm9k
ZXMoY2xvbmUpOwotICAgIHJldHVybiBjbG9uZTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tCi0KLURvY3VtZW50VHlwZUltcGw6OkRvY3VtZW50VHlwZUltcGwoRE9NSW1wbGVtZW50YXRp
b25JbXBsICppLCBEb2N1bWVudEltcGwgKmRvYywgY29uc3QgRE9NU3RyaW5nICZuLCBjb25zdCBE
T01TdHJpbmcgJnAsIGNvbnN0IERPTVN0cmluZyAmcykKLSAgICA6IE5vZGVJbXBsKGRvYyksIG1f
aW1wbGVtZW50YXRpb24oaSksIG1fbmFtZShuKSwgbV9wdWJsaWNJZChwKSwgbV9zeXN0ZW1JZChz
KQotewotfQotCi1Eb2N1bWVudFR5cGVJbXBsOjpEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50SW1w
bCAqZG9jLCBjb25zdCBET01TdHJpbmcgJm4sIGNvbnN0IERPTVN0cmluZyAmcCwgY29uc3QgRE9N
U3RyaW5nICZzKQotICAgIDogTm9kZUltcGwoZG9jKSwgbV9uYW1lKG4pLCBtX3B1YmxpY0lkKHAp
LCBtX3N5c3RlbUlkKHMpCi17Ci19Ci0KLURvY3VtZW50VHlwZUltcGw6OkRvY3VtZW50VHlwZUlt
cGwoRG9jdW1lbnRJbXBsICpkb2MsIGNvbnN0IERvY3VtZW50VHlwZUltcGwgJnQpCi0gICAgOiBO
b2RlSW1wbChkb2MpLCBtX2ltcGxlbWVudGF0aW9uKHQubV9pbXBsZW1lbnRhdGlvbikKLSAgICAs
IG1fbmFtZSh0Lm1fbmFtZSksIG1fcHVibGljSWQodC5tX3B1YmxpY0lkKSwgbV9zeXN0ZW1JZCh0
Lm1fc3lzdGVtSWQpLCBtX3N1YnNldCh0Lm1fc3Vic2V0KQotewotfQotCi1ET01TdHJpbmcgRG9j
dW1lbnRUeXBlSW1wbDo6dG9TdHJpbmcoKSBjb25zdAotewotICAgIGlmIChtX25hbWUuaXNFbXB0
eSgpKQotICAgICAgICByZXR1cm4gIiI7Ci0KLSAgICBET01TdHJpbmcgcmVzdWx0ID0gIjwhRE9D
VFlQRSAiOwotICAgIHJlc3VsdCArPSBtX25hbWU7Ci0gICAgaWYgKCFtX3B1YmxpY0lkLmlzRW1w
dHkoKSkgewotCXJlc3VsdCArPSAiIFBVQkxJQyBcIiI7Ci0JcmVzdWx0ICs9IG1fcHVibGljSWQ7
Ci0JcmVzdWx0ICs9ICJcIiBcIiI7Ci0JcmVzdWx0ICs9IG1fc3lzdGVtSWQ7Ci0JcmVzdWx0ICs9
ICJcIiI7Ci0gICAgfSBlbHNlIGlmICghbV9zeXN0ZW1JZC5pc0VtcHR5KCkpIHsKLQlyZXN1bHQg
Kz0gIiBTWVNURU0gXCIiOwotCXJlc3VsdCArPSBtX3N5c3RlbUlkOwotCXJlc3VsdCArPSAiXCIi
OwotICAgIH0KLSAgICBpZiAoIW1fc3Vic2V0LmlzRW1wdHkoKSkgewotCXJlc3VsdCArPSAiIFsi
OwotCXJlc3VsdCArPSBtX3N1YnNldDsKLQlyZXN1bHQgKz0gIl0iOwotICAgIH0KLSAgICByZXN1
bHQgKz0gIj4iOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudFR5
cGVJbXBsOjpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG5hbWUoKTsKLX0KLQotdW5z
aWduZWQgc2hvcnQgRG9jdW1lbnRUeXBlSW1wbDo6bm9kZVR5cGUoKSBjb25zdAotewotICAgIHJl
dHVybiBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU7Ci19Ci0KLU5vZGVJbXBsICpEb2N1bWVudFR5
cGVJbXBsOjpjbG9uZU5vZGUoYm9vbCAvKmRlZXAqLykKLXsKLSAgICAvLyBUaGUgRE9NIExldmVs
IDIgc3BlY2lmaWNhdGlvbiBzYXlzIGNsb25pbmcgRG9jdW1lbnRUeXBlIG5vZGVzIGlzICJpbXBs
ZW1lbnRhdGlvbiBkZXBlbmRlbnQiIHNvIGZvciBub3cgd2UgZG8gbm90IHN1cHBvcnQgaXQuCi0g
ICAgcmV0dXJuIDA7Ci19CkluZGV4OiBraHRtbC94bWwvZG9tX25vZGVpbXBsLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBraHRtbC94bWwvZG9tX25vZGVpbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBr
aHRtbC94bWwvZG9tX25vZGVpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNyArMzAsOCBA
QAogI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3Rl
eHRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInht
bC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgorI2luY2x1ZGUgIkRP
TUltcGxlbWVudGF0aW9uSW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fcG9zaXRpb24uaCIKICNp
bmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5o
IgpJbmRleDoga2h0bWwveG1sL0RPTUltcGxlbWVudGF0aW9uSW1wbC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0ga2h0bWwveG1sL0RPTUltcGxlbWVudGF0aW9uSW1wbC5jcHAJKHJldmlzaW9uIDEyMDE1KQor
Kysga2h0bWwveG1sL0RPTUltcGxlbWVudGF0aW9uSW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIzLDE3MyArMjMsMTggQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
ZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbkltcGwuaCIKKyNpbmNs
dWRlICJEb2N1bWVudFR5cGVJbXBsLmgiCisjaW5jbHVkZSAiaHRtbF9kb2N1bWVudGltcGwuaCIK
KworI2luY2x1ZGUgImRvbV9zdHJpbmcuaCIKKyNpbmNsdWRlICJkb21fZXhjZXB0aW9uLmgiCisj
aW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCiAKLSNpbmNsdWRlICJkb20vZG9tX2V4Y2Vw
dGlvbi5oIgotI2luY2x1ZGUgImRvbS9kb20yX2V2ZW50cy5oIgotCi0jaW5jbHVkZSAieG1sL2Rv
bV90ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21feG1saW1wbC5oIgotI2luY2x1ZGUgInht
bC9kb20yX3JhbmdlaW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKLSNp
bmNsdWRlICJ4bWwvZG9tMl92aWV3c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5o
IgotI2luY2x1ZGUgInhtbC94bWxfdG9rZW5pemVyLmgiCi0KLSNpbmNsdWRlICJjc3MvY3NzaGVs
cGVyLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJjc3Mv
Y3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAiY3NzL2Nzc192YWx1ZWltcGwuaCIKLSNp
bmNsdWRlICJtaXNjL2hlbHBlci5oIgotI2luY2x1ZGUgIkRvY0xvYWRlci5oIgotI2luY2x1ZGUg
ImVjbWEva2pzX3Byb3h5LmgiCi0jaW5jbHVkZSAiZWNtYS9ranNfYmluZGluZy5oIgotCi0jaW5j
bHVkZSA8cXB0cnN0YWNrLmg+Ci0jaW5jbHVkZSA8cXBhaW50ZGV2aWNlbWV0cmljcy5oPgotI2lu
Y2x1ZGUgPHFyZWdleHAuaD4KLSNpbmNsdWRlIDxrZGVidWcuaD4KLQotI2luY2x1ZGUgInJlbmRl
cmluZy9yZW5kZXJfY2FudmFzLmgiCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMu
aCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2ltYWdlLmgiCi0jaW5jbHVkZSAicmVuZGVy
aW5nL3JlbmRlcl9vYmplY3QuaCIKLSNpbmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKLQotI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgotI2luY2x1ZGUgIk1hY0ZyYW1lLmgiCi0jaW5jbHVkZSAiRnJhbWVQ
cml2YXRlLmgiCi0KLSNpbmNsdWRlIDxrZ2xvYmFsc2V0dGluZ3MuaD4KLSNpbmNsdWRlICJraHRt
bF9zZXR0aW5ncy5oIgotCi0vLyBGSVhNRTogV2Ugd2FudCB0byBjdXQgdGhlIHJlbWFpbmluZyBI
VE1MIGRlcGVuZGVuY2llcyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gaW5jbHVkZSB0aGVzZSBm
aWxlcy4KLSNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgiCi0jaW5jbHVkZSAiaHRt
bC9odG1sX2hlYWRpbXBsLmgiCi0jaW5jbHVkZSAiaHRtbC9odG1sX2ltYWdlaW1wbC5oIgotI2lu
Y2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCi0jaW5jbHVkZSAiaHRtbGZhY3RvcnkuaCIK
LQotI2luY2x1ZGUgImNzc3ZhbHVlcy5oIgotCi0jaW5jbHVkZSAiZWRpdGluZy9qc2VkaXRpbmcu
aCIKLSNpbmNsdWRlICJlZGl0aW5nL3Zpc2libGVfcG9zaXRpb24uaCIKLSNpbmNsdWRlICJlZGl0
aW5nL3Zpc2libGVfdGV4dC5oIgotCi0jaW5jbHVkZSA8a2lvL2pvYi5oPgotCi0jaWZkZWYgS0hU
TUxfWFNMVAotI2luY2x1ZGUgInhzbF9zdHlsZXNoZWV0aW1wbC5oIgotI2luY2x1ZGUgInhzbHRf
cHJvY2Vzc29yaW1wbC5oIgotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0jaW5jbHVk
ZSAieGJsL3hibF9iaW5kaW5nX21hbmFnZXIuaCIKLXVzaW5nIFhCTDo6WEJMQmluZGluZ01hbmFn
ZXI7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIktXUUFjY09iamVjdENhY2hlLmgiCi0jaW5jbHVkZSAi
S1dRTG9nZ2luZy5oIgotCi0jaWYgU1ZHX1NVUFBPUlQKLSNpbmNsdWRlICJTVkdOYW1lcy5oIgot
I2luY2x1ZGUgIlNWR0VsZW1lbnRGYWN0b3J5LmgiCi0jaW5jbHVkZSAiU1ZHRWxlbWVudEltcGwu
aCIKLSNpbmNsdWRlICJTVkdab29tRXZlbnRJbXBsLmgiCi0jaW5jbHVkZSAiU1ZHU3R5bGVFbGVt
ZW50SW1wbC5oIgotI2luY2x1ZGUgImtjYW52YXMvZGV2aWNlL3F1YXJ0ei9LUmVuZGVyaW5nRGV2
aWNlUXVhcnR6LmgiCi0jZW5kaWYKLQotdXNpbmcgbmFtZXNwYWNlIERPTTsKLXVzaW5nIG5hbWVz
cGFjZSBET006OkV2ZW50TmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwotdXNpbmcg
bmFtZXNwYWNlIGtodG1sOwotCi0vLyAjZGVmaW5lIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJ
TkcgMQotCi0vLyBUaGlzIGFtb3VudCBvZiB0aW1lIG11c3QgaGF2ZSBlbGFwc2VkIGJlZm9yZSB3
ZSB3aWxsIGV2ZW4gY29uc2lkZXIgc2NoZWR1bGluZyBhIGxheW91dCB3aXRob3V0IGEgZGVsYXku
Ci0vLyBGSVhNRTogRm9yIGZhc3RlciBtYWNoaW5lcyB0aGlzIHZhbHVlIGNhbiByZWFsbHkgYmUg
bG93ZXJlZCB0byAyMDAuICAyNTAgaXMgYWRlcXVhdGUsIGJ1dCBhIGxpdHRsZSBoaWdoCi0vLyBm
b3IgZHVhbCBHNXMuIDopCi1jb25zdCBpbnQgY0xheW91dFNjaGVkdWxlVGhyZXNob2xkID0gMjUw
OworbmFtZXNwYWNlIERPTSB7CiAKIERPTUltcGxlbWVudGF0aW9uSW1wbCAqRE9NSW1wbGVtZW50
YXRpb25JbXBsOjptX2luc3RhbmNlID0gMDsKIAotLy8gVXNlIDEgdG8gcmVwcmVzZW50IHRoZSBk
b2N1bWVudCdzIGRlZmF1bHQgZm9ybS4KLUhUTUxGb3JtRWxlbWVudEltcGwqIGNvbnN0IGRlZmF1
bHRGb3JtID0gKEhUTUxGb3JtRWxlbWVudEltcGwqKSAxOwotCi0vLyBET00gTGV2ZWwgMiBzYXlz
IChsZXR0ZXJzIGFkZGVkKToKLS8vCi0vLyBhKSBOYW1lIHN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBo
YXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwgTHUsIExvLCBMdCwgTmwuCi0vLyBiKSBOYW1l
IGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9u
ZSBvZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1uLCBMbSwgb3IgTmQuCi0vLyBjKSBDaGFyYWN0
ZXJzIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEgKGkuZS4gd2l0aCBjaGFyYWN0ZXIgY29kZSBn
cmVhdGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRoYW4gI3hGRkZFKSBhcmUgbm90IGFsbG93ZWQg
aW4gWE1MIG5hbWVzLgotLy8gZCkgQ2hhcmFjdGVycyB3aGljaCBoYXZlIGEgZm9udCBvciBjb21w
YXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4gdGhvc2Ugd2l0aCBhICJjb21wYXRpYmlsaXR5
IGZvcm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9mIHRoZSBkYXRhYmFzZSAtLSBtYXJrZWQgYnkg
ZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8IikgYXJlIG5vdCBhbGxvd2VkLgotLy8gZSkgVGhl
IGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVy
cyByYXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMsIGJlY2F1c2UgdGhlIHByb3BlcnR5IGZpbGUg
Y2xhc3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6IFsjeDAyQkItI3gwMkMxXSwgI3gwNTU5LCAj
eDA2RTUsICN4MDZFNi4KLS8vIGYpIENoYXJhY3RlcnMgI3gyMERELSN4MjBFMCBhcmUgZXhjbHVk
ZWQgKGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlLCBzZWN0aW9uIDUuMTQpLgotLy8gZykgQ2hh
cmFjdGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFzIGFuIGV4dGVuZGVyLCBiZWNhdXNlIHRoZSBw
cm9wZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQuCi0vLyBoKSBDaGFyYWN0ZXIgI3gwMzg3IGlz
IGFkZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJlY2F1c2UgI3gwMEI3IGlzIGl0cyBjYW5vbmlj
YWwgZXF1aXZhbGVudC4KLS8vIGkpIENoYXJhY3RlcnMgJzonIGFuZCAnXycgYXJlIGFsbG93ZWQg
YXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLgotLy8gaikgQ2hhcmFjdGVycyAnLScgYW5kICcuJyBh
cmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMuCi0vLwotLy8gSXQgYWxzbyBjb250YWlucyBj
b21wbGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBpdCdzIGJldHRlciwgd2UgY291bGQgaW5jbHVk
ZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcgY29kZS4KLQotc3RhdGljIGlubGluZSBi
b29sIGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBjKQotewotICAgIC8vIHJ1bGUgKGUpIGFib3Zl
Ci0gICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9IDB4MDJDMSkgfHwgYyA9PSAweDU1OSB8fCBj
ID09IDB4NkU1IHx8IGMgPT0gMHg2RTYpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8g
cnVsZSAoaSkgYWJvdmUKLSAgICBpZiAoYyA9PSAnOicgfHwgYyA9PSAnXycpCi0gICAgICAgIHJl
dHVybiB0cnVlOwotCi0gICAgLy8gcnVsZXMgKGEpIGFuZCAoZikgYWJvdmUKLSAgICBjb25zdCB1
aW50MzJfdCBuYW1lU3RhcnRNYXNrID0gVV9HQ19MTF9NQVNLIHwgVV9HQ19MVV9NQVNLIHwgVV9H
Q19MT19NQVNLIHwgVV9HQ19MVF9NQVNLIHwgVV9HQ19OTF9NQVNLOwotICAgIGlmICghKFVfR0VU
X0dDX01BU0soYykgJiBuYW1lU3RhcnRNYXNrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gcnVsZSAoYykgYWJvdmUKLSAgICBpZiAoYyA+PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkK
LSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoZCkgYWJvdmUKLSAgICBVRGVj
b21wb3NpdGlvblR5cGUgZGVjb21wVHlwZSA9IHN0YXRpY19jYXN0PFVEZWNvbXBvc2l0aW9uVHlw
ZT4odV9nZXRJbnRQcm9wZXJ0eVZhbHVlKGMsIFVDSEFSX0RFQ09NUE9TSVRJT05fVFlQRSkpOwot
ICAgIGlmIChkZWNvbXBUeXBlID09IFVfRFRfRk9OVCB8fCBkZWNvbXBUeXBlID09IFVfRFRfQ09N
UEFUKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3Rh
dGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChVQ2hhcjMyIGMpCi17Ci0gICAgLy8gcnVs
ZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBpZiAoaXNWYWxpZE5hbWVTdGFydChjKSkK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoZykgYW5kIChoKSBhYm92ZQot
ICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4NykKLSAgICAgICAgcmV0dXJuIHRydWU7
Ci0KLSAgICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlmIChjID09ICctJyB8fCBjID09ICcuJykK
LSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlcyAoYikgYW5kIChmKSBhYm92ZQot
ICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRNYXNrID0gVV9HQ19NQ19NQVNLIHwgVV9H
Q19NRV9NQVNLIHwgVV9HQ19NTl9NQVNLIHwgVV9HQ19MTV9NQVNLIHwgVV9HQ19ORF9NQVNLOwot
ICAgIGlmICghKFVfR0VUX0dDX01BU0soYykgJiBvdGhlck5hbWVQYXJ0TWFzaykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGMpIGFib3ZlCi0gICAgaWYgKGMgPj0gMHhG
OTAwICYmIGMgPCAweEZGRkUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUg
KGQpIGFib3ZlCi0gICAgVURlY29tcG9zaXRpb25UeXBlIGRlY29tcFR5cGUgPSBzdGF0aWNfY2Fz
dDxVRGVjb21wb3NpdGlvblR5cGU+KHVfZ2V0SW50UHJvcGVydHlWYWx1ZShjLCBVQ0hBUl9ERUNP
TVBPU0lUSU9OX1RZUEUpKTsKLSAgICBpZiAoZGVjb21wVHlwZSA9PSBVX0RUX0ZPTlQgfHwgZGVj
b21wVHlwZSA9PSBVX0RUX0NPTVBBVCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0
dXJuIHRydWU7Ci19Ci0KIC8vIEZJWE1FOiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGlzIHN0
aWxsIHdhaXRpbmcgZm9yIG1lIHRvIHVuZGVyc3RhbmQgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4K
IC8vIGEgIm1hbGZvcm1lZCIgcXVhbGlmaWVkIG5hbWUgYW5kIG9uZSB3aXRoIGJhZCBjaGFyYWN0
ZXJzIGluIGl0LiBGb3IgZXhhbXBsZSwgaXMgYSBzZWNvbmQgY29sb24KIC8vIGFuIGlsbGVnYWwg
Y2hhcmFjdGVyIG9yIGEgbWFsZm9ybWVkIHF1YWxpZmllZCBuYW1lPyBUaGlzIHdpbGwgZGV0ZXJt
aW5lIGJvdGggd2hhdCBwYXJhbWV0ZXJzCkBAIC0zNjcsMzA1OSArMjEyLDQgQEAgSFRNTERvY3Vt
ZW50SW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOgogICAgIHJldHVybiBkOwogfQogCi0vLyAt
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0KLQotUVB0ckxpc3Q8RG9jdW1lbnRJbXBsPiAqIERvY3VtZW50SW1wbDo6
Y2hhbmdlZERvY3VtZW50cyA9IDA7Ci0KLS8vIEtIVE1MVmlldyBtaWdodCBiZSAwCi1Eb2N1bWVu
dEltcGw6OkRvY3VtZW50SW1wbChET01JbXBsZW1lbnRhdGlvbkltcGwgKl9pbXBsZW1lbnRhdGlv
biwgS0hUTUxWaWV3ICp2KQotICAgIDogQ29udGFpbmVyTm9kZUltcGwoMCkKLSAgICAgICwgbV9k
b210cmVlX3ZlcnNpb24oMCkKLSAgICAgICwgbV90aXRsZSgiIikKLSAgICAgICwgbV90aXRsZVNl
dEV4cGxpY2l0bHkoZmFsc2UpCi0gICAgICAsIG1faW1hZ2VMb2FkRXZlbnRUaW1lcigwKQotI2lm
bmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICwgbV9iaW5kaW5nTWFuYWdlcihuZXcgWEJMQmluZGlu
Z01hbmFnZXIodGhpcykpCi0jZW5kaWYKLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgLCBtX3RyYW5z
Zm9ybVNvdXJjZSgwKQotI2VuZGlmCi0gICAgLCBtX2ZpbmlzaGVkUGFyc2luZyh0aGlzLCBTSUdO
QUwoZmluaXNoZWRQYXJzaW5nKCkpKQotICAgICwgbV9pblBhZ2VDYWNoZShmYWxzZSkKLSAgICAs
IG1fc2F2ZWRSZW5kZXJlcigwKQotICAgICwgbV9wYXNzd29yZEZpZWxkcygwKQotICAgICwgbV9z
ZWN1cmVGb3JtcygwKQotICAgICwgbV9jcmVhdGVSZW5kZXJlcnModHJ1ZSkKLSAgICAsIG1fZGVz
aWduTW9kZShpbmhlcml0KQotICAgICwgbV9oYXNEYXNoYm9hcmRSZWdpb25zKGZhbHNlKQotICAg
ICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHkoZmFsc2UpCi0gICAgLCBtX3NlbGZPbmx5UmVmQ291
bnQoMCkKLSAgICAsIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMoMCkKLXsKLSAgICBkb2N1bWVudC5y
ZXNldFNraXBwaW5nUmVmKHRoaXMpOwotCi0gICAgbV9wYWludERldmljZSA9IDA7Ci0gICAgbV9w
YWludERldmljZU1ldHJpY3MgPSAwOwotCi0gICAgbV92aWV3ID0gdjsKLSAgICBtX3JlbmRlckFy
ZW5hID0gMDsKLQotICAgIG1fYWNjQ2FjaGUgPSAwOwotICAgIAotICAgIGlmICggdiApIHsKLSAg
ICAgICAgbV9kb2NMb2FkZXIgPSBuZXcgRG9jTG9hZGVyKHYtPmZyYW1lKCksIHRoaXMgKTsKLSAg
ICAgICAgc2V0UGFpbnREZXZpY2UoIG1fdmlldyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAg
IG1fZG9jTG9hZGVyID0gbmV3IERvY0xvYWRlciggMCwgdGhpcyApOwotCi0gICAgdmlzdWFsbHlP
cmRlcmVkID0gZmFsc2U7Ci0gICAgbV9sb2FkaW5nU2hlZXQgPSBmYWxzZTsKLSAgICBtX2JQYXJz
aW5nID0gZmFsc2U7Ci0gICAgbV9kb2NDaGFuZ2VkID0gZmFsc2U7Ci0gICAgbV9zaGVldCA9IDA7
Ci0gICAgbV9lbGVtU2hlZXQgPSAwOwotICAgIG1fdG9rZW5pemVyID0gMDsKLQotICAgIG1faW1w
bGVtZW50YXRpb24gPSBfaW1wbGVtZW50YXRpb247Ci0gICAgaWYgKG1faW1wbGVtZW50YXRpb24p
Ci0gICAgICAgIG1faW1wbGVtZW50YXRpb24tPnJlZigpOwotICAgIHBNb2RlID0gU3RyaWN0Owot
ICAgIGhNb2RlID0gWEh0bWw7Ci0gICAgbV90ZXh0Q29sb3IgPSBRdDo6YmxhY2s7Ci0gICAgbV9l
bGVtZW50TmFtZXMgPSAwOwotICAgIG1fZWxlbWVudE5hbWVBbGxvYyA9IDA7Ci0gICAgbV9lbGVt
ZW50TmFtZUNvdW50ID0gMDsKLSAgICBtX2F0dHJOYW1lcyA9IDA7Ci0gICAgbV9hdHRyTmFtZUFs
bG9jID0gMDsKLSAgICBtX2F0dHJOYW1lQ291bnQgPSAwOwotICAgIG1fZGVmYXVsdFZpZXcgPSBu
ZXcgQWJzdHJhY3RWaWV3SW1wbCh0aGlzKTsKLSAgICBtX2RlZmF1bHRWaWV3LT5yZWYoKTsKLSAg
ICBtX2xpc3RlbmVyVHlwZXMgPSAwOwotICAgIG1fc3R5bGVTaGVldHMgPSBuZXcgU3R5bGVTaGVl
dExpc3RJbXBsOwotICAgIG1fc3R5bGVTaGVldHMtPnJlZigpOwotICAgIG1faW5Eb2N1bWVudCA9
IHRydWU7Ci0gICAgbV9zdHlsZVNlbGVjdG9yRGlydHkgPSBmYWxzZTsKLSAgICBtX2luU3R5bGVS
ZWNhbGMgPSBmYWxzZTsKLSAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwotICAg
IG1fdXNlc0Rlc2NlbmRhbnRSdWxlcyA9IGZhbHNlOwotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9
IGZhbHNlOwotCi0gICAgbV9zdHlsZVNlbGVjdG9yID0gbmV3IENTU1N0eWxlU2VsZWN0b3IodGhp
cywgbV91c2Vyc2hlZXQsIG1fc3R5bGVTaGVldHMsICFpbkNvbXBhdE1vZGUoKSk7Ci0gICAgbV93
aW5kb3dFdmVudExpc3RlbmVycy5zZXRBdXRvRGVsZXRlKHRydWUpOwotICAgIG1fcGVuZGluZ1N0
eWxlc2hlZXRzID0gMDsKLSAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IGZhbHNlOwot
Ci0gICAgbV9jc3NUYXJnZXQgPSAwOwotICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7
Ci0KLSAgICByZXNldExpbmtDb2xvcigpOwotICAgIHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwot
ICAgIHJlc2V0QWN0aXZlTGlua0NvbG9yKCk7Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQg
PSBmYWxzZTsKLSAgICBtX3N0YXJ0VGltZS5yZXN0YXJ0KCk7Ci0gICAgbV9vdmVyTWluaW11bUxh
eW91dFRocmVzaG9sZCA9IGZhbHNlOwotICAgIAotICAgIG1fanNFZGl0b3IgPSAwOwotCi0gICAg
bV9tYXJrZXJzLnNldEF1dG9EZWxldGUodHJ1ZSk7Ci0gICAgCi0gICAgc3RhdGljIGludCBkb2NJ
RCA9IDA7Ci0gICAgbV9kb2NJRCA9IGRvY0lEKys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpy
ZW1vdmVkTGFzdFJlZigpCi17Ci0gICAgaWYgKG1fc2VsZk9ubHlSZWZDb3VudCkgewotICAgICAg
ICAvLyBpZiByZW1vdmluZyBhIGNoaWxkIHJlbW92ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJlZiwg
d2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0aGUgZG9jdW1lbnQgdG8gYmUgZGVzdHJ1Y3RlZCB1
bnRpbCBhZnRlcgotICAgICAgICAvLyByZW1vdmVBbGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBn
dWFyZCBvdXJzZWx2ZXMgd2l0aCBhbgotICAgICAgICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmCi0K
LSAgICAgICAgRG9jUHRyPERvY3VtZW50SW1wbD4gZ3VhcmQodGhpcyk7Ci0KLSAgICAgICAgLy8g
d2UgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGJlIHJldGFpbmluZyBhbnkgb2Ygb3VyIGNoaWxkcmVu
IHRocm91Z2gKLSAgICAgICAgLy8gdGhlc2UgZXh0cmEgcG9pbnRlcnMgb3Igd2Ugd2lsbCBjcmVh
dGUgYSByZWZlcmVuY2UgY3ljbGUKLSAgICAgICAgbV9kb2NUeXBlID0gMDsKLSAgICAgICAgbV9m
b2N1c05vZGUgPSAwOwotICAgICAgICBtX2hvdmVyTm9kZSA9IDA7Ci0gICAgICAgIG1fYWN0aXZl
Tm9kZSA9IDA7Ci0gICAgICAgIG1fdGl0bGVFbGVtZW50ID0gMDsKLQotICAgICAgICByZW1vdmVB
bGxDaGlsZHJlbigpOwotICAgIH0gZWxzZQotICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotRG9j
dW1lbnRJbXBsOjp+RG9jdW1lbnRJbXBsKCkKLXsKLSAgICBhc3NlcnQoIW1fcmVuZGVyKTsKLSAg
ICBhc3NlcnQoIW1faW5QYWdlQ2FjaGUpOwotICAgIGFzc2VydChtX3NhdmVkUmVuZGVyZXIgPT0g
MCk7Ci0gICAgCi0gICAgS0pTOjpTY3JpcHRJbnRlcnByZXRlcjo6Zm9yZ2V0QWxsRE9NTm9kZXNG
b3JEb2N1bWVudCh0aGlzKTsKLQotICAgIGlmIChjaGFuZ2VkRG9jdW1lbnRzICYmIG1fZG9jQ2hh
bmdlZCkKLSAgICAgICAgY2hhbmdlZERvY3VtZW50cy0+cmVtb3ZlKHRoaXMpOwotICAgIGRlbGV0
ZSBtX3Rva2VuaXplcjsKLSAgICBkb2N1bWVudC5yZXNldFNraXBwaW5nUmVmKDApOwotICAgIGRl
bGV0ZSBtX3NoZWV0OwotICAgIGRlbGV0ZSBtX3N0eWxlU2VsZWN0b3I7Ci0gICAgZGVsZXRlIG1f
ZG9jTG9hZGVyOwotICAgIGlmIChtX2VsZW1TaGVldCApICBtX2VsZW1TaGVldC0+ZGVyZWYoKTsK
LSAgICBpZiAobV9pbXBsZW1lbnRhdGlvbikKLSAgICAgICAgbV9pbXBsZW1lbnRhdGlvbi0+ZGVy
ZWYoKTsKLSAgICBkZWxldGUgbV9wYWludERldmljZU1ldHJpY3M7Ci0gICAgCi0gICAgaWYgKG1f
ZWxlbWVudE5hbWVzKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgc2hvcnQgaWQgPSAwOyBpZCA8
IG1fZWxlbWVudE5hbWVDb3VudDsgaWQrKykKLSAgICAgICAgICAgIG1fZWxlbWVudE5hbWVzW2lk
XS0+ZGVyZWYoKTsKLSAgICAgICAgZGVsZXRlIFtdIG1fZWxlbWVudE5hbWVzOwotICAgIH0KLSAg
ICBpZiAobV9hdHRyTmFtZXMpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBzaG9ydCBpZCA9IDA7
IGlkIDwgbV9hdHRyTmFtZUNvdW50OyBpZCsrKQotICAgICAgICAgICAgbV9hdHRyTmFtZXNbaWRd
LT5kZXJlZigpOwotICAgICAgICBkZWxldGUgW10gbV9hdHRyTmFtZXM7Ci0gICAgfQotICAgIG1f
ZGVmYXVsdFZpZXctPmRlcmVmKCk7Ci0gICAgbV9zdHlsZVNoZWV0cy0+ZGVyZWYoKTsKLQotICAg
IGlmIChtX3JlbmRlckFyZW5hKXsKLSAgICAgICAgZGVsZXRlIG1fcmVuZGVyQXJlbmE7Ci0gICAg
ICAgIG1fcmVuZGVyQXJlbmEgPSAwOwotICAgIH0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB4
bWxGcmVlRG9jKCh4bWxEb2NQdHIpbV90cmFuc2Zvcm1Tb3VyY2UpOwotI2VuZGlmCi0KLSNpZm5k
ZWYgS0hUTUxfTk9fWEJMCi0gICAgZGVsZXRlIG1fYmluZGluZ01hbmFnZXI7Ci0jZW5kaWYKLQot
ICAgIGlmIChtX2FjY0NhY2hlKXsKLSAgICAgICAgZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAgICAg
IG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAgICBtX2RlY29kZXIgPSAwOwotICAgIAotICAgIGlm
IChtX2pzRWRpdG9yKSB7Ci0gICAgICAgIGRlbGV0ZSBtX2pzRWRpdG9yOwotICAgICAgICBtX2pz
RWRpdG9yID0gMDsKLSAgICB9Ci0gICAgCi0gICAgaWYgKG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMp
IHsKLSAgICAgICAgRm9ybVRvR3JvdXBNYXA6Oml0ZXJhdG9yIGVuZCA9IG1fc2VsZWN0ZWRSYWRp
b0J1dHRvbnMtPmVuZCgpOwotICAgICAgICBmb3IgKEZvcm1Ub0dyb3VwTWFwOjppdGVyYXRvciBp
dCA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICAgICAgTmFtZVRvSW5wdXRNYXAgKm4gPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAg
aWYgKG4pCi0gICAgICAgICAgICAgICAgZGVsZXRlIG47Ci0gICAgICAgIH0KLSAgICAgICAgZGVs
ZXRlIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnM7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1w
bDo6cmVzZXRMaW5rQ29sb3IoKQotewotICAgIG1fbGlua0NvbG9yID0gUUNvbG9yKDAsIDAsIDIz
OCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQotewot
ICAgIG1fdmlzaXRlZExpbmtDb2xvciA9IFFDb2xvcig4NSwgMjYsIDEzOSk7ICAgIAotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6cmVzZXRBY3RpdmVMaW5rQ29sb3IoKQotewotICAgIG1fYWN0aXZl
TGlua0NvbG9yLnNldE5hbWVkQ29sb3IoUVN0cmluZygicmVkIikpOwotfQotCi1Eb2N1bWVudFR5
cGVJbXBsICpEb2N1bWVudEltcGw6OmRvY3R5cGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rv
Y1R5cGUuZ2V0KCk7Ci19Ci0KLURPTUltcGxlbWVudGF0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjpp
bXBsZW1lbnRhdGlvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1faW1wbGVtZW50YXRpb247Ci19
Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmRvY3VtZW50RWxlbWVudCgpIGNvbnN0Ci17
Ci0gICAgTm9kZUltcGwgKm4gPSBmaXJzdENoaWxkKCk7Ci0gICAgd2hpbGUgKG4gJiYgbi0+bm9k
ZVR5cGUoKSAhPSBOb2RlOjpFTEVNRU5UX05PREUpCi0gICAgICBuID0gbi0+bmV4dFNpYmxpbmco
KTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwqPihuKTsKLX0KLQotRWxlbWVu
dEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlRWxlbWVudChjb25zdCBET01TdHJpbmcgJm5hbWUs
IGludCAmZXhjZXB0aW9uQ29kZSkKLXsKLSAgICByZXR1cm4gY3JlYXRlRWxlbWVudE5TKG51bGxB
dG9tLCBuYW1lLCBleGNlcHRpb25Db2RlKTsKLX0KLQotRG9jdW1lbnRGcmFnbWVudEltcGwgKkRv
Y3VtZW50SW1wbDo6Y3JlYXRlRG9jdW1lbnRGcmFnbWVudCggICkKLXsKLSAgICByZXR1cm4gbmV3
IERvY3VtZW50RnJhZ21lbnRJbXBsKGdldERvY3VtZW50KCkpOwotfQotCi1UZXh0SW1wbCAqRG9j
dW1lbnRJbXBsOjpjcmVhdGVUZXh0Tm9kZShjb25zdCBET01TdHJpbmcgJmRhdGEpCi17Ci0gICAg
cmV0dXJuIG5ldyBUZXh0SW1wbCh0aGlzLCBkYXRhKTsKLX0KLQotQ29tbWVudEltcGwgKkRvY3Vt
ZW50SW1wbDo6Y3JlYXRlQ29tbWVudCAoY29uc3QgRE9NU3RyaW5nICZkYXRhKQotewotICAgIHJl
dHVybiBuZXcgQ29tbWVudEltcGwodGhpcywgZGF0YSk7Ci19Ci0KLUNEQVRBU2VjdGlvbkltcGwg
KkRvY3VtZW50SW1wbDo6Y3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwg
aW50ICZleGNlcHRpb24pCi17Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAg
ZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0
dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQ0RBVEFTZWN0aW9uSW1wbCh0aGlzLCBk
YXRhKTsKLX0KLQotUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVh
dGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29uc3QgRE9NU3RyaW5nICZ0YXJnZXQsIGNvbnN0IERP
TVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZSh0
YXJnZXQpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbiA9IERPTUV4Y2VwdGlvbjo6SU5WQUxJRF9DSEFS
QUNURVJfRVJSOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKGlzSFRNTERv
Y3VtZW50KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9S
VEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgUHJv
Y2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlzLCB0YXJnZXQsIGRhdGEpOwotfQotCi1FbnRpdHlS
ZWZlcmVuY2VJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBE
T01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uKQotewotICAgIGlmICghaXNWYWxpZE5hbWUo
bmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpJTlZBTElEX0NIQVJB
Q1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9j
dW1lbnQoKSkgewotICAgICAgICBleGNlcHRpb24gPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JU
RURfRVJSOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBFbnRp
dHlSZWZlcmVuY2VJbXBsKHRoaXMsIG5hbWUuaW1wbCgpKTsKLX0KLQotRWRpdGluZ1RleHRJbXBs
ICpEb2N1bWVudEltcGw6OmNyZWF0ZUVkaXRpbmdUZXh0Tm9kZShjb25zdCBET01TdHJpbmcgJnRl
eHQpCi17Ci0gICAgcmV0dXJuIG5ldyBFZGl0aW5nVGV4dEltcGwodGhpcywgdGV4dCk7Ci19Ci0K
LUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUNTU1N0eWxlRGVj
bGFyYXRpb24oKQotewotICAgIHJldHVybiBuZXcgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb25J
bXBsOwotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjppbXBvcnROb2RlKE5vZGVJbXBsICpp
bXBvcnRlZE5vZGUsIGJvb2wgZGVlcCwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIGV4Y2Vw
dGlvbmNvZGUgPSAwOwotCi0gICAgc3dpdGNoIChpbXBvcnRlZE5vZGUtPm5vZGVUeXBlKCkpIHsK
LSAgICAgICAgY2FzZSBOb2RlOjpURVhUX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRl
VGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2RlVmFsdWUoKSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6
Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNEQVRBU2VjdGlv
bihpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgpLCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgY2Fz
ZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRl
RW50aXR5UmVmZXJlbmNlKGltcG9ydGVkTm9kZS0+bm9kZU5hbWUoKSwgZXhjZXB0aW9uY29kZSk7
Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihpbXBvcnRlZE5vZGUtPm5v
ZGVOYW1lKCksIGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCksIGV4Y2VwdGlvbmNvZGUpOwotICAg
ICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVD
b21tZW50KGltcG9ydGVkTm9kZS0+bm9kZVZhbHVlKCkpOwotICAgICAgICBjYXNlIE5vZGU6OkVM
RU1FTlRfTk9ERTogewotICAgICAgICAgICAgRWxlbWVudEltcGwgKm9sZEVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxFbGVtZW50SW1wbCAqPihpbXBvcnRlZE5vZGUpOwotICAgICAgICAgICAgRWxlbWVu
dEltcGwgKm5ld0VsZW1lbnQgPSBjcmVhdGVFbGVtZW50TlMob2xkRWxlbWVudC0+bmFtZXNwYWNl
VVJJKCksIG9sZEVsZW1lbnQtPnRhZ05hbWUoKS50b1N0cmluZygpLCBleGNlcHRpb25jb2RlKTsK
LQkJCQotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUgIT0gMCkKLSAgICAgICAgICAgICAg
ICByZXR1cm4gMDsKLQotICAgICAgICAgICAgbmV3RWxlbWVudC0+cmVmKCk7Ci0KLSAgICAgICAg
ICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJzID0gb2xkRWxlbWVudC0+YXR0cmlidXRlcyh0cnVl
KTsKLSAgICAgICAgICAgIGlmIChhdHRycykgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxl
bmd0aCA9IGF0dHJzLT5sZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1w
bCogYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJdGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBu
ZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGUoYXR0ci0+bmFtZSgpLCBhdHRyLT52YWx1ZSgpLmltcGwo
KSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2Rl
ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQot
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbmV3RWxlbWVu
dC0+Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRpZXMob2xkRWxlbWVudCk7Ci0KLSAgICAgICAgICAg
IGlmIChkZWVwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChOb2RlSW1wbCAqb2xkQ2hpbGQgPSBv
bGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9sZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxkLT5u
ZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIE5vZGVJbXBsICpuZXdDaGlsZCA9
IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUsIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAg
ICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAg
ICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7
Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+
YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgICAgICAg
ICBpZiAoZXhjZXB0aW9uY29kZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdF
bGVtZW50LT5kZXJlZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAg
ICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIFRyaWNrIHRvIGdldCB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZsb2F0aW5n
IHN0YXRlLCB3aXRoIDAgcmVmcyBidXQgbm90IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIG5ld0Vs
ZW1lbnQtPnNldFBhcmVudCh0aGlzKTsKLSAgICAgICAgICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7
Ci0gICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRQYXJlbnQoMCk7Ci0KLSAgICAgICAgICAgIHJl
dHVybiBuZXdFbGVtZW50OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZXhjZXB0aW9uY29kZSA9
IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQot
Tm9kZUltcGwgKkRvY3VtZW50SW1wbDo6YWRvcHROb2RlKE5vZGVJbXBsICpzb3VyY2UsIGludCAm
ZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoIXNvdXJjZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBwcm90ZWN0KHNvdXJjZSk7Ci0KLSAgICBzd2l0Y2gg
KHNvdXJjZS0+bm9kZVR5cGUoKSkgewotICAgICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgot
ICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9OX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gMDsK
LSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRP
Q1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRp
b246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAg
Ci0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklCVVRFX05PREU6IHsgICAgICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICBBdHRySW1wbCAqYXR0ciA9IHN0YXRpY19jYXN0PEF0dHJJbXBsICo+KHNv
dXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChhdHRyLT5vd25lckVsZW1lbnQo
KSkKLSAgICAgICAgICAgICAgICBhdHRyLT5vd25lckVsZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRl
Tm9kZShhdHRyLCBleGNlcHRpb25jb2RlKTsKLQotICAgICAgICAgICAgYXR0ci0+bV9zcGVjaWZp
ZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAg
IGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5wYXJlbnROb2RlKCkpCi0gICAgICAg
ICAgICAgICAgc291cmNlLT5wYXJlbnROb2RlKCktPnJlbW92ZUNoaWxkKHNvdXJjZSwgZXhjZXB0
aW9uY29kZSk7Ci0gICAgfQotICAgICAgICAgICAgICAgIAotICAgIGZvciAoTm9kZUltcGwgKm5v
ZGUgPSBzb3VyY2U7IG5vZGU7IG5vZGUgPSBub2RlLT50cmF2ZXJzZU5leHROb2RlKHNvdXJjZSkp
IHsKLSAgICAgICAgS0pTOjpTY3JpcHRJbnRlcnByZXRlcjo6dXBkYXRlRE9NTm9kZURvY3VtZW50
KG5vZGUsIG5vZGUtPmdldERvY3VtZW50KCksIHRoaXMpOwotICAgICAgICBub2RlLT5zZXREb2N1
bWVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc291cmNlOwotCi19Ci0KLUVsZW1lbnRJ
bXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVsZW1lbnROUyhjb25zdCBET01TdHJpbmcgJl9uYW1l
c3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgaW50ICZleGNlcHRpb25j
b2RlKQotewotICAgIC8vIEZJWE1FOiBXZSdkIGxpa2UgYSBmYXN0ZXIgY29kZSBwYXRoIHRoYXQg
c2tpcHMgdGhpcyBjaGVjayBmb3IgY2FsbHMgZnJvbSBpbnNpZGUgdGhlIGVuZ2luZSB3aGVyZSB0
aGUgbmFtZSBpcyBrbm93biB0byBiZSB2YWxpZC4KLSAgICBET01TdHJpbmcgcHJlZml4LCBsb2Nh
bE5hbWU7Ci0gICAgaWYgKCFwYXJzZVF1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4
LCBsb2NhbE5hbWUpKSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OklO
VkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRWxl
bWVudEltcGwgKmUgPSAwOwotICAgIFF1YWxpZmllZE5hbWUgcU5hbWUgPSBRdWFsaWZpZWROYW1l
KEF0b21pY1N0cmluZyhwcmVmaXgpLCBBdG9taWNTdHJpbmcobG9jYWxOYW1lKSwgQXRvbWljU3Ry
aW5nKF9uYW1lc3BhY2VVUkkpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogVXNlIHJlZ2lzdGVyZWQg
bmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBhIGhhc2ggdG8gZmluZCB0aGUgcmlnaHQgZmFjdG9y
eS4KLSAgICBpZiAoX25hbWVzcGFjZVVSSSA9PSB4aHRtbE5hbWVzcGFjZVVSSSkgewotICAgICAg
ICBlID0gSFRNTEVsZW1lbnRGYWN0b3J5OjpjcmVhdGVIVE1MRWxlbWVudChxTmFtZS5sb2NhbE5h
bWUoKSwgdGhpcywgMCwgZmFsc2UpOwotICAgICAgICBpZiAoZSAmJiAhcHJlZml4LmlzTnVsbCgp
KSB7Ci0gICAgICAgICAgICBlLT5zZXRQcmVmaXgocU5hbWUucHJlZml4KCksIGV4Y2VwdGlvbmNv
ZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0
dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChf
bmFtZXNwYWNlVVJJID09IEtTVkc6OlNWR05hbWVzOjpzdmdOYW1lc3BhY2VVUkkpCi0gICAgICAg
IGUgPSBLU1ZHOjpTVkdFbGVtZW50RmFjdG9yeTo6Y3JlYXRlU1ZHRWxlbWVudChxTmFtZSwgdGhp
cywgZmFsc2UpOwotI2VuZGlmCi0gICAgCi0gICAgaWYgKCFlKQotICAgICAgICBlID0gbmV3IEVs
ZW1lbnRJbXBsKHFOYW1lLCBnZXREb2N1bWVudCgpKTsKLSAgICAKLSAgICByZXR1cm4gZTsKLX0K
LQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5SWQoIGNvbnN0IERPTVN0
cmluZyAmZWxlbWVudElkICkgY29uc3QKLXsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudDsKLSAg
ICBRU3RyaW5nIHFJZCA9IGVsZW1lbnRJZC5xc3RyaW5nKCk7Ci0KLSAgICBpZiAoZWxlbWVudElk
Lmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZWxlbWVu
dCA9IG1fZWxlbWVudHNCeUlkLmZpbmQocUlkKTsKLSAgICAKLSAgICBpZiAoZWxlbWVudCkKLSAg
ICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgIAotICAgIGlmIChpbnQgaWRDb3VudCA9IChp
bnQpbV9pZENvdW50LmZpbmQocUlkKSkgewotICAgICAgICBmb3IgKE5vZGVJbXBsICpuID0gdHJh
dmVyc2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAg
ICAgICAgICAgIGlmICghbi0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAgICAgICAgICAgIGNvbnRp
bnVlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxl
bWVudEltcGwgKj4obik7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChlbGVtZW50LT5o
YXNJRCgpICYmIGVsZW1lbnQtPmdldEF0dHJpYnV0ZShpZEF0dHIpID09IGVsZW1lbnRJZCkgewot
ICAgICAgICAgICAgICAgIGlmIChpZENvdW50ID09IDEpIAotICAgICAgICAgICAgICAgICAgICBt
X2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgICAgICBtX2lkQ291bnQuaW5zZXJ0KHFJZCwgKGNoYXIgKilpZENvdW50IC0gMSk7Ci0gICAg
ICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgbV9lbGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwg
ZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1
bWVudEltcGw6OmVsZW1lbnRGcm9tUG9pbnQoIGNvbnN0IGludCBfeCwgY29uc3QgaW50IF95ICkg
Y29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVyKSByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJP
YmplY3Q6Ok5vZGVJbmZvIG5vZGVJbmZvKHRydWUsIHRydWUpOwotICAgIG1fcmVuZGVyLT5sYXll
cigpLT5oaXRUZXN0KG5vZGVJbmZvLCBfeCwgX3kpOyAKLSAgICBOb2RlSW1wbCogbiA9IG5vZGVJ
bmZvLmlubmVyTm9kZSgpOwotCi0gICAgd2hpbGUgKCBuICYmICFuLT5pc0VsZW1lbnROb2RlKCkg
KSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnROb2RlKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVy
biBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+KG4pOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6
YWRkRWxlbWVudEJ5SWQoY29uc3QgRE9NU3RyaW5nICZlbGVtZW50SWQsIEVsZW1lbnRJbXBsICpl
bGVtZW50KQotewotICAgIFFTdHJpbmcgcUlkID0gZWxlbWVudElkLnFzdHJpbmcoKTsKLSAgICAK
LSAgICBpZiAobV9lbGVtZW50c0J5SWQuZmluZChxSWQpID09IE5VTEwpIHsKLSAgICAgICAgbV9l
bGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwgZWxlbWVudCk7Ci0gICAgICAgIG1fYWNjZXNzS2V5RGlj
dFZhbGlkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlkQ291bnQgPSAoaW50
KW1faWRDb3VudC5maW5kKHFJZCk7Ci0gICAgICAgIG1faWRDb3VudC5pbnNlcnQocUlkLCAoY2hh
ciAqKShpZENvdW50ICsgMSkpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92
ZUVsZW1lbnRCeUlkKGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxl
bWVudCkKLXsKLSAgICBRU3RyaW5nIHFJZCA9IGVsZW1lbnRJZC5xc3RyaW5nKCk7Ci0KLSAgICBp
ZiAobV9lbGVtZW50c0J5SWQuZmluZChxSWQpID09IGVsZW1lbnQpIHsKLSAgICAgICAgbV9lbGVt
ZW50c0J5SWQucmVtb3ZlKHFJZCk7Ci0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFs
c2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5m
aW5kKHFJZCk7ICAgICAgICAKLSAgICAgICAgYXNzZXJ0KGlkQ291bnQgPiAwKTsKLSAgICAgICAg
aWYgKGlkQ291bnQgPT0gMSkgCi0gICAgICAgICAgICBtX2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0g
ICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1faWRDb3VudC5pbnNlcnQocUlkLCAoY2hhciAqKShp
ZENvdW50IC0gMSkpOwotICAgIH0KLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0
RWxlbWVudEJ5QWNjZXNzS2V5KCBjb25zdCBET01TdHJpbmcgJmtleSApCi17Ci0gICAgaWYgKCFr
ZXkubGVuZ3RoKCkpCi0JcmV0dXJuIDA7Ci0KLSAgICBpZiAoIW1fYWNjZXNzS2V5RGljdFZhbGlk
KSB7Ci0gICAgICAgIG1fZWxlbWVudHNCeUFjY2Vzc0tleS5jbGVhcigpOwotICAgIAotICAgICAg
ICBjb25zdCBOb2RlSW1wbCAqbjsKLSAgICAgICAgZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0g
bi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5v
ZGUoKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1l
bnRJbXBsICplbGVtZW50SW1wbCA9IHN0YXRpY19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KG4p
OwotICAgICAgICAgICAgRE9NU3RyaW5nIGFjY2Vzc0tleShlbGVtZW50SW1wbC0+Z2V0QXR0cmli
dXRlKGFjY2Vzc2tleUF0dHIpKTs7Ci0gICAgICAgICAgICBpZiAoIWFjY2Vzc0tleS5pc0VtcHR5
KCkpIHsKLSAgICAgICAgICAgICAgICBRU3RyaW5nIGFrID0gYWNjZXNzS2V5LnFzdHJpbmcoKS5s
b3dlcigpOwotICAgICAgICAgICAgICAgIGlmIChtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuZmluZChh
aykgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5Lmlu
c2VydChhaywgZWxlbWVudEltcGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAg
IG1fYWNjZXNzS2V5RGljdFZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fZWxlbWVu
dHNCeUFjY2Vzc0tleS5maW5kKGtleS5xc3RyaW5nKCkpOwotfQotCi12b2lkIERvY3VtZW50SW1w
bDo6dXBkYXRlVGl0bGUoKQotewotICAgIEZyYW1lICpwID0gZnJhbWUoKTsKLSAgICBpZiAoIXAp
Ci0gICAgICAgIHJldHVybjsKLQotICAgIE1hYyhwKS0+c2V0VGl0bGUobV90aXRsZSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRUaXRsZShET01TdHJpbmcgdGl0bGUsIE5vZGVJbXBsICp0
aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYgKCF0aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgLy8gVGl0
bGUgc2V0IGJ5IEphdmFTY3JpcHQgLS0gb3ZlcnJpZGVzIGFueSB0aXRsZSBlbGVtZW50cy4KLSAg
ICAgICAgbV90aXRsZVNldEV4cGxpY2l0bHkgPSB0cnVlOwotICAgICAgICBtX3RpdGxlRWxlbWVu
dCA9IDA7Ci0gICAgfSBlbHNlIGlmICh0aXRsZUVsZW1lbnQgIT0gbV90aXRsZUVsZW1lbnQpIHsK
LSAgICAgICAgaWYgKG1fdGl0bGVFbGVtZW50KQotICAgICAgICAgICAgLy8gT25seSBhbGxvdyB0
aGUgZmlyc3QgdGl0bGUgZWxlbWVudCB0byBjaGFuZ2UgdGhlIHRpdGxlIC0tIG90aGVycyBoYXZl
IG5vIGVmZmVjdC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQg
PSB0aXRsZUVsZW1lbnQ7Ci0gICAgfQotCi0gICAgaWYgKG1fdGl0bGUgPT0gdGl0bGUpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIG1fdGl0bGUgPSB0aXRsZTsKLSAgICB1cGRhdGVUaXRsZSgpOwot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlVGl0bGUoTm9kZUltcGwgKnRpdGxlRWxlbWVu
dCkKLXsKLSAgICBpZiAobV90aXRsZUVsZW1lbnQgIT0gdGl0bGVFbGVtZW50KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICAvLyBGSVhNRTogSWRlYWxseSB3ZSBtaWdodCB3YW50IHRoaXMgdG8gc2Vh
cmNoIGZvciB0aGUgZmlyc3QgcmVtYWluaW5nIHRpdGxlIGVsZW1lbnQsIGFuZCB1c2UgaXQuCi0g
ICAgbV90aXRsZUVsZW1lbnQgPSAwOwotCi0gICAgaWYgKCFtX3RpdGxlLmlzRW1wdHkoKSkgewot
ICAgICAgICBtX3RpdGxlID0gIiI7Ci0gICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgfQotfQot
Ci1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
ICIjZG9jdW1lbnQiOwotfQotCi11bnNpZ25lZCBzaG9ydCBEb2N1bWVudEltcGw6Om5vZGVUeXBl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gTm9kZTo6RE9DVU1FTlRfTk9ERTsKLX0KLQotUVN0cmlu
ZyBEb2N1bWVudEltcGw6Om5leHRTdGF0ZSgpCi17Ci0gICBRU3RyaW5nIHN0YXRlOwotICAgaWYg
KCFtX3N0YXRlLmlzRW1wdHkoKSkKLSAgIHsKLSAgICAgIHN0YXRlID0gbV9zdGF0ZS5maXJzdCgp
OwotICAgICAgbV9zdGF0ZS5yZW1vdmUobV9zdGF0ZS5iZWdpbigpKTsKLSAgIH0KLSAgIHJldHVy
biBzdGF0ZTsKLX0KLQotUVN0cmluZ0xpc3QgRG9jdW1lbnRJbXBsOjpkb2NTdGF0ZSgpCi17Ci0g
ICAgUVN0cmluZ0xpc3QgczsKLSAgICBmb3IgKFFQdHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0
KG1fbWFpbnRhaW5zU3RhdGUpOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIHMuYXBwZW5k
KGl0LmN1cnJlbnQoKS0+c3RhdGUoKSk7Ci0KLSAgICByZXR1cm4gczsKLX0KLQotRnJhbWUgKkRv
Y3VtZW50SW1wbDo6ZnJhbWUoKSBjb25zdCAKLXsKLSAgICByZXR1cm4gbV92aWV3ID8gbV92aWV3
LT5mcmFtZSgpIDogMDsgCi19Ci0KLVJhbmdlSW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVSYW5n
ZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBSYW5nZUltcGwodGhpcyk7Ci19Ci0KLU5vZGVJdGVyYXRv
ckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGVJbXBsICpyb290LCB1
bnNpZ25lZCB3aGF0VG9TaG93LCAKLSAgICBOb2RlRmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4
cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoIXJv
b3QpIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRF
RF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbmV3IE5vZGVJdGVy
YXRvckltcGwocm9vdCwgd2hhdFRvU2hvdywgZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2Vz
KTsKLX0KLQotVHJlZVdhbGtlckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlVHJlZVdhbGtlcihO
b2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywgCi0gICAgTm9kZUZpbHRlckltcGwg
KmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUp
Ci17Ci0gICAgaWYgKCFyb290KSB7Ci0gICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRp
b246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0
dXJuIG5ldyBUcmVlV2Fsa2VySW1wbChyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVu
dGl0eVJlZmVyZW5jZXMpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0RG9jdW1lbnRDaGFu
Z2VkKGJvb2wgYikKLXsKLSAgICBpZiAoIWNoYW5nZWREb2N1bWVudHMpCi0gICAgICAgIGNoYW5n
ZWREb2N1bWVudHMgPSBuZXcgUVB0ckxpc3Q8RG9jdW1lbnRJbXBsPjsKLQotICAgIGlmIChiICYm
ICFtX2RvY0NoYW5nZWQpCi0gICAgICAgIGNoYW5nZWREb2N1bWVudHMtPmFwcGVuZCh0aGlzKTsK
LSAgICBlbHNlIGlmICghYiAmJiBtX2RvY0NoYW5nZWQpCi0gICAgICAgIGNoYW5nZWREb2N1bWVu
dHMtPnJlbW92ZSh0aGlzKTsKLSAgICBtX2RvY0NoYW5nZWQgPSBiOwotICAgIAotICAgIGlmICht
X2RvY0NoYW5nZWQpCi0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpyZWNhbGNTdHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsK
LS8vICAgICBxRGVidWcoInJlY2FsY1N0eWxlKCVwKSIsIHRoaXMpOwotLy8gICAgIFFUaW1lIHF0
OwotLy8gICAgIHF0LnN0YXJ0KCk7Ci0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykKLSAgICAgICAg
cmV0dXJuOyAvLyBHdWFyZCBhZ2FpbnN0IHJlLWVudHJhbmN5LiAtZHdoCi0gICAgICAgIAotICAg
IG1faW5TdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgCi0gICAgaWYoICFtX3JlbmRlciApIGdvdG8g
YmFpbF9vdXQ7Ci0KLSAgICBpZiAoIGNoYW5nZSA9PSBGb3JjZSApIHsKLSAgICAgICAgUmVuZGVy
U3R5bGUqIG9sZFN0eWxlID0gbV9yZW5kZXItPnN0eWxlKCk7Ci0gICAgICAgIGlmICggb2xkU3R5
bGUgKSBvbGRTdHlsZS0+cmVmKCk7Ci0gICAgICAgIFJlbmRlclN0eWxlKiBfc3R5bGUgPSBuZXcg
KG1fcmVuZGVyQXJlbmEpIFJlbmRlclN0eWxlKCk7Ci0gICAgICAgIF9zdHlsZS0+cmVmKCk7Ci0g
ICAgICAgIF9zdHlsZS0+c2V0RGlzcGxheShCTE9DSyk7Ci0gICAgICAgIF9zdHlsZS0+c2V0Vmlz
dWFsbHlPcmRlcmVkKCB2aXN1YWxseU9yZGVyZWQgKTsKLSAgICAgICAgLy8gIyMjIG1ha2UgdGhl
IGZvbnQgc3R1ZmYgX3JlYWxseV8gd29yayEhISEKLQotCWtodG1sOjpGb250RGVmIGZvbnREZWY7
Ci0JUUZvbnQgZiA9IEtHbG9iYWxTZXR0aW5nczo6Z2VuZXJhbEZvbnQoKTsKLQlmb250RGVmLmZh
bWlseSA9ICooZi5maXJzdEZhbWlseSgpKTsKLQlmb250RGVmLml0YWxpYyA9IGYuaXRhbGljKCk7
Ci0JZm9udERlZi53ZWlnaHQgPSBmLndlaWdodCgpOwotICAgICAgICBib29sIHByaW50aW5nID0g
bV9wYWludERldmljZSAmJiAobV9wYWludERldmljZS0+ZGV2VHlwZSgpID09IFFJbnRlcm5hbDo6
UHJpbnRlcik7Ci0gICAgICAgIGZvbnREZWYudXNlUHJpbnRlckZvbnQgPSBwcmludGluZzsKLSAg
ICAgICAgaWYgKG1fdmlldykgewotICAgICAgICAgICAgY29uc3QgS0hUTUxTZXR0aW5ncyAqc2V0
dGluZ3MgPSBtX3ZpZXctPmZyYW1lKCktPnNldHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAocHJp
bnRpbmcgJiYgIXNldHRpbmdzLT5zaG91bGRQcmludEJhY2tncm91bmRzKCkpIHsKLSAgICAgICAg
ICAgICAgICBfc3R5bGUtPnNldEZvcmNlQmFja2dyb3VuZHNUb1doaXRlKHRydWUpOwotICAgICAg
ICAgICAgfQotICAgICAgICAgICAgUVN0cmluZyBzdGRmb250ID0gc2V0dGluZ3MtPnN0ZEZvbnRO
YW1lKCk7Ci0gICAgICAgICAgICBpZiAoICFzdGRmb250LmlzRW1wdHkoKSApIHsKLSAgICAgICAg
ICAgICAgICBmb250RGVmLmZhbWlseS5zZXRGYW1pbHkoc3RkZm9udCk7Ci0gICAgICAgICAgICAg
ICAgZm9udERlZi5mYW1pbHkuYXBwZW5kRmFtaWx5KDApOwotICAgICAgICAgICAgfQotICAgICAg
ICAgICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRGb250U2l6ZShmb250RGVmLCBtX3N0eWxlU2VsZWN0
b3ItPmZvbnRTaXplRm9yS2V5d29yZChDU1NfVkFMX01FRElVTSwgaW5Db21wYXRNb2RlKCkpKTsK
LSAgICAgICAgfQotCi0gICAgICAgIC8va2REZWJ1ZygpIDw8ICJEb2N1bWVudEltcGw6OmF0dGFj
aDogc2V0dGluZyB0byBjaGFyc2V0ICIgPDwgc2V0dGluZ3MtPmNoYXJzZXQoKSA8PCBlbmRsOwot
ICAgICAgICBfc3R5bGUtPnNldEZvbnREZWYoZm9udERlZik7Ci0JX3N0eWxlLT5odG1sRm9udCgp
LnVwZGF0ZSggcGFpbnREZXZpY2VNZXRyaWNzKCkgKTsKLSAgICAgICAgaWYgKCBpbkNvbXBhdE1v
ZGUoKSApCi0gICAgICAgICAgICBfc3R5bGUtPnNldEh0bWxIYWNrcyh0cnVlKTsgLy8gZW5hYmxl
IGh0bWwgc3BlY2lmaWMgcmVuZGVyaW5nIHRyaWNrcwotCi0gICAgICAgIFN0eWxlQ2hhbmdlIGNo
ID0gZGlmZiggX3N0eWxlLCBvbGRTdHlsZSApOwotICAgICAgICBpZihtX3JlbmRlciAmJiBjaCAh
PSBOb0NoYW5nZSkKLSAgICAgICAgICAgIG1fcmVuZGVyLT5zZXRTdHlsZShfc3R5bGUpOwotICAg
ICAgICBpZiAoIGNoYW5nZSAhPSBGb3JjZSApCi0gICAgICAgICAgICBjaGFuZ2UgPSBjaDsKLQot
ICAgICAgICBfc3R5bGUtPmRlcmVmKG1fcmVuZGVyQXJlbmEpOwotICAgICAgICBpZiAob2xkU3R5
bGUpCi0gICAgICAgICAgICBvbGRTdHlsZS0+ZGVyZWYobV9yZW5kZXJBcmVuYSk7Ci0gICAgfQot
Ci0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9yIChuID0gX2ZpcnN0OyBuOyBuID0gbi0+bmV4dFNp
YmxpbmcoKSkKLSAgICAgICAgaWYgKCBjaGFuZ2U+PSBJbmhlcml0IHx8IG4tPmhhc0NoYW5nZWRD
aGlsZCgpIHx8IG4tPmNoYW5nZWQoKSApCi0gICAgICAgICAgICBuLT5yZWNhbGNTdHlsZSggY2hh
bmdlICk7Ci0gICAgLy9rZERlYnVnKCA2MDIwICkgPDwgIlRJTUU6IHJlY2FsY1N0eWxlKCkgZHQ9
IiA8PCBxdC5lbGFwc2VkKCkgPDwgZW5kbDsKLQotICAgIGlmIChjaGFuZ2VkKCkgJiYgbV92aWV3
KQotCW1fdmlldy0+bGF5b3V0KCk7Ci0KLWJhaWxfb3V0OgotICAgIHNldENoYW5nZWQoIGZhbHNl
ICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxkKCBmYWxzZSApOwotICAgIHNldERvY3VtZW50Q2hh
bmdlZCggZmFsc2UgKTsKLSAgICAKLSAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICAK
LSAgICAvLyBJZiB3ZSB3YW50ZWQgdG8gZW1pdCB0aGUgaW1wbGljaXRDbG9zZSgpIGR1cmluZyBy
ZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQgd2UncmUgZmluaXNoZWQuCi0gICAgaWYgKG1fY2xv
c2VBZnRlclN0eWxlUmVjYWxjKSB7Ci0gICAgICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0g
ZmFsc2U7Ci0gICAgICAgIGltcGxpY2l0Q2xvc2UoKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1l
bnRJbXBsOjp1cGRhdGVSZW5kZXJpbmcoKQotewotICAgIGlmICghaGFzQ2hhbmdlZENoaWxkKCkp
IHJldHVybjsKLQotLy8gICAgIFFUaW1lIHRpbWU7Ci0vLyAgICAgdGltZS5zdGFydCgpOwotLy8g
ICAgIGtkRGVidWcoKSA8PCAiVVBEQVRFUkVOREVSSU5HOiAiPDxlbmRsOwotCi0gICAgU3R5bGVD
aGFuZ2UgY2hhbmdlID0gTm9DaGFuZ2U7Ci0gICAgcmVjYWxjU3R5bGUoIGNoYW5nZSApOwotCi0v
LyAgICBrZERlYnVnKCkgPDwgIlVQREFURVJFTkRFUklORyB0aW1lIHVzZWQ9Ijw8dGltZS5lbGFw
c2VkKCk8PGVuZGw7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVEb2N1bWVudHNSZW5k
ZXJpbmcoKQotewotICAgIGlmICghY2hhbmdlZERvY3VtZW50cykKLSAgICAgICAgcmV0dXJuOwot
Ci0gICAgd2hpbGUgKERvY3VtZW50SW1wbCogZG9jID0gY2hhbmdlZERvY3VtZW50cy0+dGFrZSgp
KSB7Ci0gICAgICAgIGRvYy0+bV9kb2NDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgIGRvYy0+dXBk
YXRlUmVuZGVyaW5nKCk7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlTGF5
b3V0KCkKLXsKLSAgICAvLyBGSVhNRTogRGF2ZSdzIHByZXR0eSBzdXJlIHdlIGNhbiByZW1vdmUg
dGhpcyBiZWNhdXNlCi0gICAgLy8gbGF5b3V0IGNhbGxzIHJlY2FsY1N0eWxlIGFzIG5lZWRlZC4K
LSAgICB1cGRhdGVSZW5kZXJpbmcoKTsKLQotICAgIC8vIE9ubHkgZG8gYSBsYXlvdXQgaWYgY2hh
bmdlcyBoYXZlIG9jY3VycmVkIHRoYXQgbWFrZSBpdCBuZWNlc3NhcnkuICAgICAgCi0gICAgaWYg
KG1fdmlldyAmJiByZW5kZXJlcigpICYmIHJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpCi0JbV92
aWV3LT5sYXlvdXQoKTsKLX0KLQotLy8gRklYTUU6IFRoaXMgaXMgYSBiYWQgaWRlYSBhbmQgbmVl
ZHMgdG8gYmUgcmVtb3ZlZCBldmVudHVhbGx5LgotLy8gT3RoZXIgYnJvd3NlcnMgbG9hZCBzdHls
ZXNoZWV0cyBiZWZvcmUgdGhleSBjb250aW51ZSBwYXJzaW5nIHRoZSB3ZWIgcGFnZS4KLS8vIFNp
bmNlIHdlIGRvbid0LCB3ZSBjYW4gcnVuIEphdmFTY3JpcHQgY29kZSB0aGF0IG5lZWRzIGFuc3dl
cnMgYmVmb3JlIHRoZQotLy8gc3R5bGVzaGVldHMgYXJlIGxvYWRlZC4gRG9pbmcgYSBsYXlvdXQg
aWdub3JpbmcgdGhlIHBlbmRpbmcgc3R5bGVzaGVldHMKLS8vIGxldHMgdXMgZ2V0IHJlYXNvbmFi
bGUgYW5zd2Vycy4gVGhlIGxvbmcgdGVybSBzb2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMKLS8v
IHRvIGluc3RlYWQgc3VzcGVuZCBKYXZhU2NyaXB0IGV4ZWN1dGlvbi4KLXZvaWQgRG9jdW1lbnRJ
bXBsOjp1cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVldHMoKQotewotICAgIGJvb2wg
b2xkSWdub3JlID0gbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7Ci0gICAgCi0gICAgaWYgKCFo
YXZlU3R5bGVzaGVldHNMb2FkZWQoKSkgewotICAgICAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNo
ZWV0cyA9IHRydWU7Ci0JdXBkYXRlU3R5bGVTZWxlY3RvcigpOyAgICAKLSAgICB9Ci0KLSAgICB1
cGRhdGVMYXlvdXQoKTsKLQotICAgIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdu
b3JlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0
dGFjaGVkKCkpOwotICAgIGFzc2VydCghbV9pblBhZ2VDYWNoZSk7Ci0KLSAgICBpZiAoIG1fdmll
dyApCi0gICAgICAgIHNldFBhaW50RGV2aWNlKCBtX3ZpZXcgKTsKLQotICAgIGlmICghbV9yZW5k
ZXJBcmVuYSkKLSAgICAgICAgbV9yZW5kZXJBcmVuYSA9IG5ldyBSZW5kZXJBcmVuYSgpOwotICAg
IAotICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVyaW5nIHRyZWUKLSAgICBtX3JlbmRlciA9IG5ldyAo
bV9yZW5kZXJBcmVuYSkgUmVuZGVyQ2FudmFzKHRoaXMsIG1fdmlldyk7Ci0gICAgcmVjYWxjU3R5
bGUoIEZvcmNlICk7Ci0KLSAgICBSZW5kZXJPYmplY3QqIHJlbmRlciA9IG1fcmVuZGVyOwotICAg
IG1fcmVuZGVyID0gMDsKLQotICAgIENvbnRhaW5lck5vZGVJbXBsOjphdHRhY2goKTsKLSAgICBt
X3JlbmRlciA9IHJlbmRlcjsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlc3RvcmVSZW5kZXJl
cihSZW5kZXJPYmplY3QqIHJlbmRlcikKLXsKLSAgICBtX3JlbmRlciA9IHJlbmRlcjsKLX0KLQot
dm9pZCBEb2N1bWVudEltcGw6OmRldGFjaCgpCi17Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXIg
PSBtX3JlbmRlcjsKLQotICAgIC8vIGluZGljYXRlIGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0
dGFjaGVkKCkgYnV0IG1fcmVuZGVyID09IDAKLSAgICBtX3JlbmRlciA9IDA7Ci0gICAgCi0gICAg
aWYgKG1faW5QYWdlQ2FjaGUpIHsKLSAgICAgICAgaWYgKCByZW5kZXIgKQotICAgICAgICAgICAg
Z2V0QWNjT2JqZWN0Q2FjaGUoKS0+ZGV0YWNoKHJlbmRlcik7Ci0gICAgICAgIHJldHVybjsKLSAg
ICB9Ci0KLSAgICAvLyBFbXB0eSBvdXQgdGhlc2UgbGlzdHMgYXMgYSBwZXJmb3JtYW5jZSBvcHRp
bWl6YXRpb24sIHNpbmNlIGRldGFjaGluZwotICAgIC8vIGFsbCB0aGUgaW5kaXZpZHVhbCByZW5k
ZXIgb2JqZWN0cyB3aWxsIGNhdXNlIGFsbCB0aGUgUmVuZGVySW1hZ2UKLSAgICAvLyBvYmplY3Rz
IHRvIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGxpc3RzLgotICAgIG1faW1hZ2VMb2FkRXZl
bnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7Ci0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNo
aW5nTGlzdC5jbGVhcigpOwotICAgIAotICAgIENvbnRhaW5lck5vZGVJbXBsOjpkZXRhY2goKTsK
LQotICAgIGlmICggcmVuZGVyICkKLSAgICAgICAgcmVuZGVyLT5kZXN0cm95KCk7Ci0KLSAgICBp
ZiAobV9wYWludERldmljZSA9PSBtX3ZpZXcpCi0gICAgICAgIHNldFBhaW50RGV2aWNlKDApOwot
ICAgIG1fdmlldyA9IDA7Ci0gICAgCi0gICAgaWYgKG1fcmVuZGVyQXJlbmEpewotICAgICAgICBk
ZWxldGUgbV9yZW5kZXJBcmVuYTsKLSAgICAgICAgbV9yZW5kZXJBcmVuYSA9IDA7Ci0gICAgfQot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tQWxsTm9k
ZXMoKQotewotICAgIG1fd2luZG93RXZlbnRMaXN0ZW5lcnMuY2xlYXIoKTsKLSAgICByZW1vdmVB
bGxEaXNjb25uZWN0ZWROb2RlRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICBmb3IgKE5vZGVJbXBsICpu
ID0gdGhpczsgbjsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotICAgICAgICBuLT5yZW1v
dmVBbGxFdmVudExpc3RlbmVycygpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJl
Z2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhFdmVudExpc3RlbmVycyhOb2RlSW1wbCAqbm9kZSkK
LXsKLSAgICBtX2Rpc2Nvbm5lY3RlZE5vZGVzV2l0aEV2ZW50TGlzdGVuZXJzLmluc2VydChub2Rl
LCBub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnVucmVnaXN0ZXJEaXNjb25uZWN0ZWRO
b2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKQotewotICAgIG1fZGlzY29ubmVj
dGVkTm9kZXNXaXRoRXZlbnRMaXN0ZW5lcnMucmVtb3ZlKG5vZGUpOwotfQotCi12b2lkIERvY3Vt
ZW50SW1wbDo6cmVtb3ZlQWxsRGlzY29ubmVjdGVkTm9kZUV2ZW50TGlzdGVuZXJzKCkKLXsKLSAg
ICBmb3IgKFFQdHJEaWN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0ZXIobV9kaXNjb25uZWN0ZWROb2Rl
c1dpdGhFdmVudExpc3RlbmVycyk7Ci0gICAgICAgICBpdGVyLmN1cnJlbnQoKTsKLSAgICAgICAg
ICsraXRlcikgewotICAgICAgICBpdGVyLmN1cnJlbnQoKS0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5l
cnMoKTsKLSAgICB9Ci0gICAgbV9kaXNjb25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycy5j
bGVhcigpOwotfQotCi1LV1FBY2NPYmplY3RDYWNoZSogRG9jdW1lbnRJbXBsOjpnZXRBY2NPYmpl
Y3RDYWNoZSgpCi17Ci0gICAgLy8gVGhlIG9ubHkgZG9jdW1lbnQgdGhhdCBhY3R1YWxseSBoYXMg
YSBLV1FBY2NPYmplY3RDYWNoZSBpcyB0aGUgdG9wLWxldmVsCi0gICAgLy8gZG9jdW1lbnQuICBU
aGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIGdldCBmcm9tIGFueSBLV1FBY2NP
YmplY3QKLSAgICAvLyB0byBhbnkgb3RoZXIgS1dRQWNjT2JqZWN0IG9uIHRoZSBzYW1lIHBhZ2Uu
ICBVc2luZyBhIHNpbmdsZSBjYWNoZSBhbGxvd3MKLSAgICAvLyBsb29rdXBzIGFjcm9zcyBuZXN0
ZWQgd2ViYXJlYXMgKGkuZS4gbXVsdGlwbGUgZG9jdW1lbnRzKS4KLSAgICAKLSAgICBpZiAobV9h
Y2NDYWNoZSkgewotICAgICAgICAvLyByZXR1cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2Fj
aGUKLSAgICAgICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgIHJldHVybiBtX2Fj
Y0NhY2hlOwotICAgICAgICAKLSAgICAgICAgLy8gSW4gc29tZSBwYWdlcyB3aXRoIGZyYW1lcywg
dGhlIGNhY2hlIGlzIGNyZWF0ZWQgYmVmb3JlIHRoZSBzdWItd2ViYXJlYSBpcwotICAgICAgICAv
LyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLiAgSGVyZSwgd2UgY2F0Y2ggdGhhdCBjYXNlIGFuZCBq
dXN0IHRvc3MgdGhlIG9sZAotICAgICAgICAvLyBjYWNoZSBhbmQgc3RhcnQgb3Zlci4KLSAgICAg
ICAgZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAgICAgIG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAg
ICAKLSAgICAvLyBsb29rIGZvciB0b3AtbGV2ZWwgZG9jdW1lbnQKLSAgICBFbGVtZW50SW1wbCAq
ZWxlbWVudCA9IG93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgIERv
Y3VtZW50SW1wbCAqZG9jOwotICAgICAgICB3aGlsZSAoZWxlbWVudCkgewotICAgICAgICAgICAg
ZG9jID0gZWxlbWVudC0+Z2V0RG9jdW1lbnQoKTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBkb2Mt
Pm93bmVyRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICAvLyBhc2sgdGhl
IHRvcC1sZXZlbCBkb2N1bWVudCBmb3IgaXRzIGNhY2hlCi0gICAgICAgIHJldHVybiBkb2MtPmdl
dEFjY09iamVjdENhY2hlKCk7Ci0gICAgfQotICAgIAotICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1s
ZXZlbCBkb2N1bWVudCwgc28gaW5zdGFsbCBhIG5ldyBjYWNoZQotICAgIG1fYWNjQ2FjaGUgPSBu
ZXcgS1dRQWNjT2JqZWN0Q2FjaGU7Ci0gICAgcmV0dXJuIG1fYWNjQ2FjaGU7Ci19Ci0KLXZvaWQg
RG9jdW1lbnRJbXBsOjpzZXRWaXN1YWxseU9yZGVyZWQoKQotewotICAgIHZpc3VhbGx5T3JkZXJl
ZCA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVyKQotICAgICAgICBtX3JlbmRlci0+c3R5bGUoKS0+
c2V0VmlzdWFsbHlPcmRlcmVkKHRydWUpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRl
U2VsZWN0aW9uKCkKLXsKLSAgICBpZiAoIW1fcmVuZGVyKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgUmVuZGVyQ2FudmFzICpjYW52YXMgPSBzdGF0aWNfY2FzdDxSZW5kZXJDYW52YXMqPiht
X3JlbmRlcik7Ci0gICAgU2VsZWN0aW9uQ29udHJvbGxlciBzID0gZnJhbWUoKS0+c2VsZWN0aW9u
KCk7Ci0gICAgaWYgKCFzLmlzUmFuZ2UoKSkgewotICAgICAgICBjYW52YXMtPmNsZWFyU2VsZWN0
aW9uKCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBQb3NpdGlvbiBzdGFydFBvcyA9IFZp
c2libGVQb3NpdGlvbihzLnN0YXJ0KCksIHMuc3RhcnRBZmZpbml0eSgpKS5kZWVwRXF1aXZhbGVu
dCgpOwotICAgICAgICBQb3NpdGlvbiBlbmRQb3MgPSBWaXNpYmxlUG9zaXRpb24ocy5lbmQoKSwg
cy5lbmRBZmZpbml0eSgpKS5kZWVwRXF1aXZhbGVudCgpOwotICAgICAgICBpZiAoc3RhcnRQb3Mu
aXNOb3ROdWxsKCkgJiYgZW5kUG9zLmlzTm90TnVsbCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJP
YmplY3QgKnN0YXJ0UmVuZGVyZXIgPSBzdGFydFBvcy5ub2RlKCktPnJlbmRlcmVyKCk7Ci0gICAg
ICAgICAgICBSZW5kZXJPYmplY3QgKmVuZFJlbmRlcmVyID0gZW5kUG9zLm5vZGUoKS0+cmVuZGVy
ZXIoKTsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlckNhbnZhcyo+KG1fcmVuZGVyKS0+
c2V0U2VsZWN0aW9uKHN0YXJ0UmVuZGVyZXIsIHN0YXJ0UG9zLm9mZnNldCgpLCBlbmRSZW5kZXJl
ciwgZW5kUG9zLm9mZnNldCgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBzZW5k
IHRoZSBBWFNlbGVjdGVkVGV4dENoYW5nZWQgbm90aWZpY2F0aW9uIG9ubHkgaWYgdGhlIG5ldyBz
ZWxlY3Rpb24gaXMgbm9uLW51bGwsCi0gICAgLy8gYmVjYXVzZSBudWxsIHNlbGVjdGlvbnMgYXJl
IG9ubHkgdHJhbnNpdG9yeSAoZS5nLiB3aGVuIHN0YXJ0aW5nIGFuIEVkaXRDb21tYW5kLCBjdXJy
ZW50bHkpCi0gICAgaWYgKEtXUUFjY09iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgp
ICYmIHMuc3RhcnQoKS5pc05vdE51bGwoKSAmJiBzLmVuZCgpLmlzTm90TnVsbCgpKSB7Ci0gICAg
ICAgIGdldEFjY09iamVjdENhY2hlKCktPnBvc3ROb3RpZmljYXRpb25Ub1RvcFdlYkFyZWEocmVu
ZGVyZXIoKSwgIkFYU2VsZWN0ZWRUZXh0Q2hhbmdlZCIpOwotICAgIH0KLQotfQotCi1Ub2tlbml6
ZXIgKkRvY3VtZW50SW1wbDo6Y3JlYXRlVG9rZW5pemVyKCkKLXsKLSAgICByZXR1cm4gbmV3WE1M
VG9rZW5pemVyKHRoaXMsIG1fdmlldyk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRQYWlu
dERldmljZSggUVBhaW50RGV2aWNlICpkZXYgKQotewotICAgIGlmIChtX3BhaW50RGV2aWNlID09
IGRldikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fcGFpbnREZXZpY2UgPSBkZXY7
Ci0gICAgZGVsZXRlIG1fcGFpbnREZXZpY2VNZXRyaWNzOwotICAgIG1fcGFpbnREZXZpY2VNZXRy
aWNzID0gZGV2ID8gbmV3IFFQYWludERldmljZU1ldHJpY3MoIGRldiApIDogMDsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6Om9wZW4oICApCi17Ci0gICAgaWYgKHBhcnNpbmcoKSkgcmV0dXJuOwot
Ci0gICAgaW1wbGljaXRPcGVuKCk7Ci0KLSAgICBpZiAoZnJhbWUoKSkgewotICAgICAgICBmcmFt
ZSgpLT5kaWRFeHBsaWNpdE9wZW4oKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIHdvcmsgdGhh
dCB3ZSBzaG91bGQgcHJvYmFibHkgZG8gaW4gY2xlYXIoKSwgYnV0IHdlIGNhbid0IGhhdmUgaXQK
LSAgICAvLyBoYXBwZW4gd2hlbiBpbXBsaWNpdE9wZW4oKSBpcyBjYWxsZWQgdW5sZXNzIHdlIHJl
b3JnYW5pemUgRnJhbWUgY29kZS4KLSAgICBzZXRVUkwoUVN0cmluZygpKTsKLSAgICBEb2N1bWVu
dEltcGwgKnBhcmVudCA9IHBhcmVudERvY3VtZW50KCk7Ci0gICAgaWYgKHBhcmVudCkgewotICAg
ICAgICBzZXRCYXNlVVJMKHBhcmVudC0+YmFzZVVSTCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9j
dW1lbnRJbXBsOjppbXBsaWNpdE9wZW4oKQotewotICAgIGlmIChtX3Rva2VuaXplcikKLSAgICAg
ICAgY2xvc2UoKTsKLQotICAgIGNsZWFyKCk7Ci0gICAgbV90b2tlbml6ZXIgPSBjcmVhdGVUb2tl
bml6ZXIoKTsKLSAgICBjb25uZWN0KG1fdG9rZW5pemVyLFNJR05BTChmaW5pc2hlZFBhcnNpbmco
KSksdGhpcyxTSUdOQUwoZmluaXNoZWRQYXJzaW5nKCkpKTsKLSAgICBzZXRQYXJzaW5nKHRydWUp
OwotfQotCi1IVE1MRWxlbWVudEltcGwqIERvY3VtZW50SW1wbDo6Ym9keSgpCi17Ci0gICAgTm9k
ZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgaWYgKCFkZSkKLSAgICAgICAgcmV0
dXJuIDA7Ci0gICAgCi0gICAgLy8gdHJ5IHRvIHByZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3Zl
ciBCT0RZCi0gICAgTm9kZUltcGwqIGJvZHkgPSAwOwotICAgIGZvciAoTm9kZUltcGwqIGkgPSBk
ZS0+Zmlyc3RDaGlsZCgpOyBpOyBpID0gaS0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAo
aS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nh
c3Q8SFRNTEVsZW1lbnRJbXBsKj4oaSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoaS0+aGFzVGFn
TmFtZShib2R5VGFnKSkKLSAgICAgICAgICAgIGJvZHkgPSBpOwotICAgIH0KLSAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KGJvZHkpOwotfQotCi12b2lkIERvY3VtZW50
SW1wbDo6Y2xvc2UoKQotewotICAgIGlmIChmcmFtZSgpKQotICAgICAgICBmcmFtZSgpLT5lbmRJ
Zk5vdExvYWRpbmcoKTsKLSAgICBpbXBsaWNpdENsb3NlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjppbXBsaWNpdENsb3NlKCkKLXsKLSAgICAvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9m
IHJlY2FsY1N0eWxlLCB3ZSBuZWVkIHRvIGRlZmVyIHRoZSBjbG9zZSB1bnRpbCB0aGUgc3R5bGUg
aW5mb3JtYXRpb24gaXMgYWNjdXJhdGUgYW5kIGFsbCBlbGVtZW50cyBhcmUgcmUtYXR0YWNoZWQu
Ci0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykgewotICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJl
Y2FsYyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBib29sIHdhc0xvY2F0
aW9uQ2hhbmdlUGVuZGluZyA9IGZyYW1lKCkgJiYgZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlv
bkNoYW5nZVBlbmRpbmcoKTsKLSAgICBib29sIGRvbG9hZCA9ICFwYXJzaW5nKCkgJiYgbV90b2tl
bml6ZXIgJiYgIW1fcHJvY2Vzc2luZ0xvYWRFdmVudCAmJiAhd2FzTG9jYXRpb25DaGFuZ2VQZW5k
aW5nOwotICAgIAotICAgIGlmICghZG9sb2FkKQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3By
b2Nlc3NpbmdMb2FkRXZlbnQgPSB0cnVlOwotCi0gICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUg
dG9rZW5pemVyLCBpbiBjYXNlIHNvbWVvbmUgZG9jdW1lbnQud3JpdGUoKXMgZnJvbSB0aGUKLSAg
ICAvLyBvbkxvYWQgZXZlbnQgaGFuZGxlciwgYXMgaW4gUmFkYXIgMzIwNjUyNC4KLSAgICBkZWxl
dGUgbV90b2tlbml6ZXI7Ci0gICAgbV90b2tlbml6ZXIgPSAwOwotCi0gICAgLy8gQ3JlYXRlIGEg
Ym9keSBlbGVtZW50IGlmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBvbmUuCi0gICAgLy8gSW4gdGhl
IGNhc2Ugb2YgUmFkYXIgMzc1ODc4NSwgdGhlIHdpbmRvdy5vbmxvYWQgd2FzIHNldCBpbiBzb21l
IGphdmFzY3JpcHQsIGJ1dCBuZXZlciBmaXJlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyBib2R5LiAg
Ci0gICAgLy8gVGhpcyBiZWhhdmlvciBub3cgbWF0Y2hlcyBGaXJlZm94IGFuZCBJRS4KLSAgICBI
VE1MRWxlbWVudEltcGwgKmJvZHkgPSB0aGlzLT5ib2R5KCk7Ci0gICAgaWYgKCFib2R5ICYmIGlz
SFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgTm9kZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50
KCk7Ci0gICAgICAgIGlmIChkZSkgewotICAgICAgICAgICAgYm9keSA9IG5ldyBIVE1MQm9keUVs
ZW1lbnRJbXBsKHRoaXMpOwotICAgICAgICAgICAgaW50IGV4Y2VwdGlvbkNvZGUgPSAwOwotICAg
ICAgICAgICAgZGUtPmFwcGVuZENoaWxkKGJvZHksIGV4Y2VwdGlvbkNvZGUpOwotICAgICAgICAg
ICAgaWYgKGV4Y2VwdGlvbkNvZGUgIT0gMCkKLSAgICAgICAgICAgICAgICBib2R5ID0gMDsKLSAg
ICAgICAgfQotICAgIH0KLSAgICAKLSAgICBOb2RlSW1wbCAqb25sb2FkVGFyZ2V0ID0gYm9keTsK
LSAgICBpZiAoIWlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgIG9ubG9hZFRhcmdldCA9IGRvY3Vt
ZW50RWxlbWVudCgpOwotCi0gICAgaWYgKG9ubG9hZFRhcmdldCkgewotICAgICAgICBkaXNwYXRj
aEltYWdlTG9hZEV2ZW50c05vdygpOwotICAgICAgICBvbmxvYWRUYXJnZXQtPmRpc3BhdGNoV2lu
ZG93RXZlbnQobG9hZEV2ZW50LCBmYWxzZSwgZmFsc2UpOwotICAgICAgICBpZiAoRnJhbWUgKnAg
PSBmcmFtZSgpKQotICAgICAgICAgICAgTWFjKHApLT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7Ci0j
aWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgICAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQotICAgICAgICAgICAgcHJpbnRmKCJvbmxvYWQgZmlyZWQgYXQgJWRcbiIsIGVsYXBz
ZWRUaW1lKCkpOwotI2VuZGlmCi0gICAgfQotCi0gICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0g
ZmFsc2U7Ci0KLSAgICAvLyBNYWtlIHN1cmUgYm90aCB0aGUgaW5pdGlhbCBsYXlvdXQgYW5kIHJl
ZmxvdyBoYXBwZW4gYWZ0ZXIgdGhlIG9ubG9hZAotICAgIC8vIGZpcmVzLiBUaGlzIHdpbGwgaW1w
cm92ZSBvbmxvYWQgc2NvcmVzLCBhbmQgb3RoZXIgYnJvd3NlcnMgZG8gaXQuCi0gICAgLy8gSWYg
dGhleSB3YW5uYSBjaGVhdCwgd2UgY2FuIHRvby4gLWR3aAotCi0gICAgaWYgKGZyYW1lKCkgJiYg
ZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlvbkNoYW5nZVBlbmRpbmcoKSAmJiBtX3N0YXJ0VGlt
ZS5lbGFwc2VkKCkgPCBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQpIHsKLSAgICAgICAgLy8gSnVz
dCBiYWlsIG91dC4gQmVmb3JlIG9yIGR1cmluZyB0aGUgb25sb2FkIHdlIHdlcmUgc2hpZnRlZCB0
byBhbm90aGVyIHBhZ2UuCi0gICAgICAgIC8vIFRoZSBvbGQgaS1CZW5jaCBzdWl0ZSBkb2VzIHRo
aXMuIFdoZW4gdGhpcyBoYXBwZW5zIGRvbid0IGJvdGhlciBwYWludGluZyBvciBsYXlpbmcgb3V0
LiAgICAgICAgCi0gICAgICAgIHZpZXcoKS0+dW5zY2hlZHVsZVJlbGF5b3V0KCk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+Y2hl
Y2tFbWl0TG9hZEV2ZW50KCk7Ci0KLSAgICAvLyBOb3cgZG8gb3VyIHBhaW50aW5nL2xheW91dCwg
YnV0IG9ubHkgaWYgd2UgYXJlbid0IGluIGEgc3ViZnJhbWUgb3IgaWYgd2UncmUgaW4gYSBzdWJm
cmFtZQotICAgIC8vIHRoYXQgaGFzIGJlZW4gc2l6ZWQgYWxyZWFkeS4gIE90aGVyd2lzZSwgb3Vy
IHZpZXcgc2l6ZSB3b3VsZCBiZSBpbmNvcnJlY3QsIHNvIGRvaW5nIGFueSAKLSAgICAvLyBsYXlv
dXQvcGFpbnRpbmcgbm93IHdvdWxkIGJlIHBvaW50bGVzcy4KLSAgICBpZiAoIW93bmVyRWxlbWVu
dCgpIHx8IChvd25lckVsZW1lbnQoKS0+cmVuZGVyZXIoKSAmJiAhb3duZXJFbGVtZW50KCktPnJl
bmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKSB7Ci0gICAgICAgIHVwZGF0ZVJlbmRlcmluZygpOwot
ICAgICAgICAKLSAgICAgICAgLy8gQWx3YXlzIGRvIGEgbGF5b3V0IGFmdGVyIGxvYWRpbmcgaWYg
bmVlZGVkLgotICAgICAgICBpZiAodmlldygpICYmIHJlbmRlcmVyKCkgJiYgKCFyZW5kZXJlcigp
LT5maXJzdENoaWxkKCkgfHwgcmVuZGVyZXIoKS0+bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgICAg
ICB2aWV3KCktPmxheW91dCgpOwotICAgIH0KLSAgICBpZiAocmVuZGVyZXIoKSAmJiBLV1FBY2NP
YmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVuYWJsZWQoKSkKLSAgICAgICAgZ2V0QWNjT2JqZWN0
Q2FjaGUoKS0+cG9zdE5vdGlmaWNhdGlvbihyZW5kZXJlcigpLCAiQVhMb2FkQ29tcGxldGUiKTsK
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFBhcnNpbmcoYm9vbCBiKQotewotICAgIG1fYlBh
cnNpbmcgPSBiOwotICAgIGlmICghbV9iUGFyc2luZyAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXco
KS0+c2NoZWR1bGVSZWxheW91dCgpOwotCi0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURV
TElORwotICAgIGlmICghb3duZXJFbGVtZW50KCkgJiYgIW1fYlBhcnNpbmcpCi0gICAgICAgIHBy
aW50ZigiUGFyc2luZyBmaW5pc2hlZCBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYK
LX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnNob3VsZFNjaGVkdWxlTGF5b3V0KCkKLXsKLSAgICAv
LyBXZSBjYW4gdXBkYXRlIGxheW91dCBpZjoKLSAgICAvLyAoYSkgd2UgYWN0dWFsbHkgbmVlZCBh
IGxheW91dAotICAgIC8vIChiKSBvdXIgc3R5bGVzaGVldHMgYXJlIGFsbCBsb2FkZWQKLSAgICAv
LyAoYykgd2UgaGF2ZSBhIDxib2R5PgotICAgIHJldHVybiAocmVuZGVyZXIoKSAmJiByZW5kZXJl
cigpLT5uZWVkc0xheW91dCgpICYmIGhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpICYmCi0gICAgICAg
ICAgICBkb2N1bWVudEVsZW1lbnQoKSAmJiBkb2N1bWVudEVsZW1lbnQoKS0+cmVuZGVyZXIoKSAm
JgotICAgICAgICAgICAgKCFkb2N1bWVudEVsZW1lbnQoKS0+aGFzVGFnTmFtZShodG1sVGFnKSB8
fCBib2R5KCkpKTsKLX0KLQotaW50IERvY3VtZW50SW1wbDo6bWluaW11bUxheW91dERlbGF5KCkK
LXsKLSAgICBpZiAobV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJu
IDA7Ci0gICAgCi0gICAgaW50IGVsYXBzZWQgPSBtX3N0YXJ0VGltZS5lbGFwc2VkKCk7Ci0gICAg
bV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCA9IGVsYXBzZWQgPiBjTGF5b3V0U2NoZWR1bGVU
aHJlc2hvbGQ7Ci0gICAgCi0gICAgLy8gV2UnbGwgd2FudCB0byBzY2hlZHVsZSB0aGUgdGltZXIg
dG8gZmlyZSBhdCB0aGUgbWluaW11bSBsYXlvdXQgdGhyZXNob2xkLgotICAgIHJldHVybiBrTWF4
KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9sZCAtIGVsYXBzZWQpOwotfQotCi1pbnQgRG9jdW1l
bnRJbXBsOjplbGFwc2VkVGltZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fc3RhcnRUaW1lLmVs
YXBzZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OndyaXRlKCBjb25zdCBET01TdHJpbmcg
JnRleHQgKQotewotICAgIHdyaXRlKHRleHQucXN0cmluZygpKTsKLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OndyaXRlKCBjb25zdCBRU3RyaW5nICZ0ZXh0ICkKLXsKLSNpZmRlZiBJTlNUUlVNRU5U
X0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJp
bnRmKCJCZWdpbm5pbmcgYSBkb2N1bWVudC53cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7
Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAoIW1fdG9rZW5pemVyKSB7Ci0gICAgICAgIG9wZW4oKTsK
LSAgICAgICAgYXNzZXJ0KG1fdG9rZW5pemVyKTsKLSAgICAgICAgd3JpdGUoUVN0cmluZygiPGh0
bWw+IikpOwotICAgIH0KLSAgICBtX3Rva2VuaXplci0+d3JpdGUodGV4dCwgZmFsc2UpOwotICAg
IAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxl
bWVudCgpKQotICAgICAgICBwcmludGYoIkVuZGluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVkXG4i
LCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZiAgICAKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6Ondy
aXRlbG4oIGNvbnN0IERPTVN0cmluZyAmdGV4dCApCi17Ci0gICAgd3JpdGUodGV4dCk7Ci0gICAg
d3JpdGUoRE9NU3RyaW5nKCJcbiIpKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmZpbmlzaFBh
cnNpbmcoKQotewotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAo
IW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIlJlY2VpdmVkIGFsbCBkYXRhIGF0ICVk
XG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotICAgIAotICAgIC8vIExldCB0aGUgdG9rZW5p
emVyIGdvIHRocm91Z2ggYXMgbXVjaCBkYXRhIGFzIGl0IGNhbi4gIFRoZXJlIHdpbGwgYmUgdGhy
ZWUgcG9zc2libGUgb3V0Y29tZXMgYWZ0ZXIKLSAgICAvLyBmaW5pc2goKSBpcyBjYWxsZWQ6Ci0g
ICAgLy8gKDEpIEFsbCByZW1haW5pbmcgZGF0YSBpcyBwYXJzZWQsIGRvY3VtZW50IGlzbid0IGxv
YWRlZCB5ZXQKLSAgICAvLyAoMikgQWxsIHJlbWFpbmluZyBkYXRhIGlzIHBhcnNlZCwgZG9jdW1l
bnQgaXMgbG9hZGVkLCB0b2tlbml6ZXIgZ2V0cyBkZWxldGVkCi0gICAgLy8gKDMpIERhdGEgaXMg
c3RpbGwgcmVtYWluaW5nIHRvIGJlIHBhcnNlZC4KLSAgICBpZiAobV90b2tlbml6ZXIpCi0gICAg
ICAgIG1fdG9rZW5pemVyLT5maW5pc2goKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmNsZWFy
KCkKLXsKLSAgICBkZWxldGUgbV90b2tlbml6ZXI7Ci0gICAgbV90b2tlbml6ZXIgPSAwOwotCi0g
ICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVu
dExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3Vy
cmVudCgpOykKLSAgICAgICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5yZW1vdmVSZWYoaXQuY3Vy
cmVudCgpKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFVSTChjb25zdCBRU3RyaW5nJiB1
cmwpCi17Ci0gICAgbV91cmwgPSB1cmw7Ci0gICAgaWYgKG1fc3R5bGVTZWxlY3RvcikKLSAgICAg
ICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRFbmNvZGVkVVJMKG1fdXJsKTsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnNldFN0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IERPTVN0
cmluZyAmc2hlZXQpCi17Ci0vLyAgICBrZERlYnVnKCA2MDMwICkgPDwgIkhUTUxEb2N1bWVudDo6
c2V0U3R5bGVTaGVldCgpIiA8PCBlbmRsOwotICAgIG1fc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVl
dEltcGwodGhpcywgdXJsKTsKLSAgICBtX3NoZWV0LT5yZWYoKTsKLSAgICBtX3NoZWV0LT5wYXJz
ZVN0cmluZyhzaGVldCk7Ci0gICAgbV9sb2FkaW5nU2hlZXQgPSBmYWxzZTsKLQotICAgIHVwZGF0
ZVN0eWxlU2VsZWN0b3IoKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFVzZXJTdHlsZVNo
ZWV0KCBjb25zdCBRU3RyaW5nJiBzaGVldCApCi17Ci0gICAgaWYgKCBtX3VzZXJzaGVldCAhPSBz
aGVldCApIHsKLSAgICAgICAgbV91c2Vyc2hlZXQgPSBzaGVldDsKLQl1cGRhdGVTdHlsZVNlbGVj
dG9yKCk7Ci0gICAgfQotfQotCi1DU1NTdHlsZVNoZWV0SW1wbCogRG9jdW1lbnRJbXBsOjplbGVt
ZW50U2hlZXQoKQotewotICAgIGlmICghbV9lbGVtU2hlZXQpIHsKLSAgICAgICAgbV9lbGVtU2hl
ZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcywgYmFzZVVSTCgpICk7Ci0gICAgICAgIG1f
ZWxlbVNoZWV0LT5yZWYoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fZWxlbVNoZWV0OwotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6ZGV0ZXJtaW5lUGFyc2VNb2RlKCBjb25zdCBRU3RyaW5nICYvKnN0
ciovICkKLXsKLSAgICAvLyBGb3IgWE1MIGRvY3VtZW50cyB1c2Ugc3RyaWN0IHBhcnNlIG1vZGUu
ICBIVE1MIGRvY3Mgd2lsbCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0bwotICAgIC8vIGRldGVybWlu
ZSB0aGVpciBwYXJzZSBtb2RlLgotICAgIHBNb2RlID0gU3RyaWN0OwotICAgIGhNb2RlID0gWEh0
bWw7Ci0gICAga2REZWJ1Zyg2MDIwKSA8PCAiIHVzaW5nIHN0cmljdCBwYXJzZU1vZGUiIDw8IGVu
ZGw7Ci19Ci0KLU5vZGVJbXBsICpEb2N1bWVudEltcGw6Om5leHRGb2N1c05vZGUoTm9kZUltcGwg
KmZyb21Ob2RlKQotewotICAgIHVuc2lnbmVkIHNob3J0IGZyb21UYWJJbmRleDsKLQotICAgIGlm
ICghZnJvbU5vZGUpIHsKLQkvLyBObyBzdGFydGluZyBub2RlIHN1cHBsaWVkOyBiZWdpbiB3aXRo
IHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50Ci0JTm9kZUltcGwgKm47Ci0KLQlpbnQgbG93ZXN0VGFi
SW5kZXggPSA2NTUzNTsKLQlmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5l
eHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAo
KG4tPnRhYkluZGV4KCkgPiAwKSAmJiAobi0+dGFiSW5kZXgoKSA8IGxvd2VzdFRhYkluZGV4KSkK
LQkJICAgIGxvd2VzdFRhYkluZGV4ID0gbi0+dGFiSW5kZXgoKTsKLQkgICAgfQotCX0KLQotCWlm
IChsb3dlc3RUYWJJbmRleCA9PSA2NTUzNSkKLQkgICAgbG93ZXN0VGFiSW5kZXggPSAwOwotCi0J
Ly8gR28gdG8gdGhlIGZpcnN0IG5vZGUgaW4gdGhlIGRvY3VtZW50IHRoYXQgaGFzIHRoZSBkZXNp
cmVkIHRhYiBpbmRleAotCWZvciAobiA9IHRoaXM7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlTmV4
dE5vZGUoKSkgewotCSAgICBpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIChuLT50YWJJ
bmRleCgpID09IGxvd2VzdFRhYkluZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JcmV0dXJuIDA7
Ci0gICAgfQotICAgIGVsc2UgewotCWZyb21UYWJJbmRleCA9IGZyb21Ob2RlLT50YWJJbmRleCgp
OwotICAgIH0KLQotICAgIGlmIChmcm9tVGFiSW5kZXggPT0gMCkgewotCS8vIEp1c3QgbmVlZCB0
byBmaW5kIHRoZSBuZXh0IHNlbGVjdGFibGUgbm9kZSBhZnRlciBmcm9tTm9kZSAoaW4gZG9jdW1l
bnQgb3JkZXIpIHRoYXQgZG9lc24ndCBoYXZlIGEgdGFiIGluZGV4Ci0JTm9kZUltcGwgKm4gPSBm
cm9tTm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOwotCXdoaWxlIChuICYmICEobi0+aXNLZXlib2Fy
ZEZvY3VzYWJsZSgpICYmIG4tPnRhYkluZGV4KCkgPT0gMCkpCi0JICAgIG4gPSBuLT50cmF2ZXJz
ZU5leHROb2RlKCk7Ci0JcmV0dXJuIG47Ci0gICAgfQotICAgIGVsc2UgewotCS8vIEZpbmQgdGhl
IGxvd2VzdCB0YWIgaW5kZXggb3V0IG9mIGFsbCB0aGUgbm9kZXMgZXhjZXB0IGZyb21Ob2RlLCB0
aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBmcm9tTm9kZSdzCi0JLy8gdGFiIGluZGV4
LiBGb3Igbm9kZXMgd2l0aCB0aGUgc2FtZSB0YWIgaW5kZXggYXMgZnJvbU5vZGUsIHdlIGFyZSBv
bmx5IGludGVyZXN0ZWQgaW4gdGhvc2UgdGhhdCBjb21lIGFmdGVyCi0JLy8gZnJvbU5vZGUgaW4g
ZG9jdW1lbnQgb3JkZXIuCi0JLy8gSWYgd2UgZG9uJ3QgZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRl
eCwgdGhlIG5leHQgZm9jdXMgbm9kZSB3aWxsIGJlIG9uZSB3aXRoIGEgdGFiIGluZGV4IG9mIDAu
Ci0JdW5zaWduZWQgc2hvcnQgbG93ZXN0U3VpdGFibGVUYWJJbmRleCA9IDY1NTM1OwotCU5vZGVJ
bXBsICpuOwotCi0JYm9vbCByZWFjaGVkRnJvbU5vZGUgPSBmYWxzZTsKLQlmb3IgKG4gPSB0aGlz
OyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSAmJgotCQkoKHJlYWNoZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgo
KSA+PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkgKCFyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYklu
ZGV4KCkgPiBmcm9tVGFiSW5kZXgpKSkgJiYKLQkJKG4tPnRhYkluZGV4KCkgPCBsb3dlc3RTdWl0
YWJsZVRhYkluZGV4KSAmJgotCQkobiAhPSBmcm9tTm9kZSkpIHsKLQotCQkvLyBXZSBmb3VuZCBh
IHNlbGVjdGFibGUgbm9kZSB3aXRoIGEgdGFiIGluZGV4IGF0IGxlYXN0IGFzIGhpZ2ggYXMgZnJv
bU5vZGUncy4gS2VlcCBzZWFyY2hpbmcgdGhvdWdoLAotCQkvLyBhcyB0aGVyZSBtYXkgYmUgYW5v
dGhlciBub2RlIHdoaWNoIGhhcyBhIGxvd2VyIHRhYiBpbmRleCBidXQgaXMgc3RpbGwgc3VpdGFi
bGUgZm9yIHVzZS4KLQkJbG93ZXN0U3VpdGFibGVUYWJJbmRleCA9IG4tPnRhYkluZGV4KCk7Ci0J
ICAgIH0KLQotCSAgICBpZiAobiA9PSBmcm9tTm9kZSkKLQkJcmVhY2hlZEZyb21Ob2RlID0gdHJ1
ZTsKLQl9Ci0KLQlpZiAobG93ZXN0U3VpdGFibGVUYWJJbmRleCA9PSA2NTUzNSkgewotCSAgICAv
LyBObyBuZXh0IG5vZGUgd2l0aCBhIHRhYiBpbmRleCAtPiBqdXN0IHRha2UgZmlyc3Qgbm9kZSB3
aXRoIHRhYiBpbmRleCBvZiAwCi0JICAgIE5vZGVJbXBsICpuID0gdGhpczsKLQkgICAgd2hpbGUg
KG4gJiYgIShuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgbi0+dGFiSW5kZXgoKSA9PSAwKSkK
LQkJbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKTsKLQkgICAgcmV0dXJuIG47Ci0JfQotCi0JLy8g
U2VhcmNoIGZvcndhcmRzIGZyb20gZnJvbU5vZGUKLQlmb3IgKG4gPSBmcm9tTm9kZS0+dHJhdmVy
c2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAg
aWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBsb3dlc3RT
dWl0YWJsZVRhYkluZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JLy8gVGhlIG5leHQgbm9kZSBp
c24ndCBhZnRlciBmcm9tTm9kZSwgc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1
bWVudAotCWZvciAobiA9IHRoaXM7IG4gIT0gZnJvbU5vZGU7IG4gPSBuLT50cmF2ZXJzZU5leHRO
b2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5k
ZXgoKSA9PSBsb3dlc3RTdWl0YWJsZVRhYkluZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JYXNz
ZXJ0KGZhbHNlKTsgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlCi0JcmV0dXJuIDA7Ci0gICAgfQot
fQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjpwcmV2aW91c0ZvY3VzTm9kZShOb2RlSW1wbCAq
ZnJvbU5vZGUpCi17Ci0gICAgTm9kZUltcGwgKmxhc3ROb2RlID0gdGhpczsKLSAgICB3aGlsZSAo
bGFzdE5vZGUtPmxhc3RDaGlsZCgpKQotCWxhc3ROb2RlID0gbGFzdE5vZGUtPmxhc3RDaGlsZCgp
OwotCi0gICAgaWYgKCFmcm9tTm9kZSkgewotCS8vIE5vIHN0YXJ0aW5nIG5vZGUgc3VwcGxpZWQ7
IGJlZ2luIHdpdGggdGhlIHZlcnkgbGFzdCBub2RlIGluIHRoZSBkb2N1bWVudAotCU5vZGVJbXBs
ICpuOwotCi0JaW50IGhpZ2hlc3RUYWJJbmRleCA9IDA7Ci0JZm9yIChuID0gbGFzdE5vZGU7IG4g
IT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAobi0+dGFiSW5kZXgoKSA9PSAwKQotCQkgICAgcmV0
dXJuIG47Ci0JCWVsc2UgaWYgKG4tPnRhYkluZGV4KCkgPiBoaWdoZXN0VGFiSW5kZXgpCi0JCSAg
ICBoaWdoZXN0VGFiSW5kZXggPSBuLT50YWJJbmRleCgpOwotCSAgICB9Ci0JfQotCi0JLy8gTm8g
bm9kZSB3aXRoIGEgdGFiIGluZGV4IG9mIDA7IGp1c3QgZ28gdG8gdGhlIGxhc3Qgbm9kZSB3aXRo
IHRoZSBoaWdoZXN0IHRhYiBpbmRleAotCWZvciAobiA9IGxhc3ROb2RlOyBuICE9IDA7IG4gPSBu
LT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNh
YmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gaGlnaGVzdFRhYkluZGV4KSkKLQkJcmV0dXJuIG47
Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotCXVuc2lnbmVkIHNob3J0IGZy
b21UYWJJbmRleCA9IGZyb21Ob2RlLT50YWJJbmRleCgpOwotCi0JaWYgKGZyb21UYWJJbmRleCA9
PSAwKSB7Ci0JICAgIC8vIEZpbmQgdGhlIHByZXZpb3VzIHNlbGVjdGFibGUgbm9kZSBiZWZvcmUg
ZnJvbU5vZGUgKGluIGRvY3VtZW50IG9yZGVyKSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHRhYiBpbmRl
eAotCSAgICBOb2RlSW1wbCAqbiA9IGZyb21Ob2RlLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpOwot
CSAgICB3aGlsZSAobiAmJiAhKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiBuLT50YWJJbmRl
eCgpID09IDApKQotCQluID0gbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKTsKLQkgICAgaWYgKG4p
Ci0JCXJldHVybiBuOwotCi0JICAgIC8vIE5vIHByZXZpb3VzIG5vZGVzIHdpdGggYSAwIHRhYiBp
bmRleCwgZ28gdG8gdGhlIGxhc3Qgbm9kZSBpbiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgdGhlIGhp
Z2hlc3QgdGFiIGluZGV4Ci0JICAgIGludCBoaWdoZXN0VGFiSW5kZXggPSAwOwotCSAgICBmb3Ig
KG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkJaWYgKG4t
PmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA+IGhpZ2hlc3RUYWJJbmRl
eCkpCi0JCSAgICBoaWdoZXN0VGFiSW5kZXggPSBuLT50YWJJbmRleCgpOwotCSAgICB9Ci0KLQkg
ICAgaWYgKGhpZ2hlc3RUYWJJbmRleCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCSAgICBmb3IgKG4g
PSBsYXN0Tm9kZTsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VQcmV2aW91c05vZGUoKSkgewotCQlp
ZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIChuLT50YWJJbmRleCgpID09IGhpZ2hlc3RU
YWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsKLQkgICAgfQotCi0JICAgIGFzc2VydChmYWxzZSk7
IC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQotCSAgICByZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0J
ICAgIC8vIEZpbmQgdGhlIGxvd2VzdCB0YWIgaW5kZXggb3V0IG9mIGFsbCB0aGUgbm9kZXMgZXhj
ZXB0IGZyb21Ob2RlLCB0aGF0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBmcm9tTm9kZSdzCi0J
ICAgIC8vIHRhYiBpbmRleC4gRm9yIG5vZGVzIHdpdGggdGhlIHNhbWUgdGFiIGluZGV4IGFzIGZy
b21Ob2RlLCB3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRob3NlIGJlZm9yZQotCSAgICAvLyBm
cm9tTm9kZS4KLQkgICAgLy8gSWYgd2UgZG9uJ3QgZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRleCwg
dGhlbiB0aGVyZSB3aWxsIGJlIG5vIHByZXZpb3VzIGZvY3VzIG5vZGUuCi0JICAgIHVuc2lnbmVk
IHNob3J0IGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4ID0gMDsKLQkgICAgTm9kZUltcGwgKm47Ci0K
LQkgICAgYm9vbCByZWFjaGVkRnJvbU5vZGUgPSBmYWxzZTsKLQkgICAgZm9yIChuID0gdGhpczsg
biAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJk
Rm9jdXNhYmxlKCkgJiYKLQkJICAgICgoIXJlYWNoZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgo
KSA8PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkgICAgIChyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRh
YkluZGV4KCkgPCBmcm9tVGFiSW5kZXgpKSkgICYmCi0JCSAgICAobi0+dGFiSW5kZXgoKSA+IGhp
Z2hlc3RTdWl0YWJsZVRhYkluZGV4KSAmJgotCQkgICAgKG4gIT0gZnJvbU5vZGUpKSB7Ci0KLQkJ
ICAgIC8vIFdlIGZvdW5kIGEgc2VsZWN0YWJsZSBub2RlIHdpdGggYSB0YWIgaW5kZXggbm8gaGln
aGVyIHRoYW4gZnJvbU5vZGUncy4gS2VlcCBzZWFyY2hpbmcgdGhvdWdoLCBhcwotCQkgICAgLy8g
dGhlcmUgbWF5IGJlIGFub3RoZXIgbm9kZSB3aGljaCBoYXMgYSBoaWdoZXIgdGFiIGluZGV4IGJ1
dCBpcyBzdGlsbCBzdWl0YWJsZSBmb3IgdXNlLgotCQkgICAgaGlnaGVzdFN1aXRhYmxlVGFiSW5k
ZXggPSBuLT50YWJJbmRleCgpOwotCQl9Ci0KLQkJaWYgKG4gPT0gZnJvbU5vZGUpCi0JCSAgICBy
ZWFjaGVkRnJvbU5vZGUgPSB0cnVlOwotCSAgICB9Ci0KLQkgICAgaWYgKGhpZ2hlc3RTdWl0YWJs
ZVRhYkluZGV4ID09IDApIHsKLQkJLy8gTm8gcHJldmlvdXMgbm9kZSB3aXRoIGEgdGFiIGluZGV4
LiBTaW5jZSB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IEhUTUwgaXMgbm9kZXMgd2l0aCB0YWIgaW5k
ZXggPiAwCi0JCS8vIGZpcnN0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm8gcHJldmlvdXMg
bm9kZS4KLQkJcmV0dXJuIDA7Ci0JICAgIH0KLQotCSAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZy
b20gZnJvbU5vZGUKLQkgICAgZm9yIChuID0gZnJvbU5vZGUtPnRyYXZlcnNlUHJldmlvdXNOb2Rl
KCk7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJldmlvdXNOb2RlKCkpIHsKLQkJaWYgKG4tPmlz
S2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBoaWdoZXN0U3VpdGFibGVU
YWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsKLQkgICAgfQotCSAgICAvLyBUaGUgcHJldmlvdXMg
bm9kZSBpc24ndCBiZWZvcmUgZnJvbU5vZGUsIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgZG9j
dW1lbnQKLQkgICAgZm9yIChuID0gbGFzdE5vZGU7IG4gIT0gZnJvbU5vZGU7IG4gPSBuLT50cmF2
ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYg
KG4tPnRhYkluZGV4KCkgPT0gaGlnaGVzdFN1aXRhYmxlVGFiSW5kZXgpKQotCQkgICAgcmV0dXJu
IG47Ci0JICAgIH0KLQotCSAgICBhc3NlcnQoZmFsc2UpOyAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhl
cmUKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAgIH0KLX0KLQotaW50IERvY3VtZW50SW1wbDo6bm9k
ZUFic0luZGV4KE5vZGVJbXBsICpub2RlKQotewotICAgIGFzc2VydChub2RlLT5nZXREb2N1bWVu
dCgpID09IHRoaXMpOwotCi0gICAgaW50IGFic0luZGV4ID0gMDsKLSAgICBmb3IgKE5vZGVJbXBs
ICpuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgp
KQotCWFic0luZGV4Kys7Ci0gICAgcmV0dXJuIGFic0luZGV4OwotfQotCi1Ob2RlSW1wbCAqRG9j
dW1lbnRJbXBsOjpub2RlV2l0aEFic0luZGV4KGludCBhYnNJbmRleCkKLXsKLSAgICBOb2RlSW1w
bCAqbiA9IHRoaXM7Ci0gICAgZm9yIChpbnQgaSA9IDA7IG4gJiYgKGkgPCBhYnNJbmRleCk7IGkr
KykgewotCW4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBuOwot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6cHJvY2Vzc0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcg
JmVxdWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRlbnQpCi17Ci0gICAgYXNzZXJ0KCFlcXVpdi5p
c051bGwoKSAmJiAhY29udGVudC5pc051bGwoKSk7Ci0KLSAgICBGcmFtZSAqZnJhbWUgPSB0aGlz
LT5mcmFtZSgpOwotCi0gICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKGVxdWl2LCAiZGVmYXVsdC1z
dHlsZSIpKSB7Ci0gICAgICAgIC8vIFRoZSBwcmVmZXJyZWQgc3R5bGUgc2V0IGhhcyBiZWVuIG92
ZXJyaWRkZW4gYXMgcGVyIHNlY3Rpb24gCi0gICAgICAgIC8vIDE0LjMuMiBvZiB0aGUgSFRNTDQu
MCBzcGVjaWZpY2F0aW9uLiAgV2UgbmVlZCB0byB1cGRhdGUgdGhlCi0gICAgICAgIC8vIHNoZWV0
IHVzZWQgdmFyaWFibGUgYW5kIHRoZW4gdXBkYXRlIG91ciBzdHlsZSBzZWxlY3Rvci4gCi0gICAg
ICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSB0aGUgdGVzdCBhdDoKLSAgICAgICAgLy8gaHR0cDov
L3d3dy5oaXhpZS5jaC90ZXN0cy9ldmlsL2Nzcy9pbXBvcnQvbWFpbi9wcmVmZXJyZWQuaHRtbAot
ICAgICAgICAvLyAtZHdoCi0gICAgICAgIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gY29udGVu
dDsKLSAgICAgICAgbV9wcmVmZXJyZWRTdHlsZXNoZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAg
dXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICAgIH0KLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShlcXVpdiwgInJlZnJlc2giKSAmJiBmcmFtZS0+bWV0YVJlZnJlc2hFbmFibGVkKCkpCi0g
ICAgewotICAgICAgICAvLyBnZXQgZGVsYXkgYW5kIHVybAotICAgICAgICBRU3RyaW5nIHN0ciA9
IGNvbnRlbnQucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICBpbnQgcG9zID0g
c3RyLmZpbmQoUVJlZ0V4cCgiWzssXSIpKTsKLSAgICAgICAgaWYgKCBwb3MgPT0gLTEgKQotICAg
ICAgICAgICAgcG9zID0gc3RyLmZpbmQoUVJlZ0V4cCgiWyBcdF0iKSk7Ci0KLSAgICAgICAgaWYg
KHBvcyA9PSAtMSkgLy8gVGhlcmUgY2FuIGJlIG5vIHVybCAoRGF2aWQpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsKLSAgICAgICAgICAgIGludCBkZWxheSA9IDA7Ci0J
ICAgIGRlbGF5ID0gc3RyLnRvSW50KCZvayk7Ci0JICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9y
eSBpdGVtIGlmIHRoZSByZWZyZXNoIHRpbWVvdXQgPiAxIHNlY29uZAotCSAgICBpZihvayAmJiBm
cmFtZSkgZnJhbWUtPnNjaGVkdWxlUmVkaXJlY3Rpb24oZGVsYXksIGZyYW1lLT51cmwoKS51cmwo
KSwgZGVsYXkgPD0gMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkb3VibGUgZGVs
YXkgPSAwOwotICAgICAgICAgICAgYm9vbCBvayA9IGZhbHNlOwotCSAgICBkZWxheSA9IHN0ci5s
ZWZ0KHBvcykuc3RyaXBXaGl0ZVNwYWNlKCkudG9Eb3VibGUoJm9rKTsKLQotICAgICAgICAgICAg
cG9zKys7Ci0gICAgICAgICAgICB3aGlsZShwb3MgPCAoaW50KXN0ci5sZW5ndGgoKSAmJiBzdHJb
cG9zXS5pc1NwYWNlKCkpIHBvcysrOwotICAgICAgICAgICAgc3RyID0gc3RyLm1pZChwb3MpOwot
ICAgICAgICAgICAgaWYgKHN0ci5maW5kKCJ1cmwiLCAwLCAgZmFsc2UgKSA9PSAwKQotICAgICAg
ICAgICAgICAgIHN0ciA9IHN0ci5taWQoMyk7Ci0gICAgICAgICAgICBzdHIgPSBzdHIuc3RyaXBX
aGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICBpZiAoc3RyLmxlbmd0aCgpICYmIHN0clswXSA9PSAn
PScpCi0gICAgICAgICAgICAgICAgc3RyID0gc3RyLm1pZCgxKS5zdHJpcFdoaXRlU3BhY2UoKTsK
LSAgICAgICAgICAgIHN0ciA9IHBhcnNlVVJMKERPTVN0cmluZyhzdHIpKS5xc3RyaW5nKCk7Ci0g
ICAgICAgICAgICBpZiAob2sgJiYgZnJhbWUpCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBh
IG5ldyBoaXN0b3J5IGl0ZW0gaWYgdGhlIHJlZnJlc2ggdGltZW91dCA+IDEgc2Vjb25kCi0gICAg
ICAgICAgICAgICAgZnJhbWUtPnNjaGVkdWxlUmVkaXJlY3Rpb24oZGVsYXksIGNvbXBsZXRlVVJM
KCBzdHIgKSwgZGVsYXkgPD0gMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXF1
YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJleHBpcmVzIikpCi0gICAgewotICAgICAgICBRU3RyaW5n
IHN0ciA9IGNvbnRlbnQucXN0cmluZygpLnN0cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICB0aW1l
X3QgZXhwaXJlX2RhdGUgPSBzdHIudG9JbnQoKTsKLSAgICAgICAgaWYgKG1fZG9jTG9hZGVyKQot
ICAgICAgICAgICAgbV9kb2NMb2FkZXItPnNldEV4cGlyZURhdGUoZXhwaXJlX2RhdGUpOwotICAg
IH0KLSAgICBlbHNlIGlmICgoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJwcmFnbWEiKSB8fCBl
cXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImNhY2hlLWNvbnRyb2wiKSkgJiYgZnJhbWUpCi0gICAg
ewotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRlbnQucXN0cmluZygpLmxvd2VyKCkuc3RyaXBX
aGl0ZVNwYWNlKCk7Ci0gICAgICAgIEtVUkwgdXJsID0gZnJhbWUtPnVybCgpOwotICAgIH0KLSAg
ICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgInNldC1jb29raWUiKSkKLSAgICB7
Ci0gICAgICAgIC8vICMjIyBtYWtlIHNldENvb2tpZSB3b3JrIG9uIFhNTCBkb2N1bWVudHMgdG9v
OyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0YSAuLi4uLj4KLSAgICAgICAgaWYgKGlzSFRNTERv
Y3VtZW50KCkpCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KHRo
aXMpLT5zZXRDb29raWUoY29udGVudCk7Ci0gICAgfQotfQotCi1ib29sIERvY3VtZW50SW1wbDo6
cHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFkb25seSwgaW50IHgsIGludCB5LCBNb3VzZUV2ZW50
KiBldikKLXsKLSAgICByZXR1cm4gcHJlcGFyZU1vdXNlRXZlbnQocmVhZG9ubHksIGV2LT50eXBl
ID09IE1vdXNlUHJlc3MsIHgsIHksIGV2KTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnByZXBh
cmVNb3VzZUV2ZW50KGJvb2wgcmVhZG9ubHksIGJvb2wgYWN0aXZlLCBpbnQgX3gsIGludCBfeSwg
TW91c2VFdmVudCAqZXYpCi17Ci0gICAgaWYgKCBtX3JlbmRlciApIHsKLSAgICAgICAgYXNzZXJ0
KG1fcmVuZGVyLT5pc0NhbnZhcygpKTsKLSAgICAgICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyBy
ZW5kZXJJbmZvKHJlYWRvbmx5LCBhY3RpdmUsIGV2LT50eXBlID09IE1vdXNlTW92ZSk7Ci0gICAg
ICAgIGJvb2wgaXNJbnNpZGUgPSBtX3JlbmRlci0+bGF5ZXIoKS0+aGl0VGVzdChyZW5kZXJJbmZv
LCBfeCwgX3kpOwotICAgICAgICBldi0+aW5uZXJOb2RlID0gcmVuZGVySW5mby5pbm5lck5vZGUo
KTsKLQotICAgICAgICBpZiAocmVuZGVySW5mby5VUkxFbGVtZW50KCkpIHsKLSAgICAgICAgICAg
IGFzc2VydChyZW5kZXJJbmZvLlVSTEVsZW1lbnQoKS0+aXNFbGVtZW50Tm9kZSgpKTsKLSAgICAg
ICAgICAgIEVsZW1lbnRJbXBsKiBlID0gIHN0YXRpY19jYXN0PEVsZW1lbnRJbXBsKj4ocmVuZGVy
SW5mby5VUkxFbGVtZW50KCkpOwotICAgICAgICAgICAgRE9NU3RyaW5nIGhyZWYgPSBraHRtbDo6
cGFyc2VVUkwoZS0+Z2V0QXR0cmlidXRlKGhyZWZBdHRyKSk7Ci0gICAgICAgICAgICBET01TdHJp
bmcgdGFyZ2V0ID0gZS0+Z2V0QXR0cmlidXRlKHRhcmdldEF0dHIpOwotCi0gICAgICAgICAgICBp
ZiAoIXRhcmdldC5pc051bGwoKSAmJiAhaHJlZi5pc051bGwoKSkgewotICAgICAgICAgICAgICAg
IGV2LT50YXJnZXQgPSB0YXJnZXQ7Ci0gICAgICAgICAgICAgICAgZXYtPnVybCA9IGhyZWY7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXYtPnVybCA9
IGhyZWY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXJlYWRvbmx5KQotICAgICAgICAgICAg
dXBkYXRlUmVuZGVyaW5nKCk7Ci0KLSAgICAgICAgcmV0dXJuIGlzSW5zaWRlOwotICAgIH0KLQot
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBET00gU2VjdGlvbiAxLjEuMQotYm9vbCBEb2N1
bWVudEltcGw6OmNoaWxkQWxsb3dlZCggTm9kZUltcGwgKm5ld0NoaWxkICkKLXsKLSAgICAvLyBE
b2N1bWVudHMgbWF5IGNvbnRhaW4gYSBtYXhpbXVtIG9mIG9uZSBFbGVtZW50IGNoaWxkCi0gICAg
aWYgKG5ld0NoaWxkLT5ub2RlVHlwZSgpID09IE5vZGU6OkVMRU1FTlRfTk9ERSkgewotICAgICAg
ICBOb2RlSW1wbCAqYzsKLSAgICAgICAgZm9yIChjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAgICAgaWYgKGMtPm5vZGVUeXBlKCkgPT0gTm9kZTo6
RUxFTUVOVF9OT0RFKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQot
ICAgIH0KLQotICAgIC8vIERvY3VtZW50cyBtYXkgY29udGFpbiBhIG1heGltdW0gb2Ygb25lIERv
Y3VtZW50VHlwZSBjaGlsZAotICAgIGlmIChuZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpE
T0NVTUVOVF9UWVBFX05PREUpIHsKLSAgICAgICAgTm9kZUltcGwgKmM7Ci0gICAgICAgIGZvciAo
YyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAg
IGlmIChjLT5ub2RlVHlwZSgpID09IE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERSkKLSAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hp
bGRUeXBlQWxsb3dlZChuZXdDaGlsZC0+bm9kZVR5cGUoKSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJ
bXBsOjpjaGlsZFR5cGVBbGxvd2VkKCB1bnNpZ25lZCBzaG9ydCB0eXBlICkKLXsKLSAgICBzd2l0
Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpFTEVNRU5UX05PREU6Ci0gICAgICAgIGNh
c2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6
OkNPTU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0g
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLU5vZGVJbXBsICpEb2N1bWVudEltcGw6OmNsb25lTm9k
ZSAoIGJvb2wgLypkZWVwKi8gKQotewotICAgIC8vIFNwZWMgc2F5cyBjbG9uaW5nIERvY3VtZW50
IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQiCi0gICAgLy8gc28gd2UgZG8gbm90
IHN1cHBvcnQgaXQuLi4KLSAgICByZXR1cm4gMDsKLX0KLQotU3R5bGVTaGVldExpc3RJbXBsKiBE
b2N1bWVudEltcGw6OnN0eWxlU2hlZXRzKCkKLXsKLSAgICByZXR1cm4gbV9zdHlsZVNoZWV0czsK
LX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6cHJlZmVycmVkU3R5bGVzaGVldFNldCgpCi17
Ci0gIHJldHVybiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7Ci19Ci0KLURPTVN0cmluZyBEb2N1
bWVudEltcGw6OnNlbGVjdGVkU3R5bGVzaGVldFNldCgpCi17Ci0gIHJldHVybiBtX3NlbGVjdGVk
U3R5bGVzaGVldFNldDsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFNlbGVjdGVkU3R5bGVz
aGVldFNldChjb25zdCBET01TdHJpbmcmIGFTdHJpbmcpCi17Ci0gIG1fc2VsZWN0ZWRTdHlsZXNo
ZWV0U2V0ID0gYVN0cmluZzsKLSAgdXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICBpZiAocmVuZGVy
ZXIoKSkKLSAgICByZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlz
IGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZlbCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2Fk
aW5nLgotdm9pZCBEb2N1bWVudEltcGw6OnN0eWxlc2hlZXRMb2FkZWQoKQotewotICAvLyBNYWtl
IHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdhcyBwZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQg
aXNuJ3Qgb3V0IG9mIHN5bmMuCi0gIGFzc2VydChtX3BlbmRpbmdTdHlsZXNoZWV0cyA+IDApOwot
Ci0gIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07Ci0gIAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VU
X1NDSEVEVUxJTkcKLSAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgIHByaW50ZigiU3R5bGVz
aGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQgc3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwg
ZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5bGVzaGVldHMpOwotI2VuZGlmCi0KLSAgdXBkYXRl
U3R5bGVTZWxlY3RvcigpOyAgICAKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnVwZGF0ZVN0eWxl
U2VsZWN0b3IoKQotewotICAgIC8vIERvbid0IGJvdGhlciB1cGRhdGluZywgc2luY2Ugd2UgaGF2
ZW4ndCBsb2FkZWQgYWxsIG91ciBzdHlsZSBpbmZvIHlldC4KLSAgICBpZiAoIWhhdmVTdHlsZXNo
ZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1cm47Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9V
VF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJC
ZWdpbm5pbmcgdXBkYXRlIG9mIHN0eWxlIHNlbGVjdG9yIGF0IHRpbWUgJWQuXG4iLCBlbGFwc2Vk
VGltZSgpKTsKLSNlbmRpZgotCi0gICAgcmVjYWxjU3R5bGVTZWxlY3RvcigpOwotICAgIHJlY2Fs
Y1N0eWxlKEZvcmNlKTsKLQotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAg
ICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBv
ZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgot
Ci0gICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAgICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlv
dXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAgICAgaWYgKHZpZXcoKSkKLSAgICAgICAgICAgIHZp
ZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwotICAgIH0KLX0KLQotCi1RU3RyaW5nTGlzdCBEb2N1
bWVudEltcGw6OmF2YWlsYWJsZVN0eWxlU2hlZXRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9h
dmFpbGFibGVTaGVldHM7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZWNhbGNTdHlsZVNlbGVj
dG9yKCkKLXsKLSAgICBpZiAoICFtX3JlbmRlciB8fCAhYXR0YWNoZWQoKSApIHJldHVybjsKLQot
ICAgIFFQdHJMaXN0PFN0eWxlU2hlZXRJbXBsPiBvbGRTdHlsZVNoZWV0cyA9IG1fc3R5bGVTaGVl
dHMtPnN0eWxlU2hlZXRzOwotICAgIG1fc3R5bGVTaGVldHMtPnN0eWxlU2hlZXRzLmNsZWFyKCk7
Ci0gICAgbV9hdmFpbGFibGVTaGVldHMuY2xlYXIoKTsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBm
b3IgKG4gPSB0aGlzOyBuOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgCVN0eWxl
U2hlZXRJbXBsICpzaGVldCA9IDA7Ci0KLSAgICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9k
ZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotICAgICAgICB7Ci0gICAgICAgICAgICAv
LyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChYTUwgZG9jdW1lbnRzIG9ubHkpCi0gICAgICAgICAg
ICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJ
bnN0cnVjdGlvbkltcGwqPihuKTsKLSAgICAgICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7Ci0j
aWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAgICAgaWYgKHBpLT5pc1hTTCgpKSB7Ci0gICAgICAg
ICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgdHJhbnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVk
IGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2JsZW0vNDEzMjgwNj4KLSAgICAgICAgICAgICAgICBp
ZiAoIXRyYW5zZm9ybVNvdXJjZURvY3VtZW50KCkpCi0gICAgICAgICAgICAgICAgICAgIGFwcGx5
WFNMVHJhbnNmb3JtKHBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9
Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICghc2hlZXQgJiYgIXBpLT5sb2NhbEhyZWYoKS5pc0Vt
cHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0
cnVjdGlvbiB3aXRoIHJlZmVyZW5jZSB0byBhbiBlbGVtZW50IGluIHRoaXMgZG9jdW1lbnQgLSBl
LmcuCi0gICAgICAgICAgICAgICAgLy8gPD94bWwtc3R5bGVzaGVldCBocmVmPSIjbXlzdHlsZSI+
LCB3aXRoIHRoZSBlbGVtZW50Ci0gICAgICAgICAgICAgICAgLy8gPGZvbyBpZD0ibXlzdHlsZSI+
aGVhZGluZyB7IGNvbG9yOiByZWQ7IH08L2Zvbz4gYXQgc29tZSBsb2NhdGlvbiBpbgotICAgICAg
ICAgICAgICAgIC8vIHRoZSBkb2N1bWVudAotICAgICAgICAgICAgICAgIEVsZW1lbnRJbXBsKiBl
bGVtID0gZ2V0RWxlbWVudEJ5SWQocGktPmxvY2FsSHJlZigpKTsKLSAgICAgICAgICAgICAgICBp
ZiAoZWxlbSkgewotICAgICAgICAgICAgICAgICAgICBET01TdHJpbmcgc2hlZXRUZXh0KCIiKTsK
LSAgICAgICAgICAgICAgICAgICAgTm9kZUltcGwgKmM7Ci0gICAgICAgICAgICAgICAgICAgIGZv
ciAoYyA9IGVsZW0tPmZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAg
ICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9E
RSB8fCBjLT5ub2RlVHlwZSgpID09IE5vZGU6OkNEQVRBX1NFQ1RJT05fTk9ERSkKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBzaGVldFRleHQgKz0gYy0+bm9kZVZhbHVlKCk7Ci0gICAgICAg
ICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBDU1NTdHlsZVNoZWV0SW1wbCAq
Y3NzU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcyk7Ci0gICAgICAgICAgICAgICAg
ICAgIGNzc1NoZWV0LT5wYXJzZVN0cmluZyhzaGVldFRleHQpOwotICAgICAgICAgICAgICAgICAg
ICBwaS0+c2V0U3R5bGVTaGVldChjc3NTaGVldCk7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0
ID0gY3NzU2hlZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAg
IH0KLSAgICAgICAgZWxzZSBpZiAobi0+aXNIVE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1l
KGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05hbWUoc3R5bGVUYWcpKSkgewotICAgICAgICAgICAgSFRN
TEVsZW1lbnRJbXBsICplID0gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsICo+KG4pOwotICAg
ICAgICAgICAgUVN0cmluZyB0aXRsZSA9IGUtPmdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpLnFzdHJp
bmcoKTsKLSAgICAgICAgICAgIGJvb2wgZW5hYmxlZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAg
ICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShsaW5rVGFnKSkgewotICAgICAgICAgICAgICAgIC8v
IDxMSU5LPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgSFRNTExpbmtFbGVtZW50SW1wbCogbCA9
IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVudEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICBp
ZiAobC0+aXNMb2FkaW5nKCkgfHwgbC0+aXNEaXNhYmxlZCgpKQotICAgICAgICAgICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoIWwtPnNoZWV0KCkpCi0gICAgICAgICAg
ICAgICAgICAgIHRpdGxlID0gUVN0cmluZzo6bnVsbDsKLSAgICAgICAgICAgICAgICBlbmFibGVk
VmlhU2NyaXB0ID0gbC0+aXNFbmFibGVkVmlhU2NyaXB0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAg
ICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCBwcmVmZXJyZWQgc3R5bGVzZXQuICBUaGlzIGlz
IHRoZQotICAgICAgICAgICAgLy8gc2V0IG9mIHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4K
LSAgICAgICAgICAgIGlmIChlLT5oYXNMb2NhbE5hbWUobGlua1RhZykpCi0gICAgICAgICAgICAg
ICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MTGlua0VsZW1lbnRJbXBsKj4obiktPnNoZWV0KCk7
Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0g
ICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1MU3R5bGVFbGVtZW50SW1wbCo+
KG4pLT5zaGVldCgpOwotCi0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBzaGVl
dCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKLSAgICAgICAgICAgIC8vICh0aHVzIG1ha2luZyBpdCBQ
UkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhlciB0aGFuCi0gICAgICAgICAgICAvLyBQRVJTSVNU
RU5UKS4KLSAgICAgICAgICAgIGlmICghZW5hYmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0
eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gWWVzLCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAg
ICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5bGVzaGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVycmVkIHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4g
IElmCi0gICAgICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0
LCB0aGVuIGVzdGFibGlzaAotICAgICAgICAgICAgICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVy
cmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBpZ25vcmUKLSAgICAgICAgICAgICAgICAgICAgLy8g
dGhpcyBzaGVldC4KLSAgICAgICAgICAgICAgICAgICAgUVN0cmluZyByZWwgPSBlLT5nZXRBdHRy
aWJ1dGUocmVsQXR0cikucXN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZS0+aGFz
TG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVsLmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkKLSAgICAg
ICAgICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRT
dHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAg
ICAgICAgIAotICAgICAgICAgICAgICAgIGlmICghbV9hdmFpbGFibGVTaGVldHMuY29udGFpbnMo
IHRpdGxlICkgKQotICAgICAgICAgICAgICAgICAgICBtX2F2YWlsYWJsZVNoZWV0cy5hcHBlbmQo
IHRpdGxlICk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9
IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCkKLSAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAw
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICAgICAgZWxz
ZSBpZiAobi0+aXNTVkdFbGVtZW50KCkgJiYgbi0+aGFzVGFnTmFtZShLU1ZHOjpTVkdOYW1lczo6
c3R5bGVUYWcpKSB7Ci0gICAgICAgICAgICBRU3RyaW5nIHRpdGxlOwotICAgICAgICAgICAgLy8g
PFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAgICBLU1ZHOjpTVkdTdHlsZUVsZW1lbnRJbXBsICpz
ID0gc3RhdGljX2Nhc3Q8S1NWRzo6U1ZHU3R5bGVFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAg
ICAgaWYgKCFzLT5pc0xvYWRpbmcoKSkgewotICAgICAgICAgICAgICAgIHNoZWV0ID0gcy0+c2hl
ZXQoKTsKLSAgICAgICAgICAgICAgICBpZihzaGVldCkKLSAgICAgICAgICAgICAgICAgICAgdGl0
bGUgPSBzLT5nZXRBdHRyaWJ1dGUoS1NWRzo6U1ZHTmFtZXM6OnRpdGxlQXR0cikucXN0cmluZygp
OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSAmJiBt
X3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNFbXB0eSgpKQotICAgICAgICAgICAgICAgIG1fcHJl
ZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0K
LSAgICAgICAgICAgIGlmICghdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYg
KHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCkKLSAgICAgICAgICAgICAgICAgICAg
c2hlZXQgPSAwOyAvLyBkb24ndCB1c2UgaXQKLQotICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0
bGUucmVwbGFjZSgnJicsIFFTdHJpbmc6OmZyb21MYXRpbjEoIiYmIikpOwotCi0gICAgICAgICAg
ICAgICAgaWYgKCFtX2F2YWlsYWJsZVNoZWV0cy5jb250YWlucyh0aXRsZSkpCi0gICAgICAgICAg
ICAgICAgICAgIG1fYXZhaWxhYmxlU2hlZXRzLmFwcGVuZCh0aXRsZSk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYgKHNoZWV0KSB7Ci0gICAgICAgICAgICBz
aGVldC0+cmVmKCk7Ci0gICAgICAgICAgICBtX3N0eWxlU2hlZXRzLT5zdHlsZVNoZWV0cy5hcHBl
bmQoc2hlZXQpOwotICAgICAgICB9Ci0gICAgCi0gICAgICAgIC8vIEZvciBIVE1MIGRvY3VtZW50
cywgc3R5bGVzaGVldHMgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbi9hZnRlciB0aGUgPEJPRFk+IHRh
Zy4gU28gd2UKLSAgICAgICAgLy8gY2FuIHN0b3Agc2VhcmNoaW5nIGhlcmUuCi0gICAgICAgIGlm
IChpc0hUTUxEb2N1bWVudCgpICYmIG4tPmhhc1RhZ05hbWUoYm9keVRhZykpCi0gICAgICAgICAg
ICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBEZS1yZWZlcmVuY2UgYWxsIHRoZSBzdHlsZXNoZWV0
cyBpbiB0aGUgb2xkIGxpc3QKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFN0eWxlU2hlZXRJbXBsPiBp
dChvbGRTdHlsZVNoZWV0cyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLQlpdC5j
dXJyZW50KCktPmRlcmVmKCk7Ci0KLSAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGUgc2VsZWN0b3IK
LSAgICBkZWxldGUgbV9zdHlsZVNlbGVjdG9yOwotICAgIFFTdHJpbmcgdXNlcnNoZWV0ID0gbV91
c2Vyc2hlZXQ7Ci0gICAgaWYgKCBtX3ZpZXcgJiYgbV92aWV3LT5tZWRpYVR5cGUoKSA9PSAicHJp
bnQiICkKLQl1c2Vyc2hlZXQgKz0gbV9wcmludFNoZWV0OwotICAgIG1fc3R5bGVTZWxlY3RvciA9
IG5ldyBDU1NTdHlsZVNlbGVjdG9yKHRoaXMsIHVzZXJzaGVldCwgbV9zdHlsZVNoZWV0cywgIWlu
Q29tcGF0TW9kZSgpKTsKLSAgICBtX3N0eWxlU2VsZWN0b3ItPnNldEVuY29kZWRVUkwobV91cmwp
OwotICAgIG1fc3R5bGVTZWxlY3RvckRpcnR5ID0gZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpzZXRIb3Zlck5vZGUoTm9kZUltcGwqIG5ld0hvdmVyTm9kZSkKLXsKLSAgICBpZiAobV9o
b3Zlck5vZGUgIT0gbmV3SG92ZXJOb2RlKQotICAgICAgICBtX2hvdmVyTm9kZSA9IG5ld0hvdmVy
Tm9kZTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldEFjdGl2ZU5vZGUoTm9kZUltcGwqIG5l
d0FjdGl2ZU5vZGUpCi17Ci0gICAgaWYgKG1fYWN0aXZlTm9kZSAhPSBuZXdBY3RpdmVOb2RlKQot
ICAgICAgICBtX2FjdGl2ZU5vZGUgPSBuZXdBY3RpdmVOb2RlOwotfQotCi0KLWJvb2wgRG9jdW1l
bnRJbXBsOjpyZWxpbnF1aXNoZXNFZGl0aW5nRm9jdXMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAg
YXNzZXJ0KG5vZGUpOwotICAgIGFzc2VydChub2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKTsKLQot
ICAgIE5vZGVJbXBsICpyb290ID0gbm9kZS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwotICAgIGlm
ICghZnJhbWUoKSB8fCAhcm9vdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJu
IGZyYW1lKCktPnNob3VsZEVuZEVkaXRpbmcocmFuZ2VPZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsK
LX0KLQotYm9vbCBEb2N1bWVudEltcGw6OmFjY2VwdHNFZGl0aW5nRm9jdXMoTm9kZUltcGwgKm5v
ZGUpCi17Ci0gICAgYXNzZXJ0KG5vZGUpOwotICAgIGFzc2VydChub2RlLT5pc0NvbnRlbnRFZGl0
YWJsZSgpKTsKLQotICAgIE5vZGVJbXBsICpyb290ID0gbm9kZS0+cm9vdEVkaXRhYmxlRWxlbWVu
dCgpOwotICAgIGlmICghZnJhbWUoKSB8fCAhcm9vdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
Ci0gICAgcmV0dXJuIGZyYW1lKCktPnNob3VsZEJlZ2luRWRpdGluZyhyYW5nZU9mQ29udGVudHMo
cm9vdCkuZ2V0KCkpOwotfQotCi1jb25zdCBRVmFsdWVMaXN0PERhc2hib2FyZFJlZ2lvblZhbHVl
PiAmIERvY3VtZW50SW1wbDo6ZGFzaGJvYXJkUmVnaW9ucygpIGNvbnN0Ci17Ci0gICAgcmV0dXJu
IG1fZGFzaGJvYXJkUmVnaW9uczsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldERhc2hib2Fy
ZFJlZ2lvbnMgKGNvbnN0IFFWYWx1ZUxpc3Q8RGFzaGJvYXJkUmVnaW9uVmFsdWU+JiByZWdpb25z
KQotewotICAgIG1fZGFzaGJvYXJkUmVnaW9ucyA9IHJlZ2lvbnM7Ci0gICAgc2V0RGFzaGJvYXJk
UmVnaW9uc0RpcnR5IChmYWxzZSk7Ci19Ci0KLQotc3RhdGljIFFXaWRnZXQgKndpZGdldEZvck5v
ZGUoTm9kZUltcGwgKmZvY3VzTm9kZSkKLXsKLSAgICBpZiAoIWZvY3VzTm9kZSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0ICpyZW5kZXJlciA9IGZvY3VzTm9kZS0+cmVuZGVy
ZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+aXNXaWRnZXQoKSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlbmRlcldpZGdldCAqPihyZW5k
ZXJlciktPndpZGdldCgpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6c2V0Rm9jdXNOb2RlKE5v
ZGVJbXBsICpuZXdGb2N1c05vZGUpCi17ICAgIAotICAgIC8vIE1ha2Ugc3VyZSBuZXdGb2N1c05v
ZGUgaXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1bWVudAotICAgIGlmIChuZXdGb2N1c05vZGUgJiYg
KG5ld0ZvY3VzTm9kZS0+Z2V0RG9jdW1lbnQoKSAhPSB0aGlzKSkKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0KLSAgICBpZiAobV9mb2N1c05vZGUgPT0gbmV3Rm9jdXNOb2RlKQotICAgICAgICByZXR1
cm4gdHJ1ZTsKLQotICAgIGlmIChtX2ZvY3VzTm9kZSAmJiBtX2ZvY3VzTm9kZS0+aXNDb250ZW50
RWRpdGFibGUoKSAmJiAhcmVsaW5xdWlzaGVzRWRpdGluZ0ZvY3VzKG1fZm9jdXNOb2RlLmdldCgp
KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgIAotICAgIGJvb2wgZm9jdXNDaGFuZ2VC
bG9ja2VkID0gZmFsc2U7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBvbGRGb2N1c05vZGUgPSBtX2Zv
Y3VzTm9kZTsKLSAgICBtX2ZvY3VzTm9kZSA9IDA7Ci0gICAgY2xlYXJTZWxlY3Rpb25JZk5lZWRl
ZChuZXdGb2N1c05vZGUpOwotCi0gICAgLy8gUmVtb3ZlIGZvY3VzIGZyb20gdGhlIGV4aXN0aW5n
IGZvY3VzIG5vZGUgKGlmIGFueSkKLSAgICBpZiAob2xkRm9jdXNOb2RlICYmICFvbGRGb2N1c05v
ZGUtPm1faW5EZXRhY2gpIHsgCi0gICAgICAgIGlmIChvbGRGb2N1c05vZGUtPmFjdGl2ZSgpKQot
ICAgICAgICAgICAgb2xkRm9jdXNOb2RlLT5zZXRBY3RpdmUoZmFsc2UpOwotCi0gICAgICAgIG9s
ZEZvY3VzTm9kZS0+c2V0Rm9jdXMoZmFsc2UpOwotICAgICAgICBvbGRGb2N1c05vZGUtPmRpc3Bh
dGNoSFRNTEV2ZW50KGJsdXJFdmVudCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1fZm9j
dXNOb2RlKSB7Ci0gICAgICAgICAgICAvLyBoYW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAg
ICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBuZXdGb2N1c05vZGUg
PSAwOwotICAgICAgICB9Ci0gICAgICAgIGNsZWFyU2VsZWN0aW9uSWZOZWVkZWQobmV3Rm9jdXNO
b2RlKTsKLSAgICAgICAgb2xkRm9jdXNOb2RlLT5kaXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNPdXRF
dmVudCk7Ci0gICAgICAgIGlmIChtX2ZvY3VzTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxl
ciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwot
ICAgICAgICAgICAgbmV3Rm9jdXNOb2RlID0gMDsKLSAgICAgICAgfQotICAgICAgICBjbGVhclNl
bGVjdGlvbklmTmVlZGVkKG5ld0ZvY3VzTm9kZSk7Ci0gICAgICAgIGlmICgob2xkRm9jdXNOb2Rl
LmdldCgpID09IHRoaXMpICYmIG9sZEZvY3VzTm9kZS0+aGFzT25lUmVmKCkpCi0gICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobmV3Rm9jdXNOb2RlKSB7Ci0gICAgICAg
IGlmIChuZXdGb2N1c05vZGUtPmlzQ29udGVudEVkaXRhYmxlKCkgJiYgIWFjY2VwdHNFZGl0aW5n
Rm9jdXMobmV3Rm9jdXNOb2RlKSkgewotICAgICAgICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZv
Y3VzIGNoYW5nZQotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAg
ICAgICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQg
Zm9jdXMgb24gdGhlIG5ldyBub2RlCi0gICAgICAgIG1fZm9jdXNOb2RlID0gbmV3Rm9jdXNOb2Rl
OwotICAgICAgICBtX2ZvY3VzTm9kZS0+ZGlzcGF0Y2hIVE1MRXZlbnQoZm9jdXNFdmVudCwgZmFs
c2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1fZm9jdXNOb2RlICE9IG5ld0ZvY3VzTm9kZSkgewot
ICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0No
YW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgZ290byBTZXRGb2N1c05vZGVEb25lOwot
ICAgICAgICB9Ci0gICAgICAgIG1fZm9jdXNOb2RlLT5kaXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNJ
bkV2ZW50KTsKLSAgICAgICAgaWYgKG1fZm9jdXNOb2RlICE9IG5ld0ZvY3VzTm9kZSkgeyAKLSAg
ICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRlZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFu
Z2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsKLSAg
ICAgICAgfQotICAgICAgICBtX2ZvY3VzTm9kZS0+c2V0Rm9jdXMoKTsKLSAgICAgICAgLy8gZXd3
LCBJIHN1Y2suIHNldCB0aGUgcXQgZm9jdXMgY29ycmVjdGx5Ci0gICAgICAgIC8vICMjIyBmaW5k
IGEgYmV0dGVyIHBsYWNlIGluIHRoZSBjb2RlIGZvciB0aGlzCi0gICAgICAgIGlmICh2aWV3KCkp
IHsKLSAgICAgICAgICAgIFFXaWRnZXQgKmZvY3VzV2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2Zv
Y3VzTm9kZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAoZm9jdXNXaWRnZXQpIHsKLSAgICAgICAg
ICAgICAgICAvLyBNYWtlIHN1cmUgYSB3aWRnZXQgaGFzIHRoZSByaWdodCBzaXplIGJlZm9yZSBn
aXZpbmcgaXQgZm9jdXMuCi0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBhcmUgdGVz
dGluZyBlZGdlIGNhc2VzIG9mIHRoZSBRV2lkZ2V0IGNvZGUuCi0gICAgICAgICAgICAgICAgLy8g
U3BlY2lmaWNhbGx5LCBpbiBXZWJDb3JlIHRoaXMgZG9lcyBub3Qgd29yayB3ZWxsIGZvciB0ZXh0
IGZpZWxkcy4KLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgICAgICAg
ICAvLyBSZS1nZXQgdGhlIHdpZGdldCBpbiBjYXNlIHVwZGF0aW5nIHRoZSBsYXlvdXQgY2hhbmdl
ZCB0aGluZ3MuCi0gICAgICAgICAgICAgICAgZm9jdXNXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG1f
Zm9jdXNOb2RlLmdldCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmb2N1c1dp
ZGdldCkKLSAgICAgICAgICAgICAgICBmb2N1c1dpZGdldC0+c2V0Rm9jdXMoKTsKLSAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2aWV3KCktPnNldEZvY3VzKCk7Ci0gICAgICAgIH0K
LSAgIH0KLQotICAgIGlmICghZm9jdXNDaGFuZ2VCbG9ja2VkICYmIG1fZm9jdXNOb2RlICYmIEtX
UUFjY09iamVjdENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpKQotICAgICAgICBnZXRBY2NP
YmplY3RDYWNoZSgpLT5oYW5kbGVGb2N1c2VkVUlFbGVtZW50Q2hhbmdlZCgpOwotCi1TZXRGb2N1
c05vZGVEb25lOgotICAgIHVwZGF0ZVJlbmRlcmluZygpOwotICAgIHJldHVybiAhZm9jdXNDaGFu
Z2VCbG9ja2VkOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6Y2xlYXJTZWxlY3Rpb25JZk5lZWRl
ZChOb2RlSW1wbCAqbmV3Rm9jdXNOb2RlKQotewotICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAg
cmV0dXJuOwotCi0gICAgLy8gQ2xlYXIgdGhlIHNlbGVjdGlvbiB3aGVuIGNoYW5naW5nIHRoZSBm
b2N1cyBub2RlIHRvIG51bGwgb3IgdG8gYSBub2RlIHRoYXQgaXMgbm90IAotICAgIC8vIGNvbnRh
aW5lZCBieSB0aGUgY3VycmVudCBzZWxlY3Rpb24uCi0gICAgTm9kZUltcGwgKnN0YXJ0Q29udGFp
bmVyID0gZnJhbWUoKS0+c2VsZWN0aW9uKCkuc3RhcnQoKS5ub2RlKCk7Ci0gICAgaWYgKCFuZXdG
b2N1c05vZGUgfHwgKHN0YXJ0Q29udGFpbmVyICYmIHN0YXJ0Q29udGFpbmVyICE9IG5ld0ZvY3Vz
Tm9kZSAmJiAhc3RhcnRDb250YWluZXItPmlzQW5jZXN0b3IobmV3Rm9jdXNOb2RlKSkpCi0gICAg
ICAgIC8vIEZJWE1FOiA2NDk4IFNob3VsZCBqdXN0IGJlIGFibGUgdG8gY2FsbCBtX2ZyYW1lLT5z
ZWxlY3Rpb24oKS5jbGVhcigpCi0gICAgICAgIGZyYW1lKCktPnNldFNlbGVjdGlvbihTZWxlY3Rp
b25Db250cm9sbGVyKCkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0Q1NTVGFyZ2V0KE5v
ZGVJbXBsKiBuKQotewotICAgIGlmIChtX2Nzc1RhcmdldCkKLSAgICAgICAgbV9jc3NUYXJnZXQt
PnNldENoYW5nZWQoKTsKLSAgICBtX2Nzc1RhcmdldCA9IG47Ci0gICAgaWYgKG4pCi0gICAgICAg
IG4tPnNldENoYW5nZWQoKTsKLX0KLQotTm9kZUltcGwqIERvY3VtZW50SW1wbDo6Z2V0Q1NTVGFy
Z2V0KCkKLXsKLSAgICByZXR1cm4gbV9jc3NUYXJnZXQ7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBs
OjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9ySW1wbCAqbmkpCi17Ci0gICAgbV9ub2Rl
SXRlcmF0b3JzLmFwcGVuZChuaSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpkZXRhY2hOb2Rl
SXRlcmF0b3IoTm9kZUl0ZXJhdG9ySW1wbCAqbmkpCi17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLnJl
bW92ZShuaSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpub3RpZnlCZWZvcmVOb2RlUmVtb3Zh
bChOb2RlSW1wbCAqbikKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPE5vZGVJdGVyYXRvckltcGw+
IGl0KG1fbm9kZUl0ZXJhdG9ycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAg
ICAgICAgaXQuY3VycmVudCgpLT5ub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChuKTsKLX0KLQotQWJz
dHJhY3RWaWV3SW1wbCAqRG9jdW1lbnRJbXBsOjpkZWZhdWx0VmlldygpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIG1fZGVmYXVsdFZpZXc7Ci19Ci0KLUV2ZW50SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVh
dGVFdmVudChjb25zdCBET01TdHJpbmcgJmV2ZW50VHlwZSwgaW50ICZleGNlcHRpb25jb2RlKQot
ewotICAgIGlmIChldmVudFR5cGUgPT0gIlVJRXZlbnRzIiB8fCBldmVudFR5cGUgPT0gIlVJRXZl
bnQiKQotICAgICAgICByZXR1cm4gbmV3IFVJRXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZl
bnRUeXBlID09ICJNb3VzZUV2ZW50cyIgfHwgZXZlbnRUeXBlID09ICJNb3VzZUV2ZW50IikKLSAg
ICAgICAgcmV0dXJuIG5ldyBNb3VzZUV2ZW50SW1wbCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlw
ZSA9PSAiTXV0YXRpb25FdmVudHMiIHx8IGV2ZW50VHlwZSA9PSAiTXV0YXRpb25FdmVudCIpCi0g
ICAgICAgIHJldHVybiBuZXcgTXV0YXRpb25FdmVudEltcGwoKTsKLSAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gIktleWJvYXJkRXZlbnRzIiB8fCBldmVudFR5cGUgPT0gIktleWJvYXJkRXZlbnQi
KQotICAgICAgICByZXR1cm4gbmV3IEtleWJvYXJkRXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAo
ZXZlbnRUeXBlID09ICJIVE1MRXZlbnRzIiB8fCBldmVudFR5cGUgPT0gIkV2ZW50IiB8fCBldmVu
dFR5cGUgPT0gIkV2ZW50cyIpCi0gICAgICAgIHJldHVybiBuZXcgRXZlbnRJbXBsKCk7Ci0jaWYg
U1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gIlNWR0V2ZW50cyIpCi0gICAg
ICAgIHJldHVybiBuZXcgRXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJT
Vkdab29tRXZlbnRzIikKLSAgICAgICAgcmV0dXJuIG5ldyBLU1ZHOjpTVkdab29tRXZlbnRJbXBs
KCk7Ci0jZW5kaWYKLSAgICBlbHNlIHsKLSAgICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2Vw
dGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQot
Q1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgKkRvY3VtZW50SW1wbDo6Z2V0T3ZlcnJpZGVTdHlsZShF
bGVtZW50SW1wbCAqLyplbHQqLywgY29uc3QgRE9NU3RyaW5nICYvKnBzZXVkb0VsdCovKQotewot
ICAgIHJldHVybiAwOyAvLyAjIyMKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmRlZmF1bHRFdmVu
dEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17Ci0gICAgLy8gaWYgYW55IGh0bWwgZXZlbnQgbGlz
dGVuZXJzIGFyZSByZWdpc3RlcmVkIG9uIHRoZSB3aW5kb3csIHRoZW4gZGlzcGF0Y2ggdGhlbSBo
ZXJlCi0gICAgUVB0ckxpc3Q8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyc0NvcHkg
PSBtX3dpbmRvd0V2ZW50TGlzdGVuZXJzOwotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJl
ZEV2ZW50TGlzdGVuZXI+IGl0KGxpc3RlbmVyc0NvcHkpOwotICAgIGZvciAoOyBpdC5jdXJyZW50
KCk7ICsraXQpCi0gICAgICAgIGlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2dC0+
dHlwZSgpKQotICAgICAgICAgICAgaXQuY3VycmVudCgpLT5saXN0ZW5lcigpLT5oYW5kbGVFdmVu
dEltcGwoZXZ0LCB0cnVlKTsKLQotICAgIC8vIGhhbmRsZSBhY2Nlc3NrZXkKLSAgICBpZiAoZXZ0
LT50eXBlKCk9PWtleWRvd25FdmVudCkgewotICAgICAgICBLZXlib2FyZEV2ZW50SW1wbCAqa2V2
dCA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZlbnRJbXBsICo+KGV2dCk7Ci0gICAgICAgIGlmIChr
ZXZ0LT5jdHJsS2V5KCkpIHsKLSAgICAgICAgICAgIFFLZXlFdmVudCAqcWV2dCA9IGtldnQtPnFL
ZXlFdmVudCgpOwotICAgICAgICAgICAgRE9NU3RyaW5nIGtleSA9IChxZXZ0ID8gcWV2dC0+dW5t
b2RpZmllZFRleHQoKSA6IGtldnQtPmtleUlkZW50aWZpZXIoKSkubG93ZXIoKTsKLSAgICAgICAg
ICAgIEVsZW1lbnRJbXBsICplbGVtID0gZ2V0RWxlbWVudEJ5QWNjZXNzS2V5KGtleSk7Ci0gICAg
ICAgICAgICBpZiAoZWxlbSkgewotICAgICAgICAgICAgICAgIGVsZW0tPmFjY2Vzc0tleUFjdGlv
bihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0
SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2
ZW50TGlzdGVuZXIgKmxpc3RlbmVyKQotewotICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBpdCB3
ZSBkb24ndCB3YW50IHJlbW92ZVdpbmRvd0V2ZW50TGlzdGVuZXIgdG8gZGVsZXRlIGl0Ci0gICAg
aWYgKGxpc3RlbmVyKQotCWxpc3RlbmVyLT5yZWYoKTsKLSAgICByZW1vdmVIVE1MV2luZG93RXZl
bnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAgIGlmIChsaXN0ZW5lcikgewotCWFkZFdpbmRvd0V2
ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgZmFsc2UpOwotCWxpc3RlbmVyLT5kZXJl
ZigpOwotICAgIH0KLX0KLQotRXZlbnRMaXN0ZW5lciAqRG9jdW1lbnRJbXBsOjpnZXRIVE1MV2lu
ZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBR
UHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50
TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotCWlmIChpdC5jdXJy
ZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSAmJiBpdC5jdXJyZW50KCktPmxpc3RlbmVy
KCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9raHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIpCi0J
ICAgIHJldHVybiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBB
dG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVy
ZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsg
aXQuY3VycmVudCgpOyArK2l0KQotCWlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2
ZW50VHlwZSAmJiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkg
PT0gIl9raHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIpIHsKLQkgICAgbV93aW5kb3dFdmVudExpc3Rl
bmVycy5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLQkgICAgcmV0dXJuOwotCX0KLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OmFkZFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5n
ICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUpCi17
Ci0gICAgbGlzdGVuZXItPnJlZigpOwotCi0gICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGlkZW50aWNh
bCBsaXN0ZW5lciBzZXQgd2l0aCBpZGVudGljYWwgYXJndW1lbnRzLgotICAgIC8vIFRoZSBET00g
MiBzcGVjIHNheXMgdGhhdCAiZHVwbGljYXRlIGluc3RhbmNlcyBhcmUgZGlzY2FyZGVkIiBpbiB0
aGlzIGNhc2UuCi0gICAgcmVtb3ZlV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3Rl
bmVyLCB1c2VDYXB0dXJlKTsKLSAgICBtX3dpbmRvd0V2ZW50TGlzdGVuZXJzLmFwcGVuZChuZXcg
UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkp
OwotCi0gICAgbGlzdGVuZXItPmRlcmVmKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1v
dmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVu
dExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKQotewotICAgIFJlZ2lzdGVyZWRF
dmVudExpc3RlbmVyIHJsKGV2ZW50VHlwZSwgbGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotICAgIFFQ
dHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0KG1fd2luZG93RXZlbnRM
aXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmICgq
KGl0LmN1cnJlbnQoKSkgPT0gcmwpIHsKLSAgICAgICAgICAgIG1fd2luZG93RXZlbnRMaXN0ZW5l
cnMucmVtb3ZlUmVmKGl0LmN1cnJlbnQoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAg
IH0KLX0KLQotYm9vbCBEb2N1bWVudEltcGw6Omhhc1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3Qg
QXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3Rl
cmVkRXZlbnRMaXN0ZW5lcj4gaXQobV93aW5kb3dFdmVudExpc3RlbmVycyk7Ci0gICAgZm9yICg7
IGl0LmN1cnJlbnQoKTsgKytpdCkgewotCWlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09
IGV2ZW50VHlwZSkgewotCSAgICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi1FdmVudExpc3RlbmVyICpEb2N1bWVudEltcGw6OmNyZWF0ZUhUTUxFdmVu
dExpc3RlbmVyKGNvbnN0IERPTVN0cmluZyYgY29kZSwgTm9kZUltcGwgKm5vZGUpCi17Ci0gICAg
aWYgKGZyYW1lKCkpIHsKLQlyZXR1cm4gZnJhbWUoKS0+Y3JlYXRlSFRNTEV2ZW50TGlzdGVuZXIo
Y29kZSwgbm9kZSk7Ci0gICAgfSBlbHNlIHsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXZv
aWQgRG9jdW1lbnRJbXBsOjpzZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcmIGV2ZW50VHlwZSwgQXR0cmlidXRlSW1wbCogYXR0cikKLXsKLSAgICBzZXRIVE1MV2lu
ZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGNyZWF0ZUhUTUxFdmVudExpc3RlbmVyKGF0dHIt
PnZhbHVlKCksIDApKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmRpc3BhdGNoSW1hZ2VMb2Fk
RXZlbnRTb29uKEhUTUxJbWFnZUxvYWRlciAqaW1hZ2UpCi17Ci0gICAgbV9pbWFnZUxvYWRFdmVu
dERpc3BhdGNoU29vbkxpc3QuYXBwZW5kKGltYWdlKTsKLSAgICBpZiAoIW1faW1hZ2VMb2FkRXZl
bnRUaW1lcikgewotICAgICAgICBtX2ltYWdlTG9hZEV2ZW50VGltZXIgPSBzdGFydFRpbWVyKDAp
OwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZUltYWdlKEhUTUxJbWFnZUxv
YWRlciogaW1hZ2UpCi17Ci0gICAgLy8gUmVtb3ZlIGluc3RhbmNlcyBvZiB0aGlzIGltYWdlIGZy
b20gYm90aCBsaXN0cy4KLSAgICAvLyBVc2UgbG9vcHMgYmVjYXVzZSB3ZSBhbGxvdyBtdWx0aXBs
ZSBpbnN0YW5jZXMgdG8gZ2V0IGludG8gdGhlIGxpc3RzLgotICAgIHdoaWxlIChtX2ltYWdlTG9h
ZEV2ZW50RGlzcGF0Y2hTb29uTGlzdC5yZW1vdmVSZWYoaW1hZ2UpKSB7IH0KLSAgICB3aGlsZSAo
bV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdC5yZW1vdmVSZWYoaW1hZ2UpKSB7IH0KLSAg
ICBpZiAobV9pbWFnZUxvYWRFdmVudERpc3BhdGNoU29vbkxpc3QuaXNFbXB0eSgpICYmIG1faW1h
Z2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBraWxsVGltZXIobV9pbWFnZUxvYWRFdmVudFRp
bWVyKTsKLSAgICAgICAgbV9pbWFnZUxvYWRFdmVudFRpbWVyID0gMDsKLSAgICB9Ci19Ci0KLXZv
aWQgRG9jdW1lbnRJbXBsOjpkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05vdygpCi17Ci0gICAgLy8g
bmVlZCB0byBhdm9pZCByZS1lbnRlcmluZyB0aGlzIGZ1bmN0aW9uOyBpZiBuZXcgZGlzcGF0Y2hl
cyBhcmUKLSAgICAvLyBzY2hlZHVsZWQgYmVmb3JlIHRoZSBwYXJlbnQgZmluaXNoZXMgcHJvY2Vz
c2luZyB0aGUgbGlzdCwgdGhleQotICAgIC8vIHdpbGwgc2V0IGEgdGltZXIgYW5kIGV2ZW50dWFs
bHkgYmUgcHJvY2Vzc2VkCi0gICAgaWYgKCFtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0
LmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1faW1hZ2VM
b2FkRXZlbnRUaW1lcikgewotICAgICAgICBraWxsVGltZXIobV9pbWFnZUxvYWRFdmVudFRpbWVy
KTsKLSAgICAgICAgbV9pbWFnZUxvYWRFdmVudFRpbWVyID0gMDsKLSAgICB9Ci0gICAgCi0gICAg
bV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdCA9IG1faW1hZ2VMb2FkRXZlbnREaXNwYXRj
aFNvb25MaXN0OwotICAgIG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7
Ci0gICAgZm9yIChRUHRyTGlzdEl0ZXJhdG9yPEhUTUxJbWFnZUxvYWRlcj4gaXQobV9pbWFnZUxv
YWRFdmVudERpc3BhdGNoaW5nTGlzdCk7IGl0LmN1cnJlbnQoKTsgKSB7Ci0gICAgICAgIEhUTUxJ
bWFnZUxvYWRlciogaW1hZ2UgPSBpdC5jdXJyZW50KCk7Ci0gICAgICAgIC8vIE11c3QgYWR2YW5j
ZSBpdGVyYXRvciAqYmVmb3JlKiBkaXNwYXRjaGluZyBjYWxsLgotICAgICAgICAvLyBPdGhlcndp
c2UsIGl0IG1pZ2h0IGJlIGFkdmFuY2VkIGF1dG9tYXRpY2FsbHkgaWYgZGlzcGF0Y2hpbmcgdGhl
IGNhbGwgaGFkIGEgc2lkZSBlZmZlY3QKLSAgICAgICAgLy8gb2YgZGVzdHJveWluZyB0aGUgY3Vy
cmVudCBIVE1MSW1hZ2VMb2FkZXIsIGFuZCB0aGVuIHdlIHdvdWxkIGFkdmFuY2UgcGFzdCB0aGUg
Km5leHQqIGl0ZW0sCi0gICAgICAgIC8vIG1pc3Npbmcgb25lIGFsdG9nZXRoZXIuCi0gICAgICAg
ICsraXQ7Ci0gICAgICAgIGltYWdlLT5kaXNwYXRjaExvYWRFdmVudCgpOwotICAgIH0KLSAgICBt
X2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0LmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnRJbXBsOjp0aW1lckV2ZW50KFFUaW1lckV2ZW50ICopCi17Ci0gICAgZGlzcGF0Y2hJbWFnZUxv
YWRFdmVudHNOb3coKTsKLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6b3duZXJFbGVt
ZW50KCkKLXsKLSAgICBLSFRNTFZpZXcgKmNoaWxkVmlldyA9IHZpZXcoKTsKLSAgICBpZiAoIWNo
aWxkVmlldykKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUgKmNoaWxkUGFydCA9IGNoaWxk
Vmlldy0+ZnJhbWUoKTsKLSAgICBpZiAoIWNoaWxkUGFydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgRnJhbWUgKnBhcmVudCA9IGNoaWxkUGFydC0+cGFyZW50RnJhbWUoKTsKLSAgICBpZiAoIXBh
cmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgQ2hpbGRGcmFtZSAqY2hpbGRGcmFtZSA9IHBh
cmVudC0+Y2hpbGRGcmFtZShjaGlsZFBhcnQpOwotICAgIGlmICghY2hpbGRGcmFtZSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVyUGFydCAqcmVuZGVyUGFydCA9IGNoaWxkRnJhbWUtPm1f
cmVuZGVyZXI7Ci0gICAgaWYgKCFyZW5kZXJQYXJ0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4ocmVuZGVyUGFydC0+ZWxlbWVudCgpKTsK
LX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6cmVmZXJyZXIoKSBjb25zdAotewotICAgIGlm
ICggZnJhbWUoKSApCi0gICAgICAgIHJldHVybiBNYWMoZnJhbWUoKSktPmluY29taW5nUmVmZXJy
ZXIoKTsKLSAgICAKLSAgICByZXR1cm4gRE9NU3RyaW5nKCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1
bWVudEltcGw6OmRvbWFpbigpIGNvbnN0Ci17Ci0gICAgaWYgKCBtX2RvbWFpbi5pc0VtcHR5KCkg
KSAvLyBub3Qgc2V0IHlldCAod2Ugc2V0IGl0IG9uIGRlbWFuZCB0byBzYXZlIHRpbWUgYW5kIHNw
YWNlKQotICAgICAgICBtX2RvbWFpbiA9IEtVUkwoVVJMKCkpLmhvc3QoKTsgLy8gSW5pdGlhbGx5
IHNldCB0byB0aGUgaG9zdAotICAgIHJldHVybiBtX2RvbWFpbjsKLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OnNldERvbWFpbihjb25zdCBET01TdHJpbmcgJm5ld0RvbWFpbiwgYm9vbCBmb3JjZSAv
Kj1mYWxzZSovKQotewotICAgIGlmICggZm9yY2UgKSB7Ci0gICAgICAgIG1fZG9tYWluID0gbmV3
RG9tYWluOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICggbV9kb21haW4uaXNFbXB0
eSgpICkgLy8gbm90IHNldCB5ZXQgKHdlIHNldCBpdCBvbiBkZW1hbmQgdG8gc2F2ZSB0aW1lIGFu
ZCBzcGFjZSkKLSAgICAgICAgbV9kb21haW4gPSBLVVJMKFVSTCgpKS5ob3N0KCk7IC8vIEluaXRp
YWxseSBzZXQgdG8gdGhlIGhvc3QKLQotICAgIC8vIEJvdGggTlMgYW5kIElFIHNwZWNpZnkgdGhh
dCBjaGFuZ2luZyB0aGUgZG9tYWluIGlzIG9ubHkgYWxsb3dlZCB3aGVuCi0gICAgLy8gdGhlIG5l
dyBkb21haW4gaXMgYSBzdWZmaXggb2YgdGhlIG9sZCBkb21haW4uCi0gICAgaW50IG9sZExlbmd0
aCA9IG1fZG9tYWluLmxlbmd0aCgpOwotICAgIGludCBuZXdMZW5ndGggPSBuZXdEb21haW4ubGVu
Z3RoKCk7Ci0gICAgaWYgKCBuZXdMZW5ndGggPCBvbGRMZW5ndGggKSAvLyBlLmcuIG5ld0RvbWFp
bj1rZGUub3JnICg3KSBhbmQgbV9kb21haW49d3d3LmtkZS5vcmcgKDExKQotICAgIHsKLSAgICAg
ICAgRE9NU3RyaW5nIHRlc3QgPSBtX2RvbWFpbi5jb3B5KCk7Ci0gICAgICAgIGlmICggdGVzdFtv
bGRMZW5ndGggLSBuZXdMZW5ndGggLSAxXSA9PSAnLicgKSAvLyBDaGVjayB0aGF0IGl0J3MgYSBz
dWJkb21haW4sIG5vdCBlLmcuICJkZS5vcmciCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlc3Qu
cmVtb3ZlKCAwLCBvbGRMZW5ndGggLSBuZXdMZW5ndGggKTsgLy8gbm93IHRlc3QgaXMgImtkZS5v
cmciIGZyb20gbV9kb21haW4KLSAgICAgICAgICAgIGlmICggdGVzdCA9PSBuZXdEb21haW4gKSAg
ICAgICAgICAgICAgICAgLy8gYW5kIHdlIGNoZWNrIHRoYXQgaXQncyB0aGUgc2FtZSB0aGluZyBh
cyBuZXdEb21haW4KLSAgICAgICAgICAgICAgICBtX2RvbWFpbiA9IG5ld0RvbWFpbjsKLSAgICAg
ICAgfQotICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OmlzVmFsaWROYW1lKGNvbnN0IERP
TVN0cmluZyAmbmFtZSkKLXsKLSAgICBjb25zdCBVQ2hhciAqcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8
Y29uc3QgVUNoYXIgKj4obmFtZS51bmljb2RlKCkpOwotICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5h
bWUubGVuZ3RoKCk7Ci0KLSAgICBpZiAobGVuZ3RoID09IDApCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotICAgIHVuc2lnbmVkIGkgPSAwOwotCi0gICAgVUNoYXIzMiBjOwotICAgIFUxNl9ORVhU
KHMsIGksIGxlbmd0aCwgYykKLSAgICBpZiAoIWlzVmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAg
IHJldHVybiBmYWxzZTsKLQotICAgIHdoaWxlIChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFUxNl9O
RVhUKHMsIGksIGxlbmd0aCwgYykKLSAgICAgICAgaWYgKCFpc1ZhbGlkTmFtZVBhcnQoYykpCi0g
ICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0K
LWJvb2wgRG9jdW1lbnRJbXBsOjpwYXJzZVF1YWxpZmllZE5hbWUoY29uc3QgRE9NU3RyaW5nICZx
dWFsaWZpZWROYW1lLCBET01TdHJpbmcgJnByZWZpeCwgRE9NU3RyaW5nICZsb2NhbE5hbWUpCi17
Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gcXVhbGlmaWVkTmFtZS5sZW5ndGgoKTsKLQotICAgIGlm
IChsZW5ndGggPT0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBuYW1lU3Rh
cnQgPSB0cnVlOwotICAgIGJvb2wgc2F3Q29sb24gPSBmYWxzZTsKLSAgICBpbnQgY29sb25Qb3Mg
PSAwOwotCi0gICAgY29uc3QgUUNoYXIgKnMgPSBxdWFsaWZpZWROYW1lLnVuaWNvZGUoKTsKLSAg
ICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyApIHsKLSAgICAgICAgVUNoYXIzMiBj
OwotICAgICAgICBVMTZfTkVYVChzLCBpLCBsZW5ndGgsIGMpCi0gICAgICAgIGlmIChjID09ICc6
JykgewotICAgICAgICAgICAgaWYgKHNhd0NvbG9uKQotICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsgLy8gbXVsdGlwbGUgY29sb25zOiBub3QgYWxsb3dlZAotICAgICAgICAgICAgbmFtZVN0
YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHNhd0NvbG9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGNv
bG9uUG9zID0gaSAtIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAobmFtZVN0YXJ0KSB7Ci0gICAgICAg
ICAgICBpZiAoIWlzVmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICAgICAgbmFtZVN0YXJ0ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0g
ICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lUGFydChjKSkKLSAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXNhd0NvbG9uKSB7Ci0gICAg
ICAgIHByZWZpeCA9IERPTVN0cmluZygpOwotICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWRO
YW1lLmNvcHkoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmVmaXggPSBxdWFsaWZpZWROYW1l
LnN1YnN0cmluZygwLCBjb2xvblBvcyk7Ci0gICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5h
bWUuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSwgbGVuZ3RoIC0gKGNvbG9uUG9zICsgMSkpOwotICAg
IH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkSW1hZ2VN
YXAoSFRNTE1hcEVsZW1lbnRJbXBsICppbWFnZU1hcCkKLXsKLSAgICAvLyBBZGQgdGhlIGltYWdl
IG1hcCwgdW5sZXNzIHRoZXJlJ3MgYWxyZWFkeSBhbm90aGVyIHdpdGggdGhhdCBuYW1lLgotICAg
IC8vICJGaXJzdCBtYXAgd2lucyIgaXMgdGhlIHJ1bGUgb3RoZXIgYnJvd3NlcnMgc2VlbSB0byBp
bXBsZW1lbnQuCi0gICAgUVN0cmluZyBuYW1lID0gaW1hZ2VNYXAtPmdldE5hbWUoKS5xc3RyaW5n
KCk7Ci0gICAgaWYgKCFtX2ltYWdlTWFwc0J5TmFtZS5jb250YWlucyhuYW1lKSkKLSAgICAgICAg
bV9pbWFnZU1hcHNCeU5hbWUuaW5zZXJ0KG5hbWUsIGltYWdlTWFwKTsKLX0KLQotdm9pZCBEb2N1
bWVudEltcGw6OnJlbW92ZUltYWdlTWFwKEhUTUxNYXBFbGVtZW50SW1wbCAqaW1hZ2VNYXApCi17
Ci0gICAgLy8gUmVtb3ZlIHRoZSBpbWFnZSBtYXAgYnkgbmFtZS4KLSAgICAvLyBCdXQgZG9uJ3Qg
cmVtb3ZlIHNvbWUgb3RoZXIgaW1hZ2UgbWFwIHRoYXQganVzdCBoYXBwZW5zIHRvIGhhdmUgdGhl
IHNhbWUgbmFtZS4KLSAgICBRU3RyaW5nIG5hbWUgPSBpbWFnZU1hcC0+Z2V0TmFtZSgpLnFzdHJp
bmcoKTsKLSAgICBRTWFwSXRlcmF0b3I8UVN0cmluZywgSFRNTE1hcEVsZW1lbnRJbXBsICo+IGl0
ID0gbV9pbWFnZU1hcHNCeU5hbWUuZmluZChuYW1lKTsKLSAgICBpZiAoaXQgIT0gbV9pbWFnZU1h
cHNCeU5hbWUuZW5kKCkgJiYgKml0ID09IGltYWdlTWFwKQotICAgICAgICBtX2ltYWdlTWFwc0J5
TmFtZS5yZW1vdmUoaXQpOwotfQotCi1IVE1MTWFwRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6
Z2V0SW1hZ2VNYXAoY29uc3QgRE9NU3RyaW5nICZVUkwpIGNvbnN0Ci17Ci0gICAgaWYgKFVSTC5p
c051bGwoKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBRU3RyaW5nIHMgPSBV
UkwucXN0cmluZygpOwotICAgIGludCBoYXNoUG9zID0gcy5maW5kKCcjJyk7Ci0gICAgaWYgKGhh
c2hQb3MgPj0gMCkKLSAgICAgICAgcyA9IHMubWlkKGhhc2hQb3MgKyAxKTsKLQotICAgIFFNYXBD
b25zdEl0ZXJhdG9yPFFTdHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAqPiBpdCA9IG1faW1hZ2VN
YXBzQnlOYW1lLmZpbmQocyk7Ci0gICAgaWYgKGl0ID09IG1faW1hZ2VNYXBzQnlOYW1lLmVuZCgp
KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gKml0OwotfQotCi0KLXZvaWQgRG9jdW1l
bnRJbXBsOjpzZXREZWNvZGVyKERlY29kZXIgKmRlY29kZXIpCi17Ci0gICAgbV9kZWNvZGVyID0g
ZGVjb2RlcjsKLX0KLQotUVN0cmluZyBEb2N1bWVudEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IFFT
dHJpbmcgJlVSTCkKLXsKLSAgICByZXR1cm4gS1VSTChiYXNlVVJMKCksIFVSTCwgbV9kZWNvZGVy
ID8gbV9kZWNvZGVyLT5jb2RlYygpIDogMCkudXJsKCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVu
dEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IERPTVN0cmluZyAmVVJMKQotewotICAgIGlmIChVUkwu
aXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBVUkw7Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKFVS
TC5xc3RyaW5nKCkpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6aW5QYWdlQ2FjaGUoKQotewot
ICAgIHJldHVybiBtX2luUGFnZUNhY2hlOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0SW5Q
YWdlQ2FjaGUoYm9vbCBmbGFnKQotewotICAgIGlmIChtX2luUGFnZUNhY2hlID09IGZsYWcpCi0g
ICAgICAgIHJldHVybjsKLQotICAgIG1faW5QYWdlQ2FjaGUgPSBmbGFnOwotICAgIGlmIChmbGFn
KSB7Ci0gICAgICAgIGFzc2VydChtX3NhdmVkUmVuZGVyZXIgPT0gMCk7Ci0gICAgICAgIG1fc2F2
ZWRSZW5kZXJlciA9IG1fcmVuZGVyOwotICAgICAgICBpZiAobV92aWV3KSB7Ci0gICAgICAgICAg
ICBtX3ZpZXctPnJlc2V0U2Nyb2xsQmFycygpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgYXNzZXJ0KG1fcmVuZGVyID09IDAgfHwgbV9yZW5kZXIgPT0gbV9zYXZlZFJlbmRlcmVy
KTsKLSAgICAgICAgbV9yZW5kZXIgPSBtX3NhdmVkUmVuZGVyZXI7Ci0gICAgICAgIG1fc2F2ZWRS
ZW5kZXJlciA9IDA7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cGFzc3dvcmRGaWVs
ZEFkZGVkKCkKLXsKLSAgICBtX3Bhc3N3b3JkRmllbGRzKys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpwYXNzd29yZEZpZWxkUmVtb3ZlZCgpCi17Ci0gICAgYXNzZXJ0KG1fcGFzc3dvcmRGaWVs
ZHMgPiAwKTsKLSAgICBtX3Bhc3N3b3JkRmllbGRzLS07Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBs
OjpoYXNQYXNzd29yZEZpZWxkKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9wYXNzd29yZEZpZWxk
cyA+IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZWN1cmVGb3JtQWRkZWQoKQotewotICAg
IG1fc2VjdXJlRm9ybXMrKzsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNlY3VyZUZvcm1SZW1v
dmVkKCkKLXsKLSAgICBhc3NlcnQobV9zZWN1cmVGb3JtcyA+IDApOwotICAgIG1fc2VjdXJlRm9y
bXMtLTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6Omhhc1NlY3VyZUZvcm0oKSBjb25zdAotewot
ICAgIHJldHVybiBtX3NlY3VyZUZvcm1zID4gMDsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNl
dFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29sIGYpCi17Ci0gICAgbV9jcmVhdGVSZW5kZXJlcnMg
PSBmOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkKLXsK
LSAgICByZXR1cm4gbV9jcmVhdGVSZW5kZXJlcnM7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudElt
cGw6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgcmVzdWx0OwotCi0gICAgZm9y
IChOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0g
Y2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLQlyZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
Ci0vLyBTdXBwb3J0IGZvciBKYXZhc2NyaXB0IGV4ZWNDb21tYW5kLCBhbmQgcmVsYXRlZCBtZXRo
b2RzCi0KLUpTRWRpdG9yICpEb2N1bWVudEltcGw6OmpzRWRpdG9yKCkKLXsKLSAgICBpZiAoIW1f
anNFZGl0b3IpCi0gICAgICAgIG1fanNFZGl0b3IgPSBuZXcgSlNFZGl0b3IodGhpcyk7Ci0gICAg
cmV0dXJuIG1fanNFZGl0b3I7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpleGVjQ29tbWFuZChj
b25zdCBET01TdHJpbmcgJmNvbW1hbmQsIGJvb2wgdXNlckludGVyZmFjZSwgY29uc3QgRE9NU3Ry
aW5nICZ2YWx1ZSkKLXsKLSAgICByZXR1cm4ganNFZGl0b3IoKS0+ZXhlY0NvbW1hbmQoY29tbWFu
ZCwgdXNlckludGVyZmFjZSwgdmFsdWUpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlD
b21tYW5kRW5hYmxlZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpz
RWRpdG9yKCktPnF1ZXJ5Q29tbWFuZEVuYWJsZWQoY29tbWFuZCk7Ci19Ci0KLWJvb2wgRG9jdW1l
bnRJbXBsOjpxdWVyeUNvbW1hbmRJbmRldGVybShjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17
Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbW1hbmQpOwot
fQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlDb21tYW5kU3RhdGUoY29uc3QgRE9NU3RyaW5n
ICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0VkaXRvcigpLT5xdWVyeUNvbW1hbmRTdGF0ZShj
b21tYW5kKTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChj
b25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5
Q29tbWFuZFN1cHBvcnRlZChjb21tYW5kKTsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6
cXVlcnlDb21tYW5kVmFsdWUoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVy
biBqc0VkaXRvcigpLT5xdWVyeUNvbW1hbmRWYWx1ZShjb21tYW5kKTsKLX0KLQotLy8gLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLQotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkTWFya2VyKFJhbmdlSW1wbCAq
cmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIHR5cGUpCi17Ci0gICAgLy8gVXNlIGEg
VGV4dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUg
cmFuZ2UgY292ZXJzLgotICAgIGZvciAoVGV4dEl0ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAh
bWFya2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRUZXh0LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQ
dHI8UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBtYXJrZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGlu
dCBleGNlcHRpb24gPSAwOwotICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSB7dHlwZSwg
dGV4dFBpZWNlLT5zdGFydE9mZnNldChleGNlcHRpb24pLCB0ZXh0UGllY2UtPmVuZE9mZnNldChl
eGNlcHRpb24pfTsKLSAgICAgICAgYWRkTWFya2VyKHRleHRQaWVjZS0+c3RhcnRDb250YWluZXIo
ZXhjZXB0aW9uKSwgbWFya2VyKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1v
dmVNYXJrZXJzKFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1h
cmtlclR5cGUpCi17Ci0gICAgLy8gVXNlIGEgVGV4dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBwb3Rl
bnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUgcmFuZ2UgY292ZXJzLgotICAgIGZvciAoVGV4dEl0
ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAhbWFya2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRUZXh0
LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQdHI8UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBtYXJr
ZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGludCBleGNlcHRpb24gPSAwOwotICAgICAgICB1bnNp
Z25lZCBzdGFydE9mZnNldCA9IHRleHRQaWVjZS0+c3RhcnRPZmZzZXQoZXhjZXB0aW9uKTsKLSAg
ICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4dFBpZWNlLT5lbmRPZmZzZXQoZXhjZXB0aW9uKSAt
IHN0YXJ0T2Zmc2V0ICsgMTsKLSAgICAgICAgcmVtb3ZlTWFya2Vycyh0ZXh0UGllY2UtPnN0YXJ0
Q29udGFpbmVyKGV4Y2VwdGlvbiksIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG1hcmtlclR5cGUpOwot
ICAgIH0KLX0KLQotLy8gTWFya2VycyBhcmUgc3RvcmVkIGluIG9yZGVyIHNvcnRlZCBieSB0aGVp
ciBsb2NhdGlvbi4gIFRoZXkgZG8gbm90IG92ZXJsYXAgZWFjaCBvdGhlciwgYXMgY3VycmVudGx5
Ci0vLyByZXF1aXJlZCBieSB0aGUgZHJhd2luZyBjb2RlIGluIFJlbmRlclRleHQuY3BwLgotCi12
b2lkIERvY3VtZW50SW1wbDo6YWRkTWFya2VyKE5vZGVJbXBsICpub2RlLCBEb2N1bWVudE1hcmtl
ciBuZXdNYXJrZXIpIAotewotICAgIGFzc2VydChuZXdNYXJrZXIuZW5kT2Zmc2V0ID49IG5ld01h
cmtlci5zdGFydE9mZnNldCk7Ci0gICAgaWYgKG5ld01hcmtlci5lbmRPZmZzZXQgPT0gbmV3TWFy
a2VyLnN0YXJ0T2Zmc2V0KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUVZhbHVlTGlzdCA8
RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYg
KCFtYXJrZXJzKSB7Ci0gICAgICAgIG1hcmtlcnMgPSBuZXcgUVZhbHVlTGlzdCA8RG9jdW1lbnRN
YXJrZXI+OwotICAgICAgICBtYXJrZXJzLT5hcHBlbmQobmV3TWFya2VyKTsKLSAgICAgICAgbV9t
YXJrZXJzLmluc2VydChub2RlLCBtYXJrZXJzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBRVmFs
dWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgICAgICBmb3IgKGl0ID0gbWFy
a2Vycy0+YmVnaW4oKTsgaXQgIT0gbWFya2Vycy0+ZW5kKCk7ICkgewotICAgICAgICAgICAgRG9j
dW1lbnRNYXJrZXIgbWFya2VyID0gKml0OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAo
bmV3TWFya2VyLmVuZE9mZnNldCA8IG1hcmtlci5zdGFydE9mZnNldCsxKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgbWFya2VyIHRoYXQgaXMgY29tcGxldGVseSBhZnRl
ciBuZXdNYXJrZXIsIGFuZCBkaXNqb2ludCBmcm9tIGl0LgotICAgICAgICAgICAgICAgIC8vIFdl
IGZvdW5kIG91ciBpbnNlcnRpb24gcG9pbnQuEAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAg
ICAgICAgICAgfSBlbHNlIGlmIChuZXdNYXJrZXIuc3RhcnRPZmZzZXQgPiBtYXJrZXIuZW5kT2Zm
c2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZXIgaXMgYmVmb3JlIG5ld01hcmtlciwgYW5k
IGRpc2pvaW50IGZyb20gaXQuICBLZWVwIHNjYW5uaW5nLgotICAgICAgICAgICAgICAgIGl0Kys7
Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld01hcmtlciA9PSBtYXJrZXIpIHsKLSAgICAgICAg
ICAgICAgICAvLyBhbHJlYWR5IGhhdmUgdGhpcyBvbmUsIE5PUAotICAgICAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFya2VyIGFu
ZCBuZXdNYXJrZXIgaW50ZXJzZWN0IG9yIHRvdWNoIC0gbWVyZ2UgdGhlbSBpbnRvIG5ld01hcmtl
cgotICAgICAgICAgICAgICAgIG5ld01hcmtlci5zdGFydE9mZnNldCA9IGtNaW4obmV3TWFya2Vy
LnN0YXJ0T2Zmc2V0LCBtYXJrZXIuc3RhcnRPZmZzZXQpOwotICAgICAgICAgICAgICAgIG5ld01h
cmtlci5lbmRPZmZzZXQgPSBrTWF4KG5ld01hcmtlci5lbmRPZmZzZXQsIG1hcmtlci5lbmRPZmZz
ZXQpOwotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBvbGQgb25lLCB3ZSdsbCBhZGQgbmV3TWFy
a2VyIGxhdGVyCi0gICAgICAgICAgICAgICAgaXQgPSBtYXJrZXJzLT5yZW1vdmUoaXQpOwotICAg
ICAgICAgICAgICAgIC8vIGl0IHBvaW50cyB0byB0aGUgbmV4dCBtYXJrZXIgdG8gY29uc2lkZXIK
LSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGl0IHBv
aW50cyB0byB0aGUgbm9kZSBiZWZvcmUgd2hpY2ggd2Ugd2FudCB0byBpbnNlcnQKLSAgICAgICAg
bWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdNYXJrZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBh
aW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAgaWYgKG5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAg
IG5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsKLX0KLQotLy8gY29waWVzIG1hcmtlcnMgZnJv
bSBzcmNOb2RlIHRvIGRzdE5vZGUsIGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgc2hpZnQgZGVsdGEg
dG8gdGhlIGNvcGllcy4gIFRoZSBzaGlmdCBpcwotLy8gdXNlZnVsIGlmLCBlLmcuLCB0aGUgY2Fs
bGVyIGhhcyBjcmVhdGVkIHRoZSBkc3ROb2RlIGZyb20gYSBub24tcHJlZml4IHN1YnN0cmluZyBv
ZiB0aGUgc3JjTm9kZS4KLXZvaWQgRG9jdW1lbnRJbXBsOjpjb3B5TWFya2VycyhOb2RlSW1wbCAq
c3JjTm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIE5vZGVJbXBsICpkc3RO
b2RlLCBpbnQgZGVsdGEsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17
Ci0gICAgaWYgKGxlbmd0aCA8PSAwKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUVZhbHVl
TGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQoc3JjTm9kZSk7
Ci0gICAgaWYgKCFtYXJrZXJzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBib29sIGRvY0RpcnR5
ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGgg
LSAxOwotICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxEb2N1bWVudE1hcmtlcj4gaXQ7Ci0gICAgZm9y
IChpdCA9IG1hcmtlcnMtPmJlZ2luKCk7IGl0ICE9IG1hcmtlcnMtPmVuZCgpOyArK2l0KSB7Ci0g
ICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9ICppdDsKLQotICAgICAgICAvLyBzdG9wIGlm
IHdlIGFyZSBub3cgcGFzdCB0aGUgc3BlY2lmaWVkIHJhbmdlCi0gICAgICAgIGlmIChtYXJrZXIu
c3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgCi0g
ICAgICAgIC8vIHNraXAgbWFya2VyIHRoYXQgaXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ug
b3IgaXMgdGhlIHdyb25nIHR5cGUKLSAgICAgICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPCBzdGFy
dE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0gbWFya2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERv
Y3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAg
ICAgIC8vIHBpbiB0aGUgbWFya2VyIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2UgYW5kIGFwcGx5IHRo
ZSBzaGlmdCBkZWx0YQotICAgICAgICBkb2NEaXJ0eSA9IHRydWU7Ci0gICAgICAgIGlmIChtYXJr
ZXIuc3RhcnRPZmZzZXQgPCBzdGFydE9mZnNldCkKLSAgICAgICAgICAgIG1hcmtlci5zdGFydE9m
ZnNldCA9IHN0YXJ0T2Zmc2V0OwotICAgICAgICBpZiAobWFya2VyLmVuZE9mZnNldCA+IGVuZE9m
ZnNldCkKLSAgICAgICAgICAgIG1hcmtlci5lbmRPZmZzZXQgPSBlbmRPZmZzZXQ7Ci0gICAgICAg
IG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgbWFya2VyLmVuZE9mZnNldCAr
PSBkZWx0YTsKLSAgICAgICAgCi0gICAgICAgIGFkZE1hcmtlcihkc3ROb2RlLCBtYXJrZXIpOwot
ICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAgaWYgKGRv
Y0RpcnR5ICYmIGRzdE5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIGRzdE5vZGUtPnJlbmRlcmVy
KCktPnJlcGFpbnQoKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZU1hcmtlcnMoTm9k
ZUltcGwgKm5vZGUsIHVuc2lnbmVkIHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoLCBEb2N1bWVudE1h
cmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlKQotewotICAgIGlmIChsZW5ndGggPD0gMCkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJz
ID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKQotICAgICAgICByZXR1
cm47Ci0gICAgCi0gICAgYm9vbCBkb2NEaXJ0eSA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGVuZE9m
ZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoIC0gMTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8
RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgIGZvciAoaXQgPSBtYXJrZXJzLT5iZWdpbigpOyBpdCAh
PSBtYXJrZXJzLT5lbmQoKTsgKSB7Ci0gICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9ICpp
dDsKLQotICAgICAgICAvLyBtYXJrZXJzIGFyZSByZXR1cm5lZCBpbiBvcmRlciwgc28gc3RvcCBp
ZiB3ZSBhcmUgbm93IHBhc3QgdGhlIHNwZWNpZmllZCByYW5nZQotICAgICAgICBpZiAobWFya2Vy
LnN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAot
ICAgICAgICAvLyBza2lwIG1hcmtlciB0aGF0IGlzIHdyb25nIHR5cGUgb3IgYmVmb3JlIHRhcmdl
dAotICAgICAgICBpZiAobWFya2VyLmVuZE9mZnNldCA8IHN0YXJ0T2Zmc2V0IHx8IChtYXJrZXIu
dHlwZSAhPSBtYXJrZXJUeXBlICYmIG1hcmtlclR5cGUgIT0gRG9jdW1lbnRNYXJrZXI6OkFsbE1h
cmtlcnMpKSB7Ci0gICAgICAgICAgICBpdCsrOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAg
ICAgIH0KLQotICAgICAgICAvLyBhdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBtYXJrZXIgYW5k
IHRhcmdldCBpbnRlcnNlY3QgaW4gc29tZSB3YXkKLSAgICAgICAgZG9jRGlydHkgPSB0cnVlOwot
Ci0gICAgICAgIC8vIHBpdGNoIHRoZSBvbGQgbWFya2VyCi0gICAgICAgIGl0ID0gbWFya2Vycy0+
cmVtb3ZlKGl0KTsKLSAgICAgICAgLy8gaXQgbm93IHBvaW50cyB0byB0aGUgbmV4dCBub2RlCi0g
ICAgICAgIAotICAgICAgICAvLyBhZGQgZWl0aGVyIG9mIHRoZSByZXN1bHRpbmcgc2xpY2VzIHRo
YXQgYXJlIGxlZnQgYWZ0ZXIgcmVtb3ZpbmcgdGFyZ2V0Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMg
YWRkcyB0byB0aGUgbGlzdCB3ZSBhcmUgaXRlcmF0aW5nISAgVGhhdCBpcyBPSyByZWdhcmRsZXNz
IG9mCi0gICAgICAgIC8vIHdoZXRoZXIgdGhlIGl0ZXJhdG9yIHNlZXMgdGhlIG5ldyBub2RlLCBz
aW5jZSB0aGUgbmV3IG5vZGUgaXMgYSBrZWVwZXIuCi0gICAgICAgIGlmIChzdGFydE9mZnNldCA+
IG1hcmtlci5zdGFydE9mZnNldCkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbmV3TGVm
dCA9IG1hcmtlcjsKLSAgICAgICAgICAgIG5ld0xlZnQuZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7
Ci0gICAgICAgICAgICBtYXJrZXJzLT5pbnNlcnQoaXQsIG5ld0xlZnQpOwotICAgICAgICB9Ci0g
ICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0ID4gZW5kT2Zmc2V0KSB7Ci0gICAgICAgICAgICBE
b2N1bWVudE1hcmtlciBuZXdSaWdodCA9IG1hcmtlcjsKLSAgICAgICAgICAgIG5ld1JpZ2h0LnN0
YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwotICAgICAgICAgICAgbWFya2Vycy0+aW5zZXJ0KGl0LCBu
ZXdSaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobWFya2Vycy0+aXNFbXB0eSgp
KQotICAgICAgICBtX21hcmtlcnMucmVtb3ZlKG5vZGUpOwotCi0gICAgLy8gcmVwYWludCB0aGUg
YWZmZWN0ZWQgbm9kZQotICAgIGlmIChkb2NEaXJ0eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAg
ICAgICBub2RlLT5yZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLVFWYWx1ZUxpc3Q8RG9jdW1l
bnRNYXJrZXI+IERvY3VtZW50SW1wbDo6bWFya2Vyc0Zvck5vZGUoTm9kZUltcGwgKm5vZGUpCi17
Ci0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZp
bmQobm9kZSk7Ci0gICAgaWYgKG1hcmtlcnMpCi0gICAgICAgIHJldHVybiAqbWFya2VyczsKLSAg
ICByZXR1cm4gUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICgpOwotfQotCi12b2lkIERvY3Vt
ZW50SW1wbDo6cmVtb3ZlTWFya2VycyhOb2RlSW1wbCAqbm9kZSkKLXsKLSAgICBRVmFsdWVMaXN0
PERvY3VtZW50TWFya2VyPiAqbWFya2VycyA9IG1fbWFya2Vycy50YWtlKG5vZGUpOwotICAgIGlm
IChtYXJrZXJzKSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBub2RlLT5yZW5k
ZXJlcigpOwotICAgICAgICBpZiAocmVuZGVyZXIpCi0gICAgICAgICAgICByZW5kZXJlci0+cmVw
YWludCgpOwotICAgICAgICBkZWxldGUgbWFya2VyczsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1l
bnRJbXBsOjpyZW1vdmVNYXJrZXJzKERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5
cGUpCi17Ci0gICAgLy8gb3V0ZXIgbG9vcDogcHJvY2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4g
dGhlIGRvY3VtZW50Ci0gICAgUVB0ckRpY3RJdGVyYXRvcjwgUVZhbHVlTGlzdDxEb2N1bWVudE1h
cmtlcj4gPiBkaWN0SXRlcmF0b3IobV9tYXJrZXJzKTsKLSAgICBmb3IgKDsgTm9kZUltcGwgKm5v
ZGUgPSBzdGF0aWNfY2FzdDxOb2RlSW1wbCAqPihkaWN0SXRlcmF0b3IuY3VycmVudEtleSgpKTsg
KSB7Ci0gICAgICAgIC8vIGlubmVyIGxvb3A6IHByb2Nlc3MgZWFjaCBtYXJrZXIgaW4gdGhlIGN1
cnJlbnQgbm9kZQotICAgICAgICBRVmFsdWVMaXN0IDxEb2N1bWVudE1hcmtlcj4gKm1hcmtlcnMg
PSBzdGF0aWNfY2FzdDxRVmFsdWVMaXN0IDxEb2N1bWVudE1hcmtlcj4gKj4oZGljdEl0ZXJhdG9y
LmN1cnJlbnQoKSk7Ci0gICAgICAgIFFWYWx1ZUxpc3RJdGVyYXRvcjxEb2N1bWVudE1hcmtlcj4g
bWFya2VySXRlcmF0b3I7Ci0gICAgICAgIGZvciAobWFya2VySXRlcmF0b3IgPSBtYXJrZXJzLT5i
ZWdpbigpOyBtYXJrZXJJdGVyYXRvciAhPSBtYXJrZXJzLT5lbmQoKTsgKSB7Ci0gICAgICAgICAg
ICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSAqbWFya2VySXRlcmF0b3I7Ci0KLSAgICAgICAgICAg
IC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgbm90IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAg
ICAgICAgaWYgKG1hcmtlci50eXBlICE9IG1hcmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1
bWVudE1hcmtlcjo6QWxsTWFya2VycykgewotICAgICAgICAgICAgICAgICsrbWFya2VySXRlcmF0
b3I7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAg
ICAgIC8vIHBpdGNoIHRoZSBvbGQgbWFya2VyCi0gICAgICAgICAgICBtYXJrZXJJdGVyYXRvciA9
IG1hcmtlcnMtPnJlbW92ZShtYXJrZXJJdGVyYXRvcik7Ci0gICAgICAgICAgICAvLyBtYXJrZXJJ
dGVyYXRvciBub3cgcG9pbnRzIHRvIHRoZSBuZXh0IG5vZGUKLSAgICAgICAgfQotICAgICAgICAK
LSAgICAgICAgLy8gZGVsZXRlIHRoZSBub2RlJ3MgbGlzdCBpZiBpdCBpcyBub3cgZW1wdHkKLSAg
ICAgICAgaWYgKG1hcmtlcnMtPmlzRW1wdHkoKSkKLSAgICAgICAgICAgIG1fbWFya2Vycy5yZW1v
dmUobm9kZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBjYXVzZSB0aGUgbm9kZSB0byBiZSByZWRy
YXduCi0gICAgICAgIFJlbmRlck9iamVjdCAqcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOwot
ICAgICAgICBpZiAocmVuZGVyZXIpCi0gICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwot
ICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNoaWZ0TWFya2VycyhOb2RlSW1wbCAqbm9k
ZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtl
clR5cGUgbWFya2VyVHlwZSkKLXsKLSAgICBRVmFsdWVMaXN0IDxEb2N1bWVudE1hcmtlcj4gKm1h
cmtlcnMgPSBtX21hcmtlcnMuZmluZChub2RlKTsKLSAgICBpZiAoIW1hcmtlcnMpCi0gICAgICAg
IHJldHVybjsKLQotICAgIGJvb2wgZG9jRGlydHkgPSBmYWxzZTsKLSAgICBRVmFsdWVMaXN0SXRl
cmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgIGZvciAoaXQgPSBtYXJrZXJzLT5iZWdpbigp
OyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKytpdCkgewotICAgICAgICBEb2N1bWVudE1hcmtlciAm
bWFya2VyID0gKml0OwotICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0ID49IHN0YXJ0T2Zm
c2V0ICYmIChtYXJrZXJUeXBlID09IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzIHx8IG1hcmtl
ci50eXBlID09IG1hcmtlclR5cGUpKSB7Ci0gICAgICAgICAgICBhc3NlcnQoKGludCltYXJrZXIu
c3RhcnRPZmZzZXQgKyBkZWx0YSA+PSAwKTsKLSAgICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNl
dCArPSBkZWx0YTsKLSAgICAgICAgICAgIG1hcmtlci5lbmRPZmZzZXQgKz0gZGVsdGE7Ci0gICAg
ICAgICAgICBkb2NEaXJ0eSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8g
cmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAgIGlmIChkb2NEaXJ0eSAmJiBub2RlLT5yZW5k
ZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLSNpZmRl
ZiBLSFRNTF9YU0xUCi0KLXZvaWQgRG9jdW1lbnRJbXBsOjphcHBseVhTTFRyYW5zZm9ybShQcm9j
ZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSkKLXsKLSAgICBSZWZQdHI8WFNMVFByb2Nlc3Nvcklt
cGw+IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJvY2Vzc29ySW1wbDsKLSAgICBwcm9jZXNzb3ItPnNl
dFhTTFN0eWxlc2hlZXQoc3RhdGljX2Nhc3Q8WFNMU3R5bGVTaGVldEltcGwqPihwaS0+c2hlZXQo
KSkpOwotICAgIAotICAgIFFTdHJpbmcgcmVzdWx0TUlNRVR5cGU7Ci0gICAgUVN0cmluZyBuZXdT
b3VyY2U7Ci0gICAgUVN0cmluZyByZXN1bHRFbmNvZGluZzsKLSAgICBpZiAoIXByb2Nlc3Nvci0+
dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVzdWx0TUlNRVR5cGUsIG5ld1NvdXJjZSwgcmVzdWx0
RW5jb2RpbmcpKQotICAgICAgICByZXR1cm47Ci0gICAgLy8gRklYTUU6IElmIHRoZSB0cmFuc2Zv
cm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJseSByZXBvcnQgYW4gZXJyb3IgKGxpa2UgTW96aWxs
YSBkb2VzKS4KLSAgICBwcm9jZXNzb3ItPmNyZWF0ZURvY3VtZW50RnJvbVNvdXJjZShuZXdTb3Vy
Y2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRNSU1FVHlwZSwgdGhpcywgdmlldygpKTsKLX0KLQot
I2VuZGlmCi0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXREZXNpZ25Nb2RlKEluaGVyaXRlZEJvb2wg
dmFsdWUpCi17Ci0gICAgbV9kZXNpZ25Nb2RlID0gdmFsdWU7Ci19Ci0KLURvY3VtZW50SW1wbDo6
SW5oZXJpdGVkQm9vbCBEb2N1bWVudEltcGw6OmdldERlc2lnbk1vZGUoKSBjb25zdAotewotICAg
IHJldHVybiBtX2Rlc2lnbk1vZGU7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjppbkRlc2lnbk1v
ZGUoKSBjb25zdAotewotICAgIGZvciAoY29uc3QgRG9jdW1lbnRJbXBsKiBkID0gdGhpczsgZDsg
ZCA9IGQtPnBhcmVudERvY3VtZW50KCkpIHsKLSAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAh
PSBpbmhlcml0KQotICAgICAgICAgICAgcmV0dXJuIGQtPm1fZGVzaWduTW9kZTsgICAgICAKLSAg
ICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1Eb2N1bWVudEltcGwgKkRvY3VtZW50SW1wbDo6
cGFyZW50RG9jdW1lbnQoKSBjb25zdAotewotICAgIEZyYW1lICpjaGlsZFBhcnQgPSBmcmFtZSgp
OwotICAgIGlmICghY2hpbGRQYXJ0KQotICAgICAgICByZXR1cm4gMDsKLSAgICBGcmFtZSAqcGFy
ZW50ID0gY2hpbGRQYXJ0LT5wYXJlbnRGcmFtZSgpOwotICAgIGlmICghcGFyZW50KQotICAgICAg
ICByZXR1cm4gMDsKLSAgICByZXR1cm4gcGFyZW50LT54bWxEb2NJbXBsKCk7Ci19Ci0KLURvY3Vt
ZW50SW1wbCAqRG9jdW1lbnRJbXBsOjp0b3BEb2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgRG9jdW1l
bnRJbXBsICpkb2MgPSBjb25zdF9jYXN0PERvY3VtZW50SW1wbCAqPih0aGlzKTsKLSAgICBFbGVt
ZW50SW1wbCAqZWxlbWVudDsKLSAgICB3aGlsZSAoKGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVu
dCgpKSAhPSAwKSB7Ci0gICAgICAgIGRvYyA9IGVsZW1lbnQtPmdldERvY3VtZW50KCk7Ci0gICAg
ICAgIGVsZW1lbnQgPSBkb2MgPyBkb2MtPm93bmVyRWxlbWVudCgpIDogMDsKLSAgICB9Ci0gICAg
Ci0gICAgcmV0dXJuIGRvYzsKLX0KLQotQXR0ckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQXR0
cmlidXRlTlMoY29uc3QgRE9NU3RyaW5nICZuYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAm
cXVhbGlmaWVkTmFtZSwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgaWYgKHF1YWxpZmllZE5hbWUu
aXNOdWxsKCkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0Vf
RVJSOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBET01TdHJpbmcgbG9jYWxOYW1l
ID0gcXVhbGlmaWVkTmFtZTsKLSAgICBET01TdHJpbmcgcHJlZml4OwotICAgIGludCBjb2xvbnBv
czsKLSAgICBpZiAoKGNvbG9ucG9zID0gcXVhbGlmaWVkTmFtZS5maW5kKCc6JykpID49IDApIHsK
LSAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVkTmFtZS5jb3B5KCk7Ci0gICAgICAgIGxvY2FsTmFt
ZSA9IHF1YWxpZmllZE5hbWUuY29weSgpOwotICAgICAgICBwcmVmaXgudHJ1bmNhdGUoY29sb25w
b3MpOwotICAgICAgICBsb2NhbE5hbWUucmVtb3ZlKDAsIGNvbG9ucG9zKzEpOwotICAgIH0KLQot
ICAgIGlmICghaXNWYWxpZE5hbWUobG9jYWxOYW1lKSkgewotICAgICAgICBleGNlcHRpb24gPSBE
T01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgfQotICAgIAotICAgIC8vIEZJWE1FOiBBc3N1bWUgdGhpcyBpcyBhIG1hcHBlZCBhdHRyaWJ1
dGUsIHNpbmNlIGNyZWF0ZUF0dHJpYnV0ZSBpc24ndCBuYW1lc3BhY2UtYXdhcmUuICBUaGVyZSdz
IG5vIGhhcm0gdG8gWE1MCi0gICAgLy8gZG9jdW1lbnRzIGlmIHdlJ3JlIHdyb25nLgotICAgIHJl
dHVybiBuZXcgQXR0ckltcGwoMCwgdGhpcywgbmV3IE1hcHBlZEF0dHJpYnV0ZUltcGwoUXVhbGlm
aWVkTmFtZShwcmVmaXguaW1wbCgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxOYW1lLmltcGwoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJLmltcGwoKSksIERPTVN0cmluZygiIikuaW1wbCgp
KSwgZmFsc2UpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmFkaW9CdXR0b25DaGVja2VkKEhU
TUxJbnB1dEVsZW1lbnRJbXBsICpjYWxsZXIsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17
Ci0gICAgLy8gV2l0aG91dCBhIG5hbWUsIHRoZXJlIGlzIG5vIGdyb3VwLgotICAgIGlmIChjYWxs
ZXItPm5hbWUoKS5pc0VtcHR5KCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoIWZvcm0pCi0g
ICAgICAgIGZvcm0gPSBkZWZhdWx0Rm9ybTsKLSAgICAvLyBVbmNoZWNrIHRoZSBjdXJyZW50bHkg
c2VsZWN0ZWQgaXRlbQotICAgIGlmICghbV9zZWxlY3RlZFJhZGlvQnV0dG9ucykKLSAgICAgICAg
bV9zZWxlY3RlZFJhZGlvQnV0dG9ucyA9IG5ldyBGb3JtVG9Hcm91cE1hcDsKLSAgICBOYW1lVG9J
bnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdldChm
b3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1dHRvbnMpIHsKLSAgICAgICAgZm9ybVJhZGlvQnV0
dG9ucyA9IG5ldyBOYW1lVG9JbnB1dE1hcDsKLSAgICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9u
cy0+c2V0KGZvcm0sIGZvcm1SYWRpb0J1dHRvbnMpOwotICAgIH0KLSAgICAKLSAgICBIVE1MSW5w
dXRFbGVtZW50SW1wbCogY3VycmVudENoZWNrZWRSYWRpbyA9IGZvcm1SYWRpb0J1dHRvbnMtPmdl
dChjYWxsZXItPm5hbWUoKS5pbXBsKCkpOwotICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvICYm
IGN1cnJlbnRDaGVja2VkUmFkaW8gIT0gY2FsbGVyKQotICAgICAgICBjdXJyZW50Q2hlY2tlZFJh
ZGlvLT5zZXRDaGVja2VkKGZhbHNlKTsKLQotICAgIGZvcm1SYWRpb0J1dHRvbnMtPnNldChjYWxs
ZXItPm5hbWUoKS5pbXBsKCksIGNhbGxlcik7Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsKiBE
b2N1bWVudEltcGw6OmNoZWNrZWRSYWRpb0J1dHRvbkZvckdyb3VwKERPTVN0cmluZ0ltcGwqIG5h
bWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17Ci0gICAgaWYgKCFtX3NlbGVjdGVkUmFk
aW9CdXR0b25zKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoIWZvcm0pCi0gICAgICAgIGZv
cm0gPSBkZWZhdWx0Rm9ybTsKLSAgICBOYW1lVG9JbnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9
IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdldChmb3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1
dHRvbnMpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIHJldHVybiBmb3JtUmFkaW9CdXR0
b25zLT5nZXQobmFtZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVSYWRpb0J1dHRv
bkdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17
Ci0gICAgaWYgKCFmb3JtKQotICAgICAgICBmb3JtID0gZGVmYXVsdEZvcm07Ci0gICAgaWYgKG1f
c2VsZWN0ZWRSYWRpb0J1dHRvbnMpIHsKLSAgICAgICAgTmFtZVRvSW5wdXRNYXAqIGZvcm1SYWRp
b0J1dHRvbnMgPSBtX3NlbGVjdGVkUmFkaW9CdXR0b25zLT5nZXQoZm9ybSk7Ci0gICAgICAgIGlm
IChmb3JtUmFkaW9CdXR0b25zKSB7Ci0gICAgICAgICAgICBmb3JtUmFkaW9CdXR0b25zLT5yZW1v
dmUobmFtZSk7Ci0gICAgICAgICAgICBpZiAoZm9ybVJhZGlvQnV0dG9ucy0+aXNFbXB0eSgpKSB7
Ci0gICAgICAgICAgICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9ucy0+cmVtb3ZlKGZvcm0pOwot
ICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3JtUmFkaW9CdXR0b25zOwotICAgICAgICAgICAgfQot
ICAgICAgICB9Ci0gICAgfQotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVu
dEltcGw6OmltYWdlcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+
KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfSU1B
R0VTKSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IERvY3VtZW50SW1wbDo6YXBw
bGV0cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1M
Q29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfQVBQTEVUUykpOwot
fQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmVtYmVkcygpCi17
Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlv
bkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfRU1CRURTKSk7Ci19Ci0KLVJlZlB0
cjxIVE1MQ29sbGVjdGlvbkltcGw+IERvY3VtZW50SW1wbDo6b2JqZWN0cygpCi17Ci0gICAgcmV0
dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhp
cywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfT0JKRUNUUykpOwotfQotCi1SZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmxpbmtzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRy
PEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29s
bGVjdGlvbkltcGw6OkRPQ19MSU5LUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBs
PiBEb2N1bWVudEltcGw6OmZvcm1zKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0
aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6
OkRPQ19GT1JNUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudElt
cGw6OmFuY2hvcnMoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihu
ZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DX0FOQ0hP
UlMpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjphbGwo
KQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxl
Y3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DX0FMTCkpOwotfQotCi1SZWZQ
dHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OndpbmRvd05hbWVkSXRlbXMoRE9N
U3RyaW5nICZuYW1lKQotewotICAgIHJldHVybiBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihu
ZXcgSFRNTE5hbWVDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OldJTkRP
V19OQU1FRF9JVEVNUywgbmFtZSkpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBE
b2N1bWVudEltcGw6OmRvY3VtZW50TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpCi17Ci0gICAg
cmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MTmFtZUNvbGxlY3Rpb25J
bXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DVU1FTlRfTkFNRURfSVRFTVMsIG5hbWUp
KTsKLX0KLQotUmVmUHRyPE5hbWVOb2RlTGlzdEltcGw+IERvY3VtZW50SW1wbDo6Z2V0RWxlbWVu
dHNCeU5hbWUoY29uc3QgRE9NU3RyaW5nICZlbGVtZW50TmFtZSkKLXsKLSAgICByZXR1cm4gUmVm
UHRyPE5hbWVOb2RlTGlzdEltcGw+KG5ldyBOYW1lTm9kZUxpc3RJbXBsKHRoaXMsIGVsZW1lbnRO
YW1lKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotRG9jdW1lbnRGcmFnbWVudElt
cGw6OkRvY3VtZW50RnJhZ21lbnRJbXBsKERvY3VtZW50SW1wbCAqZG9jKSA6IENvbnRhaW5lck5v
ZGVJbXBsKGRvYykKLXsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50RnJhZ21lbnRJbXBsOjpub2Rl
TmFtZSgpIGNvbnN0Ci17Ci0gIHJldHVybiAiI2RvY3VtZW50LWZyYWdtZW50IjsKLX0KLQotdW5z
aWduZWQgc2hvcnQgRG9jdW1lbnRGcmFnbWVudEltcGw6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAg
ICByZXR1cm4gTm9kZTo6RE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLX0KLQotLy8gRE9NIFNlY3Rp
b24gMS4xLjEKLWJvb2wgRG9jdW1lbnRGcmFnbWVudEltcGw6OmNoaWxkVHlwZUFsbG93ZWQoIHVu
c2lnbmVkIHNob3J0IHR5cGUgKQotewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNl
IE5vZGU6OkVMRU1FTlRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RS
VUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6Q09NTUVOVF9OT0RFOgotICAgICAgICBj
YXNlIE5vZGU6OlRFWFRfTk9ERToKLSAgICAgICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05P
REU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5USVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAg
ICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRGcmFnbWVudEltcGw6OnRvU3RyaW5n
KCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcgcmVzdWx0OwotCi0gICAgZm9yIChOb2RlSW1wbCAq
Y2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHRT
aWJsaW5nKCkpIHsKLQlyZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIHJlc3VsdDsKLX0KLQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRGcmFnbWVudEltcGw6OmNs
b25lTm9kZSAoYm9vbCBkZWVwKQotewotICAgIERvY3VtZW50RnJhZ21lbnRJbXBsICpjbG9uZSA9
IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbChnZXREb2N1bWVudCgpKTsKLSAgICBpZiAoZGVlcCkK
LSAgICAgICAgY2xvbmVDaGlsZE5vZGVzKGNsb25lKTsKLSAgICByZXR1cm4gY2xvbmU7Ci19Ci0K
LQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Eb2N1bWVudFR5cGVJbXBsOjpEb2N1bWVudFR5
cGVJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqaSwgRG9jdW1lbnRJbXBsICpkb2MsIGNvbnN0
IERPTVN0cmluZyAmbiwgY29uc3QgRE9NU3RyaW5nICZwLCBjb25zdCBET01TdHJpbmcgJnMpCi0g
ICAgOiBOb2RlSW1wbChkb2MpLCBtX2ltcGxlbWVudGF0aW9uKGkpLCBtX25hbWUobiksIG1fcHVi
bGljSWQocCksIG1fc3lzdGVtSWQocykKLXsKLX0KLQotRG9jdW1lbnRUeXBlSW1wbDo6RG9jdW1l
bnRUeXBlSW1wbChEb2N1bWVudEltcGwgKmRvYywgY29uc3QgRE9NU3RyaW5nICZuLCBjb25zdCBE
T01TdHJpbmcgJnAsIGNvbnN0IERPTVN0cmluZyAmcykKLSAgICA6IE5vZGVJbXBsKGRvYyksIG1f
bmFtZShuKSwgbV9wdWJsaWNJZChwKSwgbV9zeXN0ZW1JZChzKQotewotfQotCi1Eb2N1bWVudFR5
cGVJbXBsOjpEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50SW1wbCAqZG9jLCBjb25zdCBEb2N1bWVu
dFR5cGVJbXBsICZ0KQotICAgIDogTm9kZUltcGwoZG9jKSwgbV9pbXBsZW1lbnRhdGlvbih0Lm1f
aW1wbGVtZW50YXRpb24pCi0gICAgLCBtX25hbWUodC5tX25hbWUpLCBtX3B1YmxpY0lkKHQubV9w
dWJsaWNJZCksIG1fc3lzdGVtSWQodC5tX3N5c3RlbUlkKSwgbV9zdWJzZXQodC5tX3N1YnNldCkK
LXsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50VHlwZUltcGw6OnRvU3RyaW5nKCkgY29uc3QKLXsK
LSAgICBpZiAobV9uYW1lLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgRE9N
U3RyaW5nIHJlc3VsdCA9ICI8IURPQ1RZUEUgIjsKLSAgICByZXN1bHQgKz0gbV9uYW1lOwotICAg
IGlmICghbV9wdWJsaWNJZC5pc0VtcHR5KCkpIHsKLQlyZXN1bHQgKz0gIiBQVUJMSUMgXCIiOwot
CXJlc3VsdCArPSBtX3B1YmxpY0lkOwotCXJlc3VsdCArPSAiXCIgXCIiOwotCXJlc3VsdCArPSBt
X3N5c3RlbUlkOwotCXJlc3VsdCArPSAiXCIiOwotICAgIH0gZWxzZSBpZiAoIW1fc3lzdGVtSWQu
aXNFbXB0eSgpKSB7Ci0JcmVzdWx0ICs9ICIgU1lTVEVNIFwiIjsKLQlyZXN1bHQgKz0gbV9zeXN0
ZW1JZDsKLQlyZXN1bHQgKz0gIlwiIjsKLSAgICB9Ci0gICAgaWYgKCFtX3N1YnNldC5pc0VtcHR5
KCkpIHsKLQlyZXN1bHQgKz0gIiBbIjsKLQlyZXN1bHQgKz0gbV9zdWJzZXQ7Ci0JcmVzdWx0ICs9
ICJdIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9ICI+IjsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci1ET01TdHJpbmcgRG9jdW1lbnRUeXBlSW1wbDo6bm9kZU5hbWUoKSBjb25zdAotewotICAgIHJl
dHVybiBuYW1lKCk7Ci19Ci0KLXVuc2lnbmVkIHNob3J0IERvY3VtZW50VHlwZUltcGw6Om5vZGVU
eXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gTm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOwotfQot
Ci1Ob2RlSW1wbCAqRG9jdW1lbnRUeXBlSW1wbDo6Y2xvbmVOb2RlKGJvb2wgLypkZWVwKi8pCi17
Ci0gICAgLy8gVGhlIERPTSBMZXZlbCAyIHNwZWNpZmljYXRpb24gc2F5cyBjbG9uaW5nIERvY3Vt
ZW50VHlwZSBub2RlcyBpcyAiaW1wbGVtZW50YXRpb24gZGVwZW5kZW50IiBzbyBmb3Igbm93IHdl
IGRvIG5vdCBzdXBwb3J0IGl0LgotICAgIHJldHVybiAwOwotfQorfTsKXCBObyBuZXdsaW5lIGF0
IGVuZCBvZiBmaWxlCkluZGV4OiBraHRtbC94bWwvRG9jdW1lbnRUeXBlSW1wbC5oCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIGtodG1sL3htbC9Eb2N1bWVudFR5cGVJbXBsLmgJKHJldmlzaW9uIDEyMDE1KQorKysg
a2h0bWwveG1sL0RvY3VtZW50VHlwZUltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjIsODAyICsy
MiwxNCBAQAogICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKgogICovCi0jaWZuZGVm
IF9ET01fRG9jdW1lbnRJbXBsX2hfCi0jZGVmaW5lIF9ET01fRG9jdW1lbnRJbXBsX2hfCisjaWZu
ZGVmIERPTV9Eb2N1bWVudFR5cGVJbXBsX2gKKyNkZWZpbmUgRE9NX0RvY3VtZW50VHlwZUltcGxf
aAogCi0jaW5jbHVkZSAieG1sL2RvbV9lbGVtZW50aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20y
X3RyYXZlcnNhbGltcGwuaCIKLSNpbmNsdWRlICJtaXNjL3NoYXJlZC5oIgotCi0jaW5jbHVkZSA8
cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxcHRybGlzdC5oPgotI2luY2x1ZGUgPHFvYmplY3Qu
aD4KLSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1ZGUgPHFwdHJkaWN0Lmg+Ci0jaW5jbHVkZSA8
cW1hcC5oPgotI2luY2x1ZGUgPHFkYXRldGltZS5oPgotCi0jaW5jbHVkZSA8a3VybC5oPgotCi0j
aW5jbHVkZSAiS1dRU2lnbmFsLmgiCi0jaW5jbHVkZSAiZGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8
a3htbGNvcmUvSGFzaE1hcC5oPgotCi1jbGFzcyBRUGFpbnREZXZpY2U7Ci1jbGFzcyBRUGFpbnRE
ZXZpY2VNZXRyaWNzOwotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3MgRnJhbWU7Ci1jbGFzcyBSZW5k
ZXJBcmVuYTsKLQotY2xhc3MgS1dRQWNjT2JqZWN0Q2FjaGU7Ci0KLW5hbWVzcGFjZSBraHRtbCB7
Ci0gICAgY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsKLSAgICBzdHJ1Y3QgRGFzaGJvYXJkUmVnaW9u
VmFsdWU7Ci0gICAgY2xhc3MgRG9jTG9hZGVyOwotICAgIGNsYXNzIFJlbmRlckltYWdlOwotICAg
IGNsYXNzIFRva2VuaXplcjsKLSAgICBjbGFzcyBYTUxIYW5kbGVyOwotfQotCi0jaWZuZGVmIEtI
VE1MX05PX1hCTAotbmFtZXNwYWNlIFhCTCB7Ci0gICAgY2xhc3MgWEJMQmluZGluZ01hbmFnZXI7
Ci19Ci0jZW5kaWYKKyNpbmNsdWRlICJkb21fbm9kZWltcGwuaCIKIAogbmFtZXNwYWNlIERPTSB7
Ci0gICAgY2xhc3MgQWJzdHJhY3RWaWV3SW1wbDsKLSAgICBjbGFzcyBBdHRySW1wbDsKLSAgICBj
bGFzcyBDREFUQVNlY3Rpb25JbXBsOwotICAgIGNsYXNzIENTU1N0eWxlU2hlZXRJbXBsOwotICAg
IGNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLSAgICBjbGFzcyBDb21t
ZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1bWVudEZyYWdtZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1
bWVudEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRUeXBlOwotICAgIGNsYXNzIERvY3VtZW50VHlw
ZUltcGw7Ci0gICAgY2xhc3MgRWRpdGluZ1RleHRJbXBsOwotICAgIGNsYXNzIEVsZW1lbnRJbXBs
OwotICAgIGNsYXNzIEVudGl0eVJlZmVyZW5jZUltcGw7Ci0gICAgY2xhc3MgRXZlbnRJbXBsOwot
ICAgIGNsYXNzIEV2ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgR2VuZXJpY1JPTmFtZWROb2RlTWFw
SW1wbDsKLSAgICBjbGFzcyBIVE1MQ29sbGVjdGlvbkltcGw7Ci0gICAgY2xhc3MgSFRNTERvY3Vt
ZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MRWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSFRNTEZvcm1F
bGVtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MSW1hZ2VMb2FkZXI7Ci0gICAgY2xhc3MgSFRNTElu
cHV0RWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSFRNTE1hcEVsZW1lbnRJbXBsOwotICAgIGNsYXNz
IEpTRWRpdG9yOwotICAgIGNsYXNzIE5vZGVGaWx0ZXI7Ci0gICAgY2xhc3MgTm9kZUZpbHRlcklt
cGw7Ci0gICAgY2xhc3MgTm9kZUl0ZXJhdG9ySW1wbDsKLSAgICBjbGFzcyBOb2RlTGlzdEltcGw7
Ci0gICAgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDsKLSAgICBjbGFzcyBSYW5nZUlt
cGw7Ci0gICAgY2xhc3MgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgU3R5bGVT
aGVldEltcGw7Ci0gICAgY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsOwotICAgIGNsYXNzIFRleHRJ
bXBsOwotICAgIGNsYXNzIFRyZWVXYWxrZXJJbXBsOwotCi0gICAgLy8gQSByYW5nZSBvZiBhIG5v
ZGUgd2l0aGluIGEgZG9jdW1lbnQgdGhhdCBpcyAibWFya2VkIiwgc3VjaCBhcyBiZWluZyBtaXNz
cGVsbGVkCi0gICAgc3RydWN0IERvY3VtZW50TWFya2VyCi0gICAgewotICAgICAgICBlbnVtIE1h
cmtlclR5cGUgewotICAgICAgICAgICAgQWxsTWFya2VycyA9IC0xLAotICAgICAgICAgICAgU3Bl
bGxpbmcgPSAwCi0gICAgICAgICAgICAvLyBOb3QgZG9pbmcgZ3JhbW1hciB5ZXQsIGJ1dCB0aGlz
IGlzIGEgcGxhY2Vob2xkZXIgZm9yIGl0Ci0gICAgICAgICAgICAvLyBHcmFtbWFyCi0gICAgICAg
IH07Ci0gICAgICAgIAotICAgICAgICBlbnVtIE1hcmtlclR5cGUgdHlwZTsKLSAgICAgICAgdW5z
aWduZWQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLSAgICAgICAgCi0gICAgICAgIGJvb2wgb3Bl
cmF0b3IgPT0gKGNvbnN0IERvY3VtZW50TWFya2VyICZvKSBjb25zdCB7Ci0gICAgICAgICAgICBy
ZXR1cm4gdHlwZSA9PSBvLnR5cGUgJiYgc3RhcnRPZmZzZXQgPT0gby5zdGFydE9mZnNldCAmJiBl
bmRPZmZzZXQgPT0gby5lbmRPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBvcGVyYXRv
ciAhPSAoY29uc3QgRG9jdW1lbnRNYXJrZXIgJm8pIGNvbnN0IHsKLSAgICAgICAgICAgIHJldHVy
biAhKCp0aGlzID09IG8pOwotICAgICAgICB9Ci0gICAgfTsKLSAgICAKLWNsYXNzIERPTUltcGxl
bWVudGF0aW9uSW1wbCA6IHB1YmxpYyBraHRtbDo6U2hhcmVkPERPTUltcGxlbWVudGF0aW9uSW1w
bD4KLXsKLXB1YmxpYzoKLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwoKTsKLSAgICB+RE9NSW1w
bGVtZW50YXRpb25JbXBsKCk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9y
IERPTUltcGxlbWVudGF0aW9uCi0gICAgYm9vbCBoYXNGZWF0dXJlKGNvbnN0IERPTVN0cmluZyYg
ZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nJiB2ZXJzaW9uKSBjb25zdDsKLSAgICBEb2N1bWVudFR5
cGVJbXBsICpjcmVhdGVEb2N1bWVudFR5cGUoIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFt
ZSwgY29uc3QgRE9NU3RyaW5nICZwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQsIGludCAmZXhjZXB0aW9u
Y29kZSApOwotICAgIERvY3VtZW50SW1wbCAqY3JlYXRlRG9jdW1lbnQoIGNvbnN0IERPTVN0cmlu
ZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxpZmllZE5hbWUsCi0gICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBlSW1wbCAqZG9jdHlwZSwgaW50
ICZleGNlcHRpb25jb2RlICk7Ci0KLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwqIGdldEludGVy
ZmFjZShjb25zdCBET01TdHJpbmcmIGZlYXR1cmUpIGNvbnN0OwotCi0gICAgLy8gRnJvbSB0aGUg
RE9NSW1wbGVtZW50YXRpb25DU1MgaW50ZXJmYWNlCi0gICAgQ1NTU3R5bGVTaGVldEltcGwgKmNy
ZWF0ZUNTU1N0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICZ0aXRsZSwgY29uc3QgRE9NU3RyaW5n
ICZtZWRpYSwgaW50ICZleGNlcHRpb25jb2RlKTsKLQotICAgIC8vIEZyb20gdGhlIEhUTUxET01J
bXBsZW1lbnRhdGlvbiBpbnRlcmZhY2UKLSAgICBIVE1MRG9jdW1lbnRJbXBsKiBjcmVhdGVIVE1M
RG9jdW1lbnQoIGNvbnN0IERPTVN0cmluZyYgdGl0bGUpOwotCi0gICAgLy8gT3RoZXIgbWV0aG9k
cyAobm90IHBhcnQgb2YgRE9NKQotICAgIERvY3VtZW50SW1wbCAqY3JlYXRlRG9jdW1lbnQoIEtI
VE1MVmlldyAqdiA9IDAgKTsKLSAgICBIVE1MRG9jdW1lbnRJbXBsICpjcmVhdGVIVE1MRG9jdW1l
bnQoIEtIVE1MVmlldyAqdiA9IDAgKTsKLQotICAgIC8vIFJldHVybnMgdGhlIHN0YXRpYyBpbnN0
YW5jZSBvZiB0aGlzIGNsYXNzIC0gb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzaG91
bGQKLSAgICAvLyBldmVyIGJlIHByZXNlbnQsIGFuZCBpcyB1c2VkIGFzIGEgZmFjdG9yeSBtZXRo
b2QgZm9yIGNyZWF0aW5nIERvY3VtZW50SW1wbCBvYmplY3RzCi0gICAgc3RhdGljIERPTUltcGxl
bWVudGF0aW9uSW1wbCAqaW5zdGFuY2UoKTsKLSAgICAKLSAgICBzdGF0aWMgYm9vbCBpc1hNTE1J
TUVUeXBlKGNvbnN0IERPTVN0cmluZyYgbWltZVR5cGUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgc3Rh
dGljIERPTUltcGxlbWVudGF0aW9uSW1wbCAqbV9pbnN0YW5jZTsKLX07Ci0KLQotLyoqCi0gKiBA
aW50ZXJuYWwKLSAqLwotY2xhc3MgRG9jdW1lbnRJbXBsIDogcHVibGljIFFPYmplY3QsIHB1Ymxp
YyBDb250YWluZXJOb2RlSW1wbAotewotICAgIFFfT0JKRUNUCi1wdWJsaWM6Ci0gICAgRG9jdW1l
bnRJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqX2ltcGxlbWVudGF0aW9uLCBLSFRNTFZpZXcg
KnYpOwotICAgIH5Eb2N1bWVudEltcGwoKTsKLQotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVkTGFz
dFJlZigpOwotCi0gICAgLy8gTm9kZXMgYmVsb25naW5nIHRvIHRoaXMgZG9jdW1lbnQgaG9sZCAi
c2VsZi1vbmx5IiByZWZlcmVuY2VzIC0KLSAgICAvLyB0aGVzZSBhcmUgZW5vdWdoIHRvIGtlZXAg
dGhlIGRvY3VtZW50IGZyb20gYmVpbmcgZGVzdHJveWVkLCBidXQKLSAgICAvLyBub3QgZW5vdWdo
IHRvIGtlZXAgaXQgZnJvbSByZW1vdmluZyBpdHMgY2hpbGRyZW4uIFRoaXMgYWxsb3dzIGEKLSAg
ICAvLyBub2RlIHRoYXQgb3V0bGl2ZXMgaXRzIGRvY3VtZW50IHRvIHN0aWxsIGhhdmUgYSB2YWxp
ZCBkb2N1bWVudAotICAgIC8vIHBvaW50ZXIgd2l0aG91dCBpbnRyb2R1Y2luZyByZWZlcmVuY2Ug
Y3ljbGVzCi0KLSAgICB2b2lkIHNlbGZPbmx5UmVmKCkgeyArK21fc2VsZk9ubHlSZWZDb3VudDsg
fQotICAgIHZvaWQgc2VsZk9ubHlEZXJlZigpIHsKLSAgICAgICAgLS1tX3NlbGZPbmx5UmVmQ291
bnQ7Ci0gICAgICAgIGlmICghbV9zZWxmT25seVJlZkNvdW50ICYmICFyZWZDb3VudCgpKQotICAg
ICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotCi0gICAgLy8gRE9NIG1ldGhvZHMgJiBhdHRy
aWJ1dGVzIGZvciBEb2N1bWVudAotCi0gICAgdmlydHVhbCBEb2N1bWVudFR5cGVJbXBsICpkb2N0
eXBlKCkgY29uc3Q7IC8vIHJldHVybnMgMCBmb3IgSFRNTCBkb2N1bWVudHMKLSAgICBEb2N1bWVu
dFR5cGVJbXBsICpyZWFsRG9jVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZG9jVHlwZS5nZXQoKTsg
fQotCi0gICAgRE9NSW1wbGVtZW50YXRpb25JbXBsICppbXBsZW1lbnRhdGlvbigpIGNvbnN0Owot
ICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmRvY3VtZW50RWxlbWVudCgpIGNvbnN0OwotICAgIHZp
cnR1YWwgRWxlbWVudEltcGwgKmNyZWF0ZUVsZW1lbnQoY29uc3QgRE9NU3RyaW5nICZ0YWdOYW1l
LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIERvY3VtZW50RnJhZ21lbnRJbXBsICpjcmVhdGVE
b2N1bWVudEZyYWdtZW50ICgpOwotICAgIFRleHRJbXBsICpjcmVhdGVUZXh0Tm9kZSAoIGNvbnN0
IERPTVN0cmluZyAmZGF0YSApOwotICAgIENvbW1lbnRJbXBsICpjcmVhdGVDb21tZW50ICggY29u
c3QgRE9NU3RyaW5nICZkYXRhICk7Ci0gICAgQ0RBVEFTZWN0aW9uSW1wbCAqY3JlYXRlQ0RBVEFT
ZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24pOwotICAgIFByb2Nl
c3NpbmdJbnN0cnVjdGlvbkltcGwgKmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihjb25zdCBE
T01TdHJpbmcgJnRhcmdldCwgY29uc3QgRE9NU3RyaW5nICZkYXRhLCBpbnQgJmV4Y2VwdGlvbik7
Ci0gICAgQXR0ckltcGwgKmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBET01TdHJpbmcgJm5hbWUsIGlu
dCAmZXhjZXB0aW9uKSB7IHJldHVybiBjcmVhdGVBdHRyaWJ1dGVOUyhET01TdHJpbmcoKSwgbmFt
ZSwgZXhjZXB0aW9uKTsgfQotICAgIEF0dHJJbXBsICpjcmVhdGVBdHRyaWJ1dGVOUyhjb25zdCBE
T01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBp
bnQgJmV4Y2VwdGlvbik7Ci0gICAgRW50aXR5UmVmZXJlbmNlSW1wbCAqY3JlYXRlRW50aXR5UmVm
ZXJlbmNlKGNvbnN0IERPTVN0cmluZyAmbmFtZSwgaW50ICZleGNlcHRpb25Db2RlKTsKLSAgICBO
b2RlSW1wbCAqaW1wb3J0Tm9kZSggTm9kZUltcGwgKmltcG9ydGVkTm9kZSwgYm9vbCBkZWVwLCBp
bnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIEVsZW1lbnRJbXBsICpjcmVhdGVFbGVt
ZW50TlMoY29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJl9x
dWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIEVsZW1lbnRJbXBsICpnZXRF
bGVtZW50QnlJZCAoIGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkICkgY29uc3Q7Ci0gICAgRWxl
bWVudEltcGwgKmVsZW1lbnRGcm9tUG9pbnQgKCBjb25zdCBpbnQgX3gsIGNvbnN0IGludCBfeSAp
IGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmFkb3B0Tm9kZShOb2RlSW1wbCAqc291cmNlLCBpbnQg
JmV4Y2VwdGlvbmNvZGUpOwotICAgIAotICAgIFJlZlB0cjxOYW1lTm9kZUxpc3RJbXBsPiBnZXRF
bGVtZW50c0J5TmFtZShjb25zdCBET01TdHJpbmcgJmVsZW1lbnROYW1lKTsKLQotICAgIC8vIEFj
dHVhbGx5IHBhcnQgb2YgSFRNTERvY3VtZW50LCBidXQgdXNlZCBmb3IgZ2l2aW5nIFhNTCBkb2N1
bWVudHMgYSB3aW5kb3cgdGl0bGUgYXMgd2VsbAotICAgIERPTVN0cmluZyB0aXRsZSgpIGNvbnN0
IHsgcmV0dXJuIG1fdGl0bGU7IH0KLSAgICB2b2lkIHNldFRpdGxlKERPTVN0cmluZywgTm9kZUlt
cGwgKnRpdGxlRWxlbWVudCA9IDApOwotICAgIHZvaWQgcmVtb3ZlVGl0bGUoTm9kZUltcGwgKnRp
dGxlRWxlbWVudCk7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBpbWFnZXMoKTsK
LSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBlbWJlZHMoKTsKLSAgICBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPiBhcHBsZXRzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1w
bD4gbGlua3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBmb3JtcygpOwotICAg
IFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGFuY2hvcnMoKTsKLSAgICBSZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPiBhbGwoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBvYmpl
Y3RzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4gd2luZG93TmFtZWRJdGVtcyhE
T01TdHJpbmcgJm5hbWUpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGRvY3VtZW50
TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpOwotCi0gICAgLy8gRE9NIG1ldGhvZHMgb3ZlcnJp
ZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotCi0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5h
bWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7
Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBi
b29sIGlzRG9jdW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIHZpcnR1YWwg
Ym9vbCBpc0hUTUxEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSAgICBraHRt
bDo6Q1NTU3R5bGVTZWxlY3RvciAqc3R5bGVTZWxlY3RvcigpIHsgcmV0dXJuIG1fc3R5bGVTZWxl
Y3RvcjsgfQotCi0gICAgRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5QWNj
ZXNzS2V5KCBjb25zdCBET01TdHJpbmcgJmtleSApOwotICAgIAotICAgIC8qKgotICAgICAqIFVw
ZGF0ZXMgdGhlIHBlbmRpbmcgc2hlZXQgY291bnQgYW5kIHRoZW4gY2FsbHMgdXBkYXRlU3R5bGVT
ZWxlY3Rvci4KLSAgICAgKi8KLSAgICB2b2lkIHN0eWxlc2hlZXRMb2FkZWQoKTsKLQotICAgIC8q
KgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBhbGwgdG9wLWxldmVsIHN0eWxl
c2hlZXRzIGhhdmUgbG9hZGVkIChpbmNsdWRpbmcKLSAgICAgKiBhbnkgQGltcG9ydHMgdGhhdCB0
aGV5IG1heSBiZSBsb2FkaW5nKS4KLSAgICAgKi8KLSAgICBib29sIGhhdmVTdHlsZXNoZWV0c0xv
YWRlZCgpIHsgcmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9IDAgfHwgbV9pZ25vcmVQZW5k
aW5nU3R5bGVzaGVldHM7IH0KLQotICAgIC8qKgotICAgICAqIEluY3JlbWVudHMgdGhlIG51bWJl
ciBvZiBwZW5kaW5nIHNoZWV0cy4gIFRoZSA8bGluaz4gZWxlbWVudHMKLSAgICAgKiBpbnZva2Ug
dGhpcyB0byBhZGQgdGhlbXNlbHZlcyB0byB0aGUgbG9hZGluZyBsaXN0LgotICAgICAqLwotICAg
IHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHlsZXNoZWV0cysrOyB9Ci0KLSAg
ICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBzdHlsZXNoZWV0cyBpbiB0aGUg
ZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCBvciBjaGFuZ2VkLgotICAgICAq
Ci0gICAgICogQ3JlYXRlcyBhIG5ldyBzdHlsZSBzZWxlY3RvciBhbmQgYXNzaWduIGl0IHRvIHRo
aXMgZG9jdW1lbnQuIFRoaXMgaXMgZG9uZSBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgbm9kZXMg
aW4KLSAgICAgKiBkb2N1bWVudCAob3IgdGhvc2UgYmVmb3JlIDxCT0RZPiBpbiBhIEhUTUwgZG9j
dW1lbnQpLCBzZWFyY2hpbmcgZm9yIHN0eWxlc2hlZXRzLiBTdHlsZXNoZWV0cyBjYW4gYmUgY29u
dGFpbmVkIGluCi0gICAgICogPExJTks+LCA8U1RZTEU+IG9yIDxCT0RZPiBlbGVtZW50cywgYXMg
d2VsbCBhcyBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAoWE1MIGRvY3VtZW50cyBvbmx5KS4gQSBs
aXN0IGlzCi0gICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGVzZSB3aGljaCBpcyB1c2VkIHRvIGNy
ZWF0ZSB0aGUgYSBuZXcgc3R5bGUgc2VsZWN0b3Igd2hpY2ggY29sbGF0ZXMgYWxsIG9mIHRoZSBz
dHlsZXNoZWV0cwotICAgICAqIGZvdW5kIGFuZCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZGVy
aXZlZCBzdHlsZXMgZm9yIGFsbCByZW5kZXJpbmcgb2JqZWN0cy4KLSAgICAgKi8KLSAgICB2b2lk
IHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLQotICAgIHZvaWQgcmVjYWxjU3R5bGVTZWxlY3Rvcigp
OwotCi0gICAgYm9vbCB1c2VzRGVzY2VuZGFudFJ1bGVzKCkgeyByZXR1cm4gbV91c2VzRGVzY2Vu
ZGFudFJ1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzRGVzY2VuZGFudFJ1bGVzKGJvb2wgYikgeyBt
X3VzZXNEZXNjZW5kYW50UnVsZXMgPSBiOyB9Ci0gICAgYm9vbCB1c2VzU2libGluZ1J1bGVzKCkg
eyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzU2libGluZ1J1
bGVzKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5nUnVsZXMgPSBiOyB9XAotCi0gICAgUVN0cmluZyBu
ZXh0U3RhdGUoKTsKLQotICAgIC8vIFF1ZXJ5IGFsbCByZWdpc3RlcmVkIGVsZW1lbnRzIGZvciB0
aGVpciBzdGF0ZQotICAgIFFTdHJpbmdMaXN0IGRvY1N0YXRlKCk7Ci0gICAgdm9pZCByZWdpc3Rl
ck1haW50YWluc1N0YXRlKE5vZGVJbXBsKiBlKSB7IG1fbWFpbnRhaW5zU3RhdGUuYXBwZW5kKGUp
OyB9Ci0gICAgdm9pZCBkZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUoTm9kZUltcGwqIGUpIHsgbV9t
YWludGFpbnNTdGF0ZS5yZW1vdmVSZWYoZSk7IH0KLQotICAgIC8vIFNldCB0aGUgc3RhdGUgdGhl
IGRvY3VtZW50IHNob3VsZCByZXN0b3JlIHRvCi0gICAgdm9pZCBzZXRSZXN0b3JlU3RhdGUoIGNv
bnN0IFFTdHJpbmdMaXN0ICZzKSB7IG1fc3RhdGUgPSBzOyB9Ci0gICAgUVN0cmluZ0xpc3QgJnJl
c3RvcmVTdGF0ZSggKSB7IHJldHVybiBtX3N0YXRlOyB9Ci0KLSAgICBLSFRNTFZpZXcgKnZpZXco
KSBjb25zdCB7IHJldHVybiBtX3ZpZXc7IH0KLSAgICBGcmFtZSAqZnJhbWUoKSBjb25zdDsKLQot
ICAgIFJhbmdlSW1wbCAqY3JlYXRlUmFuZ2UoKTsKLQotICAgIE5vZGVJdGVyYXRvckltcGwgKmNy
ZWF0ZU5vZGVJdGVyYXRvcihOb2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hhdFRvU2hvdywKLSAg
ICAgICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlSZWZlcmVuY2Vz
LCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0gICAgVHJlZVdhbGtlckltcGwgKmNyZWF0ZVRyZWVX
YWxrZXIoTm9kZUltcGwgKnJvb3QsIHVuc2lnbmVkIHdoYXRUb1Nob3csIAotICAgICAgICBOb2Rl
RmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAmZXhj
ZXB0aW9uY29kZSk7Ci0KLSAgICAvLyBTcGVjaWFsIHN1cHBvcnQgZm9yIGVkaXRpbmcKLSAgICBD
U1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotICAg
IEVkaXRpbmdUZXh0SW1wbCAqY3JlYXRlRWRpdGluZ1RleHROb2RlKGNvbnN0IERPTVN0cmluZyAm
dGV4dCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUoIFN0eWxlQ2hhbmdlID0gTm9D
aGFuZ2UgKTsKLSAgICBzdGF0aWMgUVB0ckxpc3Q8RG9jdW1lbnRJbXBsPiAqIGNoYW5nZWREb2N1
bWVudHM7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVJlbmRlcmluZygpOwotICAgIHZvaWQgdXBk
YXRlTGF5b3V0KCk7Ci0gICAgdm9pZCB1cGRhdGVMYXlvdXRJZ25vcmVQZW5kaW5nU3R5bGVzaGVl
dHMoKTsKLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKTsKLSAgICBr
aHRtbDo6RG9jTG9hZGVyICpkb2NMb2FkZXIoKSB7IHJldHVybiBtX2RvY0xvYWRlcjsgfQotCi0g
ICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKLQot
ICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSgpIHsgcmV0dXJuIG1fcmVuZGVyQXJlbmE7IH0K
LQotICAgIEtXUUFjY09iamVjdENhY2hlKiBnZXRBY2NPYmplY3RDYWNoZSgpOwotICAgIAotICAg
IC8vIHRvIGdldCB2aXN1YWxseSBvcmRlcmVkIGhlYnJldyBhbmQgYXJhYmljIHBhZ2VzIHJpZ2h0
Ci0gICAgdm9pZCBzZXRWaXN1YWxseU9yZGVyZWQoKTsKLQotICAgIHZvaWQgdXBkYXRlU2VsZWN0
aW9uKCk7Ci0gICAgCi0gICAgdm9pZCBvcGVuKCk7Ci0gICAgdm9pZCBpbXBsaWNpdE9wZW4oKTsK
LSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBpbXBsaWNpdENsb3NlKCk7Ci0gICAgdm9pZCB3
cml0ZSAoIGNvbnN0IERPTVN0cmluZyAmdGV4dCApOwotICAgIHZvaWQgd3JpdGUgKCBjb25zdCBR
U3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCB3cml0ZWxuICggY29uc3QgRE9NU3RyaW5nICZ0ZXh0
ICk7Ci0gICAgdm9pZCBmaW5pc2hQYXJzaW5nICggICk7Ci0gICAgdm9pZCBjbGVhcigpOwotCi0g
ICAgUVN0cmluZyBVUkwoKSBjb25zdCB7IHJldHVybiBtX3VybC5pc0VtcHR5KCkgPyAiYWJvdXQ6
YmxhbmsiIDogbV91cmw7IH0KLSAgICB2b2lkIHNldFVSTChjb25zdCBRU3RyaW5nJiB1cmwpOwot
Ci0gICAgUVN0cmluZyBiYXNlVVJMKCkgY29uc3QgeyByZXR1cm4gbV9iYXNlVVJMLmlzRW1wdHko
KSA/IFVSTCgpIDogbV9iYXNlVVJMOyB9Ci0gICAgdm9pZCBzZXRCYXNlVVJMKGNvbnN0IFFTdHJp
bmcmIGJhc2VVUkwpIHsgbV9iYXNlVVJMID0gYmFzZVVSTDsgfQotCi0gICAgUVN0cmluZyBiYXNl
VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlVGFyZ2V0OyB9Ci0gICAgdm9pZCBzZXRCYXNl
VGFyZ2V0KGNvbnN0IFFTdHJpbmcmIGJhc2VUYXJnZXQpIHsgbV9iYXNlVGFyZ2V0ID0gYmFzZVRh
cmdldDsgfQotCi0gICAgUVN0cmluZyBjb21wbGV0ZVVSTChjb25zdCBRU3RyaW5nICYpOwotICAg
IERPTVN0cmluZyBjb21wbGV0ZVVSTChjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBmcm9t
IGNhY2hlZE9iamVjdENsaWVudAotICAgIHZpcnR1YWwgdm9pZCBzZXRTdHlsZVNoZWV0KGNvbnN0
IERPTVN0cmluZyAmdXJsLCBjb25zdCBET01TdHJpbmcgJnNoZWV0U3RyKTsKLSAgICB2b2lkIHNl
dFVzZXJTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcmIHNoZWV0KTsKLSAgICBRU3RyaW5nIHVzZXJT
dHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV91c2Vyc2hlZXQ7IH0KLSAgICB2b2lkIHNldFBy
aW50U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJiBzaGVldCkgeyBtX3ByaW50U2hlZXQgPSBzaGVl
dDsgfQotICAgIFFTdHJpbmcgcHJpbnRTdHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV9wcmlu
dFNoZWV0OyB9Ci0KLSAgICBDU1NTdHlsZVNoZWV0SW1wbCogZWxlbWVudFNoZWV0KCk7Ci0gICAg
dmlydHVhbCBraHRtbDo6VG9rZW5pemVyICpjcmVhdGVUb2tlbml6ZXIoKTsKLSAgICBraHRtbDo6
VG9rZW5pemVyICp0b2tlbml6ZXIoKSB7IHJldHVybiBtX3Rva2VuaXplcjsgfQotICAgIAotICAg
IFFQYWludERldmljZU1ldHJpY3MgKnBhaW50RGV2aWNlTWV0cmljcygpIHsgcmV0dXJuIG1fcGFp
bnREZXZpY2VNZXRyaWNzOyB9Ci0gICAgUVBhaW50RGV2aWNlICpwYWludERldmljZSgpIGNvbnN0
IHsgcmV0dXJuIG1fcGFpbnREZXZpY2U7IH0KLSAgICB2b2lkIHNldFBhaW50RGV2aWNlKCBRUGFp
bnREZXZpY2UgKmRldiApOwotCi0gICAgZW51bSBIVE1MTW9kZSB7Ci0gICAgICAgIEh0bWwzLAot
ICAgICAgICBIdG1sNCwKLSAgICAgICAgWEh0bWwKLSAgICB9OwotCi0gICAgZW51bSBQYXJzZU1v
ZGUgewotICAgICAgICBDb21wYXQsCi0gICAgICAgIEFsbW9zdFN0cmljdCwKLSAgICAgICAgU3Ry
aWN0Ci0gICAgfTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZGV0ZXJtaW5lUGFyc2VNb2RlKCBj
b25zdCBRU3RyaW5nICZzdHIgKTsKLSAgICB2b2lkIHNldFBhcnNlTW9kZSggUGFyc2VNb2RlIG0g
KSB7IHBNb2RlID0gbTsgfQotICAgIFBhcnNlTW9kZSBwYXJzZU1vZGUoKSBjb25zdCB7IHJldHVy
biBwTW9kZTsgfQotCi0gICAgYm9vbCBpbkNvbXBhdE1vZGUoKSB7IHJldHVybiBwTW9kZSA9PSBD
b21wYXQ7IH0KLSAgICBib29sIGluQWxtb3N0U3RyaWN0TW9kZSgpIHsgcmV0dXJuIHBNb2RlID09
IEFsbW9zdFN0cmljdDsgfQotICAgIGJvb2wgaW5TdHJpY3RNb2RlKCkgeyByZXR1cm4gcE1vZGUg
PT0gU3RyaWN0OyB9Ci0gICAgCi0gICAgdm9pZCBzZXRIVE1MTW9kZSggSFRNTE1vZGUgbSApIHsg
aE1vZGUgPSBtOyB9Ci0gICAgSFRNTE1vZGUgaHRtbE1vZGUoKSBjb25zdCB7IHJldHVybiBoTW9k
ZTsgfQotCi0gICAgdm9pZCBzZXRQYXJzaW5nKGJvb2wgYik7Ci0gICAgYm9vbCBwYXJzaW5nKCkg
Y29uc3QgeyByZXR1cm4gbV9iUGFyc2luZzsgfQotICAgIGludCBtaW5pbXVtTGF5b3V0RGVsYXko
KTsKLSAgICBib29sIHNob3VsZFNjaGVkdWxlTGF5b3V0KCk7Ci0gICAgaW50IGVsYXBzZWRUaW1l
KCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRUZXh0Q29sb3IoIFFDb2xvciBjb2xvciApIHsg
bV90ZXh0Q29sb3IgPSBjb2xvcjsgfQotICAgIFFDb2xvciB0ZXh0Q29sb3IoKSBjb25zdCB7IHJl
dHVybiBtX3RleHRDb2xvcjsgfQotCi0gICAgY29uc3QgUUNvbG9yJiBsaW5rQ29sb3IoKSBjb25z
dCB7IHJldHVybiBtX2xpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFDb2xvciYgdmlzaXRlZExpbmtD
b2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaXRlZExpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFD
b2xvciYgYWN0aXZlTGlua0NvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9hY3RpdmVMaW5rQ29sb3I7
IH0KLSAgICB2b2lkIHNldExpbmtDb2xvcihjb25zdCBRQ29sb3ImIGMpIHsgbV9saW5rQ29sb3Ig
PSBjOyB9Ci0gICAgdm9pZCBzZXRWaXNpdGVkTGlua0NvbG9yKGNvbnN0IFFDb2xvciYgYykgeyBt
X3Zpc2l0ZWRMaW5rQ29sb3IgPSBjOyB9Ci0gICAgdm9pZCBzZXRBY3RpdmVMaW5rQ29sb3IoY29u
c3QgUUNvbG9yJiBjKSB7IG1fYWN0aXZlTGlua0NvbG9yID0gYzsgfQotICAgIHZvaWQgcmVzZXRM
aW5rQ29sb3IoKTsKLSAgICB2b2lkIHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHZvaWQg
cmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAgICAKLSAgICBib29sIHByZXBhcmVNb3VzZUV2ZW50
KGJvb2wgcmVhZG9ubHksIGludCB4LCBpbnQgeSwgTW91c2VFdmVudCogZXYpOwotICAgIGJvb2wg
cHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFkb25seSwgYm9vbCBhY3RpdmUsIGludCB4LCBpbnQg
eSwgTW91c2VFdmVudCAqZXYpOwotCi0gICAgdmlydHVhbCBib29sIGNoaWxkQWxsb3dlZCggTm9k
ZUltcGwgKm5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCBib29sIGNoaWxkVHlwZUFsbG93ZWQoIHVu
c2lnbmVkIHNob3J0IG5vZGVUeXBlICk7Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2Rl
ICggYm9vbCBkZWVwICk7Ci0KLSAgICBTdHlsZVNoZWV0TGlzdEltcGwqIHN0eWxlU2hlZXRzKCk7
Ci0KLSAgICAvKiBOZXdseSBwcm9wb3NlZCBDU1MzIG1lY2hhbmlzbSBmb3Igc2VsZWN0aW5nIGFs
dGVybmF0ZQotICAgICAgIHN0eWxlc2hlZXRzIHVzaW5nIHRoZSBET00uIE1heSBiZSBzdWJqZWN0
IHRvIGNoYW5nZSBhcwotICAgICAgIHNwZWMgbWF0dXJlcy4gLSBkd2gKLSAgICAqLwotICAgIERP
TVN0cmluZyBwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KCk7Ci0gICAgRE9NU3RyaW5nIHNlbGVjdGVk
U3R5bGVzaGVldFNldCgpOwotICAgIHZvaWQgc2V0U2VsZWN0ZWRTdHlsZXNoZWV0U2V0KGNvbnN0
IERPTVN0cmluZyYgYVN0cmluZyk7Ci0KLSAgICBRU3RyaW5nTGlzdCBhdmFpbGFibGVTdHlsZVNo
ZWV0cygpIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmZvY3VzTm9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZm9jdXNOb2RlLmdldCgpOyB9Ci0gICAgYm9vbCBzZXRGb2N1c05vZGUoTm9kZUltcGwgKm5l
d0ZvY3VzTm9kZSk7Ci0gICAgdm9pZCBjbGVhclNlbGVjdGlvbklmTmVlZGVkKE5vZGVJbXBsICpu
ZXdGb2N1c05vZGUpOwotCi0gICAgTm9kZUltcGwgKmhvdmVyTm9kZSgpIGNvbnN0IHsgcmV0dXJu
IG1faG92ZXJOb2RlLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRIb3Zlck5vZGUoTm9kZUltcGwgKm5l
d0hvdmVyTm9kZSk7Ci0gICAgCi0gICAgTm9kZUltcGwgKmFjdGl2ZU5vZGUoKSBjb25zdCB7IHJl
dHVybiBtX2FjdGl2ZU5vZGUuZ2V0KCk7IH0KLSAgICB2b2lkIHNldEFjdGl2ZU5vZGUoTm9kZUlt
cGwgKm5ld0FjdGl2ZU5vZGUpOwotCi0gICAgLy8gVXBkYXRlcyBmb3IgOnRhcmdldCAoQ1NTMyBz
ZWxlY3RvcikuCi0gICAgdm9pZCBzZXRDU1NUYXJnZXQoTm9kZUltcGwqIG4pOwotICAgIE5vZGVJ
bXBsKiBnZXRDU1NUYXJnZXQoKTsKLSAgICAKLSAgICB2b2lkIHNldERvY3VtZW50Q2hhbmdlZChi
b29sKTsKLQotICAgIHZvaWQgYXR0YWNoTm9kZUl0ZXJhdG9yKE5vZGVJdGVyYXRvckltcGwgKm5p
KTsKLSAgICB2b2lkIGRldGFjaE5vZGVJdGVyYXRvcihOb2RlSXRlcmF0b3JJbXBsICpuaSk7Ci0g
ICAgdm9pZCBub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChOb2RlSW1wbCAqbik7Ci0gICAgQWJzdHJh
Y3RWaWV3SW1wbCAqZGVmYXVsdFZpZXcoKSBjb25zdDsKLSAgICBFdmVudEltcGwgKmNyZWF0ZUV2
ZW50KGNvbnN0IERPTVN0cmluZyAmZXZlbnRUeXBlLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0g
ICAgLy8ga2VlcCB0cmFjayBvZiB3aGF0IHR5cGVzIG9mIGV2ZW50IGxpc3RlbmVycyBhcmUgcmVn
aXN0ZXJlZCwgc28gd2UgZG9uJ3QKLSAgICAvLyBkaXNwYXRjaCBldmVudHMgdW5uZWNlc3Nhcmls
eQotICAgIGVudW0gTGlzdGVuZXJUeXBlIHsKLSAgICAgICAgRE9NU1VCVFJFRU1PRElGSUVEX0xJ
U1RFTkVSICAgICAgICAgID0gMHgwMSwKLSAgICAgICAgRE9NTk9ERUlOU0VSVEVEX0xJU1RFTkVS
ICAgICAgICAgICAgID0gMHgwMiwKLSAgICAgICAgRE9NTk9ERVJFTU9WRURfTElTVEVORVIgICAg
ICAgICAgICAgID0gMHgwNCwKLSAgICAgICAgRE9NTk9ERVJFTU9WRURGUk9NRE9DVU1FTlRfTElT
VEVORVIgID0gMHgwOCwKLSAgICAgICAgRE9NTk9ERUlOU0VSVEVESU5UT0RPQ1VNRU5UX0xJU1RF
TkVSID0gMHgxMCwKLSAgICAgICAgRE9NQVRUUk1PRElGSUVEX0xJU1RFTkVSICAgICAgICAgICAg
ID0gMHgyMCwKLSAgICAgICAgRE9NQ0hBUkFDVEVSREFUQU1PRElGSUVEX0xJU1RFTkVSICAgID0g
MHg0MAotICAgIH07Ci0KLSAgICBib29sIGhhc0xpc3RlbmVyVHlwZShMaXN0ZW5lclR5cGUgbGlz
dGVuZXJUeXBlKSBjb25zdCB7IHJldHVybiAobV9saXN0ZW5lclR5cGVzICYgbGlzdGVuZXJUeXBl
KTsgfQotICAgIHZvaWQgYWRkTGlzdGVuZXJUeXBlKExpc3RlbmVyVHlwZSBsaXN0ZW5lclR5cGUp
IHsgbV9saXN0ZW5lclR5cGVzID0gbV9saXN0ZW5lclR5cGVzIHwgbGlzdGVuZXJUeXBlOyB9Ci0K
LSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50SW1w
bCAqZWx0LCBjb25zdCBET01TdHJpbmcgJnBzZXVkb0VsdCk7Ci0KLSAgICB0eXBlZGVmIFFNYXA8
UVN0cmluZywgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCo+IExvY2FsU3R5bGVSZWZzOwotICAg
IExvY2FsU3R5bGVSZWZzKiBsb2NhbFN0eWxlUmVmcygpIHsgcmV0dXJuICZtX2xvY2FsU3R5bGVS
ZWZzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50SGFuZGxlcihFdmVudEltcGwg
KmV2dCk7Ci0gICAgdm9pZCBzZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNT
dHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIpOwotICAgIEV2ZW50TGlz
dGVuZXIgKmdldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZl
bnRUeXBlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0
b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLQotICAgIHZvaWQgc2V0SFRNTFdpbmRvd0V2ZW50TGlz
dGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEF0dHJpYnV0ZUltcGwqKTsKLQot
ICAgIHZvaWQgYWRkV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50
VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNlQ2FwdHVyZSk7Ci0gICAgdm9p
ZCByZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBl
LCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0dXJlKTsKLSAgICBib29sIGhh
c1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpOwotCi0g
ICAgRXZlbnRMaXN0ZW5lciAqY3JlYXRlSFRNTEV2ZW50TGlzdGVuZXIoY29uc3QgRE9NU3RyaW5n
JiBjb2RlLCBOb2RlSW1wbCopOwotICAgIAotICAgIC8qKgotICAgICAqIFNlYXJjaGVzIHRocm91
Z2ggdGhlIGRvY3VtZW50LCBzdGFydGluZyBmcm9tIGZyb21Ob2RlLCBmb3IgdGhlIG5leHQgc2Vs
ZWN0YWJsZSBlbGVtZW50IHRoYXQgY29tZXMgYWZ0ZXIgZnJvbU5vZGUuCi0gICAgICogVGhlIG9y
ZGVyIGZvbGxvd2VkIGlzIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9uIDE3LjExLjEgb2YgdGhlIEhU
TUw0IHNwZWMsIHdoaWNoIGlzIGVsZW1lbnRzIHdpdGggdGFiIGluZGV4ZXMKLSAgICAgKiBmaXJz
dCAoZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCksIGFuZCB0aGVuIGVsZW1lbnRzIHdpdGhvdXQgdGFi
IGluZGV4ZXMgKGluIGRvY3VtZW50IG9yZGVyKS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmcm9t
Tm9kZSBUaGUgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJjaGluZy4gVGhlIG5vZGUgYWZ0
ZXIgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgotICAgICAqCi0gICAgICogQHJl
dHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGFmdGVyIGZyb21Ob2RlCi0gICAgICoKLSAg
ICAgKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50ZXJhY3QvZm9ybXMuaHRtbCNo
LTE3LjExLjEKLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqbmV4dEZvY3VzTm9kZShOb2RlSW1wbCAq
ZnJvbU5vZGUpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMgdGhyb3VnaCB0aGUgZG9jdW1l
bnQsIHN0YXJ0aW5nIGZyb20gZnJvbU5vZGUsIGZvciB0aGUgcHJldmlvdXMgc2VsZWN0YWJsZSBl
bGVtZW50ICh0aGF0IGNvbWVzIF9iZWZvcmVfKQotICAgICAqIGZyb21Ob2RlLiBUaGUgb3JkZXIg
Zm9sbG93ZWQgaXMgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gMTcuMTEuMSBvZiB0aGUgSFRNTDQg
c3BlYywgd2hpY2ggaXMgZWxlbWVudHMgd2l0aCB0YWIKLSAgICAgKiBpbmRleGVzIGZpcnN0IChm
cm9tIGxvd2VzdCB0byBoaWdoZXN0KSwgYW5kIHRoZW4gZWxlbWVudHMgd2l0aG91dCB0YWIgaW5k
ZXhlcyAoaW4gZG9jdW1lbnQgb3JkZXIpLgotICAgICAqCi0gICAgICogQHBhcmFtIGZyb21Ob2Rl
IFRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgc2VhcmNoaW5nLiBUaGUgbm9kZSBiZWZvcmUg
dGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgotICAgICAqCi0gICAgICogQHJldHVy
biBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSBmcm9tTm9kZQotICAgICAqCi0gICAg
ICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVyYWN0L2Zvcm1zLmh0bWwjaC0x
Ny4xMS4xCi0gICAgICovCi0gICAgTm9kZUltcGwgKnByZXZpb3VzRm9jdXNOb2RlKE5vZGVJbXBs
ICpmcm9tTm9kZSk7Ci0KLSAgICBpbnQgbm9kZUFic0luZGV4KE5vZGVJbXBsICpub2RlKTsKLSAg
ICBOb2RlSW1wbCAqbm9kZVdpdGhBYnNJbmRleChpbnQgYWJzSW5kZXgpOwotCi0gICAgLyoqCi0g
ICAgICogSGFuZGxlcyBhIEhUVFAgaGVhZGVyIGVxdWl2YWxlbnQgc2V0IGJ5IGEgbWV0YSB0YWcg
dXNpbmcgPG1ldGEgaHR0cC1lcXVpdj0iLi4uIiBjb250ZW50PSIuLi4iPi4gVGhpcyBpcyBjYWxs
ZWQKLSAgICAgKiB3aGVuIGEgbWV0YSB0YWcgaXMgZW5jb3VudGVyZWQgZHVyaW5nIGRvY3VtZW50
IHBhcnNpbmcsIGFuZCBhbHNvIHdoZW4gYSBzY3JpcHQgZHluYW1pY2FsbHkgY2hhbmdlcyBvciBh
ZGRzIGEgbWV0YQotICAgICAqIHRhZy4gVGhpcyBlbmFibGVzIHNjcmlwdHMgdG8gdXNlIG1ldGEg
dGFncyB0byBwZXJmb3JtIHJlZnJlc2hlcyBhbmQgc2V0IGV4cGlyeSBkYXRlcyBpbiBhZGRpdGlv
biB0byB0aGVtIGJlaW5nCi0gICAgICogc3BlY2lmaWVkIGluIGEgSFRNTCBmaWxlLgotICAgICAq
Ci0gICAgICogQHBhcmFtIGVxdWl2IFRoZSBodHRwIGhlYWRlciBuYW1lICh2YWx1ZSBvZiB0aGUg
bWV0YSB0YWcncyAiZXF1aXYiIGF0dHJpYnV0ZSkKLSAgICAgKiBAcGFyYW0gY29udGVudCBUaGUg
aGVhZGVyIHZhbHVlICh2YWx1ZSBvZiB0aGUgbWV0YSB0YWcncyAiY29udGVudCIgYXR0cmlidXRl
KQotICAgICAqLwotICAgIHZvaWQgcHJvY2Vzc0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcgJmVx
dWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRlbnQpOwotICAgIAotICAgIHZvaWQgZGlzcGF0Y2hJ
bWFnZUxvYWRFdmVudFNvb24oSFRNTEltYWdlTG9hZGVyKik7Ci0gICAgdm9pZCBkaXNwYXRjaElt
YWdlTG9hZEV2ZW50c05vdygpOwotICAgIHZvaWQgcmVtb3ZlSW1hZ2UoSFRNTEltYWdlTG9hZGVy
Kik7Ci0gICAgdmlydHVhbCB2b2lkIHRpbWVyRXZlbnQoUVRpbWVyRXZlbnQgKik7Ci0gICAgCi0g
ICAgLy8gUmV0dXJucyB0aGUgb3duaW5nIGVsZW1lbnQgaW4gdGhlIHBhcmVudCBkb2N1bWVudC4K
LSAgICAvLyBSZXR1cm5zIDAgaWYgdGhpcyBpcyB0aGUgdG9wIGxldmVsIGRvY3VtZW50LgotICAg
IEVsZW1lbnRJbXBsICpvd25lckVsZW1lbnQoKTsKLSAgICAKLSAgICBET01TdHJpbmcgcmVmZXJy
ZXIoKSBjb25zdDsKLSAgICBET01TdHJpbmcgZG9tYWluKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXRE
b21haW4oIGNvbnN0IERPTVN0cmluZyAmbmV3RG9tYWluLCBib29sIGZvcmNlID0gZmFsc2UgKTsg
Ly8gbm90IHBhcnQgb2YgdGhlIERPTQotCi0gICAgRE9NU3RyaW5nIHBvbGljeUJhc2VVUkwoKSBj
b25zdCB7IHJldHVybiBtX3BvbGljeUJhc2VVUkw7IH0KLSAgICB2b2lkIHNldFBvbGljeUJhc2VV
UkwoY29uc3QgRE9NU3RyaW5nICZzKSB7IG1fcG9saWN5QmFzZVVSTCA9IHM7IH0KLSAgICAKLSAg
ICAvLyBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUgZnJvbSBIVE1MIDQgZm9yIHdo
YXQgdmFsaWQgbmFtZXMgYXJlLgotICAgIC8vIFRvIGdldCB0aGlzIHJpZ2h0IGZvciBhbGwgdGhl
IFhNTCBjYXNlcywgd2UgcHJvYmFibHkgaGF2ZSB0byBpbXByb3ZlIHRoaXMgb3IgbW92ZSBpdAot
ICAgIC8vIGFuZCBtYWtlIGl0IHNlbnNpdGl2ZSB0byB0aGUgdHlwZSBvZiBkb2N1bWVudC4KLSAg
ICBzdGF0aWMgYm9vbCBpc1ZhbGlkTmFtZShjb25zdCBET01TdHJpbmcgJik7Ci0KLSAgICAvLyBU
aGUgZm9sbG93aW5nIGJyZWFrcyBhIHF1YWxpZmllZCBuYW1lIGludG8gYSBwcmVmaXggYW5kIGEg
bG9jYWwgbmFtZS4KLSAgICAvLyBJdCBhbHNvIGRvZXMgYSB2YWxpZGl0eSBjaGVjaywgYW5kIHJl
dHVybnMgZmFsc2UgaWYgdGhlIHF1YWxpZmllZCBuYW1lIGlzIGludmFsaWQKLSAgICAvLyAoZW1w
dHkgc3RyaW5nIG9yIGludmFsaWQgY2hhcmFjdGVycykuCi0gICAgc3RhdGljIGJvb2wgcGFyc2VR
dWFsaWZpZWROYW1lKGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgRE9NU3RyaW5nICZw
cmVmaXgsIERPTVN0cmluZyAmbG9jYWxOYW1lKTsKLSAgICAKLSAgICB2b2lkIGFkZEVsZW1lbnRC
eUlkKGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCk7Ci0g
ICAgdm9pZCByZW1vdmVFbGVtZW50QnlJZChjb25zdCBET01TdHJpbmcgJmVsZW1lbnRJZCwgRWxl
bWVudEltcGwgKmVsZW1lbnQpOwotCi0gICAgdm9pZCBhZGRJbWFnZU1hcChIVE1MTWFwRWxlbWVu
dEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWFnZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKik7
Ci0gICAgSFRNTE1hcEVsZW1lbnRJbXBsICpnZXRJbWFnZU1hcChjb25zdCBET01TdHJpbmcgJlVS
TCkgY29uc3Q7Ci0KLSAgICBIVE1MRWxlbWVudEltcGwqIGJvZHkoKTsKLQotICAgIERPTVN0cmlu
ZyB0b1N0cmluZygpIGNvbnN0OwotICAgIAotICAgIGJvb2wgZXhlY0NvbW1hbmQoY29uc3QgRE9N
U3RyaW5nICZjb21tYW5kLCBib29sIHVzZXJJbnRlcmZhY2UsIGNvbnN0IERPTVN0cmluZyAmdmFs
dWUpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kRW5hYmxlZChjb25zdCBET01TdHJpbmcgJmNvbW1h
bmQpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kSW5kZXRlcm0oY29uc3QgRE9NU3RyaW5nICZjb21t
YW5kKTsKLSAgICBib29sIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbnN0IERPTVN0cmluZyAmY29tbWFu
ZCk7Ci0gICAgYm9vbCBxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29uc3QgRE9NU3RyaW5nICZjb21t
YW5kKTsKLSAgICBET01TdHJpbmcgcXVlcnlDb21tYW5kVmFsdWUoY29uc3QgRE9NU3RyaW5nICZj
b21tYW5kKTsKLSAgICAKLSAgICB2b2lkIGFkZE1hcmtlcihSYW5nZUltcGwgKnJhbmdlLCBEb2N1
bWVudE1hcmtlcjo6TWFya2VyVHlwZSB0eXBlKTsKLSAgICB2b2lkIGFkZE1hcmtlcihOb2RlSW1w
bCAqbm9kZSwgRG9jdW1lbnRNYXJrZXIgbWFya2VyKTsKLSAgICB2b2lkIGNvcHlNYXJrZXJzKE5v
ZGVJbXBsICpzcmNOb2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgTm9kZUlt
cGwgKmRzdE5vZGUsIGludCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2Vy
VHlwZT1Eb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vycyk7Ci0gICAgdm9pZCByZW1vdmVNYXJrZXJz
KFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9
RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQgcmVtb3ZlTWFya2VycyhOb2Rl
SW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIERvY3VtZW50TWFy
a2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwot
ICAgIHZvaWQgcmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJU
eXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICB2b2lkIHJlbW92ZU1hcmtlcnMo
Tm9kZUltcGwgKm5vZGUpOwotICAgIHZvaWQgc2hpZnRNYXJrZXJzKE5vZGVJbXBsICpub2RlLCB1
bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGRlbHRhLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlw
ZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLQotICAgIFFWYWx1ZUxp
c3Q8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnNGb3JOb2RlKE5vZGVJbXBsICpub2RlKTsKLSAgICAK
LSAgIC8qKgotICAgICogZGVzaWduTW9kZSBzdXBwb3J0Ci0gICAgKi8KLSAgICBlbnVtIEluaGVy
aXRlZEJvb2wgewotICAgICAgICBvZmY9ZmFsc2UsCi0gICAgICAgIG9uPXRydWUsCi0gICAgICAg
IGluaGVyaXQKLSAgICB9OwotICAgIAotICAgIHZvaWQgc2V0RGVzaWduTW9kZShJbmhlcml0ZWRC
b29sIHZhbHVlKTsKLSAgICBJbmhlcml0ZWRCb29sIGdldERlc2lnbk1vZGUoKSBjb25zdDsKLSAg
ICBib29sIGluRGVzaWduTW9kZSgpIGNvbnN0OwotICAgIERvY3VtZW50SW1wbCAqcGFyZW50RG9j
dW1lbnQoKSBjb25zdDsKLSAgICBEb2N1bWVudEltcGwgKnRvcERvY3VtZW50KCkgY29uc3Q7Ci0K
LSAgICBpbnQgZG9jSUQoKSBjb25zdCB7IHJldHVybiBtX2RvY0lEOyB9Ci0KLSNpZmRlZiBLSFRN
TF9YU0xUCi0gICAgdm9pZCBhcHBseVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25J
bXBsKiBwaSk7Ci0gICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2Uodm9pZCogZG9jKSB7IG1fdHJh
bnNmb3JtU291cmNlID0gZG9jOyB9Ci0gICAgY29uc3Qgdm9pZCogdHJhbnNmb3JtU291cmNlKCkg
eyByZXR1cm4gbV90cmFuc2Zvcm1Tb3VyY2U7IH0KLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiB0
cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpIHsgcmV0dXJuIG1fdHJhbnNmb3JtU291cmNlRG9jdW1l
bnQ7IH0KLSAgICB2b2lkIHNldFRyYW5zZm9ybVNvdXJjZURvY3VtZW50KERvY3VtZW50SW1wbCAq
ZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBkb2M7IH0KLSNlbmRpZgotCi0jaWZu
ZGVmIEtIVE1MX05PX1hCTAotICAgIC8vIFhCTCBtZXRob2RzCi0gICAgWEJMOjpYQkxCaW5kaW5n
TWFuYWdlciogYmluZGluZ01hbmFnZXIoKSBjb25zdCB7IHJldHVybiBtX2JpbmRpbmdNYW5hZ2Vy
OyB9Ci0jZW5kaWYKLQotICAgIHZvaWQgaW5jRE9NVHJlZVZlcnNpb24oKSB7ICsrbV9kb210cmVl
X3ZlcnNpb247IH0KLSAgICB1bnNpZ25lZCBpbnQgZG9tVHJlZVZlcnNpb24oKSBjb25zdCB7IHJl
dHVybiBtX2RvbXRyZWVfdmVyc2lvbjsgfQotCi0gICAgdm9pZCBzZXREb2NUeXBlKERvY3VtZW50
VHlwZUltcGwgKmRvY1R5cGUpIHsgbV9kb2NUeXBlID0gZG9jVHlwZTsgfQotCi1zaWduYWxzOgot
ICAgIHZvaWQgZmluaXNoZWRQYXJzaW5nKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBraHRtbDo6Q1NT
U3R5bGVTZWxlY3RvciAqbV9zdHlsZVNlbGVjdG9yOwotICAgIEtIVE1MVmlldyAqbV92aWV3Owot
ICAgIFFTdHJpbmdMaXN0IG1fc3RhdGU7Ci0KLSAgICBraHRtbDo6RG9jTG9hZGVyICptX2RvY0xv
YWRlcjsKLSAgICBraHRtbDo6VG9rZW5pemVyICptX3Rva2VuaXplcjsKLSAgICBRU3RyaW5nIG1f
dXJsOwotICAgIFFTdHJpbmcgbV9iYXNlVVJMOwotICAgIFFTdHJpbmcgbV9iYXNlVGFyZ2V0Owot
Ci0gICAgUmVmUHRyPERvY3VtZW50VHlwZUltcGw+IG1fZG9jVHlwZTsKLSAgICBET01JbXBsZW1l
bnRhdGlvbkltcGwgKm1faW1wbGVtZW50YXRpb247Ci0KLSAgICBTdHlsZVNoZWV0SW1wbCAqbV9z
aGVldDsKLSAgICBRU3RyaW5nIG1fdXNlcnNoZWV0OwotICAgIFFTdHJpbmcgbV9wcmludFNoZWV0
OwotICAgIFFTdHJpbmdMaXN0IG1fYXZhaWxhYmxlU2hlZXRzOwotCi0gICAgLy8gVHJhY2sgdGhl
IG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGluZyB0b3AtbGV2ZWwgc3R5bGVzaGVldHMuICBTaGVl
dHMKLSAgICAvLyBsb2FkZWQgdXNpbmcgdGhlIEBpbXBvcnQgZGlyZWN0aXZlIGFyZSBub3QgaW5j
bHVkZWQgaW4gdGhpcyBjb3VudC4KLSAgICAvLyBXZSB1c2UgdGhpcyBjb3VudCBvZiBwZW5kaW5n
IHNoZWV0cyB0byBkZXRlY3Qgd2hlbiB3ZSBjYW4gYmVnaW4gYXR0YWNoaW5nCi0gICAgLy8gZWxl
bWVudHMuCi0gICAgaW50IG1fcGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAgLy8gQnV0IHNvbWV0
aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVuZGluZyBzdHlsZXNoZWV0IGNvdW50IHRvCi0gICAg
Ly8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91dCB3aGVuIHJlcXVlc3RlZCBieSBKUy4KLSAgICBi
b29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAgQ1NTU3R5bGVTaGVldEltcGwg
Km1fZWxlbVNoZWV0OwotCi0gICAgUVBhaW50RGV2aWNlICptX3BhaW50RGV2aWNlOwotICAgIFFQ
YWludERldmljZU1ldHJpY3MgKm1fcGFpbnREZXZpY2VNZXRyaWNzOwotICAgIFBhcnNlTW9kZSBw
TW9kZTsKLSAgICBIVE1MTW9kZSBoTW9kZTsKLQotICAgIFFDb2xvciBtX3RleHRDb2xvcjsKLQot
ICAgIFJlZlB0cjxOb2RlSW1wbD4gbV9mb2N1c05vZGU7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBt
X2hvdmVyTm9kZTsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IG1fYWN0aXZlTm9kZTsKLQotICAgIHVu
c2lnbmVkIGludCBtX2RvbXRyZWVfdmVyc2lvbjsKLSAgICAKLSAgICAvLyAjIyMgcmVwbGFjZSBt
ZSB3aXRoIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudAotICAgIC8vIGluIGxvb2t1cCBhbmQgaW5z
ZXJ0aW9uLgotICAgIERPTVN0cmluZ0ltcGwgKiptX2VsZW1lbnROYW1lczsKLSAgICB1bnNpZ25l
ZCBzaG9ydCBtX2VsZW1lbnROYW1lQWxsb2M7Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9lbGVtZW50
TmFtZUNvdW50OwotCi0gICAgRE9NU3RyaW5nSW1wbCAqKm1fYXR0ck5hbWVzOwotICAgIHVuc2ln
bmVkIHNob3J0IG1fYXR0ck5hbWVBbGxvYzsKLSAgICB1bnNpZ25lZCBzaG9ydCBtX2F0dHJOYW1l
Q291bnQ7Ci0KLSAgICBET01TdHJpbmdJbXBsKiogbV9uYW1lc3BhY2VVUklzOwotICAgIHVuc2ln
bmVkIHNob3J0IG1fbmFtZXNwYWNlVVJJQWxsb2M7Ci0gICAgdW5zaWduZWQgc2hvcnQgbV9uYW1l
c3BhY2VVUklDb3VudDsKLQotICAgIFFQdHJMaXN0PE5vZGVJdGVyYXRvckltcGw+IG1fbm9kZUl0
ZXJhdG9yczsKLSAgICBBYnN0cmFjdFZpZXdJbXBsICptX2RlZmF1bHRWaWV3OwotCi0gICAgdW5z
aWduZWQgc2hvcnQgbV9saXN0ZW5lclR5cGVzOwotICAgIFN0eWxlU2hlZXRMaXN0SW1wbCogbV9z
dHlsZVNoZWV0czsKLSAgICBMb2NhbFN0eWxlUmVmcyBtX2xvY2FsU3R5bGVSZWZzOyAvLyByZWZl
cmVuY2VzIHRvIGlubGluZWQgc3R5bGUgZWxlbWVudHMKLSAgICBRUHRyTGlzdDxSZWdpc3RlcmVk
RXZlbnRMaXN0ZW5lcj4gbV93aW5kb3dFdmVudExpc3RlbmVyczsKLSAgICBRUHRyTGlzdDxOb2Rl
SW1wbD4gbV9tYWludGFpbnNTdGF0ZTsKLQotICAgIFFDb2xvciBtX2xpbmtDb2xvcjsKLSAgICBR
Q29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwotICAgIFFDb2xvciBtX2FjdGl2ZUxpbmtDb2xvcjsK
LQotICAgIERPTVN0cmluZyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQ7Ci0gICAgRE9NU3RyaW5n
IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OwotCi0gICAgYm9vbCBtX2xvYWRpbmdTaGVldDsKLSAg
ICBib29sIHZpc3VhbGx5T3JkZXJlZDsKLSAgICBib29sIG1fYlBhcnNpbmc7Ci0gICAgYm9vbCBt
X2JBbGxEYXRhUmVjZWl2ZWQ7Ci0gICAgYm9vbCBtX2RvY0NoYW5nZWQ7Ci0gICAgYm9vbCBtX3N0
eWxlU2VsZWN0b3JEaXJ0eTsKLSAgICBib29sIG1faW5TdHlsZVJlY2FsYzsKLSAgICBib29sIG1f
Y2xvc2VBZnRlclN0eWxlUmVjYWxjOwotICAgIGJvb2wgbV91c2VzRGVzY2VuZGFudFJ1bGVzOwot
ICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVzOwotICAgIAotICAgIERPTVN0cmluZyBtX3RpdGxl
OwotICAgIGJvb2wgbV90aXRsZVNldEV4cGxpY2l0bHk7Ci0gICAgUmVmUHRyPE5vZGVJbXBsPiBt
X3RpdGxlRWxlbWVudDsKLSAgICAKLSAgICBSZW5kZXJBcmVuYSogbV9yZW5kZXJBcmVuYTsKLQot
ICAgIFFQdHJEaWN0PCBRVmFsdWVMaXN0PERvY3VtZW50TWFya2VyPiA+IG1fbWFya2VyczsKLQot
ICAgIEtXUUFjY09iamVjdENhY2hlKiBtX2FjY0NhY2hlOwotICAgIAotICAgIFFQdHJMaXN0PEhU
TUxJbWFnZUxvYWRlcj4gbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoU29vbkxpc3Q7Ci0gICAgUVB0
ckxpc3Q8SFRNTEltYWdlTG9hZGVyPiBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0Owot
ICAgIGludCBtX2ltYWdlTG9hZEV2ZW50VGltZXI7Ci0KLSAgICBOb2RlSW1wbCogbV9jc3NUYXJn
ZXQ7Ci0gICAgCi0gICAgYm9vbCBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQ7Ci0gICAgUVRpbWUgbV9z
dGFydFRpbWU7Ci0gICAgYm9vbCBtX292ZXJNaW5pbXVtTGF5b3V0VGhyZXNob2xkOwotICAgIAot
I2lmZGVmIEtIVE1MX1hTTFQKLSAgICB2b2lkICptX3RyYW5zZm9ybVNvdXJjZTsKLSAgICBSZWZQ
dHI8RG9jdW1lbnRJbXBsPiBtX3RyYW5zZm9ybVNvdXJjZURvY3VtZW50OwotI2VuZGlmCi0KLSNp
Zm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgWEJMOjpYQkxCaW5kaW5nTWFuYWdlciogbV9iaW5kaW5n
TWFuYWdlcjsgLy8gVGhlIGFjY2VzcyBwb2ludCB0aHJvdWdoIHdoaWNoIGRvY3VtZW50cyBhbmQg
ZWxlbWVudHMgY29tbXVuaWNhdGUgd2l0aCBYQkwuCi0jZW5kaWYKLSAgICAKLSAgICBRTWFwPFFT
dHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAqPiBtX2ltYWdlTWFwc0J5TmFtZTsKIAotICAgIERP
TVN0cmluZyBtX3BvbGljeUJhc2VVUkw7Ci0KLSAgICBRUHRyRGljdDxOb2RlSW1wbD4gbV9kaXNj
b25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVyczsKLQotICAgIGludCBtX2RvY0lEOyAvLyBB
IHVuaXF1ZSBkb2N1bWVudCBpZGVudGlmaWVyIHVzZWQgZm9yIHRoaW5ncyBsaWtlIGRvY3VtZW50
LXNwZWNpZmljIG1hcHBlZCBhdHRyaWJ1dGVzLgotCi1wdWJsaWM6Ci0gICAgS1dRU2lnbmFsIG1f
ZmluaXNoZWRQYXJzaW5nOwotCi0gICAgYm9vbCBpblBhZ2VDYWNoZSgpOwotICAgIHZvaWQgc2V0
SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKTsKLSAgICB2b2lkIHJlc3RvcmVSZW5kZXJlcihraHRtbDo6
UmVuZGVyT2JqZWN0KiByZW5kZXIpOwotCi0gICAgdm9pZCBwYXNzd29yZEZpZWxkQWRkZWQoKTsK
LSAgICB2b2lkIHBhc3N3b3JkRmllbGRSZW1vdmVkKCk7Ci0gICAgYm9vbCBoYXNQYXNzd29yZEZp
ZWxkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNlY3VyZUZvcm1BZGRlZCgpOwotICAgIHZvaWQgc2Vj
dXJlRm9ybVJlbW92ZWQoKTsKLSAgICBib29sIGhhc1NlY3VyZUZvcm0oKSBjb25zdDsKLQotICAg
IHZvaWQgc2V0U2hvdWxkQ3JlYXRlUmVuZGVyZXJzKGJvb2wgZik7Ci0gICAgYm9vbCBzaG91bGRD
cmVhdGVSZW5kZXJlcnMoKTsKLSAgICAKLSAgICB2b2lkIHNldERlY29kZXIoa2h0bWw6OkRlY29k
ZXIgKik7Ci0gICAga2h0bWw6OkRlY29kZXIgKmRlY29kZXIoKSBjb25zdCB7IHJldHVybiBtX2Rl
Y29kZXIuZ2V0KCk7IH0KLQotICAgIHZvaWQgc2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5KGJvb2wg
ZikgeyBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eSA9IGY7IH0KLSAgICBib29sIGRhc2hib2FyZFJl
Z2lvbnNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uc0RpcnR5OyB9Ci0g
ICAgYm9vbCBoYXNEYXNoYm9hcmRSZWdpb25zICgpIGNvbnN0IHsgcmV0dXJuIG1faGFzRGFzaGJv
YXJkUmVnaW9uczsgfQotICAgIHZvaWQgc2V0SGFzRGFzaGJvYXJkUmVnaW9ucyAoYm9vbCBmKSB7
IG1faGFzRGFzaGJvYXJkUmVnaW9ucyA9IGY7IH0KLSAgICBjb25zdCBRVmFsdWVMaXN0PGtodG1s
OjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gJiBkYXNoYm9hcmRSZWdpb25zKCkgY29uc3Q7Ci0gICAg
dm9pZCBzZXREYXNoYm9hcmRSZWdpb25zIChjb25zdCBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9h
cmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpOwotICAgIAotICAgIHZvaWQgcmVtb3ZlQWxsRXZlbnRM
aXN0ZW5lcnNGcm9tQWxsTm9kZXMoKTsKLQotICAgIHZvaWQgcmVnaXN0ZXJEaXNjb25uZWN0ZWRO
b2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsKLSAgICB2b2lkIHVucmVnaXN0
ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsKLSAg
ICAKLSAgICB2b2lkIHJhZGlvQnV0dG9uQ2hlY2tlZChIVE1MSW5wdXRFbGVtZW50SW1wbCAqY2Fs
bGVyLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKTsKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1w
bCogY2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoRE9NU3RyaW5nSW1wbCogbmFtZSwgSFRNTEZv
cm1FbGVtZW50SW1wbCAqZm9ybSk7Ci0gICAgdm9pZCByZW1vdmVSYWRpb0J1dHRvbkdyb3VwKERP
TVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pOwotCi1wcml2YXRl
OgotICAgIHZvaWQgdXBkYXRlVGl0bGUoKTsKLSAgICB2b2lkIHJlbW92ZUFsbERpc2Nvbm5lY3Rl
ZE5vZGVFdmVudExpc3RlbmVycygpOwotCi0gICAgSlNFZGl0b3IgKmpzRWRpdG9yKCk7Ci0KLSAg
ICBKU0VkaXRvciAqbV9qc0VkaXRvcjsKLSAgICBib29sIHJlbGlucXVpc2hlc0VkaXRpbmdGb2N1
cyhOb2RlSW1wbCAqbm9kZSk7Ci0gICAgYm9vbCBhY2NlcHRzRWRpdGluZ0ZvY3VzKE5vZGVJbXBs
ICpub2RlKTsKLQotICAgIG11dGFibGUgRE9NU3RyaW5nIG1fZG9tYWluOwotICAgIGJvb2wgbV9p
blBhZ2VDYWNoZTsKLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICptX3NhdmVkUmVuZGVyZXI7Ci0g
ICAgaW50IG1fcGFzc3dvcmRGaWVsZHM7Ci0gICAgaW50IG1fc2VjdXJlRm9ybXM7Ci0gICAgCi0g
ICAgUmVmUHRyPGtodG1sOjpEZWNvZGVyPiBtX2RlY29kZXI7Ci0KLSAgICBtdXRhYmxlIFFEaWN0
PEVsZW1lbnRJbXBsPiBtX2VsZW1lbnRzQnlJZDsKLSAgICBtdXRhYmxlIFFEaWN0PGNoYXI+IG1f
aWRDb3VudDsKLSAgICAKLSAgICBRRGljdDxFbGVtZW50SW1wbD4gbV9lbGVtZW50c0J5QWNjZXNz
S2V5OwotICAgIGJvb2wgbV9hY2Nlc3NLZXlEaWN0VmFsaWQ7Ci0gCi0gICAgYm9vbCBtX2NyZWF0
ZVJlbmRlcmVyczsKLSAgICAKLSAgICBJbmhlcml0ZWRCb29sIG1fZGVzaWduTW9kZTsKLSAgICAK
LSAgICBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gbV9kYXNoYm9hcmRS
ZWdpb25zOwotICAgIGJvb2wgbV9oYXNEYXNoYm9hcmRSZWdpb25zOwotICAgIGJvb2wgbV9kYXNo
Ym9hcmRSZWdpb25zRGlydHk7Ci0gICAgaW50IG1fc2VsZk9ubHlSZWZDb3VudDsKLSAgICB0eXBl
ZGVmIEhhc2hNYXA8RE9NU3RyaW5nSW1wbCosIEhUTUxJbnB1dEVsZW1lbnRJbXBsKiwgUG9pbnRl
ckhhc2g8RE9NU3RyaW5nSW1wbCo+ID4gTmFtZVRvSW5wdXRNYXA7Ci0gICAgdHlwZWRlZiBIYXNo
TWFwPEhUTUxGb3JtRWxlbWVudEltcGwqLCBOYW1lVG9JbnB1dE1hcCosIFBvaW50ZXJIYXNoPEhU
TUxGb3JtRWxlbWVudEltcGwqPiA+IEZvcm1Ub0dyb3VwTWFwOwotICAgIEZvcm1Ub0dyb3VwTWFw
KiBtX3NlbGVjdGVkUmFkaW9CdXR0b25zOwotfTsKLQotY2xhc3MgRG9jdW1lbnRGcmFnbWVudElt
cGwgOiBwdWJsaWMgQ29udGFpbmVyTm9kZUltcGwKLXsKLXB1YmxpYzoKLSAgICBEb2N1bWVudEZy
YWdtZW50SW1wbChEb2N1bWVudEltcGwgKmRvYyk7Ci0KLSAgICAvLyBET00gbWV0aG9kcyBvdmVy
cmlkZGVuIGZyb20gIHBhcmVudCBjbGFzc2VzCi0gICAgdmlydHVhbCBET01TdHJpbmcgbm9kZU5h
bWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlKCkgY29uc3Q7
Ci0gICAgdmlydHVhbCBOb2RlSW1wbCAqY2xvbmVOb2RlICggYm9vbCBkZWVwICk7Ci0KLSAgICAv
LyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBET00pCi0gICAgdmlydHVhbCBib29sIGNoaWxk
VHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0IHR5cGUgKTsKLQotICAgIHZpcnR1YWwgRE9NU3Ry
aW5nIHRvU3RyaW5nKCkgY29uc3Q7Ci19OworY2xhc3MgRE9NSW1wbGVtZW50YXRpb25JbXBsOwog
CiBjbGFzcyBEb2N1bWVudFR5cGVJbXBsIDogcHVibGljIE5vZGVJbXBsCiB7CkluZGV4OiBraHRt
bC94bWwvZG9tX2VsZW1lbnRpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC94bWwvZG9tX2Vs
ZW1lbnRpbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC94bWwvZG9tX2VsZW1lbnRp
bXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgImRvbS9k
b21fZXhjZXB0aW9uLmgiCiAjaW5jbHVkZSAiZG9tL2RvbV9ub2RlLmgiCiAjaW5jbHVkZSAieG1s
L2RvbV90ZXh0aW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgogI2luY2x1ZGUg
InhtbC9kb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2VsZW1lbnRpbXBsLmgi
CiAKSW5kZXg6IGtodG1sL3htbC9kb21fZG9jaW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
eG1sL2RvbV9kb2NpbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC94bWwvZG9tX2Rv
Y2ltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDM0MjUgKzAsMCBAQAotLyoqCi0gKiBUaGlz
IGZpbGUgaXMgcGFydCBvZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGZvciBLREUuCi0gKgotICog
Q29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtkZS5vcmcpCi0gKiAgICAgICAg
ICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtkZS5vcmcpCi0gKiAgICAgICAg
ICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCi0gKiBDb3B5cmlnaHQg
KEMpIDIwMDQgQXBwbGUgQ29tcHV0ZXIsIEluYy4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwotICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
Ci0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCi0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi0gKiBCb3N0b24sIE1B
IDAyMTExLTEzMDcsIFVTQS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
ZG9tX2RvY2ltcGwuaCIKLQotI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVk
ZSAiZG9tL2RvbTJfZXZlbnRzLmgiCi0KLSNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCi0j
aW5jbHVkZSAieG1sL2RvbV94bWxpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBs
LmgiCi0jaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb20y
X3ZpZXdzaW1wbC5oIgotI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCi0jaW5jbHVkZSAieG1s
L3htbF90b2tlbml6ZXIuaCIKLQotI2luY2x1ZGUgImNzcy9jc3NoZWxwZXIuaCIKLSNpbmNsdWRl
ICJjc3MvY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVldGlt
cGwuaCIKLSNpbmNsdWRlICJjc3MvY3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgIm1pc2MvaGVs
cGVyLmgiCi0jaW5jbHVkZSAiRG9jTG9hZGVyLmgiCi0jaW5jbHVkZSAiZWNtYS9ranNfcHJveHku
aCIKLSNpbmNsdWRlICJlY21hL2tqc19iaW5kaW5nLmgiCi0KLSNpbmNsdWRlIDxxcHRyc3RhY2su
aD4KLSNpbmNsdWRlIDxxcGFpbnRkZXZpY2VtZXRyaWNzLmg+Ci0jaW5jbHVkZSA8cXJlZ2V4cC5o
PgotI2luY2x1ZGUgPGtkZWJ1Zy5oPgotCi0jaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9jYW52
YXMuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2ZyYW1lcy5oIgotI2luY2x1ZGUgInJl
bmRlcmluZy9yZW5kZXJfaW1hZ2UuaCIKLSNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX29iamVj
dC5oIgotI2luY2x1ZGUgInJlbmRlcl9hcmVuYS5oIgotCi0jaW5jbHVkZSAiRnJhbWVWaWV3Lmgi
Ci0jaW5jbHVkZSAiTWFjRnJhbWUuaCIKLSNpbmNsdWRlICJGcmFtZVByaXZhdGUuaCIKLQotI2lu
Y2x1ZGUgPGtnbG9iYWxzZXR0aW5ncy5oPgotI2luY2x1ZGUgImtodG1sX3NldHRpbmdzLmgiCi0K
LS8vIEZJWE1FOiBXZSB3YW50IHRvIGN1dCB0aGUgcmVtYWluaW5nIEhUTUwgZGVwZW5kZW5jaWVz
IHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBpbmNsdWRlIHRoZXNlIGZpbGVzLgotI2luY2x1ZGUg
Imh0bWwvaHRtbF9kb2N1bWVudGltcGwuaCIKLSNpbmNsdWRlICJodG1sL2h0bWxfaGVhZGltcGwu
aCIKLSNpbmNsdWRlICJodG1sL2h0bWxfaW1hZ2VpbXBsLmgiCi0jaW5jbHVkZSAiSFRNTElucHV0
RWxlbWVudEltcGwuaCIKLSNpbmNsdWRlICJodG1sZmFjdG9yeS5oIgotCi0jaW5jbHVkZSAiY3Nz
dmFsdWVzLmgiCi0KLSNpbmNsdWRlICJlZGl0aW5nL2pzZWRpdGluZy5oIgotI2luY2x1ZGUgImVk
aXRpbmcvdmlzaWJsZV9wb3NpdGlvbi5oIgotI2luY2x1ZGUgImVkaXRpbmcvdmlzaWJsZV90ZXh0
LmgiCi0KLSNpbmNsdWRlIDxraW8vam9iLmg+Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0jaW5jbHVk
ZSAieHNsX3N0eWxlc2hlZXRpbXBsLmgiCi0jaW5jbHVkZSAieHNsdF9wcm9jZXNzb3JpbXBsLmgi
Ci0jZW5kaWYKLQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSNpbmNsdWRlICJ4YmwveGJsX2JpbmRp
bmdfbWFuYWdlci5oIgotdXNpbmcgWEJMOjpYQkxCaW5kaW5nTWFuYWdlcjsKLSNlbmRpZgotCi0j
aW5jbHVkZSAiS1dRQWNjT2JqZWN0Q2FjaGUuaCIKLSNpbmNsdWRlICJLV1FMb2dnaW5nLmgiCi0K
LSNpZiBTVkdfU1VQUE9SVAotI2luY2x1ZGUgIlNWR05hbWVzLmgiCi0jaW5jbHVkZSAiU1ZHRWxl
bWVudEZhY3RvcnkuaCIKLSNpbmNsdWRlICJTVkdFbGVtZW50SW1wbC5oIgotI2luY2x1ZGUgIlNW
R1pvb21FdmVudEltcGwuaCIKLSNpbmNsdWRlICJTVkdTdHlsZUVsZW1lbnRJbXBsLmgiCi0jaW5j
bHVkZSAia2NhbnZhcy9kZXZpY2UvcXVhcnR6L0tSZW5kZXJpbmdEZXZpY2VRdWFydHouaCIKLSNl
bmRpZgotCi11c2luZyBuYW1lc3BhY2UgRE9NOwotdXNpbmcgbmFtZXNwYWNlIERPTTo6RXZlbnRO
YW1lczsKLXVzaW5nIG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci11c2luZyBuYW1lc3BhY2Uga2h0bWw7
Ci0KLS8vICNkZWZpbmUgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORyAxCi0KLS8vIFRoaXMg
YW1vdW50IG9mIHRpbWUgbXVzdCBoYXZlIGVsYXBzZWQgYmVmb3JlIHdlIHdpbGwgZXZlbiBjb25z
aWRlciBzY2hlZHVsaW5nIGEgbGF5b3V0IHdpdGhvdXQgYSBkZWxheS4KLS8vIEZJWE1FOiBGb3Ig
ZmFzdGVyIG1hY2hpbmVzIHRoaXMgdmFsdWUgY2FuIHJlYWxseSBiZSBsb3dlcmVkIHRvIDIwMC4g
IDI1MCBpcyBhZGVxdWF0ZSwgYnV0IGEgbGl0dGxlIGhpZ2gKLS8vIGZvciBkdWFsIEc1cy4gOikK
LWNvbnN0IGludCBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQgPSAyNTA7Ci0KLURPTUltcGxlbWVu
dGF0aW9uSW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjptX2luc3RhbmNlID0gMDsKLQotLy8g
VXNlIDEgdG8gcmVwcmVzZW50IHRoZSBkb2N1bWVudCdzIGRlZmF1bHQgZm9ybS4KLUhUTUxGb3Jt
RWxlbWVudEltcGwqIGNvbnN0IGRlZmF1bHRGb3JtID0gKEhUTUxGb3JtRWxlbWVudEltcGwqKSAx
OwotCi0vLyBET00gTGV2ZWwgMiBzYXlzIChsZXR0ZXJzIGFkZGVkKToKLS8vCi0vLyBhKSBOYW1l
IHN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBMbCwgTHUs
IExvLCBMdCwgTmwuCi0vLyBiKSBOYW1lIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0YXJ0
IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUgY2F0ZWdvcmllcyBNYywgTWUsIE1uLCBM
bSwgb3IgTmQuCi0vLyBjKSBDaGFyYWN0ZXJzIGluIHRoZSBjb21wYXRpYmlsaXR5IGFyZWEgKGku
ZS4gd2l0aCBjaGFyYWN0ZXIgY29kZSBncmVhdGVyIHRoYW4gI3hGOTAwIGFuZCBsZXNzIHRoYW4g
I3hGRkZFKSBhcmUgbm90IGFsbG93ZWQgaW4gWE1MIG5hbWVzLgotLy8gZCkgQ2hhcmFjdGVycyB3
aGljaCBoYXZlIGEgZm9udCBvciBjb21wYXRpYmlsaXR5IGRlY29tcG9zaXRpb24gKGkuZS4gdGhv
c2Ugd2l0aCBhICJjb21wYXRpYmlsaXR5IGZvcm1hdHRpbmcgdGFnIiBpbiBmaWVsZCA1IG9mIHRo
ZSBkYXRhYmFzZSAtLSBtYXJrZWQgYnkgZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICI8IikgYXJl
IG5vdCBhbGxvd2VkLgotLy8gZSkgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVk
IGFzIG5hbWUtc3RhcnQgY2hhcmFjdGVycyByYXRoZXIgdGhhbiBuYW1lIGNoYXJhY3RlcnMsIGJl
Y2F1c2UgdGhlIHByb3BlcnR5IGZpbGUgY2xhc3NpZmllcyB0aGVtIGFzIEFscGhhYmV0aWM6IFsj
eDAyQkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2RTUsICN4MDZFNi4KLS8vIGYpIENoYXJhY3RlcnMg
I3gyMERELSN4MjBFMCBhcmUgZXhjbHVkZWQgKGluIGFjY29yZGFuY2Ugd2l0aCBVbmljb2RlLCBz
ZWN0aW9uIDUuMTQpLgotLy8gZykgQ2hhcmFjdGVyICN4MDBCNyBpcyBjbGFzc2lmaWVkIGFzIGFu
IGV4dGVuZGVyLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBsaXN0IHNvIGlkZW50aWZpZXMgaXQuCi0v
LyBoKSBDaGFyYWN0ZXIgI3gwMzg3IGlzIGFkZGVkIGFzIGEgbmFtZSBjaGFyYWN0ZXIsIGJlY2F1
c2UgI3gwMEI3IGlzIGl0cyBjYW5vbmljYWwgZXF1aXZhbGVudC4KLS8vIGkpIENoYXJhY3RlcnMg
JzonIGFuZCAnXycgYXJlIGFsbG93ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLgotLy8gaikg
Q2hhcmFjdGVycyAnLScgYW5kICcuJyBhcmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMuCi0v
LwotLy8gSXQgYWxzbyBjb250YWlucyBjb21wbGV0ZSB0YWJsZXMuIElmIHdlIGRlY2lkZSBpdCdz
IGJldHRlciwgd2UgY291bGQgaW5jbHVkZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcg
Y29kZS4KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lU3RhcnQoVUNoYXIzMiBjKQot
ewotICAgIC8vIHJ1bGUgKGUpIGFib3ZlCi0gICAgaWYgKChjID49IDB4MDJCQiAmJiBjIDw9IDB4
MDJDMSkgfHwgYyA9PSAweDU1OSB8fCBjID09IDB4NkU1IHx8IGMgPT0gMHg2RTYpCi0gICAgICAg
IHJldHVybiB0cnVlOwotCi0gICAgLy8gcnVsZSAoaSkgYWJvdmUKLSAgICBpZiAoYyA9PSAnOicg
fHwgYyA9PSAnXycpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgLy8gcnVsZXMgKGEpIGFu
ZCAoZikgYWJvdmUKLSAgICBjb25zdCB1aW50MzJfdCBuYW1lU3RhcnRNYXNrID0gVV9HQ19MTF9N
QVNLIHwgVV9HQ19MVV9NQVNLIHwgVV9HQ19MT19NQVNLIHwgVV9HQ19MVF9NQVNLIHwgVV9HQ19O
TF9NQVNLOwotICAgIGlmICghKFVfR0VUX0dDX01BU0soYykgJiBuYW1lU3RhcnRNYXNrKSkKLSAg
ICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gcnVsZSAoYykgYWJvdmUKLSAgICBpZiAoYyA+
PSAweEY5MDAgJiYgYyA8IDB4RkZGRSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8g
cnVsZSAoZCkgYWJvdmUKLSAgICBVRGVjb21wb3NpdGlvblR5cGUgZGVjb21wVHlwZSA9IHN0YXRp
Y19jYXN0PFVEZWNvbXBvc2l0aW9uVHlwZT4odV9nZXRJbnRQcm9wZXJ0eVZhbHVlKGMsIFVDSEFS
X0RFQ09NUE9TSVRJT05fVFlQRSkpOwotICAgIGlmIChkZWNvbXBUeXBlID09IFVfRFRfRk9OVCB8
fCBkZWNvbXBUeXBlID09IFVfRFRfQ09NUEFUKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGlzVmFsaWROYW1lUGFydChV
Q2hhcjMyIGMpCi17Ci0gICAgLy8gcnVsZXMgKGEpLCAoZSksIGFuZCAoaSkgYWJvdmUKLSAgICBp
ZiAoaXNWYWxpZE5hbWVTdGFydChjKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBy
dWxlcyAoZykgYW5kIChoKSBhYm92ZQotICAgIGlmIChjID09IDB4MDBCNyB8fCBjID09IDB4MDM4
NykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBydWxlIChqKSBhYm92ZQotICAgIGlm
IChjID09ICctJyB8fCBjID09ICcuJykKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBy
dWxlcyAoYikgYW5kIChmKSBhYm92ZQotICAgIGNvbnN0IHVpbnQzMl90IG90aGVyTmFtZVBhcnRN
YXNrID0gVV9HQ19NQ19NQVNLIHwgVV9HQ19NRV9NQVNLIHwgVV9HQ19NTl9NQVNLIHwgVV9HQ19M
TV9NQVNLIHwgVV9HQ19ORF9NQVNLOwotICAgIGlmICghKFVfR0VUX0dDX01BU0soYykgJiBvdGhl
ck5hbWVQYXJ0TWFzaykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGMp
IGFib3ZlCi0gICAgaWYgKGMgPj0gMHhGOTAwICYmIGMgPCAweEZGRkUpCi0gICAgICAgIHJldHVy
biBmYWxzZTsKLQotICAgIC8vIHJ1bGUgKGQpIGFib3ZlCi0gICAgVURlY29tcG9zaXRpb25UeXBl
IGRlY29tcFR5cGUgPSBzdGF0aWNfY2FzdDxVRGVjb21wb3NpdGlvblR5cGU+KHVfZ2V0SW50UHJv
cGVydHlWYWx1ZShjLCBVQ0hBUl9ERUNPTVBPU0lUSU9OX1RZUEUpKTsKLSAgICBpZiAoZGVjb21w
VHlwZSA9PSBVX0RUX0ZPTlQgfHwgZGVjb21wVHlwZSA9PSBVX0RUX0NPTVBBVCkKLSAgICAgICAg
cmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZJWE1FOiBBbiBpbXBs
ZW1lbnRhdGlvbiBvZiB0aGlzIGlzIHN0aWxsIHdhaXRpbmcgZm9yIG1lIHRvIHVuZGVyc3RhbmQg
dGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KLS8vIGEgIm1hbGZvcm1lZCIgcXVhbGlmaWVkIG5hbWUg
YW5kIG9uZSB3aXRoIGJhZCBjaGFyYWN0ZXJzIGluIGl0LiBGb3IgZXhhbXBsZSwgaXMgYSBzZWNv
bmQgY29sb24KLS8vIGFuIGlsbGVnYWwgY2hhcmFjdGVyIG9yIGEgbWFsZm9ybWVkIHF1YWxpZmll
ZCBuYW1lPyBUaGlzIHdpbGwgZGV0ZXJtaW5lIGJvdGggd2hhdCBwYXJhbWV0ZXJzCi0vLyB0aGlz
IGZ1bmN0aW9uIG5lZWRzIHRvIHRha2UgYW5kIGV4YWN0bHkgd2hhdCBpdCB3aWxsIGRvLiBTaG91
bGQgYWxzbyBiZSBleHBvcnRlZCBzbyB0aGF0Ci0vLyBFbGVtZW50SW1wbCBjYW4gdXNlIGl0IHRv
by4KLXN0YXRpYyBib29sIHF1YWxpZmllZE5hbWVJc01hbGZvcm1lZChjb25zdCBET01TdHJpbmcg
JikKLXsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLURPTUltcGxlbWVudGF0aW9uSW1wbDo6RE9N
SW1wbGVtZW50YXRpb25JbXBsKCkKLXsKLX0KLQotRE9NSW1wbGVtZW50YXRpb25JbXBsOjp+RE9N
SW1wbGVtZW50YXRpb25JbXBsKCkKLXsKLX0KLQotYm9vbCBET01JbXBsZW1lbnRhdGlvbkltcGw6
Omhhc0ZlYXR1cmUgKGNvbnN0IERPTVN0cmluZyAmZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nICZ2
ZXJzaW9uKSBjb25zdAotewotICAgIERPTVN0cmluZyBsb3dlciA9IGZlYXR1cmUubG93ZXIoKTsK
LSAgICBpZiAobG93ZXIgPT0gImNvcmUiIHx8IGxvd2VyID09ICJodG1sIiB8fCBsb3dlciA9PSAi
eG1sIiB8fCBsb3dlciA9PSAieGh0bWwiKQotICAgICAgICByZXR1cm4gdmVyc2lvbi5pc0VtcHR5
KCkgfHwgdmVyc2lvbiA9PSAiMS4wIiB8fCB2ZXJzaW9uID09ICIyLjAiOwotICAgIGlmIChsb3dl
ciA9PSAiY3NzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gImNzczIiCi0gICAgICAgICAgICB8
fCBsb3dlciA9PSAiZXZlbnRzIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gImh0bWxldmVudHMi
Ci0gICAgICAgICAgICB8fCBsb3dlciA9PSAibW91c2VldmVudHMiCi0gICAgICAgICAgICB8fCBs
b3dlciA9PSAibXV0YXRpb25ldmVudHMiCi0gICAgICAgICAgICB8fCBsb3dlciA9PSAicmFuZ2Ui
Ci0gICAgICAgICAgICB8fCBsb3dlciA9PSAic3R5bGVzaGVldHMiCi0gICAgICAgICAgICB8fCBs
b3dlciA9PSAidHJhdmVyc2FsIgotICAgICAgICAgICAgfHwgbG93ZXIgPT0gInVpZXZlbnRzIgot
ICAgICAgICAgICAgfHwgbG93ZXIgPT0gInZpZXdzIikKLSAgICAgICAgcmV0dXJuIHZlcnNpb24u
aXNFbXB0eSgpIHx8IHZlcnNpb24gPT0gIjIuMCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1E
b2N1bWVudFR5cGVJbXBsICpET01JbXBsZW1lbnRhdGlvbkltcGw6OmNyZWF0ZURvY3VtZW50VHlw
ZSggY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBjb25zdCBET01TdHJpbmcgJnB1Ymxp
Y0lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQsIGludCAmZXhjZXB0aW9uY29kZSAp
Ci17Ci0gICAgLy8gTm90IG1lbnRpb25lZCBpbiBzcGVjOiB0aHJvdyBOQU1FU1BBQ0VfRVJSIGlm
IG5vIHF1YWxpZmllZE5hbWUgc3VwcGxpZWQKLSAgICBpZiAocXVhbGlmaWVkTmFtZS5pc051bGwo
KSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJS
OwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBJTlZBTElEX0NIQVJBQ1RFUl9F
UlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHF1YWxpZmllZCBuYW1lIGNvbnRhaW5zIGFuIGls
bGVnYWwgY2hhcmFjdGVyLgotICAgIERPTVN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKLSAgICBp
ZiAoIURvY3VtZW50SW1wbDo6cGFyc2VRdWFsaWZpZWROYW1lKHF1YWxpZmllZE5hbWUsIHByZWZp
eCwgbG9jYWxOYW1lKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpJ
TlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8v
IE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgcXVhbGlmaWVkTmFtZSBpcyBtYWxmb3JtZWQu
Ci0gICAgaWYgKHF1YWxpZmllZE5hbWVJc01hbGZvcm1lZChxdWFsaWZpZWROYW1lKSkgewotICAg
ICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwotICAgICAg
ICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IERvY3VtZW50VHlwZUltcGwodGhp
cywgMCwgcXVhbGlmaWVkTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLX0KLQotRE9NSW1wbGVt
ZW50YXRpb25JbXBsKiBET01JbXBsZW1lbnRhdGlvbkltcGw6OmdldEludGVyZmFjZShjb25zdCBE
T01TdHJpbmcmIC8qZmVhdHVyZSovKSBjb25zdAotewotICAgIC8vICMjIwotICAgIHJldHVybiAw
OwotfQotCi1Eb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlRG9jdW1l
bnQoIGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxp
ZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIERvY3VtZW50VHlwZUltcGwgKmRvY3R5cGUsIGludCAmZXhjZXB0aW9uY29kZSApCi17
Ci0gICAgZXhjZXB0aW9uY29kZSA9IDA7Ci0KLSAgICBpZiAoIXF1YWxpZmllZE5hbWUuaXNFbXB0
eSgpKSB7Ci0gICAgICAgIC8vIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBz
cGVjaWZpZWQgcXVhbGlmaWVkIG5hbWUgY29udGFpbnMgYW4gaWxsZWdhbCBjaGFyYWN0ZXIuCi0g
ICAgICAgIERPTVN0cmluZyBwcmVmaXgsIGxvY2FsTmFtZTsKLSAgICAgICAgaWYgKCFEb2N1bWVu
dEltcGw6OnBhcnNlUXVhbGlmaWVkTmFtZShxdWFsaWZpZWROYW1lLCBwcmVmaXgsIGxvY2FsTmFt
ZSkpIHsKLSAgICAgICAgICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OklOVkFMSURf
Q0hBUkFDVEVSX0VSUjsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAg
ICAgLy8gTkFNRVNQQUNFX0VSUjoKLSAgICAgICAgLy8gLSBSYWlzZWQgaWYgdGhlIHF1YWxpZmll
ZE5hbWUgaXMgbWFsZm9ybWVkLAotICAgICAgICAvLyAtIGlmIHRoZSBxdWFsaWZpZWROYW1lIGhh
cyBhIHByZWZpeCBhbmQgdGhlIG5hbWVzcGFjZVVSSSBpcyBudWxsLCBvcgotICAgICAgICAvLyAt
IGlmIHRoZSBxdWFsaWZpZWROYW1lIGhhcyBhIHByZWZpeCB0aGF0IGlzICJ4bWwiIGFuZCB0aGUg
bmFtZXNwYWNlVVJJIGlzIGRpZmZlcmVudAotICAgICAgICAvLyAgIGZyb20gImh0dHA6Ly93d3cu
dzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgW05hbWVzcGFjZXNdLgotICAgICAgICBpbnQgY29s
b25wb3MgPSAtMTsKLSAgICAgICAgdWludCBpOwotICAgICAgICBET01TdHJpbmdJbXBsICpxbmFt
ZSA9IHF1YWxpZmllZE5hbWUuaW1wbCgpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcW5hbWUt
PmwgJiYgY29sb25wb3MgPCAwOyBpKyspIHsKLSAgICAgICAgICAgIGlmICgoKnFuYW1lKVtpXSA9
PSAnOicpCi0gICAgICAgICAgICAgICAgY29sb25wb3MgPSBpOwotICAgICAgICB9Ci0gICAgCi0g
ICAgICAgIGlmIChxdWFsaWZpZWROYW1lSXNNYWxmb3JtZWQocXVhbGlmaWVkTmFtZSkgfHwKLSAg
ICAgICAgICAgIChjb2xvbnBvcyA+PSAwICYmIG5hbWVzcGFjZVVSSS5pc051bGwoKSkgfHwKLSAg
ICAgICAgICAgIChjb2xvbnBvcyA9PSAzICYmIHF1YWxpZmllZE5hbWVbMF0gPT0gJ3gnICYmIHF1
YWxpZmllZE5hbWVbMV0gPT0gJ20nICYmIHF1YWxpZmllZE5hbWVbMl0gPT0gJ2wnICYmCi0gICAg
ICAgICAgICAgbmFtZXNwYWNlVVJJICE9ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1l
c3BhY2UiKSkgewotCi0gICAgICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpO
QU1FU1BBQ0VfRVJSOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0g
ICAgCi0gICAgLy8gV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgZG9jdHlwZSBoYXMgYWxy
ZWFkeSBiZWVuIHVzZWQgd2l0aCBhIGRpZmZlcmVudCBkb2N1bWVudCBvciB3YXMKLSAgICAvLyBj
cmVhdGVkIGZyb20gYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCi0gICAgaWYgKGRvY3R5cGUg
JiYgKGRvY3R5cGUtPmdldERvY3VtZW50KCkgfHwgZG9jdHlwZS0+aW1wbGVtZW50YXRpb24oKSAh
PSB0aGlzKSkgewotICAgICAgICBleGNlcHRpb25jb2RlID0gRE9NRXhjZXB0aW9uOjpXUk9OR19E
T0NVTUVOVF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vICMjIyB0aGlz
IGlzIGNvbXBsZXRlbHkgYnJva2VuLi4gd2l0aG91dCBhIHZpZXcgaXQgd2lsbCBub3Qgd29yayAo
RGlyaykKLSAgICBEb2N1bWVudEltcGwgKmRvYyA9IG5ldyBEb2N1bWVudEltcGwodGhpcywgMCk7
Ci0KLSAgICAvLyBub3cgZ2V0IHRoZSBpbnRlcmVzdGluZyBwYXJ0cyBvZiB0aGUgZG9jdHlwZQot
ICAgIGlmIChkb2N0eXBlKQotICAgICAgICBkb2MtPnNldERvY1R5cGUobmV3IERvY3VtZW50VHlw
ZUltcGwoZG9jLCAqZG9jdHlwZSkpOwotCi0gICAgaWYgKCFxdWFsaWZpZWROYW1lLmlzRW1wdHko
KSkgewotICAgICAgICBFbGVtZW50SW1wbCAqcm9vdEVsZW1lbnQgPSBkb2MtPmNyZWF0ZUVsZW1l
bnROUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUsIGV4Y2VwdGlvbmNvZGUpOwotICAgICAg
ICBkb2MtPmFkZENoaWxkKHJvb3RFbGVtZW50KTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGRv
YzsKLX0KLQotQ1NTU3R5bGVTaGVldEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRl
Q1NTU3R5bGVTaGVldChjb25zdCBET01TdHJpbmcgJi8qdGl0bGUqLywgY29uc3QgRE9NU3RyaW5n
ICZtZWRpYSwgaW50ICYvKmV4Y2VwdGlvbiovKQotewotICAgIC8vICMjIyBUT0RPIDogdGl0bGUg
c2hvdWxkIGJlIHNldCwgYW5kIG1lZGlhIGNvdWxkIGhhdmUgd3Jvbmcgc3ludGF4LCBpbiB3aGlj
aCBjYXNlIHdlIHNob3VsZCBnZW5lcmF0ZSBhbiBleGNlcHRpb24uCi0gICAgQ1NTU3R5bGVTaGVl
dEltcGwgKiBjb25zdCBudWxsU2hlZXQgPSAwOwotICAgIENTU1N0eWxlU2hlZXRJbXBsICpzaGVl
dCA9IG5ldyBDU1NTdHlsZVNoZWV0SW1wbChudWxsU2hlZXQpOwotICAgIHNoZWV0LT5zZXRNZWRp
YShuZXcgTWVkaWFMaXN0SW1wbChzaGVldCwgbWVkaWEpKTsKLSAgICByZXR1cm4gc2hlZXQ7Ci19
Ci0KLURvY3VtZW50SW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVhdGVEb2N1bWVudCgg
S0hUTUxWaWV3ICp2ICkKLXsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50SW1wbCh0aGlzLCB2KTsK
LX0KLQotSFRNTERvY3VtZW50SW1wbCAqRE9NSW1wbGVtZW50YXRpb25JbXBsOjpjcmVhdGVIVE1M
RG9jdW1lbnQoIEtIVE1MVmlldyAqdiApCi17Ci0gICAgcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRJ
bXBsKHRoaXMsIHYpOwotfQotCi1ET01JbXBsZW1lbnRhdGlvbkltcGwgKkRPTUltcGxlbWVudGF0
aW9uSW1wbDo6aW5zdGFuY2UoKQotewotICAgIGlmICghbV9pbnN0YW5jZSkgewotICAgICAgICBt
X2luc3RhbmNlID0gbmV3IERPTUltcGxlbWVudGF0aW9uSW1wbCgpOwotICAgICAgICBtX2luc3Rh
bmNlLT5yZWYoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbV9pbnN0YW5jZTsKLX0KLQotYm9vbCBE
T01JbXBsZW1lbnRhdGlvbkltcGw6OmlzWE1MTUlNRVR5cGUoY29uc3QgRE9NU3RyaW5nJiBtaW1l
VHlwZSkKLXsKLSAgICBpZiAobWltZVR5cGUgPT0gInRleHQveG1sIiB8fCBtaW1lVHlwZSA9PSAi
YXBwbGljYXRpb24veG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24veGh0bWwreG1sIiB8
fAotICAgICAgICBtaW1lVHlwZSA9PSAidGV4dC94c2wiIHx8IG1pbWVUeXBlID09ICJhcHBsaWNh
dGlvbi9yc3MreG1sIiB8fCBtaW1lVHlwZSA9PSAiYXBwbGljYXRpb24vYXRvbSt4bWwiCi0jaWYg
U1ZHX1NVUFBPUlQKLSAgICAgICAgfHwgbWltZVR5cGUgPT0gImltYWdlL3N2Zyt4bWwiCi0jZW5k
aWYKLSAgICAgICAgKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLUhUTUxEb2N1bWVudEltcGwgKkRPTUltcGxlbWVudGF0aW9uSW1wbDo6Y3JlYXRlSFRNTERv
Y3VtZW50KGNvbnN0IERPTVN0cmluZyAmdGl0bGUpCi17Ci0gICAgSFRNTERvY3VtZW50SW1wbCAq
ZCA9IGNyZWF0ZUhUTUxEb2N1bWVudCggMCAvKiAjIyMgY3JlYXRlIGEgdmlldyBvdGhlcndpc2Ug
aXQgZG9lc24ndCB3b3JrICovKTsKLSAgICBkLT5vcGVuKCk7Ci0gICAgLy8gRklYTUU6IE5lZWQg
dG8gZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgdGl0bGU/Ci0gICAgZC0+d3JpdGUo
IjxodG1sPjxoZWFkPjx0aXRsZT4iICsgdGl0bGUucXN0cmluZygpICsgIjwvdGl0bGU+PC9oZWFk
PiIpOwotICAgIHJldHVybiBkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUVB0ckxpc3Q8
RG9jdW1lbnRJbXBsPiAqIERvY3VtZW50SW1wbDo6Y2hhbmdlZERvY3VtZW50cyA9IDA7Ci0KLS8v
IEtIVE1MVmlldyBtaWdodCBiZSAwCi1Eb2N1bWVudEltcGw6OkRvY3VtZW50SW1wbChET01JbXBs
ZW1lbnRhdGlvbkltcGwgKl9pbXBsZW1lbnRhdGlvbiwgS0hUTUxWaWV3ICp2KQotICAgIDogQ29u
dGFpbmVyTm9kZUltcGwoMCkKLSAgICAgICwgbV9kb210cmVlX3ZlcnNpb24oMCkKLSAgICAgICwg
bV90aXRsZSgiIikKLSAgICAgICwgbV90aXRsZVNldEV4cGxpY2l0bHkoZmFsc2UpCi0gICAgICAs
IG1faW1hZ2VMb2FkRXZlbnRUaW1lcigwKQotI2lmbmRlZiBLSFRNTF9OT19YQkwKLSAgICAgICwg
bV9iaW5kaW5nTWFuYWdlcihuZXcgWEJMQmluZGluZ01hbmFnZXIodGhpcykpCi0jZW5kaWYKLSNp
ZmRlZiBLSFRNTF9YU0xUCi0gICAgLCBtX3RyYW5zZm9ybVNvdXJjZSgwKQotI2VuZGlmCi0gICAg
LCBtX2ZpbmlzaGVkUGFyc2luZyh0aGlzLCBTSUdOQUwoZmluaXNoZWRQYXJzaW5nKCkpKQotICAg
ICwgbV9pblBhZ2VDYWNoZShmYWxzZSkKLSAgICAsIG1fc2F2ZWRSZW5kZXJlcigwKQotICAgICwg
bV9wYXNzd29yZEZpZWxkcygwKQotICAgICwgbV9zZWN1cmVGb3JtcygwKQotICAgICwgbV9jcmVh
dGVSZW5kZXJlcnModHJ1ZSkKLSAgICAsIG1fZGVzaWduTW9kZShpbmhlcml0KQotICAgICwgbV9o
YXNEYXNoYm9hcmRSZWdpb25zKGZhbHNlKQotICAgICwgbV9kYXNoYm9hcmRSZWdpb25zRGlydHko
ZmFsc2UpCi0gICAgLCBtX3NlbGZPbmx5UmVmQ291bnQoMCkKLSAgICAsIG1fc2VsZWN0ZWRSYWRp
b0J1dHRvbnMoMCkKLXsKLSAgICBkb2N1bWVudC5yZXNldFNraXBwaW5nUmVmKHRoaXMpOwotCi0g
ICAgbV9wYWludERldmljZSA9IDA7Ci0gICAgbV9wYWludERldmljZU1ldHJpY3MgPSAwOwotCi0g
ICAgbV92aWV3ID0gdjsKLSAgICBtX3JlbmRlckFyZW5hID0gMDsKLQotICAgIG1fYWNjQ2FjaGUg
PSAwOwotICAgIAotICAgIGlmICggdiApIHsKLSAgICAgICAgbV9kb2NMb2FkZXIgPSBuZXcgRG9j
TG9hZGVyKHYtPmZyYW1lKCksIHRoaXMgKTsKLSAgICAgICAgc2V0UGFpbnREZXZpY2UoIG1fdmll
dyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIG1fZG9jTG9hZGVyID0gbmV3IERvY0xvYWRl
ciggMCwgdGhpcyApOwotCi0gICAgdmlzdWFsbHlPcmRlcmVkID0gZmFsc2U7Ci0gICAgbV9sb2Fk
aW5nU2hlZXQgPSBmYWxzZTsKLSAgICBtX2JQYXJzaW5nID0gZmFsc2U7Ci0gICAgbV9kb2NDaGFu
Z2VkID0gZmFsc2U7Ci0gICAgbV9zaGVldCA9IDA7Ci0gICAgbV9lbGVtU2hlZXQgPSAwOwotICAg
IG1fdG9rZW5pemVyID0gMDsKLQotICAgIG1faW1wbGVtZW50YXRpb24gPSBfaW1wbGVtZW50YXRp
b247Ci0gICAgaWYgKG1faW1wbGVtZW50YXRpb24pCi0gICAgICAgIG1faW1wbGVtZW50YXRpb24t
PnJlZigpOwotICAgIHBNb2RlID0gU3RyaWN0OwotICAgIGhNb2RlID0gWEh0bWw7Ci0gICAgbV90
ZXh0Q29sb3IgPSBRdDo6YmxhY2s7Ci0gICAgbV9lbGVtZW50TmFtZXMgPSAwOwotICAgIG1fZWxl
bWVudE5hbWVBbGxvYyA9IDA7Ci0gICAgbV9lbGVtZW50TmFtZUNvdW50ID0gMDsKLSAgICBtX2F0
dHJOYW1lcyA9IDA7Ci0gICAgbV9hdHRyTmFtZUFsbG9jID0gMDsKLSAgICBtX2F0dHJOYW1lQ291
bnQgPSAwOwotICAgIG1fZGVmYXVsdFZpZXcgPSBuZXcgQWJzdHJhY3RWaWV3SW1wbCh0aGlzKTsK
LSAgICBtX2RlZmF1bHRWaWV3LT5yZWYoKTsKLSAgICBtX2xpc3RlbmVyVHlwZXMgPSAwOwotICAg
IG1fc3R5bGVTaGVldHMgPSBuZXcgU3R5bGVTaGVldExpc3RJbXBsOwotICAgIG1fc3R5bGVTaGVl
dHMtPnJlZigpOwotICAgIG1faW5Eb2N1bWVudCA9IHRydWU7Ci0gICAgbV9zdHlsZVNlbGVjdG9y
RGlydHkgPSBmYWxzZTsKLSAgICBtX2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICBtX2Nsb3Nl
QWZ0ZXJTdHlsZVJlY2FsYyA9IGZhbHNlOwotICAgIG1fdXNlc0Rlc2NlbmRhbnRSdWxlcyA9IGZh
bHNlOwotICAgIG1fdXNlc1NpYmxpbmdSdWxlcyA9IGZhbHNlOwotCi0gICAgbV9zdHlsZVNlbGVj
dG9yID0gbmV3IENTU1N0eWxlU2VsZWN0b3IodGhpcywgbV91c2Vyc2hlZXQsIG1fc3R5bGVTaGVl
dHMsICFpbkNvbXBhdE1vZGUoKSk7Ci0gICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5zZXRBdXRv
RGVsZXRlKHRydWUpOwotICAgIG1fcGVuZGluZ1N0eWxlc2hlZXRzID0gMDsKLSAgICBtX2lnbm9y
ZVBlbmRpbmdTdHlsZXNoZWV0cyA9IGZhbHNlOwotCi0gICAgbV9jc3NUYXJnZXQgPSAwOwotICAg
IG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0KLSAgICByZXNldExpbmtDb2xvcigpOwot
ICAgIHJlc2V0VmlzaXRlZExpbmtDb2xvcigpOwotICAgIHJlc2V0QWN0aXZlTGlua0NvbG9yKCk7
Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSBmYWxzZTsKLSAgICBtX3N0YXJ0VGltZS5y
ZXN0YXJ0KCk7Ci0gICAgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9sZCA9IGZhbHNlOwotICAg
IAotICAgIG1fanNFZGl0b3IgPSAwOwotCi0gICAgbV9tYXJrZXJzLnNldEF1dG9EZWxldGUodHJ1
ZSk7Ci0gICAgCi0gICAgc3RhdGljIGludCBkb2NJRCA9IDA7Ci0gICAgbV9kb2NJRCA9IGRvY0lE
Kys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVkTGFzdFJlZigpCi17Ci0gICAgaWYg
KG1fc2VsZk9ubHlSZWZDb3VudCkgewotICAgICAgICAvLyBpZiByZW1vdmluZyBhIGNoaWxkIHJl
bW92ZXMgdGhlIGxhc3Qgc2VsZi1vbmx5IHJlZiwgd2UgZG9uJ3QKLSAgICAgICAgLy8gd2FudCB0
aGUgZG9jdW1lbnQgdG8gYmUgZGVzdHJ1Y3RlZCB1bnRpbCBhZnRlcgotICAgICAgICAvLyByZW1v
dmVBbGxDaGlsZHJlbiByZXR1cm5zLCBzbyB3ZSBndWFyZCBvdXJzZWx2ZXMgd2l0aCBhbgotICAg
ICAgICAvLyBleHRyYSBzZWxmLW9ubHkgcmVmCi0KLSAgICAgICAgRG9jUHRyPERvY3VtZW50SW1w
bD4gZ3VhcmQodGhpcyk7Ci0KLSAgICAgICAgLy8gd2UgbXVzdCBtYWtlIHN1cmUgbm90IHRvIGJl
IHJldGFpbmluZyBhbnkgb2Ygb3VyIGNoaWxkcmVuIHRocm91Z2gKLSAgICAgICAgLy8gdGhlc2Ug
ZXh0cmEgcG9pbnRlcnMgb3Igd2Ugd2lsbCBjcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUKLSAgICAg
ICAgbV9kb2NUeXBlID0gMDsKLSAgICAgICAgbV9mb2N1c05vZGUgPSAwOwotICAgICAgICBtX2hv
dmVyTm9kZSA9IDA7Ci0gICAgICAgIG1fYWN0aXZlTm9kZSA9IDA7Ci0gICAgICAgIG1fdGl0bGVF
bGVtZW50ID0gMDsKLQotICAgICAgICByZW1vdmVBbGxDaGlsZHJlbigpOwotICAgIH0gZWxzZQot
ICAgICAgICBkZWxldGUgdGhpczsKLX0KLQotRG9jdW1lbnRJbXBsOjp+RG9jdW1lbnRJbXBsKCkK
LXsKLSAgICBhc3NlcnQoIW1fcmVuZGVyKTsKLSAgICBhc3NlcnQoIW1faW5QYWdlQ2FjaGUpOwot
ICAgIGFzc2VydChtX3NhdmVkUmVuZGVyZXIgPT0gMCk7Ci0gICAgCi0gICAgS0pTOjpTY3JpcHRJ
bnRlcnByZXRlcjo6Zm9yZ2V0QWxsRE9NTm9kZXNGb3JEb2N1bWVudCh0aGlzKTsKLQotICAgIGlm
IChjaGFuZ2VkRG9jdW1lbnRzICYmIG1fZG9jQ2hhbmdlZCkKLSAgICAgICAgY2hhbmdlZERvY3Vt
ZW50cy0+cmVtb3ZlKHRoaXMpOwotICAgIGRlbGV0ZSBtX3Rva2VuaXplcjsKLSAgICBkb2N1bWVu
dC5yZXNldFNraXBwaW5nUmVmKDApOwotICAgIGRlbGV0ZSBtX3NoZWV0OwotICAgIGRlbGV0ZSBt
X3N0eWxlU2VsZWN0b3I7Ci0gICAgZGVsZXRlIG1fZG9jTG9hZGVyOwotICAgIGlmIChtX2VsZW1T
aGVldCApICBtX2VsZW1TaGVldC0+ZGVyZWYoKTsKLSAgICBpZiAobV9pbXBsZW1lbnRhdGlvbikK
LSAgICAgICAgbV9pbXBsZW1lbnRhdGlvbi0+ZGVyZWYoKTsKLSAgICBkZWxldGUgbV9wYWludERl
dmljZU1ldHJpY3M7Ci0gICAgCi0gICAgaWYgKG1fZWxlbWVudE5hbWVzKSB7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgc2hvcnQgaWQgPSAwOyBpZCA8IG1fZWxlbWVudE5hbWVDb3VudDsgaWQrKykK
LSAgICAgICAgICAgIG1fZWxlbWVudE5hbWVzW2lkXS0+ZGVyZWYoKTsKLSAgICAgICAgZGVsZXRl
IFtdIG1fZWxlbWVudE5hbWVzOwotICAgIH0KLSAgICBpZiAobV9hdHRyTmFtZXMpIHsKLSAgICAg
ICAgZm9yICh1bnNpZ25lZCBzaG9ydCBpZCA9IDA7IGlkIDwgbV9hdHRyTmFtZUNvdW50OyBpZCsr
KQotICAgICAgICAgICAgbV9hdHRyTmFtZXNbaWRdLT5kZXJlZigpOwotICAgICAgICBkZWxldGUg
W10gbV9hdHRyTmFtZXM7Ci0gICAgfQotICAgIG1fZGVmYXVsdFZpZXctPmRlcmVmKCk7Ci0gICAg
bV9zdHlsZVNoZWV0cy0+ZGVyZWYoKTsKLQotICAgIGlmIChtX3JlbmRlckFyZW5hKXsKLSAgICAg
ICAgZGVsZXRlIG1fcmVuZGVyQXJlbmE7Ci0gICAgICAgIG1fcmVuZGVyQXJlbmEgPSAwOwotICAg
IH0KLQotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB4bWxGcmVlRG9jKCh4bWxEb2NQdHIpbV90cmFu
c2Zvcm1Tb3VyY2UpOwotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgZGVsZXRl
IG1fYmluZGluZ01hbmFnZXI7Ci0jZW5kaWYKLQotICAgIGlmIChtX2FjY0NhY2hlKXsKLSAgICAg
ICAgZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAgICAgIG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAg
ICBtX2RlY29kZXIgPSAwOwotICAgIAotICAgIGlmIChtX2pzRWRpdG9yKSB7Ci0gICAgICAgIGRl
bGV0ZSBtX2pzRWRpdG9yOwotICAgICAgICBtX2pzRWRpdG9yID0gMDsKLSAgICB9Ci0gICAgCi0g
ICAgaWYgKG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMpIHsKLSAgICAgICAgRm9ybVRvR3JvdXBNYXA6
Oml0ZXJhdG9yIGVuZCA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmVuZCgpOwotICAgICAgICBm
b3IgKEZvcm1Ub0dyb3VwTWFwOjppdGVyYXRvciBpdCA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMt
PmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgTmFtZVRvSW5wdXRNYXAg
Km4gPSBpdC0+c2Vjb25kOwotICAgICAgICAgICAgaWYgKG4pCi0gICAgICAgICAgICAgICAgZGVs
ZXRlIG47Ci0gICAgICAgIH0KLSAgICAgICAgZGVsZXRlIG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnM7
Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVzZXRMaW5rQ29sb3IoKQotewotICAg
IG1fbGlua0NvbG9yID0gUUNvbG9yKDAsIDAsIDIzOCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBs
OjpyZXNldFZpc2l0ZWRMaW5rQ29sb3IoKQotewotICAgIG1fdmlzaXRlZExpbmtDb2xvciA9IFFD
b2xvcig4NSwgMjYsIDEzOSk7ICAgIAotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVzZXRBY3Rp
dmVMaW5rQ29sb3IoKQotewotICAgIG1fYWN0aXZlTGlua0NvbG9yLnNldE5hbWVkQ29sb3IoUVN0
cmluZygicmVkIikpOwotfQotCi1Eb2N1bWVudFR5cGVJbXBsICpEb2N1bWVudEltcGw6OmRvY3R5
cGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2RvY1R5cGUuZ2V0KCk7Ci19Ci0KLURPTUltcGxl
bWVudGF0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjppbXBsZW1lbnRhdGlvbigpIGNvbnN0Ci17Ci0g
ICAgcmV0dXJuIG1faW1wbGVtZW50YXRpb247Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudElt
cGw6OmRvY3VtZW50RWxlbWVudCgpIGNvbnN0Ci17Ci0gICAgTm9kZUltcGwgKm4gPSBmaXJzdENo
aWxkKCk7Ci0gICAgd2hpbGUgKG4gJiYgbi0+bm9kZVR5cGUoKSAhPSBOb2RlOjpFTEVNRU5UX05P
REUpCi0gICAgICBuID0gbi0+bmV4dFNpYmxpbmcoKTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RWxlbWVudEltcGwqPihuKTsKLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRl
RWxlbWVudChjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uQ29kZSkKLXsKLSAg
ICByZXR1cm4gY3JlYXRlRWxlbWVudE5TKG51bGxBdG9tLCBuYW1lLCBleGNlcHRpb25Db2RlKTsK
LX0KLQotRG9jdW1lbnRGcmFnbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlRG9jdW1lbnRG
cmFnbWVudCggICkKLXsKLSAgICByZXR1cm4gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKGdldERv
Y3VtZW50KCkpOwotfQotCi1UZXh0SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVUZXh0Tm9kZShj
b25zdCBET01TdHJpbmcgJmRhdGEpCi17Ci0gICAgcmV0dXJuIG5ldyBUZXh0SW1wbCh0aGlzLCBk
YXRhKTsKLX0KLQotQ29tbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQ29tbWVudCAoY29u
c3QgRE9NU3RyaW5nICZkYXRhKQotewotICAgIHJldHVybiBuZXcgQ29tbWVudEltcGwodGhpcywg
ZGF0YSk7Ci19Ci0KLUNEQVRBU2VjdGlvbkltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQ0RBVEFT
ZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRpb24pCi17Ci0gICAgaWYg
KGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZXhjZXB0aW9uID0gRE9NRXhjZXB0aW9uOjpO
T1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVy
biBuZXcgQ0RBVEFTZWN0aW9uSW1wbCh0aGlzLCBkYXRhKTsKLX0KLQotUHJvY2Vzc2luZ0luc3Ry
dWN0aW9uSW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oY29u
c3QgRE9NU3RyaW5nICZ0YXJnZXQsIGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNlcHRp
b24pCi17Ci0gICAgaWYgKCFpc1ZhbGlkTmFtZSh0YXJnZXQpKSB7Ci0gICAgICAgIGV4Y2VwdGlv
biA9IERPTUV4Y2VwdGlvbjo6SU5WQUxJRF9DSEFSQUNURVJfRVJSOwotICAgICAgICByZXR1cm4g
TlVMTDsKLSAgICB9Ci0gICAgaWYgKGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAgZXhjZXB0
aW9uID0gRE9NRXhjZXB0aW9uOjpOT1RfU1VQUE9SVEVEX0VSUjsKLSAgICAgICAgcmV0dXJuIE5V
TEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlz
LCB0YXJnZXQsIGRhdGEpOwotfQotCi1FbnRpdHlSZWZlcmVuY2VJbXBsICpEb2N1bWVudEltcGw6
OmNyZWF0ZUVudGl0eVJlZmVyZW5jZShjb25zdCBET01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0
aW9uKQotewotICAgIGlmICghaXNWYWxpZE5hbWUobmFtZSkpIHsKLSAgICAgICAgZXhjZXB0aW9u
ID0gRE9NRXhjZXB0aW9uOjpJTlZBTElEX0NIQVJBQ1RFUl9FUlI7Ci0gICAgICAgIHJldHVybiBO
VUxMOwotICAgIH0KLSAgICBpZiAoaXNIVE1MRG9jdW1lbnQoKSkgewotICAgICAgICBleGNlcHRp
b24gPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAgICAgICByZXR1cm4gTlVM
TDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKHRoaXMsIG5hbWUu
aW1wbCgpKTsKLX0KLQotRWRpdGluZ1RleHRJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVkaXRp
bmdUZXh0Tm9kZShjb25zdCBET01TdHJpbmcgJnRleHQpCi17Ci0gICAgcmV0dXJuIG5ldyBFZGl0
aW5nVGV4dEltcGwodGhpcywgdGV4dCk7Ci19Ci0KLUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsICpE
b2N1bWVudEltcGw6OmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKQotewotICAgIHJldHVybiBu
ZXcgQ1NTTXV0YWJsZVN0eWxlRGVjbGFyYXRpb25JbXBsOwotfQotCi1Ob2RlSW1wbCAqRG9jdW1l
bnRJbXBsOjppbXBvcnROb2RlKE5vZGVJbXBsICppbXBvcnRlZE5vZGUsIGJvb2wgZGVlcCwgaW50
ICZleGNlcHRpb25jb2RlKQotewotICAgIGV4Y2VwdGlvbmNvZGUgPSAwOwotCi0gICAgc3dpdGNo
IChpbXBvcnRlZE5vZGUtPm5vZGVUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBOb2RlOjpURVhUX05P
REU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlVGV4dE5vZGUoaW1wb3J0ZWROb2RlLT5ub2Rl
VmFsdWUoKSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6Q0RBVEFfU0VDVElPTl9OT0RFOgotICAgICAg
ICAgICAgcmV0dXJuIGNyZWF0ZUNEQVRBU2VjdGlvbihpbXBvcnRlZE5vZGUtPm5vZGVWYWx1ZSgp
LCBleGNlcHRpb25jb2RlKTsKLSAgICAgICAgY2FzZSBOb2RlOjpFTlRJVFlfUkVGRVJFTkNFX05P
REU6Ci0gICAgICAgICAgICByZXR1cm4gY3JlYXRlRW50aXR5UmVmZXJlbmNlKGltcG9ydGVkTm9k
ZS0+bm9kZU5hbWUoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VT
U0lOR19JTlNUUlVDVElPTl9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2Nlc3Np
bmdJbnN0cnVjdGlvbihpbXBvcnRlZE5vZGUtPm5vZGVOYW1lKCksIGltcG9ydGVkTm9kZS0+bm9k
ZVZhbHVlKCksIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9E
RToKLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb21tZW50KGltcG9ydGVkTm9kZS0+bm9kZVZh
bHVlKCkpOwotICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERTogewotICAgICAgICAgICAg
RWxlbWVudEltcGwgKm9sZEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCAqPihpbXBv
cnRlZE5vZGUpOwotICAgICAgICAgICAgRWxlbWVudEltcGwgKm5ld0VsZW1lbnQgPSBjcmVhdGVF
bGVtZW50TlMob2xkRWxlbWVudC0+bmFtZXNwYWNlVVJJKCksIG9sZEVsZW1lbnQtPnRhZ05hbWUo
KS50b1N0cmluZygpLCBleGNlcHRpb25jb2RlKTsKLQkJCQotICAgICAgICAgICAgaWYgKGV4Y2Vw
dGlvbmNvZGUgIT0gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAgICAg
bmV3RWxlbWVudC0+cmVmKCk7Ci0KLSAgICAgICAgICAgIE5hbWVkQXR0ck1hcEltcGwgKmF0dHJz
ID0gb2xkRWxlbWVudC0+YXR0cmlidXRlcyh0cnVlKTsKLSAgICAgICAgICAgIGlmIChhdHRycykg
ewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9IGF0dHJzLT5sZW5ndGgoKTsKLSAg
ICAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAg
ICAgICAgICAgICAgICAgICAgQXR0cmlidXRlSW1wbCogYXR0ciA9IGF0dHJzLT5hdHRyaWJ1dGVJ
dGVtKGkpOwotICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5zZXRBdHRyaWJ1dGUoYXR0
ci0+bmFtZSgpLCBhdHRyLT52YWx1ZSgpLmltcGwoKSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgICAg
ICAgICAgICAgICAgIGlmIChleGNlcHRpb25jb2RlICE9IDApIHsKLSAgICAgICAgICAgICAgICAg
ICAgICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1
cm4gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIH0KLQotICAgICAgICAgICAgbmV3RWxlbWVudC0+Y29weU5vbkF0dHJpYnV0ZVByb3BlcnRp
ZXMob2xkRWxlbWVudCk7Ci0KLSAgICAgICAgICAgIGlmIChkZWVwKSB7Ci0gICAgICAgICAgICAg
ICAgZm9yIChOb2RlSW1wbCAqb2xkQ2hpbGQgPSBvbGRFbGVtZW50LT5maXJzdENoaWxkKCk7IG9s
ZENoaWxkOyBvbGRDaGlsZCA9IG9sZENoaWxkLT5uZXh0U2libGluZygpKSB7Ci0gICAgICAgICAg
ICAgICAgICAgIE5vZGVJbXBsICpuZXdDaGlsZCA9IGltcG9ydE5vZGUob2xkQ2hpbGQsIHRydWUs
IGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAh
PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAg
ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAg
ICAgICAgICAgICAgICAgICAgbmV3RWxlbWVudC0+YXBwZW5kQ2hpbGQobmV3Q2hpbGQsIGV4Y2Vw
dGlvbmNvZGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXB0aW9uY29kZSAhPSAwKSB7
Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdFbGVtZW50LT5kZXJlZigpOwotICAgICAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRyaWNrIHRvIGdldCB0
aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZsb2F0aW5nIHN0YXRlLCB3aXRoIDAgcmVmcyBidXQgbm90
IGRlc3Ryb3llZC4KLSAgICAgICAgICAgIG5ld0VsZW1lbnQtPnNldFBhcmVudCh0aGlzKTsKLSAg
ICAgICAgICAgIG5ld0VsZW1lbnQtPmRlcmVmKCk7Ci0gICAgICAgICAgICBuZXdFbGVtZW50LT5z
ZXRQYXJlbnQoMCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50OwotICAgICAgICB9
Ci0gICAgfQotCi0gICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRF
RF9FUlI7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLQotTm9kZUltcGwgKkRvY3VtZW50SW1wbDo6YWRv
cHROb2RlKE5vZGVJbXBsICpzb3VyY2UsIGludCAmZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAo
IXNvdXJjZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgUmVmUHRyPE5vZGVJbXBsPiBw
cm90ZWN0KHNvdXJjZSk7Ci0KLSAgICBzd2l0Y2ggKHNvdXJjZS0+bm9kZVR5cGUoKSkgewotICAg
ICAgICBjYXNlIE5vZGU6OkVOVElUWV9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6Ok5PVEFUSU9O
X05PREU6Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBOb2RlOjpET0NVTUVO
VF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkRPQ1VNRU5UX1RZUEVfTk9ERToKLSAgICAgICAg
ICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAg
ICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgCi0gICAgICAgIGNhc2UgTm9kZTo6QVRUUklC
VVRFX05PREU6IHsgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBBdHRySW1wbCAqYXR0
ciA9IHN0YXRpY19jYXN0PEF0dHJJbXBsICo+KHNvdXJjZSk7Ci0gICAgICAgICAgICAKLSAgICAg
ICAgICAgIGlmIChhdHRyLT5vd25lckVsZW1lbnQoKSkKLSAgICAgICAgICAgICAgICBhdHRyLT5v
d25lckVsZW1lbnQoKS0+cmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyLCBleGNlcHRpb25jb2RlKTsK
LQotICAgICAgICAgICAgYXR0ci0+bV9zcGVjaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJl
YWs7Ci0gICAgICAgIH0gICAgICAgCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAo
c291cmNlLT5wYXJlbnROb2RlKCkpCi0gICAgICAgICAgICAgICAgc291cmNlLT5wYXJlbnROb2Rl
KCktPnJlbW92ZUNoaWxkKHNvdXJjZSwgZXhjZXB0aW9uY29kZSk7Ci0gICAgfQotICAgICAgICAg
ICAgICAgIAotICAgIGZvciAoTm9kZUltcGwgKm5vZGUgPSBzb3VyY2U7IG5vZGU7IG5vZGUgPSBu
b2RlLT50cmF2ZXJzZU5leHROb2RlKHNvdXJjZSkpIHsKLSAgICAgICAgS0pTOjpTY3JpcHRJbnRl
cnByZXRlcjo6dXBkYXRlRE9NTm9kZURvY3VtZW50KG5vZGUsIG5vZGUtPmdldERvY3VtZW50KCks
IHRoaXMpOwotICAgICAgICBub2RlLT5zZXREb2N1bWVudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBy
ZXR1cm4gc291cmNlOwotCi19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmNyZWF0ZUVs
ZW1lbnROUyhjb25zdCBET01TdHJpbmcgJl9uYW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAm
cXVhbGlmaWVkTmFtZSwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIC8vIEZJWE1FOiBXZSdk
IGxpa2UgYSBmYXN0ZXIgY29kZSBwYXRoIHRoYXQgc2tpcHMgdGhpcyBjaGVjayBmb3IgY2FsbHMg
ZnJvbSBpbnNpZGUgdGhlIGVuZ2luZSB3aGVyZSB0aGUgbmFtZSBpcyBrbm93biB0byBiZSB2YWxp
ZC4KLSAgICBET01TdHJpbmcgcHJlZml4LCBsb2NhbE5hbWU7Ci0gICAgaWYgKCFwYXJzZVF1YWxp
ZmllZE5hbWUocXVhbGlmaWVkTmFtZSwgcHJlZml4LCBsb2NhbE5hbWUpKSB7Ci0gICAgICAgIGV4
Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFDVEVSX0VSUjsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgRWxlbWVudEltcGwgKmUgPSAwOwotICAgIFF1YWxp
ZmllZE5hbWUgcU5hbWUgPSBRdWFsaWZpZWROYW1lKEF0b21pY1N0cmluZyhwcmVmaXgpLCBBdG9t
aWNTdHJpbmcobG9jYWxOYW1lKSwgQXRvbWljU3RyaW5nKF9uYW1lc3BhY2VVUkkpKTsKLSAgICAK
LSAgICAvLyBGSVhNRTogVXNlIHJlZ2lzdGVyZWQgbmFtZXNwYWNlcyBhbmQgbG9vayB1cCBpbiBh
IGhhc2ggdG8gZmluZCB0aGUgcmlnaHQgZmFjdG9yeS4KLSAgICBpZiAoX25hbWVzcGFjZVVSSSA9
PSB4aHRtbE5hbWVzcGFjZVVSSSkgewotICAgICAgICBlID0gSFRNTEVsZW1lbnRGYWN0b3J5Ojpj
cmVhdGVIVE1MRWxlbWVudChxTmFtZS5sb2NhbE5hbWUoKSwgdGhpcywgMCwgZmFsc2UpOwotICAg
ICAgICBpZiAoZSAmJiAhcHJlZml4LmlzTnVsbCgpKSB7Ci0gICAgICAgICAgICBlLT5zZXRQcmVm
aXgocU5hbWUucHJlZml4KCksIGV4Y2VwdGlvbmNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2Vw
dGlvbmNvZGUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0j
aWYgU1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChfbmFtZXNwYWNlVVJJID09IEtTVkc6OlNWR05h
bWVzOjpzdmdOYW1lc3BhY2VVUkkpCi0gICAgICAgIGUgPSBLU1ZHOjpTVkdFbGVtZW50RmFjdG9y
eTo6Y3JlYXRlU1ZHRWxlbWVudChxTmFtZSwgdGhpcywgZmFsc2UpOwotI2VuZGlmCi0gICAgCi0g
ICAgaWYgKCFlKQotICAgICAgICBlID0gbmV3IEVsZW1lbnRJbXBsKHFOYW1lLCBnZXREb2N1bWVu
dCgpKTsKLSAgICAKLSAgICByZXR1cm4gZTsKLX0KLQotRWxlbWVudEltcGwgKkRvY3VtZW50SW1w
bDo6Z2V0RWxlbWVudEJ5SWQoIGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkICkgY29uc3QKLXsK
LSAgICBFbGVtZW50SW1wbCAqZWxlbWVudDsKLSAgICBRU3RyaW5nIHFJZCA9IGVsZW1lbnRJZC5x
c3RyaW5nKCk7Ci0KLSAgICBpZiAoZWxlbWVudElkLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgfQotCi0gICAgZWxlbWVudCA9IG1fZWxlbWVudHNCeUlkLmZpbmQocUlk
KTsKLSAgICAKLSAgICBpZiAoZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIGVsZW1lbnQ7Ci0gICAg
ICAgIAotICAgIGlmIChpbnQgaWRDb3VudCA9IChpbnQpbV9pZENvdW50LmZpbmQocUlkKSkgewot
ICAgICAgICBmb3IgKE5vZGVJbXBsICpuID0gdHJhdmVyc2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4g
PSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLSAgICAgICAgICAgIGlmICghbi0+aXNFbGVtZW50
Tm9kZSgpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBlbGVtZW50ID0gc3RhdGljX2Nhc3Q8RWxlbWVudEltcGwgKj4obik7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIGlmIChlbGVtZW50LT5oYXNJRCgpICYmIGVsZW1lbnQtPmdldEF0dHJp
YnV0ZShpZEF0dHIpID09IGVsZW1lbnRJZCkgewotICAgICAgICAgICAgICAgIGlmIChpZENvdW50
ID09IDEpIAotICAgICAgICAgICAgICAgICAgICBtX2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0gICAg
ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtX2lkQ291bnQuaW5zZXJ0KHFJ
ZCwgKGNoYXIgKilpZENvdW50IC0gMSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAg
ICAgbV9lbGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwgZWxlbWVudCk7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIGVsZW1lbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLUVsZW1lbnRJbXBsICpEb2N1bWVudEltcGw6OmVsZW1lbnRGcm9tUG9pbnQo
IGNvbnN0IGludCBfeCwgY29uc3QgaW50IF95ICkgY29uc3QKLXsKLSAgICBpZiAoIW1fcmVuZGVy
KSByZXR1cm4gMDsKLSAgICAKLSAgICBSZW5kZXJPYmplY3Q6Ok5vZGVJbmZvIG5vZGVJbmZvKHRy
dWUsIHRydWUpOwotICAgIG1fcmVuZGVyLT5sYXllcigpLT5oaXRUZXN0KG5vZGVJbmZvLCBfeCwg
X3kpOyAKLSAgICBOb2RlSW1wbCogbiA9IG5vZGVJbmZvLmlubmVyTm9kZSgpOwotCi0gICAgd2hp
bGUgKCBuICYmICFuLT5pc0VsZW1lbnROb2RlKCkgKSB7Ci0gICAgICAgIG4gPSBuLT5wYXJlbnRO
b2RlKCk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50SW1wbCo+
KG4pOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkRWxlbWVudEJ5SWQoY29uc3QgRE9NU3Ry
aW5nICZlbGVtZW50SWQsIEVsZW1lbnRJbXBsICplbGVtZW50KQotewotICAgIFFTdHJpbmcgcUlk
ID0gZWxlbWVudElkLnFzdHJpbmcoKTsKLSAgICAKLSAgICBpZiAobV9lbGVtZW50c0J5SWQuZmlu
ZChxSWQpID09IE5VTEwpIHsKLSAgICAgICAgbV9lbGVtZW50c0J5SWQuaW5zZXJ0KHFJZCwgZWxl
bWVudCk7Ci0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0gICAgfSBlbHNl
IHsKLSAgICAgICAgaW50IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5maW5kKHFJZCk7Ci0gICAg
ICAgIG1faWRDb3VudC5pbnNlcnQocUlkLCAoY2hhciAqKShpZENvdW50ICsgMSkpOwotICAgIH0K
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZUVsZW1lbnRCeUlkKGNvbnN0IERPTVN0cmlu
ZyAmZWxlbWVudElkLCBFbGVtZW50SW1wbCAqZWxlbWVudCkKLXsKLSAgICBRU3RyaW5nIHFJZCA9
IGVsZW1lbnRJZC5xc3RyaW5nKCk7Ci0KLSAgICBpZiAobV9lbGVtZW50c0J5SWQuZmluZChxSWQp
ID09IGVsZW1lbnQpIHsKLSAgICAgICAgbV9lbGVtZW50c0J5SWQucmVtb3ZlKHFJZCk7Ci0gICAg
ICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAg
aW50IGlkQ291bnQgPSAoaW50KW1faWRDb3VudC5maW5kKHFJZCk7ICAgICAgICAKLSAgICAgICAg
YXNzZXJ0KGlkQ291bnQgPiAwKTsKLSAgICAgICAgaWYgKGlkQ291bnQgPT0gMSkgCi0gICAgICAg
ICAgICBtX2lkQ291bnQucmVtb3ZlKHFJZCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1f
aWRDb3VudC5pbnNlcnQocUlkLCAoY2hhciAqKShpZENvdW50IC0gMSkpOwotICAgIH0KLX0KLQot
RWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KCBjb25zdCBE
T01TdHJpbmcgJmtleSApCi17Ci0gICAgaWYgKCFrZXkubGVuZ3RoKCkpCi0JcmV0dXJuIDA7Ci0K
LSAgICBpZiAoIW1fYWNjZXNzS2V5RGljdFZhbGlkKSB7Ci0gICAgICAgIG1fZWxlbWVudHNCeUFj
Y2Vzc0tleS5jbGVhcigpOwotICAgIAotICAgICAgICBjb25zdCBOb2RlSW1wbCAqbjsKLSAgICAg
ICAgZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0Tm9kZSgpKSB7Ci0g
ICAgICAgICAgICBpZiAoIW4tPmlzRWxlbWVudE5vZGUoKSkKLSAgICAgICAgICAgICAgICBjb250
aW51ZTsKLSAgICAgICAgICAgIGNvbnN0IEVsZW1lbnRJbXBsICplbGVtZW50SW1wbCA9IHN0YXRp
Y19jYXN0PGNvbnN0IEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICAgICAgRE9NU3RyaW5nIGFj
Y2Vzc0tleShlbGVtZW50SW1wbC0+Z2V0QXR0cmlidXRlKGFjY2Vzc2tleUF0dHIpKTs7Ci0gICAg
ICAgICAgICBpZiAoIWFjY2Vzc0tleS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBRU3Ry
aW5nIGFrID0gYWNjZXNzS2V5LnFzdHJpbmcoKS5sb3dlcigpOwotICAgICAgICAgICAgICAgIGlm
IChtX2VsZW1lbnRzQnlBY2Nlc3NLZXkuZmluZChhaykgPT0gTlVMTCkKLSAgICAgICAgICAgICAg
ICAgICAgbV9lbGVtZW50c0J5QWNjZXNzS2V5Lmluc2VydChhaywgZWxlbWVudEltcGwpOwotICAg
ICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fYWNjZXNzS2V5RGljdFZhbGlkID0gdHJ1
ZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fZWxlbWVudHNCeUFjY2Vzc0tleS5maW5kKGtleS5xc3Ry
aW5nKCkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlVGl0bGUoKQotewotICAgIEZy
YW1lICpwID0gZnJhbWUoKTsKLSAgICBpZiAoIXApCi0gICAgICAgIHJldHVybjsKLQotICAgIE1h
YyhwKS0+c2V0VGl0bGUobV90aXRsZSk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRUaXRs
ZShET01TdHJpbmcgdGl0bGUsIE5vZGVJbXBsICp0aXRsZUVsZW1lbnQpCi17Ci0gICAgaWYgKCF0
aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgLy8gVGl0bGUgc2V0IGJ5IEphdmFTY3JpcHQgLS0gb3Zl
cnJpZGVzIGFueSB0aXRsZSBlbGVtZW50cy4KLSAgICAgICAgbV90aXRsZVNldEV4cGxpY2l0bHkg
PSB0cnVlOwotICAgICAgICBtX3RpdGxlRWxlbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh0aXRs
ZUVsZW1lbnQgIT0gbV90aXRsZUVsZW1lbnQpIHsKLSAgICAgICAgaWYgKG1fdGl0bGVFbGVtZW50
KQotICAgICAgICAgICAgLy8gT25seSBhbGxvdyB0aGUgZmlyc3QgdGl0bGUgZWxlbWVudCB0byBj
aGFuZ2UgdGhlIHRpdGxlIC0tIG90aGVycyBoYXZlIG5vIGVmZmVjdC4KLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgbV90aXRsZUVsZW1lbnQgPSB0aXRsZUVsZW1lbnQ7Ci0gICAgfQotCi0g
ICAgaWYgKG1fdGl0bGUgPT0gdGl0bGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1fdGl0bGUg
PSB0aXRsZTsKLSAgICB1cGRhdGVUaXRsZSgpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVt
b3ZlVGl0bGUoTm9kZUltcGwgKnRpdGxlRWxlbWVudCkKLXsKLSAgICBpZiAobV90aXRsZUVsZW1l
bnQgIT0gdGl0bGVFbGVtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBGSVhNRTogSWRl
YWxseSB3ZSBtaWdodCB3YW50IHRoaXMgdG8gc2VhcmNoIGZvciB0aGUgZmlyc3QgcmVtYWluaW5n
IHRpdGxlIGVsZW1lbnQsIGFuZCB1c2UgaXQuCi0gICAgbV90aXRsZUVsZW1lbnQgPSAwOwotCi0g
ICAgaWYgKCFtX3RpdGxlLmlzRW1wdHkoKSkgewotICAgICAgICBtX3RpdGxlID0gIiI7Ci0gICAg
ICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgfQotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRJbXBsOjpu
b2RlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuICIjZG9jdW1lbnQiOwotfQotCi11bnNpZ25l
ZCBzaG9ydCBEb2N1bWVudEltcGw6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gTm9k
ZTo6RE9DVU1FTlRfTk9ERTsKLX0KLQotUVN0cmluZyBEb2N1bWVudEltcGw6Om5leHRTdGF0ZSgp
Ci17Ci0gICBRU3RyaW5nIHN0YXRlOwotICAgaWYgKCFtX3N0YXRlLmlzRW1wdHkoKSkKLSAgIHsK
LSAgICAgIHN0YXRlID0gbV9zdGF0ZS5maXJzdCgpOwotICAgICAgbV9zdGF0ZS5yZW1vdmUobV9z
dGF0ZS5iZWdpbigpKTsKLSAgIH0KLSAgIHJldHVybiBzdGF0ZTsKLX0KLQotUVN0cmluZ0xpc3Qg
RG9jdW1lbnRJbXBsOjpkb2NTdGF0ZSgpCi17Ci0gICAgUVN0cmluZ0xpc3QgczsKLSAgICBmb3Ig
KFFQdHJMaXN0SXRlcmF0b3I8Tm9kZUltcGw+IGl0KG1fbWFpbnRhaW5zU3RhdGUpOyBpdC5jdXJy
ZW50KCk7ICsraXQpCi0gICAgICAgIHMuYXBwZW5kKGl0LmN1cnJlbnQoKS0+c3RhdGUoKSk7Ci0K
LSAgICByZXR1cm4gczsKLX0KLQotRnJhbWUgKkRvY3VtZW50SW1wbDo6ZnJhbWUoKSBjb25zdCAK
LXsKLSAgICByZXR1cm4gbV92aWV3ID8gbV92aWV3LT5mcmFtZSgpIDogMDsgCi19Ci0KLVJhbmdl
SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVSYW5nZSgpCi17Ci0gICAgcmV0dXJuIG5ldyBSYW5n
ZUltcGwodGhpcyk7Ci19Ci0KLU5vZGVJdGVyYXRvckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRl
Tm9kZUl0ZXJhdG9yKE5vZGVJbXBsICpyb290LCB1bnNpZ25lZCB3aGF0VG9TaG93LCAKLSAgICBO
b2RlRmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMsIGludCAm
ZXhjZXB0aW9uY29kZSkKLXsKLSAgICBpZiAoIXJvb3QpIHsKLSAgICAgICAgZXhjZXB0aW9uY29k
ZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0gICAgICAgIHJldHVybiAwOwot
ICAgIH0KLSAgICByZXR1cm4gbmV3IE5vZGVJdGVyYXRvckltcGwocm9vdCwgd2hhdFRvU2hvdywg
ZmlsdGVyLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLX0KLQotVHJlZVdhbGtlckltcGwgKkRv
Y3VtZW50SW1wbDo6Y3JlYXRlVHJlZVdhbGtlcihOb2RlSW1wbCAqcm9vdCwgdW5zaWduZWQgd2hh
dFRvU2hvdywgCi0gICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBhbmRFbnRpdHlS
ZWZlcmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUpCi17Ci0gICAgaWYgKCFyb290KSB7Ci0gICAg
ICAgIGV4Y2VwdGlvbmNvZGUgPSBET01FeGNlcHRpb246Ok5PVF9TVVBQT1JURURfRVJSOwotICAg
ICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBUcmVlV2Fsa2VySW1wbChyb290
LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotfQotCi12b2lk
IERvY3VtZW50SW1wbDo6c2V0RG9jdW1lbnRDaGFuZ2VkKGJvb2wgYikKLXsKLSAgICBpZiAoIWNo
YW5nZWREb2N1bWVudHMpCi0gICAgICAgIGNoYW5nZWREb2N1bWVudHMgPSBuZXcgUVB0ckxpc3Q8
RG9jdW1lbnRJbXBsPjsKLQotICAgIGlmIChiICYmICFtX2RvY0NoYW5nZWQpCi0gICAgICAgIGNo
YW5nZWREb2N1bWVudHMtPmFwcGVuZCh0aGlzKTsKLSAgICBlbHNlIGlmICghYiAmJiBtX2RvY0No
YW5nZWQpCi0gICAgICAgIGNoYW5nZWREb2N1bWVudHMtPnJlbW92ZSh0aGlzKTsKLSAgICBtX2Rv
Y0NoYW5nZWQgPSBiOwotICAgIAotICAgIGlmIChtX2RvY0NoYW5nZWQpCi0gICAgICAgIG1fYWNj
ZXNzS2V5RGljdFZhbGlkID0gZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZWNhbGNT
dHlsZSggU3R5bGVDaGFuZ2UgY2hhbmdlICkKLXsKLS8vICAgICBxRGVidWcoInJlY2FsY1N0eWxl
KCVwKSIsIHRoaXMpOwotLy8gICAgIFFUaW1lIHF0OwotLy8gICAgIHF0LnN0YXJ0KCk7Ci0gICAg
aWYgKG1faW5TdHlsZVJlY2FsYykKLSAgICAgICAgcmV0dXJuOyAvLyBHdWFyZCBhZ2FpbnN0IHJl
LWVudHJhbmN5LiAtZHdoCi0gICAgICAgIAotICAgIG1faW5TdHlsZVJlY2FsYyA9IHRydWU7Ci0g
ICAgCi0gICAgaWYoICFtX3JlbmRlciApIGdvdG8gYmFpbF9vdXQ7Ci0KLSAgICBpZiAoIGNoYW5n
ZSA9PSBGb3JjZSApIHsKLSAgICAgICAgUmVuZGVyU3R5bGUqIG9sZFN0eWxlID0gbV9yZW5kZXIt
PnN0eWxlKCk7Ci0gICAgICAgIGlmICggb2xkU3R5bGUgKSBvbGRTdHlsZS0+cmVmKCk7Ci0gICAg
ICAgIFJlbmRlclN0eWxlKiBfc3R5bGUgPSBuZXcgKG1fcmVuZGVyQXJlbmEpIFJlbmRlclN0eWxl
KCk7Ci0gICAgICAgIF9zdHlsZS0+cmVmKCk7Ci0gICAgICAgIF9zdHlsZS0+c2V0RGlzcGxheShC
TE9DSyk7Ci0gICAgICAgIF9zdHlsZS0+c2V0VmlzdWFsbHlPcmRlcmVkKCB2aXN1YWxseU9yZGVy
ZWQgKTsKLSAgICAgICAgLy8gIyMjIG1ha2UgdGhlIGZvbnQgc3R1ZmYgX3JlYWxseV8gd29yayEh
ISEKLQotCWtodG1sOjpGb250RGVmIGZvbnREZWY7Ci0JUUZvbnQgZiA9IEtHbG9iYWxTZXR0aW5n
czo6Z2VuZXJhbEZvbnQoKTsKLQlmb250RGVmLmZhbWlseSA9ICooZi5maXJzdEZhbWlseSgpKTsK
LQlmb250RGVmLml0YWxpYyA9IGYuaXRhbGljKCk7Ci0JZm9udERlZi53ZWlnaHQgPSBmLndlaWdo
dCgpOwotICAgICAgICBib29sIHByaW50aW5nID0gbV9wYWludERldmljZSAmJiAobV9wYWludERl
dmljZS0+ZGV2VHlwZSgpID09IFFJbnRlcm5hbDo6UHJpbnRlcik7Ci0gICAgICAgIGZvbnREZWYu
dXNlUHJpbnRlckZvbnQgPSBwcmludGluZzsKLSAgICAgICAgaWYgKG1fdmlldykgewotICAgICAg
ICAgICAgY29uc3QgS0hUTUxTZXR0aW5ncyAqc2V0dGluZ3MgPSBtX3ZpZXctPmZyYW1lKCktPnNl
dHRpbmdzKCk7Ci0gICAgICAgICAgICBpZiAocHJpbnRpbmcgJiYgIXNldHRpbmdzLT5zaG91bGRQ
cmludEJhY2tncm91bmRzKCkpIHsKLSAgICAgICAgICAgICAgICBfc3R5bGUtPnNldEZvcmNlQmFj
a2dyb3VuZHNUb1doaXRlKHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUVN0cmlu
ZyBzdGRmb250ID0gc2V0dGluZ3MtPnN0ZEZvbnROYW1lKCk7Ci0gICAgICAgICAgICBpZiAoICFz
dGRmb250LmlzRW1wdHkoKSApIHsKLSAgICAgICAgICAgICAgICBmb250RGVmLmZhbWlseS5zZXRG
YW1pbHkoc3RkZm9udCk7Ci0gICAgICAgICAgICAgICAgZm9udERlZi5mYW1pbHkuYXBwZW5kRmFt
aWx5KDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRG
b250U2l6ZShmb250RGVmLCBtX3N0eWxlU2VsZWN0b3ItPmZvbnRTaXplRm9yS2V5d29yZChDU1Nf
VkFMX01FRElVTSwgaW5Db21wYXRNb2RlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8va2RE
ZWJ1ZygpIDw8ICJEb2N1bWVudEltcGw6OmF0dGFjaDogc2V0dGluZyB0byBjaGFyc2V0ICIgPDwg
c2V0dGluZ3MtPmNoYXJzZXQoKSA8PCBlbmRsOwotICAgICAgICBfc3R5bGUtPnNldEZvbnREZWYo
Zm9udERlZik7Ci0JX3N0eWxlLT5odG1sRm9udCgpLnVwZGF0ZSggcGFpbnREZXZpY2VNZXRyaWNz
KCkgKTsKLSAgICAgICAgaWYgKCBpbkNvbXBhdE1vZGUoKSApCi0gICAgICAgICAgICBfc3R5bGUt
PnNldEh0bWxIYWNrcyh0cnVlKTsgLy8gZW5hYmxlIGh0bWwgc3BlY2lmaWMgcmVuZGVyaW5nIHRy
aWNrcwotCi0gICAgICAgIFN0eWxlQ2hhbmdlIGNoID0gZGlmZiggX3N0eWxlLCBvbGRTdHlsZSAp
OwotICAgICAgICBpZihtX3JlbmRlciAmJiBjaCAhPSBOb0NoYW5nZSkKLSAgICAgICAgICAgIG1f
cmVuZGVyLT5zZXRTdHlsZShfc3R5bGUpOwotICAgICAgICBpZiAoIGNoYW5nZSAhPSBGb3JjZSAp
Ci0gICAgICAgICAgICBjaGFuZ2UgPSBjaDsKLQotICAgICAgICBfc3R5bGUtPmRlcmVmKG1fcmVu
ZGVyQXJlbmEpOwotICAgICAgICBpZiAob2xkU3R5bGUpCi0gICAgICAgICAgICBvbGRTdHlsZS0+
ZGVyZWYobV9yZW5kZXJBcmVuYSk7Ci0gICAgfQotCi0gICAgTm9kZUltcGwgKm47Ci0gICAgZm9y
IChuID0gX2ZpcnN0OyBuOyBuID0gbi0+bmV4dFNpYmxpbmcoKSkKLSAgICAgICAgaWYgKCBjaGFu
Z2U+PSBJbmhlcml0IHx8IG4tPmhhc0NoYW5nZWRDaGlsZCgpIHx8IG4tPmNoYW5nZWQoKSApCi0g
ICAgICAgICAgICBuLT5yZWNhbGNTdHlsZSggY2hhbmdlICk7Ci0gICAgLy9rZERlYnVnKCA2MDIw
ICkgPDwgIlRJTUU6IHJlY2FsY1N0eWxlKCkgZHQ9IiA8PCBxdC5lbGFwc2VkKCkgPDwgZW5kbDsK
LQotICAgIGlmIChjaGFuZ2VkKCkgJiYgbV92aWV3KQotCW1fdmlldy0+bGF5b3V0KCk7Ci0KLWJh
aWxfb3V0OgotICAgIHNldENoYW5nZWQoIGZhbHNlICk7Ci0gICAgc2V0SGFzQ2hhbmdlZENoaWxk
KCBmYWxzZSApOwotICAgIHNldERvY3VtZW50Q2hhbmdlZCggZmFsc2UgKTsKLSAgICAKLSAgICBt
X2luU3R5bGVSZWNhbGMgPSBmYWxzZTsKLSAgICAKLSAgICAvLyBJZiB3ZSB3YW50ZWQgdG8gZW1p
dCB0aGUgaW1wbGljaXRDbG9zZSgpIGR1cmluZyByZWNhbGNTdHlsZSwgZG8gc28gbm93IHRoYXQg
d2UncmUgZmluaXNoZWQuCi0gICAgaWYgKG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjKSB7Ci0gICAg
ICAgIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjID0gZmFsc2U7Ci0gICAgICAgIGltcGxpY2l0Q2xv
c2UoKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVSZW5kZXJpbmcoKQot
ewotICAgIGlmICghaGFzQ2hhbmdlZENoaWxkKCkpIHJldHVybjsKLQotLy8gICAgIFFUaW1lIHRp
bWU7Ci0vLyAgICAgdGltZS5zdGFydCgpOwotLy8gICAgIGtkRGVidWcoKSA8PCAiVVBEQVRFUkVO
REVSSU5HOiAiPDxlbmRsOwotCi0gICAgU3R5bGVDaGFuZ2UgY2hhbmdlID0gTm9DaGFuZ2U7Ci0g
ICAgcmVjYWxjU3R5bGUoIGNoYW5nZSApOwotCi0vLyAgICBrZERlYnVnKCkgPDwgIlVQREFURVJF
TkRFUklORyB0aW1lIHVzZWQ9Ijw8dGltZS5lbGFwc2VkKCk8PGVuZGw7Ci19Ci0KLXZvaWQgRG9j
dW1lbnRJbXBsOjp1cGRhdGVEb2N1bWVudHNSZW5kZXJpbmcoKQotewotICAgIGlmICghY2hhbmdl
ZERvY3VtZW50cykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgd2hpbGUgKERvY3VtZW50SW1wbCog
ZG9jID0gY2hhbmdlZERvY3VtZW50cy0+dGFrZSgpKSB7Ci0gICAgICAgIGRvYy0+bV9kb2NDaGFu
Z2VkID0gZmFsc2U7Ci0gICAgICAgIGRvYy0+dXBkYXRlUmVuZGVyaW5nKCk7Ci0gICAgfQotfQot
Ci12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlTGF5b3V0KCkKLXsKLSAgICAvLyBGSVhNRTogRGF2
ZSdzIHByZXR0eSBzdXJlIHdlIGNhbiByZW1vdmUgdGhpcyBiZWNhdXNlCi0gICAgLy8gbGF5b3V0
IGNhbGxzIHJlY2FsY1N0eWxlIGFzIG5lZWRlZC4KLSAgICB1cGRhdGVSZW5kZXJpbmcoKTsKLQot
ICAgIC8vIE9ubHkgZG8gYSBsYXlvdXQgaWYgY2hhbmdlcyBoYXZlIG9jY3VycmVkIHRoYXQgbWFr
ZSBpdCBuZWNlc3NhcnkuICAgICAgCi0gICAgaWYgKG1fdmlldyAmJiByZW5kZXJlcigpICYmIHJl
bmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpCi0JbV92aWV3LT5sYXlvdXQoKTsKLX0KLQotLy8gRklY
TUU6IFRoaXMgaXMgYSBiYWQgaWRlYSBhbmQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBldmVudHVhbGx5
LgotLy8gT3RoZXIgYnJvd3NlcnMgbG9hZCBzdHlsZXNoZWV0cyBiZWZvcmUgdGhleSBjb250aW51
ZSBwYXJzaW5nIHRoZSB3ZWIgcGFnZS4KLS8vIFNpbmNlIHdlIGRvbid0LCB3ZSBjYW4gcnVuIEph
dmFTY3JpcHQgY29kZSB0aGF0IG5lZWRzIGFuc3dlcnMgYmVmb3JlIHRoZQotLy8gc3R5bGVzaGVl
dHMgYXJlIGxvYWRlZC4gRG9pbmcgYSBsYXlvdXQgaWdub3JpbmcgdGhlIHBlbmRpbmcgc3R5bGVz
aGVldHMKLS8vIGxldHMgdXMgZ2V0IHJlYXNvbmFibGUgYW5zd2Vycy4gVGhlIGxvbmcgdGVybSBz
b2x1dGlvbiB0byB0aGlzIHByb2JsZW0gaXMKLS8vIHRvIGluc3RlYWQgc3VzcGVuZCBKYXZhU2Ny
aXB0IGV4ZWN1dGlvbi4KLXZvaWQgRG9jdW1lbnRJbXBsOjp1cGRhdGVMYXlvdXRJZ25vcmVQZW5k
aW5nU3R5bGVzaGVldHMoKQotewotICAgIGJvb2wgb2xkSWdub3JlID0gbV9pZ25vcmVQZW5kaW5n
U3R5bGVzaGVldHM7Ci0gICAgCi0gICAgaWYgKCFoYXZlU3R5bGVzaGVldHNMb2FkZWQoKSkgewot
ICAgICAgICBtX2lnbm9yZVBlbmRpbmdTdHlsZXNoZWV0cyA9IHRydWU7Ci0JdXBkYXRlU3R5bGVT
ZWxlY3RvcigpOyAgICAKLSAgICB9Ci0KLSAgICB1cGRhdGVMYXlvdXQoKTsKLQotICAgIG1faWdu
b3JlUGVuZGluZ1N0eWxlc2hlZXRzID0gb2xkSWdub3JlOwotfQotCi12b2lkIERvY3VtZW50SW1w
bDo6YXR0YWNoKCkKLXsKLSAgICBhc3NlcnQoIWF0dGFjaGVkKCkpOwotICAgIGFzc2VydCghbV9p
blBhZ2VDYWNoZSk7Ci0KLSAgICBpZiAoIG1fdmlldyApCi0gICAgICAgIHNldFBhaW50RGV2aWNl
KCBtX3ZpZXcgKTsKLQotICAgIGlmICghbV9yZW5kZXJBcmVuYSkKLSAgICAgICAgbV9yZW5kZXJB
cmVuYSA9IG5ldyBSZW5kZXJBcmVuYSgpOwotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgcmVuZGVy
aW5nIHRyZWUKLSAgICBtX3JlbmRlciA9IG5ldyAobV9yZW5kZXJBcmVuYSkgUmVuZGVyQ2FudmFz
KHRoaXMsIG1fdmlldyk7Ci0gICAgcmVjYWxjU3R5bGUoIEZvcmNlICk7Ci0KLSAgICBSZW5kZXJP
YmplY3QqIHJlbmRlciA9IG1fcmVuZGVyOwotICAgIG1fcmVuZGVyID0gMDsKLQotICAgIENvbnRh
aW5lck5vZGVJbXBsOjphdHRhY2goKTsKLSAgICBtX3JlbmRlciA9IHJlbmRlcjsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OnJlc3RvcmVSZW5kZXJlcihSZW5kZXJPYmplY3QqIHJlbmRlcikKLXsK
LSAgICBtX3JlbmRlciA9IHJlbmRlcjsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmRldGFjaCgp
Ci17Ci0gICAgUmVuZGVyT2JqZWN0KiByZW5kZXIgPSBtX3JlbmRlcjsKLQotICAgIC8vIGluZGlj
YXRlIGRlc3RydWN0aW9uIG1vZGUsICBpLmUuIGF0dGFjaGVkKCkgYnV0IG1fcmVuZGVyID09IDAK
LSAgICBtX3JlbmRlciA9IDA7Ci0gICAgCi0gICAgaWYgKG1faW5QYWdlQ2FjaGUpIHsKLSAgICAg
ICAgaWYgKCByZW5kZXIgKQotICAgICAgICAgICAgZ2V0QWNjT2JqZWN0Q2FjaGUoKS0+ZGV0YWNo
KHJlbmRlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBFbXB0eSBvdXQgdGhl
c2UgbGlzdHMgYXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHNpbmNlIGRldGFjaGluZwot
ICAgIC8vIGFsbCB0aGUgaW5kaXZpZHVhbCByZW5kZXIgb2JqZWN0cyB3aWxsIGNhdXNlIGFsbCB0
aGUgUmVuZGVySW1hZ2UKLSAgICAvLyBvYmplY3RzIHRvIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20g
dGhlIGxpc3RzLgotICAgIG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7
Ci0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdC5jbGVhcigpOwotICAgIAotICAg
IENvbnRhaW5lck5vZGVJbXBsOjpkZXRhY2goKTsKLQotICAgIGlmICggcmVuZGVyICkKLSAgICAg
ICAgcmVuZGVyLT5kZXN0cm95KCk7Ci0KLSAgICBpZiAobV9wYWludERldmljZSA9PSBtX3ZpZXcp
Ci0gICAgICAgIHNldFBhaW50RGV2aWNlKDApOwotICAgIG1fdmlldyA9IDA7Ci0gICAgCi0gICAg
aWYgKG1fcmVuZGVyQXJlbmEpewotICAgICAgICBkZWxldGUgbV9yZW5kZXJBcmVuYTsKLSAgICAg
ICAgbV9yZW5kZXJBcmVuYSA9IDA7Ci0gICAgfQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVt
b3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tQWxsTm9kZXMoKQotewotICAgIG1fd2luZG93RXZlbnRM
aXN0ZW5lcnMuY2xlYXIoKTsKLSAgICByZW1vdmVBbGxEaXNjb25uZWN0ZWROb2RlRXZlbnRMaXN0
ZW5lcnMoKTsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0gdGhpczsgbjsgbiA9IG4tPnRyYXZlcnNl
TmV4dE5vZGUoKSkgewotICAgICAgICBuLT5yZW1vdmVBbGxFdmVudExpc3RlbmVycygpOwotICAg
IH0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlZ2lzdGVyRGlzY29ubmVjdGVkTm9kZVdpdGhF
dmVudExpc3RlbmVycyhOb2RlSW1wbCAqbm9kZSkKLXsKLSAgICBtX2Rpc2Nvbm5lY3RlZE5vZGVz
V2l0aEV2ZW50TGlzdGVuZXJzLmluc2VydChub2RlLCBub2RlKTsKLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OnVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJ
bXBsICpub2RlKQotewotICAgIG1fZGlzY29ubmVjdGVkTm9kZXNXaXRoRXZlbnRMaXN0ZW5lcnMu
cmVtb3ZlKG5vZGUpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlQWxsRGlzY29ubmVj
dGVkTm9kZUV2ZW50TGlzdGVuZXJzKCkKLXsKLSAgICBmb3IgKFFQdHJEaWN0SXRlcmF0b3I8Tm9k
ZUltcGw+IGl0ZXIobV9kaXNjb25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycyk7Ci0gICAg
ICAgICBpdGVyLmN1cnJlbnQoKTsKLSAgICAgICAgICsraXRlcikgewotICAgICAgICBpdGVyLmN1
cnJlbnQoKS0+cmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnMoKTsKLSAgICB9Ci0gICAgbV9kaXNjb25u
ZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVycy5jbGVhcigpOwotfQotCi1LV1FBY2NPYmplY3RD
YWNoZSogRG9jdW1lbnRJbXBsOjpnZXRBY2NPYmplY3RDYWNoZSgpCi17Ci0gICAgLy8gVGhlIG9u
bHkgZG9jdW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgYSBLV1FBY2NPYmplY3RDYWNoZSBpcyB0aGUg
dG9wLWxldmVsCi0gICAgLy8gZG9jdW1lbnQuICBUaGlzIGlzIGJlY2F1c2Ugd2UgbmVlZCB0byBi
ZSBhYmxlIHRvIGdldCBmcm9tIGFueSBLV1FBY2NPYmplY3QKLSAgICAvLyB0byBhbnkgb3RoZXIg
S1dRQWNjT2JqZWN0IG9uIHRoZSBzYW1lIHBhZ2UuICBVc2luZyBhIHNpbmdsZSBjYWNoZSBhbGxv
d3MKLSAgICAvLyBsb29rdXBzIGFjcm9zcyBuZXN0ZWQgd2ViYXJlYXMgKGkuZS4gbXVsdGlwbGUg
ZG9jdW1lbnRzKS4KLSAgICAKLSAgICBpZiAobV9hY2NDYWNoZSkgewotICAgICAgICAvLyByZXR1
cm4gYWxyZWFkeSBrbm93biB0b3AtbGV2ZWwgY2FjaGUKLSAgICAgICAgaWYgKCFvd25lckVsZW1l
bnQoKSkKLSAgICAgICAgICAgIHJldHVybiBtX2FjY0NhY2hlOwotICAgICAgICAKLSAgICAgICAg
Ly8gSW4gc29tZSBwYWdlcyB3aXRoIGZyYW1lcywgdGhlIGNhY2hlIGlzIGNyZWF0ZWQgYmVmb3Jl
IHRoZSBzdWItd2ViYXJlYSBpcwotICAgICAgICAvLyBpbnNlcnRlZCBpbnRvIHRoZSB0cmVlLiAg
SGVyZSwgd2UgY2F0Y2ggdGhhdCBjYXNlIGFuZCBqdXN0IHRvc3MgdGhlIG9sZAotICAgICAgICAv
LyBjYWNoZSBhbmQgc3RhcnQgb3Zlci4KLSAgICAgICAgZGVsZXRlIG1fYWNjQ2FjaGU7Ci0gICAg
ICAgIG1fYWNjQ2FjaGUgPSAwOwotICAgIH0KLSAgICAKLSAgICAvLyBsb29rIGZvciB0b3AtbGV2
ZWwgZG9jdW1lbnQKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudCA9IG93bmVyRWxlbWVudCgpOwot
ICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgIERvY3VtZW50SW1wbCAqZG9jOwotICAgICAgICB3
aGlsZSAoZWxlbWVudCkgewotICAgICAgICAgICAgZG9jID0gZWxlbWVudC0+Z2V0RG9jdW1lbnQo
KTsKLSAgICAgICAgICAgIGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVudCgpOwotICAgICAgICB9
Ci0gICAgICAgIAotICAgICAgICAvLyBhc2sgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCBmb3IgaXRz
IGNhY2hlCi0gICAgICAgIHJldHVybiBkb2MtPmdldEFjY09iamVjdENhY2hlKCk7Ci0gICAgfQot
ICAgIAotICAgIC8vIHRoaXMgaXMgdGhlIHRvcC1sZXZlbCBkb2N1bWVudCwgc28gaW5zdGFsbCBh
IG5ldyBjYWNoZQotICAgIG1fYWNjQ2FjaGUgPSBuZXcgS1dRQWNjT2JqZWN0Q2FjaGU7Ci0gICAg
cmV0dXJuIG1fYWNjQ2FjaGU7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRWaXN1YWxseU9y
ZGVyZWQoKQotewotICAgIHZpc3VhbGx5T3JkZXJlZCA9IHRydWU7Ci0gICAgaWYgKG1fcmVuZGVy
KQotICAgICAgICBtX3JlbmRlci0+c3R5bGUoKS0+c2V0VmlzdWFsbHlPcmRlcmVkKHRydWUpOwot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6dXBkYXRlU2VsZWN0aW9uKCkKLXsKLSAgICBpZiAoIW1f
cmVuZGVyKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgUmVuZGVyQ2FudmFzICpjYW52YXMg
PSBzdGF0aWNfY2FzdDxSZW5kZXJDYW52YXMqPihtX3JlbmRlcik7Ci0gICAgU2VsZWN0aW9uQ29u
dHJvbGxlciBzID0gZnJhbWUoKS0+c2VsZWN0aW9uKCk7Ci0gICAgaWYgKCFzLmlzUmFuZ2UoKSkg
ewotICAgICAgICBjYW52YXMtPmNsZWFyU2VsZWN0aW9uKCk7Ci0gICAgfQotICAgIGVsc2Ugewot
ICAgICAgICBQb3NpdGlvbiBzdGFydFBvcyA9IFZpc2libGVQb3NpdGlvbihzLnN0YXJ0KCksIHMu
c3RhcnRBZmZpbml0eSgpKS5kZWVwRXF1aXZhbGVudCgpOwotICAgICAgICBQb3NpdGlvbiBlbmRQ
b3MgPSBWaXNpYmxlUG9zaXRpb24ocy5lbmQoKSwgcy5lbmRBZmZpbml0eSgpKS5kZWVwRXF1aXZh
bGVudCgpOwotICAgICAgICBpZiAoc3RhcnRQb3MuaXNOb3ROdWxsKCkgJiYgZW5kUG9zLmlzTm90
TnVsbCgpKSB7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKnN0YXJ0UmVuZGVyZXIgPSBzdGFy
dFBvcy5ub2RlKCktPnJlbmRlcmVyKCk7Ci0gICAgICAgICAgICBSZW5kZXJPYmplY3QgKmVuZFJl
bmRlcmVyID0gZW5kUG9zLm5vZGUoKS0+cmVuZGVyZXIoKTsKLSAgICAgICAgICAgIHN0YXRpY19j
YXN0PFJlbmRlckNhbnZhcyo+KG1fcmVuZGVyKS0+c2V0U2VsZWN0aW9uKHN0YXJ0UmVuZGVyZXIs
IHN0YXJ0UG9zLm9mZnNldCgpLCBlbmRSZW5kZXJlciwgZW5kUG9zLm9mZnNldCgpKTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICAKLSAgICAvLyBzZW5kIHRoZSBBWFNlbGVjdGVkVGV4dENoYW5nZWQg
bm90aWZpY2F0aW9uIG9ubHkgaWYgdGhlIG5ldyBzZWxlY3Rpb24gaXMgbm9uLW51bGwsCi0gICAg
Ly8gYmVjYXVzZSBudWxsIHNlbGVjdGlvbnMgYXJlIG9ubHkgdHJhbnNpdG9yeSAoZS5nLiB3aGVu
IHN0YXJ0aW5nIGFuIEVkaXRDb21tYW5kLCBjdXJyZW50bHkpCi0gICAgaWYgKEtXUUFjY09iamVj
dENhY2hlOjphY2Nlc3NpYmlsaXR5RW5hYmxlZCgpICYmIHMuc3RhcnQoKS5pc05vdE51bGwoKSAm
JiBzLmVuZCgpLmlzTm90TnVsbCgpKSB7Ci0gICAgICAgIGdldEFjY09iamVjdENhY2hlKCktPnBv
c3ROb3RpZmljYXRpb25Ub1RvcFdlYkFyZWEocmVuZGVyZXIoKSwgIkFYU2VsZWN0ZWRUZXh0Q2hh
bmdlZCIpOwotICAgIH0KLQotfQotCi1Ub2tlbml6ZXIgKkRvY3VtZW50SW1wbDo6Y3JlYXRlVG9r
ZW5pemVyKCkKLXsKLSAgICByZXR1cm4gbmV3WE1MVG9rZW5pemVyKHRoaXMsIG1fdmlldyk7Ci19
Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRQYWludERldmljZSggUVBhaW50RGV2aWNlICpkZXYg
KQotewotICAgIGlmIChtX3BhaW50RGV2aWNlID09IGRldikgewotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIG1fcGFpbnREZXZpY2UgPSBkZXY7Ci0gICAgZGVsZXRlIG1fcGFpbnREZXZpY2VN
ZXRyaWNzOwotICAgIG1fcGFpbnREZXZpY2VNZXRyaWNzID0gZGV2ID8gbmV3IFFQYWludERldmlj
ZU1ldHJpY3MoIGRldiApIDogMDsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6Om9wZW4oICApCi17
Ci0gICAgaWYgKHBhcnNpbmcoKSkgcmV0dXJuOwotCi0gICAgaW1wbGljaXRPcGVuKCk7Ci0KLSAg
ICBpZiAoZnJhbWUoKSkgewotICAgICAgICBmcmFtZSgpLT5kaWRFeHBsaWNpdE9wZW4oKTsKLSAg
ICB9Ci0KLSAgICAvLyBUaGlzIGlzIHdvcmsgdGhhdCB3ZSBzaG91bGQgcHJvYmFibHkgZG8gaW4g
Y2xlYXIoKSwgYnV0IHdlIGNhbid0IGhhdmUgaXQKLSAgICAvLyBoYXBwZW4gd2hlbiBpbXBsaWNp
dE9wZW4oKSBpcyBjYWxsZWQgdW5sZXNzIHdlIHJlb3JnYW5pemUgRnJhbWUgY29kZS4KLSAgICBz
ZXRVUkwoUVN0cmluZygpKTsKLSAgICBEb2N1bWVudEltcGwgKnBhcmVudCA9IHBhcmVudERvY3Vt
ZW50KCk7Ci0gICAgaWYgKHBhcmVudCkgewotICAgICAgICBzZXRCYXNlVVJMKHBhcmVudC0+YmFz
ZVVSTCgpKTsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjppbXBsaWNpdE9wZW4oKQot
ewotICAgIGlmIChtX3Rva2VuaXplcikKLSAgICAgICAgY2xvc2UoKTsKLQotICAgIGNsZWFyKCk7
Ci0gICAgbV90b2tlbml6ZXIgPSBjcmVhdGVUb2tlbml6ZXIoKTsKLSAgICBjb25uZWN0KG1fdG9r
ZW5pemVyLFNJR05BTChmaW5pc2hlZFBhcnNpbmcoKSksdGhpcyxTSUdOQUwoZmluaXNoZWRQYXJz
aW5nKCkpKTsKLSAgICBzZXRQYXJzaW5nKHRydWUpOwotfQotCi1IVE1MRWxlbWVudEltcGwqIERv
Y3VtZW50SW1wbDo6Ym9keSgpCi17Ci0gICAgTm9kZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50
KCk7Ci0gICAgaWYgKCFkZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgLy8gdHJ5IHRv
IHByZWZlciBhIEZSQU1FU0VUIGVsZW1lbnQgb3ZlciBCT0RZCi0gICAgTm9kZUltcGwqIGJvZHkg
PSAwOwotICAgIGZvciAoTm9kZUltcGwqIGkgPSBkZS0+Zmlyc3RDaGlsZCgpOyBpOyBpID0gaS0+
bmV4dFNpYmxpbmcoKSkgewotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShmcmFtZXNldFRhZykp
Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBsKj4oaSk7Ci0g
ICAgICAgIAotICAgICAgICBpZiAoaS0+aGFzVGFnTmFtZShib2R5VGFnKSkKLSAgICAgICAgICAg
IGJvZHkgPSBpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTEVsZW1lbnRJbXBs
ICo+KGJvZHkpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6Y2xvc2UoKQotewotICAgIGlmIChm
cmFtZSgpKQotICAgICAgICBmcmFtZSgpLT5lbmRJZk5vdExvYWRpbmcoKTsKLSAgICBpbXBsaWNp
dENsb3NlKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjppbXBsaWNpdENsb3NlKCkKLXsKLSAg
ICAvLyBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHJlY2FsY1N0eWxlLCB3ZSBuZWVkIHRvIGRl
ZmVyIHRoZSBjbG9zZSB1bnRpbCB0aGUgc3R5bGUgaW5mb3JtYXRpb24gaXMgYWNjdXJhdGUgYW5k
IGFsbCBlbGVtZW50cyBhcmUgcmUtYXR0YWNoZWQuCi0gICAgaWYgKG1faW5TdHlsZVJlY2FsYykg
ewotICAgICAgICBtX2Nsb3NlQWZ0ZXJTdHlsZVJlY2FsYyA9IHRydWU7Ci0gICAgICAgIHJldHVy
bjsKLSAgICB9Ci0KLSAgICBib29sIHdhc0xvY2F0aW9uQ2hhbmdlUGVuZGluZyA9IGZyYW1lKCkg
JiYgZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlvbkNoYW5nZVBlbmRpbmcoKTsKLSAgICBib29s
IGRvbG9hZCA9ICFwYXJzaW5nKCkgJiYgbV90b2tlbml6ZXIgJiYgIW1fcHJvY2Vzc2luZ0xvYWRF
dmVudCAmJiAhd2FzTG9jYXRpb25DaGFuZ2VQZW5kaW5nOwotICAgIAotICAgIGlmICghZG9sb2Fk
KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3Byb2Nlc3NpbmdMb2FkRXZlbnQgPSB0cnVlOwot
Ci0gICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUgdG9rZW5pemVyLCBpbiBjYXNlIHNvbWVvbmUg
ZG9jdW1lbnQud3JpdGUoKXMgZnJvbSB0aGUKLSAgICAvLyBvbkxvYWQgZXZlbnQgaGFuZGxlciwg
YXMgaW4gUmFkYXIgMzIwNjUyNC4KLSAgICBkZWxldGUgbV90b2tlbml6ZXI7Ci0gICAgbV90b2tl
bml6ZXIgPSAwOwotCi0gICAgLy8gQ3JlYXRlIGEgYm9keSBlbGVtZW50IGlmIHdlIGRvbid0IGFs
cmVhZHkgaGF2ZSBvbmUuCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgUmFkYXIgMzc1ODc4NSwgdGhl
IHdpbmRvdy5vbmxvYWQgd2FzIHNldCBpbiBzb21lIGphdmFzY3JpcHQsIGJ1dCBuZXZlciBmaXJl
ZCBiZWNhdXNlIHRoZXJlIHdhcyBubyBib2R5LiAgCi0gICAgLy8gVGhpcyBiZWhhdmlvciBub3cg
bWF0Y2hlcyBGaXJlZm94IGFuZCBJRS4KLSAgICBIVE1MRWxlbWVudEltcGwgKmJvZHkgPSB0aGlz
LT5ib2R5KCk7Ci0gICAgaWYgKCFib2R5ICYmIGlzSFRNTERvY3VtZW50KCkpIHsKLSAgICAgICAg
Tm9kZUltcGwgKmRlID0gZG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAgIGlmIChkZSkgewotICAg
ICAgICAgICAgYm9keSA9IG5ldyBIVE1MQm9keUVsZW1lbnRJbXBsKHRoaXMpOwotICAgICAgICAg
ICAgaW50IGV4Y2VwdGlvbkNvZGUgPSAwOwotICAgICAgICAgICAgZGUtPmFwcGVuZENoaWxkKGJv
ZHksIGV4Y2VwdGlvbkNvZGUpOwotICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkNvZGUgIT0gMCkK
LSAgICAgICAgICAgICAgICBib2R5ID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBO
b2RlSW1wbCAqb25sb2FkVGFyZ2V0ID0gYm9keTsKLSAgICBpZiAoIWlzSFRNTERvY3VtZW50KCkp
Ci0gICAgICAgIG9ubG9hZFRhcmdldCA9IGRvY3VtZW50RWxlbWVudCgpOwotCi0gICAgaWYgKG9u
bG9hZFRhcmdldCkgewotICAgICAgICBkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05vdygpOwotICAg
ICAgICBvbmxvYWRUYXJnZXQtPmRpc3BhdGNoV2luZG93RXZlbnQobG9hZEV2ZW50LCBmYWxzZSwg
ZmFsc2UpOwotICAgICAgICBpZiAoRnJhbWUgKnAgPSBmcmFtZSgpKQotICAgICAgICAgICAgTWFj
KHApLT5oYW5kbGVkT25sb2FkRXZlbnRzKCk7Ci0jaWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NI
RURVTElORwotICAgICAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICAgICAgcHJpbnRm
KCJvbmxvYWQgZmlyZWQgYXQgJWRcbiIsIGVsYXBzZWRUaW1lKCkpOwotI2VuZGlmCi0gICAgfQot
Ci0gICAgbV9wcm9jZXNzaW5nTG9hZEV2ZW50ID0gZmFsc2U7Ci0KLSAgICAvLyBNYWtlIHN1cmUg
Ym90aCB0aGUgaW5pdGlhbCBsYXlvdXQgYW5kIHJlZmxvdyBoYXBwZW4gYWZ0ZXIgdGhlIG9ubG9h
ZAotICAgIC8vIGZpcmVzLiBUaGlzIHdpbGwgaW1wcm92ZSBvbmxvYWQgc2NvcmVzLCBhbmQgb3Ro
ZXIgYnJvd3NlcnMgZG8gaXQuCi0gICAgLy8gSWYgdGhleSB3YW5uYSBjaGVhdCwgd2UgY2FuIHRv
by4gLWR3aAotCi0gICAgaWYgKGZyYW1lKCkgJiYgZnJhbWUoKS0+aXNTY2hlZHVsZWRMb2NhdGlv
bkNoYW5nZVBlbmRpbmcoKSAmJiBtX3N0YXJ0VGltZS5lbGFwc2VkKCkgPCBjTGF5b3V0U2NoZWR1
bGVUaHJlc2hvbGQpIHsKLSAgICAgICAgLy8gSnVzdCBiYWlsIG91dC4gQmVmb3JlIG9yIGR1cmlu
ZyB0aGUgb25sb2FkIHdlIHdlcmUgc2hpZnRlZCB0byBhbm90aGVyIHBhZ2UuCi0gICAgICAgIC8v
IFRoZSBvbGQgaS1CZW5jaCBzdWl0ZSBkb2VzIHRoaXMuIFdoZW4gdGhpcyBoYXBwZW5zIGRvbid0
IGJvdGhlciBwYWludGluZyBvciBsYXlpbmcgb3V0LiAgICAgICAgCi0gICAgICAgIHZpZXcoKS0+
dW5zY2hlZHVsZVJlbGF5b3V0KCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAo
ZnJhbWUoKSkKLSAgICAgICAgZnJhbWUoKS0+Y2hlY2tFbWl0TG9hZEV2ZW50KCk7Ci0KLSAgICAv
LyBOb3cgZG8gb3VyIHBhaW50aW5nL2xheW91dCwgYnV0IG9ubHkgaWYgd2UgYXJlbid0IGluIGEg
c3ViZnJhbWUgb3IgaWYgd2UncmUgaW4gYSBzdWJmcmFtZQotICAgIC8vIHRoYXQgaGFzIGJlZW4g
c2l6ZWQgYWxyZWFkeS4gIE90aGVyd2lzZSwgb3VyIHZpZXcgc2l6ZSB3b3VsZCBiZSBpbmNvcnJl
Y3QsIHNvIGRvaW5nIGFueSAKLSAgICAvLyBsYXlvdXQvcGFpbnRpbmcgbm93IHdvdWxkIGJlIHBv
aW50bGVzcy4KLSAgICBpZiAoIW93bmVyRWxlbWVudCgpIHx8IChvd25lckVsZW1lbnQoKS0+cmVu
ZGVyZXIoKSAmJiAhb3duZXJFbGVtZW50KCktPnJlbmRlcmVyKCktPm5lZWRzTGF5b3V0KCkpKSB7
Ci0gICAgICAgIHVwZGF0ZVJlbmRlcmluZygpOwotICAgICAgICAKLSAgICAgICAgLy8gQWx3YXlz
IGRvIGEgbGF5b3V0IGFmdGVyIGxvYWRpbmcgaWYgbmVlZGVkLgotICAgICAgICBpZiAodmlldygp
ICYmIHJlbmRlcmVyKCkgJiYgKCFyZW5kZXJlcigpLT5maXJzdENoaWxkKCkgfHwgcmVuZGVyZXIo
KS0+bmVlZHNMYXlvdXQoKSkpCi0gICAgICAgICAgICB2aWV3KCktPmxheW91dCgpOwotICAgIH0K
LSAgICBpZiAocmVuZGVyZXIoKSAmJiBLV1FBY2NPYmplY3RDYWNoZTo6YWNjZXNzaWJpbGl0eUVu
YWJsZWQoKSkKLSAgICAgICAgZ2V0QWNjT2JqZWN0Q2FjaGUoKS0+cG9zdE5vdGlmaWNhdGlvbihy
ZW5kZXJlcigpLCAiQVhMb2FkQ29tcGxldGUiKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNl
dFBhcnNpbmcoYm9vbCBiKQotewotICAgIG1fYlBhcnNpbmcgPSBiOwotICAgIGlmICghbV9iUGFy
c2luZyAmJiB2aWV3KCkpCi0gICAgICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwotCi0j
aWZkZWYgSU5TVFJVTUVOVF9MQVlPVVRfU0NIRURVTElORwotICAgIGlmICghb3duZXJFbGVtZW50
KCkgJiYgIW1fYlBhcnNpbmcpCi0gICAgICAgIHByaW50ZigiUGFyc2luZyBmaW5pc2hlZCBhdCAl
ZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnNo
b3VsZFNjaGVkdWxlTGF5b3V0KCkKLXsKLSAgICAvLyBXZSBjYW4gdXBkYXRlIGxheW91dCBpZjoK
LSAgICAvLyAoYSkgd2UgYWN0dWFsbHkgbmVlZCBhIGxheW91dAotICAgIC8vIChiKSBvdXIgc3R5
bGVzaGVldHMgYXJlIGFsbCBsb2FkZWQKLSAgICAvLyAoYykgd2UgaGF2ZSBhIDxib2R5PgotICAg
IHJldHVybiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5uZWVkc0xheW91dCgpICYmIGhhdmVT
dHlsZXNoZWV0c0xvYWRlZCgpICYmCi0gICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQoKSAmJiBk
b2N1bWVudEVsZW1lbnQoKS0+cmVuZGVyZXIoKSAmJgotICAgICAgICAgICAgKCFkb2N1bWVudEVs
ZW1lbnQoKS0+aGFzVGFnTmFtZShodG1sVGFnKSB8fCBib2R5KCkpKTsKLX0KLQotaW50IERvY3Vt
ZW50SW1wbDo6bWluaW11bUxheW91dERlbGF5KCkKLXsKLSAgICBpZiAobV9vdmVyTWluaW11bUxh
eW91dFRocmVzaG9sZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgaW50IGVsYXBzZWQg
PSBtX3N0YXJ0VGltZS5lbGFwc2VkKCk7Ci0gICAgbV9vdmVyTWluaW11bUxheW91dFRocmVzaG9s
ZCA9IGVsYXBzZWQgPiBjTGF5b3V0U2NoZWR1bGVUaHJlc2hvbGQ7Ci0gICAgCi0gICAgLy8gV2Un
bGwgd2FudCB0byBzY2hlZHVsZSB0aGUgdGltZXIgdG8gZmlyZSBhdCB0aGUgbWluaW11bSBsYXlv
dXQgdGhyZXNob2xkLgotICAgIHJldHVybiBrTWF4KDAsIGNMYXlvdXRTY2hlZHVsZVRocmVzaG9s
ZCAtIGVsYXBzZWQpOwotfQotCi1pbnQgRG9jdW1lbnRJbXBsOjplbGFwc2VkVGltZSgpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIG1fc3RhcnRUaW1lLmVsYXBzZWQoKTsKLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OndyaXRlKCBjb25zdCBET01TdHJpbmcgJnRleHQgKQotewotICAgIHdyaXRlKHRleHQu
cXN0cmluZygpKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OndyaXRlKCBjb25zdCBRU3RyaW5n
ICZ0ZXh0ICkKLXsKLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYg
KCFvd25lckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgYSBkb2N1bWVudC53
cml0ZSBhdCAlZFxuIiwgZWxhcHNlZFRpbWUoKSk7Ci0jZW5kaWYKLSAgICAKLSAgICBpZiAoIW1f
dG9rZW5pemVyKSB7Ci0gICAgICAgIG9wZW4oKTsKLSAgICAgICAgYXNzZXJ0KG1fdG9rZW5pemVy
KTsKLSAgICAgICAgd3JpdGUoUVN0cmluZygiPGh0bWw+IikpOwotICAgIH0KLSAgICBtX3Rva2Vu
aXplci0+d3JpdGUodGV4dCwgZmFsc2UpOwotICAgIAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VU
X1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBwcmludGYoIkVu
ZGluZyBhIGRvY3VtZW50LndyaXRlIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZiAg
ICAKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OndyaXRlbG4oIGNvbnN0IERPTVN0cmluZyAmdGV4
dCApCi17Ci0gICAgd3JpdGUodGV4dCk7Ci0gICAgd3JpdGUoRE9NU3RyaW5nKCJcbiIpKTsKLX0K
LQotdm9pZCBEb2N1bWVudEltcGw6OmZpbmlzaFBhcnNpbmcoKQotewotI2lmZGVmIElOU1RSVU1F
TlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAgICAgICBw
cmludGYoIlJlY2VpdmVkIGFsbCBkYXRhIGF0ICVkXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRp
ZgotICAgIAotICAgIC8vIExldCB0aGUgdG9rZW5pemVyIGdvIHRocm91Z2ggYXMgbXVjaCBkYXRh
IGFzIGl0IGNhbi4gIFRoZXJlIHdpbGwgYmUgdGhyZWUgcG9zc2libGUgb3V0Y29tZXMgYWZ0ZXIK
LSAgICAvLyBmaW5pc2goKSBpcyBjYWxsZWQ6Ci0gICAgLy8gKDEpIEFsbCByZW1haW5pbmcgZGF0
YSBpcyBwYXJzZWQsIGRvY3VtZW50IGlzbid0IGxvYWRlZCB5ZXQKLSAgICAvLyAoMikgQWxsIHJl
bWFpbmluZyBkYXRhIGlzIHBhcnNlZCwgZG9jdW1lbnQgaXMgbG9hZGVkLCB0b2tlbml6ZXIgZ2V0
cyBkZWxldGVkCi0gICAgLy8gKDMpIERhdGEgaXMgc3RpbGwgcmVtYWluaW5nIHRvIGJlIHBhcnNl
ZC4KLSAgICBpZiAobV90b2tlbml6ZXIpCi0gICAgICAgIG1fdG9rZW5pemVyLT5maW5pc2goKTsK
LX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmNsZWFyKCkKLXsKLSAgICBkZWxldGUgbV90b2tlbml6
ZXI7Ci0gICAgbV90b2tlbml6ZXIgPSAwOwotCi0gICAgcmVtb3ZlQ2hpbGRyZW4oKTsKLSAgICBR
UHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50
TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOykKLSAgICAgICAgbV93aW5kb3dF
dmVudExpc3RlbmVycy5yZW1vdmVSZWYoaXQuY3VycmVudCgpKTsKLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OnNldFVSTChjb25zdCBRU3RyaW5nJiB1cmwpCi17Ci0gICAgbV91cmwgPSB1cmw7Ci0g
ICAgaWYgKG1fc3R5bGVTZWxlY3RvcikKLSAgICAgICAgbV9zdHlsZVNlbGVjdG9yLT5zZXRFbmNv
ZGVkVVJMKG1fdXJsKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFN0eWxlU2hlZXQoY29u
c3QgRE9NU3RyaW5nICZ1cmwsIGNvbnN0IERPTVN0cmluZyAmc2hlZXQpCi17Ci0vLyAgICBrZERl
YnVnKCA2MDMwICkgPDwgIkhUTUxEb2N1bWVudDo6c2V0U3R5bGVTaGVldCgpIiA8PCBlbmRsOwot
ICAgIG1fc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwodGhpcywgdXJsKTsKLSAgICBtX3No
ZWV0LT5yZWYoKTsKLSAgICBtX3NoZWV0LT5wYXJzZVN0cmluZyhzaGVldCk7Ci0gICAgbV9sb2Fk
aW5nU2hlZXQgPSBmYWxzZTsKLQotICAgIHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OnNldFVzZXJTdHlsZVNoZWV0KCBjb25zdCBRU3RyaW5nJiBzaGVldCAp
Ci17Ci0gICAgaWYgKCBtX3VzZXJzaGVldCAhPSBzaGVldCApIHsKLSAgICAgICAgbV91c2Vyc2hl
ZXQgPSBzaGVldDsKLQl1cGRhdGVTdHlsZVNlbGVjdG9yKCk7Ci0gICAgfQotfQotCi1DU1NTdHls
ZVNoZWV0SW1wbCogRG9jdW1lbnRJbXBsOjplbGVtZW50U2hlZXQoKQotewotICAgIGlmICghbV9l
bGVtU2hlZXQpIHsKLSAgICAgICAgbV9lbGVtU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldEltcGwo
dGhpcywgYmFzZVVSTCgpICk7Ci0gICAgICAgIG1fZWxlbVNoZWV0LT5yZWYoKTsKLSAgICB9Ci0g
ICAgcmV0dXJuIG1fZWxlbVNoZWV0OwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6ZGV0ZXJtaW5l
UGFyc2VNb2RlKCBjb25zdCBRU3RyaW5nICYvKnN0ciovICkKLXsKLSAgICAvLyBGb3IgWE1MIGRv
Y3VtZW50cyB1c2Ugc3RyaWN0IHBhcnNlIG1vZGUuICBIVE1MIGRvY3Mgd2lsbCBvdmVycmlkZSB0
aGlzIG1ldGhvZCB0bwotICAgIC8vIGRldGVybWluZSB0aGVpciBwYXJzZSBtb2RlLgotICAgIHBN
b2RlID0gU3RyaWN0OwotICAgIGhNb2RlID0gWEh0bWw7Ci0gICAga2REZWJ1Zyg2MDIwKSA8PCAi
IHVzaW5nIHN0cmljdCBwYXJzZU1vZGUiIDw8IGVuZGw7Ci19Ci0KLU5vZGVJbXBsICpEb2N1bWVu
dEltcGw6Om5leHRGb2N1c05vZGUoTm9kZUltcGwgKmZyb21Ob2RlKQotewotICAgIHVuc2lnbmVk
IHNob3J0IGZyb21UYWJJbmRleDsKLQotICAgIGlmICghZnJvbU5vZGUpIHsKLQkvLyBObyBzdGFy
dGluZyBub2RlIHN1cHBsaWVkOyBiZWdpbiB3aXRoIHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50Ci0J
Tm9kZUltcGwgKm47Ci0KLQlpbnQgbG93ZXN0VGFiSW5kZXggPSA2NTUzNTsKLQlmb3IgKG4gPSB0
aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlz
S2V5Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAoKG4tPnRhYkluZGV4KCkgPiAwKSAmJiAobi0+
dGFiSW5kZXgoKSA8IGxvd2VzdFRhYkluZGV4KSkKLQkJICAgIGxvd2VzdFRhYkluZGV4ID0gbi0+
dGFiSW5kZXgoKTsKLQkgICAgfQotCX0KLQotCWlmIChsb3dlc3RUYWJJbmRleCA9PSA2NTUzNSkK
LQkgICAgbG93ZXN0VGFiSW5kZXggPSAwOwotCi0JLy8gR28gdG8gdGhlIGZpcnN0IG5vZGUgaW4g
dGhlIGRvY3VtZW50IHRoYXQgaGFzIHRoZSBkZXNpcmVkIHRhYiBpbmRleAotCWZvciAobiA9IHRo
aXM7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUoKSkgewotCSAgICBpZiAobi0+aXNL
ZXlib2FyZEZvY3VzYWJsZSgpICYmIChuLT50YWJJbmRleCgpID09IGxvd2VzdFRhYkluZGV4KSkK
LQkJcmV0dXJuIG47Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgfQotICAgIGVsc2UgewotCWZyb21U
YWJJbmRleCA9IGZyb21Ob2RlLT50YWJJbmRleCgpOwotICAgIH0KLQotICAgIGlmIChmcm9tVGFi
SW5kZXggPT0gMCkgewotCS8vIEp1c3QgbmVlZCB0byBmaW5kIHRoZSBuZXh0IHNlbGVjdGFibGUg
bm9kZSBhZnRlciBmcm9tTm9kZSAoaW4gZG9jdW1lbnQgb3JkZXIpIHRoYXQgZG9lc24ndCBoYXZl
IGEgdGFiIGluZGV4Ci0JTm9kZUltcGwgKm4gPSBmcm9tTm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgp
OwotCXdoaWxlIChuICYmICEobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgpICYmIG4tPnRhYkluZGV4
KCkgPT0gMCkpCi0JICAgIG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCk7Ci0JcmV0dXJuIG47Ci0g
ICAgfQotICAgIGVsc2UgewotCS8vIEZpbmQgdGhlIGxvd2VzdCB0YWIgaW5kZXggb3V0IG9mIGFs
bCB0aGUgbm9kZXMgZXhjZXB0IGZyb21Ob2RlLCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVh
bCB0byBmcm9tTm9kZSdzCi0JLy8gdGFiIGluZGV4LiBGb3Igbm9kZXMgd2l0aCB0aGUgc2FtZSB0
YWIgaW5kZXggYXMgZnJvbU5vZGUsIHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhvc2UgdGhh
dCBjb21lIGFmdGVyCi0JLy8gZnJvbU5vZGUgaW4gZG9jdW1lbnQgb3JkZXIuCi0JLy8gSWYgd2Ug
ZG9uJ3QgZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRleCwgdGhlIG5leHQgZm9jdXMgbm9kZSB3aWxs
IGJlIG9uZSB3aXRoIGEgdGFiIGluZGV4IG9mIDAuCi0JdW5zaWduZWQgc2hvcnQgbG93ZXN0U3Vp
dGFibGVUYWJJbmRleCA9IDY1NTM1OwotCU5vZGVJbXBsICpuOwotCi0JYm9vbCByZWFjaGVkRnJv
bU5vZGUgPSBmYWxzZTsKLQlmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZU5l
eHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJgotCQkoKHJl
YWNoZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgoKSA+PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkg
KCFyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPiBmcm9tVGFiSW5kZXgpKSkgJiYK
LQkJKG4tPnRhYkluZGV4KCkgPCBsb3dlc3RTdWl0YWJsZVRhYkluZGV4KSAmJgotCQkobiAhPSBm
cm9tTm9kZSkpIHsKLQotCQkvLyBXZSBmb3VuZCBhIHNlbGVjdGFibGUgbm9kZSB3aXRoIGEgdGFi
IGluZGV4IGF0IGxlYXN0IGFzIGhpZ2ggYXMgZnJvbU5vZGUncy4gS2VlcCBzZWFyY2hpbmcgdGhv
dWdoLAotCQkvLyBhcyB0aGVyZSBtYXkgYmUgYW5vdGhlciBub2RlIHdoaWNoIGhhcyBhIGxvd2Vy
IHRhYiBpbmRleCBidXQgaXMgc3RpbGwgc3VpdGFibGUgZm9yIHVzZS4KLQkJbG93ZXN0U3VpdGFi
bGVUYWJJbmRleCA9IG4tPnRhYkluZGV4KCk7Ci0JICAgIH0KLQotCSAgICBpZiAobiA9PSBmcm9t
Tm9kZSkKLQkJcmVhY2hlZEZyb21Ob2RlID0gdHJ1ZTsKLQl9Ci0KLQlpZiAobG93ZXN0U3VpdGFi
bGVUYWJJbmRleCA9PSA2NTUzNSkgewotCSAgICAvLyBObyBuZXh0IG5vZGUgd2l0aCBhIHRhYiBp
bmRleCAtPiBqdXN0IHRha2UgZmlyc3Qgbm9kZSB3aXRoIHRhYiBpbmRleCBvZiAwCi0JICAgIE5v
ZGVJbXBsICpuID0gdGhpczsKLQkgICAgd2hpbGUgKG4gJiYgIShuLT5pc0tleWJvYXJkRm9jdXNh
YmxlKCkgJiYgbi0+dGFiSW5kZXgoKSA9PSAwKSkKLQkJbiA9IG4tPnRyYXZlcnNlTmV4dE5vZGUo
KTsKLQkgICAgcmV0dXJuIG47Ci0JfQotCi0JLy8gU2VhcmNoIGZvcndhcmRzIGZyb20gZnJvbU5v
ZGUKLQlmb3IgKG4gPSBmcm9tTm9kZS0+dHJhdmVyc2VOZXh0Tm9kZSgpOyBuICE9IDA7IG4gPSBu
LT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUo
KSAmJiAobi0+dGFiSW5kZXgoKSA9PSBsb3dlc3RTdWl0YWJsZVRhYkluZGV4KSkKLQkJcmV0dXJu
IG47Ci0JfQotCi0JLy8gVGhlIG5leHQgbm9kZSBpc24ndCBhZnRlciBmcm9tTm9kZSwgc3RhcnQg
ZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudAotCWZvciAobiA9IHRoaXM7IG4gIT0g
ZnJvbU5vZGU7IG4gPSBuLT50cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+dGFiSW5kZXgoKSA9PSBsb3dlc3RTdWl0YWJsZVRhYklu
ZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JYXNzZXJ0KGZhbHNlKTsgLy8gc2hvdWxkIG5ldmVy
IGdldCBoZXJlCi0JcmV0dXJuIDA7Ci0gICAgfQotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBs
OjpwcmV2aW91c0ZvY3VzTm9kZShOb2RlSW1wbCAqZnJvbU5vZGUpCi17Ci0gICAgTm9kZUltcGwg
Kmxhc3ROb2RlID0gdGhpczsKLSAgICB3aGlsZSAobGFzdE5vZGUtPmxhc3RDaGlsZCgpKQotCWxh
c3ROb2RlID0gbGFzdE5vZGUtPmxhc3RDaGlsZCgpOwotCi0gICAgaWYgKCFmcm9tTm9kZSkgewot
CS8vIE5vIHN0YXJ0aW5nIG5vZGUgc3VwcGxpZWQ7IGJlZ2luIHdpdGggdGhlIHZlcnkgbGFzdCBu
b2RlIGluIHRoZSBkb2N1bWVudAotCU5vZGVJbXBsICpuOwotCi0JaW50IGhpZ2hlc3RUYWJJbmRl
eCA9IDA7Ci0JZm9yIChuID0gbGFzdE5vZGU7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNlUHJldmlv
dXNOb2RlKCkpIHsKLQkgICAgaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSkgewotCQlpZiAo
bi0+dGFiSW5kZXgoKSA9PSAwKQotCQkgICAgcmV0dXJuIG47Ci0JCWVsc2UgaWYgKG4tPnRhYklu
ZGV4KCkgPiBoaWdoZXN0VGFiSW5kZXgpCi0JCSAgICBoaWdoZXN0VGFiSW5kZXggPSBuLT50YWJJ
bmRleCgpOwotCSAgICB9Ci0JfQotCi0JLy8gTm8gbm9kZSB3aXRoIGEgdGFiIGluZGV4IG9mIDA7
IGp1c3QgZ28gdG8gdGhlIGxhc3Qgbm9kZSB3aXRoIHRoZSBoaWdoZXN0IHRhYiBpbmRleAotCWZv
ciAobiA9IGxhc3ROb2RlOyBuICE9IDA7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7
Ci0JICAgIGlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0g
aGlnaGVzdFRhYkluZGV4KSkKLQkJcmV0dXJuIG47Ci0JfQotCi0JcmV0dXJuIDA7Ci0gICAgfQot
ICAgIGVsc2UgewotCXVuc2lnbmVkIHNob3J0IGZyb21UYWJJbmRleCA9IGZyb21Ob2RlLT50YWJJ
bmRleCgpOwotCi0JaWYgKGZyb21UYWJJbmRleCA9PSAwKSB7Ci0JICAgIC8vIEZpbmQgdGhlIHBy
ZXZpb3VzIHNlbGVjdGFibGUgbm9kZSBiZWZvcmUgZnJvbU5vZGUgKGluIGRvY3VtZW50IG9yZGVy
KSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIHRhYiBpbmRleAotCSAgICBOb2RlSW1wbCAqbiA9IGZyb21O
b2RlLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpOwotCSAgICB3aGlsZSAobiAmJiAhKG4tPmlzS2V5
Ym9hcmRGb2N1c2FibGUoKSAmJiBuLT50YWJJbmRleCgpID09IDApKQotCQluID0gbi0+dHJhdmVy
c2VQcmV2aW91c05vZGUoKTsKLQkgICAgaWYgKG4pCi0JCXJldHVybiBuOwotCi0JICAgIC8vIE5v
IHByZXZpb3VzIG5vZGVzIHdpdGggYSAwIHRhYiBpbmRleCwgZ28gdG8gdGhlIGxhc3Qgbm9kZSBp
biB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgdGhlIGhpZ2hlc3QgdGFiIGluZGV4Ci0JICAgIGludCBo
aWdoZXN0VGFiSW5kZXggPSAwOwotCSAgICBmb3IgKG4gPSB0aGlzOyBuICE9IDA7IG4gPSBuLT50
cmF2ZXJzZU5leHROb2RlKCkpIHsKLQkJaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAo
bi0+dGFiSW5kZXgoKSA+IGhpZ2hlc3RUYWJJbmRleCkpCi0JCSAgICBoaWdoZXN0VGFiSW5kZXgg
PSBuLT50YWJJbmRleCgpOwotCSAgICB9Ci0KLQkgICAgaWYgKGhpZ2hlc3RUYWJJbmRleCA9PSAw
KQotCQlyZXR1cm4gMDsKLQotCSAgICBmb3IgKG4gPSBsYXN0Tm9kZTsgbiAhPSAwOyBuID0gbi0+
dHJhdmVyc2VQcmV2aW91c05vZGUoKSkgewotCQlpZiAobi0+aXNLZXlib2FyZEZvY3VzYWJsZSgp
ICYmIChuLT50YWJJbmRleCgpID09IGhpZ2hlc3RUYWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsK
LQkgICAgfQotCi0JICAgIGFzc2VydChmYWxzZSk7IC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQot
CSAgICByZXR1cm4gMDsKLQl9Ci0JZWxzZSB7Ci0JICAgIC8vIEZpbmQgdGhlIGxvd2VzdCB0YWIg
aW5kZXggb3V0IG9mIGFsbCB0aGUgbm9kZXMgZXhjZXB0IGZyb21Ob2RlLCB0aGF0IGlzIGxlc3Mg
dGhhbiBvciBlcXVhbCB0byBmcm9tTm9kZSdzCi0JICAgIC8vIHRhYiBpbmRleC4gRm9yIG5vZGVz
IHdpdGggdGhlIHNhbWUgdGFiIGluZGV4IGFzIGZyb21Ob2RlLCB3ZSBhcmUgb25seSBpbnRlcmVz
dGVkIGluIHRob3NlIGJlZm9yZQotCSAgICAvLyBmcm9tTm9kZS4KLQkgICAgLy8gSWYgd2UgZG9u
J3QgZmluZCBhIHN1aXRhYmxlIHRhYiBpbmRleCwgdGhlbiB0aGVyZSB3aWxsIGJlIG5vIHByZXZp
b3VzIGZvY3VzIG5vZGUuCi0JICAgIHVuc2lnbmVkIHNob3J0IGhpZ2hlc3RTdWl0YWJsZVRhYklu
ZGV4ID0gMDsKLQkgICAgTm9kZUltcGwgKm47Ci0KLQkgICAgYm9vbCByZWFjaGVkRnJvbU5vZGUg
PSBmYWxzZTsKLQkgICAgZm9yIChuID0gdGhpczsgbiAhPSAwOyBuID0gbi0+dHJhdmVyc2VOZXh0
Tm9kZSgpKSB7Ci0JCWlmIChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYKLQkJICAgICgoIXJl
YWNoZWRGcm9tTm9kZSAmJiAobi0+dGFiSW5kZXgoKSA8PSBmcm9tVGFiSW5kZXgpKSB8fAotCQkg
ICAgIChyZWFjaGVkRnJvbU5vZGUgJiYgKG4tPnRhYkluZGV4KCkgPCBmcm9tVGFiSW5kZXgpKSkg
ICYmCi0JCSAgICAobi0+dGFiSW5kZXgoKSA+IGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4KSAmJgot
CQkgICAgKG4gIT0gZnJvbU5vZGUpKSB7Ci0KLQkJICAgIC8vIFdlIGZvdW5kIGEgc2VsZWN0YWJs
ZSBub2RlIHdpdGggYSB0YWIgaW5kZXggbm8gaGlnaGVyIHRoYW4gZnJvbU5vZGUncy4gS2VlcCBz
ZWFyY2hpbmcgdGhvdWdoLCBhcwotCQkgICAgLy8gdGhlcmUgbWF5IGJlIGFub3RoZXIgbm9kZSB3
aGljaCBoYXMgYSBoaWdoZXIgdGFiIGluZGV4IGJ1dCBpcyBzdGlsbCBzdWl0YWJsZSBmb3IgdXNl
LgotCQkgICAgaGlnaGVzdFN1aXRhYmxlVGFiSW5kZXggPSBuLT50YWJJbmRleCgpOwotCQl9Ci0K
LQkJaWYgKG4gPT0gZnJvbU5vZGUpCi0JCSAgICByZWFjaGVkRnJvbU5vZGUgPSB0cnVlOwotCSAg
ICB9Ci0KLQkgICAgaWYgKGhpZ2hlc3RTdWl0YWJsZVRhYkluZGV4ID09IDApIHsKLQkJLy8gTm8g
cHJldmlvdXMgbm9kZSB3aXRoIGEgdGFiIGluZGV4LiBTaW5jZSB0aGUgb3JkZXIgc3BlY2lmaWVk
IGJ5IEhUTUwgaXMgbm9kZXMgd2l0aCB0YWIgaW5kZXggPiAwCi0JCS8vIGZpcnN0LCB0aGlzIG1l
YW5zIHRoYXQgdGhlcmUgaXMgbm8gcHJldmlvdXMgbm9kZS4KLQkJcmV0dXJuIDA7Ci0JICAgIH0K
LQotCSAgICAvLyBTZWFyY2ggYmFja3dhcmRzIGZyb20gZnJvbU5vZGUKLQkgICAgZm9yIChuID0g
ZnJvbU5vZGUtPnRyYXZlcnNlUHJldmlvdXNOb2RlKCk7IG4gIT0gMDsgbiA9IG4tPnRyYXZlcnNl
UHJldmlvdXNOb2RlKCkpIHsKLQkJaWYgKG4tPmlzS2V5Ym9hcmRGb2N1c2FibGUoKSAmJiAobi0+
dGFiSW5kZXgoKSA9PSBoaWdoZXN0U3VpdGFibGVUYWJJbmRleCkpCi0JCSAgICByZXR1cm4gbjsK
LQkgICAgfQotCSAgICAvLyBUaGUgcHJldmlvdXMgbm9kZSBpc24ndCBiZWZvcmUgZnJvbU5vZGUs
IHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkgICAgZm9yIChuID0gbGFzdE5v
ZGU7IG4gIT0gZnJvbU5vZGU7IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKSB7Ci0JCWlm
IChuLT5pc0tleWJvYXJkRm9jdXNhYmxlKCkgJiYgKG4tPnRhYkluZGV4KCkgPT0gaGlnaGVzdFN1
aXRhYmxlVGFiSW5kZXgpKQotCQkgICAgcmV0dXJuIG47Ci0JICAgIH0KLQotCSAgICBhc3NlcnQo
ZmFsc2UpOyAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKLQkgICAgcmV0dXJuIDA7Ci0JfQotICAg
IH0KLX0KLQotaW50IERvY3VtZW50SW1wbDo6bm9kZUFic0luZGV4KE5vZGVJbXBsICpub2RlKQot
ewotICAgIGFzc2VydChub2RlLT5nZXREb2N1bWVudCgpID09IHRoaXMpOwotCi0gICAgaW50IGFi
c0luZGV4ID0gMDsKLSAgICBmb3IgKE5vZGVJbXBsICpuID0gbm9kZTsgbiAmJiBuICE9IHRoaXM7
IG4gPSBuLT50cmF2ZXJzZVByZXZpb3VzTm9kZSgpKQotCWFic0luZGV4Kys7Ci0gICAgcmV0dXJu
IGFic0luZGV4OwotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRJbXBsOjpub2RlV2l0aEFic0luZGV4
KGludCBhYnNJbmRleCkKLXsKLSAgICBOb2RlSW1wbCAqbiA9IHRoaXM7Ci0gICAgZm9yIChpbnQg
aSA9IDA7IG4gJiYgKGkgPCBhYnNJbmRleCk7IGkrKykgewotCW4gPSBuLT50cmF2ZXJzZU5leHRO
b2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBuOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cHJv
Y2Vzc0h0dHBFcXVpdihjb25zdCBET01TdHJpbmcgJmVxdWl2LCBjb25zdCBET01TdHJpbmcgJmNv
bnRlbnQpCi17Ci0gICAgYXNzZXJ0KCFlcXVpdi5pc051bGwoKSAmJiAhY29udGVudC5pc051bGwo
KSk7Ci0KLSAgICBGcmFtZSAqZnJhbWUgPSB0aGlzLT5mcmFtZSgpOwotCi0gICAgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKGVxdWl2LCAiZGVmYXVsdC1zdHlsZSIpKSB7Ci0gICAgICAgIC8vIFRoZSBw
cmVmZXJyZWQgc3R5bGUgc2V0IGhhcyBiZWVuIG92ZXJyaWRkZW4gYXMgcGVyIHNlY3Rpb24gCi0g
ICAgICAgIC8vIDE0LjMuMiBvZiB0aGUgSFRNTDQuMCBzcGVjaWZpY2F0aW9uLiAgV2UgbmVlZCB0
byB1cGRhdGUgdGhlCi0gICAgICAgIC8vIHNoZWV0IHVzZWQgdmFyaWFibGUgYW5kIHRoZW4gdXBk
YXRlIG91ciBzdHlsZSBzZWxlY3Rvci4gCi0gICAgICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSB0
aGUgdGVzdCBhdDoKLSAgICAgICAgLy8gaHR0cDovL3d3dy5oaXhpZS5jaC90ZXN0cy9ldmlsL2Nz
cy9pbXBvcnQvbWFpbi9wcmVmZXJyZWQuaHRtbAotICAgICAgICAvLyAtZHdoCi0gICAgICAgIG1f
c2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgbV9wcmVmZXJyZWRTdHls
ZXNoZWV0U2V0ID0gY29udGVudDsKLSAgICAgICAgdXBkYXRlU3R5bGVTZWxlY3RvcigpOwotICAg
IH0KLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgInJlZnJlc2giKSAmJiBm
cmFtZS0+bWV0YVJlZnJlc2hFbmFibGVkKCkpCi0gICAgewotICAgICAgICAvLyBnZXQgZGVsYXkg
YW5kIHVybAotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRlbnQucXN0cmluZygpLnN0cmlwV2hp
dGVTcGFjZSgpOwotICAgICAgICBpbnQgcG9zID0gc3RyLmZpbmQoUVJlZ0V4cCgiWzssXSIpKTsK
LSAgICAgICAgaWYgKCBwb3MgPT0gLTEgKQotICAgICAgICAgICAgcG9zID0gc3RyLmZpbmQoUVJl
Z0V4cCgiWyBcdF0iKSk7Ci0KLSAgICAgICAgaWYgKHBvcyA9PSAtMSkgLy8gVGhlcmUgY2FuIGJl
IG5vIHVybCAoRGF2aWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgb2sgPSBmYWxzZTsK
LSAgICAgICAgICAgIGludCBkZWxheSA9IDA7Ci0JICAgIGRlbGF5ID0gc3RyLnRvSW50KCZvayk7
Ci0JICAgIC8vIFdlIHdhbnQgYSBuZXcgaGlzdG9yeSBpdGVtIGlmIHRoZSByZWZyZXNoIHRpbWVv
dXQgPiAxIHNlY29uZAotCSAgICBpZihvayAmJiBmcmFtZSkgZnJhbWUtPnNjaGVkdWxlUmVkaXJl
Y3Rpb24oZGVsYXksIGZyYW1lLT51cmwoKS51cmwoKSwgZGVsYXkgPD0gMSk7Ci0gICAgICAgIH0g
ZWxzZSB7Ci0gICAgICAgICAgICBkb3VibGUgZGVsYXkgPSAwOwotICAgICAgICAgICAgYm9vbCBv
ayA9IGZhbHNlOwotCSAgICBkZWxheSA9IHN0ci5sZWZ0KHBvcykuc3RyaXBXaGl0ZVNwYWNlKCku
dG9Eb3VibGUoJm9rKTsKLQotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICB3aGlsZShw
b3MgPCAoaW50KXN0ci5sZW5ndGgoKSAmJiBzdHJbcG9zXS5pc1NwYWNlKCkpIHBvcysrOwotICAg
ICAgICAgICAgc3RyID0gc3RyLm1pZChwb3MpOwotICAgICAgICAgICAgaWYgKHN0ci5maW5kKCJ1
cmwiLCAwLCAgZmFsc2UgKSA9PSAwKQotICAgICAgICAgICAgICAgIHN0ciA9IHN0ci5taWQoMyk7
Ci0gICAgICAgICAgICBzdHIgPSBzdHIuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgICAgICBp
ZiAoc3RyLmxlbmd0aCgpICYmIHN0clswXSA9PSAnPScpCi0gICAgICAgICAgICAgICAgc3RyID0g
c3RyLm1pZCgxKS5zdHJpcFdoaXRlU3BhY2UoKTsKLSAgICAgICAgICAgIHN0ciA9IHBhcnNlVVJM
KERPTVN0cmluZyhzdHIpKS5xc3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAob2sgJiYgZnJhbWUp
Ci0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCBhIG5ldyBoaXN0b3J5IGl0ZW0gaWYgdGhlIHJl
ZnJlc2ggdGltZW91dCA+IDEgc2Vjb25kCi0gICAgICAgICAgICAgICAgZnJhbWUtPnNjaGVkdWxl
UmVkaXJlY3Rpb24oZGVsYXksIGNvbXBsZXRlVVJMKCBzdHIgKSwgZGVsYXkgPD0gMSk7Ci0gICAg
ICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoZXF1aXYsICJleHBp
cmVzIikpCi0gICAgewotICAgICAgICBRU3RyaW5nIHN0ciA9IGNvbnRlbnQucXN0cmluZygpLnN0
cmlwV2hpdGVTcGFjZSgpOwotICAgICAgICB0aW1lX3QgZXhwaXJlX2RhdGUgPSBzdHIudG9JbnQo
KTsKLSAgICAgICAgaWYgKG1fZG9jTG9hZGVyKQotICAgICAgICAgICAgbV9kb2NMb2FkZXItPnNl
dEV4cGlyZURhdGUoZXhwaXJlX2RhdGUpOwotICAgIH0KLSAgICBlbHNlIGlmICgoZXF1YWxJZ25v
cmluZ0Nhc2UoZXF1aXYsICJwcmFnbWEiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShlcXVpdiwgImNh
Y2hlLWNvbnRyb2wiKSkgJiYgZnJhbWUpCi0gICAgewotICAgICAgICBRU3RyaW5nIHN0ciA9IGNv
bnRlbnQucXN0cmluZygpLmxvd2VyKCkuc3RyaXBXaGl0ZVNwYWNlKCk7Ci0gICAgICAgIEtVUkwg
dXJsID0gZnJhbWUtPnVybCgpOwotICAgIH0KLSAgICBlbHNlIGlmIChlcXVhbElnbm9yaW5nQ2Fz
ZShlcXVpdiwgInNldC1jb29raWUiKSkKLSAgICB7Ci0gICAgICAgIC8vICMjIyBtYWtlIHNldENv
b2tpZSB3b3JrIG9uIFhNTCBkb2N1bWVudHMgdG9vOyBlLmcuIGluIGNhc2Ugb2YgPGh0bWw6bWV0
YSAuLi4uLj4KLSAgICAgICAgaWYgKGlzSFRNTERvY3VtZW50KCkpCi0gICAgICAgICAgICBzdGF0
aWNfY2FzdDxIVE1MRG9jdW1lbnRJbXBsICo+KHRoaXMpLT5zZXRDb29raWUoY29udGVudCk7Ci0g
ICAgfQotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFk
b25seSwgaW50IHgsIGludCB5LCBNb3VzZUV2ZW50KiBldikKLXsKLSAgICByZXR1cm4gcHJlcGFy
ZU1vdXNlRXZlbnQocmVhZG9ubHksIGV2LT50eXBlID09IE1vdXNlUHJlc3MsIHgsIHksIGV2KTsK
LX0KLQotYm9vbCBEb2N1bWVudEltcGw6OnByZXBhcmVNb3VzZUV2ZW50KGJvb2wgcmVhZG9ubHks
IGJvb2wgYWN0aXZlLCBpbnQgX3gsIGludCBfeSwgTW91c2VFdmVudCAqZXYpCi17Ci0gICAgaWYg
KCBtX3JlbmRlciApIHsKLSAgICAgICAgYXNzZXJ0KG1fcmVuZGVyLT5pc0NhbnZhcygpKTsKLSAg
ICAgICAgUmVuZGVyT2JqZWN0OjpOb2RlSW5mbyByZW5kZXJJbmZvKHJlYWRvbmx5LCBhY3RpdmUs
IGV2LT50eXBlID09IE1vdXNlTW92ZSk7Ci0gICAgICAgIGJvb2wgaXNJbnNpZGUgPSBtX3JlbmRl
ci0+bGF5ZXIoKS0+aGl0VGVzdChyZW5kZXJJbmZvLCBfeCwgX3kpOwotICAgICAgICBldi0+aW5u
ZXJOb2RlID0gcmVuZGVySW5mby5pbm5lck5vZGUoKTsKLQotICAgICAgICBpZiAocmVuZGVySW5m
by5VUkxFbGVtZW50KCkpIHsKLSAgICAgICAgICAgIGFzc2VydChyZW5kZXJJbmZvLlVSTEVsZW1l
bnQoKS0+aXNFbGVtZW50Tm9kZSgpKTsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsKiBlID0gIHN0
YXRpY19jYXN0PEVsZW1lbnRJbXBsKj4ocmVuZGVySW5mby5VUkxFbGVtZW50KCkpOwotICAgICAg
ICAgICAgRE9NU3RyaW5nIGhyZWYgPSBraHRtbDo6cGFyc2VVUkwoZS0+Z2V0QXR0cmlidXRlKGhy
ZWZBdHRyKSk7Ci0gICAgICAgICAgICBET01TdHJpbmcgdGFyZ2V0ID0gZS0+Z2V0QXR0cmlidXRl
KHRhcmdldEF0dHIpOwotCi0gICAgICAgICAgICBpZiAoIXRhcmdldC5pc051bGwoKSAmJiAhaHJl
Zi5pc051bGwoKSkgewotICAgICAgICAgICAgICAgIGV2LT50YXJnZXQgPSB0YXJnZXQ7Ci0gICAg
ICAgICAgICAgICAgZXYtPnVybCA9IGhyZWY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgZXYtPnVybCA9IGhyZWY7Ci0gICAgICAgIH0KLQotICAgICAg
ICBpZiAoIXJlYWRvbmx5KQotICAgICAgICAgICAgdXBkYXRlUmVuZGVyaW5nKCk7Ci0KLSAgICAg
ICAgcmV0dXJuIGlzSW5zaWRlOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0v
LyBET00gU2VjdGlvbiAxLjEuMQotYm9vbCBEb2N1bWVudEltcGw6OmNoaWxkQWxsb3dlZCggTm9k
ZUltcGwgKm5ld0NoaWxkICkKLXsKLSAgICAvLyBEb2N1bWVudHMgbWF5IGNvbnRhaW4gYSBtYXhp
bXVtIG9mIG9uZSBFbGVtZW50IGNoaWxkCi0gICAgaWYgKG5ld0NoaWxkLT5ub2RlVHlwZSgpID09
IE5vZGU6OkVMRU1FTlRfTk9ERSkgewotICAgICAgICBOb2RlSW1wbCAqYzsKLSAgICAgICAgZm9y
IChjID0gZmlyc3RDaGlsZCgpOyBjOyBjID0gYy0+bmV4dFNpYmxpbmcoKSkgewotICAgICAgICAg
ICAgaWYgKGMtPm5vZGVUeXBlKCkgPT0gTm9kZTo6RUxFTUVOVF9OT0RFKQotICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIERvY3VtZW50cyBt
YXkgY29udGFpbiBhIG1heGltdW0gb2Ygb25lIERvY3VtZW50VHlwZSBjaGlsZAotICAgIGlmIChu
ZXdDaGlsZC0+bm9kZVR5cGUoKSA9PSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREUpIHsKLSAgICAg
ICAgTm9kZUltcGwgKmM7Ci0gICAgICAgIGZvciAoYyA9IGZpcnN0Q2hpbGQoKTsgYzsgYyA9IGMt
Pm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgIGlmIChjLT5ub2RlVHlwZSgpID09IE5vZGU6
OkRPQ1VNRU5UX1RZUEVfTk9ERSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAg
ICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2hpbGRUeXBlQWxsb3dlZChuZXdDaGlsZC0+bm9k
ZVR5cGUoKSk7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpjaGlsZFR5cGVBbGxvd2VkKCB1bnNp
Z25lZCBzaG9ydCB0eXBlICkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBO
b2RlOjpFTEVNRU5UX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVD
VElPTl9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OkNPTU1FTlRfTk9ERToKLSAgICAgICAgY2Fz
ZSBOb2RlOjpET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAg
ICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLU5v
ZGVJbXBsICpEb2N1bWVudEltcGw6OmNsb25lTm9kZSAoIGJvb2wgLypkZWVwKi8gKQotewotICAg
IC8vIFNwZWMgc2F5cyBjbG9uaW5nIERvY3VtZW50IG5vZGVzIGlzICJpbXBsZW1lbnRhdGlvbiBk
ZXBlbmRlbnQiCi0gICAgLy8gc28gd2UgZG8gbm90IHN1cHBvcnQgaXQuLi4KLSAgICByZXR1cm4g
MDsKLX0KLQotU3R5bGVTaGVldExpc3RJbXBsKiBEb2N1bWVudEltcGw6OnN0eWxlU2hlZXRzKCkK
LXsKLSAgICByZXR1cm4gbV9zdHlsZVNoZWV0czsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1w
bDo6cHJlZmVycmVkU3R5bGVzaGVldFNldCgpCi17Ci0gIHJldHVybiBtX3ByZWZlcnJlZFN0eWxl
c2hlZXRTZXQ7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OnNlbGVjdGVkU3R5bGVzaGVl
dFNldCgpCi17Ci0gIHJldHVybiBtX3NlbGVjdGVkU3R5bGVzaGVldFNldDsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OnNldFNlbGVjdGVkU3R5bGVzaGVldFNldChjb25zdCBET01TdHJpbmcmIGFT
dHJpbmcpCi17Ci0gIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gYVN0cmluZzsKLSAgdXBkYXRl
U3R5bGVTZWxlY3RvcigpOwotICBpZiAocmVuZGVyZXIoKSkKLSAgICByZW5kZXJlcigpLT5yZXBh
aW50KCk7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciBhIHRvcC1sZXZl
bCBzdHlsZXNoZWV0IGhhcyBmaW5pc2hlZCBsb2FkaW5nLgotdm9pZCBEb2N1bWVudEltcGw6OnN0
eWxlc2hlZXRMb2FkZWQoKQotewotICAvLyBNYWtlIHN1cmUgd2Uga25ldyB0aGlzIHNoZWV0IHdh
cyBwZW5kaW5nLCBhbmQgdGhhdCBvdXIgY291bnQgaXNuJ3Qgb3V0IG9mIHN5bmMuCi0gIGFzc2Vy
dChtX3BlbmRpbmdTdHlsZXNoZWV0cyA+IDApOwotCi0gIG1fcGVuZGluZ1N0eWxlc2hlZXRzLS07
Ci0gIAotI2lmZGVmIElOU1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgaWYgKCFvd25lckVs
ZW1lbnQoKSkKLSAgICAgIHByaW50ZigiU3R5bGVzaGVldCBsb2FkZWQgYXQgdGltZSAlZC4gJWQg
c3R5bGVzaGVldHMgc3RpbGwgcmVtYWluLlxuIiwgZWxhcHNlZFRpbWUoKSwgbV9wZW5kaW5nU3R5
bGVzaGVldHMpOwotI2VuZGlmCi0KLSAgdXBkYXRlU3R5bGVTZWxlY3RvcigpOyAgICAKLX0KLQot
dm9pZCBEb2N1bWVudEltcGw6OnVwZGF0ZVN0eWxlU2VsZWN0b3IoKQotewotICAgIC8vIERvbid0
IGJvdGhlciB1cGRhdGluZywgc2luY2Ugd2UgaGF2ZW4ndCBsb2FkZWQgYWxsIG91ciBzdHlsZSBp
bmZvIHlldC4KLSAgICBpZiAoIWhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpKQotICAgICAgICByZXR1
cm47Ci0KLSNpZmRlZiBJTlNUUlVNRU5UX0xBWU9VVF9TQ0hFRFVMSU5HCi0gICAgaWYgKCFvd25l
ckVsZW1lbnQoKSkKLSAgICAgICAgcHJpbnRmKCJCZWdpbm5pbmcgdXBkYXRlIG9mIHN0eWxlIHNl
bGVjdG9yIGF0IHRpbWUgJWQuXG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgcmVj
YWxjU3R5bGVTZWxlY3RvcigpOwotICAgIHJlY2FsY1N0eWxlKEZvcmNlKTsKLQotI2lmZGVmIElO
U1RSVU1FTlRfTEFZT1VUX1NDSEVEVUxJTkcKLSAgICBpZiAoIW93bmVyRWxlbWVudCgpKQotICAg
ICAgICBwcmludGYoIkZpbmlzaGVkIHVwZGF0ZSBvZiBzdHlsZSBzZWxlY3RvciBhdCB0aW1lICVk
XG4iLCBlbGFwc2VkVGltZSgpKTsKLSNlbmRpZgotCi0gICAgaWYgKHJlbmRlcmVyKCkpIHsKLSAg
ICAgICAgcmVuZGVyZXIoKS0+c2V0TmVlZHNMYXlvdXRBbmRNaW5NYXhSZWNhbGMoKTsKLSAgICAg
ICAgaWYgKHZpZXcoKSkKLSAgICAgICAgICAgIHZpZXcoKS0+c2NoZWR1bGVSZWxheW91dCgpOwot
ICAgIH0KLX0KLQotCi1RU3RyaW5nTGlzdCBEb2N1bWVudEltcGw6OmF2YWlsYWJsZVN0eWxlU2hl
ZXRzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hdmFpbGFibGVTaGVldHM7Ci19Ci0KLXZvaWQg
RG9jdW1lbnRJbXBsOjpyZWNhbGNTdHlsZVNlbGVjdG9yKCkKLXsKLSAgICBpZiAoICFtX3JlbmRl
ciB8fCAhYXR0YWNoZWQoKSApIHJldHVybjsKLQotICAgIFFQdHJMaXN0PFN0eWxlU2hlZXRJbXBs
PiBvbGRTdHlsZVNoZWV0cyA9IG1fc3R5bGVTaGVldHMtPnN0eWxlU2hlZXRzOwotICAgIG1fc3R5
bGVTaGVldHMtPnN0eWxlU2hlZXRzLmNsZWFyKCk7Ci0gICAgbV9hdmFpbGFibGVTaGVldHMuY2xl
YXIoKTsKLSAgICBOb2RlSW1wbCAqbjsKLSAgICBmb3IgKG4gPSB0aGlzOyBuOyBuID0gbi0+dHJh
dmVyc2VOZXh0Tm9kZSgpKSB7Ci0gICAgCVN0eWxlU2hlZXRJbXBsICpzaGVldCA9IDA7Ci0KLSAg
ICAgICAgaWYgKG4tPm5vZGVUeXBlKCkgPT0gTm9kZTo6UFJPQ0VTU0lOR19JTlNUUlVDVElPTl9O
T0RFKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBQcm9jZXNzaW5nIGluc3RydWN0aW9uIChY
TUwgZG9jdW1lbnRzIG9ubHkpCi0gICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBs
KiBwaSA9IHN0YXRpY19jYXN0PFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwqPihuKTsKLSAgICAg
ICAgICAgIHNoZWV0ID0gcGktPnNoZWV0KCk7Ci0jaWZkZWYgS0hUTUxfWFNMVAotICAgICAgICAg
ICAgaWYgKHBpLT5pc1hTTCgpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG9uJ3QgYXBwbHkgdHJh
bnNmb3JtcyB0byBhbHJlYWR5IHRyYW5zZm9ybWVkIGRvY3VtZW50cyAtLSA8cmRhcjovL3Byb2Js
ZW0vNDEzMjgwNj4KLSAgICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybVNvdXJjZURvY3VtZW50
KCkpCi0gICAgICAgICAgICAgICAgICAgIGFwcGx5WFNMVHJhbnNmb3JtKHBpKTsKLSAgICAgICAg
ICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIGlmICgh
c2hlZXQgJiYgIXBpLT5sb2NhbEhyZWYoKS5pc0VtcHR5KCkpCi0gICAgICAgICAgICB7Ci0gICAg
ICAgICAgICAgICAgLy8gUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aXRoIHJlZmVyZW5jZSB0byBh
biBlbGVtZW50IGluIHRoaXMgZG9jdW1lbnQgLSBlLmcuCi0gICAgICAgICAgICAgICAgLy8gPD94
bWwtc3R5bGVzaGVldCBocmVmPSIjbXlzdHlsZSI+LCB3aXRoIHRoZSBlbGVtZW50Ci0gICAgICAg
ICAgICAgICAgLy8gPGZvbyBpZD0ibXlzdHlsZSI+aGVhZGluZyB7IGNvbG9yOiByZWQ7IH08L2Zv
bz4gYXQgc29tZSBsb2NhdGlvbiBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBkb2N1bWVudAot
ICAgICAgICAgICAgICAgIEVsZW1lbnRJbXBsKiBlbGVtID0gZ2V0RWxlbWVudEJ5SWQocGktPmxv
Y2FsSHJlZigpKTsKLSAgICAgICAgICAgICAgICBpZiAoZWxlbSkgewotICAgICAgICAgICAgICAg
ICAgICBET01TdHJpbmcgc2hlZXRUZXh0KCIiKTsKLSAgICAgICAgICAgICAgICAgICAgTm9kZUlt
cGwgKmM7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoYyA9IGVsZW0tPmZpcnN0Q2hpbGQoKTsg
YzsgYyA9IGMtPm5leHRTaWJsaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChj
LT5ub2RlVHlwZSgpID09IE5vZGU6OlRFWFRfTk9ERSB8fCBjLT5ub2RlVHlwZSgpID09IE5vZGU6
OkNEQVRBX1NFQ1RJT05fTk9ERSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldFRl
eHQgKz0gYy0+bm9kZVZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAg
ICAgICAgICAgICBDU1NTdHlsZVNoZWV0SW1wbCAqY3NzU2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVl
dEltcGwodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNzc1NoZWV0LT5wYXJzZVN0cmluZyhz
aGVldFRleHQpOwotICAgICAgICAgICAgICAgICAgICBwaS0+c2V0U3R5bGVTaGVldChjc3NTaGVl
dCk7Ci0gICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gY3NzU2hlZXQ7Ci0gICAgICAgICAgICAg
ICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobi0+aXNI
VE1MRWxlbWVudCgpICYmIChuLT5oYXNUYWdOYW1lKGxpbmtUYWcpIHx8IG4tPmhhc1RhZ05hbWUo
c3R5bGVUYWcpKSkgewotICAgICAgICAgICAgSFRNTEVsZW1lbnRJbXBsICplID0gc3RhdGljX2Nh
c3Q8SFRNTEVsZW1lbnRJbXBsICo+KG4pOwotICAgICAgICAgICAgUVN0cmluZyB0aXRsZSA9IGUt
PmdldEF0dHJpYnV0ZSh0aXRsZUF0dHIpLnFzdHJpbmcoKTsKLSAgICAgICAgICAgIGJvb2wgZW5h
YmxlZFZpYVNjcmlwdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGUtPmhhc0xvY2FsTmFtZShs
aW5rVGFnKSkgewotICAgICAgICAgICAgICAgIC8vIDxMSU5LPiBlbGVtZW50Ci0gICAgICAgICAg
ICAgICAgSFRNTExpbmtFbGVtZW50SW1wbCogbCA9IHN0YXRpY19jYXN0PEhUTUxMaW5rRWxlbWVu
dEltcGwqPihuKTsKLSAgICAgICAgICAgICAgICBpZiAobC0+aXNMb2FkaW5nKCkgfHwgbC0+aXNE
aXNhYmxlZCgpKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAg
ICBpZiAoIWwtPnNoZWV0KCkpCi0gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gUVN0cmluZzo6
bnVsbDsKLSAgICAgICAgICAgICAgICBlbmFibGVkVmlhU2NyaXB0ID0gbC0+aXNFbmFibGVkVmlh
U2NyaXB0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVu
dCBwcmVmZXJyZWQgc3R5bGVzZXQuICBUaGlzIGlzIHRoZQotICAgICAgICAgICAgLy8gc2V0IG9m
IHNoZWV0cyB0aGF0IHdpbGwgYmUgZW5hYmxlZC4KLSAgICAgICAgICAgIGlmIChlLT5oYXNMb2Nh
bE5hbWUobGlua1RhZykpCi0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0aWNfY2FzdDxIVE1M
TGlua0VsZW1lbnRJbXBsKj4obiktPnNoZWV0KCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAg
ICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAgICAgICAgc2hlZXQgPSBzdGF0
aWNfY2FzdDxIVE1MU3R5bGVFbGVtZW50SW1wbCo+KG4pLT5zaGVldCgpOwotCi0gICAgICAgICAg
ICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBzaGVldCBiZWxvbmdzIHRvIGEgc3R5bGVzZXQKLSAg
ICAgICAgICAgIC8vICh0aHVzIG1ha2luZyBpdCBQUkVGRVJSRUQgb3IgQUxURVJOQVRFIHJhdGhl
ciB0aGFuCi0gICAgICAgICAgICAvLyBQRVJTSVNURU5UKS4KLSAgICAgICAgICAgIGlmICghZW5h
YmxlZFZpYVNjcmlwdCAmJiAhdGl0bGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgLy8g
WWVzLCB3ZSBoYXZlIGEgdGl0bGUuCi0gICAgICAgICAgICAgICAgaWYgKG1fcHJlZmVycmVkU3R5
bGVzaGVldFNldC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gTm8gcHJlZmVy
cmVkIHNldCBoYXMgYmVlbiBlc3RhYmxpc2hlZC4gIElmCi0gICAgICAgICAgICAgICAgICAgIC8v
IHdlIGFyZSBOT1QgYW4gYWx0ZXJuYXRlIHNoZWV0LCB0aGVuIGVzdGFibGlzaAotICAgICAgICAg
ICAgICAgICAgICAvLyB1cyBhcyB0aGUgcHJlZmVycmVkIHNldC4gIE90aGVyd2lzZSwganVzdCBp
Z25vcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaGVldC4KLSAgICAgICAgICAgICAg
ICAgICAgUVN0cmluZyByZWwgPSBlLT5nZXRBdHRyaWJ1dGUocmVsQXR0cikucXN0cmluZygpOwot
ICAgICAgICAgICAgICAgICAgICBpZiAoZS0+aGFzTG9jYWxOYW1lKHN0eWxlVGFnKSB8fCAhcmVs
LmNvbnRhaW5zKCJhbHRlcm5hdGUiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fcHJlZmVy
cmVkU3R5bGVzaGVldFNldCA9IG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0gICAg
ICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlm
ICghbV9hdmFpbGFibGVTaGVldHMuY29udGFpbnMoIHRpdGxlICkgKQotICAgICAgICAgICAgICAg
ICAgICBtX2F2YWlsYWJsZVNoZWV0cy5hcHBlbmQoIHRpdGxlICk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCkK
LSAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9
Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICAgICAgZWxzZSBpZiAobi0+aXNTVkdFbGVtZW50KCkgJiYg
bi0+aGFzVGFnTmFtZShLU1ZHOjpTVkdOYW1lczo6c3R5bGVUYWcpKSB7Ci0gICAgICAgICAgICBR
U3RyaW5nIHRpdGxlOwotICAgICAgICAgICAgLy8gPFNUWUxFPiBlbGVtZW50Ci0gICAgICAgICAg
ICBLU1ZHOjpTVkdTdHlsZUVsZW1lbnRJbXBsICpzID0gc3RhdGljX2Nhc3Q8S1NWRzo6U1ZHU3R5
bGVFbGVtZW50SW1wbCo+KG4pOwotICAgICAgICAgICAgaWYgKCFzLT5pc0xvYWRpbmcoKSkgewot
ICAgICAgICAgICAgICAgIHNoZWV0ID0gcy0+c2hlZXQoKTsKLSAgICAgICAgICAgICAgICBpZihz
aGVldCkKLSAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSBzLT5nZXRBdHRyaWJ1dGUoS1NWRzo6
U1ZHTmFtZXM6OnRpdGxlQXR0cikucXN0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAg
ICAgICBpZiAoIXRpdGxlLmlzRW1wdHkoKSAmJiBtX3ByZWZlcnJlZFN0eWxlc2hlZXRTZXQuaXNF
bXB0eSgpKQotICAgICAgICAgICAgICAgIG1fcHJlZmVycmVkU3R5bGVzaGVldFNldCA9IG1fc2Vs
ZWN0ZWRTdHlsZXNoZWV0U2V0ID0gdGl0bGU7Ci0KLSAgICAgICAgICAgIGlmICghdGl0bGUuaXNF
bXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRpdGxlICE9IG1fcHJlZmVycmVkU3R5bGVz
aGVldFNldCkKLSAgICAgICAgICAgICAgICAgICAgc2hlZXQgPSAwOyAvLyBkb24ndCB1c2UgaXQK
LQotICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgnJicsIFFTdHJpbmc6OmZy
b21MYXRpbjEoIiYmIikpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFtX2F2YWlsYWJsZVNoZWV0
cy5jb250YWlucyh0aXRsZSkpCi0gICAgICAgICAgICAgICAgICAgIG1fYXZhaWxhYmxlU2hlZXRz
LmFwcGVuZCh0aXRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgfQotI2VuZGlmCi0KLSAgICAg
ICAgaWYgKHNoZWV0KSB7Ci0gICAgICAgICAgICBzaGVldC0+cmVmKCk7Ci0gICAgICAgICAgICBt
X3N0eWxlU2hlZXRzLT5zdHlsZVNoZWV0cy5hcHBlbmQoc2hlZXQpOwotICAgICAgICB9Ci0gICAg
Ci0gICAgICAgIC8vIEZvciBIVE1MIGRvY3VtZW50cywgc3R5bGVzaGVldHMgYXJlIG5vdCBhbGxv
d2VkIHdpdGhpbi9hZnRlciB0aGUgPEJPRFk+IHRhZy4gU28gd2UKLSAgICAgICAgLy8gY2FuIHN0
b3Agc2VhcmNoaW5nIGhlcmUuCi0gICAgICAgIGlmIChpc0hUTUxEb2N1bWVudCgpICYmIG4tPmhh
c1RhZ05hbWUoYm9keVRhZykpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBE
ZS1yZWZlcmVuY2UgYWxsIHRoZSBzdHlsZXNoZWV0cyBpbiB0aGUgb2xkIGxpc3QKLSAgICBRUHRy
TGlzdEl0ZXJhdG9yPFN0eWxlU2hlZXRJbXBsPiBpdChvbGRTdHlsZVNoZWV0cyk7Ci0gICAgZm9y
ICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLQlpdC5jdXJyZW50KCktPmRlcmVmKCk7Ci0KLSAgICAv
LyBDcmVhdGUgYSBuZXcgc3R5bGUgc2VsZWN0b3IKLSAgICBkZWxldGUgbV9zdHlsZVNlbGVjdG9y
OwotICAgIFFTdHJpbmcgdXNlcnNoZWV0ID0gbV91c2Vyc2hlZXQ7Ci0gICAgaWYgKCBtX3ZpZXcg
JiYgbV92aWV3LT5tZWRpYVR5cGUoKSA9PSAicHJpbnQiICkKLQl1c2Vyc2hlZXQgKz0gbV9wcmlu
dFNoZWV0OwotICAgIG1fc3R5bGVTZWxlY3RvciA9IG5ldyBDU1NTdHlsZVNlbGVjdG9yKHRoaXMs
IHVzZXJzaGVldCwgbV9zdHlsZVNoZWV0cywgIWluQ29tcGF0TW9kZSgpKTsKLSAgICBtX3N0eWxl
U2VsZWN0b3ItPnNldEVuY29kZWRVUkwobV91cmwpOwotICAgIG1fc3R5bGVTZWxlY3RvckRpcnR5
ID0gZmFsc2U7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRIb3Zlck5vZGUoTm9kZUltcGwq
IG5ld0hvdmVyTm9kZSkKLXsKLSAgICBpZiAobV9ob3Zlck5vZGUgIT0gbmV3SG92ZXJOb2RlKQot
ICAgICAgICBtX2hvdmVyTm9kZSA9IG5ld0hvdmVyTm9kZTsKLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnNldEFjdGl2ZU5vZGUoTm9kZUltcGwqIG5ld0FjdGl2ZU5vZGUpCi17Ci0gICAgaWYgKG1f
YWN0aXZlTm9kZSAhPSBuZXdBY3RpdmVOb2RlKQotICAgICAgICBtX2FjdGl2ZU5vZGUgPSBuZXdB
Y3RpdmVOb2RlOwotfQotCi0KLWJvb2wgRG9jdW1lbnRJbXBsOjpyZWxpbnF1aXNoZXNFZGl0aW5n
Rm9jdXMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgYXNzZXJ0KG5vZGUpOwotICAgIGFzc2VydChu
b2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKTsKLQotICAgIE5vZGVJbXBsICpyb290ID0gbm9kZS0+
cm9vdEVkaXRhYmxlRWxlbWVudCgpOwotICAgIGlmICghZnJhbWUoKSB8fCAhcm9vdCkKLSAgICAg
ICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGZyYW1lKCktPnNob3VsZEVuZEVkaXRpbmco
cmFuZ2VPZkNvbnRlbnRzKHJvb3QpLmdldCgpKTsKLX0KLQotYm9vbCBEb2N1bWVudEltcGw6OmFj
Y2VwdHNFZGl0aW5nRm9jdXMoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgYXNzZXJ0KG5vZGUpOwot
ICAgIGFzc2VydChub2RlLT5pc0NvbnRlbnRFZGl0YWJsZSgpKTsKLQotICAgIE5vZGVJbXBsICpy
b290ID0gbm9kZS0+cm9vdEVkaXRhYmxlRWxlbWVudCgpOwotICAgIGlmICghZnJhbWUoKSB8fCAh
cm9vdCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcmV0dXJuIGZyYW1lKCktPnNob3Vs
ZEJlZ2luRWRpdGluZyhyYW5nZU9mQ29udGVudHMocm9vdCkuZ2V0KCkpOwotfQotCi1jb25zdCBR
VmFsdWVMaXN0PERhc2hib2FyZFJlZ2lvblZhbHVlPiAmIERvY3VtZW50SW1wbDo6ZGFzaGJvYXJk
UmVnaW9ucygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGFzaGJvYXJkUmVnaW9uczsKLX0KLQot
dm9pZCBEb2N1bWVudEltcGw6OnNldERhc2hib2FyZFJlZ2lvbnMgKGNvbnN0IFFWYWx1ZUxpc3Q8
RGFzaGJvYXJkUmVnaW9uVmFsdWU+JiByZWdpb25zKQotewotICAgIG1fZGFzaGJvYXJkUmVnaW9u
cyA9IHJlZ2lvbnM7Ci0gICAgc2V0RGFzaGJvYXJkUmVnaW9uc0RpcnR5IChmYWxzZSk7Ci19Ci0K
LQotc3RhdGljIFFXaWRnZXQgKndpZGdldEZvck5vZGUoTm9kZUltcGwgKmZvY3VzTm9kZSkKLXsK
LSAgICBpZiAoIWZvY3VzTm9kZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVyT2JqZWN0
ICpyZW5kZXJlciA9IGZvY3VzTm9kZS0+cmVuZGVyZXIoKTsKLSAgICBpZiAoIXJlbmRlcmVyIHx8
ICFyZW5kZXJlci0+aXNXaWRnZXQoKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHN0
YXRpY19jYXN0PFJlbmRlcldpZGdldCAqPihyZW5kZXJlciktPndpZGdldCgpOwotfQotCi1ib29s
IERvY3VtZW50SW1wbDo6c2V0Rm9jdXNOb2RlKE5vZGVJbXBsICpuZXdGb2N1c05vZGUpCi17ICAg
IAotICAgIC8vIE1ha2Ugc3VyZSBuZXdGb2N1c05vZGUgaXMgYWN0dWFsbHkgaW4gdGhpcyBkb2N1
bWVudAotICAgIGlmIChuZXdGb2N1c05vZGUgJiYgKG5ld0ZvY3VzTm9kZS0+Z2V0RG9jdW1lbnQo
KSAhPSB0aGlzKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBpZiAobV9mb2N1c05vZGUg
PT0gbmV3Rm9jdXNOb2RlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX2ZvY3Vz
Tm9kZSAmJiBtX2ZvY3VzTm9kZS0+aXNDb250ZW50RWRpdGFibGUoKSAmJiAhcmVsaW5xdWlzaGVz
RWRpdGluZ0ZvY3VzKG1fZm9jdXNOb2RlLmdldCgpKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgICAgIAotICAgIGJvb2wgZm9jdXNDaGFuZ2VCbG9ja2VkID0gZmFsc2U7Ci0gICAgUmVmUHRy
PE5vZGVJbXBsPiBvbGRGb2N1c05vZGUgPSBtX2ZvY3VzTm9kZTsKLSAgICBtX2ZvY3VzTm9kZSA9
IDA7Ci0gICAgY2xlYXJTZWxlY3Rpb25JZk5lZWRlZChuZXdGb2N1c05vZGUpOwotCi0gICAgLy8g
UmVtb3ZlIGZvY3VzIGZyb20gdGhlIGV4aXN0aW5nIGZvY3VzIG5vZGUgKGlmIGFueSkKLSAgICBp
ZiAob2xkRm9jdXNOb2RlICYmICFvbGRGb2N1c05vZGUtPm1faW5EZXRhY2gpIHsgCi0gICAgICAg
IGlmIChvbGRGb2N1c05vZGUtPmFjdGl2ZSgpKQotICAgICAgICAgICAgb2xkRm9jdXNOb2RlLT5z
ZXRBY3RpdmUoZmFsc2UpOwotCi0gICAgICAgIG9sZEZvY3VzTm9kZS0+c2V0Rm9jdXMoZmFsc2Up
OwotICAgICAgICBvbGRGb2N1c05vZGUtPmRpc3BhdGNoSFRNTEV2ZW50KGJsdXJFdmVudCwgZmFs
c2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1fZm9jdXNOb2RlKSB7Ci0gICAgICAgICAgICAvLyBo
YW5kbGVyIHNoaWZ0ZWQgZm9jdXMKLSAgICAgICAgICAgIGZvY3VzQ2hhbmdlQmxvY2tlZCA9IHRy
dWU7Ci0gICAgICAgICAgICBuZXdGb2N1c05vZGUgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGNs
ZWFyU2VsZWN0aW9uSWZOZWVkZWQobmV3Rm9jdXNOb2RlKTsKLSAgICAgICAgb2xkRm9jdXNOb2Rl
LT5kaXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNPdXRFdmVudCk7Ci0gICAgICAgIGlmIChtX2ZvY3Vz
Tm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlmdGVkIGZvY3VzCi0gICAgICAgICAg
ICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgbmV3Rm9jdXNOb2RlID0g
MDsKLSAgICAgICAgfQotICAgICAgICBjbGVhclNlbGVjdGlvbklmTmVlZGVkKG5ld0ZvY3VzTm9k
ZSk7Ci0gICAgICAgIGlmICgob2xkRm9jdXNOb2RlLmdldCgpID09IHRoaXMpICYmIG9sZEZvY3Vz
Tm9kZS0+aGFzT25lUmVmKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAg
ICBpZiAobmV3Rm9jdXNOb2RlKSB7Ci0gICAgICAgIGlmIChuZXdGb2N1c05vZGUtPmlzQ29udGVu
dEVkaXRhYmxlKCkgJiYgIWFjY2VwdHNFZGl0aW5nRm9jdXMobmV3Rm9jdXNOb2RlKSkgewotICAg
ICAgICAgICAgLy8gZGVsZWdhdGUgYmxvY2tzIGZvY3VzIGNoYW5nZQotICAgICAgICAgICAgZm9j
dXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9u
ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTZXQgZm9jdXMgb24gdGhlIG5ldyBub2RlCi0gICAg
ICAgIG1fZm9jdXNOb2RlID0gbmV3Rm9jdXNOb2RlOwotICAgICAgICBtX2ZvY3VzTm9kZS0+ZGlz
cGF0Y2hIVE1MRXZlbnQoZm9jdXNFdmVudCwgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgaWYgKG1f
Zm9jdXNOb2RlICE9IG5ld0ZvY3VzTm9kZSkgewotICAgICAgICAgICAgLy8gaGFuZGxlciBzaGlm
dGVkIGZvY3VzCi0gICAgICAgICAgICBmb2N1c0NoYW5nZUJsb2NrZWQgPSB0cnVlOwotICAgICAg
ICAgICAgZ290byBTZXRGb2N1c05vZGVEb25lOwotICAgICAgICB9Ci0gICAgICAgIG1fZm9jdXNO
b2RlLT5kaXNwYXRjaFVJRXZlbnQoRE9NRm9jdXNJbkV2ZW50KTsKLSAgICAgICAgaWYgKG1fZm9j
dXNOb2RlICE9IG5ld0ZvY3VzTm9kZSkgeyAKLSAgICAgICAgICAgIC8vIGhhbmRsZXIgc2hpZnRl
ZCBmb2N1cwotICAgICAgICAgICAgZm9jdXNDaGFuZ2VCbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAg
ICAgIGdvdG8gU2V0Rm9jdXNOb2RlRG9uZTsKLSAgICAgICAgfQotICAgICAgICBtX2ZvY3VzTm9k
ZS0+c2V0Rm9jdXMoKTsKLSAgICAgICAgLy8gZXd3LCBJIHN1Y2suIHNldCB0aGUgcXQgZm9jdXMg
Y29ycmVjdGx5Ci0gICAgICAgIC8vICMjIyBmaW5kIGEgYmV0dGVyIHBsYWNlIGluIHRoZSBjb2Rl
IGZvciB0aGlzCi0gICAgICAgIGlmICh2aWV3KCkpIHsKLSAgICAgICAgICAgIFFXaWRnZXQgKmZv
Y3VzV2lkZ2V0ID0gd2lkZ2V0Rm9yTm9kZShtX2ZvY3VzTm9kZS5nZXQoKSk7Ci0gICAgICAgICAg
ICBpZiAoZm9jdXNXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgYSB3aWRn
ZXQgaGFzIHRoZSByaWdodCBzaXplIGJlZm9yZSBnaXZpbmcgaXQgZm9jdXMuCi0gICAgICAgICAg
ICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBhcmUgdGVzdGluZyBlZGdlIGNhc2VzIG9mIHRoZSBRV2lk
Z2V0IGNvZGUuCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lmaWNhbGx5LCBpbiBXZWJDb3JlIHRo
aXMgZG9lcyBub3Qgd29yayB3ZWxsIGZvciB0ZXh0IGZpZWxkcy4KLSAgICAgICAgICAgICAgICB1
cGRhdGVMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAvLyBSZS1nZXQgdGhlIHdpZGdldCBpbiBj
YXNlIHVwZGF0aW5nIHRoZSBsYXlvdXQgY2hhbmdlZCB0aGluZ3MuCi0gICAgICAgICAgICAgICAg
Zm9jdXNXaWRnZXQgPSB3aWRnZXRGb3JOb2RlKG1fZm9jdXNOb2RlLmdldCgpKTsKLSAgICAgICAg
ICAgIH0KLSAgICAgICAgICAgIGlmIChmb2N1c1dpZGdldCkKLSAgICAgICAgICAgICAgICBmb2N1
c1dpZGdldC0+c2V0Rm9jdXMoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB2
aWV3KCktPnNldEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgIH0KLQotICAgIGlmICghZm9jdXNDaGFu
Z2VCbG9ja2VkICYmIG1fZm9jdXNOb2RlICYmIEtXUUFjY09iamVjdENhY2hlOjphY2Nlc3NpYmls
aXR5RW5hYmxlZCgpKQotICAgICAgICBnZXRBY2NPYmplY3RDYWNoZSgpLT5oYW5kbGVGb2N1c2Vk
VUlFbGVtZW50Q2hhbmdlZCgpOwotCi1TZXRGb2N1c05vZGVEb25lOgotICAgIHVwZGF0ZVJlbmRl
cmluZygpOwotICAgIHJldHVybiAhZm9jdXNDaGFuZ2VCbG9ja2VkOwotfQotCi12b2lkIERvY3Vt
ZW50SW1wbDo6Y2xlYXJTZWxlY3Rpb25JZk5lZWRlZChOb2RlSW1wbCAqbmV3Rm9jdXNOb2RlKQot
ewotICAgIGlmICghZnJhbWUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gQ2xlYXIgdGhl
IHNlbGVjdGlvbiB3aGVuIGNoYW5naW5nIHRoZSBmb2N1cyBub2RlIHRvIG51bGwgb3IgdG8gYSBu
b2RlIHRoYXQgaXMgbm90IAotICAgIC8vIGNvbnRhaW5lZCBieSB0aGUgY3VycmVudCBzZWxlY3Rp
b24uCi0gICAgTm9kZUltcGwgKnN0YXJ0Q29udGFpbmVyID0gZnJhbWUoKS0+c2VsZWN0aW9uKCku
c3RhcnQoKS5ub2RlKCk7Ci0gICAgaWYgKCFuZXdGb2N1c05vZGUgfHwgKHN0YXJ0Q29udGFpbmVy
ICYmIHN0YXJ0Q29udGFpbmVyICE9IG5ld0ZvY3VzTm9kZSAmJiAhc3RhcnRDb250YWluZXItPmlz
QW5jZXN0b3IobmV3Rm9jdXNOb2RlKSkpCi0gICAgICAgIC8vIEZJWE1FOiA2NDk4IFNob3VsZCBq
dXN0IGJlIGFibGUgdG8gY2FsbCBtX2ZyYW1lLT5zZWxlY3Rpb24oKS5jbGVhcigpCi0gICAgICAg
IGZyYW1lKCktPnNldFNlbGVjdGlvbihTZWxlY3Rpb25Db250cm9sbGVyKCkpOwotfQotCi12b2lk
IERvY3VtZW50SW1wbDo6c2V0Q1NTVGFyZ2V0KE5vZGVJbXBsKiBuKQotewotICAgIGlmIChtX2Nz
c1RhcmdldCkKLSAgICAgICAgbV9jc3NUYXJnZXQtPnNldENoYW5nZWQoKTsKLSAgICBtX2Nzc1Rh
cmdldCA9IG47Ci0gICAgaWYgKG4pCi0gICAgICAgIG4tPnNldENoYW5nZWQoKTsKLX0KLQotTm9k
ZUltcGwqIERvY3VtZW50SW1wbDo6Z2V0Q1NTVGFyZ2V0KCkKLXsKLSAgICByZXR1cm4gbV9jc3NU
YXJnZXQ7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjphdHRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0
ZXJhdG9ySW1wbCAqbmkpCi17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLmFwcGVuZChuaSk7Ci19Ci0K
LXZvaWQgRG9jdW1lbnRJbXBsOjpkZXRhY2hOb2RlSXRlcmF0b3IoTm9kZUl0ZXJhdG9ySW1wbCAq
bmkpCi17Ci0gICAgbV9ub2RlSXRlcmF0b3JzLnJlbW92ZShuaSk7Ci19Ci0KLXZvaWQgRG9jdW1l
bnRJbXBsOjpub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChOb2RlSW1wbCAqbikKLXsKLSAgICBRUHRy
TGlzdEl0ZXJhdG9yPE5vZGVJdGVyYXRvckltcGw+IGl0KG1fbm9kZUl0ZXJhdG9ycyk7Ci0gICAg
Zm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkKLSAgICAgICAgaXQuY3VycmVudCgpLT5ub3RpZnlC
ZWZvcmVOb2RlUmVtb3ZhbChuKTsKLX0KLQotQWJzdHJhY3RWaWV3SW1wbCAqRG9jdW1lbnRJbXBs
OjpkZWZhdWx0VmlldygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGVmYXVsdFZpZXc7Ci19Ci0K
LUV2ZW50SW1wbCAqRG9jdW1lbnRJbXBsOjpjcmVhdGVFdmVudChjb25zdCBET01TdHJpbmcgJmV2
ZW50VHlwZSwgaW50ICZleGNlcHRpb25jb2RlKQotewotICAgIGlmIChldmVudFR5cGUgPT0gIlVJ
RXZlbnRzIiB8fCBldmVudFR5cGUgPT0gIlVJRXZlbnQiKQotICAgICAgICByZXR1cm4gbmV3IFVJ
RXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJNb3VzZUV2ZW50cyIgfHwg
ZXZlbnRUeXBlID09ICJNb3VzZUV2ZW50IikKLSAgICAgICAgcmV0dXJuIG5ldyBNb3VzZUV2ZW50
SW1wbCgpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSAiTXV0YXRpb25FdmVudHMiIHx8IGV2
ZW50VHlwZSA9PSAiTXV0YXRpb25FdmVudCIpCi0gICAgICAgIHJldHVybiBuZXcgTXV0YXRpb25F
dmVudEltcGwoKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gIktleWJvYXJkRXZlbnRzIiB8
fCBldmVudFR5cGUgPT0gIktleWJvYXJkRXZlbnQiKQotICAgICAgICByZXR1cm4gbmV3IEtleWJv
YXJkRXZlbnRJbXBsKCk7Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJIVE1MRXZlbnRzIiB8
fCBldmVudFR5cGUgPT0gIkV2ZW50IiB8fCBldmVudFR5cGUgPT0gIkV2ZW50cyIpCi0gICAgICAg
IHJldHVybiBuZXcgRXZlbnRJbXBsKCk7Ci0jaWYgU1ZHX1NVUFBPUlQKLSAgICBlbHNlIGlmIChl
dmVudFR5cGUgPT0gIlNWR0V2ZW50cyIpCi0gICAgICAgIHJldHVybiBuZXcgRXZlbnRJbXBsKCk7
Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09ICJTVkdab29tRXZlbnRzIikKLSAgICAgICAgcmV0
dXJuIG5ldyBLU1ZHOjpTVkdab29tRXZlbnRJbXBsKCk7Ci0jZW5kaWYKLSAgICBlbHNlIHsKLSAg
ICAgICAgZXhjZXB0aW9uY29kZSA9IERPTUV4Y2VwdGlvbjo6Tk9UX1NVUFBPUlRFRF9FUlI7Ci0g
ICAgICAgIHJldHVybiAwOwotICAgIH0KLX0KLQotQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgKkRv
Y3VtZW50SW1wbDo6Z2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50SW1wbCAqLyplbHQqLywgY29uc3Qg
RE9NU3RyaW5nICYvKnBzZXVkb0VsdCovKQotewotICAgIHJldHVybiAwOyAvLyAjIyMKLX0KLQot
dm9pZCBEb2N1bWVudEltcGw6OmRlZmF1bHRFdmVudEhhbmRsZXIoRXZlbnRJbXBsICpldnQpCi17
Ci0gICAgLy8gaWYgYW55IGh0bWwgZXZlbnQgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIG9uIHRo
ZSB3aW5kb3csIHRoZW4gZGlzcGF0Y2ggdGhlbSBoZXJlCi0gICAgUVB0ckxpc3Q8UmVnaXN0ZXJl
ZEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVyc0NvcHkgPSBtX3dpbmRvd0V2ZW50TGlzdGVuZXJzOwot
ICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI+IGl0KGxpc3RlbmVy
c0NvcHkpOwotICAgIGZvciAoOyBpdC5jdXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmIChpdC5j
dXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2dC0+dHlwZSgpKQotICAgICAgICAgICAgaXQuY3Vy
cmVudCgpLT5saXN0ZW5lcigpLT5oYW5kbGVFdmVudEltcGwoZXZ0LCB0cnVlKTsKLQotICAgIC8v
IGhhbmRsZSBhY2Nlc3NrZXkKLSAgICBpZiAoZXZ0LT50eXBlKCk9PWtleWRvd25FdmVudCkgewot
ICAgICAgICBLZXlib2FyZEV2ZW50SW1wbCAqa2V2dCA9IHN0YXRpY19jYXN0PEtleWJvYXJkRXZl
bnRJbXBsICo+KGV2dCk7Ci0gICAgICAgIGlmIChrZXZ0LT5jdHJsS2V5KCkpIHsKLSAgICAgICAg
ICAgIFFLZXlFdmVudCAqcWV2dCA9IGtldnQtPnFLZXlFdmVudCgpOwotICAgICAgICAgICAgRE9N
U3RyaW5nIGtleSA9IChxZXZ0ID8gcWV2dC0+dW5tb2RpZmllZFRleHQoKSA6IGtldnQtPmtleUlk
ZW50aWZpZXIoKSkubG93ZXIoKTsKLSAgICAgICAgICAgIEVsZW1lbnRJbXBsICplbGVtID0gZ2V0
RWxlbWVudEJ5QWNjZXNzS2V5KGtleSk7Ci0gICAgICAgICAgICBpZiAoZWxlbSkgewotICAgICAg
ICAgICAgICAgIGVsZW0tPmFjY2Vzc0tleUFjdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAg
ZXZ0LT5zZXREZWZhdWx0SGFuZGxlZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
fQotfQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29u
c3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIgKmxpc3RlbmVyKQotewot
ICAgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBpdCB3ZSBkb24ndCB3YW50IHJlbW92ZVdpbmRvd0V2
ZW50TGlzdGVuZXIgdG8gZGVsZXRlIGl0Ci0gICAgaWYgKGxpc3RlbmVyKQotCWxpc3RlbmVyLT5y
ZWYoKTsKLSAgICByZW1vdmVIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUpOwotICAg
IGlmIChsaXN0ZW5lcikgewotCWFkZFdpbmRvd0V2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0
ZW5lciwgZmFsc2UpOwotCWxpc3RlbmVyLT5kZXJlZigpOwotICAgIH0KLX0KLQotRXZlbnRMaXN0
ZW5lciAqRG9jdW1lbnRJbXBsOjpnZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9t
aWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsKLSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRF
dmVudExpc3RlbmVyPiBpdChtX3dpbmRvd0V2ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQu
Y3VycmVudCgpOyArK2l0KQotCWlmIChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50
VHlwZSAmJiBpdC5jdXJyZW50KCktPmxpc3RlbmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0g
Il9raHRtbF9IVE1MRXZlbnRMaXN0ZW5lciIpCi0JICAgIHJldHVybiBpdC5jdXJyZW50KCktPmxp
c3RlbmVyKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVI
VE1MV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSkKLXsK
LSAgICBRUHRyTGlzdEl0ZXJhdG9yPFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyPiBpdChtX3dpbmRv
d0V2ZW50TGlzdGVuZXJzKTsKLSAgICBmb3IgKDsgaXQuY3VycmVudCgpOyArK2l0KQotCWlmIChp
dC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSAmJiBpdC5jdXJyZW50KCktPmxp
c3RlbmVyKCktPmV2ZW50TGlzdGVuZXJUeXBlKCkgPT0gIl9raHRtbF9IVE1MRXZlbnRMaXN0ZW5l
ciIpIHsKLQkgICAgbV93aW5kb3dFdmVudExpc3RlbmVycy5yZW1vdmVSZWYoaXQuY3VycmVudCgp
KTsKLQkgICAgcmV0dXJuOwotCX0KLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OmFkZFdpbmRvd0V2
ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUsIEV2ZW50TGlzdGVuZXIg
Kmxpc3RlbmVyLCBib29sIHVzZUNhcHR1cmUpCi17Ci0gICAgbGlzdGVuZXItPnJlZigpOwotCi0g
ICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGlkZW50aWNhbCBsaXN0ZW5lciBzZXQgd2l0aCBpZGVudGlj
YWwgYXJndW1lbnRzLgotICAgIC8vIFRoZSBET00gMiBzcGVjIHNheXMgdGhhdCAiZHVwbGljYXRl
IGluc3RhbmNlcyBhcmUgZGlzY2FyZGVkIiBpbiB0aGlzIGNhc2UuCi0gICAgcmVtb3ZlV2luZG93
RXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGxpc3RlbmVyLCB1c2VDYXB0dXJlKTsKLSAgICBtX3dp
bmRvd0V2ZW50TGlzdGVuZXJzLmFwcGVuZChuZXcgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXIoZXZl
bnRUeXBlLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZSkpOwotCi0gICAgbGlzdGVuZXItPmRlcmVmKCk7
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0
IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1
c2VDYXB0dXJlKQotewotICAgIFJlZ2lzdGVyZWRFdmVudExpc3RlbmVyIHJsKGV2ZW50VHlwZSwg
bGlzdGVuZXIsIHVzZUNhcHR1cmUpOwotICAgIFFQdHJMaXN0SXRlcmF0b3I8UmVnaXN0ZXJlZEV2
ZW50TGlzdGVuZXI+IGl0KG1fd2luZG93RXZlbnRMaXN0ZW5lcnMpOwotICAgIGZvciAoOyBpdC5j
dXJyZW50KCk7ICsraXQpCi0gICAgICAgIGlmICgqKGl0LmN1cnJlbnQoKSkgPT0gcmwpIHsKLSAg
ICAgICAgICAgIG1fd2luZG93RXZlbnRMaXN0ZW5lcnMucmVtb3ZlUmVmKGl0LmN1cnJlbnQoKSk7
Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLX0KLQotYm9vbCBEb2N1bWVudEltcGw6
Omhhc1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nICZldmVudFR5cGUpCi17
Ci0gICAgUVB0ckxpc3RJdGVyYXRvcjxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gaXQobV93aW5k
b3dFdmVudExpc3RlbmVycyk7Ci0gICAgZm9yICg7IGl0LmN1cnJlbnQoKTsgKytpdCkgewotCWlm
IChpdC5jdXJyZW50KCktPmV2ZW50VHlwZSgpID09IGV2ZW50VHlwZSkgewotCSAgICByZXR1cm4g
dHJ1ZTsKLQl9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1FdmVudExpc3RlbmVy
ICpEb2N1bWVudEltcGw6OmNyZWF0ZUhUTUxFdmVudExpc3RlbmVyKGNvbnN0IERPTVN0cmluZyYg
Y29kZSwgTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgaWYgKGZyYW1lKCkpIHsKLQlyZXR1cm4gZnJh
bWUoKS0+Y3JlYXRlSFRNTEV2ZW50TGlzdGVuZXIoY29kZSwgbm9kZSk7Ci0gICAgfSBlbHNlIHsK
LQlyZXR1cm4gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXRIVE1MV2lu
ZG93RXZlbnRMaXN0ZW5lcihjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgQXR0cmlidXRl
SW1wbCogYXR0cikKLXsKLSAgICBzZXRIVE1MV2luZG93RXZlbnRMaXN0ZW5lcihldmVudFR5cGUs
IGNyZWF0ZUhUTUxFdmVudExpc3RlbmVyKGF0dHItPnZhbHVlKCksIDApKTsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OmRpc3BhdGNoSW1hZ2VMb2FkRXZlbnRTb29uKEhUTUxJbWFnZUxvYWRlciAq
aW1hZ2UpCi17Ci0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoU29vbkxpc3QuYXBwZW5kKGlt
YWdlKTsKLSAgICBpZiAoIW1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBtX2ltYWdl
TG9hZEV2ZW50VGltZXIgPSBzdGFydFRpbWVyKDApOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVu
dEltcGw6OnJlbW92ZUltYWdlKEhUTUxJbWFnZUxvYWRlciogaW1hZ2UpCi17Ci0gICAgLy8gUmVt
b3ZlIGluc3RhbmNlcyBvZiB0aGlzIGltYWdlIGZyb20gYm90aCBsaXN0cy4KLSAgICAvLyBVc2Ug
bG9vcHMgYmVjYXVzZSB3ZSBhbGxvdyBtdWx0aXBsZSBpbnN0YW5jZXMgdG8gZ2V0IGludG8gdGhl
IGxpc3RzLgotICAgIHdoaWxlIChtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hTb29uTGlzdC5yZW1v
dmVSZWYoaW1hZ2UpKSB7IH0KLSAgICB3aGlsZSAobV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5n
TGlzdC5yZW1vdmVSZWYoaW1hZ2UpKSB7IH0KLSAgICBpZiAobV9pbWFnZUxvYWRFdmVudERpc3Bh
dGNoU29vbkxpc3QuaXNFbXB0eSgpICYmIG1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAg
ICBraWxsVGltZXIobV9pbWFnZUxvYWRFdmVudFRpbWVyKTsKLSAgICAgICAgbV9pbWFnZUxvYWRF
dmVudFRpbWVyID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpkaXNwYXRjaElt
YWdlTG9hZEV2ZW50c05vdygpCi17Ci0gICAgLy8gbmVlZCB0byBhdm9pZCByZS1lbnRlcmluZyB0
aGlzIGZ1bmN0aW9uOyBpZiBuZXcgZGlzcGF0Y2hlcyBhcmUKLSAgICAvLyBzY2hlZHVsZWQgYmVm
b3JlIHRoZSBwYXJlbnQgZmluaXNoZXMgcHJvY2Vzc2luZyB0aGUgbGlzdCwgdGhleQotICAgIC8v
IHdpbGwgc2V0IGEgdGltZXIgYW5kIGV2ZW50dWFsbHkgYmUgcHJvY2Vzc2VkCi0gICAgaWYgKCFt
X2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICByZXR1
cm47Ci0gICAgfQotCi0gICAgaWYgKG1faW1hZ2VMb2FkRXZlbnRUaW1lcikgewotICAgICAgICBr
aWxsVGltZXIobV9pbWFnZUxvYWRFdmVudFRpbWVyKTsKLSAgICAgICAgbV9pbWFnZUxvYWRFdmVu
dFRpbWVyID0gMDsKLSAgICB9Ci0gICAgCi0gICAgbV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5n
TGlzdCA9IG1faW1hZ2VMb2FkRXZlbnREaXNwYXRjaFNvb25MaXN0OwotICAgIG1faW1hZ2VMb2Fk
RXZlbnREaXNwYXRjaFNvb25MaXN0LmNsZWFyKCk7Ci0gICAgZm9yIChRUHRyTGlzdEl0ZXJhdG9y
PEhUTUxJbWFnZUxvYWRlcj4gaXQobV9pbWFnZUxvYWRFdmVudERpc3BhdGNoaW5nTGlzdCk7IGl0
LmN1cnJlbnQoKTsgKSB7Ci0gICAgICAgIEhUTUxJbWFnZUxvYWRlciogaW1hZ2UgPSBpdC5jdXJy
ZW50KCk7Ci0gICAgICAgIC8vIE11c3QgYWR2YW5jZSBpdGVyYXRvciAqYmVmb3JlKiBkaXNwYXRj
aGluZyBjYWxsLgotICAgICAgICAvLyBPdGhlcndpc2UsIGl0IG1pZ2h0IGJlIGFkdmFuY2VkIGF1
dG9tYXRpY2FsbHkgaWYgZGlzcGF0Y2hpbmcgdGhlIGNhbGwgaGFkIGEgc2lkZSBlZmZlY3QKLSAg
ICAgICAgLy8gb2YgZGVzdHJveWluZyB0aGUgY3VycmVudCBIVE1MSW1hZ2VMb2FkZXIsIGFuZCB0
aGVuIHdlIHdvdWxkIGFkdmFuY2UgcGFzdCB0aGUgKm5leHQqIGl0ZW0sCi0gICAgICAgIC8vIG1p
c3Npbmcgb25lIGFsdG9nZXRoZXIuCi0gICAgICAgICsraXQ7Ci0gICAgICAgIGltYWdlLT5kaXNw
YXRjaExvYWRFdmVudCgpOwotICAgIH0KLSAgICBtX2ltYWdlTG9hZEV2ZW50RGlzcGF0Y2hpbmdM
aXN0LmNsZWFyKCk7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjp0aW1lckV2ZW50KFFUaW1lckV2
ZW50ICopCi17Ci0gICAgZGlzcGF0Y2hJbWFnZUxvYWRFdmVudHNOb3coKTsKLX0KLQotRWxlbWVu
dEltcGwgKkRvY3VtZW50SW1wbDo6b3duZXJFbGVtZW50KCkKLXsKLSAgICBLSFRNTFZpZXcgKmNo
aWxkVmlldyA9IHZpZXcoKTsKLSAgICBpZiAoIWNoaWxkVmlldykKLSAgICAgICAgcmV0dXJuIDA7
Ci0gICAgRnJhbWUgKmNoaWxkUGFydCA9IGNoaWxkVmlldy0+ZnJhbWUoKTsKLSAgICBpZiAoIWNo
aWxkUGFydCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgRnJhbWUgKnBhcmVudCA9IGNoaWxkUGFy
dC0+cGFyZW50RnJhbWUoKTsKLSAgICBpZiAoIXBhcmVudCkKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgQ2hpbGRGcmFtZSAqY2hpbGRGcmFtZSA9IHBhcmVudC0+Y2hpbGRGcmFtZShjaGlsZFBhcnQp
OwotICAgIGlmICghY2hpbGRGcmFtZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgUmVuZGVyUGFy
dCAqcmVuZGVyUGFydCA9IGNoaWxkRnJhbWUtPm1fcmVuZGVyZXI7Ci0gICAgaWYgKCFyZW5kZXJQ
YXJ0KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudElt
cGwgKj4ocmVuZGVyUGFydC0+ZWxlbWVudCgpKTsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1w
bDo6cmVmZXJyZXIoKSBjb25zdAotewotICAgIGlmICggZnJhbWUoKSApCi0gICAgICAgIHJldHVy
biBNYWMoZnJhbWUoKSktPmluY29taW5nUmVmZXJyZXIoKTsKLSAgICAKLSAgICByZXR1cm4gRE9N
U3RyaW5nKCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OmRvbWFpbigpIGNvbnN0Ci17
Ci0gICAgaWYgKCBtX2RvbWFpbi5pc0VtcHR5KCkgKSAvLyBub3Qgc2V0IHlldCAod2Ugc2V0IGl0
IG9uIGRlbWFuZCB0byBzYXZlIHRpbWUgYW5kIHNwYWNlKQotICAgICAgICBtX2RvbWFpbiA9IEtV
UkwoVVJMKCkpLmhvc3QoKTsgLy8gSW5pdGlhbGx5IHNldCB0byB0aGUgaG9zdAotICAgIHJldHVy
biBtX2RvbWFpbjsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldERvbWFpbihjb25zdCBET01T
dHJpbmcgJm5ld0RvbWFpbiwgYm9vbCBmb3JjZSAvKj1mYWxzZSovKQotewotICAgIGlmICggZm9y
Y2UgKSB7Ci0gICAgICAgIG1fZG9tYWluID0gbmV3RG9tYWluOwotICAgICAgICByZXR1cm47Ci0g
ICAgfQotICAgIGlmICggbV9kb21haW4uaXNFbXB0eSgpICkgLy8gbm90IHNldCB5ZXQgKHdlIHNl
dCBpdCBvbiBkZW1hbmQgdG8gc2F2ZSB0aW1lIGFuZCBzcGFjZSkKLSAgICAgICAgbV9kb21haW4g
PSBLVVJMKFVSTCgpKS5ob3N0KCk7IC8vIEluaXRpYWxseSBzZXQgdG8gdGhlIGhvc3QKLQotICAg
IC8vIEJvdGggTlMgYW5kIElFIHNwZWNpZnkgdGhhdCBjaGFuZ2luZyB0aGUgZG9tYWluIGlzIG9u
bHkgYWxsb3dlZCB3aGVuCi0gICAgLy8gdGhlIG5ldyBkb21haW4gaXMgYSBzdWZmaXggb2YgdGhl
IG9sZCBkb21haW4uCi0gICAgaW50IG9sZExlbmd0aCA9IG1fZG9tYWluLmxlbmd0aCgpOwotICAg
IGludCBuZXdMZW5ndGggPSBuZXdEb21haW4ubGVuZ3RoKCk7Ci0gICAgaWYgKCBuZXdMZW5ndGgg
PCBvbGRMZW5ndGggKSAvLyBlLmcuIG5ld0RvbWFpbj1rZGUub3JnICg3KSBhbmQgbV9kb21haW49
d3d3LmtkZS5vcmcgKDExKQotICAgIHsKLSAgICAgICAgRE9NU3RyaW5nIHRlc3QgPSBtX2RvbWFp
bi5jb3B5KCk7Ci0gICAgICAgIGlmICggdGVzdFtvbGRMZW5ndGggLSBuZXdMZW5ndGggLSAxXSA9
PSAnLicgKSAvLyBDaGVjayB0aGF0IGl0J3MgYSBzdWJkb21haW4sIG5vdCBlLmcuICJkZS5vcmci
Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHRlc3QucmVtb3ZlKCAwLCBvbGRMZW5ndGggLSBuZXdM
ZW5ndGggKTsgLy8gbm93IHRlc3QgaXMgImtkZS5vcmciIGZyb20gbV9kb21haW4KLSAgICAgICAg
ICAgIGlmICggdGVzdCA9PSBuZXdEb21haW4gKSAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIGNo
ZWNrIHRoYXQgaXQncyB0aGUgc2FtZSB0aGluZyBhcyBuZXdEb21haW4KLSAgICAgICAgICAgICAg
ICBtX2RvbWFpbiA9IG5ld0RvbWFpbjsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBEb2N1
bWVudEltcGw6OmlzVmFsaWROYW1lKGNvbnN0IERPTVN0cmluZyAmbmFtZSkKLXsKLSAgICBjb25z
dCBVQ2hhciAqcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVUNoYXIgKj4obmFtZS51bmljb2Rl
KCkpOwotICAgIHVuc2lnbmVkIGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0KLSAgICBpZiAobGVu
Z3RoID09IDApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHVuc2lnbmVkIGkgPSAwOwot
Ci0gICAgVUNoYXIzMiBjOwotICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwgYykKLSAgICBpZiAo
IWlzVmFsaWROYW1lU3RhcnQoYykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHdoaWxl
IChpIDwgbGVuZ3RoKSB7Ci0gICAgICAgIFUxNl9ORVhUKHMsIGksIGxlbmd0aCwgYykKLSAgICAg
ICAgaWYgKCFpc1ZhbGlkTmFtZVBhcnQoYykpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0g
ICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpwYXJzZVF1
YWxpZmllZE5hbWUoY29uc3QgRE9NU3RyaW5nICZxdWFsaWZpZWROYW1lLCBET01TdHJpbmcgJnBy
ZWZpeCwgRE9NU3RyaW5nICZsb2NhbE5hbWUpCi17Ci0gICAgdW5zaWduZWQgbGVuZ3RoID0gcXVh
bGlmaWVkTmFtZS5sZW5ndGgoKTsKLQotICAgIGlmIChsZW5ndGggPT0gMCkKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotCi0gICAgYm9vbCBuYW1lU3RhcnQgPSB0cnVlOwotICAgIGJvb2wgc2F3Q29s
b24gPSBmYWxzZTsKLSAgICBpbnQgY29sb25Qb3MgPSAwOwotCi0gICAgY29uc3QgUUNoYXIgKnMg
PSBxdWFsaWZpZWROYW1lLnVuaWNvZGUoKTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg
bGVuZ3RoOyApIHsKLSAgICAgICAgVUNoYXIzMiBjOwotICAgICAgICBVMTZfTkVYVChzLCBpLCBs
ZW5ndGgsIGMpCi0gICAgICAgIGlmIChjID09ICc6JykgewotICAgICAgICAgICAgaWYgKHNhd0Nv
bG9uKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbXVsdGlwbGUgY29sb25zOiBu
b3QgYWxsb3dlZAotICAgICAgICAgICAgbmFtZVN0YXJ0ID0gdHJ1ZTsKLSAgICAgICAgICAgIHNh
d0NvbG9uID0gdHJ1ZTsKLSAgICAgICAgICAgIGNvbG9uUG9zID0gaSAtIDE7Ci0gICAgICAgIH0g
ZWxzZSBpZiAobmFtZVN0YXJ0KSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1lU3RhcnQo
YykpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgbmFtZVN0YXJ0
ID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWlzVmFsaWROYW1l
UGFydChjKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBpZiAoIXNhd0NvbG9uKSB7Ci0gICAgICAgIHByZWZpeCA9IERPTVN0cmluZygpOwot
ICAgICAgICBsb2NhbE5hbWUgPSBxdWFsaWZpZWROYW1lLmNvcHkoKTsKLSAgICB9IGVsc2Ugewot
ICAgICAgICBwcmVmaXggPSBxdWFsaWZpZWROYW1lLnN1YnN0cmluZygwLCBjb2xvblBvcyk7Ci0g
ICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGNvbG9uUG9zICsgMSwg
bGVuZ3RoIC0gKGNvbG9uUG9zICsgMSkpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQot
Ci12b2lkIERvY3VtZW50SW1wbDo6YWRkSW1hZ2VNYXAoSFRNTE1hcEVsZW1lbnRJbXBsICppbWFn
ZU1hcCkKLXsKLSAgICAvLyBBZGQgdGhlIGltYWdlIG1hcCwgdW5sZXNzIHRoZXJlJ3MgYWxyZWFk
eSBhbm90aGVyIHdpdGggdGhhdCBuYW1lLgotICAgIC8vICJGaXJzdCBtYXAgd2lucyIgaXMgdGhl
IHJ1bGUgb3RoZXIgYnJvd3NlcnMgc2VlbSB0byBpbXBsZW1lbnQuCi0gICAgUVN0cmluZyBuYW1l
ID0gaW1hZ2VNYXAtPmdldE5hbWUoKS5xc3RyaW5nKCk7Ci0gICAgaWYgKCFtX2ltYWdlTWFwc0J5
TmFtZS5jb250YWlucyhuYW1lKSkKLSAgICAgICAgbV9pbWFnZU1hcHNCeU5hbWUuaW5zZXJ0KG5h
bWUsIGltYWdlTWFwKTsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnJlbW92ZUltYWdlTWFwKEhU
TUxNYXBFbGVtZW50SW1wbCAqaW1hZ2VNYXApCi17Ci0gICAgLy8gUmVtb3ZlIHRoZSBpbWFnZSBt
YXAgYnkgbmFtZS4KLSAgICAvLyBCdXQgZG9uJ3QgcmVtb3ZlIHNvbWUgb3RoZXIgaW1hZ2UgbWFw
IHRoYXQganVzdCBoYXBwZW5zIHRvIGhhdmUgdGhlIHNhbWUgbmFtZS4KLSAgICBRU3RyaW5nIG5h
bWUgPSBpbWFnZU1hcC0+Z2V0TmFtZSgpLnFzdHJpbmcoKTsKLSAgICBRTWFwSXRlcmF0b3I8UVN0
cmluZywgSFRNTE1hcEVsZW1lbnRJbXBsICo+IGl0ID0gbV9pbWFnZU1hcHNCeU5hbWUuZmluZChu
YW1lKTsKLSAgICBpZiAoaXQgIT0gbV9pbWFnZU1hcHNCeU5hbWUuZW5kKCkgJiYgKml0ID09IGlt
YWdlTWFwKQotICAgICAgICBtX2ltYWdlTWFwc0J5TmFtZS5yZW1vdmUoaXQpOwotfQotCi1IVE1M
TWFwRWxlbWVudEltcGwgKkRvY3VtZW50SW1wbDo6Z2V0SW1hZ2VNYXAoY29uc3QgRE9NU3RyaW5n
ICZVUkwpIGNvbnN0Ci17Ci0gICAgaWYgKFVSTC5pc051bGwoKSkgewotICAgICAgICByZXR1cm4g
MDsKLSAgICB9Ci0KLSAgICBRU3RyaW5nIHMgPSBVUkwucXN0cmluZygpOwotICAgIGludCBoYXNo
UG9zID0gcy5maW5kKCcjJyk7Ci0gICAgaWYgKGhhc2hQb3MgPj0gMCkKLSAgICAgICAgcyA9IHMu
bWlkKGhhc2hQb3MgKyAxKTsKLQotICAgIFFNYXBDb25zdEl0ZXJhdG9yPFFTdHJpbmcsIEhUTUxN
YXBFbGVtZW50SW1wbCAqPiBpdCA9IG1faW1hZ2VNYXBzQnlOYW1lLmZpbmQocyk7Ci0gICAgaWYg
KGl0ID09IG1faW1hZ2VNYXBzQnlOYW1lLmVuZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICBy
ZXR1cm4gKml0OwotfQotCi0KLXZvaWQgRG9jdW1lbnRJbXBsOjpzZXREZWNvZGVyKERlY29kZXIg
KmRlY29kZXIpCi17Ci0gICAgbV9kZWNvZGVyID0gZGVjb2RlcjsKLX0KLQotUVN0cmluZyBEb2N1
bWVudEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IFFTdHJpbmcgJlVSTCkKLXsKLSAgICByZXR1cm4g
S1VSTChiYXNlVVJMKCksIFVSTCwgbV9kZWNvZGVyID8gbV9kZWNvZGVyLT5jb2RlYygpIDogMCku
dXJsKCk7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OmNvbXBsZXRlVVJMKGNvbnN0IERP
TVN0cmluZyAmVVJMKQotewotICAgIGlmIChVUkwuaXNOdWxsKCkpCi0gICAgICAgIHJldHVybiBV
Ukw7Ci0gICAgcmV0dXJuIGNvbXBsZXRlVVJMKFVSTC5xc3RyaW5nKCkpOwotfQotCi1ib29sIERv
Y3VtZW50SW1wbDo6aW5QYWdlQ2FjaGUoKQotewotICAgIHJldHVybiBtX2luUGFnZUNhY2hlOwot
fQotCi12b2lkIERvY3VtZW50SW1wbDo6c2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKQotewotICAg
IGlmIChtX2luUGFnZUNhY2hlID09IGZsYWcpCi0gICAgICAgIHJldHVybjsKLQotICAgIG1faW5Q
YWdlQ2FjaGUgPSBmbGFnOwotICAgIGlmIChmbGFnKSB7Ci0gICAgICAgIGFzc2VydChtX3NhdmVk
UmVuZGVyZXIgPT0gMCk7Ci0gICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IG1fcmVuZGVyOwotICAg
ICAgICBpZiAobV92aWV3KSB7Ci0gICAgICAgICAgICBtX3ZpZXctPnJlc2V0U2Nyb2xsQmFycygp
OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0KG1fcmVuZGVyID09IDAg
fHwgbV9yZW5kZXIgPT0gbV9zYXZlZFJlbmRlcmVyKTsKLSAgICAgICAgbV9yZW5kZXIgPSBtX3Nh
dmVkUmVuZGVyZXI7Ci0gICAgICAgIG1fc2F2ZWRSZW5kZXJlciA9IDA7Ci0gICAgfQotfQotCi12
b2lkIERvY3VtZW50SW1wbDo6cGFzc3dvcmRGaWVsZEFkZGVkKCkKLXsKLSAgICBtX3Bhc3N3b3Jk
RmllbGRzKys7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpwYXNzd29yZEZpZWxkUmVtb3ZlZCgp
Ci17Ci0gICAgYXNzZXJ0KG1fcGFzc3dvcmRGaWVsZHMgPiAwKTsKLSAgICBtX3Bhc3N3b3JkRmll
bGRzLS07Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpoYXNQYXNzd29yZEZpZWxkKCkgY29uc3QK
LXsKLSAgICByZXR1cm4gbV9wYXNzd29yZEZpZWxkcyA+IDA7Ci19Ci0KLXZvaWQgRG9jdW1lbnRJ
bXBsOjpzZWN1cmVGb3JtQWRkZWQoKQotewotICAgIG1fc2VjdXJlRm9ybXMrKzsKLX0KLQotdm9p
ZCBEb2N1bWVudEltcGw6OnNlY3VyZUZvcm1SZW1vdmVkKCkKLXsKLSAgICBhc3NlcnQobV9zZWN1
cmVGb3JtcyA+IDApOwotICAgIG1fc2VjdXJlRm9ybXMtLTsKLX0KLQotYm9vbCBEb2N1bWVudElt
cGw6Omhhc1NlY3VyZUZvcm0oKSBjb25zdAotewotICAgIHJldHVybiBtX3NlY3VyZUZvcm1zID4g
MDsKLX0KLQotdm9pZCBEb2N1bWVudEltcGw6OnNldFNob3VsZENyZWF0ZVJlbmRlcmVycyhib29s
IGYpCi17Ci0gICAgbV9jcmVhdGVSZW5kZXJlcnMgPSBmOwotfQotCi1ib29sIERvY3VtZW50SW1w
bDo6c2hvdWxkQ3JlYXRlUmVuZGVyZXJzKCkKLXsKLSAgICByZXR1cm4gbV9jcmVhdGVSZW5kZXJl
cnM7Ci19Ci0KLURPTVN0cmluZyBEb2N1bWVudEltcGw6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAg
ICBET01TdHJpbmcgcmVzdWx0OwotCi0gICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENo
aWxkKCk7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLQly
ZXN1bHQgKz0gY2hpbGQtPnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsK
LX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTdXBwb3J0IGZvciBKYXZhc2NyaXB0
IGV4ZWNDb21tYW5kLCBhbmQgcmVsYXRlZCBtZXRob2RzCi0KLUpTRWRpdG9yICpEb2N1bWVudElt
cGw6OmpzRWRpdG9yKCkKLXsKLSAgICBpZiAoIW1fanNFZGl0b3IpCi0gICAgICAgIG1fanNFZGl0
b3IgPSBuZXcgSlNFZGl0b3IodGhpcyk7Ci0gICAgcmV0dXJuIG1fanNFZGl0b3I7Ci19Ci0KLWJv
b2wgRG9jdW1lbnRJbXBsOjpleGVjQ29tbWFuZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQsIGJv
b2wgdXNlckludGVyZmFjZSwgY29uc3QgRE9NU3RyaW5nICZ2YWx1ZSkKLXsKLSAgICByZXR1cm4g
anNFZGl0b3IoKS0+ZXhlY0NvbW1hbmQoY29tbWFuZCwgdXNlckludGVyZmFjZSwgdmFsdWUpOwot
fQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVlcnlDb21tYW5kRW5hYmxlZChjb25zdCBET01TdHJp
bmcgJmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZEVuYWJs
ZWQoY29tbWFuZCk7Ci19Ci0KLWJvb2wgRG9jdW1lbnRJbXBsOjpxdWVyeUNvbW1hbmRJbmRldGVy
bShjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1
ZXJ5Q29tbWFuZEluZGV0ZXJtKGNvbW1hbmQpOwotfQotCi1ib29sIERvY3VtZW50SW1wbDo6cXVl
cnlDb21tYW5kU3RhdGUoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBq
c0VkaXRvcigpLT5xdWVyeUNvbW1hbmRTdGF0ZShjb21tYW5kKTsKLX0KLQotYm9vbCBEb2N1bWVu
dEltcGw6OnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb25zdCBET01TdHJpbmcgJmNvbW1hbmQpCi17
Ci0gICAgcmV0dXJuIGpzRWRpdG9yKCktPnF1ZXJ5Q29tbWFuZFN1cHBvcnRlZChjb21tYW5kKTsK
LX0KLQotRE9NU3RyaW5nIERvY3VtZW50SW1wbDo6cXVlcnlDb21tYW5kVmFsdWUoY29uc3QgRE9N
U3RyaW5nICZjb21tYW5kKQotewotICAgIHJldHVybiBqc0VkaXRvcigpLT5xdWVyeUNvbW1hbmRW
YWx1ZShjb21tYW5kKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIERvY3Vt
ZW50SW1wbDo6YWRkTWFya2VyKFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJr
ZXJUeXBlIHR5cGUpCi17Ci0gICAgLy8gVXNlIGEgVGV4dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBw
b3RlbnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUgcmFuZ2UgY292ZXJzLgotICAgIGZvciAoVGV4
dEl0ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAhbWFya2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRU
ZXh0LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQdHI8UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBt
YXJrZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGludCBleGNlcHRpb24gPSAwOwotICAgICAgICBE
b2N1bWVudE1hcmtlciBtYXJrZXIgPSB7dHlwZSwgdGV4dFBpZWNlLT5zdGFydE9mZnNldChleGNl
cHRpb24pLCB0ZXh0UGllY2UtPmVuZE9mZnNldChleGNlcHRpb24pfTsKLSAgICAgICAgYWRkTWFy
a2VyKHRleHRQaWVjZS0+c3RhcnRDb250YWluZXIoZXhjZXB0aW9uKSwgbWFya2VyKTsKLSAgICB9
Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVNYXJrZXJzKFJhbmdlSW1wbCAqcmFuZ2Us
IERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgLy8gVXNlIGEg
VGV4dEl0ZXJhdG9yIHRvIHZpc2l0IHRoZSBwb3RlbnRpYWxseSBtdWx0aXBsZSBub2RlcyB0aGUg
cmFuZ2UgY292ZXJzLgotICAgIGZvciAoVGV4dEl0ZXJhdG9yIG1hcmtlZFRleHQocmFuZ2UpOyAh
bWFya2VkVGV4dC5hdEVuZCgpOyBtYXJrZWRUZXh0LmFkdmFuY2UoKSkgewotICAgICAgICBSZWZQ
dHI8UmFuZ2VJbXBsPiB0ZXh0UGllY2UgPSBtYXJrZWRUZXh0LnJhbmdlKCk7Ci0gICAgICAgIGlu
dCBleGNlcHRpb24gPSAwOwotICAgICAgICB1bnNpZ25lZCBzdGFydE9mZnNldCA9IHRleHRQaWVj
ZS0+c3RhcnRPZmZzZXQoZXhjZXB0aW9uKTsKLSAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gdGV4
dFBpZWNlLT5lbmRPZmZzZXQoZXhjZXB0aW9uKSAtIHN0YXJ0T2Zmc2V0ICsgMTsKLSAgICAgICAg
cmVtb3ZlTWFya2Vycyh0ZXh0UGllY2UtPnN0YXJ0Q29udGFpbmVyKGV4Y2VwdGlvbiksIHN0YXJ0
T2Zmc2V0LCBsZW5ndGgsIG1hcmtlclR5cGUpOwotICAgIH0KLX0KLQotLy8gTWFya2VycyBhcmUg
c3RvcmVkIGluIG9yZGVyIHNvcnRlZCBieSB0aGVpciBsb2NhdGlvbi4gIFRoZXkgZG8gbm90IG92
ZXJsYXAgZWFjaCBvdGhlciwgYXMgY3VycmVudGx5Ci0vLyByZXF1aXJlZCBieSB0aGUgZHJhd2lu
ZyBjb2RlIGluIFJlbmRlclRleHQuY3BwLgotCi12b2lkIERvY3VtZW50SW1wbDo6YWRkTWFya2Vy
KE5vZGVJbXBsICpub2RlLCBEb2N1bWVudE1hcmtlciBuZXdNYXJrZXIpIAotewotICAgIGFzc2Vy
dChuZXdNYXJrZXIuZW5kT2Zmc2V0ID49IG5ld01hcmtlci5zdGFydE9mZnNldCk7Ci0gICAgaWYg
KG5ld01hcmtlci5lbmRPZmZzZXQgPT0gbmV3TWFya2VyLnN0YXJ0T2Zmc2V0KQotICAgICAgICBy
ZXR1cm47Ci0gICAgCi0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0g
bV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKSB7Ci0gICAgICAgIG1hcmtl
cnMgPSBuZXcgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+OwotICAgICAgICBtYXJrZXJzLT5h
cHBlbmQobmV3TWFya2VyKTsKLSAgICAgICAgbV9tYXJrZXJzLmluc2VydChub2RlLCBtYXJrZXJz
KTsKLSAgICB9IGVsc2UgewotICAgICAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJr
ZXI+IGl0OwotICAgICAgICBmb3IgKGl0ID0gbWFya2Vycy0+YmVnaW4oKTsgaXQgIT0gbWFya2Vy
cy0+ZW5kKCk7ICkgewotICAgICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbWFya2VyID0gKml0Owot
ICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAobmV3TWFya2VyLmVuZE9mZnNldCA8IG1hcmtl
ci5zdGFydE9mZnNldCsxKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3Qg
bWFya2VyIHRoYXQgaXMgY29tcGxldGVseSBhZnRlciBuZXdNYXJrZXIsIGFuZCBkaXNqb2ludCBm
cm9tIGl0LgotICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIG91ciBpbnNlcnRpb24gcG9pbnQu
EAotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdNYXJr
ZXIuc3RhcnRPZmZzZXQgPiBtYXJrZXIuZW5kT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgLy8g
bWFrZXIgaXMgYmVmb3JlIG5ld01hcmtlciwgYW5kIGRpc2pvaW50IGZyb20gaXQuICBLZWVwIHNj
YW5uaW5nLgotICAgICAgICAgICAgICAgIGl0Kys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5l
d01hcmtlciA9PSBtYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhdmUgdGhp
cyBvbmUsIE5PUAotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0gZWxzZSB7
Ci0gICAgICAgICAgICAgICAgLy8gbWFya2VyIGFuZCBuZXdNYXJrZXIgaW50ZXJzZWN0IG9yIHRv
dWNoIC0gbWVyZ2UgdGhlbSBpbnRvIG5ld01hcmtlcgotICAgICAgICAgICAgICAgIG5ld01hcmtl
ci5zdGFydE9mZnNldCA9IGtNaW4obmV3TWFya2VyLnN0YXJ0T2Zmc2V0LCBtYXJrZXIuc3RhcnRP
ZmZzZXQpOwotICAgICAgICAgICAgICAgIG5ld01hcmtlci5lbmRPZmZzZXQgPSBrTWF4KG5ld01h
cmtlci5lbmRPZmZzZXQsIG1hcmtlci5lbmRPZmZzZXQpOwotICAgICAgICAgICAgICAgIC8vIHJl
bW92ZSBvbGQgb25lLCB3ZSdsbCBhZGQgbmV3TWFya2VyIGxhdGVyCi0gICAgICAgICAgICAgICAg
aXQgPSBtYXJrZXJzLT5yZW1vdmUoaXQpOwotICAgICAgICAgICAgICAgIC8vIGl0IHBvaW50cyB0
byB0aGUgbmV4dCBtYXJrZXIgdG8gY29uc2lkZXIKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQot
ICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGl0IHBvaW50cyB0byB0aGUgbm9kZSBiZWZvcmUgd2hp
Y2ggd2Ugd2FudCB0byBpbnNlcnQKLSAgICAgICAgbWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdNYXJr
ZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50IHRoZSBhZmZlY3RlZCBub2RlCi0gICAg
aWYgKG5vZGUtPnJlbmRlcmVyKCkpCi0gICAgICAgIG5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQo
KTsKLX0KLQotLy8gY29waWVzIG1hcmtlcnMgZnJvbSBzcmNOb2RlIHRvIGRzdE5vZGUsIGFwcGx5
aW5nIHRoZSBzcGVjaWZpZWQgc2hpZnQgZGVsdGEgdG8gdGhlIGNvcGllcy4gIFRoZSBzaGlmdCBp
cwotLy8gdXNlZnVsIGlmLCBlLmcuLCB0aGUgY2FsbGVyIGhhcyBjcmVhdGVkIHRoZSBkc3ROb2Rl
IGZyb20gYSBub24tcHJlZml4IHN1YnN0cmluZyBvZiB0aGUgc3JjTm9kZS4KLXZvaWQgRG9jdW1l
bnRJbXBsOjpjb3B5TWFya2VycyhOb2RlSW1wbCAqc3JjTm9kZSwgdW5zaWduZWQgc3RhcnRPZmZz
ZXQsIGludCBsZW5ndGgsIE5vZGVJbXBsICpkc3ROb2RlLCBpbnQgZGVsdGEsIERvY3VtZW50TWFy
a2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgaWYgKGxlbmd0aCA8PSAwKQotICAg
ICAgICByZXR1cm47Ci0gICAgCi0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJr
ZXJzID0gbV9tYXJrZXJzLmZpbmQoc3JjTm9kZSk7Ci0gICAgaWYgKCFtYXJrZXJzKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBib29sIGRvY0RpcnR5ID0gZmFsc2U7Ci0gICAgdW5zaWduZWQgZW5k
T2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGggLSAxOwotICAgIFFWYWx1ZUxpc3RJdGVyYXRv
cjxEb2N1bWVudE1hcmtlcj4gaXQ7Ci0gICAgZm9yIChpdCA9IG1hcmtlcnMtPmJlZ2luKCk7IGl0
ICE9IG1hcmtlcnMtPmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIERvY3VtZW50TWFya2VyIG1hcmtl
ciA9ICppdDsKLQotICAgICAgICAvLyBzdG9wIGlmIHdlIGFyZSBub3cgcGFzdCB0aGUgc3BlY2lm
aWVkIHJhbmdlCi0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPiBlbmRPZmZzZXQpCi0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgCi0gICAgICAgIC8vIHNraXAgbWFya2VyIHRoYXQg
aXMgYmVmb3JlIHRoZSBzcGVjaWZpZWQgcmFuZ2Ugb3IgaXMgdGhlIHdyb25nIHR5cGUKLSAgICAg
ICAgaWYgKG1hcmtlci5lbmRPZmZzZXQgPCBzdGFydE9mZnNldCB8fCAobWFya2VyLnR5cGUgIT0g
bWFya2VyVHlwZSAmJiBtYXJrZXJUeXBlICE9IERvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKSkK
LSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8vIHBpbiB0aGUgbWFya2VyIHRvIHRo
ZSBzcGVjaWZpZWQgcmFuZ2UgYW5kIGFwcGx5IHRoZSBzaGlmdCBkZWx0YQotICAgICAgICBkb2NE
aXJ0eSA9IHRydWU7Ci0gICAgICAgIGlmIChtYXJrZXIuc3RhcnRPZmZzZXQgPCBzdGFydE9mZnNl
dCkKLSAgICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwotICAgICAg
ICBpZiAobWFya2VyLmVuZE9mZnNldCA+IGVuZE9mZnNldCkKLSAgICAgICAgICAgIG1hcmtlci5l
bmRPZmZzZXQgPSBlbmRPZmZzZXQ7Ci0gICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0
YTsKLSAgICAgICAgbWFya2VyLmVuZE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgCi0gICAgICAg
IGFkZE1hcmtlcihkc3ROb2RlLCBtYXJrZXIpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXBhaW50
IHRoZSBhZmZlY3RlZCBub2RlCi0gICAgaWYgKGRvY0RpcnR5ICYmIGRzdE5vZGUtPnJlbmRlcmVy
KCkpCi0gICAgICAgIGRzdE5vZGUtPnJlbmRlcmVyKCktPnJlcGFpbnQoKTsKLX0KLQotdm9pZCBE
b2N1bWVudEltcGw6OnJlbW92ZU1hcmtlcnMoTm9kZUltcGwgKm5vZGUsIHVuc2lnbmVkIHN0YXJ0
T2Zmc2V0LCBpbnQgbGVuZ3RoLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBl
KQotewotICAgIGlmIChsZW5ndGggPD0gMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgUVZhbHVl
TGlzdCA8RG9jdW1lbnRNYXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0g
ICAgaWYgKCFtYXJrZXJzKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgYm9vbCBkb2NEaXJ0
eSA9IGZhbHNlOwotICAgIHVuc2lnbmVkIGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3Ro
IC0gMTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0OwotICAgIGZv
ciAoaXQgPSBtYXJrZXJzLT5iZWdpbigpOyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKSB7Ci0gICAg
ICAgIERvY3VtZW50TWFya2VyIG1hcmtlciA9ICppdDsKLQotICAgICAgICAvLyBtYXJrZXJzIGFy
ZSByZXR1cm5lZCBpbiBvcmRlciwgc28gc3RvcCBpZiB3ZSBhcmUgbm93IHBhc3QgdGhlIHNwZWNp
ZmllZCByYW5nZQotICAgICAgICBpZiAobWFya2VyLnN0YXJ0T2Zmc2V0ID4gZW5kT2Zmc2V0KQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAotICAgICAgICAvLyBza2lwIG1hcmtlciB0aGF0
IGlzIHdyb25nIHR5cGUgb3IgYmVmb3JlIHRhcmdldAotICAgICAgICBpZiAobWFya2VyLmVuZE9m
ZnNldCA8IHN0YXJ0T2Zmc2V0IHx8IChtYXJrZXIudHlwZSAhPSBtYXJrZXJUeXBlICYmIG1hcmtl
clR5cGUgIT0gRG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpKSB7Ci0gICAgICAgICAgICBpdCsr
OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBhdCB0aGlz
IHBvaW50IHdlIGtub3cgdGhhdCBtYXJrZXIgYW5kIHRhcmdldCBpbnRlcnNlY3QgaW4gc29tZSB3
YXkKLSAgICAgICAgZG9jRGlydHkgPSB0cnVlOwotCi0gICAgICAgIC8vIHBpdGNoIHRoZSBvbGQg
bWFya2VyCi0gICAgICAgIGl0ID0gbWFya2Vycy0+cmVtb3ZlKGl0KTsKLSAgICAgICAgLy8gaXQg
bm93IHBvaW50cyB0byB0aGUgbmV4dCBub2RlCi0gICAgICAgIAotICAgICAgICAvLyBhZGQgZWl0
aGVyIG9mIHRoZSByZXN1bHRpbmcgc2xpY2VzIHRoYXQgYXJlIGxlZnQgYWZ0ZXIgcmVtb3Zpbmcg
dGFyZ2V0Ci0gICAgICAgIC8vIE5PVEU6IFRoaXMgYWRkcyB0byB0aGUgbGlzdCB3ZSBhcmUgaXRl
cmF0aW5nISAgVGhhdCBpcyBPSyByZWdhcmRsZXNzIG9mCi0gICAgICAgIC8vIHdoZXRoZXIgdGhl
IGl0ZXJhdG9yIHNlZXMgdGhlIG5ldyBub2RlLCBzaW5jZSB0aGUgbmV3IG5vZGUgaXMgYSBrZWVw
ZXIuCi0gICAgICAgIGlmIChzdGFydE9mZnNldCA+IG1hcmtlci5zdGFydE9mZnNldCkgewotICAg
ICAgICAgICAgRG9jdW1lbnRNYXJrZXIgbmV3TGVmdCA9IG1hcmtlcjsKLSAgICAgICAgICAgIG5l
d0xlZnQuZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0gICAgICAgICAgICBtYXJrZXJzLT5pbnNl
cnQoaXQsIG5ld0xlZnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXJrZXIuZW5kT2Zmc2V0
ID4gZW5kT2Zmc2V0KSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBuZXdSaWdodCA9IG1h
cmtlcjsKLSAgICAgICAgICAgIG5ld1JpZ2h0LnN0YXJ0T2Zmc2V0ID0gZW5kT2Zmc2V0OwotICAg
ICAgICAgICAgbWFya2Vycy0+aW5zZXJ0KGl0LCBuZXdSaWdodCk7Ci0gICAgICAgIH0KLSAgICB9
Ci0KLSAgICBpZiAobWFya2Vycy0+aXNFbXB0eSgpKQotICAgICAgICBtX21hcmtlcnMucmVtb3Zl
KG5vZGUpOwotCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQotICAgIGlmIChkb2NE
aXJ0eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5kZXJlcigpLT5yZXBh
aW50KCk7Ci19Ci0KLVFWYWx1ZUxpc3Q8RG9jdW1lbnRNYXJrZXI+IERvY3VtZW50SW1wbDo6bWFy
a2Vyc0Zvck5vZGUoTm9kZUltcGwgKm5vZGUpCi17Ci0gICAgUVZhbHVlTGlzdCA8RG9jdW1lbnRN
YXJrZXI+ICptYXJrZXJzID0gbV9tYXJrZXJzLmZpbmQobm9kZSk7Ci0gICAgaWYgKG1hcmtlcnMp
Ci0gICAgICAgIHJldHVybiAqbWFya2VyczsKLSAgICByZXR1cm4gUVZhbHVlTGlzdCA8RG9jdW1l
bnRNYXJrZXI+ICgpOwotfQotCi12b2lkIERvY3VtZW50SW1wbDo6cmVtb3ZlTWFya2VycyhOb2Rl
SW1wbCAqbm9kZSkKLXsKLSAgICBRVmFsdWVMaXN0PERvY3VtZW50TWFya2VyPiAqbWFya2VycyA9
IG1fbWFya2Vycy50YWtlKG5vZGUpOwotICAgIGlmIChtYXJrZXJzKSB7Ci0gICAgICAgIFJlbmRl
ck9iamVjdCAqcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVy
ZXIpCi0gICAgICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgICAgICBkZWxldGUgbWFy
a2VyczsKLSAgICB9Ci19Ci0KLXZvaWQgRG9jdW1lbnRJbXBsOjpyZW1vdmVNYXJrZXJzKERvY3Vt
ZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGUpCi17Ci0gICAgLy8gb3V0ZXIgbG9vcDog
cHJvY2VzcyBlYWNoIG1hcmtlcmVkIG5vZGUgaW4gdGhlIGRvY3VtZW50Ci0gICAgUVB0ckRpY3RJ
dGVyYXRvcjwgUVZhbHVlTGlzdDxEb2N1bWVudE1hcmtlcj4gPiBkaWN0SXRlcmF0b3IobV9tYXJr
ZXJzKTsKLSAgICBmb3IgKDsgTm9kZUltcGwgKm5vZGUgPSBzdGF0aWNfY2FzdDxOb2RlSW1wbCAq
PihkaWN0SXRlcmF0b3IuY3VycmVudEtleSgpKTsgKSB7Ci0gICAgICAgIC8vIGlubmVyIGxvb3A6
IHByb2Nlc3MgZWFjaCBtYXJrZXIgaW4gdGhlIGN1cnJlbnQgbm9kZQotICAgICAgICBRVmFsdWVM
aXN0IDxEb2N1bWVudE1hcmtlcj4gKm1hcmtlcnMgPSBzdGF0aWNfY2FzdDxRVmFsdWVMaXN0IDxE
b2N1bWVudE1hcmtlcj4gKj4oZGljdEl0ZXJhdG9yLmN1cnJlbnQoKSk7Ci0gICAgICAgIFFWYWx1
ZUxpc3RJdGVyYXRvcjxEb2N1bWVudE1hcmtlcj4gbWFya2VySXRlcmF0b3I7Ci0gICAgICAgIGZv
ciAobWFya2VySXRlcmF0b3IgPSBtYXJrZXJzLT5iZWdpbigpOyBtYXJrZXJJdGVyYXRvciAhPSBt
YXJrZXJzLT5lbmQoKTsgKSB7Ci0gICAgICAgICAgICBEb2N1bWVudE1hcmtlciBtYXJrZXIgPSAq
bWFya2VySXRlcmF0b3I7Ci0KLSAgICAgICAgICAgIC8vIHNraXAgbm9kZXMgdGhhdCBhcmUgbm90
IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotICAgICAgICAgICAgaWYgKG1hcmtlci50eXBlICE9IG1h
cmtlclR5cGUgJiYgbWFya2VyVHlwZSAhPSBEb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vycykgewot
ICAgICAgICAgICAgICAgICsrbWFya2VySXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHBpdGNoIHRoZSBvbGQgbWFya2Vy
Ci0gICAgICAgICAgICBtYXJrZXJJdGVyYXRvciA9IG1hcmtlcnMtPnJlbW92ZShtYXJrZXJJdGVy
YXRvcik7Ci0gICAgICAgICAgICAvLyBtYXJrZXJJdGVyYXRvciBub3cgcG9pbnRzIHRvIHRoZSBu
ZXh0IG5vZGUKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gZGVsZXRlIHRoZSBub2Rl
J3MgbGlzdCBpZiBpdCBpcyBub3cgZW1wdHkKLSAgICAgICAgaWYgKG1hcmtlcnMtPmlzRW1wdHko
KSkKLSAgICAgICAgICAgIG1fbWFya2Vycy5yZW1vdmUobm9kZSk7Ci0gICAgICAgIAotICAgICAg
ICAvLyBjYXVzZSB0aGUgbm9kZSB0byBiZSByZWRyYXduCi0gICAgICAgIFJlbmRlck9iamVjdCAq
cmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOwotICAgICAgICBpZiAocmVuZGVyZXIpCi0gICAg
ICAgICAgICByZW5kZXJlci0+cmVwYWludCgpOwotICAgIH0KLX0KLQotdm9pZCBEb2N1bWVudElt
cGw6OnNoaWZ0TWFya2VycyhOb2RlSW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGlu
dCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6Ok1hcmtlclR5cGUgbWFya2VyVHlwZSkKLXsKLSAgICBR
VmFsdWVMaXN0IDxEb2N1bWVudE1hcmtlcj4gKm1hcmtlcnMgPSBtX21hcmtlcnMuZmluZChub2Rl
KTsKLSAgICBpZiAoIW1hcmtlcnMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJvb2wgZG9jRGly
dHkgPSBmYWxzZTsKLSAgICBRVmFsdWVMaXN0SXRlcmF0b3I8RG9jdW1lbnRNYXJrZXI+IGl0Owot
ICAgIGZvciAoaXQgPSBtYXJrZXJzLT5iZWdpbigpOyBpdCAhPSBtYXJrZXJzLT5lbmQoKTsgKytp
dCkgewotICAgICAgICBEb2N1bWVudE1hcmtlciAmbWFya2VyID0gKml0OwotICAgICAgICBpZiAo
bWFya2VyLnN0YXJ0T2Zmc2V0ID49IHN0YXJ0T2Zmc2V0ICYmIChtYXJrZXJUeXBlID09IERvY3Vt
ZW50TWFya2VyOjpBbGxNYXJrZXJzIHx8IG1hcmtlci50eXBlID09IG1hcmtlclR5cGUpKSB7Ci0g
ICAgICAgICAgICBhc3NlcnQoKGludCltYXJrZXIuc3RhcnRPZmZzZXQgKyBkZWx0YSA+PSAwKTsK
LSAgICAgICAgICAgIG1hcmtlci5zdGFydE9mZnNldCArPSBkZWx0YTsKLSAgICAgICAgICAgIG1h
cmtlci5lbmRPZmZzZXQgKz0gZGVsdGE7Ci0gICAgICAgICAgICBkb2NEaXJ0eSA9IHRydWU7Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gcmVwYWludCB0aGUgYWZmZWN0ZWQgbm9kZQot
ICAgIGlmIChkb2NEaXJ0eSAmJiBub2RlLT5yZW5kZXJlcigpKQotICAgICAgICBub2RlLT5yZW5k
ZXJlcigpLT5yZXBhaW50KCk7Ci19Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0KLXZvaWQgRG9jdW1l
bnRJbXBsOjphcHBseVhTTFRyYW5zZm9ybShQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSkK
LXsKLSAgICBSZWZQdHI8WFNMVFByb2Nlc3NvckltcGw+IHByb2Nlc3NvciA9IG5ldyBYU0xUUHJv
Y2Vzc29ySW1wbDsKLSAgICBwcm9jZXNzb3ItPnNldFhTTFN0eWxlc2hlZXQoc3RhdGljX2Nhc3Q8
WFNMU3R5bGVTaGVldEltcGwqPihwaS0+c2hlZXQoKSkpOwotICAgIAotICAgIFFTdHJpbmcgcmVz
dWx0TUlNRVR5cGU7Ci0gICAgUVN0cmluZyBuZXdTb3VyY2U7Ci0gICAgUVN0cmluZyByZXN1bHRF
bmNvZGluZzsKLSAgICBpZiAoIXByb2Nlc3Nvci0+dHJhbnNmb3JtVG9TdHJpbmcodGhpcywgcmVz
dWx0TUlNRVR5cGUsIG5ld1NvdXJjZSwgcmVzdWx0RW5jb2RpbmcpKQotICAgICAgICByZXR1cm47
Ci0gICAgLy8gRklYTUU6IElmIHRoZSB0cmFuc2Zvcm0gZmFpbGVkIHdlIHNob3VsZCBwcm9iYWJs
eSByZXBvcnQgYW4gZXJyb3IgKGxpa2UgTW96aWxsYSBkb2VzKS4KLSAgICBwcm9jZXNzb3ItPmNy
ZWF0ZURvY3VtZW50RnJvbVNvdXJjZShuZXdTb3VyY2UsIHJlc3VsdEVuY29kaW5nLCByZXN1bHRN
SU1FVHlwZSwgdGhpcywgdmlldygpKTsKLX0KLQotI2VuZGlmCi0KLXZvaWQgRG9jdW1lbnRJbXBs
OjpzZXREZXNpZ25Nb2RlKEluaGVyaXRlZEJvb2wgdmFsdWUpCi17Ci0gICAgbV9kZXNpZ25Nb2Rl
ID0gdmFsdWU7Ci19Ci0KLURvY3VtZW50SW1wbDo6SW5oZXJpdGVkQm9vbCBEb2N1bWVudEltcGw6
OmdldERlc2lnbk1vZGUoKSBjb25zdAotewotICAgIHJldHVybiBtX2Rlc2lnbk1vZGU7Ci19Ci0K
LWJvb2wgRG9jdW1lbnRJbXBsOjppbkRlc2lnbk1vZGUoKSBjb25zdAotewotICAgIGZvciAoY29u
c3QgRG9jdW1lbnRJbXBsKiBkID0gdGhpczsgZDsgZCA9IGQtPnBhcmVudERvY3VtZW50KCkpIHsK
LSAgICAgICAgaWYgKGQtPm1fZGVzaWduTW9kZSAhPSBpbmhlcml0KQotICAgICAgICAgICAgcmV0
dXJuIGQtPm1fZGVzaWduTW9kZTsgICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQot
Ci1Eb2N1bWVudEltcGwgKkRvY3VtZW50SW1wbDo6cGFyZW50RG9jdW1lbnQoKSBjb25zdAotewot
ICAgIEZyYW1lICpjaGlsZFBhcnQgPSBmcmFtZSgpOwotICAgIGlmICghY2hpbGRQYXJ0KQotICAg
ICAgICByZXR1cm4gMDsKLSAgICBGcmFtZSAqcGFyZW50ID0gY2hpbGRQYXJ0LT5wYXJlbnRGcmFt
ZSgpOwotICAgIGlmICghcGFyZW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gcGFy
ZW50LT54bWxEb2NJbXBsKCk7Ci19Ci0KLURvY3VtZW50SW1wbCAqRG9jdW1lbnRJbXBsOjp0b3BE
b2N1bWVudCgpIGNvbnN0Ci17Ci0gICAgRG9jdW1lbnRJbXBsICpkb2MgPSBjb25zdF9jYXN0PERv
Y3VtZW50SW1wbCAqPih0aGlzKTsKLSAgICBFbGVtZW50SW1wbCAqZWxlbWVudDsKLSAgICB3aGls
ZSAoKGVsZW1lbnQgPSBkb2MtPm93bmVyRWxlbWVudCgpKSAhPSAwKSB7Ci0gICAgICAgIGRvYyA9
IGVsZW1lbnQtPmdldERvY3VtZW50KCk7Ci0gICAgICAgIGVsZW1lbnQgPSBkb2MgPyBkb2MtPm93
bmVyRWxlbWVudCgpIDogMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGRvYzsKLX0KLQotQXR0
ckltcGwgKkRvY3VtZW50SW1wbDo6Y3JlYXRlQXR0cmlidXRlTlMoY29uc3QgRE9NU3RyaW5nICZu
YW1lc3BhY2VVUkksIGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVkTmFtZSwgaW50ICZleGNlcHRp
b24pCi17Ci0gICAgaWYgKHF1YWxpZmllZE5hbWUuaXNOdWxsKCkpIHsKLSAgICAgICAgZXhjZXB0
aW9uID0gRE9NRXhjZXB0aW9uOjpOQU1FU1BBQ0VfRVJSOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0KLSAgICBET01TdHJpbmcgbG9jYWxOYW1lID0gcXVhbGlmaWVkTmFtZTsKLSAgICBET01T
dHJpbmcgcHJlZml4OwotICAgIGludCBjb2xvbnBvczsKLSAgICBpZiAoKGNvbG9ucG9zID0gcXVh
bGlmaWVkTmFtZS5maW5kKCc6JykpID49IDApIHsKLSAgICAgICAgcHJlZml4ID0gcXVhbGlmaWVk
TmFtZS5jb3B5KCk7Ci0gICAgICAgIGxvY2FsTmFtZSA9IHF1YWxpZmllZE5hbWUuY29weSgpOwot
ICAgICAgICBwcmVmaXgudHJ1bmNhdGUoY29sb25wb3MpOwotICAgICAgICBsb2NhbE5hbWUucmVt
b3ZlKDAsIGNvbG9ucG9zKzEpOwotICAgIH0KLQotICAgIGlmICghaXNWYWxpZE5hbWUobG9jYWxO
YW1lKSkgewotICAgICAgICBleGNlcHRpb24gPSBET01FeGNlcHRpb246OklOVkFMSURfQ0hBUkFD
VEVSX0VSUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIC8vIEZJWE1FOiBB
c3N1bWUgdGhpcyBpcyBhIG1hcHBlZCBhdHRyaWJ1dGUsIHNpbmNlIGNyZWF0ZUF0dHJpYnV0ZSBp
c24ndCBuYW1lc3BhY2UtYXdhcmUuICBUaGVyZSdzIG5vIGhhcm0gdG8gWE1MCi0gICAgLy8gZG9j
dW1lbnRzIGlmIHdlJ3JlIHdyb25nLgotICAgIHJldHVybiBuZXcgQXR0ckltcGwoMCwgdGhpcywg
bmV3IE1hcHBlZEF0dHJpYnV0ZUltcGwoUXVhbGlmaWVkTmFtZShwcmVmaXguaW1wbCgpLCAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbG9jYWxOYW1lLmltcGwoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVVJJ
LmltcGwoKSksIERPTVN0cmluZygiIikuaW1wbCgpKSwgZmFsc2UpOwotfQotCi12b2lkIERvY3Vt
ZW50SW1wbDo6cmFkaW9CdXR0b25DaGVja2VkKEhUTUxJbnB1dEVsZW1lbnRJbXBsICpjYWxsZXIs
IEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17Ci0gICAgLy8gV2l0aG91dCBhIG5hbWUsIHRo
ZXJlIGlzIG5vIGdyb3VwLgotICAgIGlmIChjYWxsZXItPm5hbWUoKS5pc0VtcHR5KCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICBpZiAoIWZvcm0pCi0gICAgICAgIGZvcm0gPSBkZWZhdWx0Rm9ybTsK
LSAgICAvLyBVbmNoZWNrIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbQotICAgIGlmICghbV9z
ZWxlY3RlZFJhZGlvQnV0dG9ucykKLSAgICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9ucyA9IG5l
dyBGb3JtVG9Hcm91cE1hcDsKLSAgICBOYW1lVG9JbnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9
IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdldChmb3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1
dHRvbnMpIHsKLSAgICAgICAgZm9ybVJhZGlvQnV0dG9ucyA9IG5ldyBOYW1lVG9JbnB1dE1hcDsK
LSAgICAgICAgbV9zZWxlY3RlZFJhZGlvQnV0dG9ucy0+c2V0KGZvcm0sIGZvcm1SYWRpb0J1dHRv
bnMpOwotICAgIH0KLSAgICAKLSAgICBIVE1MSW5wdXRFbGVtZW50SW1wbCogY3VycmVudENoZWNr
ZWRSYWRpbyA9IGZvcm1SYWRpb0J1dHRvbnMtPmdldChjYWxsZXItPm5hbWUoKS5pbXBsKCkpOwot
ICAgIGlmIChjdXJyZW50Q2hlY2tlZFJhZGlvICYmIGN1cnJlbnRDaGVja2VkUmFkaW8gIT0gY2Fs
bGVyKQotICAgICAgICBjdXJyZW50Q2hlY2tlZFJhZGlvLT5zZXRDaGVja2VkKGZhbHNlKTsKLQot
ICAgIGZvcm1SYWRpb0J1dHRvbnMtPnNldChjYWxsZXItPm5hbWUoKS5pbXBsKCksIGNhbGxlcik7
Ci19Ci0KLUhUTUxJbnB1dEVsZW1lbnRJbXBsKiBEb2N1bWVudEltcGw6OmNoZWNrZWRSYWRpb0J1
dHRvbkZvckdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwgKmZv
cm0pCi17Ci0gICAgaWYgKCFtX3NlbGVjdGVkUmFkaW9CdXR0b25zKQotICAgICAgICByZXR1cm4g
MDsKLSAgICBpZiAoIWZvcm0pCi0gICAgICAgIGZvcm0gPSBkZWZhdWx0Rm9ybTsKLSAgICBOYW1l
VG9JbnB1dE1hcCogZm9ybVJhZGlvQnV0dG9ucyA9IG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMtPmdl
dChmb3JtKTsKLSAgICBpZiAoIWZvcm1SYWRpb0J1dHRvbnMpCi0gICAgICAgIHJldHVybiAwOwot
ICAgIAotICAgIHJldHVybiBmb3JtUmFkaW9CdXR0b25zLT5nZXQobmFtZSk7Ci19Ci0KLXZvaWQg
RG9jdW1lbnRJbXBsOjpyZW1vdmVSYWRpb0J1dHRvbkdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUs
IEhUTUxGb3JtRWxlbWVudEltcGwgKmZvcm0pCi17Ci0gICAgaWYgKCFmb3JtKQotICAgICAgICBm
b3JtID0gZGVmYXVsdEZvcm07Ci0gICAgaWYgKG1fc2VsZWN0ZWRSYWRpb0J1dHRvbnMpIHsKLSAg
ICAgICAgTmFtZVRvSW5wdXRNYXAqIGZvcm1SYWRpb0J1dHRvbnMgPSBtX3NlbGVjdGVkUmFkaW9C
dXR0b25zLT5nZXQoZm9ybSk7Ci0gICAgICAgIGlmIChmb3JtUmFkaW9CdXR0b25zKSB7Ci0gICAg
ICAgICAgICBmb3JtUmFkaW9CdXR0b25zLT5yZW1vdmUobmFtZSk7Ci0gICAgICAgICAgICBpZiAo
Zm9ybVJhZGlvQnV0dG9ucy0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbV9zZWxlY3Rl
ZFJhZGlvQnV0dG9ucy0+cmVtb3ZlKGZvcm0pOwotICAgICAgICAgICAgICAgIGRlbGV0ZSBmb3Jt
UmFkaW9CdXR0b25zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1SZWZQ
dHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmltYWdlcygpCi17Ci0gICAgcmV0
dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhp
cywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0NfSU1BR0VTKSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29s
bGVjdGlvbkltcGw+IERvY3VtZW50SW1wbDo6YXBwbGV0cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0
cjxIVE1MQ29sbGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENv
bGxlY3Rpb25JbXBsOjpET0NfQVBQTEVUUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25J
bXBsPiBEb2N1bWVudEltcGw6OmVtYmVkcygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29s
bGVjdGlvbkltcGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25J
bXBsOjpET0NfRU1CRURTKSk7Ci19Ci0KLVJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IERvY3Vt
ZW50SW1wbDo6b2JqZWN0cygpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlvbklt
cGw+KG5ldyBIVE1MQ29sbGVjdGlvbkltcGwodGhpcywgSFRNTENvbGxlY3Rpb25JbXBsOjpET0Nf
T0JKRUNUUykpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6
OmxpbmtzKCkKLXsKLSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhU
TUxDb2xsZWN0aW9uSW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19MSU5LUykpOwot
fQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmZvcm1zKCkKLXsK
LSAgICByZXR1cm4gUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4obmV3IEhUTUxDb2xsZWN0aW9u
SW1wbCh0aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OkRPQ19GT1JNUykpOwotfQotCi1SZWZQdHI8
SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmFuY2hvcnMoKQotewotICAgIHJldHVy
biBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMs
IEhUTUxDb2xsZWN0aW9uSW1wbDo6RE9DX0FOQ0hPUlMpKTsKLX0KLQotUmVmUHRyPEhUTUxDb2xs
ZWN0aW9uSW1wbD4gRG9jdW1lbnRJbXBsOjphbGwoKQotewotICAgIHJldHVybiBSZWZQdHI8SFRN
TENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTENvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0
aW9uSW1wbDo6RE9DX0FMTCkpOwotfQotCi1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1
bWVudEltcGw6OndpbmRvd05hbWVkSXRlbXMoRE9NU3RyaW5nICZuYW1lKQotewotICAgIHJldHVy
biBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPihuZXcgSFRNTE5hbWVDb2xsZWN0aW9uSW1wbCh0
aGlzLCBIVE1MQ29sbGVjdGlvbkltcGw6OldJTkRPV19OQU1FRF9JVEVNUywgbmFtZSkpOwotfQot
Ci1SZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBEb2N1bWVudEltcGw6OmRvY3VtZW50TmFtZWRJ
dGVtcyhET01TdHJpbmcgJm5hbWUpCi17Ci0gICAgcmV0dXJuIFJlZlB0cjxIVE1MQ29sbGVjdGlv
bkltcGw+KG5ldyBIVE1MTmFtZUNvbGxlY3Rpb25JbXBsKHRoaXMsIEhUTUxDb2xsZWN0aW9uSW1w
bDo6RE9DVU1FTlRfTkFNRURfSVRFTVMsIG5hbWUpKTsKLX0KLQotUmVmUHRyPE5hbWVOb2RlTGlz
dEltcGw+IERvY3VtZW50SW1wbDo6Z2V0RWxlbWVudHNCeU5hbWUoY29uc3QgRE9NU3RyaW5nICZl
bGVtZW50TmFtZSkKLXsKLSAgICByZXR1cm4gUmVmUHRyPE5hbWVOb2RlTGlzdEltcGw+KG5ldyBO
YW1lTm9kZUxpc3RJbXBsKHRoaXMsIGVsZW1lbnROYW1lKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0KLQotRG9jdW1lbnRGcmFnbWVudEltcGw6OkRvY3VtZW50RnJhZ21lbnRJbXBsKERv
Y3VtZW50SW1wbCAqZG9jKSA6IENvbnRhaW5lck5vZGVJbXBsKGRvYykKLXsKLX0KLQotRE9NU3Ry
aW5nIERvY3VtZW50RnJhZ21lbnRJbXBsOjpub2RlTmFtZSgpIGNvbnN0Ci17Ci0gIHJldHVybiAi
I2RvY3VtZW50LWZyYWdtZW50IjsKLX0KLQotdW5zaWduZWQgc2hvcnQgRG9jdW1lbnRGcmFnbWVu
dEltcGw6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gTm9kZTo6RE9DVU1FTlRfRlJB
R01FTlRfTk9ERTsKLX0KLQotLy8gRE9NIFNlY3Rpb24gMS4xLjEKLWJvb2wgRG9jdW1lbnRGcmFn
bWVudEltcGw6OmNoaWxkVHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0IHR5cGUgKQotewotICAg
IHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIE5vZGU6OkVMRU1FTlRfTk9ERToKLSAgICAg
ICAgY2FzZSBOb2RlOjpQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2Ug
Tm9kZTo6Q09NTUVOVF9OT0RFOgotICAgICAgICBjYXNlIE5vZGU6OlRFWFRfTk9ERToKLSAgICAg
ICAgY2FzZSBOb2RlOjpDREFUQV9TRUNUSU9OX05PREU6Ci0gICAgICAgIGNhc2UgTm9kZTo6RU5U
SVRZX1JFRkVSRU5DRV9OT0RFOgotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGRl
ZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotCi1ET01TdHJpbmcg
RG9jdW1lbnRGcmFnbWVudEltcGw6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBET01TdHJpbmcg
cmVzdWx0OwotCi0gICAgZm9yIChOb2RlSW1wbCAqY2hpbGQgPSBmaXJzdENoaWxkKCk7IGNoaWxk
ICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHRTaWJsaW5nKCkpIHsKLQlyZXN1bHQgKz0gY2hp
bGQtPnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi1Ob2Rl
SW1wbCAqRG9jdW1lbnRGcmFnbWVudEltcGw6OmNsb25lTm9kZSAoYm9vbCBkZWVwKQotewotICAg
IERvY3VtZW50RnJhZ21lbnRJbXBsICpjbG9uZSA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbChn
ZXREb2N1bWVudCgpKTsKLSAgICBpZiAoZGVlcCkKLSAgICAgICAgY2xvbmVDaGlsZE5vZGVzKGNs
b25lKTsKLSAgICByZXR1cm4gY2xvbmU7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQot
Ci1Eb2N1bWVudFR5cGVJbXBsOjpEb2N1bWVudFR5cGVJbXBsKERPTUltcGxlbWVudGF0aW9uSW1w
bCAqaSwgRG9jdW1lbnRJbXBsICpkb2MsIGNvbnN0IERPTVN0cmluZyAmbiwgY29uc3QgRE9NU3Ry
aW5nICZwLCBjb25zdCBET01TdHJpbmcgJnMpCi0gICAgOiBOb2RlSW1wbChkb2MpLCBtX2ltcGxl
bWVudGF0aW9uKGkpLCBtX25hbWUobiksIG1fcHVibGljSWQocCksIG1fc3lzdGVtSWQocykKLXsK
LX0KLQotRG9jdW1lbnRUeXBlSW1wbDo6RG9jdW1lbnRUeXBlSW1wbChEb2N1bWVudEltcGwgKmRv
YywgY29uc3QgRE9NU3RyaW5nICZuLCBjb25zdCBET01TdHJpbmcgJnAsIGNvbnN0IERPTVN0cmlu
ZyAmcykKLSAgICA6IE5vZGVJbXBsKGRvYyksIG1fbmFtZShuKSwgbV9wdWJsaWNJZChwKSwgbV9z
eXN0ZW1JZChzKQotewotfQotCi1Eb2N1bWVudFR5cGVJbXBsOjpEb2N1bWVudFR5cGVJbXBsKERv
Y3VtZW50SW1wbCAqZG9jLCBjb25zdCBEb2N1bWVudFR5cGVJbXBsICZ0KQotICAgIDogTm9kZUlt
cGwoZG9jKSwgbV9pbXBsZW1lbnRhdGlvbih0Lm1faW1wbGVtZW50YXRpb24pCi0gICAgLCBtX25h
bWUodC5tX25hbWUpLCBtX3B1YmxpY0lkKHQubV9wdWJsaWNJZCksIG1fc3lzdGVtSWQodC5tX3N5
c3RlbUlkKSwgbV9zdWJzZXQodC5tX3N1YnNldCkKLXsKLX0KLQotRE9NU3RyaW5nIERvY3VtZW50
VHlwZUltcGw6OnRvU3RyaW5nKCkgY29uc3QKLXsKLSAgICBpZiAobV9uYW1lLmlzRW1wdHkoKSkK
LSAgICAgICAgcmV0dXJuICIiOwotCi0gICAgRE9NU3RyaW5nIHJlc3VsdCA9ICI8IURPQ1RZUEUg
IjsKLSAgICByZXN1bHQgKz0gbV9uYW1lOwotICAgIGlmICghbV9wdWJsaWNJZC5pc0VtcHR5KCkp
IHsKLQlyZXN1bHQgKz0gIiBQVUJMSUMgXCIiOwotCXJlc3VsdCArPSBtX3B1YmxpY0lkOwotCXJl
c3VsdCArPSAiXCIgXCIiOwotCXJlc3VsdCArPSBtX3N5c3RlbUlkOwotCXJlc3VsdCArPSAiXCIi
OwotICAgIH0gZWxzZSBpZiAoIW1fc3lzdGVtSWQuaXNFbXB0eSgpKSB7Ci0JcmVzdWx0ICs9ICIg
U1lTVEVNIFwiIjsKLQlyZXN1bHQgKz0gbV9zeXN0ZW1JZDsKLQlyZXN1bHQgKz0gIlwiIjsKLSAg
ICB9Ci0gICAgaWYgKCFtX3N1YnNldC5pc0VtcHR5KCkpIHsKLQlyZXN1bHQgKz0gIiBbIjsKLQly
ZXN1bHQgKz0gbV9zdWJzZXQ7Ci0JcmVzdWx0ICs9ICJdIjsKLSAgICB9Ci0gICAgcmVzdWx0ICs9
ICI+IjsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1ET01TdHJpbmcgRG9jdW1lbnRUeXBlSW1w
bDo6bm9kZU5hbWUoKSBjb25zdAotewotICAgIHJldHVybiBuYW1lKCk7Ci19Ci0KLXVuc2lnbmVk
IHNob3J0IERvY3VtZW50VHlwZUltcGw6Om5vZGVUeXBlKCkgY29uc3QKLXsKLSAgICByZXR1cm4g
Tm9kZTo6RE9DVU1FTlRfVFlQRV9OT0RFOwotfQotCi1Ob2RlSW1wbCAqRG9jdW1lbnRUeXBlSW1w
bDo6Y2xvbmVOb2RlKGJvb2wgLypkZWVwKi8pCi17Ci0gICAgLy8gVGhlIERPTSBMZXZlbCAyIHNw
ZWNpZmljYXRpb24gc2F5cyBjbG9uaW5nIERvY3VtZW50VHlwZSBub2RlcyBpcyAiaW1wbGVtZW50
YXRpb24gZGVwZW5kZW50IiBzbyBmb3Igbm93IHdlIGRvIG5vdCBzdXBwb3J0IGl0LgotICAgIHJl
dHVybiAwOwotfQpJbmRleDoga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmgJKHJldmlzaW9uIDEyMDE1
KQorKysga2h0bWwveG1sL0RvY3VtZW50RnJhZ21lbnRJbXBsLmgJKHdvcmtpbmcgY29weSkKQEAg
LTIyLDc4NiArMjIsMTIgQEAKICAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICoKICAq
LwotI2lmbmRlZiBfRE9NX0RvY3VtZW50SW1wbF9oXwotI2RlZmluZSBfRE9NX0RvY3VtZW50SW1w
bF9oXworI2lmbmRlZiBET01fRG9jdW1lbnRGcmFnbWVudEltcGxfaAorI2RlZmluZSBET01fRG9j
dW1lbnRGcmFnbWVudEltcGxfaAogCi0jaW5jbHVkZSAieG1sL2RvbV9lbGVtZW50aW1wbC5oIgot
I2luY2x1ZGUgInhtbC9kb20yX3RyYXZlcnNhbGltcGwuaCIKLSNpbmNsdWRlICJtaXNjL3NoYXJl
ZC5oIgotCi0jaW5jbHVkZSA8cXN0cmluZ2xpc3QuaD4KLSNpbmNsdWRlIDxxcHRybGlzdC5oPgot
I2luY2x1ZGUgPHFvYmplY3QuaD4KLSNpbmNsdWRlIDxxZGljdC5oPgotI2luY2x1ZGUgPHFwdHJk
aWN0Lmg+Ci0jaW5jbHVkZSA8cW1hcC5oPgotI2luY2x1ZGUgPHFkYXRldGltZS5oPgotCi0jaW5j
bHVkZSA8a3VybC5oPgotCi0jaW5jbHVkZSAiS1dRU2lnbmFsLmgiCi0jaW5jbHVkZSAiZGVjb2Rl
ci5oIgotCi0jaW5jbHVkZSA8a3htbGNvcmUvSGFzaE1hcC5oPgotCi1jbGFzcyBRUGFpbnREZXZp
Y2U7Ci1jbGFzcyBRUGFpbnREZXZpY2VNZXRyaWNzOwotY2xhc3MgS0hUTUxWaWV3OwotY2xhc3Mg
RnJhbWU7Ci1jbGFzcyBSZW5kZXJBcmVuYTsKLQotY2xhc3MgS1dRQWNjT2JqZWN0Q2FjaGU7Ci0K
LW5hbWVzcGFjZSBraHRtbCB7Ci0gICAgY2xhc3MgQ1NTU3R5bGVTZWxlY3RvcjsKLSAgICBzdHJ1
Y3QgRGFzaGJvYXJkUmVnaW9uVmFsdWU7Ci0gICAgY2xhc3MgRG9jTG9hZGVyOwotICAgIGNsYXNz
IFJlbmRlckltYWdlOwotICAgIGNsYXNzIFRva2VuaXplcjsKLSAgICBjbGFzcyBYTUxIYW5kbGVy
OwotfQotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotbmFtZXNwYWNlIFhCTCB7Ci0gICAgY2xhc3Mg
WEJMQmluZGluZ01hbmFnZXI7Ci19Ci0jZW5kaWYKKyNpbmNsdWRlICJkb21fbm9kZWltcGwuaCIK
IAogbmFtZXNwYWNlIERPTSB7Ci0gICAgY2xhc3MgQWJzdHJhY3RWaWV3SW1wbDsKLSAgICBjbGFz
cyBBdHRySW1wbDsKLSAgICBjbGFzcyBDREFUQVNlY3Rpb25JbXBsOwotICAgIGNsYXNzIENTU1N0
eWxlU2hlZXRJbXBsOwotICAgIGNsYXNzIENTU01hcHBlZEF0dHJpYnV0ZURlY2xhcmF0aW9uSW1w
bDsKLSAgICBjbGFzcyBDb21tZW50SW1wbDsKLSAgICBjbGFzcyBEb2N1bWVudEZyYWdtZW50SW1w
bDsKLSAgICBjbGFzcyBEb2N1bWVudEltcGw7Ci0gICAgY2xhc3MgRG9jdW1lbnRUeXBlOwotICAg
IGNsYXNzIERvY3VtZW50VHlwZUltcGw7Ci0gICAgY2xhc3MgRWRpdGluZ1RleHRJbXBsOwotICAg
IGNsYXNzIEVsZW1lbnRJbXBsOwotICAgIGNsYXNzIEVudGl0eVJlZmVyZW5jZUltcGw7Ci0gICAg
Y2xhc3MgRXZlbnRJbXBsOwotICAgIGNsYXNzIEV2ZW50TGlzdGVuZXI7Ci0gICAgY2xhc3MgR2Vu
ZXJpY1JPTmFtZWROb2RlTWFwSW1wbDsKLSAgICBjbGFzcyBIVE1MQ29sbGVjdGlvbkltcGw7Ci0g
ICAgY2xhc3MgSFRNTERvY3VtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MRWxlbWVudEltcGw7Ci0g
ICAgY2xhc3MgSFRNTEZvcm1FbGVtZW50SW1wbDsKLSAgICBjbGFzcyBIVE1MSW1hZ2VMb2FkZXI7
Ci0gICAgY2xhc3MgSFRNTElucHV0RWxlbWVudEltcGw7Ci0gICAgY2xhc3MgSFRNTE1hcEVsZW1l
bnRJbXBsOwotICAgIGNsYXNzIEpTRWRpdG9yOwotICAgIGNsYXNzIE5vZGVGaWx0ZXI7Ci0gICAg
Y2xhc3MgTm9kZUZpbHRlckltcGw7Ci0gICAgY2xhc3MgTm9kZUl0ZXJhdG9ySW1wbDsKLSAgICBj
bGFzcyBOb2RlTGlzdEltcGw7Ci0gICAgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDsK
LSAgICBjbGFzcyBSYW5nZUltcGw7Ci0gICAgY2xhc3MgUmVnaXN0ZXJlZEV2ZW50TGlzdGVuZXI7
Ci0gICAgY2xhc3MgU3R5bGVTaGVldEltcGw7Ci0gICAgY2xhc3MgU3R5bGVTaGVldExpc3RJbXBs
OwotICAgIGNsYXNzIFRleHRJbXBsOwotICAgIGNsYXNzIFRyZWVXYWxrZXJJbXBsOwotCi0gICAg
Ly8gQSByYW5nZSBvZiBhIG5vZGUgd2l0aGluIGEgZG9jdW1lbnQgdGhhdCBpcyAibWFya2VkIiwg
c3VjaCBhcyBiZWluZyBtaXNzcGVsbGVkCi0gICAgc3RydWN0IERvY3VtZW50TWFya2VyCi0gICAg
ewotICAgICAgICBlbnVtIE1hcmtlclR5cGUgewotICAgICAgICAgICAgQWxsTWFya2VycyA9IC0x
LAotICAgICAgICAgICAgU3BlbGxpbmcgPSAwCi0gICAgICAgICAgICAvLyBOb3QgZG9pbmcgZ3Jh
bW1hciB5ZXQsIGJ1dCB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGl0Ci0gICAgICAgICAgICAv
LyBHcmFtbWFyCi0gICAgICAgIH07Ci0gICAgICAgIAotICAgICAgICBlbnVtIE1hcmtlclR5cGUg
dHlwZTsKLSAgICAgICAgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLSAgICAgICAg
Ci0gICAgICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IERvY3VtZW50TWFya2VyICZvKSBjb25z
dCB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBvLnR5cGUgJiYgc3RhcnRPZmZzZXQgPT0g
by5zdGFydE9mZnNldCAmJiBlbmRPZmZzZXQgPT0gby5lbmRPZmZzZXQ7Ci0gICAgICAgIH0KLSAg
ICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgRG9jdW1lbnRNYXJrZXIgJm8pIGNvbnN0IHsK
LSAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG8pOwotICAgICAgICB9Ci0gICAgfTsKLSAg
ICAKLWNsYXNzIERPTUltcGxlbWVudGF0aW9uSW1wbCA6IHB1YmxpYyBraHRtbDo6U2hhcmVkPERP
TUltcGxlbWVudGF0aW9uSW1wbD4KLXsKLXB1YmxpYzoKLSAgICBET01JbXBsZW1lbnRhdGlvbklt
cGwoKTsKLSAgICB+RE9NSW1wbGVtZW50YXRpb25JbXBsKCk7Ci0KLSAgICAvLyBET00gbWV0aG9k
cyAmIGF0dHJpYnV0ZXMgZm9yIERPTUltcGxlbWVudGF0aW9uCi0gICAgYm9vbCBoYXNGZWF0dXJl
KGNvbnN0IERPTVN0cmluZyYgZmVhdHVyZSwgY29uc3QgRE9NU3RyaW5nJiB2ZXJzaW9uKSBjb25z
dDsKLSAgICBEb2N1bWVudFR5cGVJbXBsICpjcmVhdGVEb2N1bWVudFR5cGUoIGNvbnN0IERPTVN0
cmluZyAmcXVhbGlmaWVkTmFtZSwgY29uc3QgRE9NU3RyaW5nICZwdWJsaWNJZCwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERPTVN0cmluZyAmc3lzdGVt
SWQsIGludCAmZXhjZXB0aW9uY29kZSApOwotICAgIERvY3VtZW50SW1wbCAqY3JlYXRlRG9jdW1l
bnQoIGNvbnN0IERPTVN0cmluZyAmbmFtZXNwYWNlVVJJLCBjb25zdCBET01TdHJpbmcgJnF1YWxp
ZmllZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRUeXBl
SW1wbCAqZG9jdHlwZSwgaW50ICZleGNlcHRpb25jb2RlICk7Ci0KLSAgICBET01JbXBsZW1lbnRh
dGlvbkltcGwqIGdldEludGVyZmFjZShjb25zdCBET01TdHJpbmcmIGZlYXR1cmUpIGNvbnN0Owot
Ci0gICAgLy8gRnJvbSB0aGUgRE9NSW1wbGVtZW50YXRpb25DU1MgaW50ZXJmYWNlCi0gICAgQ1NT
U3R5bGVTaGVldEltcGwgKmNyZWF0ZUNTU1N0eWxlU2hlZXQoY29uc3QgRE9NU3RyaW5nICZ0aXRs
ZSwgY29uc3QgRE9NU3RyaW5nICZtZWRpYSwgaW50ICZleGNlcHRpb25jb2RlKTsKLQotICAgIC8v
IEZyb20gdGhlIEhUTUxET01JbXBsZW1lbnRhdGlvbiBpbnRlcmZhY2UKLSAgICBIVE1MRG9jdW1l
bnRJbXBsKiBjcmVhdGVIVE1MRG9jdW1lbnQoIGNvbnN0IERPTVN0cmluZyYgdGl0bGUpOwotCi0g
ICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQotICAgIERvY3VtZW50SW1wbCAq
Y3JlYXRlRG9jdW1lbnQoIEtIVE1MVmlldyAqdiA9IDAgKTsKLSAgICBIVE1MRG9jdW1lbnRJbXBs
ICpjcmVhdGVIVE1MRG9jdW1lbnQoIEtIVE1MVmlldyAqdiA9IDAgKTsKLQotICAgIC8vIFJldHVy
bnMgdGhlIHN0YXRpYyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIC0gb25seSBvbmUgaW5zdGFuY2Ug
b2YgdGhpcyBjbGFzcyBzaG91bGQKLSAgICAvLyBldmVyIGJlIHByZXNlbnQsIGFuZCBpcyB1c2Vk
IGFzIGEgZmFjdG9yeSBtZXRob2QgZm9yIGNyZWF0aW5nIERvY3VtZW50SW1wbCBvYmplY3RzCi0g
ICAgc3RhdGljIERPTUltcGxlbWVudGF0aW9uSW1wbCAqaW5zdGFuY2UoKTsKLSAgICAKLSAgICBz
dGF0aWMgYm9vbCBpc1hNTE1JTUVUeXBlKGNvbnN0IERPTVN0cmluZyYgbWltZVR5cGUpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgc3RhdGljIERPTUltcGxlbWVudGF0aW9uSW1wbCAqbV9pbnN0YW5jZTsK
LX07Ci0KLQotLyoqCi0gKiBAaW50ZXJuYWwKLSAqLwotY2xhc3MgRG9jdW1lbnRJbXBsIDogcHVi
bGljIFFPYmplY3QsIHB1YmxpYyBDb250YWluZXJOb2RlSW1wbAotewotICAgIFFfT0JKRUNUCi1w
dWJsaWM6Ci0gICAgRG9jdW1lbnRJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqX2ltcGxlbWVu
dGF0aW9uLCBLSFRNTFZpZXcgKnYpOwotICAgIH5Eb2N1bWVudEltcGwoKTsKLQotICAgIHZpcnR1
YWwgdm9pZCByZW1vdmVkTGFzdFJlZigpOwotCi0gICAgLy8gTm9kZXMgYmVsb25naW5nIHRvIHRo
aXMgZG9jdW1lbnQgaG9sZCAic2VsZi1vbmx5IiByZWZlcmVuY2VzIC0KLSAgICAvLyB0aGVzZSBh
cmUgZW5vdWdoIHRvIGtlZXAgdGhlIGRvY3VtZW50IGZyb20gYmVpbmcgZGVzdHJveWVkLCBidXQK
LSAgICAvLyBub3QgZW5vdWdoIHRvIGtlZXAgaXQgZnJvbSByZW1vdmluZyBpdHMgY2hpbGRyZW4u
IFRoaXMgYWxsb3dzIGEKLSAgICAvLyBub2RlIHRoYXQgb3V0bGl2ZXMgaXRzIGRvY3VtZW50IHRv
IHN0aWxsIGhhdmUgYSB2YWxpZCBkb2N1bWVudAotICAgIC8vIHBvaW50ZXIgd2l0aG91dCBpbnRy
b2R1Y2luZyByZWZlcmVuY2UgY3ljbGVzCi0KLSAgICB2b2lkIHNlbGZPbmx5UmVmKCkgeyArK21f
c2VsZk9ubHlSZWZDb3VudDsgfQotICAgIHZvaWQgc2VsZk9ubHlEZXJlZigpIHsKLSAgICAgICAg
LS1tX3NlbGZPbmx5UmVmQ291bnQ7Ci0gICAgICAgIGlmICghbV9zZWxmT25seVJlZkNvdW50ICYm
ICFyZWZDb3VudCgpKQotICAgICAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotCi0gICAgLy8g
RE9NIG1ldGhvZHMgJiBhdHRyaWJ1dGVzIGZvciBEb2N1bWVudAotCi0gICAgdmlydHVhbCBEb2N1
bWVudFR5cGVJbXBsICpkb2N0eXBlKCkgY29uc3Q7IC8vIHJldHVybnMgMCBmb3IgSFRNTCBkb2N1
bWVudHMKLSAgICBEb2N1bWVudFR5cGVJbXBsICpyZWFsRG9jVHlwZSgpIGNvbnN0IHsgcmV0dXJu
IG1fZG9jVHlwZS5nZXQoKTsgfQotCi0gICAgRE9NSW1wbGVtZW50YXRpb25JbXBsICppbXBsZW1l
bnRhdGlvbigpIGNvbnN0OwotICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmRvY3VtZW50RWxlbWVu
dCgpIGNvbnN0OwotICAgIHZpcnR1YWwgRWxlbWVudEltcGwgKmNyZWF0ZUVsZW1lbnQoY29uc3Qg
RE9NU3RyaW5nICZ0YWdOYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIERvY3VtZW50RnJh
Z21lbnRJbXBsICpjcmVhdGVEb2N1bWVudEZyYWdtZW50ICgpOwotICAgIFRleHRJbXBsICpjcmVh
dGVUZXh0Tm9kZSAoIGNvbnN0IERPTVN0cmluZyAmZGF0YSApOwotICAgIENvbW1lbnRJbXBsICpj
cmVhdGVDb21tZW50ICggY29uc3QgRE9NU3RyaW5nICZkYXRhICk7Ci0gICAgQ0RBVEFTZWN0aW9u
SW1wbCAqY3JlYXRlQ0RBVEFTZWN0aW9uKGNvbnN0IERPTVN0cmluZyAmZGF0YSwgaW50ICZleGNl
cHRpb24pOwotICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgKmNyZWF0ZVByb2Nlc3NpbmdJ
bnN0cnVjdGlvbihjb25zdCBET01TdHJpbmcgJnRhcmdldCwgY29uc3QgRE9NU3RyaW5nICZkYXRh
LCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgQXR0ckltcGwgKmNyZWF0ZUF0dHJpYnV0ZShjb25zdCBE
T01TdHJpbmcgJm5hbWUsIGludCAmZXhjZXB0aW9uKSB7IHJldHVybiBjcmVhdGVBdHRyaWJ1dGVO
UyhET01TdHJpbmcoKSwgbmFtZSwgZXhjZXB0aW9uKTsgfQotICAgIEF0dHJJbXBsICpjcmVhdGVB
dHRyaWJ1dGVOUyhjb25zdCBET01TdHJpbmcgJm5hbWVzcGFjZVVSSSwgY29uc3QgRE9NU3RyaW5n
ICZxdWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlvbik7Ci0gICAgRW50aXR5UmVmZXJlbmNlSW1w
bCAqY3JlYXRlRW50aXR5UmVmZXJlbmNlKGNvbnN0IERPTVN0cmluZyAmbmFtZSwgaW50ICZleGNl
cHRpb25Db2RlKTsKLSAgICBOb2RlSW1wbCAqaW1wb3J0Tm9kZSggTm9kZUltcGwgKmltcG9ydGVk
Tm9kZSwgYm9vbCBkZWVwLCBpbnQgJmV4Y2VwdGlvbmNvZGUgKTsKLSAgICB2aXJ0dWFsIEVsZW1l
bnRJbXBsICpjcmVhdGVFbGVtZW50TlMoY29uc3QgRE9NU3RyaW5nICZfbmFtZXNwYWNlVVJJLCBj
b25zdCBET01TdHJpbmcgJl9xdWFsaWZpZWROYW1lLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAg
IEVsZW1lbnRJbXBsICpnZXRFbGVtZW50QnlJZCAoIGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElk
ICkgY29uc3Q7Ci0gICAgRWxlbWVudEltcGwgKmVsZW1lbnRGcm9tUG9pbnQgKCBjb25zdCBpbnQg
X3gsIGNvbnN0IGludCBfeSApIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmFkb3B0Tm9kZShOb2Rl
SW1wbCAqc291cmNlLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotICAgIAotICAgIFJlZlB0cjxOYW1l
Tm9kZUxpc3RJbXBsPiBnZXRFbGVtZW50c0J5TmFtZShjb25zdCBET01TdHJpbmcgJmVsZW1lbnRO
YW1lKTsKLQotICAgIC8vIEFjdHVhbGx5IHBhcnQgb2YgSFRNTERvY3VtZW50LCBidXQgdXNlZCBm
b3IgZ2l2aW5nIFhNTCBkb2N1bWVudHMgYSB3aW5kb3cgdGl0bGUgYXMgd2VsbAotICAgIERPTVN0
cmluZyB0aXRsZSgpIGNvbnN0IHsgcmV0dXJuIG1fdGl0bGU7IH0KLSAgICB2b2lkIHNldFRpdGxl
KERPTVN0cmluZywgTm9kZUltcGwgKnRpdGxlRWxlbWVudCA9IDApOwotICAgIHZvaWQgcmVtb3Zl
VGl0bGUoTm9kZUltcGwgKnRpdGxlRWxlbWVudCk7Ci0KLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rp
b25JbXBsPiBpbWFnZXMoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBlbWJlZHMo
KTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBhcHBsZXRzKCk7Ci0gICAgUmVmUHRy
PEhUTUxDb2xsZWN0aW9uSW1wbD4gbGlua3MoKTsKLSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25J
bXBsPiBmb3JtcygpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVjdGlvbkltcGw+IGFuY2hvcnMoKTsK
LSAgICBSZWZQdHI8SFRNTENvbGxlY3Rpb25JbXBsPiBhbGwoKTsKLSAgICBSZWZQdHI8SFRNTENv
bGxlY3Rpb25JbXBsPiBvYmplY3RzKCk7Ci0gICAgUmVmUHRyPEhUTUxDb2xsZWN0aW9uSW1wbD4g
d2luZG93TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpOwotICAgIFJlZlB0cjxIVE1MQ29sbGVj
dGlvbkltcGw+IGRvY3VtZW50TmFtZWRJdGVtcyhET01TdHJpbmcgJm5hbWUpOwotCi0gICAgLy8g
RE9NIG1ldGhvZHMgb3ZlcnJpZGRlbiBmcm9tICBwYXJlbnQgY2xhc3NlcwotCi0gICAgdmlydHVh
bCBET01TdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHVuc2lnbmVkIHNob3J0
IG5vZGVUeXBlKCkgY29uc3Q7Ci0KLSAgICAvLyBPdGhlciBtZXRob2RzIChub3QgcGFydCBvZiBE
T00pCi0gICAgdmlydHVhbCBib29sIGlzRG9jdW1lbnROb2RlKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0hUTUxEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIGZh
bHNlOyB9Ci0KLSAgICBraHRtbDo6Q1NTU3R5bGVTZWxlY3RvciAqc3R5bGVTZWxlY3RvcigpIHsg
cmV0dXJuIG1fc3R5bGVTZWxlY3RvcjsgfQotCi0gICAgRWxlbWVudEltcGwgKkRvY3VtZW50SW1w
bDo6Z2V0RWxlbWVudEJ5QWNjZXNzS2V5KCBjb25zdCBET01TdHJpbmcgJmtleSApOwotICAgIAot
ICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIHBlbmRpbmcgc2hlZXQgY291bnQgYW5kIHRoZW4g
Y2FsbHMgdXBkYXRlU3R5bGVTZWxlY3Rvci4KLSAgICAgKi8KLSAgICB2b2lkIHN0eWxlc2hlZXRM
b2FkZWQoKTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBh
bGwgdG9wLWxldmVsIHN0eWxlc2hlZXRzIGhhdmUgbG9hZGVkIChpbmNsdWRpbmcKLSAgICAgKiBh
bnkgQGltcG9ydHMgdGhhdCB0aGV5IG1heSBiZSBsb2FkaW5nKS4KLSAgICAgKi8KLSAgICBib29s
IGhhdmVTdHlsZXNoZWV0c0xvYWRlZCgpIHsgcmV0dXJuIG1fcGVuZGluZ1N0eWxlc2hlZXRzIDw9
IDAgfHwgbV9pZ25vcmVQZW5kaW5nU3R5bGVzaGVldHM7IH0KLQotICAgIC8qKgotICAgICAqIElu
Y3JlbWVudHMgdGhlIG51bWJlciBvZiBwZW5kaW5nIHNoZWV0cy4gIFRoZSA8bGluaz4gZWxlbWVu
dHMKLSAgICAgKiBpbnZva2UgdGhpcyB0byBhZGQgdGhlbXNlbHZlcyB0byB0aGUgbG9hZGluZyBs
aXN0LgotICAgICAqLwotICAgIHZvaWQgYWRkUGVuZGluZ1NoZWV0KCkgeyBtX3BlbmRpbmdTdHls
ZXNoZWV0cysrOyB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBvbmUgb3IgbW9yZSBz
dHlsZXNoZWV0cyBpbiB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBhZGRlZCwgcmVtb3ZlZCBv
ciBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBzdHlsZSBzZWxlY3RvciBh
bmQgYXNzaWduIGl0IHRvIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgZG9uZSBieSBpdGVyYXRpbmcg
dGhyb3VnaCBhbGwgbm9kZXMgaW4KLSAgICAgKiBkb2N1bWVudCAob3IgdGhvc2UgYmVmb3JlIDxC
T0RZPiBpbiBhIEhUTUwgZG9jdW1lbnQpLCBzZWFyY2hpbmcgZm9yIHN0eWxlc2hlZXRzLiBTdHls
ZXNoZWV0cyBjYW4gYmUgY29udGFpbmVkIGluCi0gICAgICogPExJTks+LCA8U1RZTEU+IG9yIDxC
T0RZPiBlbGVtZW50cywgYXMgd2VsbCBhcyBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyAoWE1MIGRv
Y3VtZW50cyBvbmx5KS4gQSBsaXN0IGlzCi0gICAgICogY29uc3RydWN0ZWQgZnJvbSB0aGVzZSB3
aGljaCBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYSBuZXcgc3R5bGUgc2VsZWN0b3Igd2hpY2ggY29s
bGF0ZXMgYWxsIG9mIHRoZSBzdHlsZXNoZWV0cwotICAgICAqIGZvdW5kIGFuZCBpcyB1c2VkIHRv
IGNhbGN1bGF0ZSB0aGUgZGVyaXZlZCBzdHlsZXMgZm9yIGFsbCByZW5kZXJpbmcgb2JqZWN0cy4K
LSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZVN0eWxlU2VsZWN0b3IoKTsKLQotICAgIHZvaWQgcmVj
YWxjU3R5bGVTZWxlY3RvcigpOwotCi0gICAgYm9vbCB1c2VzRGVzY2VuZGFudFJ1bGVzKCkgeyBy
ZXR1cm4gbV91c2VzRGVzY2VuZGFudFJ1bGVzOyB9Ci0gICAgdm9pZCBzZXRVc2VzRGVzY2VuZGFu
dFJ1bGVzKGJvb2wgYikgeyBtX3VzZXNEZXNjZW5kYW50UnVsZXMgPSBiOyB9Ci0gICAgYm9vbCB1
c2VzU2libGluZ1J1bGVzKCkgeyByZXR1cm4gbV91c2VzU2libGluZ1J1bGVzOyB9Ci0gICAgdm9p
ZCBzZXRVc2VzU2libGluZ1J1bGVzKGJvb2wgYikgeyBtX3VzZXNTaWJsaW5nUnVsZXMgPSBiOyB9
XAotCi0gICAgUVN0cmluZyBuZXh0U3RhdGUoKTsKLQotICAgIC8vIFF1ZXJ5IGFsbCByZWdpc3Rl
cmVkIGVsZW1lbnRzIGZvciB0aGVpciBzdGF0ZQotICAgIFFTdHJpbmdMaXN0IGRvY1N0YXRlKCk7
Ci0gICAgdm9pZCByZWdpc3Rlck1haW50YWluc1N0YXRlKE5vZGVJbXBsKiBlKSB7IG1fbWFpbnRh
aW5zU3RhdGUuYXBwZW5kKGUpOyB9Ci0gICAgdm9pZCBkZXJlZ2lzdGVyTWFpbnRhaW5zU3RhdGUo
Tm9kZUltcGwqIGUpIHsgbV9tYWludGFpbnNTdGF0ZS5yZW1vdmVSZWYoZSk7IH0KLQotICAgIC8v
IFNldCB0aGUgc3RhdGUgdGhlIGRvY3VtZW50IHNob3VsZCByZXN0b3JlIHRvCi0gICAgdm9pZCBz
ZXRSZXN0b3JlU3RhdGUoIGNvbnN0IFFTdHJpbmdMaXN0ICZzKSB7IG1fc3RhdGUgPSBzOyB9Ci0g
ICAgUVN0cmluZ0xpc3QgJnJlc3RvcmVTdGF0ZSggKSB7IHJldHVybiBtX3N0YXRlOyB9Ci0KLSAg
ICBLSFRNTFZpZXcgKnZpZXcoKSBjb25zdCB7IHJldHVybiBtX3ZpZXc7IH0KLSAgICBGcmFtZSAq
ZnJhbWUoKSBjb25zdDsKLQotICAgIFJhbmdlSW1wbCAqY3JlYXRlUmFuZ2UoKTsKLQotICAgIE5v
ZGVJdGVyYXRvckltcGwgKmNyZWF0ZU5vZGVJdGVyYXRvcihOb2RlSW1wbCAqcm9vdCwgdW5zaWdu
ZWQgd2hhdFRvU2hvdywKLSAgICAgICAgTm9kZUZpbHRlckltcGwgKmZpbHRlciwgYm9vbCBleHBh
bmRFbnRpdHlSZWZlcmVuY2VzLCBpbnQgJmV4Y2VwdGlvbmNvZGUpOwotCi0gICAgVHJlZVdhbGtl
ckltcGwgKmNyZWF0ZVRyZWVXYWxrZXIoTm9kZUltcGwgKnJvb3QsIHVuc2lnbmVkIHdoYXRUb1No
b3csIAotICAgICAgICBOb2RlRmlsdGVySW1wbCAqZmlsdGVyLCBib29sIGV4cGFuZEVudGl0eVJl
ZmVyZW5jZXMsIGludCAmZXhjZXB0aW9uY29kZSk7Ci0KLSAgICAvLyBTcGVjaWFsIHN1cHBvcnQg
Zm9yIGVkaXRpbmcKLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqY3JlYXRlQ1NTU3R5bGVE
ZWNsYXJhdGlvbigpOwotICAgIEVkaXRpbmdUZXh0SW1wbCAqY3JlYXRlRWRpdGluZ1RleHROb2Rl
KGNvbnN0IERPTVN0cmluZyAmdGV4dCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcmVjYWxjU3R5bGUo
IFN0eWxlQ2hhbmdlID0gTm9DaGFuZ2UgKTsKLSAgICBzdGF0aWMgUVB0ckxpc3Q8RG9jdW1lbnRJ
bXBsPiAqIGNoYW5nZWREb2N1bWVudHM7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZVJlbmRlcmlu
ZygpOwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCk7Ci0gICAgdm9pZCB1cGRhdGVMYXlvdXRJZ25v
cmVQZW5kaW5nU3R5bGVzaGVldHMoKTsKLSAgICBzdGF0aWMgdm9pZCB1cGRhdGVEb2N1bWVudHNS
ZW5kZXJpbmcoKTsKLSAgICBraHRtbDo6RG9jTG9hZGVyICpkb2NMb2FkZXIoKSB7IHJldHVybiBt
X2RvY0xvYWRlcjsgfQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaCgpOwotICAgIHZpcnR1YWwg
dm9pZCBkZXRhY2goKTsKLQotICAgIFJlbmRlckFyZW5hKiByZW5kZXJBcmVuYSgpIHsgcmV0dXJu
IG1fcmVuZGVyQXJlbmE7IH0KLQotICAgIEtXUUFjY09iamVjdENhY2hlKiBnZXRBY2NPYmplY3RD
YWNoZSgpOwotICAgIAotICAgIC8vIHRvIGdldCB2aXN1YWxseSBvcmRlcmVkIGhlYnJldyBhbmQg
YXJhYmljIHBhZ2VzIHJpZ2h0Ci0gICAgdm9pZCBzZXRWaXN1YWxseU9yZGVyZWQoKTsKLQotICAg
IHZvaWQgdXBkYXRlU2VsZWN0aW9uKCk7Ci0gICAgCi0gICAgdm9pZCBvcGVuKCk7Ci0gICAgdm9p
ZCBpbXBsaWNpdE9wZW4oKTsKLSAgICB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBpbXBsaWNpdENs
b3NlKCk7Ci0gICAgdm9pZCB3cml0ZSAoIGNvbnN0IERPTVN0cmluZyAmdGV4dCApOwotICAgIHZv
aWQgd3JpdGUgKCBjb25zdCBRU3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCB3cml0ZWxuICggY29u
c3QgRE9NU3RyaW5nICZ0ZXh0ICk7Ci0gICAgdm9pZCBmaW5pc2hQYXJzaW5nICggICk7Ci0gICAg
dm9pZCBjbGVhcigpOwotCi0gICAgUVN0cmluZyBVUkwoKSBjb25zdCB7IHJldHVybiBtX3VybC5p
c0VtcHR5KCkgPyAiYWJvdXQ6YmxhbmsiIDogbV91cmw7IH0KLSAgICB2b2lkIHNldFVSTChjb25z
dCBRU3RyaW5nJiB1cmwpOwotCi0gICAgUVN0cmluZyBiYXNlVVJMKCkgY29uc3QgeyByZXR1cm4g
bV9iYXNlVVJMLmlzRW1wdHkoKSA/IFVSTCgpIDogbV9iYXNlVVJMOyB9Ci0gICAgdm9pZCBzZXRC
YXNlVVJMKGNvbnN0IFFTdHJpbmcmIGJhc2VVUkwpIHsgbV9iYXNlVVJMID0gYmFzZVVSTDsgfQot
Ci0gICAgUVN0cmluZyBiYXNlVGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gbV9iYXNlVGFyZ2V0OyB9
Ci0gICAgdm9pZCBzZXRCYXNlVGFyZ2V0KGNvbnN0IFFTdHJpbmcmIGJhc2VUYXJnZXQpIHsgbV9i
YXNlVGFyZ2V0ID0gYmFzZVRhcmdldDsgfQotCi0gICAgUVN0cmluZyBjb21wbGV0ZVVSTChjb25z
dCBRU3RyaW5nICYpOwotICAgIERPTVN0cmluZyBjb21wbGV0ZVVSTChjb25zdCBET01TdHJpbmcg
Jik7Ci0KLSAgICAvLyBmcm9tIGNhY2hlZE9iamVjdENsaWVudAotICAgIHZpcnR1YWwgdm9pZCBz
ZXRTdHlsZVNoZWV0KGNvbnN0IERPTVN0cmluZyAmdXJsLCBjb25zdCBET01TdHJpbmcgJnNoZWV0
U3RyKTsKLSAgICB2b2lkIHNldFVzZXJTdHlsZVNoZWV0KGNvbnN0IFFTdHJpbmcmIHNoZWV0KTsK
LSAgICBRU3RyaW5nIHVzZXJTdHlsZVNoZWV0KCkgY29uc3QgeyByZXR1cm4gbV91c2Vyc2hlZXQ7
IH0KLSAgICB2b2lkIHNldFByaW50U3R5bGVTaGVldChjb25zdCBRU3RyaW5nJiBzaGVldCkgeyBt
X3ByaW50U2hlZXQgPSBzaGVldDsgfQotICAgIFFTdHJpbmcgcHJpbnRTdHlsZVNoZWV0KCkgY29u
c3QgeyByZXR1cm4gbV9wcmludFNoZWV0OyB9Ci0KLSAgICBDU1NTdHlsZVNoZWV0SW1wbCogZWxl
bWVudFNoZWV0KCk7Ci0gICAgdmlydHVhbCBraHRtbDo6VG9rZW5pemVyICpjcmVhdGVUb2tlbml6
ZXIoKTsKLSAgICBraHRtbDo6VG9rZW5pemVyICp0b2tlbml6ZXIoKSB7IHJldHVybiBtX3Rva2Vu
aXplcjsgfQotICAgIAotICAgIFFQYWludERldmljZU1ldHJpY3MgKnBhaW50RGV2aWNlTWV0cmlj
cygpIHsgcmV0dXJuIG1fcGFpbnREZXZpY2VNZXRyaWNzOyB9Ci0gICAgUVBhaW50RGV2aWNlICpw
YWludERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGFpbnREZXZpY2U7IH0KLSAgICB2b2lkIHNl
dFBhaW50RGV2aWNlKCBRUGFpbnREZXZpY2UgKmRldiApOwotCi0gICAgZW51bSBIVE1MTW9kZSB7
Ci0gICAgICAgIEh0bWwzLAotICAgICAgICBIdG1sNCwKLSAgICAgICAgWEh0bWwKLSAgICB9Owot
Ci0gICAgZW51bSBQYXJzZU1vZGUgewotICAgICAgICBDb21wYXQsCi0gICAgICAgIEFsbW9zdFN0
cmljdCwKLSAgICAgICAgU3RyaWN0Ci0gICAgfTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgZGV0
ZXJtaW5lUGFyc2VNb2RlKCBjb25zdCBRU3RyaW5nICZzdHIgKTsKLSAgICB2b2lkIHNldFBhcnNl
TW9kZSggUGFyc2VNb2RlIG0gKSB7IHBNb2RlID0gbTsgfQotICAgIFBhcnNlTW9kZSBwYXJzZU1v
ZGUoKSBjb25zdCB7IHJldHVybiBwTW9kZTsgfQotCi0gICAgYm9vbCBpbkNvbXBhdE1vZGUoKSB7
IHJldHVybiBwTW9kZSA9PSBDb21wYXQ7IH0KLSAgICBib29sIGluQWxtb3N0U3RyaWN0TW9kZSgp
IHsgcmV0dXJuIHBNb2RlID09IEFsbW9zdFN0cmljdDsgfQotICAgIGJvb2wgaW5TdHJpY3RNb2Rl
KCkgeyByZXR1cm4gcE1vZGUgPT0gU3RyaWN0OyB9Ci0gICAgCi0gICAgdm9pZCBzZXRIVE1MTW9k
ZSggSFRNTE1vZGUgbSApIHsgaE1vZGUgPSBtOyB9Ci0gICAgSFRNTE1vZGUgaHRtbE1vZGUoKSBj
b25zdCB7IHJldHVybiBoTW9kZTsgfQotCi0gICAgdm9pZCBzZXRQYXJzaW5nKGJvb2wgYik7Ci0g
ICAgYm9vbCBwYXJzaW5nKCkgY29uc3QgeyByZXR1cm4gbV9iUGFyc2luZzsgfQotICAgIGludCBt
aW5pbXVtTGF5b3V0RGVsYXkoKTsKLSAgICBib29sIHNob3VsZFNjaGVkdWxlTGF5b3V0KCk7Ci0g
ICAgaW50IGVsYXBzZWRUaW1lKCkgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRUZXh0Q29sb3Io
IFFDb2xvciBjb2xvciApIHsgbV90ZXh0Q29sb3IgPSBjb2xvcjsgfQotICAgIFFDb2xvciB0ZXh0
Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX3RleHRDb2xvcjsgfQotCi0gICAgY29uc3QgUUNvbG9y
JiBsaW5rQ29sb3IoKSBjb25zdCB7IHJldHVybiBtX2xpbmtDb2xvcjsgfQotICAgIGNvbnN0IFFD
b2xvciYgdmlzaXRlZExpbmtDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fdmlzaXRlZExpbmtDb2xv
cjsgfQotICAgIGNvbnN0IFFDb2xvciYgYWN0aXZlTGlua0NvbG9yKCkgY29uc3QgeyByZXR1cm4g
bV9hY3RpdmVMaW5rQ29sb3I7IH0KLSAgICB2b2lkIHNldExpbmtDb2xvcihjb25zdCBRQ29sb3Im
IGMpIHsgbV9saW5rQ29sb3IgPSBjOyB9Ci0gICAgdm9pZCBzZXRWaXNpdGVkTGlua0NvbG9yKGNv
bnN0IFFDb2xvciYgYykgeyBtX3Zpc2l0ZWRMaW5rQ29sb3IgPSBjOyB9Ci0gICAgdm9pZCBzZXRB
Y3RpdmVMaW5rQ29sb3IoY29uc3QgUUNvbG9yJiBjKSB7IG1fYWN0aXZlTGlua0NvbG9yID0gYzsg
fQotICAgIHZvaWQgcmVzZXRMaW5rQ29sb3IoKTsKLSAgICB2b2lkIHJlc2V0VmlzaXRlZExpbmtD
b2xvcigpOwotICAgIHZvaWQgcmVzZXRBY3RpdmVMaW5rQ29sb3IoKTsKLSAgICAKLSAgICBib29s
IHByZXBhcmVNb3VzZUV2ZW50KGJvb2wgcmVhZG9ubHksIGludCB4LCBpbnQgeSwgTW91c2VFdmVu
dCogZXYpOwotICAgIGJvb2wgcHJlcGFyZU1vdXNlRXZlbnQoYm9vbCByZWFkb25seSwgYm9vbCBh
Y3RpdmUsIGludCB4LCBpbnQgeSwgTW91c2VFdmVudCAqZXYpOwotCi0gICAgdmlydHVhbCBib29s
IGNoaWxkQWxsb3dlZCggTm9kZUltcGwgKm5ld0NoaWxkICk7Ci0gICAgdmlydHVhbCBib29sIGNo
aWxkVHlwZUFsbG93ZWQoIHVuc2lnbmVkIHNob3J0IG5vZGVUeXBlICk7Ci0gICAgdmlydHVhbCBO
b2RlSW1wbCAqY2xvbmVOb2RlICggYm9vbCBkZWVwICk7Ci0KLSAgICBTdHlsZVNoZWV0TGlzdElt
cGwqIHN0eWxlU2hlZXRzKCk7Ci0KLSAgICAvKiBOZXdseSBwcm9wb3NlZCBDU1MzIG1lY2hhbmlz
bSBmb3Igc2VsZWN0aW5nIGFsdGVybmF0ZQotICAgICAgIHN0eWxlc2hlZXRzIHVzaW5nIHRoZSBE
T00uIE1heSBiZSBzdWJqZWN0IHRvIGNoYW5nZSBhcwotICAgICAgIHNwZWMgbWF0dXJlcy4gLSBk
d2gKLSAgICAqLwotICAgIERPTVN0cmluZyBwcmVmZXJyZWRTdHlsZXNoZWV0U2V0KCk7Ci0gICAg
RE9NU3RyaW5nIHNlbGVjdGVkU3R5bGVzaGVldFNldCgpOwotICAgIHZvaWQgc2V0U2VsZWN0ZWRT
dHlsZXNoZWV0U2V0KGNvbnN0IERPTVN0cmluZyYgYVN0cmluZyk7Ci0KLSAgICBRU3RyaW5nTGlz
dCBhdmFpbGFibGVTdHlsZVNoZWV0cygpIGNvbnN0OwotCi0gICAgTm9kZUltcGwgKmZvY3VzTm9k
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZm9jdXNOb2RlLmdldCgpOyB9Ci0gICAgYm9vbCBzZXRGb2N1
c05vZGUoTm9kZUltcGwgKm5ld0ZvY3VzTm9kZSk7Ci0gICAgdm9pZCBjbGVhclNlbGVjdGlvbklm
TmVlZGVkKE5vZGVJbXBsICpuZXdGb2N1c05vZGUpOwotCi0gICAgTm9kZUltcGwgKmhvdmVyTm9k
ZSgpIGNvbnN0IHsgcmV0dXJuIG1faG92ZXJOb2RlLmdldCgpOyB9Ci0gICAgdm9pZCBzZXRIb3Zl
ck5vZGUoTm9kZUltcGwgKm5ld0hvdmVyTm9kZSk7Ci0gICAgCi0gICAgTm9kZUltcGwgKmFjdGl2
ZU5vZGUoKSBjb25zdCB7IHJldHVybiBtX2FjdGl2ZU5vZGUuZ2V0KCk7IH0KLSAgICB2b2lkIHNl
dEFjdGl2ZU5vZGUoTm9kZUltcGwgKm5ld0FjdGl2ZU5vZGUpOwotCi0gICAgLy8gVXBkYXRlcyBm
b3IgOnRhcmdldCAoQ1NTMyBzZWxlY3RvcikuCi0gICAgdm9pZCBzZXRDU1NUYXJnZXQoTm9kZUlt
cGwqIG4pOwotICAgIE5vZGVJbXBsKiBnZXRDU1NUYXJnZXQoKTsKLSAgICAKLSAgICB2b2lkIHNl
dERvY3VtZW50Q2hhbmdlZChib29sKTsKLQotICAgIHZvaWQgYXR0YWNoTm9kZUl0ZXJhdG9yKE5v
ZGVJdGVyYXRvckltcGwgKm5pKTsKLSAgICB2b2lkIGRldGFjaE5vZGVJdGVyYXRvcihOb2RlSXRl
cmF0b3JJbXBsICpuaSk7Ci0gICAgdm9pZCBub3RpZnlCZWZvcmVOb2RlUmVtb3ZhbChOb2RlSW1w
bCAqbik7Ci0gICAgQWJzdHJhY3RWaWV3SW1wbCAqZGVmYXVsdFZpZXcoKSBjb25zdDsKLSAgICBF
dmVudEltcGwgKmNyZWF0ZUV2ZW50KGNvbnN0IERPTVN0cmluZyAmZXZlbnRUeXBlLCBpbnQgJmV4
Y2VwdGlvbmNvZGUpOwotCi0gICAgLy8ga2VlcCB0cmFjayBvZiB3aGF0IHR5cGVzIG9mIGV2ZW50
IGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCwgc28gd2UgZG9uJ3QKLSAgICAvLyBkaXNwYXRjaCBl
dmVudHMgdW5uZWNlc3NhcmlseQotICAgIGVudW0gTGlzdGVuZXJUeXBlIHsKLSAgICAgICAgRE9N
U1VCVFJFRU1PRElGSUVEX0xJU1RFTkVSICAgICAgICAgID0gMHgwMSwKLSAgICAgICAgRE9NTk9E
RUlOU0VSVEVEX0xJU1RFTkVSICAgICAgICAgICAgID0gMHgwMiwKLSAgICAgICAgRE9NTk9ERVJF
TU9WRURfTElTVEVORVIgICAgICAgICAgICAgID0gMHgwNCwKLSAgICAgICAgRE9NTk9ERVJFTU9W
RURGUk9NRE9DVU1FTlRfTElTVEVORVIgID0gMHgwOCwKLSAgICAgICAgRE9NTk9ERUlOU0VSVEVE
SU5UT0RPQ1VNRU5UX0xJU1RFTkVSID0gMHgxMCwKLSAgICAgICAgRE9NQVRUUk1PRElGSUVEX0xJ
U1RFTkVSICAgICAgICAgICAgID0gMHgyMCwKLSAgICAgICAgRE9NQ0hBUkFDVEVSREFUQU1PRElG
SUVEX0xJU1RFTkVSICAgID0gMHg0MAotICAgIH07Ci0KLSAgICBib29sIGhhc0xpc3RlbmVyVHlw
ZShMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlKSBjb25zdCB7IHJldHVybiAobV9saXN0ZW5lclR5
cGVzICYgbGlzdGVuZXJUeXBlKTsgfQotICAgIHZvaWQgYWRkTGlzdGVuZXJUeXBlKExpc3RlbmVy
VHlwZSBsaXN0ZW5lclR5cGUpIHsgbV9saXN0ZW5lclR5cGVzID0gbV9saXN0ZW5lclR5cGVzIHwg
bGlzdGVuZXJUeXBlOyB9Ci0KLSAgICBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCAqZ2V0T3ZlcnJp
ZGVTdHlsZShFbGVtZW50SW1wbCAqZWx0LCBjb25zdCBET01TdHJpbmcgJnBzZXVkb0VsdCk7Ci0K
LSAgICB0eXBlZGVmIFFNYXA8UVN0cmluZywgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCo+IExv
Y2FsU3R5bGVSZWZzOwotICAgIExvY2FsU3R5bGVSZWZzKiBsb2NhbFN0eWxlUmVmcygpIHsgcmV0
dXJuICZtX2xvY2FsU3R5bGVSZWZzOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGVmYXVsdEV2ZW50
SGFuZGxlcihFdmVudEltcGwgKmV2dCk7Ci0gICAgdm9pZCBzZXRIVE1MV2luZG93RXZlbnRMaXN0
ZW5lcihjb25zdCBBdG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVu
ZXIpOwotICAgIEV2ZW50TGlzdGVuZXIgKmdldEhUTUxXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0
IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLSAgICB2b2lkIHJlbW92ZUhUTUxXaW5kb3dFdmVu
dExpc3RlbmVyKGNvbnN0IEF0b21pY1N0cmluZyAmZXZlbnRUeXBlKTsKLQotICAgIHZvaWQgc2V0
SFRNTFdpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIEF0
dHJpYnV0ZUltcGwqKTsKLQotICAgIHZvaWQgYWRkV2luZG93RXZlbnRMaXN0ZW5lcihjb25zdCBB
dG9taWNTdHJpbmcgJmV2ZW50VHlwZSwgRXZlbnRMaXN0ZW5lciAqbGlzdGVuZXIsIGJvb2wgdXNl
Q2FwdHVyZSk7Ci0gICAgdm9pZCByZW1vdmVXaW5kb3dFdmVudExpc3RlbmVyKGNvbnN0IEF0b21p
Y1N0cmluZyAmZXZlbnRUeXBlLCBFdmVudExpc3RlbmVyICpsaXN0ZW5lciwgYm9vbCB1c2VDYXB0
dXJlKTsKLSAgICBib29sIGhhc1dpbmRvd0V2ZW50TGlzdGVuZXIoY29uc3QgQXRvbWljU3RyaW5n
ICZldmVudFR5cGUpOwotCi0gICAgRXZlbnRMaXN0ZW5lciAqY3JlYXRlSFRNTEV2ZW50TGlzdGVu
ZXIoY29uc3QgRE9NU3RyaW5nJiBjb2RlLCBOb2RlSW1wbCopOwotICAgIAotICAgIC8qKgotICAg
ICAqIFNlYXJjaGVzIHRocm91Z2ggdGhlIGRvY3VtZW50LCBzdGFydGluZyBmcm9tIGZyb21Ob2Rl
LCBmb3IgdGhlIG5leHQgc2VsZWN0YWJsZSBlbGVtZW50IHRoYXQgY29tZXMgYWZ0ZXIgZnJvbU5v
ZGUuCi0gICAgICogVGhlIG9yZGVyIGZvbGxvd2VkIGlzIGFzIHNwZWNpZmllZCBpbiBzZWN0aW9u
IDE3LjExLjEgb2YgdGhlIEhUTUw0IHNwZWMsIHdoaWNoIGlzIGVsZW1lbnRzIHdpdGggdGFiIGlu
ZGV4ZXMKLSAgICAgKiBmaXJzdCAoZnJvbSBsb3dlc3QgdG8gaGlnaGVzdCksIGFuZCB0aGVuIGVs
ZW1lbnRzIHdpdGhvdXQgdGFiIGluZGV4ZXMgKGluIGRvY3VtZW50IG9yZGVyKS4KLSAgICAgKgot
ICAgICAqIEBwYXJhbSBmcm9tTm9kZSBUaGUgbm9kZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNlYXJj
aGluZy4gVGhlIG5vZGUgYWZ0ZXIgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgot
ICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGFmdGVyIGZy
b21Ob2RlCi0gICAgICoKLSAgICAgKiBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvaW50
ZXJhY3QvZm9ybXMuaHRtbCNoLTE3LjExLjEKLSAgICAgKi8KLSAgICBOb2RlSW1wbCAqbmV4dEZv
Y3VzTm9kZShOb2RlSW1wbCAqZnJvbU5vZGUpOwotCi0gICAgLyoqCi0gICAgICogU2VhcmNoZXMg
dGhyb3VnaCB0aGUgZG9jdW1lbnQsIHN0YXJ0aW5nIGZyb20gZnJvbU5vZGUsIGZvciB0aGUgcHJl
dmlvdXMgc2VsZWN0YWJsZSBlbGVtZW50ICh0aGF0IGNvbWVzIF9iZWZvcmVfKQotICAgICAqIGZy
b21Ob2RlLiBUaGUgb3JkZXIgZm9sbG93ZWQgaXMgYXMgc3BlY2lmaWVkIGluIHNlY3Rpb24gMTcu
MTEuMSBvZiB0aGUgSFRNTDQgc3BlYywgd2hpY2ggaXMgZWxlbWVudHMgd2l0aCB0YWIKLSAgICAg
KiBpbmRleGVzIGZpcnN0IChmcm9tIGxvd2VzdCB0byBoaWdoZXN0KSwgYW5kIHRoZW4gZWxlbWVu
dHMgd2l0aG91dCB0YWIgaW5kZXhlcyAoaW4gZG9jdW1lbnQgb3JkZXIpLgotICAgICAqCi0gICAg
ICogQHBhcmFtIGZyb21Ob2RlIFRoZSBub2RlIGZyb20gd2hpY2ggdG8gc3RhcnQgc2VhcmNoaW5n
LiBUaGUgbm9kZSBiZWZvcmUgdGhpcyB3aWxsIGJlIGZvY3VzZWQuIE1heSBiZSBudWxsLgotICAg
ICAqCi0gICAgICogQHJldHVybiBUaGUgZm9jdXMgbm9kZSB0aGF0IGNvbWVzIGJlZm9yZSBmcm9t
Tm9kZQotICAgICAqCi0gICAgICogU2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2ludGVy
YWN0L2Zvcm1zLmh0bWwjaC0xNy4xMS4xCi0gICAgICovCi0gICAgTm9kZUltcGwgKnByZXZpb3Vz
Rm9jdXNOb2RlKE5vZGVJbXBsICpmcm9tTm9kZSk7Ci0KLSAgICBpbnQgbm9kZUFic0luZGV4KE5v
ZGVJbXBsICpub2RlKTsKLSAgICBOb2RlSW1wbCAqbm9kZVdpdGhBYnNJbmRleChpbnQgYWJzSW5k
ZXgpOwotCi0gICAgLyoqCi0gICAgICogSGFuZGxlcyBhIEhUVFAgaGVhZGVyIGVxdWl2YWxlbnQg
c2V0IGJ5IGEgbWV0YSB0YWcgdXNpbmcgPG1ldGEgaHR0cC1lcXVpdj0iLi4uIiBjb250ZW50PSIu
Li4iPi4gVGhpcyBpcyBjYWxsZWQKLSAgICAgKiB3aGVuIGEgbWV0YSB0YWcgaXMgZW5jb3VudGVy
ZWQgZHVyaW5nIGRvY3VtZW50IHBhcnNpbmcsIGFuZCBhbHNvIHdoZW4gYSBzY3JpcHQgZHluYW1p
Y2FsbHkgY2hhbmdlcyBvciBhZGRzIGEgbWV0YQotICAgICAqIHRhZy4gVGhpcyBlbmFibGVzIHNj
cmlwdHMgdG8gdXNlIG1ldGEgdGFncyB0byBwZXJmb3JtIHJlZnJlc2hlcyBhbmQgc2V0IGV4cGly
eSBkYXRlcyBpbiBhZGRpdGlvbiB0byB0aGVtIGJlaW5nCi0gICAgICogc3BlY2lmaWVkIGluIGEg
SFRNTCBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGVxdWl2IFRoZSBodHRwIGhlYWRlciBu
YW1lICh2YWx1ZSBvZiB0aGUgbWV0YSB0YWcncyAiZXF1aXYiIGF0dHJpYnV0ZSkKLSAgICAgKiBA
cGFyYW0gY29udGVudCBUaGUgaGVhZGVyIHZhbHVlICh2YWx1ZSBvZiB0aGUgbWV0YSB0YWcncyAi
Y29udGVudCIgYXR0cmlidXRlKQotICAgICAqLwotICAgIHZvaWQgcHJvY2Vzc0h0dHBFcXVpdihj
b25zdCBET01TdHJpbmcgJmVxdWl2LCBjb25zdCBET01TdHJpbmcgJmNvbnRlbnQpOwotICAgIAot
ICAgIHZvaWQgZGlzcGF0Y2hJbWFnZUxvYWRFdmVudFNvb24oSFRNTEltYWdlTG9hZGVyKik7Ci0g
ICAgdm9pZCBkaXNwYXRjaEltYWdlTG9hZEV2ZW50c05vdygpOwotICAgIHZvaWQgcmVtb3ZlSW1h
Z2UoSFRNTEltYWdlTG9hZGVyKik7Ci0gICAgdmlydHVhbCB2b2lkIHRpbWVyRXZlbnQoUVRpbWVy
RXZlbnQgKik7Ci0gICAgCi0gICAgLy8gUmV0dXJucyB0aGUgb3duaW5nIGVsZW1lbnQgaW4gdGhl
IHBhcmVudCBkb2N1bWVudC4KLSAgICAvLyBSZXR1cm5zIDAgaWYgdGhpcyBpcyB0aGUgdG9wIGxl
dmVsIGRvY3VtZW50LgotICAgIEVsZW1lbnRJbXBsICpvd25lckVsZW1lbnQoKTsKLSAgICAKLSAg
ICBET01TdHJpbmcgcmVmZXJyZXIoKSBjb25zdDsKLSAgICBET01TdHJpbmcgZG9tYWluKCkgY29u
c3Q7Ci0gICAgdm9pZCBzZXREb21haW4oIGNvbnN0IERPTVN0cmluZyAmbmV3RG9tYWluLCBib29s
IGZvcmNlID0gZmFsc2UgKTsgLy8gbm90IHBhcnQgb2YgdGhlIERPTQotCi0gICAgRE9NU3RyaW5n
IHBvbGljeUJhc2VVUkwoKSBjb25zdCB7IHJldHVybiBtX3BvbGljeUJhc2VVUkw7IH0KLSAgICB2
b2lkIHNldFBvbGljeUJhc2VVUkwoY29uc3QgRE9NU3RyaW5nICZzKSB7IG1fcG9saWN5QmFzZVVS
TCA9IHM7IH0KLSAgICAKLSAgICAvLyBUaGUgZm9sbG93aW5nIGltcGxlbWVudHMgdGhlIHJ1bGUg
ZnJvbSBIVE1MIDQgZm9yIHdoYXQgdmFsaWQgbmFtZXMgYXJlLgotICAgIC8vIFRvIGdldCB0aGlz
IHJpZ2h0IGZvciBhbGwgdGhlIFhNTCBjYXNlcywgd2UgcHJvYmFibHkgaGF2ZSB0byBpbXByb3Zl
IHRoaXMgb3IgbW92ZSBpdAotICAgIC8vIGFuZCBtYWtlIGl0IHNlbnNpdGl2ZSB0byB0aGUgdHlw
ZSBvZiBkb2N1bWVudC4KLSAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkTmFtZShjb25zdCBET01TdHJp
bmcgJik7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGJyZWFrcyBhIHF1YWxpZmllZCBuYW1lIGlu
dG8gYSBwcmVmaXggYW5kIGEgbG9jYWwgbmFtZS4KLSAgICAvLyBJdCBhbHNvIGRvZXMgYSB2YWxp
ZGl0eSBjaGVjaywgYW5kIHJldHVybnMgZmFsc2UgaWYgdGhlIHF1YWxpZmllZCBuYW1lIGlzIGlu
dmFsaWQKLSAgICAvLyAoZW1wdHkgc3RyaW5nIG9yIGludmFsaWQgY2hhcmFjdGVycykuCi0gICAg
c3RhdGljIGJvb2wgcGFyc2VRdWFsaWZpZWROYW1lKGNvbnN0IERPTVN0cmluZyAmcXVhbGlmaWVk
TmFtZSwgRE9NU3RyaW5nICZwcmVmaXgsIERPTVN0cmluZyAmbG9jYWxOYW1lKTsKLSAgICAKLSAg
ICB2b2lkIGFkZEVsZW1lbnRCeUlkKGNvbnN0IERPTVN0cmluZyAmZWxlbWVudElkLCBFbGVtZW50
SW1wbCAqZWxlbWVudCk7Ci0gICAgdm9pZCByZW1vdmVFbGVtZW50QnlJZChjb25zdCBET01TdHJp
bmcgJmVsZW1lbnRJZCwgRWxlbWVudEltcGwgKmVsZW1lbnQpOwotCi0gICAgdm9pZCBhZGRJbWFn
ZU1hcChIVE1MTWFwRWxlbWVudEltcGwgKik7Ci0gICAgdm9pZCByZW1vdmVJbWFnZU1hcChIVE1M
TWFwRWxlbWVudEltcGwgKik7Ci0gICAgSFRNTE1hcEVsZW1lbnRJbXBsICpnZXRJbWFnZU1hcChj
b25zdCBET01TdHJpbmcgJlVSTCkgY29uc3Q7Ci0KLSAgICBIVE1MRWxlbWVudEltcGwqIGJvZHko
KTsKLQotICAgIERPTVN0cmluZyB0b1N0cmluZygpIGNvbnN0OwotICAgIAotICAgIGJvb2wgZXhl
Y0NvbW1hbmQoY29uc3QgRE9NU3RyaW5nICZjb21tYW5kLCBib29sIHVzZXJJbnRlcmZhY2UsIGNv
bnN0IERPTVN0cmluZyAmdmFsdWUpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kRW5hYmxlZChjb25z
dCBET01TdHJpbmcgJmNvbW1hbmQpOwotICAgIGJvb2wgcXVlcnlDb21tYW5kSW5kZXRlcm0oY29u
c3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICBib29sIHF1ZXJ5Q29tbWFuZFN0YXRlKGNvbnN0
IERPTVN0cmluZyAmY29tbWFuZCk7Ci0gICAgYm9vbCBxdWVyeUNvbW1hbmRTdXBwb3J0ZWQoY29u
c3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICBET01TdHJpbmcgcXVlcnlDb21tYW5kVmFsdWUo
Y29uc3QgRE9NU3RyaW5nICZjb21tYW5kKTsKLSAgICAKLSAgICB2b2lkIGFkZE1hcmtlcihSYW5n
ZUltcGwgKnJhbmdlLCBEb2N1bWVudE1hcmtlcjo6TWFya2VyVHlwZSB0eXBlKTsKLSAgICB2b2lk
IGFkZE1hcmtlcihOb2RlSW1wbCAqbm9kZSwgRG9jdW1lbnRNYXJrZXIgbWFya2VyKTsKLSAgICB2
b2lkIGNvcHlNYXJrZXJzKE5vZGVJbXBsICpzcmNOb2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwg
aW50IGxlbmd0aCwgTm9kZUltcGwgKmRzdE5vZGUsIGludCBkZWx0YSwgRG9jdW1lbnRNYXJrZXI6
Ok1hcmtlclR5cGUgbWFya2VyVHlwZT1Eb2N1bWVudE1hcmtlcjo6QWxsTWFya2Vycyk7Ci0gICAg
dm9pZCByZW1vdmVNYXJrZXJzKFJhbmdlSW1wbCAqcmFuZ2UsIERvY3VtZW50TWFya2VyOjpNYXJr
ZXJUeXBlIG1hcmtlclR5cGU9RG9jdW1lbnRNYXJrZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQg
cmVtb3ZlTWFya2VycyhOb2RlSW1wbCAqbm9kZSwgdW5zaWduZWQgc3RhcnRPZmZzZXQsIGludCBs
ZW5ndGgsIERvY3VtZW50TWFya2VyOjpNYXJrZXJUeXBlIG1hcmtlclR5cGU9RG9jdW1lbnRNYXJr
ZXI6OkFsbE1hcmtlcnMpOwotICAgIHZvaWQgcmVtb3ZlTWFya2VycyhEb2N1bWVudE1hcmtlcjo6
TWFya2VyVHlwZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJzKTsKLSAgICB2
b2lkIHJlbW92ZU1hcmtlcnMoTm9kZUltcGwgKm5vZGUpOwotICAgIHZvaWQgc2hpZnRNYXJrZXJz
KE5vZGVJbXBsICpub2RlLCB1bnNpZ25lZCBzdGFydE9mZnNldCwgaW50IGRlbHRhLCBEb2N1bWVu
dE1hcmtlcjo6TWFya2VyVHlwZSBtYXJrZXJUeXBlPURvY3VtZW50TWFya2VyOjpBbGxNYXJrZXJz
KTsKLQotICAgIFFWYWx1ZUxpc3Q8RG9jdW1lbnRNYXJrZXI+IG1hcmtlcnNGb3JOb2RlKE5vZGVJ
bXBsICpub2RlKTsKLSAgICAKLSAgIC8qKgotICAgICogZGVzaWduTW9kZSBzdXBwb3J0Ci0gICAg
Ki8KLSAgICBlbnVtIEluaGVyaXRlZEJvb2wgewotICAgICAgICBvZmY9ZmFsc2UsCi0gICAgICAg
IG9uPXRydWUsCi0gICAgICAgIGluaGVyaXQKLSAgICB9OwotICAgIAotICAgIHZvaWQgc2V0RGVz
aWduTW9kZShJbmhlcml0ZWRCb29sIHZhbHVlKTsKLSAgICBJbmhlcml0ZWRCb29sIGdldERlc2ln
bk1vZGUoKSBjb25zdDsKLSAgICBib29sIGluRGVzaWduTW9kZSgpIGNvbnN0OwotICAgIERvY3Vt
ZW50SW1wbCAqcGFyZW50RG9jdW1lbnQoKSBjb25zdDsKLSAgICBEb2N1bWVudEltcGwgKnRvcERv
Y3VtZW50KCkgY29uc3Q7Ci0KLSAgICBpbnQgZG9jSUQoKSBjb25zdCB7IHJldHVybiBtX2RvY0lE
OyB9Ci0KLSNpZmRlZiBLSFRNTF9YU0xUCi0gICAgdm9pZCBhcHBseVhTTFRyYW5zZm9ybShQcm9j
ZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKiBwaSk7Ci0gICAgdm9pZCBzZXRUcmFuc2Zvcm1Tb3VyY2Uo
dm9pZCogZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlID0gZG9jOyB9Ci0gICAgY29uc3Qgdm9pZCog
dHJhbnNmb3JtU291cmNlKCkgeyByZXR1cm4gbV90cmFuc2Zvcm1Tb3VyY2U7IH0KLSAgICBSZWZQ
dHI8RG9jdW1lbnRJbXBsPiB0cmFuc2Zvcm1Tb3VyY2VEb2N1bWVudCgpIHsgcmV0dXJuIG1fdHJh
bnNmb3JtU291cmNlRG9jdW1lbnQ7IH0KLSAgICB2b2lkIHNldFRyYW5zZm9ybVNvdXJjZURvY3Vt
ZW50KERvY3VtZW50SW1wbCAqZG9jKSB7IG1fdHJhbnNmb3JtU291cmNlRG9jdW1lbnQgPSBkb2M7
IH0KLSNlbmRpZgotCi0jaWZuZGVmIEtIVE1MX05PX1hCTAotICAgIC8vIFhCTCBtZXRob2RzCi0g
ICAgWEJMOjpYQkxCaW5kaW5nTWFuYWdlciogYmluZGluZ01hbmFnZXIoKSBjb25zdCB7IHJldHVy
biBtX2JpbmRpbmdNYW5hZ2VyOyB9Ci0jZW5kaWYKLQotICAgIHZvaWQgaW5jRE9NVHJlZVZlcnNp
b24oKSB7ICsrbV9kb210cmVlX3ZlcnNpb247IH0KLSAgICB1bnNpZ25lZCBpbnQgZG9tVHJlZVZl
cnNpb24oKSBjb25zdCB7IHJldHVybiBtX2RvbXRyZWVfdmVyc2lvbjsgfQotCi0gICAgdm9pZCBz
ZXREb2NUeXBlKERvY3VtZW50VHlwZUltcGwgKmRvY1R5cGUpIHsgbV9kb2NUeXBlID0gZG9jVHlw
ZTsgfQotCi1zaWduYWxzOgotICAgIHZvaWQgZmluaXNoZWRQYXJzaW5nKCk7Ci0KLXByb3RlY3Rl
ZDoKLSAgICBraHRtbDo6Q1NTU3R5bGVTZWxlY3RvciAqbV9zdHlsZVNlbGVjdG9yOwotICAgIEtI
VE1MVmlldyAqbV92aWV3OwotICAgIFFTdHJpbmdMaXN0IG1fc3RhdGU7Ci0KLSAgICBraHRtbDo6
RG9jTG9hZGVyICptX2RvY0xvYWRlcjsKLSAgICBraHRtbDo6VG9rZW5pemVyICptX3Rva2VuaXpl
cjsKLSAgICBRU3RyaW5nIG1fdXJsOwotICAgIFFTdHJpbmcgbV9iYXNlVVJMOwotICAgIFFTdHJp
bmcgbV9iYXNlVGFyZ2V0OwotCi0gICAgUmVmUHRyPERvY3VtZW50VHlwZUltcGw+IG1fZG9jVHlw
ZTsKLSAgICBET01JbXBsZW1lbnRhdGlvbkltcGwgKm1faW1wbGVtZW50YXRpb247Ci0KLSAgICBT
dHlsZVNoZWV0SW1wbCAqbV9zaGVldDsKLSAgICBRU3RyaW5nIG1fdXNlcnNoZWV0OwotICAgIFFT
dHJpbmcgbV9wcmludFNoZWV0OwotICAgIFFTdHJpbmdMaXN0IG1fYXZhaWxhYmxlU2hlZXRzOwot
Ci0gICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBjdXJyZW50bHkgbG9hZGluZyB0b3AtbGV2ZWwg
c3R5bGVzaGVldHMuICBTaGVldHMKLSAgICAvLyBsb2FkZWQgdXNpbmcgdGhlIEBpbXBvcnQgZGly
ZWN0aXZlIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBjb3VudC4KLSAgICAvLyBXZSB1c2UgdGhp
cyBjb3VudCBvZiBwZW5kaW5nIHNoZWV0cyB0byBkZXRlY3Qgd2hlbiB3ZSBjYW4gYmVnaW4gYXR0
YWNoaW5nCi0gICAgLy8gZWxlbWVudHMuCi0gICAgaW50IG1fcGVuZGluZ1N0eWxlc2hlZXRzOwot
Ci0gICAgLy8gQnV0IHNvbWV0aW1lcyB5b3UgbmVlZCB0byBpZ25vcmUgcGVuZGluZyBzdHlsZXNo
ZWV0IGNvdW50IHRvCi0gICAgLy8gZm9yY2UgYW4gaW1tZWRpYXRlIGxheW91dCB3aGVuIHJlcXVl
c3RlZCBieSBKUy4KLSAgICBib29sIG1faWdub3JlUGVuZGluZ1N0eWxlc2hlZXRzOwotCi0gICAg
Q1NTU3R5bGVTaGVldEltcGwgKm1fZWxlbVNoZWV0OwotCi0gICAgUVBhaW50RGV2aWNlICptX3Bh
aW50RGV2aWNlOwotICAgIFFQYWludERldmljZU1ldHJpY3MgKm1fcGFpbnREZXZpY2VNZXRyaWNz
OwotICAgIFBhcnNlTW9kZSBwTW9kZTsKLSAgICBIVE1MTW9kZSBoTW9kZTsKLQotICAgIFFDb2xv
ciBtX3RleHRDb2xvcjsKLQotICAgIFJlZlB0cjxOb2RlSW1wbD4gbV9mb2N1c05vZGU7Ci0gICAg
UmVmUHRyPE5vZGVJbXBsPiBtX2hvdmVyTm9kZTsKLSAgICBSZWZQdHI8Tm9kZUltcGw+IG1fYWN0
aXZlTm9kZTsKLQotICAgIHVuc2lnbmVkIGludCBtX2RvbXRyZWVfdmVyc2lvbjsKLSAgICAKLSAg
ICAvLyAjIyMgcmVwbGFjZSBtZSB3aXRoIHNvbWV0aGluZyBtb3JlIGVmZmljaWVudAotICAgIC8v
IGluIGxvb2t1cCBhbmQgaW5zZXJ0aW9uLgotICAgIERPTVN0cmluZ0ltcGwgKiptX2VsZW1lbnRO
YW1lczsKLSAgICB1bnNpZ25lZCBzaG9ydCBtX2VsZW1lbnROYW1lQWxsb2M7Ci0gICAgdW5zaWdu
ZWQgc2hvcnQgbV9lbGVtZW50TmFtZUNvdW50OwotCi0gICAgRE9NU3RyaW5nSW1wbCAqKm1fYXR0
ck5hbWVzOwotICAgIHVuc2lnbmVkIHNob3J0IG1fYXR0ck5hbWVBbGxvYzsKLSAgICB1bnNpZ25l
ZCBzaG9ydCBtX2F0dHJOYW1lQ291bnQ7Ci0KLSAgICBET01TdHJpbmdJbXBsKiogbV9uYW1lc3Bh
Y2VVUklzOwotICAgIHVuc2lnbmVkIHNob3J0IG1fbmFtZXNwYWNlVVJJQWxsb2M7Ci0gICAgdW5z
aWduZWQgc2hvcnQgbV9uYW1lc3BhY2VVUklDb3VudDsKLQotICAgIFFQdHJMaXN0PE5vZGVJdGVy
YXRvckltcGw+IG1fbm9kZUl0ZXJhdG9yczsKLSAgICBBYnN0cmFjdFZpZXdJbXBsICptX2RlZmF1
bHRWaWV3OwotCi0gICAgdW5zaWduZWQgc2hvcnQgbV9saXN0ZW5lclR5cGVzOwotICAgIFN0eWxl
U2hlZXRMaXN0SW1wbCogbV9zdHlsZVNoZWV0czsKLSAgICBMb2NhbFN0eWxlUmVmcyBtX2xvY2Fs
U3R5bGVSZWZzOyAvLyByZWZlcmVuY2VzIHRvIGlubGluZWQgc3R5bGUgZWxlbWVudHMKLSAgICBR
UHRyTGlzdDxSZWdpc3RlcmVkRXZlbnRMaXN0ZW5lcj4gbV93aW5kb3dFdmVudExpc3RlbmVyczsK
LSAgICBRUHRyTGlzdDxOb2RlSW1wbD4gbV9tYWludGFpbnNTdGF0ZTsKLQotICAgIFFDb2xvciBt
X2xpbmtDb2xvcjsKLSAgICBRQ29sb3IgbV92aXNpdGVkTGlua0NvbG9yOwotICAgIFFDb2xvciBt
X2FjdGl2ZUxpbmtDb2xvcjsKLQotICAgIERPTVN0cmluZyBtX3ByZWZlcnJlZFN0eWxlc2hlZXRT
ZXQ7Ci0gICAgRE9NU3RyaW5nIG1fc2VsZWN0ZWRTdHlsZXNoZWV0U2V0OwotCi0gICAgYm9vbCBt
X2xvYWRpbmdTaGVldDsKLSAgICBib29sIHZpc3VhbGx5T3JkZXJlZDsKLSAgICBib29sIG1fYlBh
cnNpbmc7Ci0gICAgYm9vbCBtX2JBbGxEYXRhUmVjZWl2ZWQ7Ci0gICAgYm9vbCBtX2RvY0NoYW5n
ZWQ7Ci0gICAgYm9vbCBtX3N0eWxlU2VsZWN0b3JEaXJ0eTsKLSAgICBib29sIG1faW5TdHlsZVJl
Y2FsYzsKLSAgICBib29sIG1fY2xvc2VBZnRlclN0eWxlUmVjYWxjOwotICAgIGJvb2wgbV91c2Vz
RGVzY2VuZGFudFJ1bGVzOwotICAgIGJvb2wgbV91c2VzU2libGluZ1J1bGVzOwotICAgIAotICAg
IERPTVN0cmluZyBtX3RpdGxlOwotICAgIGJvb2wgbV90aXRsZVNldEV4cGxpY2l0bHk7Ci0gICAg
UmVmUHRyPE5vZGVJbXBsPiBtX3RpdGxlRWxlbWVudDsKLSAgICAKLSAgICBSZW5kZXJBcmVuYSog
bV9yZW5kZXJBcmVuYTsKLQotICAgIFFQdHJEaWN0PCBRVmFsdWVMaXN0PERvY3VtZW50TWFya2Vy
PiA+IG1fbWFya2VyczsKLQotICAgIEtXUUFjY09iamVjdENhY2hlKiBtX2FjY0NhY2hlOwotICAg
IAotICAgIFFQdHJMaXN0PEhUTUxJbWFnZUxvYWRlcj4gbV9pbWFnZUxvYWRFdmVudERpc3BhdGNo
U29vbkxpc3Q7Ci0gICAgUVB0ckxpc3Q8SFRNTEltYWdlTG9hZGVyPiBtX2ltYWdlTG9hZEV2ZW50
RGlzcGF0Y2hpbmdMaXN0OwotICAgIGludCBtX2ltYWdlTG9hZEV2ZW50VGltZXI7Ci0KLSAgICBO
b2RlSW1wbCogbV9jc3NUYXJnZXQ7Ci0gICAgCi0gICAgYm9vbCBtX3Byb2Nlc3NpbmdMb2FkRXZl
bnQ7Ci0gICAgUVRpbWUgbV9zdGFydFRpbWU7Ci0gICAgYm9vbCBtX292ZXJNaW5pbXVtTGF5b3V0
VGhyZXNob2xkOwotICAgIAotI2lmZGVmIEtIVE1MX1hTTFQKLSAgICB2b2lkICptX3RyYW5zZm9y
bVNvdXJjZTsKLSAgICBSZWZQdHI8RG9jdW1lbnRJbXBsPiBtX3RyYW5zZm9ybVNvdXJjZURvY3Vt
ZW50OwotI2VuZGlmCi0KLSNpZm5kZWYgS0hUTUxfTk9fWEJMCi0gICAgWEJMOjpYQkxCaW5kaW5n
TWFuYWdlciogbV9iaW5kaW5nTWFuYWdlcjsgLy8gVGhlIGFjY2VzcyBwb2ludCB0aHJvdWdoIHdo
aWNoIGRvY3VtZW50cyBhbmQgZWxlbWVudHMgY29tbXVuaWNhdGUgd2l0aCBYQkwuCi0jZW5kaWYK
LSAgICAKLSAgICBRTWFwPFFTdHJpbmcsIEhUTUxNYXBFbGVtZW50SW1wbCAqPiBtX2ltYWdlTWFw
c0J5TmFtZTsKLQotICAgIERPTVN0cmluZyBtX3BvbGljeUJhc2VVUkw7Ci0KLSAgICBRUHRyRGlj
dDxOb2RlSW1wbD4gbV9kaXNjb25uZWN0ZWROb2Rlc1dpdGhFdmVudExpc3RlbmVyczsKLQotICAg
IGludCBtX2RvY0lEOyAvLyBBIHVuaXF1ZSBkb2N1bWVudCBpZGVudGlmaWVyIHVzZWQgZm9yIHRo
aW5ncyBsaWtlIGRvY3VtZW50LXNwZWNpZmljIG1hcHBlZCBhdHRyaWJ1dGVzLgotCi1wdWJsaWM6
Ci0gICAgS1dRU2lnbmFsIG1fZmluaXNoZWRQYXJzaW5nOwotCi0gICAgYm9vbCBpblBhZ2VDYWNo
ZSgpOwotICAgIHZvaWQgc2V0SW5QYWdlQ2FjaGUoYm9vbCBmbGFnKTsKLSAgICB2b2lkIHJlc3Rv
cmVSZW5kZXJlcihraHRtbDo6UmVuZGVyT2JqZWN0KiByZW5kZXIpOwotCi0gICAgdm9pZCBwYXNz
d29yZEZpZWxkQWRkZWQoKTsKLSAgICB2b2lkIHBhc3N3b3JkRmllbGRSZW1vdmVkKCk7Ci0gICAg
Ym9vbCBoYXNQYXNzd29yZEZpZWxkKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNlY3VyZUZvcm1BZGRl
ZCgpOwotICAgIHZvaWQgc2VjdXJlRm9ybVJlbW92ZWQoKTsKLSAgICBib29sIGhhc1NlY3VyZUZv
cm0oKSBjb25zdDsKLQotICAgIHZvaWQgc2V0U2hvdWxkQ3JlYXRlUmVuZGVyZXJzKGJvb2wgZik7
Ci0gICAgYm9vbCBzaG91bGRDcmVhdGVSZW5kZXJlcnMoKTsKLSAgICAKLSAgICB2b2lkIHNldERl
Y29kZXIoa2h0bWw6OkRlY29kZXIgKik7Ci0gICAga2h0bWw6OkRlY29kZXIgKmRlY29kZXIoKSBj
b25zdCB7IHJldHVybiBtX2RlY29kZXIuZ2V0KCk7IH0KLQotICAgIHZvaWQgc2V0RGFzaGJvYXJk
UmVnaW9uc0RpcnR5KGJvb2wgZikgeyBtX2Rhc2hib2FyZFJlZ2lvbnNEaXJ0eSA9IGY7IH0KLSAg
ICBib29sIGRhc2hib2FyZFJlZ2lvbnNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZGFzaGJvYXJk
UmVnaW9uc0RpcnR5OyB9Ci0gICAgYm9vbCBoYXNEYXNoYm9hcmRSZWdpb25zICgpIGNvbnN0IHsg
cmV0dXJuIG1faGFzRGFzaGJvYXJkUmVnaW9uczsgfQotICAgIHZvaWQgc2V0SGFzRGFzaGJvYXJk
UmVnaW9ucyAoYm9vbCBmKSB7IG1faGFzRGFzaGJvYXJkUmVnaW9ucyA9IGY7IH0KLSAgICBjb25z
dCBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4gJiBkYXNoYm9hcmRSZWdp
b25zKCkgY29uc3Q7Ci0gICAgdm9pZCBzZXREYXNoYm9hcmRSZWdpb25zIChjb25zdCBRVmFsdWVM
aXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25WYWx1ZT4mIHJlZ2lvbnMpOwotICAgIAotICAgIHZv
aWQgcmVtb3ZlQWxsRXZlbnRMaXN0ZW5lcnNGcm9tQWxsTm9kZXMoKTsKLQotICAgIHZvaWQgcmVn
aXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5vZGVJbXBsICpub2RlKTsK
LSAgICB2b2lkIHVucmVnaXN0ZXJEaXNjb25uZWN0ZWROb2RlV2l0aEV2ZW50TGlzdGVuZXJzKE5v
ZGVJbXBsICpub2RlKTsKLSAgICAKLSAgICB2b2lkIHJhZGlvQnV0dG9uQ2hlY2tlZChIVE1MSW5w
dXRFbGVtZW50SW1wbCAqY2FsbGVyLCBIVE1MRm9ybUVsZW1lbnRJbXBsICpmb3JtKTsKLSAgICBI
VE1MSW5wdXRFbGVtZW50SW1wbCogY2hlY2tlZFJhZGlvQnV0dG9uRm9yR3JvdXAoRE9NU3RyaW5n
SW1wbCogbmFtZSwgSFRNTEZvcm1FbGVtZW50SW1wbCAqZm9ybSk7Ci0gICAgdm9pZCByZW1vdmVS
YWRpb0J1dHRvbkdyb3VwKERPTVN0cmluZ0ltcGwqIG5hbWUsIEhUTUxGb3JtRWxlbWVudEltcGwg
KmZvcm0pOwotCi1wcml2YXRlOgotICAgIHZvaWQgdXBkYXRlVGl0bGUoKTsKLSAgICB2b2lkIHJl
bW92ZUFsbERpc2Nvbm5lY3RlZE5vZGVFdmVudExpc3RlbmVycygpOwotCi0gICAgSlNFZGl0b3Ig
KmpzRWRpdG9yKCk7Ci0KLSAgICBKU0VkaXRvciAqbV9qc0VkaXRvcjsKLSAgICBib29sIHJlbGlu
cXVpc2hlc0VkaXRpbmdGb2N1cyhOb2RlSW1wbCAqbm9kZSk7Ci0gICAgYm9vbCBhY2NlcHRzRWRp
dGluZ0ZvY3VzKE5vZGVJbXBsICpub2RlKTsKLQotICAgIG11dGFibGUgRE9NU3RyaW5nIG1fZG9t
YWluOwotICAgIGJvb2wgbV9pblBhZ2VDYWNoZTsKLSAgICBraHRtbDo6UmVuZGVyT2JqZWN0ICpt
X3NhdmVkUmVuZGVyZXI7Ci0gICAgaW50IG1fcGFzc3dvcmRGaWVsZHM7Ci0gICAgaW50IG1fc2Vj
dXJlRm9ybXM7Ci0gICAgCi0gICAgUmVmUHRyPGtodG1sOjpEZWNvZGVyPiBtX2RlY29kZXI7Ci0K
LSAgICBtdXRhYmxlIFFEaWN0PEVsZW1lbnRJbXBsPiBtX2VsZW1lbnRzQnlJZDsKLSAgICBtdXRh
YmxlIFFEaWN0PGNoYXI+IG1faWRDb3VudDsKLSAgICAKLSAgICBRRGljdDxFbGVtZW50SW1wbD4g
bV9lbGVtZW50c0J5QWNjZXNzS2V5OwotICAgIGJvb2wgbV9hY2Nlc3NLZXlEaWN0VmFsaWQ7Ci0g
Ci0gICAgYm9vbCBtX2NyZWF0ZVJlbmRlcmVyczsKLSAgICAKLSAgICBJbmhlcml0ZWRCb29sIG1f
ZGVzaWduTW9kZTsKLSAgICAKLSAgICBRVmFsdWVMaXN0PGtodG1sOjpEYXNoYm9hcmRSZWdpb25W
YWx1ZT4gbV9kYXNoYm9hcmRSZWdpb25zOwotICAgIGJvb2wgbV9oYXNEYXNoYm9hcmRSZWdpb25z
OwotICAgIGJvb2wgbV9kYXNoYm9hcmRSZWdpb25zRGlydHk7Ci0gICAgaW50IG1fc2VsZk9ubHlS
ZWZDb3VudDsKLSAgICB0eXBlZGVmIEhhc2hNYXA8RE9NU3RyaW5nSW1wbCosIEhUTUxJbnB1dEVs
ZW1lbnRJbXBsKiwgUG9pbnRlckhhc2g8RE9NU3RyaW5nSW1wbCo+ID4gTmFtZVRvSW5wdXRNYXA7
Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEhUTUxGb3JtRWxlbWVudEltcGwqLCBOYW1lVG9JbnB1dE1h
cCosIFBvaW50ZXJIYXNoPEhUTUxGb3JtRWxlbWVudEltcGwqPiA+IEZvcm1Ub0dyb3VwTWFwOwot
ICAgIEZvcm1Ub0dyb3VwTWFwKiBtX3NlbGVjdGVkUmFkaW9CdXR0b25zOwotfTsKIAogY2xhc3Mg
RG9jdW1lbnRGcmFnbWVudEltcGwgOiBwdWJsaWMgQ29udGFpbmVyTm9kZUltcGwKIHsKQEAgLTgx
OSw0MiArNDUsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBET01TdHJpbmcgdG9TdHJpbmcoKSBj
b25zdDsKIH07CiAKLWNsYXNzIERvY3VtZW50VHlwZUltcGwgOiBwdWJsaWMgTm9kZUltcGwKLXsK
LXB1YmxpYzoKLSAgICBEb2N1bWVudFR5cGVJbXBsKERPTUltcGxlbWVudGF0aW9uSW1wbCAqLCBE
b2N1bWVudEltcGwgKiwgY29uc3QgRE9NU3RyaW5nICZuYW1lLCBjb25zdCBET01TdHJpbmcgJnB1
YmxpY0lkLCBjb25zdCBET01TdHJpbmcgJnN5c3RlbUlkKTsKLSAgICBEb2N1bWVudFR5cGVJbXBs
KERvY3VtZW50SW1wbCAqLCBjb25zdCBET01TdHJpbmcgJm5hbWUsIGNvbnN0IERPTVN0cmluZyAm
cHVibGljSWQsIGNvbnN0IERPTVN0cmluZyAmc3lzdGVtSWQpOwotICAgIERvY3VtZW50VHlwZUlt
cGwoRG9jdW1lbnRJbXBsICosIGNvbnN0IERvY3VtZW50VHlwZUltcGwgJik7Ci0KLSAgICAvLyBE
T00gbWV0aG9kcyAmIGF0dHJpYnV0ZXMgZm9yIERvY3VtZW50VHlwZQotICAgIE5hbWVkTm9kZU1h
cEltcGwgKmVudGl0aWVzKCkgY29uc3QgeyByZXR1cm4gbV9lbnRpdGllcy5nZXQoKTsgfQotICAg
IE5hbWVkTm9kZU1hcEltcGwgKm5vdGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1fbm90YXRpb25z
LmdldCgpOyB9Ci0KLSAgICBET01TdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQotICAgIERPTVN0cmluZyBwdWJsaWNJZCgpIGNvbnN0IHsgcmV0dXJuIG1fcHVibGljSWQ7IH0K
LSAgICBET01TdHJpbmcgc3lzdGVtSWQoKSBjb25zdCB7IHJldHVybiBtX3N5c3RlbUlkOyB9Ci0g
ICAgRE9NU3RyaW5nIGludGVybmFsU3Vic2V0KCkgY29uc3QgeyByZXR1cm4gbV9zdWJzZXQ7IH0K
LQotICAgIC8vIERPTSBtZXRob2RzIG92ZXJyaWRkZW4gZnJvbSBwYXJlbnQgY2xhc3NlcwotICAg
IHZpcnR1YWwgRE9NU3RyaW5nIG5vZGVOYW1lKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1bnNpZ25l
ZCBzaG9ydCBub2RlVHlwZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgTm9kZUltcGwgKmNsb25lTm9k
ZShib29sIGRlZXApOwotCi0gICAgLy8gT3RoZXIgbWV0aG9kcyAobm90IHBhcnQgb2YgRE9NKQot
ICAgIERPTUltcGxlbWVudGF0aW9uSW1wbCAqaW1wbGVtZW50YXRpb24oKSBjb25zdCB7IHJldHVy
biBtX2ltcGxlbWVudGF0aW9uLmdldCgpOyB9Ci0gICAgdmlydHVhbCBET01TdHJpbmcgdG9TdHJp
bmcoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBSZWZQdHI8RE9NSW1wbGVtZW50YXRpb25JbXBs
PiBtX2ltcGxlbWVudGF0aW9uOwotICAgIFJlZlB0cjxOYW1lZE5vZGVNYXBJbXBsPiBtX2VudGl0
aWVzOwotICAgIFJlZlB0cjxOYW1lZE5vZGVNYXBJbXBsPiBtX25vdGF0aW9uczsKLQotICAgIERP
TVN0cmluZyBtX25hbWU7Ci0gICAgRE9NU3RyaW5nIG1fcHVibGljSWQ7Ci0gICAgRE9NU3RyaW5n
IG1fc3lzdGVtSWQ7Ci0gICAgRE9NU3RyaW5nIG1fc3Vic2V0OwotfTsKLQogfSAvL25hbWVzcGFj
ZQogCiAjZW5kaWYKSW5kZXg6IGtodG1sL3htbC94bWxfdG9rZW5pemVyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBraHRtbC94bWwveG1sX3Rva2VuaXplci5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0
bWwveG1sL3htbF90b2tlbml6ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw5IEBA
CiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAieG1sX3Rva2VuaXplci5oIgogCi0jaW5j
bHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRGcmFnbWVudEltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudFR5cGVJbXBs
LmgiCiAjaW5jbHVkZSAieG1sL2RvbV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21f
dGV4dGltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3htbGltcGwuaCIKSW5kZXg6IGtodG1sL2Vk
aXRpbmcvdmlzaWJsZV90ZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL3Zpc2li
bGVfdGV4dC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvZWRpdGluZy92aXNpYmxlX3Rl
eHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiwxNiArMzIsMTAgQEAKICNpbmNsdWRlICJ4bWwv
ZG9tX25vZGVpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgogI2luY2x1ZGUg
InhtbC9kb20yX3JhbmdlaW1wbC5oIgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVk
ZSAiRG9jdW1lbnRJbXBsLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKLQot
dXNpbmcgRE9NOjpEb2N1bWVudEltcGw7Ci11c2luZyBET006OkRPTVN0cmluZzsKLXVzaW5nIERP
TTo6Tm9kZTsKLXVzaW5nIERPTTo6Tm9kZUltcGw7Ci11c2luZyBET006Om9mZnNldEluQ2hhcmFj
dGVyczsKLXVzaW5nIERPTTo6UmFuZ2VJbXBsOwordXNpbmcgbmFtZXNwYWNlIERPTTsKIAogLy8g
RklYTUU6IFRoZXNlIGNsYXNzZXMgc2hvdWxkIHByb2JhYmx5IHVzZSB0aGUgcmVuZGVyIHRyZWUg
YW5kIG5vdCB0aGUgRE9NIHRyZWUsIHNpbmNlIGVsZW1lbnRzIGNvdWxkCiAvLyBiZSBoaWRkZW4g
dXNpbmcgQ1NTLCBvciBhZGRpdGlvbmFsIGdlbmVyYXRlZCBjb250ZW50IGNvdWxkIGJlIGFkZGVk
LiAgRm9yIG5vdywgd2UganVzdCBtYWtlIHN1cmUKSW5kZXg6IGtodG1sL2VkaXRpbmcvc3BsaXRf
dGV4dF9ub2RlX2NvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvc3BsaXRf
dGV4dF9ub2RlX2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcv
c3BsaXRfdGV4dF9ub2RlX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw3
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAic3BsaXRfdGV4dF9ub2RlX2NvbW1h
bmQuaCIKIAotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50
SW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxj
b3JlL0Fzc2VydGlvbnMuaD4KSW5kZXg6IGtodG1sL2VkaXRpbmcvcmVwbGFjZV9zZWxlY3Rpb25f
Y29tbWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9yZXBsYWNlX3NlbGVjdGlv
bl9jb21tYW5kLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lZGl0aW5nL3JlcGxhY2Vf
c2VsZWN0aW9uX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCw4IEBACiAK
ICNpbmNsdWRlICJ2aXNpYmxlX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCi0j
aW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudEltcGwuaCIKICNpbmNsdWRlICJodG1sX2ludGVyY2hh
bmdlLmgiCiAjaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRt
bF9lbGVtZW50aW1wbC5oIgpJbmRleDoga2h0bWwvZWRpdGluZy9qc2VkaXRpbmcuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvanNlZGl0aW5nLmNwcAkocmV2aXNpb24gMTIwMjEpCisr
KyBraHRtbC9lZGl0aW5nL2pzZWRpdGluZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4
LDcgQEAKIAogI2luY2x1ZGUgImNzcy9jc3NfdmFsdWVpbXBsLmgiCiAjaW5jbHVkZSAiY3NzcHJv
cGVydGllcy5oIgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJ
bXBsLmgiCiAjaW5jbHVkZSAiaHRtbGVkaXRpbmcuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2lu
Y2x1ZGUgIlNlbGVjdGlvbkNvbnRyb2xsZXIuaCIKSW5kZXg6IGtodG1sL2VkaXRpbmcvam9pbl90
ZXh0X25vZGVzX2NvbW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvam9pbl90
ZXh0X25vZGVzX2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcv
am9pbl90ZXh0X25vZGVzX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw2
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiam9pbl90ZXh0X25vZGVzX2NvbW1h
bmQuaCIKIAotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21f
dGV4dGltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KSW5kZXg6IGto
dG1sL2VkaXRpbmcvYXBwbHlfc3R5bGVfY29tbWFuZC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwv
ZWRpdGluZy9hcHBseV9zdHlsZV9jb21tYW5kLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRt
bC9lZGl0aW5nL2FwcGx5X3N0eWxlX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw3
ICszNyw3IEBACiAjaW5jbHVkZSAiaHRtbC9odG1sX2VsZW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAi
aHRtbG5hbWVzLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuaCIKLSNpbmNs
dWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNs
dWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBsLmgi
CiAKSW5kZXg6IGtodG1sL2VkaXRpbmcvbWFya3VwLmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRp
dGluZy9tYXJrdXAuaAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lZGl0aW5nL21hcmt1cC5o
CSh3b3JraW5nIGNvcHkpCkBAIC0yOCw3ICsyOCwxMSBAQAogCiAjaW5jbHVkZSAiaHRtbF9pbnRl
cmNoYW5nZS5oIgogI2luY2x1ZGUgPGt4bWxjb3JlL1Bhc3NSZWZQdHIuaD4KLSNpbmNsdWRlICJk
b21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnRJbXBsLmgiCisKK25hbWVz
cGFjZSBET00geworICAgIGNsYXNzIFJhbmdlSW1wbDsKK30KIAogbmFtZXNwYWNlIGtodG1sIHsK
IApJbmRleDoga2h0bWwvZWRpdGluZy9pbnNlcnRfdGV4dF9jb21tYW5kLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBraHRtbC9lZGl0aW5nL2luc2VydF90ZXh0X2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtodG1sL2VkaXRpbmcvaW5zZXJ0X3RleHRfY29tbWFuZC5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlICJ2aXNpYmxlX3Bvc2l0aW9uLmgiCiAjaW5j
bHVkZSAidmlzaWJsZV90ZXh0LmgiCiAjaW5jbHVkZSAidmlzaWJsZV91bml0cy5oIgotI2luY2x1
ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1
ZGUgInhtbC9kb21fcG9zaXRpb24uaCIKICNpbmNsdWRlICJ4bWwvZG9tX3RleHRpbXBsLmgiCiAK
SW5kZXg6IGtodG1sL2VkaXRpbmcvaW5zZXJ0X3BhcmFncmFwaF9zZXBhcmF0b3JfY29tbWFuZC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9pbnNlcnRfcGFyYWdyYXBoX3NlcGFyYXRv
cl9jb21tYW5kLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lZGl0aW5nL2luc2VydF9w
YXJhZ3JhcGhfc2VwYXJhdG9yX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3ICsz
Myw3IEBACiAjaW5jbHVkZSAiY3NzL2Nzc19jb21wdXRlZHN0eWxlLmgiCiAjaW5jbHVkZSAiY3Nz
L2Nzc192YWx1ZWltcGwuaCIKICNpbmNsdWRlICJodG1sbmFtZXMuaCIKLSNpbmNsdWRlICJ4bWwv
ZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJ4bWwv
ZG9tX2VsZW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgogCkluZGV4
OiBraHRtbC9lZGl0aW5nL2luc2VydF9saW5lX2JyZWFrX2NvbW1hbmQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGtodG1sL2VkaXRpbmcvaW5zZXJ0X2xpbmVfYnJlYWtfY29tbWFuZC5jcHAJKHJldmlzaW9u
IDEyMDIxKQorKysga2h0bWwvZWRpdGluZy9pbnNlcnRfbGluZV9icmVha19jb21tYW5kLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgInZpc2libGVfdW5pdHMu
aCIKIAogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5o
IgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGlt
cGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9t
X3RleHRpbXBsLmgiCkluZGV4OiBraHRtbC9lZGl0aW5nL3Zpc2libGVfcG9zaXRpb24uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvdmlzaWJsZV9wb3NpdGlvbi5jcHAJKHJldmlzaW9u
IDEyMDIxKQorKysga2h0bWwvZWRpdGluZy92aXNpYmxlX3Bvc2l0aW9uLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfbGluZS5o
IgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfb2JqZWN0LmgiCiAjaW5jbHVkZSAiSW5saW5l
VGV4dEJveC5oIgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJ
bXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfcmFuZ2VpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2Rv
bV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKSW5kZXg6IGtodG1s
L2VkaXRpbmcvbWFya3VwLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL21hcmt1cC5j
cHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvZWRpdGluZy9tYXJrdXAuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zOCwyNiArMzgsMTAgQEAKICNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwu
aCIKICNpbmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCiAjaW5jbHVkZSAiaHRtbG5hbWVzLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1l
czsKLQotdXNpbmcgRE9NOjpBdHRyaWJ1dGVJbXBsOwotdXNpbmcgRE9NOjpDb21tZW50SW1wbDsK
LXVzaW5nIERPTTo6UHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbDsKLXVzaW5nIERPTTo6Q1NTQ29t
cHV0ZWRTdHlsZURlY2xhcmF0aW9uSW1wbDsKLXVzaW5nIERPTTo6Q1NTTXV0YWJsZVN0eWxlRGVj
bGFyYXRpb25JbXBsOwotdXNpbmcgRE9NOjpEb2N1bWVudEZyYWdtZW50SW1wbDsKLXVzaW5nIERP
TTo6RG9jdW1lbnRJbXBsOwotdXNpbmcgRE9NOjpET01TdHJpbmc7Ci11c2luZyBET006OkVsZW1l
bnRJbXBsOwotdXNpbmcgRE9NOjpUYWdTdGF0dXNGb3JiaWRkZW47Ci11c2luZyBET006OkhUTUxF
bGVtZW50SW1wbDsKLXVzaW5nIERPTTo6TmFtZWRBdHRyTWFwSW1wbDsKLXVzaW5nIERPTTo6Tm9k
ZTsKLXVzaW5nIERPTTo6Tm9kZUltcGw7Ci11c2luZyBET006OlBvc2l0aW9uOwotdXNpbmcgRE9N
OjpSYW5nZUltcGw7Ci11c2luZyBET006OlRleHRJbXBsOwordXNpbmcgbmFtZXNwYWNlIERPTTsK
IAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KICNpbmNsdWRlICJLV1FMb2dnaW5n
LmgiCkluZGV4OiBraHRtbC9lZGl0aW5nL2NvbXBvc2l0ZV9lZGl0X2NvbW1hbmQuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvY29tcG9zaXRlX2VkaXRfY29tbWFuZC5jcHAJKHJldmlz
aW9uIDEyMDIxKQorKysga2h0bWwvZWRpdGluZy9jb21wb3NpdGVfZWRpdF9jb21tYW5kLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBAQAogCiAjaW5jbHVkZSAiYXBwZW5kX25vZGVf
Y29tbWFuZC5oIgogI2luY2x1ZGUgImRlbGV0ZV9mcm9tX3RleHRfbm9kZV9jb21tYW5kLmgiCi0j
aW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNs
dWRlICJodG1sZWRpdGluZy5oIgogI2luY2x1ZGUgImluc2VydF9pbnRvX3RleHRfbm9kZV9jb21t
YW5kLmgiCiAjaW5jbHVkZSAiaW5zZXJ0X25vZGVfYmVmb3JlX2NvbW1hbmQuaCIKSW5kZXg6IGto
dG1sL2VkaXRpbmcvaHRtbGVkaXRpbmcuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcv
aHRtbGVkaXRpbmcuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcvaHRtbGVk
aXRpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSAiY3Nz
X3ZhbHVlaW1wbC5oIgogI2luY2x1ZGUgImNzc3BhcnNlci5oIgogI2luY2x1ZGUgImNzc3Byb3Bl
cnRpZXMuaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1w
bC5oIgogI2luY2x1ZGUgImRvbV9lbGVtZW50aW1wbC5oIgogI2luY2x1ZGUgImRvbV9ub2RlaW1w
bC5oIgogI2luY2x1ZGUgImRvbV9wb3NpdGlvbi5oIgpJbmRleDoga2h0bWwvZWRpdGluZy9tb3Zl
X3NlbGVjdGlvbl9jb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL21vdmVf
c2VsZWN0aW9uX2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcv
bW92ZV9zZWxlY3Rpb25fY29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDcgKzI3LDcg
QEAKICNpbmNsdWRlICJtb3ZlX3NlbGVjdGlvbl9jb21tYW5kLmgiCiAjaW5jbHVkZSAicmVwbGFj
ZV9zZWxlY3Rpb25fY29tbWFuZC5oIgogCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudEltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fz
c2VydGlvbnMuaD4KIApJbmRleDoga2h0bWwvZWRpdGluZy92aXNpYmxlX3VuaXRzLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL3Zpc2libGVfdW5pdHMuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtodG1sL2VkaXRpbmcvdmlzaWJsZV91bml0cy5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmgiCiAjaW5j
bHVkZSAidmlzaWJsZV9wb3NpdGlvbi5oIgogI2luY2x1ZGUgInZpc2libGVfdGV4dC5oIgotI2lu
Y2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2lu
Y2x1ZGUgInhtbC9kb21fZWxlbWVudGltcGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRN
TE5hbWVzOwpJbmRleDoga2h0bWwvZWRpdGluZy9yZWJhbGFuY2Vfd2hpdGVzcGFjZV9jb21tYW5k
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL3JlYmFsYW5jZV93aGl0ZXNwYWNlX2Nv
bW1hbmQuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcvcmViYWxhbmNlX3do
aXRlc3BhY2VfY29tbWFuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4LDcgKzI4LDYgQEAKIAog
I2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAjaW5jbHVkZSAidmlzaWJsZV90ZXh0LmgiCi0jaW5j
bHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV90ZXh0aW1wbC5oIgog
CiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgpJbmRleDoga2h0bWwvZWRpdGluZy9T
ZWxlY3Rpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL1NlbGVj
dGlvbkNvbnRyb2xsZXIuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcvU2Vs
ZWN0aW9uQ29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDcgKzQwLDcgQEAKICNp
bmNsdWRlICJJbmxpbmVUZXh0Qm94LmgiCiAjaW5jbHVkZSAidmlzaWJsZV9wb3NpdGlvbi5oIgog
I2luY2x1ZGUgInZpc2libGVfdW5pdHMuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIK
KyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2VsZW1lbnRpbXBs
LmgiCiAjaW5jbHVkZSAieG1sL2RvbV9ub2RlaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fdGV4
dGltcGwuaCIKSW5kZXg6IGtodG1sL2VkaXRpbmcvbWVyZ2VfaWRlbnRpY2FsX2VsZW1lbnRzX2Nv
bW1hbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VkaXRpbmcvbWVyZ2VfaWRlbnRpY2FsX2Vs
ZW1lbnRzX2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VkaXRpbmcvbWVy
Z2VfaWRlbnRpY2FsX2VsZW1lbnRzX2NvbW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3
ICsyNiw2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAibWVyZ2VfaWRlbnRpY2Fs
X2VsZW1lbnRzX2NvbW1hbmQuaCIKIAotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgogI2lu
Y2x1ZGUgInhtbC9kb21fZWxlbWVudGltcGwuaCIKIAogI2luY2x1ZGUgPGt4bWxjb3JlL0Fzc2Vy
dGlvbnMuaD4KSW5kZXg6IGtodG1sL2VkaXRpbmcvZGVsZXRlX3NlbGVjdGlvbl9jb21tYW5kLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBraHRtbC9lZGl0aW5nL2RlbGV0ZV9zZWxlY3Rpb25fY29tbWFuZC5j
cHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvZWRpdGluZy9kZWxldGVfc2VsZWN0aW9uX2Nv
bW1hbmQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSAieG1s
L2RvbTJfcmFuZ2VpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgogI2luY2x1
ZGUgInhtbC9kb21fdGV4dGltcGwuaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1
ZGUgIkRvY3VtZW50SW1wbC5oIgogCiAKICNpbmNsdWRlIDxreG1sY29yZS9Bc3NlcnRpb25zLmg+
CkluZGV4OiBraHRtbC9lZGl0aW5nL3R5cGluZ19jb21tYW5kLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC9lZGl0aW5nL3R5cGluZ19jb21tYW5kLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRt
bC9lZGl0aW5nL3R5cGluZ19jb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIs
NyBAQAogI2luY2x1ZGUgImJyZWFrX2Jsb2NrcXVvdGVfY29tbWFuZC5oIgogCiAjaW5jbHVkZSAi
TWFjRnJhbWUuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1
bWVudEltcGwuaCIKICNpbmNsdWRlICJ2aXNpYmxlX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAidmlz
aWJsZV91bml0cy5oIgogCkluZGV4OiBraHRtbC9lZGl0aW5nL2VkaXRfY29tbWFuZC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvZWRpdGluZy9lZGl0X2NvbW1hbmQuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtodG1sL2VkaXRpbmcvZWRpdF9jb21tYW5kLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImh0bWxlZGl0aW5nLmgiCiAKICNpbmNsdWRlICJ4bWwv
ZG9tX3Bvc2l0aW9uLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiY3NzL2Nzc192YWx1ZWltcGwuaCIKICNpbmNsdWRl
ICJjc3MvY3NzX2NvbXB1dGVkc3R5bGUuaCIKIApJbmRleDoga2h0bWwvaHRtbC9odG1sX2RvY3Vt
ZW50aW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvaHRtbF9kb2N1bWVudGltcGwuaAko
cmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9odG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgJKHdvcmtp
bmcgY29weSkKQEAgLTI1LDcgKzI1LDcgQEAKICNpZm5kZWYgSFRNTF9ET0NVTUVOVElNUExfSAog
I2RlZmluZSBIVE1MX0RPQ1VNRU5USU1QTF9ICiAKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwu
aCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJtaXNjL2xvYWRlcl9jbGll
bnQuaCIKICNpbmNsdWRlICJodG1sL2h0bWxfbWlzY2ltcGwuaCIKICNpbmNsdWRlIDxreG1sY29y
ZS9IYXNoTWFwLmg+CkBAIC0zOSw3ICszOSw2IEBAIGNsYXNzIEhUTUxFbGVtZW50SW1wbDsKIAog
Y2xhc3MgSFRNTERvY3VtZW50SW1wbCA6IHB1YmxpYyBET006OkRvY3VtZW50SW1wbCwgcHVibGlj
IGtodG1sOjpDYWNoZWRPYmplY3RDbGllbnQKIHsKLSAgICBRX09CSkVDVAogcHVibGljOgogICAg
IEhUTUxEb2N1bWVudEltcGwoRE9NSW1wbGVtZW50YXRpb25JbXBsICpfaW1wbGVtZW50YXRpb24s
IEtIVE1MVmlldyAqdiA9IDApOwogICAgIH5IVE1MRG9jdW1lbnRJbXBsKCk7CkluZGV4OiBraHRt
bC9odG1sL0hUTUxLZXlnZW5FbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRt
bC9IVE1MS2V5Z2VuRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2h0
bWwvSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgs
NyBAQAogI2luY2x1ZGUgIkhUTUxLZXlnZW5FbGVtZW50SW1wbC5oIgogI2luY2x1ZGUgIkhUTUxP
cHRpb25FbGVtZW50SW1wbC5oIgogI2luY2x1ZGUgImRvbV90ZXh0aW1wbC5oIgotI2luY2x1ZGUg
ImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiRm9y
bURhdGFMaXN0LmgiCiAKICNpbmNsdWRlIDxrc3Nsa2V5Z2VuLmg+CkluZGV4OiBraHRtbC9odG1s
L2h0bWxwYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvaHRtbHBhcnNlci5jcHAJ
KHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvaHRtbC9odG1scGFyc2VyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNDksNiArNDksNyBAQAogI2luY2x1ZGUgImh0bWxmYWN0b3J5LmgiCiAjaW5jbHVk
ZSAieG1sL2RvbV90ZXh0aW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKKyNp
bmNsdWRlICJEb2N1bWVudEZyYWdtZW50SW1wbC5oIgogI2luY2x1ZGUgPGt4bWxjb3JlL0hhc2hT
ZXQuaD4KICNpbmNsdWRlICJodG1sL2h0bWx0b2tlbml6ZXIuaCIKICNpbmNsdWRlICJGcmFtZVZp
ZXcuaCIKSW5kZXg6IGtodG1sL2h0bWwvaHRtbGZhY3RvcnkuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGto
dG1sL2h0bWwvaHRtbGZhY3RvcnkuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2h0bWwv
aHRtbGZhY3RvcnkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNs
dWRlICJjb25maWcuaCIKICNpbmNsdWRlICJodG1sZmFjdG9yeS5oIgotI2luY2x1ZGUgImRvbV9k
b2NpbXBsLmgiCiAKICNpbmNsdWRlICJodG1sL2h0bWxfYmFzZWltcGwuaCIKICNpbmNsdWRlICJo
dG1sL2h0bWxfYmxvY2tpbXBsLmgiCkluZGV4OiBraHRtbC9odG1sL2h0bWx0b2tlbml6ZXIuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvaHRtbHRva2VuaXplci5jcHAJKHJldmlzaW9uIDEy
MDIxKQorKysga2h0bWwvaHRtbC9odG1sdG9rZW5pemVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
NDMsNyArNDMsOCBAQAogCiAjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiRnJhbWUu
aCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwu
aCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50SW1wbC5oIgogI2luY2x1ZGUgInhtbC9FdmVu
dE5hbWVzLmgiCiAjaW5jbHVkZSAiY3NzL2Nzc2hlbHBlci5oIgogI2luY2x1ZGUgImVjbWEva2pz
X3Byb3h5LmgiCkluZGV4OiBraHRtbC9odG1sL0hUTUxMYWJlbEVsZW1lbnRJbXBsLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBraHRtbC9odG1sL0hUTUxMYWJlbEVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24g
MTIwMjEpCisrKyBraHRtbC9odG1sL0hUTUxMYWJlbEVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5o
IgogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKLSNpbmNs
dWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogCiB1c2luZyBu
YW1lc3BhY2Uga2h0bWw7CiB1c2luZyBuYW1lc3BhY2UgRE9NOjpIVE1MTmFtZXM7CkluZGV4OiBr
aHRtbC9odG1sL2h0bWxfb2JqZWN0aW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvaHRtbC9o
dG1sX29iamVjdGltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2h0bWwvaHRtbF9v
YmplY3RpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUg
PHFtYXAuaD4KICNpbmNsdWRlIDxrZGVidWcuaD4KIAotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1w
bC5oIgogI2luY2x1ZGUgImNzcy9jc3NzdHlsZXNlbGVjdG9yLmgiCiAjaW5jbHVkZSAiY3NzL2Nz
c2hlbHBlci5oIgogI2luY2x1ZGUgImNzc3Byb3BlcnRpZXMuaCIKSW5kZXg6IGtodG1sL2h0bWwv
SFRNTElucHV0RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTElu
cHV0RWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2h0bWwvSFRNTElu
cHV0RWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNSw3ICszNSw3IEBACiAjaW5j
bHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mb3JtLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRl
cl9idXR0b24uaCIKICNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIKLSNpbmNsdWRlICJkb21fZG9j
aW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogCiAjaW5jbHVkZSA8a2xvY2FsZS5o
PgogCkluZGV4OiBraHRtbC9odG1sL0hUTUxPcHRpb25FbGVtZW50SW1wbC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0ga2h0bWwvaHRtbC9IVE1MT3B0aW9uRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtodG1sL2h0bWwvSFRNTE9wdGlvbkVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgIkhUTUxPcHRpb25FbGVtZW50SW1wbC5oIgog
I2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfZm9ybS5oIgogCi0jaW5jbHVkZSAiZG9tX2RvY2lt
cGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJkb21fdGV4dGltcGwu
aCIKICNpbmNsdWRlICJkb21fZXhjZXB0aW9uLmgiCiAKSW5kZXg6IGtodG1sL2h0bWwvSFRNTFRl
eHRBcmVhRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2h0bWwvSFRNTFRleHRB
cmVhRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2h0bWwvSFRNTFRl
eHRBcmVhRWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw3IEBACiAj
aW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9mb3JtLmgiCiAjaW5jbHVkZSAiZG9tX3RleHRpbXBs
LmgiCiAjaW5jbHVkZSAiRm9ybURhdGFMaXN0LmgiCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIK
KyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKIApJ
bmRleDoga2h0bWwvaHRtbC9IVE1MU2VsZWN0RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtodG1sL2h0bWwvSFRNTFNlbGVjdEVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisr
KyBraHRtbC9odG1sL0hUTUxTZWxlY3RFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlICJodG1sX21pc2NpbXBsLmgiIC8vIGZvciBIVE1MQ29s
bGVjdGlvbkltcGwKICNpbmNsdWRlICJkb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRlICJGb3Jt
RGF0YUxpc3QuaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50
SW1wbC5oIgogCiAjaW5jbHVkZSAiY3NzL2Nzc3N0eWxlc2VsZWN0b3IuaCIKICNpbmNsdWRlICJj
c3Nwcm9wZXJ0aWVzLmgiCkluZGV4OiBraHRtbC9odG1sL2h0bWxfbGlzdGltcGwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtodG1sL2h0bWwvaHRtbF9saXN0aW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQor
Kysga2h0bWwvaHRtbC9odG1sX2xpc3RpbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjYsNyAr
MjYsNiBAQAogI2luY2x1ZGUgImNzc3Byb3BlcnRpZXMuaCIKICNpbmNsdWRlICJjc3N2YWx1ZXMu
aCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2xpc3QuaCIKLSNpbmNsdWRlICJ4bWwvZG9t
X2RvY2ltcGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIGtodG1sOwogCkluZGV4OiBraHRtbC9odG1s
L0hUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9odG1s
L0hUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRt
bC9odG1sL0hUTUxHZW5lcmljRm9ybUVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAt
MjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhUTUxHZW5lcmlj
Rm9ybUVsZW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiSFRNTEZvcm1FbGVtZW50SW1wbC5oIgotI2lu
Y2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKICNpbmNs
dWRlICJyZW5kZXJpbmcvcmVuZGVyX2Zvcm0uaCIKICNpbmNsdWRlICJyZW5kZXJfdGhlbWUuaCIK
SW5kZXg6IGtodG1sL2h0bWwvaHRtbF9kb2N1bWVudGltcGwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGto
dG1sL2h0bWwvaHRtbF9kb2N1bWVudGltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1s
L2h0bWwvaHRtbF9kb2N1bWVudGltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02Nyw2ICs2Nyw3
IEBACiAKICNpbmNsdWRlICJ4bWwveG1sX3Rva2VuaXplci5oIgogI2luY2x1ZGUgInhtbC9kb20y
X2V2ZW50c2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudFR5cGVJbXBsLmgiCiAKICNpbmNsdWRl
ICJraHRtbF9mYWN0b3J5LmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuaCIK
SW5kZXg6IGtodG1sL2VjbWEva2pzX2Nzcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvZWNtYS9r
anNfY3NzLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lY21hL2tqc19jc3MuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAiY3NzL2Nzc19ydWxlaW1w
bC5oIgogI2luY2x1ZGUgImNzcy9jc3Nfc3R5bGVzaGVldGltcGwuaCIKICNpbmNsdWRlICJjc3Mv
Y3NzX3ZhbHVlaW1wbC5oIgotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUg
IkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9oZWFkaW1wbC5oIiAvLyBmb3Ig
SFRNTFN0eWxlRWxlbWVudAogI2luY2x1ZGUgImtqc19kb20uaCIKICNpbmNsdWRlICJodG1sbmFt
ZXMuaCIKSW5kZXg6IGtodG1sL2VjbWEva2pzX3JhbmdlLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRt
bC9lY21hL2tqc19yYW5nZS5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvZWNtYS9ranNf
cmFuZ2UuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3ICsyNCw3IEBACiAKICNpbmNsdWRlIDxr
ZGVidWcuaD4KICNpbmNsdWRlICJkb20vZG9tMl9yYW5nZS5oIgotI2luY2x1ZGUgInhtbC9kb21f
ZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnRJbXBsLmgiCiAjaW5jbHVkZSAi
eG1sL2RvbTJfcmFuZ2VpbXBsLmgiCiAKIHVzaW5nIERPTTo6RE9NU3RyaW5nOwpJbmRleDoga2h0
bWwvZWNtYS9ranNfdmlld3MuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VjbWEva2pzX3ZpZXdz
LmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lY21hL2tqc192aWV3cy5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJranNfY3NzLmgiCiAKICNpbmNs
dWRlICJ4bWwvZG9tMl92aWV3c2ltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIK
KyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJjc3MvY3NzX3N0eWxlc2hlZXRp
bXBsLmgiCiAjaW5jbHVkZSAiY3NzL2Nzc19ydWxlaW1wbC5oIgogCkluZGV4OiBraHRtbC9lY21h
L3htbGh0dHByZXF1ZXN0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lY21hL3htbGh0dHByZXF1
ZXN0LmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lY21hL3htbGh0dHByZXF1ZXN0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgImh0bWwvaHRtbF9k
b2N1bWVudGltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCiAjaW5jbHVk
ZSAieG1sL0V2ZW50TmFtZXMuaCIKKyNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbkltcGwuaCIK
IAogI2luY2x1ZGUgIkZyYW1lLmgiCiAKSW5kZXg6IGtodG1sL2VjbWEva2pzX3RyYXZlcnNhbC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwvZWNtYS9ranNfdHJhdmVyc2FsLmNwcAkocmV2aXNpb24g
MTIwMjEpCisrKyBraHRtbC9lY21hL2tqc190cmF2ZXJzYWwuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yMiw4ICsyMiw5IEBACiAjaW5jbHVkZSAia2pzX3RyYXZlcnNhbC5sdXQuaCIKIAogI2luY2x1
ZGUgImtqc19wcm94eS5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgPHht
bC9kb21fbm9kZWltcGwuaD4KLSNpbmNsdWRlIDx4bWwvZG9tX2RvY2ltcGwuaD4KKyNpbmNsdWRl
ICJkb20yX3RyYXZlcnNhbGltcGwuaCIKICNpbmNsdWRlICJGcmFtZS5oIgogI2luY2x1ZGUgPGtk
ZWJ1Zy5oPgogI2luY2x1ZGUgPGtqcy9wcm90ZWN0Lmg+CkluZGV4OiBraHRtbC9lY21hL2tqc19l
dmVudHMuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2VjbWEva2pzX2V2ZW50cy5jcHAJKHJldmlz
aW9uIDEyMDIxKQorKysga2h0bWwvZWNtYS9ranNfZXZlbnRzLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImtqc192aWV3cy5oIgogI2luY2x1ZGUgImtqc19w
cm94eS5oIgogI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9t
X2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9t
Ml9ldmVudHNpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfdmlld3NpbXBsLmgiCiAjaW5jbHVk
ZSAieG1sL0V2ZW50TmFtZXMuaCIKSW5kZXg6IGtodG1sL2VjbWEva2pzX3dpbmRvdy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0ga2h0bWwvZWNtYS9ranNfd2luZG93LmNwcAkocmV2aXNpb24gMTIwMjEpCisr
KyBraHRtbC9lY21hL2tqc193aW5kb3cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC02MCw3ICs2MCw2
IEBACiAjaW5jbHVkZSAiZWRpdGluZy9TZWxlY3Rpb25Db250cm9sbGVyLmgiCiAjaW5jbHVkZSAi
eG1sL2RvbTJfZXZlbnRzaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX3JhbmdlaW1wbC5oIgot
I2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb21fZWxlbWVudGlt
cGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAieG1sL0V2ZW50
TmFtZXMuaCIKSW5kZXg6IGtodG1sL2VjbWEva2pzX2RvbS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0
bWwvZWNtYS9ranNfZG9tLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lY21hL2tqc19k
b20uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNyw3ICsyNyw5IEBACiAjaW5jbHVkZSAieG1sL2Rv
bTJfdmlld3NpbXBsLmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9jYW52YXMuaCIKICNp
bmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRUeXBlSW1wbC5oIgorI2luY2x1ZGUgIkRPTUltcGxlbWVudGF0
aW9uSW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnRJbXBsLmgiCiAjaW5jbHVkZSAi
eG1sL2RvbV90ZXh0aW1wbC5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5jbHVk
ZSAieG1sL2RvbV94bWxpbXBsLmgiCkBAIC00OCwzNCArNTAsOSBAQAogCiAjaW5jbHVkZSA8SmF2
YVNjcmlwdENvcmUvcnVudGltZV9vYmplY3QuaD4KIAordXNpbmcgbmFtZXNwYWNlIERPTTsKIHVz
aW5nIG5hbWVzcGFjZSBET006OkhUTUxOYW1lczsKLQotdXNpbmcgRE9NOjpBdG9taWNTdHJpbmc7
Ci11c2luZyBET006OkF0dHJJbXBsOwotdXNpbmcgRE9NOjpDaGFyYWN0ZXJEYXRhSW1wbDsKLXVz
aW5nIERPTTo6RG9jdW1lbnRJbXBsOwotdXNpbmcgRE9NOjpEb2N1bWVudFR5cGVJbXBsOwotdXNp
bmcgRE9NOjpET01FeGNlcHRpb247Ci11c2luZyBET006OkRPTUltcGxlbWVudGF0aW9uSW1wbDsK
LXVzaW5nIERPTTo6RE9NU3RyaW5nOwotdXNpbmcgRE9NOjpFbGVtZW50SW1wbDsKLXVzaW5nIERP
TTo6RW50aXR5SW1wbDsKLXVzaW5nIERPTTo6RXZlbnRJbXBsOwogdXNpbmcgbmFtZXNwYWNlIERP
TTo6RXZlbnROYW1lczsKLXVzaW5nIERPTTo6SFRNTEFwcGxldEVsZW1lbnRJbXBsOwotdXNpbmcg
RE9NOjpIVE1MRG9jdW1lbnRJbXBsOwotdXNpbmcgRE9NOjpIVE1MRWxlbWVudEltcGw7Ci11c2lu
ZyBET006OkhUTUxFbWJlZEVsZW1lbnRJbXBsOwotdXNpbmcgRE9NOjpIVE1MT2JqZWN0RWxlbWVu
dEltcGw7Ci11c2luZyBET006Ok5hbWVkTm9kZU1hcEltcGw7Ci11c2luZyBET006Ok5vZGU7Ci11
c2luZyBET006Ok5vZGVGaWx0ZXJJbXBsOwotdXNpbmcgRE9NOjpOb2RlSW1wbDsKLXVzaW5nIERP
TTo6Tm9kZUxpc3RJbXBsOwotdXNpbmcgRE9NOjpOb3RhdGlvbkltcGw7Ci11c2luZyBET006OlBy
b2Nlc3NpbmdJbnN0cnVjdGlvbkltcGw7Ci11c2luZyBET006OlRleHRJbXBsOwotCiB1c2luZyBu
YW1lc3BhY2Uga2h0bWw7CiAKICNpbmNsdWRlICJranNfZG9tLmx1dC5oIgpJbmRleDoga2h0bWwv
ZWNtYS9YU0xUUHJvY2Vzc29yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9lY21hL1hTTFRQcm9j
ZXNzb3IuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2VjbWEvWFNMVFByb2Nlc3Nvci5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTMxLDcgKzMxLDggQEAKICNpbmNsdWRlICJ4c2x0X3Byb2Nl
c3NvcmltcGwuaCIKICNpbmNsdWRlICJYU0xUUHJvY2Vzc29yLmx1dC5oIgogI2luY2x1ZGUgImtq
c19kb20uaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1w
bC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnRJbXBsLmgiCiAKICNpbmNsdWRlIDxKYXZh
U2NyaXB0Q29yZS9sb29rdXAuaD4KIApJbmRleDoga2h0bWwvZWNtYS94bWxzZXJpYWxpemVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBraHRtbC9lY21hL3htbHNlcmlhbGl6ZXIuY3BwCShyZXZpc2lvbiAx
MjAyMSkKKysrIGtodG1sL2VjbWEveG1sc2VyaWFsaXplci5jcHAJKHdvcmtpbmcgY29weSkKQEAg
LTIzLDEwICsyMyw3IEBACiAjaW5jbHVkZSAieG1sc2VyaWFsaXplci5sdXQuaCIKIAogI2luY2x1
ZGUgImtqc19kb20uaCIKLQogI2luY2x1ZGUgImRvbS9kb21fZXhjZXB0aW9uLmgiCi0jaW5jbHVk
ZSAieG1sL2RvbV9kb2NpbXBsLmgiCi0KICNpbmNsdWRlICJtYXJrdXAuaCIKIAogI2luY2x1ZGUg
PGtkZWJ1Zy5oPgpJbmRleDoga2h0bWwvZWNtYS9kb21wYXJzZXIuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IGtodG1sL2VjbWEvZG9tcGFyc2VyLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9lY21h
L2RvbXBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIzLDkgKzIzLDkgQEAKICNpbmNsdWRl
ICJkb21wYXJzZXIubHV0LmgiCiAKICNpbmNsdWRlICJodG1sL2h0bWxfZG9jdW1lbnRpbXBsLmgi
CisjaW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb25JbXBsLmgiCiAKLXVzaW5nIERPTTo6RG9jdW1l
bnRJbXBsOwotdXNpbmcgRE9NOjpET01JbXBsZW1lbnRhdGlvbkltcGw7Cit1c2luZyBuYW1lc3Bh
Y2UgRE9NOwogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERPTVBhcnNlciBPYmplY3QgLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vCiAKSW5kZXg6IGtodG1sL3hzbC94c2x0X3Byb2Nlc3NvcmltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGtodG1sL3hzbC94c2x0X3Byb2Nlc3NvcmltcGwuY3BwCShyZXZp
c2lvbiAxMjAyMSkKKysrIGtodG1sL3hzbC94c2x0X3Byb2Nlc3NvcmltcGwuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiZG9tX3RleHRpbXBsLmgiCiAjaW5j
bHVkZSAiaHRtbHRva2VuaXplci5oIgogI2luY2x1ZGUgImh0bWxfZG9jdW1lbnRpbXBsLmgiCisj
aW5jbHVkZSAiRE9NSW1wbGVtZW50YXRpb25JbXBsLmgiCiAjaW5jbHVkZSAibG9hZGVyLmgiCiAj
aW5jbHVkZSAiQ2FjaGUuaCIKICNpbmNsdWRlICJEb2NMb2FkZXIuaCIKSW5kZXg6IGtodG1sL2Nz
cy9jc3NfcnVsZWltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2Nzcy9jc3NfcnVsZWltcGwu
Y3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2Nzcy9jc3NfcnVsZWltcGwuY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zNCw5ICszNCw2IEBACiAjaW5jbHVkZSAiQ2FjaGUuaCIKICNpbmNsdWRl
ICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCiAjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCi0jaW5jbHVk
ZSAieG1sL2RvbV9kb2NpbXBsLmgiCi0KLSNpbmNsdWRlIDxrZGVidWcuaD4KIAogbmFtZXNwYWNl
IERPTSB7CiAKSW5kZXg6IGtodG1sL2Nzcy9jc3NwYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGto
dG1sL2Nzcy9jc3NwYXJzZXIuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL2Nzcy9jc3Nw
YXJzZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiY3Nz
cHJvcGVydGllcy5oIgogI2luY2x1ZGUgImNzc3ZhbHVlcy5oIgogI2luY2x1ZGUgIm1pc2MvaGVs
cGVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJ
bXBsLmgiCiAjaW5jbHVkZSAiY3NzaGVscGVyLmgiCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KSW5k
ZXg6IGtodG1sL2Nzcy9jc3NfdmFsdWVpbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9jc3Mv
Y3NzX3ZhbHVlaW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvY3NzL2Nzc192YWx1
ZWltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSAiY3Nz
L2Nzc3N0eWxlc2VsZWN0b3IuaCIKIAogI2luY2x1ZGUgInhtbC9kb21fc3RyaW5naW1wbC5oIgot
I2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgog
I2luY2x1ZGUgImh0bWwvaHRtbF9lbGVtZW50aW1wbC5oIgogCiAjaW5jbHVkZSAiQ2FjaGUuaCIK
SW5kZXg6IGtodG1sL2Nzcy9jc3NfY29tcHV0ZWRzdHlsZS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0
bWwvY3NzL2Nzc19jb21wdXRlZHN0eWxlLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9j
c3MvY3NzX2NvbXB1dGVkc3R5bGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw3IEBA
CiAjaW5jbHVkZSAiY3NzcHJvcGVydGllcy5oIgogI2luY2x1ZGUgImNzc3ZhbHVlcy5oIgogI2lu
Y2x1ZGUgImRvbV9hdG9taWNzdHJpbmcuaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgImRvbV9leGNlcHRpb24uaCIKICNpbmNs
dWRlICJkb21fc3RyaW5nLmgiCiAjaW5jbHVkZSAiZm9udC5oIgpJbmRleDoga2h0bWwvY3NzL3Bh
cnNlci55Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL2Nzcy9wYXJzZXIueQkocmV2aXNpb24gMTIwMjEp
CisrKyBraHRtbC9jc3MvcGFyc2VyLnkJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcgQEAK
ICNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgPGRvbS9kb21fc3RyaW5nLmg+Ci0jaW5j
bHVkZSA8eG1sL2RvbV9kb2NpbXBsLmg+CisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5j
bHVkZSA8Y3NzL2Nzc19ydWxlaW1wbC5oPgogI2luY2x1ZGUgPGNzcy9jc3Nfc3R5bGVzaGVldGlt
cGwuaD4KICNpbmNsdWRlIDxjc3MvY3NzX3ZhbHVlaW1wbC5oPgpJbmRleDoga2h0bWwvY3NzL2Nz
c19iYXNlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9jc3MvY3NzX2Jhc2UuY3BwCShyZXZpc2lv
biAxMjAyMSkKKysrIGtodG1sL2Nzcy9jc3NfYmFzZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1
LDcgKzM1LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiY3NzX3N0eWxlc2hlZXRpbXBsLmgiCi0j
aW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAj
aW5jbHVkZSAiY3NzX3ZhbHVlaW1wbC5oIgogdXNpbmcgbmFtZXNwYWNlIERPTTsKIApJbmRleDog
a2h0bWwvbWlzYy9DYWNoZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvbWlzYy9DYWNoZS5jcHAJ
KHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvbWlzYy9DYWNoZS5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJDYWNoZWRDU1NTdHlsZVNoZWV0LmgiCiAjaW5j
bHVkZSAiRG9jTG9hZGVyLmgiCiAjaW5jbHVkZSAibG9hZGVyLmgiCi0jaW5jbHVkZSAiZG9tX2Rv
Y2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgPHFwaXhtYXAu
aD4KIApJbmRleDoga2h0bWwvbWlzYy9Eb2NMb2FkZXIuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1s
L21pc2MvRG9jTG9hZGVyLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9taXNjL0RvY0xv
YWRlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJDYWNo
ZWRYU0xTdHlsZVNoZWV0LmgiCiAjaW5jbHVkZSAiQ2FjaGUuaCIKICNpbmNsdWRlICJsb2FkZXIu
aCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgog
I2luY2x1ZGUgIktXUUxvYWRlci5oIgogI2luY2x1ZGUgIkZyYW1lLmgiCiAKSW5kZXg6IGtodG1s
L3JlbmRlcmluZy9iaWRpLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcvYmlkaS5j
cHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvcmVuZGVyaW5nL2JpZGkuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJiaWRpLmgiCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudElt
cGwuaCIKICNpbmNsdWRlICJicmVha19saW5lcy5oIgogI2luY2x1ZGUgIkZyYW1lVmlldy5oIgog
I2luY2x1ZGUgPGt4bWxjb3JlL0Fsd2F5c0lubGluZS5oPgpJbmRleDoga2h0bWwvcmVuZGVyaW5n
L3JlbmRlcl9saW5lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2xp
bmUuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfbGluZS5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlICJJbmxpbmVUZXh0
Qm94LmgiCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl90YWJsZS5oIgogI2luY2x1ZGUgInht
bC9kb21fbm9kZWltcGwuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogI2luY2x1ZGUgInJl
bmRlcl9pbmxpbmUuaCIKICNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKSW5kZXg6IGtodG1sL3Jl
bmRlcmluZy9yZW5kZXJfbGF5ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9y
ZW5kZXJfbGF5ZXIuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5k
ZXJfbGF5ZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC01MCw3ICs1MCw3IEBACiAjaW5jbHVkZSAi
cmVuZGVyX2NhbnZhcy5oIgogI2luY2x1ZGUgInJlbmRlcl9hcmVuYS5oIgogI2luY2x1ZGUgInJl
bmRlcl90aGVtZS5oIgotI2luY2x1ZGUgInhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRv
Y3VtZW50SW1wbC5oIgogI2luY2x1ZGUgInhtbC9kb20yX2V2ZW50c2ltcGwuaCIKICNpbmNsdWRl
ICJ4bWwvRXZlbnROYW1lcy5oIgogI2luY2x1ZGUgImh0bWwvaHRtbF9ibG9ja2ltcGwuaCIKSW5k
ZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfZnJhbWVzLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2ZyYW1lcy5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwv
cmVuZGVyaW5nL3JlbmRlcl9mcmFtZXMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3ICszMSw3
IEBACiAjaW5jbHVkZSAiaHRtbC9odG1sX29iamVjdGltcGwuaCIKICNpbmNsdWRlICJodG1sL2h0
bWx0b2tlbml6ZXIuaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9ldmVudHNpbXBsLmgiCi0jaW5jbHVk
ZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVk
ZSAieG1sL2RvbV90ZXh0aW1wbC5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5j
bHVkZSAiRnJhbWVWaWV3LmgiCkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2NvbnRhaW5l
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9jb250YWluZXIuY3Bw
CShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfY29udGFpbmVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgIlJlbmRlclRleHRG
cmFnbWVudC5oIgogI2luY2x1ZGUgInJlbmRlcl9pbWFnZS5oIgogI2luY2x1ZGUgInJlbmRlcl9j
YW52YXMuaCIKLSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dEltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX3Bvc2l0aW9uLmgiCiAKICNpbmNsdWRlIDxrZGVi
dWcuaD4KSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGFibGUuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGFibGUuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysr
IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfdGFibGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw3
ICszMyw3IEBACiAjaW5jbHVkZSAicmVuZGVyaW5nL3RhYmxlX2xheW91dC5oIgogI2luY2x1ZGUg
Imh0bWwvaHRtbF90YWJsZWltcGwuaCIKICNpbmNsdWRlICJodG1sbmFtZXMuaCIKLSNpbmNsdWRl
ICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1
ZGUgPHFhcHBsaWNhdGlvbi5oPgogI2luY2x1ZGUgPHFzdHlsZS5oPgpJbmRleDoga2h0bWwvcmVu
ZGVyaW5nL3JlbmRlcl9ib3guY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9yZW5k
ZXJfYm94LmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jv
eC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDcgKzQwLDcgQEAKICNpbmNsdWRlICJyZW5kZXJf
dGhlbWUuaCIKIAogI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKLSNpbmNsdWRlICJ4bWwv
ZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJodG1s
L2h0bWxfZWxlbWVudGltcGwuaCIKICNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgogCkluZGV4OiBr
aHRtbC9yZW5kZXJpbmcvcmVuZGVyX3RoZW1lLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5k
ZXJpbmcvcmVuZGVyX3RoZW1lLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5kZXJp
bmcvcmVuZGVyX3RoZW1lLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNyBAQAogI2lu
Y2x1ZGUgInJlbmRlcl9zdHlsZS5oIgogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgogI2luY2x1ZGUg
IkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKyNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5hbWVzOwog
CkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2JyLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2JyLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5k
ZXJpbmcvcmVuZGVyX2JyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogI2lu
Y2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgInJlbmRlcl9ici5oIgogCi0jaW5jbHVkZSAiZG9t
X2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJkb21fcG9z
aXRpb24uaCIKICNpbmNsdWRlICJyZW5kZXJfYmxvY2suaCIKICNpbmNsdWRlICJyZW5kZXJfbGlu
ZS5oIgpJbmRleDoga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9mbG93LmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Zsb3cuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGto
dG1sL3JlbmRlcmluZy9yZW5kZXJfZmxvdy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDcgKzMy
LDcgQEAKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX3RhYmxlLmgiCiAjaW5jbHVkZSAicmVu
ZGVyaW5nL3JlbmRlcl9jYW52YXMuaCIKICNpbmNsdWRlICJ4bWwvZG9tX25vZGVpbXBsLmgiCi0j
aW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAj
aW5jbHVkZSAicmVuZGVyX2lubGluZS5oIgogI2luY2x1ZGUgInJlbmRlcl9ibG9jay5oIgogI2lu
Y2x1ZGUgInJlbmRlcl9hcmVuYS5oIgpJbmRleDoga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl90aGVt
ZV9tYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl90aGVtZV9tYWMu
bW0JKHJldmlzaW9uIDEyMDIxKQorKysga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl90aGVtZV9tYWMu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcgQEAKICNpbXBvcnQgImZvbnQuaCIKICNp
bXBvcnQgInJlbmRlcl9zdHlsZS5oIgogI2ltcG9ydCAicmVuZGVyX2NhbnZhcy5oIgotI2ltcG9y
dCAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbXBvcnQgImRv
bV9lbGVtZW50aW1wbC5oIgogI2ltcG9ydCAiRnJhbWVWaWV3LmgiCiAKSW5kZXg6IGtodG1sL3Jl
bmRlcmluZy9yZW5kZXJfbGlzdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVyaW5nL3Jl
bmRlcl9saXN0LmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5kZXJpbmcvcmVuZGVy
X2xpc3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAicmVu
ZGVyX2xpc3QuaCIKICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2NhbnZhcy5oIgogCi0jaW5j
bHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5j
bHVkZSAiQ2FjaGVkSW1hZ2UuaCIKIAogI2luY2x1ZGUgImh0bWxuYW1lcy5oIgpJbmRleDoga2h0
bWwvcmVuZGVyaW5nL3JlbmRlcl9pbmxpbmUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRl
cmluZy9yZW5kZXJfaW5saW5lLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5kZXJp
bmcvcmVuZGVyX2lubGluZS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI2LDcgKzI2LDcgQEAKICNp
bmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKICNpbmNsdWRlICJyZW5kZXJfaW5saW5lLmgiCiAjaW5j
bHVkZSAicmVuZGVyX2Jsb2NrLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbV9wb3NpdGlvbi5oIgogCiB1
c2luZyBET006OlBvc2l0aW9uOwpJbmRleDoga2h0bWwvcmVuZGVyaW5nL0lubGluZVRleHRCb3gu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9JbmxpbmVUZXh0Qm94LmNwcAkocmV2
aXNpb24gMTIwMjEpCisrKyBraHRtbC9yZW5kZXJpbmcvSW5saW5lVGV4dEJveC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlICJyZW5kZXJfYXJlbmEuaCIKICNp
bmNsdWRlICJyZW5kZXJfYmxvY2suaCIKICNpbmNsdWRlICJ4bWwvZG9tMl9yYW5nZWltcGwuaCIK
LSNpbmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIK
ICNpbmNsdWRlIDxxcGVuLmg+CiAKICNpbmNsdWRlICJNYWNGcmFtZS5oIgpJbmRleDoga2h0bWwv
cmVuZGVyaW5nL3JlbmRlcl9mb3JtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBraHRtbC9yZW5kZXJpbmcv
cmVuZGVyX2Zvcm0uY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5k
ZXJfZm9ybS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQ0LDcgKzQ0LDYgQEAKIAogI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgogI2luY2x1ZGUgImtodG1sX2V4dC5oIgotI2luY2x1ZGUgInhtbC9kb21f
ZG9jaW1wbC5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAKICNpbmNsdWRlIDxrZGVi
dWcuaD4KSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfb2JqZWN0LmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX29iamVjdC5jcHAJKHJldmlzaW9uIDEyMDIxKQor
Kysga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9vYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
MCwxMCArMzAsOSBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfbGluZS5oIgogI2luY2x1
ZGUgInJlbmRlcmluZy9yZW5kZXJfbGlzdC5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJf
Y2FudmFzLmgiCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKICNpbmNsdWRlICJ4bWwvZG9tX2Vs
ZW1lbnRpbXBsLmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1ZGUg
InhtbC9kb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUg
InhtbC9kb21fcG9zaXRpb24uaCIKICNpbmNsdWRlICJ4bWwvRXZlbnROYW1lcy5oIgogI2luY2x1
ZGUgIkNhY2hlZEltYWdlLmgiCkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2J1dHRvbi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9idXR0b24uY3BwCShyZXZp
c2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfYnV0dG9uLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVk
ZSAicmVuZGVyX2J1dHRvbi5oIgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAiUmVuZGVyVGV4dC5oIgogI2luY2x1ZGUgImh0bWxu
YW1lcy5oIgogI2luY2x1ZGUgIkhUTUxJbnB1dEVsZW1lbnRJbXBsLmgiCkluZGV4OiBraHRtbC9y
ZW5kZXJpbmcvcmVuZGVyX2NhbnZhcy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga2h0bWwvcmVuZGVyaW5n
L3JlbmRlcl9jYW52YXMuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9y
ZW5kZXJfY2FudmFzLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfY2FudmFzLmgiCiAjaW5j
bHVkZSAicmVuZGVyX2xheWVyLmgiCi0jaW5jbHVkZSAieG1sL2RvbV9kb2NpbXBsLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKICNpbmNsdWRl
IDxrZGVidWcuaD4KSW5kZXg6IGtodG1sL3JlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuY3BwCShyZXZpc2lv
biAxMjAyMSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfcmVwbGFjZWQuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0zNyw3ICszNyw3IEBACiAjaW5jbHVkZSAia2h0bWxfZXh0LmgiCiAjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAieG1sL2RvbTJfZXZlbnRzaW1wbC5oIgotI2luY2x1
ZGUgInhtbC9kb21fZG9jaW1wbC5oIiAvLyAjIyMgcmVtb3ZlIGRlcGVuZGVuY3kKKyNpbmNsdWRl
ICJEb2N1bWVudEltcGwuaCIgLy8gIyMjIHJlbW92ZSBkZXBlbmRlbmN5CiAjaW5jbHVkZSAieG1s
L2RvbV9wb3NpdGlvbi5oIgogI2luY2x1ZGUgInhtbC9FdmVudE5hbWVzLmgiCiAjaW5jbHVkZSA8
a2RlYnVnLmg+CkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2FwcGxldC5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0ga2h0bWwvcmVuZGVyaW5nL3JlbmRlcl9hcHBsZXQuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtodG1sL3JlbmRlcmluZy9yZW5kZXJfYXBwbGV0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNyArMjcsNyBAQAogCiAjaW5jbHVkZSAicmVuZGVyaW5nL3JlbmRlcl9hcHBsZXQuaCIK
ICNpbmNsdWRlICJyZW5kZXJpbmcvcmVuZGVyX2NhbnZhcy5oIgotI2luY2x1ZGUgInhtbC9kb21f
ZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgIkZyYW1lLmgi
CiAKICNpZm5kZWYgUV9XU19RV1MgLy8gV2UgZG9uJ3QgaGF2ZSBKYXZhIGluIFF0IEVtYmVkZGVk
CkluZGV4OiBraHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBr
aHRtbC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBraHRt
bC9yZW5kZXJpbmcvcmVuZGVyX2Jsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjks
NyBAQAogI2luY2x1ZGUgInJlbmRlcmluZy9yZW5kZXJfdGFibGUuaCIKICNpbmNsdWRlICJyZW5k
ZXJpbmcvcmVuZGVyX2NhbnZhcy5oIgogI2luY2x1ZGUgInhtbC9kb21fbm9kZWltcGwuaCIKLSNp
bmNsdWRlICJ4bWwvZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNp
bmNsdWRlICJ4bWwvZG9tX3Bvc2l0aW9uLmgiCiAjaW5jbHVkZSAicmVuZGVyX2Jsb2NrLmgiCiAj
aW5jbHVkZSAiZWRpdGluZy9TZWxlY3Rpb25Db250cm9sbGVyLmgiCkluZGV4OiBXZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS54Y29kZXByb2ov
cHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAxMjAyMSkKKysrIFdlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTY5LDcgKzE2OSw2IEBACiAJCTkzRjE5
OTE4MDgyNDVFNTkwMDFFOUFCQyAvKiBkb20yX3JhbmdlaW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QzMDQwMkRFNDQ3NjAxODYzNUNBIC8q
IGRvbTJfcmFuZ2VpbXBsLmggKi87IH07CiAJCTkzRjE5OTE5MDgyNDVFNTkwMDFFOUFCQyAvKiBk
b20yX3RyYXZlcnNhbGltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEY1MjNEMzA2MDJERTQ0NzYwMTg2MzVDQSAvKiBkb20yX3RyYXZlcnNhbGltcGwu
aCAqLzsgfTsKIAkJOTNGMTk5MUEwODI0NUU1OTAwMUU5QUJDIC8qIGRvbTJfdmlld3NpbXBsLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDMwODAy
REU0NDc2MDE4NjM1Q0EgLyogZG9tMl92aWV3c2ltcGwuaCAqLzsgfTsKLQkJOTNGMTk5MUIwODI0
NUU1OTAwMUU5QUJDIC8qIGRvbV9kb2NpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGNTAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2RvY2lt
cGwuaCAqLzsgfTsKIAkJOTNGMTk5MUMwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9lbGVtZW50aW1w
bC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0Qy
RjgwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1wbC5oICovOyB9OwogCQk5M0YxOTkx
RDA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX25vZGVpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGQTAyREU0NDc2MDE4NjM1Q0EgLyogZG9t
X25vZGVpbXBsLmggKi87IH07CiAJCTkzRjE5OTFFMDgyNDVFNTkwMDFFOUFCQyAvKiBkb21fc3Ry
aW5naW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RjUyM0QyRkMwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9zdHJpbmdpbXBsLmggKi87IH07CkBAIC00
ODMsNyArNDgyLDYgQEAKIAkJOTNGMTlBQUUwODI0NUU1OTAwMUU5QUJDIC8qIHJlbmRlcl9yZXBs
YWNlZC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBG
NTIzRDJCRDAyREU0NDM4MDE4NjM1Q0EgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCAqLzsgfTsKIAkJ
OTNGMTlBQUYwODI0NUU1OTAwMUU5QUJDIC8qIHJlbmRlcl9zdHlsZS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJDMjAyREU0NDM4MDE4NjM1
Q0EgLyogcmVuZGVyX3N0eWxlLmNwcCAqLzsgfTsKIAkJOTNGMTlBQjAwODI0NUU1OTAwMUU5QUJD
IC8qIHJlbmRlcl90YWJsZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBGNTIzRDJDNDAyREU0NDM4MDE4NjM1Q0EgLyogcmVuZGVyX3RhYmxlLmNwcCAq
LzsgfTsKLQkJOTNGMTlBQjIwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9kb2NpbXBsLmNwcCBpbiBT
b3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkY0MDJERTQ0
NzYwMTg2MzVDQSAvKiBkb21fZG9jaW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QUIzMDgyNDVFNTkw
MDFFOUFCQyAvKiBkb21fZWxlbWVudGltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyRjcwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVt
ZW50aW1wbC5jcHAgKi87IH07CiAJCTkzRjE5QUI0MDgyNDVFNTkwMDFFOUFCQyAvKiBkb21fbm9k
ZWltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
RjUyM0QyRjkwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5jcHAgKi87IH07CiAJCTkz
RjE5QUI1MDgyNDVFNTkwMDFFOUFCQyAvKiBkb21fc3RyaW5naW1wbC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGQjAyREU0NDc2MDE4NjM1
Q0EgLyogZG9tX3N0cmluZ2ltcGwuY3BwICovOyB9OwpAQCAtNjc5LDYgKzY3NywyMiBAQAogCQlB
ODE2NTVENTA5NkJCRUFDMDA2MDEwNTggLyogS0NhbnZhc01hc2tlclF1YXJ0ei5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTY1NUQzMDk2QkJFQUMw
MDYwMTA1OCAvKiBLQ2FudmFzTWFza2VyUXVhcnR6Lm1tICovOyB9OwogCQlBODE2NTVFNDA5NkJD
MTM5MDA2MDEwNTggLyogU1ZHTWFza0VsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTY1NUUyMDk2QkMxMzkwMDYwMTA1OCAvKiBT
VkdNYXNrRWxlbWVudEltcGwuY3BwICovOyB9OwogCQlBODE2NTVFNTA5NkJDMTM5MDA2MDEwNTgg
LyogU1ZHTWFza0VsZW1lbnRJbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBODE2NTVFMzA5NkJDMTM5MDA2MDEwNTggLyogU1ZHTWFza0VsZW1lbnRJ
bXBsLmggKi87IH07CisJCUE4MTg1RjM5MDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudFR5cGVJ
bXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4
NUYzMTA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRUeXBlSW1wbC5oICovOyB9OworCQlBODE4
NUYzQTA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRUeXBlSW1wbC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NUYzMjA5NzY1NzY1MDA1ODI2
RDkgLyogRG9jdW1lbnRUeXBlSW1wbC5jcHAgKi87IH07CisJCUE4MTg1RjNCMDk3NjU3NjYwMDU4
MjZEOSAvKiBET01JbXBsZW1lbnRhdGlvbkltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjMzMDk3NjU3NjUwMDU4MjZEOSAvKiBET01JbXBs
ZW1lbnRhdGlvbkltcGwuaCAqLzsgfTsKKwkJQTgxODVGM0MwOTc2NTc2NjAwNTgyNkQ5IC8qIERv
Y3VtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSBBODE4NUYzNDA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRJbXBsLmNwcCAqLzsgfTsK
KwkJQTgxODVGM0QwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50RnJhZ21lbnRJbXBsLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NUYzNTA5NzY1
NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVudEltcGwuaCAqLzsgfTsKKwkJQTgxODVGM0Uw
OTc2NTc2NjAwNTgyNkQ5IC8qIERPTUltcGxlbWVudGF0aW9uSW1wbC5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODE4NUYzNjA5NzY1NzY1MDA1ODI2
RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcCAqLzsgfTsKKwkJQTgxODVGM0YwOTc2NTc2
NjAwNTgyNkQ5IC8qIERvY3VtZW50RnJhZ21lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjM3MDk3NjU3NjUwMDU4MjZEOSAvKiBE
b2N1bWVudEZyYWdtZW50SW1wbC5jcHAgKi87IH07CisJCUE4MTg1RjQwMDk3NjU3NjYwMDU4MjZE
OSAvKiBEb2N1bWVudEltcGwuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IEE4MTg1RjM4MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEltcGwuaCAqLzsg
fTsKKwkJQTgxODVGNDEwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZUltcGwuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjMxMDk3NjU3
NjUwMDU4MjZEOSAvKiBEb2N1bWVudFR5cGVJbXBsLmggKi87IH07CisJCUE4MTg1RjQyMDk3NjU3
NjYwMDU4MjZEOSAvKiBEb2N1bWVudFR5cGVJbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjMyMDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1
bWVudFR5cGVJbXBsLmNwcCAqLzsgfTsKKwkJQTgxODVGNDMwOTc2NTc2NjAwNTgyNkQ5IC8qIERP
TUltcGxlbWVudGF0aW9uSW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQTgxODVGMzMwOTc2NTc2NTAwNTgyNkQ5IC8qIERPTUltcGxlbWVudGF0aW9u
SW1wbC5oICovOyB9OworCQlBODE4NUY0NDA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRJbXBs
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1
RjM0MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEltcGwuY3BwICovOyB9OworCQlBODE4NUY0
NTA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVudEltcGwuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjM1MDk3NjU3NjUwMDU4MjZE
OSAvKiBEb2N1bWVudEZyYWdtZW50SW1wbC5oICovOyB9OworCQlBODE4NUY0NjA5NzY1NzY2MDA1
ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEE4MTg1RjM2MDk3NjU3NjUwMDU4MjZEOSAvKiBET01J
bXBsZW1lbnRhdGlvbkltcGwuY3BwICovOyB9OworCQlBODE4NUY0NzA5NzY1NzY2MDA1ODI2RDkg
LyogRG9jdW1lbnRGcmFnbWVudEltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQTgxODVGMzcwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50RnJh
Z21lbnRJbXBsLmNwcCAqLzsgfTsKKwkJQTgxODVGNDgwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3Vt
ZW50SW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50SW1wbC5oICovOyB9OwogCQlBODJC
OENBQzA5NzEyQzJDMDAyN0UzREUgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggaW4gSGVhZGVycyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBODJCOENBNjA5NzEyQzJDMDAyN0Uz
REUgLyogUmVuZGVyVGV4dEZyYWdtZW50LmggKi87IH07CiAJCUE4MkI4Q0FEMDk3MTJDMkMwMDI3
RTNERSAvKiBSZW5kZXJUZXh0RnJhZ21lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQTgyQjhDQTcwOTcxMkMyQzAwMjdFM0RFIC8qIFJlbmRlclRl
eHRGcmFnbWVudC5jcHAgKi87IH07CiAJCUE4MkI4Q0FFMDk3MTJDMkMwMDI3RTNERSAvKiBSZW5k
ZXJUZXh0LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBB
ODJCOENBODA5NzEyQzJDMDAyN0UzREUgLyogUmVuZGVyVGV4dC5oICovOyB9OwpAQCAtNzY1LDcg
Kzc3OSw2IEBACiAJCUE4OEFEMTYzMDk1MjQ4MEEwMDFERDE5NiAvKiBkb20yX3JhbmdlaW1wbC5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRjUyM0QzMDQw
MkRFNDQ3NjAxODYzNUNBIC8qIGRvbTJfcmFuZ2VpbXBsLmggKi87IH07CiAJCUE4OEFEMTY0MDk1
MjQ4MEEwMDFERDE5NiAvKiBkb20yX3RyYXZlcnNhbGltcGwuaCBpbiBIZWFkZXJzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMzA2MDJERTQ0NzYwMTg2MzVDQSAvKiBk
b20yX3RyYXZlcnNhbGltcGwuaCAqLzsgfTsKIAkJQTg4QUQxNjUwOTUyNDgwQTAwMUREMTk2IC8q
IGRvbTJfdmlld3NpbXBsLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBGNTIzRDMwODAyREU0NDc2MDE4NjM1Q0EgLyogZG9tMl92aWV3c2ltcGwuaCAqLzsg
fTsKLQkJQTg4QUQxNjYwOTUyNDgwQTAwMUREMTk2IC8qIGRvbV9kb2NpbXBsLmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGNTAyREU0NDc2MDE4
NjM1Q0EgLyogZG9tX2RvY2ltcGwuaCAqLzsgfTsKIAkJQTg4QUQxNjcwOTUyNDgwQTAwMUREMTk2
IC8qIGRvbV9lbGVtZW50aW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gRjUyM0QyRjgwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9lbGVtZW50aW1wbC5o
ICovOyB9OwogCQlBODhBRDE2ODA5NTI0ODBBMDAxREQxOTYgLyogZG9tX25vZGVpbXBsLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGQTAyREU0
NDc2MDE4NjM1Q0EgLyogZG9tX25vZGVpbXBsLmggKi87IH07CiAJCUE4OEFEMTY5MDk1MjQ4MEEw
MDFERDE5NiAvKiBkb21fc3RyaW5naW1wbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRjUyM0QyRkMwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9zdHJpbmdp
bXBsLmggKi87IH07CkBAIC0xMTIxLDcgKzExMzQsNiBAQAogCQlBODhBRDJGMDA5NTI0ODBBMDAx
REQxOTYgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkJEMDJERTQ0MzgwMTg2MzVDQSAvKiByZW5kZXJfcmVw
bGFjZWQuY3BwICovOyB9OwogCQlBODhBRDJGMTA5NTI0ODBBMDAxREQxOTYgLyogcmVuZGVyX3N0
eWxlLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1
MjNEMkMyMDJERTQ0MzgwMTg2MzVDQSAvKiByZW5kZXJfc3R5bGUuY3BwICovOyB9OwogCQlBODhB
RDJGMjA5NTI0ODBBMDAxREQxOTYgLyogcmVuZGVyX3RhYmxlLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1MjNEMkM0MDJERTQ0MzgwMTg2MzVDQSAv
KiByZW5kZXJfdGFibGUuY3BwICovOyB9OwotCQlBODhBRDJGNDA5NTI0ODBBMDAxREQxOTYgLyog
ZG9tX2RvY2ltcGwuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gRjUyM0QyRjQwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9kb2NpbXBsLmNwcCAqLzsgfTsK
IAkJQTg4QUQyRjUwOTUyNDgwQTAwMUREMTk2IC8qIGRvbV9lbGVtZW50aW1wbC5jcHAgaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGNzAyREU0NDc2
MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmNwcCAqLzsgfTsKIAkJQTg4QUQyRjYwOTUyNDgw
QTAwMUREMTk2IC8qIGRvbV9ub2RlaW1wbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSBGNTIzRDJGOTAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX25vZGVp
bXBsLmNwcCAqLzsgfTsKIAkJQTg4QUQyRjcwOTUyNDgwQTAwMUREMTk2IC8qIGRvbV9zdHJpbmdp
bXBsLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEY1
MjNEMkZCMDJERTQ0NzYwMTg2MzVDQSAvKiBkb21fc3RyaW5naW1wbC5jcHAgKi87IH07CkBAIC0y
MDM2LDYgKzIwNDgsMTQgQEAKIAkJQTgxNjU1RDMwOTZCQkVBQzAwNjAxMDU4IC8qIEtDYW52YXNN
YXNrZXJRdWFydHoubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0g
S0NhbnZhc01hc2tlclF1YXJ0ei5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTgx
NjU1RTIwOTZCQzEzOTAwNjAxMDU4IC8qIFNWR01hc2tFbGVtZW50SW1wbC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU1ZHTWFza0VsZW1lbnRJbXBsLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQTgxNjU1RTMwOTZCQzEzOTAwNjAxMDU4IC8qIFNW
R01hc2tFbGVtZW50SW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU1ZH
TWFza0VsZW1lbnRJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTg1RjMx
MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudFR5cGVJbXBsLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBEb2N1bWVudFR5cGVJbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCUE4MTg1RjMyMDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudFR5cGVJbXBsLmNw
cCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBEb2N1bWVudFR5cGVJbXBs
LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxODVGMzMwOTc2NTc2NTAwNTgy
NkQ5IC8qIERPTUltcGxlbWVudGF0aW9uSW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5o
OyBwYXRoID0gRE9NSW1wbGVtZW50YXRpb25JbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUE4MTg1RjM0MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEltcGwuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxl
VHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IERvY3VtZW50SW1wbC5jcHA7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUE4MTg1RjM1MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1
bWVudEZyYWdtZW50SW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRG9j
dW1lbnRGcmFnbWVudEltcGwuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxODVG
MzYwOTc2NTc2NTAwNTgyNkQ5IC8qIERPTUltcGxlbWVudGF0aW9uSW1wbC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQTgxODVGMzcwOTc2NTc2NTAwNTgyNkQ5IC8q
IERvY3VtZW50RnJhZ21lbnRJbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IHBhdGggPSBEb2N1bWVudEZyYWdtZW50SW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CisJCUE4MTg1RjM4MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEltcGwuaCAqLyA9IHtp
c2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERvY3VtZW50SW1wbC5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQlBODIzMzZCMTA5NEMyM0JFMDA4NUEyOTYgLyogRGF0YVJlZi5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGluZGVudFdpZHRo
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERhdGFSZWYu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07
CiAJCUE4MkI4Q0E2MDk3MTJDMkMwMDI3RTNERSAvKiBSZW5kZXJUZXh0RnJhZ21lbnQuaCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFJlbmRlclRleHRGcmFnbWVudC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBODJCOENBNzA5NzEyQzJDMDAyN0UzREUgLyogUmVu
ZGVyVGV4dEZyYWdtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5j
b2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGgg
PSBSZW5kZXJUZXh0RnJhZ21lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAt
MjYwNSw4ICsyNjI1LDYgQEAKIAkJRjUyM0QyQzMwMkRFNDQzODAxODYzNUNBIC8qIHJlbmRlcl9z
dHlsZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBp
bmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSByZW5kZXJfc3R5bGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGggPSA4OyB1
c2VzVGFicyA9IDA7IH07CiAJCUY1MjNEMkM0MDJERTQ0MzgwMTg2MzVDQSAvKiByZW5kZXJfdGFi
bGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBp
bmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBw
YXRoID0gcmVuZGVyX3RhYmxlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGgg
PSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCUY1MjNEMkM1MDJERTQ0MzgwMTg2MzVDQSAvKiByZW5k
ZXJfdGFibGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gcmVuZGVyX3RhYmxlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0g
ODsgdXNlc1RhYnMgPSAwOyB9OwotCQlGNTIzRDJGNDAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2Rv
Y2ltcGwuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMw
OyBpbmRlbnRXaWR0aCA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3Bw
OyBwYXRoID0gZG9tX2RvY2ltcGwuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB0YWJXaWR0
aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKLQkJRjUyM0QyRjUwMkRFNDQ3NjAxODYzNUNBIC8qIGRv
bV9kb2NpbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
MzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IGRvbV9kb2NpbXBsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0g
ODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDJGNzAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2Vs
ZW1lbnRpbXBsLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgaW5kZW50V2lkdGggPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IGRvbV9lbGVtZW50aW1wbC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwogCQlGNTIzRDJGODAyREU0NDc2MDE4NjM1
Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IGRvbV9lbGVtZW50aW1wbC5oOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKIAkJRjUyM0QyRjkwMkRFNDQ3NjAx
ODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBkb21fbm9kZWltcGwuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB0YWJXaWR0aCA9IDg7IHVzZXNUYWJzID0gMDsgfTsKQEAgLTQwMzUsOCArNDA1
Myw2IEBACiAJCQkJQkMzQjM2NDUwNUM5RDVFMjAwRTQyOTAyIC8qIGRvbV9hdG9taWNzdHJpbmcu
Y3BwICovLAogCQkJCUJDM0IzNjQ2MDVDOUQ1RTIwMEU0MjkwMiAvKiBkb21fYXRvbWljc3RyaW5n
LmggKi8sCiAJCQkJQkMzQjM2NDcwNUM5RDVFMjAwRTQyOTAyIC8qIGRvbV9hdG9taWNzdHJpbmds
aXN0LmggKi8sCi0JCQkJRjUyM0QyRjQwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9kb2NpbXBsLmNw
cCAqLywKLQkJCQlGNTIzRDJGNTAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2RvY2ltcGwuaCAqLywK
IAkJCQlGNTIzRDJGNzAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmNwcCAqLywK
IAkJCQlGNTIzRDJGODAyREU0NDc2MDE4NjM1Q0EgLyogZG9tX2VsZW1lbnRpbXBsLmggKi8sCiAJ
CQkJRjUyM0QyRjkwMkRFNDQ3NjAxODYzNUNBIC8qIGRvbV9ub2RlaW1wbC5jcHAgKi8sCkBAIC00
MDU5LDYgKzQwNzUsMTQgQEAKIAkJCQlGNTIzRDMwODAyREU0NDc2MDE4NjM1Q0EgLyogZG9tMl92
aWV3c2ltcGwuaCAqLywKIAkJCQlGNTIzRDMwOTAyREU0NDc2MDE4NjM1Q0EgLyogeG1sX3Rva2Vu
aXplci5jcHAgKi8sCiAJCQkJRjUyM0QzMEEwMkRFNDQ3NjAxODYzNUNBIC8qIHhtbF90b2tlbml6
ZXIuaCAqLywKKwkJCQlBODE4NUYzMjA5NzY1NzY1MDA1ODI2RDkgLyogRG9jdW1lbnRUeXBlSW1w
bC5jcHAgKi8sCisJCQkJQTgxODVGMzEwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZUlt
cGwuaCAqLywKKwkJCQlBODE4NUYzNjA5NzY1NzY1MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRp
b25JbXBsLmNwcCAqLywKKwkJCQlBODE4NUYzMzA5NzY1NzY1MDA1ODI2RDkgLyogRE9NSW1wbGVt
ZW50YXRpb25JbXBsLmggKi8sCisJCQkJQTgxODVGMzQwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3Vt
ZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxODVGMzgwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50
SW1wbC5oICovLAorCQkJCUE4MTg1RjM3MDk3NjU3NjUwMDU4MjZEOSAvKiBEb2N1bWVudEZyYWdt
ZW50SW1wbC5jcHAgKi8sCisJCQkJQTgxODVGMzUwOTc2NTc2NTAwNTgyNkQ5IC8qIERvY3VtZW50
RnJhZ21lbnRJbXBsLmggKi8sCiAJCQkpOwogCQkJcGF0aCA9IHhtbDsKIAkJCXNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7CkBAIC00NDMzLDcgKzQ0NTcsNiBAQAogCQkJCTkzRjE5OTE4MDgyNDVFNTkw
MDFFOUFCQyAvKiBkb20yX3JhbmdlaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTNGMTk5MTkw
ODI0NUU1OTAwMUU5QUJDIC8qIGRvbTJfdHJhdmVyc2FsaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJ
CQkJOTNGMTk5MUEwODI0NUU1OTAwMUU5QUJDIC8qIGRvbTJfdmlld3NpbXBsLmggaW4gSGVhZGVy
cyAqLywKLQkJCQk5M0YxOTkxQjA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX2RvY2ltcGwuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTkzRjE5OTFDMDgyNDVFNTkwMDFFOUFCQyAvKiBkb21fZWxlbWVudGlt
cGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OTFEMDgyNDVFNTkwMDFFOUFCQyAvKiBkb21f
bm9kZWltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzRjE5OTFFMDgyNDVFNTkwMDFFOUFCQyAv
KiBkb21fc3RyaW5naW1wbC5oIGluIEhlYWRlcnMgKi8sCkBAIC00ODc3LDYgKzQ5MDAsMTAgQEAK
IAkJCQlGQUUwNDE5MDA5NzU5NkM5MDAwNTQwQkUgLyogU1ZHSW1hZ2VMb2FkZXIuaCBpbiBIZWFk
ZXJzICovLAogCQkJCTY1Q0JGRUZBMDk3NEY2MDcwMDFEQUMyNSAvKiBGcmFtZVZpZXcuaCBpbiBI
ZWFkZXJzICovLAogCQkJCTFBM0Q4NTU3MDk3NjQ3QjUwMDJDODVEMSAvKiBPYmplY3RDb250ZW50
cy5oIGluIEhlYWRlcnMgKi8sCisJCQkJQTgxODVGMzkwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3Vt
ZW50VHlwZUltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg1RjNCMDk3NjU3NjYwMDU4MjZE
OSAvKiBET01JbXBsZW1lbnRhdGlvbkltcGwuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg1RjNE
MDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudEZyYWdtZW50SW1wbC5oIGluIEhlYWRlcnMgKi8s
CisJCQkJQTgxODVGNDAwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50SW1wbC5oIGluIEhlYWRl
cnMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7
CiAJCX07CkBAIC00OTU2LDcgKzQ5ODMsNiBAQAogCQkJCUE4OEFEMTYzMDk1MjQ4MEEwMDFERDE5
NiAvKiBkb20yX3JhbmdlaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg4QUQxNjQwOTUyNDgw
QTAwMUREMTk2IC8qIGRvbTJfdHJhdmVyc2FsaW1wbC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQTg4
QUQxNjUwOTUyNDgwQTAwMUREMTk2IC8qIGRvbTJfdmlld3NpbXBsLmggaW4gSGVhZGVycyAqLywK
LQkJCQlBODhBRDE2NjA5NTI0ODBBMDAxREQxOTYgLyogZG9tX2RvY2ltcGwuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUE4OEFEMTY3MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fZWxlbWVudGltcGwuaCBp
biBIZWFkZXJzICovLAogCQkJCUE4OEFEMTY4MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fbm9kZWlt
cGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4OEFEMTY5MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21f
c3RyaW5naW1wbC5oIGluIEhlYWRlcnMgKi8sCkBAIC01MjEwLDYgKzUyMzYsMTAgQEAKIAkJCQlB
ODEzNjlGRTA5NzM3NEY2MDBENzQ0NjMgLyogSFRNTExhYmVsRWxlbWVudEltcGwuaCBpbiBIZWFk
ZXJzICovLAogCQkJCUE4MTM2QTAwMDk3Mzc0RjYwMEQ3NDQ2MyAvKiBIVE1MS2V5Z2VuRWxlbWVu
dEltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4MTM2RDNBMDk3M0E4RTcwMEQ3NDQ2MyAvKiBG
b3JtRGF0YUxpc3QuaCBpbiBIZWFkZXJzICovLAorCQkJCUE4MTg1RjQxMDk3NjU3NjYwMDU4MjZE
OSAvKiBEb2N1bWVudFR5cGVJbXBsLmggaW4gSGVhZGVycyAqLywKKwkJCQlBODE4NUY0MzA5NzY1
NzY2MDA1ODI2RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmggaW4gSGVhZGVycyAqLywKKwkJ
CQlBODE4NUY0NTA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRGcmFnbWVudEltcGwuaCBpbiBI
ZWFkZXJzICovLAorCQkJCUE4MTg1RjQ4MDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudEltcGwu
aCBpbiBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nl
c3NpbmcgPSAwOwogCQl9OwpAQCAtNjQxOSw3ICs2NDQ5LDYgQEAKIAkJCQk5M0YxOUFBRTA4MjQ1
RTU5MDAxRTlBQkMgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkz
RjE5QUFGMDgyNDVFNTkwMDFFOUFCQyAvKiByZW5kZXJfc3R5bGUuY3BwIGluIFNvdXJjZXMgKi8s
CiAJCQkJOTNGMTlBQjAwODI0NUU1OTAwMUU5QUJDIC8qIHJlbmRlcl90YWJsZS5jcHAgaW4gU291
cmNlcyAqLywKLQkJCQk5M0YxOUFCMjA4MjQ1RTU5MDAxRTlBQkMgLyogZG9tX2RvY2ltcGwuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJOTNGMTlBQjMwODI0NUU1OTAwMUU5QUJDIC8qIGRvbV9lbGVt
ZW50aW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQk5M0YxOUFCNDA4MjQ1RTU5MDAxRTlBQkMg
LyogZG9tX25vZGVpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzRjE5QUI1MDgyNDVFNTkw
MDFFOUFCQyAvKiBkb21fc3RyaW5naW1wbC5jcHAgaW4gU291cmNlcyAqLywKQEAgLTY3NDcsNiAr
Njc3NiwxMCBAQAogCQkJCUZBRTA0MThDMDk3NTk2OTQwMDA1NDBCRSAvKiBSZW5kZXJTVkdJbWFn
ZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlGQUUwNDE4RjA5NzU5NkM5MDAwNTQwQkUgLyogU1ZH
SW1hZ2VMb2FkZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNjVDQkZFRjkwOTc0RjYwNzAwMURB
QzI1IC8qIEZyYW1lVmlldy5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODE4NUYzQTA5NzY1NzY2
MDA1ODI2RDkgLyogRG9jdW1lbnRUeXBlSW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODE4
NUYzQzA5NzY1NzY2MDA1ODI2RDkgLyogRG9jdW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAor
CQkJCUE4MTg1RjNFMDk3NjU3NjYwMDU4MjZEOSAvKiBET01JbXBsZW1lbnRhdGlvbkltcGwuY3Bw
IGluIFNvdXJjZXMgKi8sCisJCQkJQTgxODVGM0YwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50
RnJhZ21lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBs
b3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpAQCAtNjg3Myw3ICs2OTA2LDYgQEAKIAkJ
CQlBODhBRDJGMDA5NTI0ODBBMDAxREQxOTYgLyogcmVuZGVyX3JlcGxhY2VkLmNwcCBpbiBTb3Vy
Y2VzICovLAogCQkJCUE4OEFEMkYxMDk1MjQ4MEEwMDFERDE5NiAvKiByZW5kZXJfc3R5bGUuY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkJQTg4QUQyRjIwOTUyNDgwQTAwMUREMTk2IC8qIHJlbmRlcl90
YWJsZS5jcHAgaW4gU291cmNlcyAqLywKLQkJCQlBODhBRDJGNDA5NTI0ODBBMDAxREQxOTYgLyog
ZG9tX2RvY2ltcGwuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQTg4QUQyRjUwOTUyNDgwQTAwMURE
MTk2IC8qIGRvbV9lbGVtZW50aW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODhBRDJGNjA5
NTI0ODBBMDAxREQxOTYgLyogZG9tX25vZGVpbXBsLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUE4
OEFEMkY3MDk1MjQ4MEEwMDFERDE5NiAvKiBkb21fc3RyaW5naW1wbC5jcHAgaW4gU291cmNlcyAq
LywKQEAgLTcwMjQsNiArNzA1NiwxMCBAQAogCQkJCUE4MTM2OUZGMDk3Mzc0RjYwMEQ3NDQ2MyAv
KiBIVE1MTGFiZWxFbGVtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlBODEzNkEwMTA5
NzM3NEY2MDBENzQ0NjMgLyogSFRNTEtleWdlbkVsZW1lbnRJbXBsLmNwcCBpbiBTb3VyY2VzICov
LAogCQkJCUE4MTM2RDNCMDk3M0E4RTcwMEQ3NDQ2MyAvKiBGb3JtRGF0YUxpc3QuY3BwIGluIFNv
dXJjZXMgKi8sCisJCQkJQTgxODVGNDIwOTc2NTc2NjAwNTgyNkQ5IC8qIERvY3VtZW50VHlwZUlt
cGwuY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJQTgxODVGNDQwOTc2NTc2NjAwNTgyNkQ5IC8qIERv
Y3VtZW50SW1wbC5jcHAgaW4gU291cmNlcyAqLywKKwkJCQlBODE4NUY0NjA5NzY1NzY2MDA1ODI2
RDkgLyogRE9NSW1wbGVtZW50YXRpb25JbXBsLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCUE4MTg1
RjQ3MDk3NjU3NjYwMDU4MjZEOSAvKiBEb2N1bWVudEZyYWdtZW50SW1wbC5jcHAgaW4gU291cmNl
cyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsK
IAkJfTsKSW5kZXg6IGtjYW52YXMvUmVuZGVyU1ZHVGV4dC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtjYW52
YXMvUmVuZGVyU1ZHVGV4dC5oCShyZXZpc2lvbiAxMjAyMSkKKysrIGtjYW52YXMvUmVuZGVyU1ZH
VGV4dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIHRoZSBLREUgcHJvamVjdC4KKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBX
ZWJLaXQgcHJvamVjdC4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIs
IEluYy4KICAqCkBAIC00Miw0ICs0Miw0IEBAIHB1YmxpYzoKICAgICB2b2lkIHRyYW5zbGF0ZUZv
ckF0dHJpYnV0ZXMoKTsKIH07CiAKLSNlbmRpZiBSZW5kZXJTVkdUZXh0X0gKKyNlbmRpZgpJbmRl
eDoga2NhbnZhcy9LQ2FudmFzUmVzb3VyY2VzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrY2FudmFzL0tD
YW52YXNSZXNvdXJjZXMuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtjYW52YXMvS0NhbnZhc1Jl
c291cmNlcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUg
PHF0ZXh0c3RyZWFtLmg+CiAjaW5jbHVkZSAiS0NhbnZhc1RyZWVEZWJ1Zy5oIgotI2luY2x1ZGUg
ImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKIFFUZXh0U3RyZWFt
ICZvcGVyYXRvcjw8KFFUZXh0U3RyZWFtICZ0cywgY29uc3QgS0NhbnZhc1Jlc291cmNlICZyKSAK
IHsgCkluZGV4OiBicmlkZ2UvbWFjL1dlYkNvcmVCcmlkZ2UubW0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gYnJp
ZGdlL21hYy9XZWJDb3JlQnJpZGdlLm1tCShyZXZpc2lvbiAxMjAyMSkKKysrIGJyaWRnZS9tYWMv
V2ViQ29yZUJyaWRnZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMzEsNyArMzEsNyBAQAogI2ltcG9y
dCAiZG9tMl9yYW5nZS5oIgogI2ltcG9ydCAiZG9tMl9yYW5nZWltcGwuaCIKICNpbXBvcnQgImRv
bTJfdmlld3NpbXBsLmgiCi0jaW1wb3J0ICJkb21fZG9jaW1wbC5oIgorI2ltcG9ydCAiRG9jdW1l
bnRUeXBlSW1wbC5oIgogI2ltcG9ydCAiZG9tX25vZGUuaCIKICNpbXBvcnQgImRvbV9ub2RlaW1w
bC5oIgogI2ltcG9ydCAiZG9tX3Bvc2l0aW9uLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHU3R5bGVF
bGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR1N0eWxlRWxlbWVudElt
cGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcyL3N2Zy9TVkdTdHlsZUVsZW1lbnRJbXBs
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1ZGUgPGtkb20va2Rv
bS5oPgogI2luY2x1ZGUgPGtkb20vRE9NU3RyaW5nLmg+CiAjaW5jbHVkZSA8a2RvbS9jc3MvTWVk
aWFMaXN0SW1wbC5oPgotI2luY2x1ZGUgPGtkb20vY29yZS9Eb2N1bWVudEltcGwuaD4KKyNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlIDxrZG9tL2Nzcy9DU1NTdHlsZVNoZWV0SW1w
bC5oPgogCiAjaW5jbHVkZSAiU1ZHU3R5bGVFbGVtZW50SW1wbC5oIgpJbmRleDoga3N2ZzIvc3Zn
L1NWR1N0eWxlZEVsZW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHU3R5
bGVkRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcyL3N2Zy9TVkdTdHls
ZWRFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNs
dWRlIDxrZG9tL2NvcmUvQXR0ckltcGwuaD4KICNpbmNsdWRlIDxrZG9tL2NvcmUvZG9tYXR0cnMu
aD4KICNpbmNsdWRlIDxrZG9tL0RPTVN0cmluZy5oPgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5o
IgogCiAjaW5jbHVkZSA8a3htbGNvcmUvQXNzZXJ0aW9ucy5oPgogCkluZGV4OiBrc3ZnMi9zdmcv
U1ZHUGF0dGVybkVsZW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHUGF0
dGVybkVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBrc3ZnMi9zdmcvU1ZHUGF0
dGVybkVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsNiArMjIsNyBAQAogCiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHJJbXBsLmg+CisjaW5j
bHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXMuaD4KICNp
bmNsdWRlIDxrY2FudmFzL0tDYW52YXNNYXRyaXguaD4KSW5kZXg6IGtzdmcyL3N2Zy9TVkdGRUlt
YWdlRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdGRUltYWdlRWxl
bWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcyL3N2Zy9TVkdGRUltYWdlRWxl
bWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8
a2RvbS9jb3JlL0F0dHJJbXBsLmg+CiAjaW5jbHVkZSA8a2RvbS9jYWNoZS9LRE9NTG9hZGVyLmg+
CiAjaW5jbHVkZSA8a2RvbS9jYWNoZS9LRE9NQ2FjaGVkT2JqZWN0Lmg+Ci0jaW5jbHVkZSAiZG9t
X2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJEb2NMb2Fk
ZXIuaCIKIAogI2luY2x1ZGUgIlNWR05hbWVzLmgiCkluZGV4OiBrc3ZnMi9zdmcvU1ZHQW5pbWF0
aW9uRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdBbmltYXRpb25F
bGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga3N2ZzIvc3ZnL1NWR0FuaW1hdGlv
bkVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsOCArMjUsOCBAQAogCiAjaW5j
bHVkZSA8a2RvbS9rZG9tLmg+CiAjaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHJJbXBsLmg+Ci0jaW5j
bHVkZSA8a2RvbS9jb3JlL0RvY3VtZW50SW1wbC5oPgotI2luY2x1ZGUgPGtkb20vY29yZS9ET01J
bXBsZW1lbnRhdGlvbkltcGwuaD4KKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKKyNpbmNsdWRl
ICJET01JbXBsZW1lbnRhdGlvbkltcGwuaCIKICNpbmNsdWRlIDxrZG9tL2Nzcy9DU1NTdHlsZURl
Y2xhcmF0aW9uSW1wbC5oPgogI2luY2x1ZGUgPGtkb20vRE9NU3RyaW5nLmg+CiAKSW5kZXg6IGtz
dmcyL3N2Zy9TVkdTdG9wRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9T
VkdTdG9wRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcyL3N2Zy9TVkdT
dG9wRWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMiw2ICsyMiw3IEBACiAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlIDxrZG9tL2NvcmUvQXR0ckltcGwuaD4KKyNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhcy5oPgogI2lu
Y2x1ZGUgPGtjYW52YXMvZGV2aWNlL0tSZW5kZXJpbmdQYWludFNlcnZlckdyYWRpZW50Lmg+Cklu
ZGV4OiBrc3ZnMi9zdmcvU1ZHRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2
Zy9TVkdFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga3N2ZzIvc3ZnL1NWR0Vs
ZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUg
PGtkb20vY29yZS9BdHRySW1wbC5oPgogI2luY2x1ZGUgPGtkb20vY3NzL0NTU1N0eWxlU2hlZXRJ
bXBsLmg+CiAjaW5jbHVkZSA8a2RvbS9ldmVudHMvRXZlbnRMaXN0ZW5lckltcGwuaD4KKyNpbmNs
dWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgImtzdmcuaCIKICNpbmNsdWRlICJTVkdO
YW1lcy5oIgpJbmRleDoga3N2ZzIvc3ZnL1NWR0dyYWRpZW50RWxlbWVudEltcGwuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdHcmFkaWVudEVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24g
MTIwMjEpCisrKyBrc3ZnMi9zdmcvU1ZHR3JhZGllbnRFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlIDxr
ZG9tL2NvcmUvQXR0ckltcGwuaD4KICNpbmNsdWRlIDxrZG9tL2Nzcy9DU1NTdHlsZVNlbGVjdG9y
Lmg+CisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAKICNpbmNsdWRlICJrc3ZnLmgiCiAjaW5j
bHVkZSAiU1ZHTmFtZXMuaCIKSW5kZXg6IGtzdmcyL3N2Zy9TVkdBRWxlbWVudEltcGwuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9TVkdBRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAy
MSkKKysrIGtzdmcyL3N2Zy9TVkdBRWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0y
Nyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8a2RvbS9IZWxwZXIuaD4KICNpbmNsdWRlICJ4bWwvZG9t
Ml9ldmVudHNpbXBsLmgiCiAjaW5jbHVkZSAiY3NzaGVscGVyLmgiCi0jaW5jbHVkZSAiZG9tX2Rv
Y2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgPGtjYW52YXMv
S0NhbnZhc0NyZWF0b3IuaD4KICNpbmNsdWRlIDxrY2FudmFzL0tDYW52YXNDb250YWluZXIuaD4K
SW5kZXg6IGtzdmcyL3N2Zy9TVkdVc2VFbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2
ZzIvc3ZnL1NWR1VzZUVsZW1lbnRJbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBrc3ZnMi9z
dmcvU1ZHVXNlRWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MSw3ICs0MSw3IEBA
CiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzQ29udGFpbmVyLmg+CiAjaW5jbHVkZSAiS0NhbnZh
c1JlbmRlcmluZ1N0eWxlLmgiCiAjaW5jbHVkZSA8a2NhbnZhcy9kZXZpY2UvS1JlbmRlcmluZ0Rl
dmljZS5oPgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBs
LmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBLU1ZHOwogCkluZGV4OiBrc3ZnMi9zdmcvU1ZHRE9NSW1w
bGVtZW50YXRpb25JbXBsLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIvc3ZnL1NWR0RPTUltcGxlbWVu
dGF0aW9uSW1wbC5oCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcyL3N2Zy9TVkdET01JbXBsZW1l
bnRhdGlvbkltcGwuaAkod29ya2luZyBjb3B5KQpAQCAtMjMsNyArMjMsNyBAQAogI2lmbmRlZiBL
U1ZHX1NWR0RPTUltcGxlbWVudGF0aW9uSW1wbF9ICiAjZGVmaW5lIEtTVkdfU1ZHRE9NSW1wbGVt
ZW50YXRpb25JbXBsX0gKIAotI2luY2x1ZGUgPGtkb20vY29yZS9ET01JbXBsZW1lbnRhdGlvbklt
cGwuaD4KKyNpbmNsdWRlICJET01JbXBsZW1lbnRhdGlvbkltcGwuaCIKICNpbmNsdWRlIDxxc3Ry
aW5nbGlzdC5oPgogCiBjbGFzcyBLSFRNTFZpZXc7CkluZGV4OiBrc3ZnMi9zdmcvU1ZHRE9NSW1w
bGVtZW50YXRpb25JbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9zdmcvU1ZHRE9NSW1wbGVt
ZW50YXRpb25JbXBsLmNwcAkocmV2aXNpb24gMTIwMjEpCisrKyBrc3ZnMi9zdmcvU1ZHRE9NSW1w
bGVtZW50YXRpb25JbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsOSArMjcsOSBAQAogI2lu
Y2x1ZGUgPGtkb20vRE9NU3RyaW5nLmg+CiAjaW5jbHVkZSA8a2RvbS9OYW1lc3BhY2UuaD4KICNp
bmNsdWRlIDxrZG9tL2NvcmUvRWxlbWVudEltcGwuaD4KLSNpbmNsdWRlIDxrZG9tL2NvcmUvRG9j
dW1lbnRJbXBsLmg+CisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSA8a2RvbS9j
b3JlL0RPTUV4Y2VwdGlvbkltcGwuaD4KLSNpbmNsdWRlIDxrZG9tL2NvcmUvRG9jdW1lbnRUeXBl
SW1wbC5oPgorI2luY2x1ZGUgIkRvY3VtZW50VHlwZUltcGwuaCIKICNpbmNsdWRlIDxrZG9tL2Nz
cy9NZWRpYUxpc3RJbXBsLmg+CiAjaW5jbHVkZSA8a2RvbS9jc3MvQ1NTU3R5bGVTaGVldEltcGwu
aD4KIApJbmRleDoga3N2ZzIvc3ZnL1NWR0hlbHBlci5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2ZzIv
c3ZnL1NWR0hlbHBlci5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga3N2ZzIvc3ZnL1NWR0hlbHBl
ci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJTVkdTVkdF
bGVtZW50SW1wbC5oIgogI2luY2x1ZGUgIlNWR0FuaW1hdGVkUmVjdEltcGwuaCIKICNpbmNsdWRl
ICJTVkdBbmltYXRlZExlbmd0aEltcGwuaCIKLSNpbmNsdWRlICJkb21fZG9jaW1wbC5oIgorI2lu
Y2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogCiAjaW5jbHVkZSA8a2NhbnZhcy9LQ2FudmFzLmg+CiAK
SW5kZXg6IGtzdmcyL3N2Zy9TVkdQb2x5RWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtz
dmcyL3N2Zy9TVkdQb2x5RWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtzdmcy
L3N2Zy9TVkdQb2x5RWxlbWVudEltcGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yMyw2ICsyMyw3
IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHJJbXBsLmg+
CiAjaW5jbHVkZSA8a2RvbS9OYW1lc3BhY2UuaD4KKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIK
IAogI2luY2x1ZGUgIlNWR05hbWVzLmgiCiAjaW5jbHVkZSAiU1ZHSGVscGVyLmgiCkluZGV4OiBr
c3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudEltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGtzdmcyL3N2Zy9T
VkdTVkdFbGVtZW50SW1wbC5jcHAJKHJldmlzaW9uIDEyMDIxKQorKysga3N2ZzIvc3ZnL1NWR1NW
R0VsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjQsNyArMjQsNyBAQAogI2luY2x1
ZGUgPGtkb20vY29yZS9BdHRySW1wbC5oPgogI2luY2x1ZGUgPGtkb20vY29yZS9ET01TdHJpbmdJ
bXBsLmg+CiAjaW5jbHVkZSA8a2RvbS9jb3JlL05hbWVkQXR0ck1hcEltcGwuaD4KLSNpbmNsdWRl
ICJkb21fZG9jaW1wbC5oIgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogCiAjaW5jbHVkZSA8
a2NhbnZhcy9LQ2FudmFzLmg+CiAjaW5jbHVkZSA8a2NhbnZhcy9SZW5kZXJQYXRoLmg+CkluZGV4
OiBrc3ZnMi9zdmcvU1ZHQ2xpcFBhdGhFbGVtZW50SW1wbC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3N2
ZzIvc3ZnL1NWR0NsaXBQYXRoRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysrIGtz
dmcyL3N2Zy9TVkdDbGlwUGF0aEVsZW1lbnRJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcs
NyArMjcsNyBAQAogI2luY2x1ZGUgPGtjYW52YXMvS0NhbnZhc1BhdGguaD4KICNpbmNsdWRlIDxr
Y2FudmFzL2RldmljZS9LUmVuZGVyaW5nRGV2aWNlLmg+CiAjaW5jbHVkZSA8a2RvbS9jc3MvQ1NT
U3R5bGVTZWxlY3Rvci5oPgotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCisjaW5jbHVkZSAiRG9j
dW1lbnRJbXBsLmgiCiAKICNpbmNsdWRlICJrc3ZnLmgiCiAjaW5jbHVkZSAiU1ZHTmFtZXMuaCIK
SW5kZXg6IGtzdmcyL3N2Zy9TVkdEb2N1bWVudEltcGwuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrc3ZnMi9z
dmcvU1ZHRG9jdW1lbnRJbXBsLmgJKHJldmlzaW9uIDEyMDIxKQorKysga3N2ZzIvc3ZnL1NWR0Rv
Y3VtZW50SW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNSw3ICsyNSw3IEBACiAKICNpbmNsdWRl
IDxxM3B0cmxpc3QuaD4KIAotI2luY2x1ZGUgPGtkb20vY29yZS9Eb2N1bWVudEltcGwuaD4KKyNp
bmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlIDxrZG9tL2NhY2hlL0tET01DYWNoZWRT
Y3JpcHQuaD4KICNpbmNsdWRlIDxrZG9tL2NhY2hlL0tET01DYWNoZWRPYmplY3RDbGllbnQuaD4K
IApJbmRleDoga3N2ZzIvc3ZnL1NWR0N1cnNvckVsZW1lbnRJbXBsLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBrc3ZnMi9zdmcvU1ZHQ3Vyc29yRWxlbWVudEltcGwuY3BwCShyZXZpc2lvbiAxMjAyMSkKKysr
IGtzdmcyL3N2Zy9TVkdDdXJzb3JFbGVtZW50SW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIy
LDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgPGtkb20vY29yZS9B
dHRySW1wbC5oPgotI2luY2x1ZGUgPGtkb20vY29yZS9Eb2N1bWVudEltcGwuaD4KKyNpbmNsdWRl
ICJEb2N1bWVudEltcGwuaCIKICNpbmNsdWRlICJEb2NMb2FkZXIuaCIKICNpbmNsdWRlIDxrZGVi
dWcuaD4KIApJbmRleDoga3N2ZzIvbWlzYy9LQ2FudmFzUmVuZGVyaW5nU3R5bGUuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtzdmcyL21pc2MvS0NhbnZhc1JlbmRlcmluZ1N0eWxlLmNwcAkocmV2aXNpb24g
MTIwMjEpCisrKyBrc3ZnMi9taXNjL0tDYW52YXNSZW5kZXJpbmdTdHlsZS5jcHAJKHdvcmtpbmcg
Y29weSkKQEAgLTM1LDcgKzM1LDcgQEAKICNpbmNsdWRlIDxrY2FudmFzL2RldmljZS9LUmVuZGVy
aW5nUGFpbnRTZXJ2ZXJHcmFkaWVudC5oPgogI2luY2x1ZGUgPGtjYW52YXMvZGV2aWNlL0tSZW5k
ZXJpbmdQYWludFNlcnZlci5oPgogCi0jaW5jbHVkZSA8a2RvbS9jb3JlL0RvY3VtZW50SW1wbC5o
PgorI2luY2x1ZGUgIkRvY3VtZW50SW1wbC5oIgogI2luY2x1ZGUgPGtkb20vRE9NU3RyaW5nLmg+
CiAjaW5jbHVkZSA8a2RvbS9jc3MvUmVuZGVyU3R5bGUuaD4KICNpbmNsdWRlIDxrZG9tL2Nzcy9D
U1NWYWx1ZUxpc3RJbXBsLmg+CkluZGV4OiBrc3ZnMi9taXNjL0tTVkdUaW1lU2NoZWR1bGVyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBrc3ZnMi9taXNjL0tTVkdUaW1lU2NoZWR1bGVyLmNwcAkocmV2aXNp
b24gMTIwMjEpCisrKyBrc3ZnMi9taXNjL0tTVkdUaW1lU2NoZWR1bGVyLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgPGtj
YW52YXMvS0NhbnZhcy5oPgogCisjaW5jbHVkZSAiRG9jdW1lbnRJbXBsLmgiCiAjaW5jbHVkZSAi
U1ZHTmFtZXMuaCIKICNpbmNsdWRlICJTVkdNYXRyaXhJbXBsLmgiCiAjaW5jbHVkZSAiS1NWR1Rp
bWVTY2hlZHVsZXIuaCIKSW5kZXg6IGtzdmcyL21pc2MvU1ZHSW1hZ2VMb2FkZXIuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIGtzdmcyL21pc2MvU1ZHSW1hZ2VMb2FkZXIuY3BwCShyZXZpc2lvbiAxMjAyMSkK
KysrIGtzdmcyL21pc2MvU1ZHSW1hZ2VMb2FkZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNCw3
ICsyNCw3IEBACiAjaW5jbHVkZSA8a2RvbS9jb3JlL0F0dHJJbXBsLmg+CiAjaW5jbHVkZSA8a2Rv
bS9jYWNoZS9LRE9NTG9hZGVyLmg+CiAjaW5jbHVkZSAiRG9jTG9hZGVyLmgiCi0jaW5jbHVkZSAi
ZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKIAogI2luY2x1ZGUgIlNW
R05hbWVzLmgiCiAjaW5jbHVkZSAiU1ZHSW1hZ2VFbGVtZW50SW1wbC5oIgpJbmRleDogRm9yd2Fy
ZGluZ0hlYWRlcnMva2RvbS9jb3JlL0RvY3VtZW50SW1wbC5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEZvcndh
cmRpbmdIZWFkZXJzL2tkb20vY29yZS9Eb2N1bWVudEltcGwuaAkocmV2aXNpb24gMTIwMjEpCisr
KyBGb3J3YXJkaW5nSGVhZGVycy9rZG9tL2NvcmUvRG9jdW1lbnRJbXBsLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgImRvbV9kb2NpbXBsLmgiCkluZGV4OiBGb3J3YXJk
aW5nSGVhZGVycy9rZG9tL2NvcmUvRG9jdW1lbnRUeXBlSW1wbC5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEZv
cndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9Eb2N1bWVudFR5cGVJbXBsLmgJKHJldmlzaW9uIDEy
MDIxKQorKysgRm9yd2FyZGluZ0hlYWRlcnMva2RvbS9jb3JlL0RvY3VtZW50VHlwZUltcGwuaAko
d29ya2luZyBjb3B5KQpAQCAtMSArMCwwIEBACi0jaW5jbHVkZSAiS0RPTUhlYWRlcnMuaCIKSW5k
ZXg6IEZvcndhcmRpbmdIZWFkZXJzL2tkb20vY29yZS9ET01JbXBsZW1lbnRhdGlvbkltcGwuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBGb3J3YXJkaW5nSGVhZGVycy9rZG9tL2NvcmUvRE9NSW1wbGVtZW50YXRp
b25JbXBsLmgJKHJldmlzaW9uIDEyMDIxKQorKysgRm9yd2FyZGluZ0hlYWRlcnMva2RvbS9jb3Jl
L0RPTUltcGxlbWVudGF0aW9uSW1wbC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xICswLDAgQEAKLSNp
bmNsdWRlICJkb21fZG9jaW1wbC5oIgpJbmRleDoga3dxL0RPTUV2ZW50cy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBrd3EvRE9NRXZlbnRzLm1tCShyZXZpc2lvbiAxMjAyMSkKKysrIGt3cS9ET01FdmVudHMu
bW0JKHdvcmtpbmcgY29weSkKQEAgLTMxLDcgKzMxLDcgQEAKICNpbXBvcnQgIkRPTUludGVybmFs
LmgiCiAjaW1wb3J0IDxreG1sY29yZS9Bc3NlcnRpb25zLmg+CiAKLSNpbXBvcnQgImRvbV9kb2Np
bXBsLmgiCisjaW1wb3J0ICJEb2N1bWVudEltcGwuaCIKICNpbXBvcnQgImRvbTJfZXZlbnRzaW1w
bC5oIgogI2ltcG9ydCAiZG9tMl92aWV3c2ltcGwuaCIKIApJbmRleDoga3dxL0RPTUhUTUwubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga3dxL0RPTUhUTUwubW0JKHJldmlzaW9uIDEyMDIxKQorKysga3dxL0RP
TUhUTUwubW0JKHdvcmtpbmcgY29weSkKQEAgLTUyLDcgKzUyLDYgQEAKICNpbXBvcnQgImh0bWxf
dGFibGVpbXBsLmgiCiAjaW1wb3J0ICJkb21fZWxlbWVudGltcGwuaCIKICNpbXBvcnQgImRvbV9u
b2RlaW1wbC5oIgotI2ltcG9ydCAiZG9tX2RvY2ltcGwuaCIKICNpbXBvcnQgIm1hcmt1cC5oIgog
CiAjaW1wb3J0ICJET01FeHRlbnNpb25zLmgiCkluZGV4OiBrd3EvS1dRS0phdmFBcHBsZXRXaWRn
ZXQubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0ga3dxL0tXUUtKYXZhQXBwbGV0V2lkZ2V0Lm1tCShyZXZpc2lv
biAxMjAyMSkKKysrIGt3cS9LV1FLSmF2YUFwcGxldFdpZGdldC5tbQkod29ya2luZyBjb3B5KQpA
QCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2ltcG9ydCAiS1dRS0phdmFB
cHBsZXRXaWRnZXQuaCIKIAotI2ltcG9ydCAiZG9tX2RvY2ltcGwuaCIKKyNpbXBvcnQgIkRvY3Vt
ZW50SW1wbC5oIgogI2ltcG9ydCAiRnJhbWVWaWV3LmgiCiAjaW1wb3J0ICJLV1FFeGNlcHRpb25z
LmgiCiAjaW1wb3J0ICJXZWJDb3JlQnJpZGdlLmgiCkluZGV4OiBrd3EvS1dRUmVuZGVyVHJlZURl
YnVnLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvS1dRUmVuZGVyVHJlZURlYnVnLmNwcAkocmV2aXNp
b24gMTIwMjEpCisrKyBrd3EvS1dRUmVuZGVyVHJlZURlYnVnLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIktXUVJlbmRl
clRyZWVEZWJ1Zy5oIgogCi0jaW5jbHVkZSAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1
bWVudEltcGwuaCIKICNpbmNsdWRlICJkb21fcG9zaXRpb24uaCIKICNpbmNsdWRlICJqc2VkaXRp
bmcuaCIKICNpbmNsdWRlICJGcmFtZVZpZXcuaCIKSW5kZXg6IGt3cS9LV1FQYWdlU3RhdGUubW0K
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0ga3dxL0tXUVBhZ2VTdGF0ZS5tbQkocmV2aXNpb24gMTIwMjEpCisrKyBr
d3EvS1dRUGFnZVN0YXRlLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsyOSw3IEBACiAjaW1w
b3J0IDxKYXZhU2NyaXB0Q29yZS9pbnRlcnByZXRlci5oPgogI2ltcG9ydCA8SmF2YVNjcmlwdENv
cmUvcHJvcGVydHlfbWFwLmg+CiAKLSNpbXBvcnQgImRvbV9kb2NpbXBsLmgiCisjaW1wb3J0ICJE
b2N1bWVudEltcGwuaCIKICNpbXBvcnQgIkZyYW1lVmlldy5oIgogI2ltcG9ydCAia2pzX3dpbmRv
dy5oIgogCkluZGV4OiBrd3EvS1dRQWNjT2JqZWN0Q2FjaGUubW0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0ga3dx
L0tXUUFjY09iamVjdENhY2hlLm1tCShyZXZpc2lvbiAxMjAyMSkKKysrIGt3cS9LV1FBY2NPYmpl
Y3RDYWNoZS5tbQkod29ya2luZyBjb3B5KQpAQCAtMzIsNyArMzIsNyBAQAogI2ltcG9ydCAiS1dR
U3RyaW5nLmgiCiAjaW1wb3J0ICJyZW5kZXJfb2JqZWN0LmgiCiAjaW1wb3J0ICJXZWJDb3JlVmll
d0ZhY3RvcnkuaCIKLSNpbXBvcnQgImRvbV9kb2NpbXBsLmgiCisjaW1wb3J0ICJEb2N1bWVudElt
cGwuaCIKIAogdXNpbmcga2h0bWw6OkVBZmZpbml0eTsKIHVzaW5nIGtodG1sOjpSZW5kZXJPYmpl
Y3Q7CkluZGV4OiBrd3EvRE9NLUNTUy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvRE9NLUNTUy5tbQko
cmV2aXNpb24gMTIwMjEpCisrKyBrd3EvRE9NLUNTUy5tbQkod29ya2luZyBjb3B5KQpAQCAtMzUs
NyArMzUsNyBAQAogI2ltcG9ydCAiY3NzX3ZhbHVlLmgiCiAjaW1wb3J0ICJjc3NfdmFsdWVpbXBs
LmgiCiAjaW1wb3J0ICJkb20yX3ZpZXdzaW1wbC5oIgotI2ltcG9ydCAiZG9tX2RvY2ltcGwuaCIK
KyNpbXBvcnQgIkRvY3VtZW50SW1wbC5oIgogI2ltcG9ydCAiZG9tX3N0cmluZy5oIgogI2ltcG9y
dCAiZG9tX3N0cmluZ2ltcGwuaCIKICNpbXBvcnQgImRvbV94bWxpbXBsLmgiCkluZGV4OiBrd3Ev
S1dRQWNjT2JqZWN0Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGt3cS9LV1FBY2NPYmplY3QubW0JKHJldmlz
aW9uIDEyMDIxKQorKysga3dxL0tXUUFjY09iamVjdC5tbQkod29ya2luZyBjb3B5KQpAQCAtMzks
NyArMzksNyBAQAogI2ltcG9ydCAiV2ViQ29yZUZyYW1lVmlldy5oIgogI2ltcG9ydCAiV2ViQ29y
ZVZpZXdGYWN0b3J5LmgiCiAKLSNpbXBvcnQgImRvbV9kb2NpbXBsLmgiCisjaW1wb3J0ICJEb2N1
bWVudEltcGwuaCIKICNpbXBvcnQgImRvbV9lbGVtZW50aW1wbC5oIgogI2ltcG9ydCAiaHRtbF9l
bGVtZW50aW1wbC5oIgogI2ltcG9ydCAiSFRNTElucHV0RWxlbWVudEltcGwuaCIKSW5kZXg6IGt3
cS9ET01WaWV3cy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3EvRE9NVmlld3MubW0JKHJldmlzaW9uIDEy
MDIxKQorKysga3dxL0RPTVZpZXdzLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw3ICszMCw3IEBA
CiAjaW1wb3J0ICJET01WaWV3c0ludGVybmFsLmgiCiAjaW1wb3J0IDxreG1sY29yZS9Bc3NlcnRp
b25zLmg+CiAKLSNpbXBvcnQgImRvbV9kb2NpbXBsLmgiCisjaW1wb3J0ICJEb2N1bWVudEltcGwu
aCIKICNpbXBvcnQgImRvbTJfdmlld3NpbXBsLmgiCiAKIHVzaW5nIERPTTo6QWJzdHJhY3RWaWV3
SW1wbDsKSW5kZXg6IGt3cS9LV1FTbG90Lm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGt3cS9LV1FTbG90Lm1t
CShyZXZpc2lvbiAxMjAyMSkKKysrIGt3cS9LV1FTbG90Lm1tCSh3b3JraW5nIGNvcHkpCkBAIC0y
OCw3ICsyOCw3IEBACiAKICNpbXBvcnQgPGt4bWxjb3JlL0Fzc2VydGlvbnMuaD4KIAotI2ltcG9y
dCAiZG9tX2RvY2ltcGwuaCIKKyNpbmNsdWRlICJEb2N1bWVudEltcGwuaCIKICNpbXBvcnQgIkZy
YW1lLmgiCiAjaW1wb3J0ICJranNfd2luZG93LmgiCiAjaW1wb3J0ICJyZW5kZXJfZm9ybS5oIgpJ
bmRleDoga3dxL0RPTUludGVybmFsLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGt3cS9ET01JbnRlcm5hbC5t
bQkocmV2aXNpb24gMTIwMjEpCisrKyBrd3EvRE9NSW50ZXJuYWwubW0JKHdvcmtpbmcgY29weSkK
QEAgLTMxLDcgKzMxLDcgQEAKICNpbXBvcnQgImRvbTJfZXZlbnRzLmgiCiAjaW1wb3J0ICJkb21f
ZXhjZXB0aW9uLmgiCiAjaW1wb3J0ICJkb21fc3RyaW5nLmgiCi0jaW1wb3J0ICJkb21fZG9jaW1w
bC5oIgorI2ltcG9ydCAiRG9jdW1lbnRJbXBsLmgiCiAKICNpbXBvcnQgImtqc19kb20uaCIKICNp
bXBvcnQgImtqc19wcm94eS5oIgpJbmRleDoga3dxL0RPTS5tbQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBrd3Ev
RE9NLm1tCShyZXZpc2lvbiAxMjAyMSkKKysrIGt3cS9ET00ubW0JKHdvcmtpbmcgY29weSkKQEAg
LTM2LDcgKzM2LDEwIEBACiAjaW1wb3J0ICJkb20yX3JhbmdlaW1wbC5oIgogI2ltcG9ydCAiZG9t
Ml90cmF2ZXJzYWwuaCIKICNpbXBvcnQgImRvbTJfdmlld3NpbXBsLmgiCi0jaW1wb3J0ICJkb21f
ZG9jaW1wbC5oIgorI2ltcG9ydCAiRG9jdW1lbnRJbXBsLmgiCisjaW1wb3J0ICJET01JbXBsZW1l
bnRhdGlvbkltcGwuaCIKKyNpbXBvcnQgIkRvY3VtZW50VHlwZUltcGwuaCIKKyNpbXBvcnQgIkRv
Y3VtZW50RnJhZ21lbnRJbXBsLmgiCiAjaW1wb3J0ICJkb21fZWxlbWVudGltcGwuaCIKICNpbXBv
cnQgImRvbV9leGNlcHRpb24uaCIKICNpbXBvcnQgImRvbV9ub2RlLmgiCkBAIC01OSwzNyArNjIs
NyBAQAogI2ltcG9ydCAiTWFjRnJhbWUuaCIKIAogdXNpbmcgbmFtZXNwYWNlIERPTTo6SFRNTE5h
bWVzOwotCi11c2luZyBET006OkF0dHJJbXBsOwotdXNpbmcgRE9NOjpDaGFyYWN0ZXJEYXRhSW1w
bDsKLXVzaW5nIERPTTo6RG9jdW1lbnRGcmFnbWVudEltcGw7Ci11c2luZyBET006OkRvY3VtZW50
VHlwZTsKLXVzaW5nIERPTTo6RG9jdW1lbnRUeXBlSW1wbDsKLXVzaW5nIERPTTo6RG9jdW1lbnQ7
Ci11c2luZyBET006OkRvY3VtZW50SW1wbDsKLXVzaW5nIERPTTo6RE9NSW1wbGVtZW50YXRpb25J
bXBsOwotdXNpbmcgRE9NOjpET01TdHJpbmc7Ci11c2luZyBET006OkRPTVN0cmluZ0ltcGw7Ci11
c2luZyBET006OkVsZW1lbnRJbXBsOwotdXNpbmcgRE9NOjpFbnRpdHlJbXBsOwotdXNpbmcgRE9N
OjpFdmVudEltcGw7Ci11c2luZyBET006OkV2ZW50TGlzdGVuZXI7Ci11c2luZyBET006OkhUTUxF
bGVtZW50SW1wbDsKLXVzaW5nIERPTTo6TmFtZWROb2RlTWFwSW1wbDsKLXVzaW5nIERPTTo6Tm9k
ZTsKLXVzaW5nIERPTTo6Tm9kZUZpbHRlcjsKLXVzaW5nIERPTTo6Tm9kZUZpbHRlckNvbmRpdGlv
bjsKLXVzaW5nIERPTTo6Tm9kZUZpbHRlckltcGw7Ci11c2luZyBET006Ok5vZGVJbXBsOwotdXNp
bmcgRE9NOjpOb2RlSXRlcmF0b3JJbXBsOwotdXNpbmcgRE9NOjpOb2RlTGlzdEltcGw7Ci11c2lu
ZyBET006Ok5vdGF0aW9uSW1wbDsKLXVzaW5nIERPTTo6UHJvY2Vzc2luZ0luc3RydWN0aW9uSW1w
bDsKLXVzaW5nIERPTTo6UmFuZ2U7Ci11c2luZyBET006OlJhbmdlRXhjZXB0aW9uOwotdXNpbmcg
RE9NOjpSYW5nZUltcGw7Ci11c2luZyBET006OlRleHRJbXBsOwotdXNpbmcgRE9NOjpUcmVlV2Fs
a2VySW1wbDsKK3VzaW5nIG5hbWVzcGFjZSBET007CiAKIHVzaW5nIGtodG1sOjpSZW5kZXJPYmpl
Y3Q7CiAKSW5kZXg6IHBhZ2UvRnJhbWUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHBhZ2UvRnJhbWUuY3Bw
CShyZXZpc2lvbiAxMjAyMSkKKysrIHBhZ2UvRnJhbWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0z
NSw2ICszNSw3IEBACiAjaW5jbHVkZSAiY3NzL2Nzc19jb21wdXRlZHN0eWxlLmgiCiAjaW5jbHVk
ZSAiY3NzL2Nzc192YWx1ZWltcGwuaCIKICNpbmNsdWRlICJkb20vZG9tX3N0cmluZy5oIgorI2lu
Y2x1ZGUgIkRPTUltcGxlbWVudGF0aW9uSW1wbC5oIgogI2luY2x1ZGUgImVkaXRpbmcvbWFya3Vw
LmgiCiAjaW5jbHVkZSAiZWRpdGluZy9odG1sZWRpdGluZy5oIgogI2luY2x1ZGUgImVkaXRpbmcv
U2VsZWN0aW9uQ29udHJvbGxlci5oIgpAQCAtNjUsMTAgKzY2LDYgQEAKICNlbmRpZgogI2luY2x1
ZGUgImt4bWxjb3JlL0Fzc2VydGlvbnMuaCIKIAotdXNpbmcgbmFtZXNwYWNlIERPTTsKLXVzaW5n
IG5hbWVzcGFjZSBIVE1MTmFtZXM7Ci11c2luZyBuYW1lc3BhY2UgS0pTOwotCiAjaW5jbHVkZSAi
RnJhbWVWaWV3LmgiCiAjaW5jbHVkZSAiZWNtYS9ranNfcHJveHkuaCIKICNpbmNsdWRlICJlY21h
L2tqc193aW5kb3cuaCIKQEAgLTkwLDYgKzg3LDEwIEBAIHVzaW5nIG5hbWVzcGFjZSBLSlM7CiAj
aW5jbHVkZSA8cWZpbGUuaD4KICNpbmNsdWRlIDxxcHRybGlzdC5oPgogCisKK3VzaW5nIG5hbWVz
cGFjZSBET007Cit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOwordXNpbmcgbmFtZXNwYWNlIEtK
UzsKIHVzaW5nIG5hbWVzcGFjZSBET006OkV2ZW50TmFtZXM7CiB1c2luZyBuYW1lc3BhY2Uga2h0
bWw7CiAK
</data>
<flag name="review"
          id="1246"
          type_id="1"
          status="+"
          setter="andersca"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>5616</attachid>
            <date>2006-01-12 04:10:15 -0800</date>
            <delta_ts>2006-01-12 04:10:15 -0800</delta_ts>
            <desc>split_class.pl script for splitting class files</desc>
            <filename>split_class.pl</filename>
            <type>text/x-perl-script</type>
            <size>4754</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0Owp1c2UgRmlsZTo6Q29weTsKdXNlIEZpbmRC
aW47CnVzZSBsaWIgJEZpbmRCaW46OkJpbjsKdXNlIFNwYWNpbmdIZXVyaXN0aWNzOwoKCmZvciBt
eSAkZmlsZW5hbWUgKEBBUkdWKSB7CgogICAgJGZpbGVuYW1lID1+IG0vXihcdyspXC5oJC8gb3Ig
ZGllICJDb21tYW5kIGxpbmUgYXJncyBtdXN0IGJlIC5oIGZpbGVzLlxuIjsKICAgIG15ICRiYXNl
bmFtZSA9ICQxOwoKICAgIG9wZW4oT0xERklMRSwgIjwiLCAkZmlsZW5hbWUpIG9yIGRpZSAiRmls
ZSBkb2VzIG5vdCBleGlzdDogJGZpbGVuYW1lXG4iOwogICAgcHJpbnQgIlNwbGl0dGluZyBjbGFz
cyAkZmlsZW5hbWUue2gsY3BwfTpcbiI7CiAgICAKICAgIG15ICRjdXJyZW50Q2xhc3NOYW1lID0g
IiI7CiAgICBteSAkY2xhc3NJbmRlbnQgPSAiIjsKICAgIG15ICRmaWxlQ29udGVudCA9ICIiOwog
ICAgbXkgJWNsYXNzRGVmcyA9ICgpOwogICAgd2hpbGUgKG15ICRsaW5lID0gPE9MREZJTEU+KSB7
CiAgICAgICAgaWYgKCRjdXJyZW50Q2xhc3NOYW1lKSB7CiAgICAgICAgICAgICRjbGFzc0RlZnN7
JGN1cnJlbnRDbGFzc05hbWV9IC49ICRsaW5lOwogICAgICAgICAgICBpZiAoJGxpbmUgPX4gL14k
Y2xhc3NJbmRlbnR9O1xzKiQvKSB7CiAgICAgICAgICAgICAgICAkY3VycmVudENsYXNzTmFtZSA9
ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCRsaW5l
ID1+IC9eKFxzKiljbGFzc1xzKyhcdyspXHMrW147XSokLykgewogICAgICAgICAgICAgICAgJGNs
YXNzSW5kZW50ID0gJDE7CiAgICAgICAgICAgICAgICAkY3VycmVudENsYXNzTmFtZSA9ICQyOwog
ICAgICAgICAgICAgICAgJGNsYXNzRGVmc3skY3VycmVudENsYXNzTmFtZX0gLj0gJGxpbmU7CiAg
ICAgICAgICAgICAgICAkZmlsZUNvbnRlbnQgLj0gIiMjI0NMQVNTIyMjJGN1cnJlbnRDbGFzc05h
bWVcbiI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZmlsZUNvbnRlbnQg
Lj0gJGxpbmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjbG9zZShPTERGSUxF
KTsKICAgIAogICAgaWYgKHNjYWxhcihrZXlzKCVjbGFzc0RlZnMpKSA9PSAxKSB7ICMgZGVnZW5l
cmF0ZSBjYXNlCiAgICAgICAgbXkgKCRjbGFzc25hbWUpID0ga2V5cyglY2xhc3NEZWZzKTsKICAg
ICAgICBpZiAoISgkY2xhc3NuYW1lIGVxICRiYXNlbmFtZSkpIHsKICAgICAgICAgICAgcHJpbnQg
IlNraXBwaW5nICRmaWxlbmFtZSwgYWxyZWFkeSBjb3JyZWN0bHkgbmFtZWQuXG4iOwogICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICAgIHByaW50ICIkZmlsZW5hbWUgb25seSBpbmNsdWRlcyBvbmUg
Y2xhc3MsIHJlbmFtaW5nIHRvICRjbGFzc25hbWUuaFxuIjsKICAgICAgICAgICAgc3lzdGVtKCJz
dm4gcm0gLS1mb3JjZSAkY2xhc3NuYW1lLmgiKSBpZiAoLXIgIiRjbGFzc25hbWUuaCIpOwogICAg
ICAgICAgICBzeXN0ZW0gInN2biBtdiAkYmFzZW5hbWUuaCAkY2xhc3NuYW1lLmgiOwogICAgICAg
IH0KICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKG15ICgkY2xhc3NuYW1lLCAkY2xhc3NEZWYp
ID0gZWFjaCglY2xhc3NEZWZzKSkgewogICAgICAgICAgICBpZiAoKCRjbGFzc25hbWUgZXEgJGJh
c2VuYW1lKSkgewogICAgICAgICAgICAgICAgcHJpbnQgIlNraXBwaW5nICRmaWxlbmFtZSwgYWxy
ZWFkeSBjb3JyZWN0bHkgbmFtZWQuXG4iOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAg
ICAgICAgcHJpbnQgIlVzaW5nIFNWTiB0byBjb3B5ICRiYXNlbmFtZS57aCxjcHB9IHRvICRjbGFz
c25hbWUue2gsY3BwfVxuIjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3lzdGVt
KCJzdm4gcm0gLS1mb3JjZSAkY2xhc3NuYW1lLmgiKSBpZiAoLXIgIiRjbGFzc25hbWUuaCIpOwog
ICAgICAgICAgICAgICAgc3lzdGVtICJzdm4gY3AgJGJhc2VuYW1lLmggJGNsYXNzbmFtZS5oIjsK
ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3lzdGVtKCJzdm4gcm0gLS1mb3JjZSAk
Y2xhc3NuYW1lLmNwcCIpIGlmICgtciAiJGNsYXNzbmFtZS5jcHAiKTsKICAgICAgICAgICAgICAg
IHN5c3RlbSAic3ZuIGNwICRiYXNlbmFtZS5jcHAgJGNsYXNzbmFtZS5jcHAiOwogICAgICAgICAg
ICB9CiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCAiRml4aW5nICRjbGFzc25hbWUuaCBh
cyBtdWNoIGFzIHBvc3NpYmxlLlxuIjsKICAgICAgICAgICAgb3BlbihORVdIRUFERVIsICI+Iiwg
IiRjbGFzc25hbWUuaCIpIG9yIGRpZSAiRmlsZSBkb2VzIG5vdCBleGlzdDogJGZpbGVuYW1lXG4i
OwogICAgICAgICAgICBteSBAbGluZXMgPSBzcGxpdCgiXG4iLCAkZmlsZUNvbnRlbnQpOwogICAg
ICAgICAgICBmb3JlYWNoIG15ICRsaW5lIChAbGluZXMpIHsKICAgICAgICAgICAgICAgIGlmICgk
bGluZSA9fiAvXiMjI0NMQVNTIyMjKFx3KykvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCQx
IGVxICRjbGFzc25hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgTkVXSEVBREVS
ICRjbGFzc0RlZiAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwcmludCBORVdIRUFERVIgJGxpbmUgLiAiXG4i
OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsb3NlKE5FV0hF
QURFUik7CiAgICAgICAgICAgIAogICAgICAgICAgICBwcmludCAiRml4aW5nICRjbGFzc25hbWUu
Y3BwIGFzIG11Y2ggYXMgcG9zc2libGUuXG4iOwogICAgICAgICAgICBjb3B5KCIkY2xhc3NuYW1l
LmNwcCIsICIkY2xhc3NuYW1lLmNwcC5vcmlnaW5hbCIpOwogICAgICAgICAgICBvcGVuKE9MRENQ
UCwgIjwiLCAiJGNsYXNzbmFtZS5jcHAub3JpZ2luYWwiKSBvciBkaWUgIkZhaWxlZCB0byBjb3B5
IGZpbGUgZm9yIHJlYWRpbmc6ICRmaWxlbmFtZVxuIjsKICAgICAgICAgICAgb3BlbihORVdDUFAs
ICI+IiwgIiRjbGFzc25hbWUuY3BwIikgb3IgZGllICJGaWxlIGRvZXMgbm90IGV4aXN0OiAkZmls
ZW5hbWVcbiI7CiAgICAgICAgICAgIG15ICRpbnNpZGVNZW1iZXJGdW5jdGlvbiA9IDA7CiAgICAg
ICAgICAgIG15ICRzaG91bGRQcmludE1lbWJlckZ1bmN0aW9uID0gMDsKICAgICAgICAgICAgcmVz
ZXRTcGFjaW5nSGV1cmlzdGljcygpOwogICAgICAgICAgICB3aGlsZSAobXkgJGxpbmUgPSA8T0xE
Q1BQPikgewogICAgICAgICAgICAgICAgaWYgKCRpbnNpZGVNZW1iZXJGdW5jdGlvbikgewogICAg
ICAgICAgICAgICAgICAgIGlmICgkc2hvdWxkUHJpbnRNZW1iZXJGdW5jdGlvbikgewogICAgICAg
ICAgICAgICAgICAgICAgICBwcmludCBORVdDUFAgJGxpbmU7CiAgICAgICAgICAgICAgICAgICAg
ICAgICNzZXRQcmV2aW91c0FsbG93ZWRMaW5lKCRsaW5lKTsKICAgICAgICAgICAgICAgICAgICB9
IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmluZ0xpbmUoJGxpbmUpOwogICAg
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJGxpbmUgPX4gL159XHMq
JC8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGluc2lkZU1lbWJlckZ1bmN0aW9uID0gMDsK
ICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2lmICgkbGluZSA9fiAv
JGZpbGVuYW1lLykgewogICAgICAgICAgICAgICAgICAgIHByaW50ICIjaW5jbHVkZSBcIiRiYXNl
bmFtZS5oXCJcbiI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAg
IGlmICgkbGluZSA9fiAvXiguKj9ccyspPyhcKnwmKT8oXHcrKTo6KH4pP1x3K1xzKlwoLykgewog
ICAgICAgICAgICAgICAgICAgICAgICAkaW5zaWRlTWVtYmVyRnVuY3Rpb24gPSAxOwogICAgICAg
ICAgICAgICAgICAgICAgICAkc2hvdWxkUHJpbnRNZW1iZXJGdW5jdGlvbiA9ICgkY2xhc3NuYW1l
IGVxICQzKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzaG91bGRQcmludE1lbWJlckZ1
bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludFBlbmRpbmdFbXB0eUxp
bmVzKCpORVdDUFAsICRsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IE5F
V0NQUCAkbGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAg
IH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYgaXNPbmx5V2hpdGVTcGFj
ZSgkbGluZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYgKCRsaW5lID1+IG0vLS0t
LS0tLS0tLS0tLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50UGVuZGluZ0VtcHR5TGlu
ZXMoKk5FV0NQUCwgJGxpbmUpOwogICAgICAgICAgICAgICAgICAgICAgICBhcHBseVNwYWNpbmdI
ZXVyaXN0aWNzQW5kUHJpbnQoKk5FV0NQUCwgJGxpbmUpOwogICAgICAgICAgICAgICAgICAgIH0K
ICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZShORVdDUFAp
OwogICAgICAgICAgICBjbG9zZShPTERDUFApOwogICAgICAgICAgICB1bmxpbmsoIiRjbGFzc25h
bWUuY3BwLm9yaWdpbmFsIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICBwcmludCAiT3Blbmlu
ZyBuZXcgZmlsZXMuLi5cbiI7CiAgICBzeXN0ZW0oIm9wZW4gIiAuIGpvaW4oIi4qICIsIGtleXMo
JWNsYXNzRGVmcykpIC4gIi4qIik7Cn0=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>5617</attachid>
            <date>2006-01-12 04:10:37 -0800</date>
            <delta_ts>2006-01-12 04:10:37 -0800</delta_ts>
            <desc>SpacingHeuristics.pm perl module</desc>
            <filename>SpacingHeuristics.pm</filename>
            <type>text/x-perl-script</type>
            <size>1708</size>
            <attacher name="Eric Seidel (no email)">eric</attacher>
            
              <data encoding="base64">IyBBIHNtYWxsIG1vZHVsZSBJIHdyb3RlIGZvciBoZWxwaW5nIHJlbW92ZSBleHRyYSBibGFuayBs
aW5lcwojIGZyb20gZmlsZXMgd2hlbiBwcm9jZXNzaW5nLgoKQkVHSU4gewogICB1c2UgRXhwb3J0
ZXIgICAoKTsKICAgb3VyICgkVkVSU0lPTiwgQElTQSwgQEVYUE9SVCwgQEVYUE9SVF9PSywgJUVY
UE9SVF9UQUdTKTsKICAgJFZFUlNJT04gICAgID0gMS4wMDsKICAgQElTQSAgICAgICAgID0gcXco
RXhwb3J0ZXIpOwogICBARVhQT1JUICAgICAgPSBxdygmcmVzZXRTcGFjaW5nSGV1cmlzdGljcyAm
aXNPbmx5V2hpdGVTcGFjZSAmYXBwbHlTcGFjaW5nSGV1cmlzdGljc0FuZFByaW50ICZzZXRQcmV2
aW91c0FsbG93ZWRMaW5lICZzZXRQcmV2aW91c0FsbG93ZWRMaW5lICZwcmludFBlbmRpbmdFbXB0
eUxpbmVzICZpZ25vcmluZ0xpbmUpOwogICAlRVhQT1JUX1RBR1MgPSAoKTsKICAgQEVYUE9SVF9P
SyAgID0gKCk7Cn0KCm91ciBARVhQT1JUX09LOwoKbXkgJGp1c3RGb3VuZEVtcHR5TGluZSA9IDA7
Cm15ICRwcmV2aW91c0xpbmVXYXNEaXNhbGxvd2VkID0gMDsKbXkgJHByZXZpb3VzQWxsb3dlZExp
bmUgPSAiIjsKbXkgJHBlbmRpbmdFbXB0eUxpbmVzID0gIiI7CgpzdWIgcmVzZXRTcGFjaW5nSGV1
cmlzdGljcwp7CiAgICAkanVzdEZvdW5kRW1wdHlMaW5lID0gMDsKICAgICRwcmV2aW91c0xpbmVX
YXNEaXNhbGxvd2VkID0gMDsKICAgICRwcmV2aW91c0FsbG93ZWRMaW5lID0gIiI7CiAgICAkcGVu
ZGluZ0VtcHR5TGluZXMgPSAiIjsKfQoKc3ViIGlzT25seVdoaXRlU3BhY2UKewogICAgbXkgJGxp
bmUgPSBzaGlmdDsKICAgIG15ICRpc09ubHlXaGl0ZVNwYWNlID0gKCRsaW5lID1+IG0vXlxzKyQv
KTsKICAgICRwZW5kaW5nRW1wdHlMaW5lcyAuPSAkbGluZSBpZiAoJGlzT25seVdoaXRlU3BhY2Up
OwogICAgcmV0dXJuICRpc09ubHlXaGl0ZVNwYWNlOwp9CgpzdWIgYXBwbHlTcGFjaW5nSGV1cmlz
dGljc0FuZFByaW50CnsKICAgIG15ICgkb3V0LCAkbGluZSkgPSBAXzsKICAgIAogICAgcHJpbnRQ
ZW5kaW5nRW1wdHlMaW5lcygkb3V0LCAkbGluZSk7CiAgICAkcHJldmlvdXNMaW5lV2FzRGlzYWxs
b3dlZCA9IDA7CiAgICBwcmludCAkb3V0ICRsaW5lOwp9CgpzdWIgc2V0UHJldmlvdXNBbGxvd2Vk
TGluZQp7CiAgICBteSAkbGluZSA9IHNoaWZ0OwogICAgJHByZXZpb3VzQWxsb3dlZExpbmUgPSAk
bGluZTsKfQoKc3ViIHByaW50UGVuZGluZ0VtcHR5TGluZXMKewogICAgbXkgJG91dCA9IHNoaWZ0
OwogICAgbXkgJGxpbmUgPSBzaGlmdDsKICAgIGlmICgkcHJldmlvdXNMaW5lV2FzRGlzYWxsb3dl
ZCkgewogICAgICAgIGlmICghKCRwZW5kaW5nRW1wdHlMaW5lcyBlcSAiIikgJiYgISgkcHJldmlv
dXNBbGxvd2VkTGluZSA9fiBtL3tccyokLykgJiYgISgkbGluZSA9fiBtL15ccyp9LykpIHsKICAg
ICAgICAgICAgJHBlbmRpbmdFbXB0eUxpbmVzID0gIlxuIjsKICAgICAgICB9IGVsc2UgewogICAg
ICAgICAgICAkcGVuZGluZ0VtcHR5TGluZXMgPSAiIjsKICAgICAgICB9CiAgICB9CiAgICBwcmlu
dCAkb3V0ICRwZW5kaW5nRW1wdHlMaW5lczsKICAgICRwZW5kaW5nRW1wdHlMaW5lcyA9ICIiOwp9
CgpzdWIgaWdub3JpbmdMaW5lCnsKICAgICMgbXkgJGxpbmUgPSBzaGlmdDsgIyBpZ25vcmluZyBp
bnB1dCBhcmd1bWVudAogICAgJHByZXZpb3VzTGluZVdhc0Rpc2FsbG93ZWQgPSAxOwp9CgoxOw==
</data>

          </attachment>
      

    </bug>

</bugzilla>